http-request-manager 0.0.2 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +262 -13
  2. package/esm2022/http-request-manager.mjs +5 -0
  3. package/esm2022/lib/interceptors/credentials.interceptor.mjs +14 -0
  4. package/esm2022/lib/interceptors/index.mjs +5 -0
  5. package/esm2022/lib/interceptors/models/error-settings.model.mjs +10 -0
  6. package/esm2022/lib/interceptors/request-error.interceptor.mjs +49 -0
  7. package/esm2022/lib/interceptors/request-header.interceptor.mjs +41 -0
  8. package/esm2022/lib/models/data-type.enum.mjs +7 -0
  9. package/esm2022/lib/models/database-storage.model.mjs +10 -0
  10. package/esm2022/lib/models/index.mjs +4 -0
  11. package/esm2022/lib/models/retry-options.model.mjs +10 -0
  12. package/esm2022/lib/services/index.mjs +6 -0
  13. package/esm2022/lib/services/local-storage-manager-service/index.mjs +3 -0
  14. package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +275 -0
  15. package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +13 -0
  16. package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +7 -0
  17. package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +13 -0
  18. package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +10 -0
  19. package/esm2022/lib/services/local-storage-manager-service/models/storage-option-settings.model.mjs +13 -0
  20. package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +12 -0
  21. package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +7 -0
  22. package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +172 -0
  23. package/esm2022/lib/services/request-manager-services/index.mjs +5 -0
  24. package/esm2022/lib/services/request-manager-services/request.service.mjs +159 -0
  25. package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +9 -0
  26. package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +8 -0
  27. package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +5 -0
  28. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +14 -0
  29. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +19 -0
  30. package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +299 -0
  31. package/esm2022/lib/services/request-manager-state-service/index.mjs +3 -0
  32. package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +20 -0
  33. package/esm2022/lib/services/request-manager-state-service/models/index.mjs +3 -0
  34. package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +10 -0
  35. package/esm2022/lib/services/utils/app.service.mjs +20 -0
  36. package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +186 -0
  37. package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +35 -0
  38. package/esm2022/lib/services/utils/encryption/index.mjs +4 -0
  39. package/esm2022/lib/services/utils/encryption/random.mjs +52 -0
  40. package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +77 -0
  41. package/esm2022/lib/services/utils/headers.service.mjs +21 -0
  42. package/esm2022/lib/services/utils/index.mjs +6 -0
  43. package/esm2022/lib/services/utils/path-query.service.mjs +53 -0
  44. package/esm2022/lib/services/utils/utils.service.mjs +134 -0
  45. package/esm2022/public-api.mjs +7 -0
  46. package/fesm2022/http-request-manager.mjs +1715 -0
  47. package/fesm2022/http-request-manager.mjs.map +1 -0
  48. package/http-request-manager-0.0.20.tgz +0 -0
  49. package/index.d.ts +5 -0
  50. package/lib/interceptors/credentials.interceptor.d.ts +8 -0
  51. package/lib/interceptors/index.d.ts +4 -0
  52. package/lib/interceptors/models/error-settings.model.d.ts +10 -0
  53. package/lib/interceptors/request-error.interceptor.d.ts +10 -0
  54. package/lib/interceptors/request-header.interceptor.d.ts +15 -0
  55. package/lib/models/data-type.enum.d.ts +5 -0
  56. package/lib/models/database-storage.model.d.ts +10 -0
  57. package/lib/models/index.d.ts +3 -0
  58. package/lib/models/retry-options.model.d.ts +10 -0
  59. package/lib/services/index.d.ts +4 -0
  60. package/lib/services/local-storage-manager-service/index.d.ts +2 -0
  61. package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +81 -0
  62. package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +15 -0
  63. package/lib/services/local-storage-manager-service/models/index.d.ts +6 -0
  64. package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +15 -0
  65. package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +10 -0
  66. package/lib/services/local-storage-manager-service/models/storage-option-settings.model.d.ts +15 -0
  67. package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +13 -0
  68. package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +5 -0
  69. package/lib/services/request-manager-services/http-manager.service.d.ts +35 -0
  70. package/lib/services/request-manager-services/index.d.ts +3 -0
  71. package/lib/services/request-manager-services/request.service.d.ts +27 -0
  72. package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +2 -0
  73. package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +2 -0
  74. package/lib/services/request-manager-services/rxjs-operators/index.d.ts +4 -0
  75. package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +7 -0
  76. package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +2 -0
  77. package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +55 -0
  78. package/lib/services/request-manager-state-service/index.d.ts +2 -0
  79. package/lib/services/request-manager-state-service/models/api-request.model.d.ts +25 -0
  80. package/lib/services/request-manager-state-service/models/index.d.ts +2 -0
  81. package/lib/services/request-manager-state-service/models/request-options.model.d.ts +10 -0
  82. package/lib/services/utils/app.service.d.ts +8 -0
  83. package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +17 -0
  84. package/lib/services/utils/encryption/encryption-test.service.d.ts +10 -0
  85. package/lib/services/utils/encryption/index.d.ts +3 -0
  86. package/lib/services/utils/encryption/random.d.ts +7 -0
  87. package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +14 -0
  88. package/lib/services/utils/headers.service.d.ts +10 -0
  89. package/lib/services/utils/index.d.ts +5 -0
  90. package/lib/services/utils/path-query.service.d.ts +11 -0
  91. package/lib/services/utils/utils.service.d.ts +24 -0
  92. package/package.json +17 -3
  93. package/public-api.d.ts +3 -0
  94. package/ng-package.json +0 -7
  95. package/src/lib/http-request-manager.component.spec.ts +0 -21
  96. package/src/lib/http-request-manager.component.ts +0 -15
  97. package/src/lib/http-request-manager.module.ts +0 -16
  98. package/src/lib/http-request-manager.service.spec.ts +0 -16
  99. package/src/lib/http-request-manager.service.ts +0 -9
  100. package/src/public-api.ts +0 -7
  101. package/tsconfig.lib.json +0 -14
  102. package/tsconfig.lib.prod.json +0 -10
  103. package/tsconfig.spec.json +0 -14
@@ -0,0 +1,186 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, EMPTY, from } from 'rxjs';
3
+ import { map, catchError } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ export class AsymmetricalEncryptionService {
6
+ constructor() { }
7
+ generateKeyPair(modulusLength = 2048) {
8
+ // modulusLength - 1024, 2048, 4096
9
+ // hash - SHA-256
10
+ return from(crypto.subtle.generateKey({
11
+ name: "RSA-OAEP",
12
+ modulusLength,
13
+ publicExponent: new Uint8Array([1, 0, 1]),
14
+ hash: { name: "SHA-256" }
15
+ }, true, // Extractable keys
16
+ ["encrypt", "decrypt"]));
17
+ }
18
+ encryptData(publicKey, data) {
19
+ const encodedData = new TextEncoder().encode(data);
20
+ return from(crypto.subtle.encrypt({
21
+ name: "RSA-OAEP"
22
+ }, publicKey, encodedData)).pipe(map(enc => this.arrayBufferToBase64(enc)));
23
+ }
24
+ decryptData(privateKey, encryptedData) {
25
+ const encStr = this.base64ToArrayBuffer(encryptedData);
26
+ return from(crypto.subtle.decrypt({
27
+ name: "RSA-OAEP"
28
+ }, privateKey, encStr).then(decryptedData => {
29
+ return new TextDecoder().decode(decryptedData);
30
+ }));
31
+ }
32
+ pemToArrayBuffer(pem) {
33
+ const b64 = pem.replace(/(-----BEGIN (RSA )?(PRIVATE|PUBLIC) KEY-----|-----END (RSA )?(PRIVATE|PUBLIC) KEY-----|\n)/g, '');
34
+ const binaryString = atob(b64);
35
+ const len = binaryString.length;
36
+ const buffer = new ArrayBuffer(len);
37
+ const view = new Uint8Array(buffer);
38
+ for (let i = 0; i < len; i++) {
39
+ view[i] = binaryString.charCodeAt(i);
40
+ }
41
+ return buffer;
42
+ }
43
+ base64ToArrayBuffer(base64) {
44
+ const binaryString = atob(base64);
45
+ const len = binaryString.length;
46
+ const buffer = new ArrayBuffer(len);
47
+ const view = new Uint8Array(buffer);
48
+ for (let i = 0; i < len; i++) {
49
+ view[i] = binaryString.charCodeAt(i);
50
+ }
51
+ return buffer;
52
+ }
53
+ arrayBufferToBase64(buffer) {
54
+ let binary = '';
55
+ const bytes = new Uint8Array(buffer);
56
+ const len = bytes.byteLength;
57
+ for (let i = 0; i < len; i++) {
58
+ binary += String.fromCharCode(bytes[i]);
59
+ }
60
+ return window.btoa(binary);
61
+ }
62
+ base64ToPEM(base64Key, publicKey = true) {
63
+ const keyType = (publicKey) ? 'PUBLIC' : 'PRIVATE';
64
+ const header = `-----BEGIN ${keyType} KEY-----\n`;
65
+ const footer = `\n-----END ${keyType} KEY-----`;
66
+ const keyBody = base64Key.match(/.{1,64}/g)?.join("\n") || "";
67
+ return header + keyBody + footer;
68
+ }
69
+ pemToCryptoKey(pem, algorithm, extractable, keyUsages, format = "pkcs8" //"raw" | "pkcs8" | "spki"
70
+ ) {
71
+ const buffer = this.pemToArrayBuffer(pem);
72
+ console.log('buffer found ', buffer);
73
+ return from(crypto.subtle.importKey(format, buffer, algorithm, extractable, keyUsages));
74
+ }
75
+ // TESTING
76
+ testGenerateKeys() {
77
+ const testSequence = new BehaviorSubject("");
78
+ const testSequence$ = testSequence.asObservable();
79
+ testSequence.next("Test Generating Keys");
80
+ // GENERATE KEYS
81
+ this.generateKeyPair().subscribe((data) => {
82
+ console.log("GEN-GENERATED KEYS: ", data);
83
+ crypto.subtle.exportKey('spki', data.publicKey)
84
+ .then(key => {
85
+ const publicKeyBase64 = this.arrayBufferToBase64(key);
86
+ console.log("GEN-EXPORT PUBLIC KEY: ", this.base64ToPEM(publicKeyBase64, true));
87
+ });
88
+ crypto.subtle.exportKey('pkcs8', data.privateKey)
89
+ .then(key => {
90
+ const privateKeyBase64 = this.arrayBufferToBase64(key);
91
+ console.log("GEN-EXPORT PRIVATE KEY: ", this.base64ToPEM(privateKeyBase64, false));
92
+ });
93
+ // TEST WITH GENERATED KEYS
94
+ this.encryptData(data.publicKey, "Sample Data here - Mike Bonifacio")
95
+ .subscribe((enc) => {
96
+ console.log("GEN-ENCRYPT==>: ", enc);
97
+ this.decryptData(data.privateKey, enc).subscribe((dec) => {
98
+ testSequence.next('Test Passed');
99
+ testSequence.complete();
100
+ });
101
+ });
102
+ });
103
+ return testSequence$;
104
+ }
105
+ testDecryptionWithKeys() {
106
+ const testSequence = new BehaviorSubject("");
107
+ const testSequence$ = testSequence.asObservable();
108
+ testSequence.next("Test Generating Keys");
109
+ const privateKey = `-----BEGIN PRIVATE KEY-----
110
+ MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDKVBkCWNb9eHVF
111
+ twAA5mdAyvXFix3WavdrsoYRkvtCl8ogDBQf8f6N0bRkDF1zcVHRrNAEyozXDtuD
112
+ kFgSiivBFREI7fiS3sOvduq6FaGXzX0IY6oaVMu8oOPgDvC0yvoohR+0Qxq2d6lP
113
+ SPyHeKQaxP4KxzCJJzB1XAcbd2eFzUUDv25mNlwdVkmW8FI/sAxnJLgPTW78dzfX
114
+ Ddfk+nxdIqxVKSLATnL0kMN7aGJx24UozioAIpzvvvF5/+7HTd1gi6NeCqrAYr3g
115
+ iP364AE26CFwFvHnafO9uNQhlQ+uiNnOoInXByfFGVP+RidSpfLzaxDjs6RDwpol
116
+ h098btONAgMBAAECggEAAVhHM2OD5IkUtuowwcKNaCTKGmrClRE3gMuzJeBsSJEy
117
+ uAReUFILZylcnhegDytSti2vDA9T7xqtO6CU0p3V8LpU89JMOPRb/deirI4UXSpx
118
+ xbNyjirOO6bnrNlOWfKexdQQsikYPzF2iM1Scpr1u9ZDCHZOl1ZYSrkve5My4coP
119
+ 3Gx6tTBqL0jQBfcpf4ES8BH3JSawR/MgqzDS74+bI2VH+kvuPAC1L4fBgaV3VUv0
120
+ nFzim5A3s5VaXPgJbEIghP9BkYGFkeT9ma3nliEZWc96AzsmowFn1ayCvrNVPo9R
121
+ ECD2NnttBiCJZt3H93sR9+OTeA8Bls+aZGlKd5mLAQKBgQDpf8nIYUm/Zmls7/lQ
122
+ QBUSGHEYrbjNsEejQsPgNDtg2EVSxdUkvTn7Wb+HExTk09Z5bNvhaO2532/FH9y8
123
+ ahSXafiMXpfR2olwXdOB9yXXl4F5C0LGnmzGim4OSeWzAX0JCL470KaS0QN3EmoG
124
+ 9F0YCfMnZXNTweSSx4xvlO6ggQKBgQDd01uIolm7z1DIWCwNERAXP2GDwcvxyzYK
125
+ YqJfKDeHt2t6yIzZMMotnPDy+OlcdGspIIHkB5a+SZN5Nt7DUKg/MnyOZ3KbVq41
126
+ k7dR4Ka3LRnGkesy7lSr7ef1rfquyR75OXJQcPWvkFcLu0TMiQhvptatZ8VN+F4n
127
+ fDQELRotDQKBgQCgN+AUT7VT0QjcCBnRV/ddUEoiPenFsYSmYMSYzh5ESIHg1wB2
128
+ 0iS79Iw4Of6nOTg8X1bM57vfQ5Kk90T2P+/bKYqzfqC8DTErWiYsUpKzyTC9Bt4N
129
+ /Vz0Kr5zrX8ggg/yp/4oevYhXav8AzWfigNq4EDpMnKc8TlPAf+5/L50gQKBgQC2
130
+ mLPhPhr1gUszD3l7bA89w7uGlLFHoQoj9FtKTzWervp3QLzIT+QtNeIVb5XQuDg5
131
+ y3uAdEq+6pvNjMBEMJG+K9Xh9v+dJPYUPjsJ2A4D/MkZ7qWX8B2cxSJK1uLim8W2
132
+ S3ZxBvsGgJ9WldmlMCvUlJZkeWYtr4P5psC+q02/xQKBgQCDII/jcV2+lRM2iNTe
133
+ vBijZSaNMEWOK/Y+/HFK8GYKXnB+xNWhrm8rKgWGzpDJAUPMh9Tt+leW9LKEBuzF
134
+ Y1bGblmGm1zsPWpIx05Fdtv9eOJmFnXbGzIsYyhadZnPcQOWhqxtpVxSuul0Jc7Q
135
+ XNq4qPaPXhbQAshgtyBt75DMkw==
136
+ -----END PRIVATE KEY-----`;
137
+ const pubKey = `-----BEGIN PUBLIC KEY-----
138
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylQZAljW/Xh1RbcAAOZn
139
+ QMr1xYsd1mr3a7KGEZL7QpfKIAwUH/H+jdG0ZAxdc3FR0azQBMqM1w7bg5BYEoor
140
+ wRURCO34kt7Dr3bquhWhl819CGOqGlTLvKDj4A7wtMr6KIUftEMatnepT0j8h3ik
141
+ GsT+CscwiScwdVwHG3dnhc1FA79uZjZcHVZJlvBSP7AMZyS4D01u/Hc31w3X5Pp8
142
+ XSKsVSkiwE5y9JDDe2hicduFKM4qACKc777xef/ux03dYIujXgqqwGK94Ij9+uAB
143
+ NughcBbx52nzvbjUIZUProjZzqCJ1wcnxRlT/kYnUqXy82sQ47OkQ8KaJYdPfG7T
144
+ jQIDAQAB
145
+ -----END PUBLIC KEY-----`;
146
+ const algorithm = {
147
+ name: "RSA-OAEP",
148
+ modulusLength: 2048,
149
+ publicExponent: new Uint8Array([1, 0, 1]),
150
+ hash: "SHA-256"
151
+ };
152
+ // ENCRYPT
153
+ this.pemToCryptoKey(pubKey, algorithm, true, ["encrypt"], "spki").subscribe((keyPublic) => {
154
+ // console.log("PUBLIC KEY: ", keyPublic)
155
+ this.encryptData(keyPublic, "Sample Data here - Mike Bonifacio")
156
+ .subscribe((str) => {
157
+ console.log("ENCRYPTED STRING: ", str);
158
+ testSequence.next('encrypted string success');
159
+ });
160
+ });
161
+ const enc = "r7UOuEGBZ6jbVTOIBuv9jFOEtRiedmS27hfW40k7XKCTsQ5VhWup0qu2BA2ANZaGKii/uehJ/RSPiyfGbJ6leJrat0mA1hPqH/XodaBzLMDigvdYM1NSXFZMDa40OpLUIXbPlAvybjcGu7Bal+LMA8htHrFu/OmM/fHI66xOzzpuXSYx0OkWjtY81rUQ1FFkvrkx2jGFPZ0p+Nw/v3Q4cJnet6V63vCueFlD749VMcVXo7pvz4AIPpB+IOy3kbxaYTPakLVioJERU6GFMXWkECuRvohhS9CETcORZtRVRkvhcHk3lxgIhfqojUKYgD6K5dDELDPsWIS+iTG1XIQIlg==";
162
+ // DECRYPTION
163
+ this.pemToCryptoKey(privateKey, algorithm, false, ["decrypt"], "pkcs8").subscribe((key) => {
164
+ // console.log("DECRYPT ===", key)
165
+ this.decryptData(key, enc)
166
+ .pipe(catchError(err => {
167
+ console.log("ERROR: ", err);
168
+ return EMPTY;
169
+ })).subscribe((str) => {
170
+ console.log("DECRYPTED STRING: ", str);
171
+ testSequence.next('decrypted string success');
172
+ });
173
+ });
174
+ return testSequence$;
175
+ }
176
+ ;
177
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AsymmetricalEncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
178
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AsymmetricalEncryptionService, providedIn: 'root' }); }
179
+ }
180
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AsymmetricalEncryptionService, decorators: [{
181
+ type: Injectable,
182
+ args: [{
183
+ providedIn: 'root'
184
+ }]
185
+ }], ctorParameters: function () { return []; } });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvc2VydmljZXMvdXRpbHMvZW5jcnlwdGlvbi9hc3ltbWV0cmljYWwtZW5jcnlwdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWMsSUFBSSxFQUFNLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBS2pELE1BQU0sT0FBTyw2QkFBNkI7SUFFeEMsZ0JBQWUsQ0FBQztJQUVoQixlQUFlLENBQUMsYUFBYSxHQUFHLElBQUk7UUFFbEMsbUNBQW1DO1FBQ25DLGlCQUFpQjtRQUVsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDbEM7WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixhQUFhO1lBQ2IsY0FBYyxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1NBQzFCLEVBQ0QsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FDdkIsQ0FBQyxDQUFBO0lBRUosQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFvQixFQUFFLElBQVk7UUFFNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFbEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxP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QUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFFbEIsa0NBQWtDO1lBRWxDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztpQkFDekIsSUFBSSxDQUNILFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxLQUFLLENBQUE7WUFDZCxDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxZQUFZLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUE7UUFFSixDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFBQSxDQUFDOytHQWhSUyw2QkFBNkI7bUhBQTdCLDZCQUE2QixjQUY1QixNQUFNOzs0RkFFUCw2QkFBNkI7a0JBSHpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIEVNUFRZLCBPYnNlcnZhYmxlLCBmcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBc3ltbWV0cmljYWxFbmNyeXB0aW9uU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGdlbmVyYXRlS2V5UGFpcihtb2R1bHVzTGVuZ3RoID0gMjA0OCk6IE9ic2VydmFibGU8Q3J5cHRvS2V5UGFpcj4ge1xuICBcbiAgICAvLyBtb2R1bHVzTGVuZ3RoIC0gMTAyNCwgMjA0OCwgNDA5NlxuICAgIC8vIGhhc2ggLSBTSEEtMjU2XG5cbiAgIHJldHVybiBmcm9tKGNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwiUlNBLU9BRVBcIixcbiAgICAgICAgbW9kdWx1c0xlbmd0aCxcbiAgICAgICAgcHVibGljRXhwb25lbnQ6IG5ldyBVaW50OEFycmF5KFsxLCAwLCAxXSksIC8vIDY1NTM3XG4gICAgICAgIGhhc2g6IHsgbmFtZTogXCJTSEEtMjU2XCIgfVxuICAgICAgfSxcbiAgICAgIHRydWUsIC8vIEV4dHJhY3RhYmxlIGtleXNcbiAgICAgIFtcImVuY3J5cHRcIiwgXCJkZWNyeXB0XCJdXG4gICAgKSlcblxuICB9XG5cbiAgZW5jcnlwdERhdGEocHVibGljS2V5OiBDcnlwdG9LZXksIGRhdGE6IHN0cmluZykge1xuXG4gICAgY29uc3QgZW5jb2RlZERhdGEgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZGF0YSlcblxuICAgIHJldHVybiBmcm9tKGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJSU0EtT0FFUFwiXG4gICAgICB9LFxuICAgICAgcHVibGljS2V5LFxuICAgICAgZW5jb2RlZERhdGFcbiAgICApKS5waXBlKFxuICAgICAgbWFwKGVuYyA9PiB0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoZW5jKSlcbiAgICApXG5cbiAgfVxuXG4gIGRlY3J5cHREYXRhKHByaXZhdGVLZXk6IENyeXB0b0tleSwgZW5jcnlwdGVkRGF0YTogc3RyaW5nKSB7XG5cbiAgICBjb25zdCBlbmNTdHIgPSB0aGlzLmJhc2U2NFRvQXJyYXlCdWZmZXIoZW5jcnlwdGVkRGF0YSlcblxuICAgIHJldHVybiBmcm9tKGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJSU0EtT0FFUFwiXG4gICAgICB9LFxuICAgICAgcHJpdmF0ZUtleSxcbiAgICAgIGVuY1N0clxuICAgICkudGhlbihkZWNyeXB0ZWREYXRhID0+IHtcbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkRGF0YSlcbiAgICB9KSlcblxuICB9XG5cbiAgcGVtVG9BcnJheUJ1ZmZlcihwZW06IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcblxuICAgIGNvbnN0IGI2NCA9IHBlbS5yZXBsYWNlKC8oLS0tLS1CRUdJTiAoUlNBICk/KFBSSVZBVEV8UFVCTElDKSBLRVktLS0tLXwtLS0tLUVORCAoUlNBICk/KFBSSVZBVEV8UFVCTElDKSBLRVktLS0tLXxcXG4pL2csICcnKVxuICAgIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYjY0KVxuICAgIGNvbnN0IGxlbiA9IGJpbmFyeVN0cmluZy5sZW5ndGhcbiAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobGVuKVxuICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2aWV3W2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSlcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyXG5cbiAgfVxuXG4gIGJhc2U2NFRvQXJyYXlCdWZmZXIoYmFzZTY0OiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XG4gICAgXG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGxlbiA9IGJpbmFyeVN0cmluZy5sZW5ndGg7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGxlbik7XG4gICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZpZXdbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9XG5cbiAgYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXI6IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcblxuICAgIGxldCBiaW5hcnkgPSAnJztcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgY29uc3QgbGVuID0gYnl0ZXMuYnl0ZUxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93LmJ0b2EoYmluYXJ5KVxuXG4gIH1cblxuICBiYXNlNjRUb1BFTShiYXNlNjRLZXk6IHN0cmluZywgcHVibGljS2V5ID0gdHJ1ZSkge1xuXG4gICAgY29uc3Qga2V5VHlwZSA9IChwdWJsaWNLZXkpID8gJ1BVQkxJQycgOiAnUFJJVkFURSdcblxuICAgIGNvbnN0IGhlYWRlciA9IGAtLS0tLUJFR0lOICR7a2V5VHlwZX0gS0VZLS0tLS1cXG5gXG4gICAgY29uc3QgZm9vdGVyID0gYFxcbi0tLS0tRU5EICR7a2V5VHlwZX0gS0VZLS0tLS1gXG5cbiAgICBjb25zdCBrZXlCb2R5ID0gYmFzZTY0S2V5Lm1hdGNoKC8uezEsNjR9L2cpPy5qb2luKFwiXFxuXCIpIHx8IFwiXCJcblxuICAgIHJldHVybiBoZWFkZXIgKyBrZXlCb2R5ICsgZm9vdGVyXG5cbiAgfVxuXG4gIHBlbVRvQ3J5cHRvS2V5KFxuICAgIHBlbTogc3RyaW5nLCBcbiAgICBhbGdvcml0aG06IFJzYUhhc2hlZEtleUdlblBhcmFtcywgXG4gICAgZXh0cmFjdGFibGU6IGJvb2xlYW4sIFxuICAgIGtleVVzYWdlczogS2V5VXNhZ2VbXSxcbiAgICBmb3JtYXQ6IGFueSA9IFwicGtjczhcIiAvL1wicmF3XCIgfCBcInBrY3M4XCIgfCBcInNwa2lcIlxuICAgICkge1xuICAgIFxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMucGVtVG9BcnJheUJ1ZmZlcihwZW0pO1xuXG4gICAgY29uc29sZS5sb2coJ2J1ZmZlciBmb3VuZCAnLCBidWZmZXIpO1xuICAgIFxuICAgIHJldHVybiBmcm9tKGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgZm9ybWF0LFxuICAgICAgYnVmZmVyLFxuICAgICAgYWxnb3JpdGhtLFxuICAgICAgZXh0cmFjdGFibGUsXG4gICAgICBrZXlVc2FnZXNcbiAgICApKVxuXG4gIH1cbiAgXG4gIC8vIFRFU1RJTkdcblxuICB0ZXN0R2VuZXJhdGVLZXlzKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3QgdGVzdFNlcXVlbmNlOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcIlwiKTtcbiAgICBjb25zdCB0ZXN0U2VxdWVuY2UkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0ZXN0U2VxdWVuY2UuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGVzdFNlcXVlbmNlLm5leHQoXCJUZXN0IEdlbmVyYXRpbmcgS2V5c1wiKTtcblxuICAgIC8vIEdFTkVSQVRFIEtFWVNcbiAgICB0aGlzLmdlbmVyYXRlS2V5UGFpcigpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuXG4gICAgICBjb25zb2xlLmxvZyhcIkdFTi1HRU5FUkFURUQgS0VZUzogXCIsIGRhdGEpXG5cbiAgICAgIGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdzcGtpJywgZGF0YS5wdWJsaWNLZXkpXG4gICAgICAudGhlbihrZXkgPT4ge1xuICAgICAgICBjb25zdCBwdWJsaWNLZXlCYXNlNjQgPSB0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoa2V5KTtcbiAgICAgICAgY29uc29sZS5sb2coXCJHRU4tRVhQT1JUIFBVQkxJQyBLRVk6IFwiLCB0aGlzLmJhc2U2NFRvUEVNKHB1YmxpY0tleUJhc2U2NCwgdHJ1ZSkpO1xuICAgICAgfSlcblxuICAgICAgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoJ3BrY3M4JywgZGF0YS5wcml2YXRlS2V5KVxuICAgICAgLnRoZW4oa2V5ID0+IHtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleUJhc2U2NCA9IHRoaXMuYXJyYXlCdWZmZXJUb0Jhc2U2NChrZXkpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIkdFTi1FWFBPUlQgUFJJVkFURSBLRVk6IFwiLCB0aGlzLmJhc2U2NFRvUEVNKHByaXZhdGVLZXlCYXNlNjQsIGZhbHNlKSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVEVTVCBXSVRIIEdFTkVSQVRFRCBLRVlTXG4gICAgICB0aGlzLmVuY3J5cHREYXRhKGRhdGEucHVibGljS2V5LCBcIlNhbXBsZSBEYXRhIGhlcmUgLSBNaWtlIEJvbmlmYWNpb1wiKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKGVuYykgPT4ge1xuXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkdFTi1FTkNSWVBUPT0+OiBcIiwgZW5jKVxuXG4gICAgICAgICAgICB0aGlzLmRlY3J5cHREYXRhKGRhdGEucHJpdmF0ZUtleSwgZW5jKS5zdWJzY3JpYmUoKGRlYykgPT4ge1xuICAgICAgICAgICAgICB0ZXN0U2VxdWVuY2UubmV4dCgnVGVzdCBQYXNzZWQnKTtcbiAgICAgICAgICAgICAgdGVzdFNlcXVlbmNlLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgfSlcblxuICAgIH0pXG4gICAgcmV0dXJuIHRlc3RTZXF1ZW5jZSQ7XG5cbiAgfVxuXG4gIHRlc3REZWNyeXB0aW9uV2l0aEtleXMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0ZXN0U2VxdWVuY2U6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFwiXCIpO1xuICAgIGNvbnN0IHRlc3RTZXF1ZW5jZSQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRlc3RTZXF1ZW5jZS5hc09ic2VydmFibGUoKTtcbiAgICB0ZXN0U2VxdWVuY2UubmV4dChcIlRlc3QgR2VuZXJhdGluZyBLZXlzXCIpO1xuXG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGAtLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS1cbiAgICBNSUlFdndJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLa3dnZ1NsQWdFQUFvSUJBUURLVkJrQ1dOYjllSFZGXG4gICAgdHdBQTVtZEF5dlhGaXgzV2F2ZHJzb1lSa3Z0Q2w4b2dEQlFmOGY2TjBiUmtERjF6Y1ZIUnJOQUV5b3pYRHR1RFxuICAgIGtGZ1NpaXZCRlJFSTdmaVMzc092ZHVxNkZhR1h6WDBJWTZvYVZNdThvT1BnRHZDMHl2b29oUiswUXhxMmQ2bFBcbiAgICBTUHlIZUtRYXhQNEt4ekNKSnpCMVhBY2JkMmVGelVVRHYyNW1ObHdkVmttVzhGSS9zQXhuSkxnUFRXNzhkemZYXG4gICAgRGRmaytueGRJcXhWS1NMQVRuTDBrTU43YUdKeDI0VW96aW9BSXB6dnZ2RjUvKzdIVGQxZ2k2TmVDcXJBWXIzZ1xuICAgIGlQMzY0QUUyNkNGd0Z2SG5hZk85dU5RaGxRK3VpTm5Pb0luWEJ5ZkZHVlArUmlkU3BmTHpheERqczZSRHdwb2xcbiAgICBoMDk4YnRPTkFnTUJBQUVDZ2dFQUFWaEhNMk9ENUlrVXR1b3d3Y0tOYUNUS0dtckNsUkUzZ011ekplQnNTSkV5XG4gICAgdUFSZVVGSUxaeWxjbmhlZ0R5dFN0aTJ2REE5VDd4cXRPNkNVMHAzVjhMcFU4OUpNT1BSYi9kZWlySTRVWFNweFxuICAgIHhiTnlqaXJPTzZibnJObE9XZktleGRRUXNpa1lQekYyaU0xU2NwcjF1OVpEQ0haT2wxWllTcmt2ZTVNeTRjb1BcbiAgICAzR3g2dFRCcUwwalFCZmNwZjRFUzhCSDNKU2F3Ui9NZ3F6RFM3NCtiSTJWSCtrdnVQQUMxTDRmQmdhVjNWVXYwXG4gICAgbkZ6aW01QTNzNVZhWFBnSmJFSWdoUDlCa1lHRmtlVDltYTNubGlFWldjOTZBenNtb3dGbjFheUN2ck5WUG85UlxuICAgIEVDRDJObnR0QmlDSlp0M0g5M3NSOStPVGVBOEJscythWkdsS2Q1bUxBUUtCZ1FEcGY4bklZVW0vWm1sczcvbFFcbiAgICBRQlVTR0hFWXJiak5zRWVqUXNQZ05EdGcyRVZTeGRVa3ZUbjdXYitIRXhUazA5WjViTnZoYU8yNTMyL0ZIOXk4XG4gICAgYWhTWGFmaU1YcGZSMm9sd1hkT0I5eVhYbDRGNUMwTEdubXpHaW00T1NlV3pBWDBKQ0w0NzBLYVMwUU4zRW1vR1xuICAgIDlGMFlDZk1uWlhOVHdlU1N4NHh2bE82Z2dRS0JnUURkMDF1SW9sbTd6MURJV0N3TkVSQVhQMkdEd2N2eHl6WUtcbiAgICBZcUpmS0RlSHQydDZ5SXpaTU1vdG5QRHkrT2xjZEdzcElJSGtCNWErU1pONU50N0RVS2cvTW55T1ozS2JWcTQxXG4gICAgazdkUjRLYTNMUm5Ha2VzeTdsU3I3ZWYxcmZxdXlSNzVPWEpRY1BXdmtGY0x1MFRNaVFodnB0YXRaOFZOK0Y0blxuICAgIGZEUUVMUm90RFFLQmdRQ2dOK0FVVDdWVDBRamNDQm5SVi9kZFVFb2lQZW5Gc1lTbVlNU1l6aDVFU0lIZzF3QjJcbiAgICAwaVM3OUl3NE9mNm5PVGc4WDFiTTU3dmZRNUtrOTBUMlArL2JLWXF6ZnFDOERURXJXaVlzVXBLenlUQzlCdDROXG4gICAgL1Z6MEtyNXpyWDhnZ2cveXAvNG9ldlloWGF2OEF6V2ZpZ05xNEVEcE1uS2M4VGxQQWYrNS9MNTBnUUtCZ1FDMlxuICAgIG1MUGhQaHIxZ1VzekQzbDdiQTg5dzd1R2xMRkhvUW9qOUZ0S1R6V2VydnAzUUx6SVQrUXROZUlWYjVYUXVEZzVcbiAgICB5M3VBZEVxKzZwdk5qTUJFTUpHK0s5WGg5ditkSlBZVVBqc0oyQTREL01rWjdxV1g4QjJjeFNKSzF1TGltOFcyXG4gICAgUzNaeEJ2c0dnSjlXbGRtbE1DdlVsSlprZVdZdHI0UDVwc0MrcTAyL3hRS0JnUUNESUkvamNWMitsUk0yaU5UZVxuICAgIHZCaWpaU2FOTUVXT0svWSsvSEZLOEdZS1huQit4Tldocm04cktnV0d6cERKQVVQTWg5VHQrbGVXOUxLRUJ1ekZcbiAgICBZMWJHYmxtR20xenNQV3BJeDA1RmR0djllT0ptRm5YYkd6SXNZeWhhZFpuUGNRT1docXh0cFZ4U3V1bDBKYzdRXG4gICAgWE5xNHFQYVBYaGJRQXNoZ3R5QnQ3NURNa3c9PVxuICAgIC0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1gXG4gICAgXG4gICAgICAgIGNvbnN0IHB1YktleSA9IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuICAgIE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeWxRWkFsalcvWGgxUmJjQUFPWm5cbiAgICBRTXIxeFlzZDFtcjNhN0tHRVpMN1FwZktJQXdVSC9IK2pkRzBaQXhkYzNGUjBhelFCTXFNMXc3Ymc1QllFb29yXG4gICAgd1JVUkNPMzRrdDdEcjNicXVoV2hsODE5Q0dPcUdsVEx2S0RqNEE3d3RNcjZLSVVmdEVNYXRuZXBUMGo4aDNpa1xuICAgIEdzVCtDc2N3aVNjd2RWd0hHM2RuaGMxRkE3OXVaalpjSFZaSmx2QlNQN0FNWnlTNEQwMXUvSGMzMXczWDVQcDhcbiAgICBYU0tzVlNraXdFNXk5SkREZTJoaWNkdUZLTTRxQUNLYzc3N3hlZi91eDAzZFlJdWpYZ3Fxd0dLOTRJajkrdUFCXG4gICAgTnVnaGNCYng1Mm56dmJqVUlaVVByb2paenFDSjF3Y254UmxUL2tZblVxWHk4MnNRNDdPa1E4S2FKWWRQZkc3VFxuICAgIGpRSURBUUFCXG4gICAgLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYFxuXG4gICAgY29uc3QgYWxnb3JpdGhtOiBSc2FIYXNoZWRLZXlHZW5QYXJhbXMgPSB7XG4gICAgICBuYW1lOiBcIlJTQS1PQUVQXCIsXG4gICAgICBtb2R1bHVzTGVuZ3RoOiAyMDQ4LFxuICAgICAgcHVibGljRXhwb25lbnQ6IG5ldyBVaW50OEFycmF5KFsxLCAwLCAxXSksXG4gICAgICBoYXNoOiBcIlNIQS0yNTZcIlxuICAgIH07XG5cbiAgICAvLyBFTkNSWVBUXG4gICAgdGhpcy5wZW1Ub0NyeXB0b0tleShcbiAgICAgIHB1YktleSxcbiAgICAgIGFsZ29yaXRobSxcbiAgICAgIHRydWUsXG4gICAgICBbXCJlbmNyeXB0XCJdLFxuICAgICAgXCJzcGtpXCJcbiAgICApLnN1YnNjcmliZSgoa2V5UHVibGljKSA9PiB7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiUFVCTElDIEtFWTogXCIsIGtleVB1YmxpYylcblxuICAgICAgdGhpcy5lbmNyeXB0RGF0YShrZXlQdWJsaWMsIFwiU2FtcGxlIERhdGEgaGVyZSAtIE1pa2UgQm9uaWZhY2lvXCIpXG4gICAgICAuc3Vic2NyaWJlKChzdHIpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJFTkNSWVBURUQgU1RSSU5HOiBcIiwgc3RyKTtcbiAgICAgICAgdGVzdFNlcXVlbmNlLm5leHQoJ2VuY3J5cHRlZCBzdHJpbmcgc3VjY2VzcycpO1xuICAgICAgfSlcblxuICAgIH0pXG5cbiAgICBjb25zdCBlbmMgPSBcInI3VU91RUdCWjZqYlZUT0lCdXY5akZPRXRSaWVkbVMyN2hmVzQwazdYS0NUc1E1VmhXdXAwcXUyQkEyQU5aYUdLaWkvdWVoSi9SU1BpeWZHYko2bGVKcmF0MG1BMWhQcUgvWG9kYUJ6TE1EaWd2ZFlNMU5TWEZaTURhNDBPcExVSVhiUGxBdnliamNHdTdCYWwrTE1BOGh0SHJGdS9PbU0vZkhJNjZ4T3p6cHVYU1l4ME9rV2p0WTgxclVRMUZGa3Zya3gyakdGUFowcCtOdy92M1E0Y0puZXQ2VjYzdkN1ZUZsRDc0OVZNY1ZYbzdwdno0QUlQcEIrSU95M2tieGFZVFBha0xWaW9KRVJVNkdGTVhXa0VDdVJ2b2hoUzlDRVRjT1JadFJWUmt2aGNIazNseGdJaGZxb2pVS1lnRDZLNWRERUxEUHNXSVMraVRHMVhJUUlsZz09XCI7XG5cbiAgICAvLyBERUNSWVBUSU9OXG4gICAgdGhpcy5wZW1Ub0NyeXB0b0tleShcbiAgICAgIHByaXZhdGVLZXksXG4gICAgICBhbGdvcml0aG0sXG4gICAgICBmYWxzZSxcbiAgICAgIFtcImRlY3J5cHRcIl0sXG4gICAgICBcInBrY3M4XCJcbiAgICApLnN1YnNjcmliZSgoa2V5KSA9PiB7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiREVDUllQVCA9PT1cIiwga2V5KVxuXG4gICAgICB0aGlzLmRlY3J5cHREYXRhKGtleSwgZW5jKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkVSUk9SOiBcIiwgZXJyKTtcbiAgICAgICAgICByZXR1cm4gRU1QVFlcbiAgICAgICAgfSlcbiAgICAgICkuc3Vic2NyaWJlKChzdHIpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCJERUNSWVBURUQgU1RSSU5HOiBcIiwgc3RyKTtcbiAgICAgICAgdGVzdFNlcXVlbmNlLm5leHQoJ2RlY3J5cHRlZCBzdHJpbmcgc3VjY2VzcycpO1xuICAgICAgfSlcblxuICAgIH0pXG5cbiAgICByZXR1cm4gdGVzdFNlcXVlbmNlJDtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,35 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class EncryptionTestService {
4
+ constructor() { }
5
+ isBase64(str) {
6
+ const base64Pattern = /^(?:[A-Z0-9+/]{4})*(?:[A-Z0-9+/]{2}==|[A-Z0-9+/]{3}=)?$/i;
7
+ return base64Pattern.test(str);
8
+ }
9
+ isHexadecimal(str) {
10
+ const hexPattern = /^[0-9a-fA-F]+$/;
11
+ return hexPattern.test(str) && (str.length % 2 === 0);
12
+ }
13
+ hasHighEntropy(str) {
14
+ const uniqueChars = new Set(str).size;
15
+ return uniqueChars > str.length * 0.6;
16
+ }
17
+ isEncrypted(str) {
18
+ if (typeof str !== 'string') {
19
+ return false;
20
+ }
21
+ if (this.isBase64(str) || this.isHexadecimal(str)) {
22
+ return true;
23
+ }
24
+ return this.hasHighEntropy(str);
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EncryptionTestService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
27
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EncryptionTestService, providedIn: 'root' }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EncryptionTestService, decorators: [{
30
+ type: Injectable,
31
+ args: [{
32
+ providedIn: 'root'
33
+ }]
34
+ }], ctorParameters: function () { return []; } });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi10ZXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL3V0aWxzL2VuY3J5cHRpb24vZW5jcnlwdGlvbi10ZXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLHFCQUFxQjtJQUVoQyxnQkFBZ0IsQ0FBQztJQUVULFFBQVEsQ0FBQyxHQUFXO1FBQzFCLE1BQU0sYUFBYSxHQUFHLDBEQUEwRCxDQUFDO1FBQ2pGLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQVc7UUFDL0IsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7UUFDcEMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQUFXO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0QyxPQUFPLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUN4QyxDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVc7UUFFckIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFbEMsQ0FBQzsrR0EvQlUscUJBQXFCO21IQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRW5jcnlwdGlvblRlc3RTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIHByaXZhdGUgaXNCYXNlNjQoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBiYXNlNjRQYXR0ZXJuID0gL14oPzpbQS1aMC05Ky9dezR9KSooPzpbQS1aMC05Ky9dezJ9PT18W0EtWjAtOSsvXXszfT0pPyQvaTtcbiAgICByZXR1cm4gYmFzZTY0UGF0dGVybi50ZXN0KHN0cik7XG4gIH1cblxuICBwcml2YXRlIGlzSGV4YWRlY2ltYWwoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBoZXhQYXR0ZXJuID0gL15bMC05YS1mQS1GXSskLztcbiAgICByZXR1cm4gaGV4UGF0dGVybi50ZXN0KHN0cikgJiYgKHN0ci5sZW5ndGggJSAyID09PSAwKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzSGlnaEVudHJvcHkoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB1bmlxdWVDaGFycyA9IG5ldyBTZXQoc3RyKS5zaXplO1xuICAgIHJldHVybiB1bmlxdWVDaGFycyA+IHN0ci5sZW5ndGggKiAwLjY7XG4gIH1cblxuICBpc0VuY3J5cHRlZChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNCYXNlNjQoc3RyKSB8fCB0aGlzLmlzSGV4YWRlY2ltYWwoc3RyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaGFzSGlnaEVudHJvcHkoc3RyKTtcblxuICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from "./asymmetrical-encryption.service";
2
+ export * from './symmetrical-encryption.service';
3
+ export * from './random';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL3V0aWxzL2VuY3J5cHRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGtDQUFrQyxDQUFDO0FBRWpELGNBQWMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYXN5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSAnLi9zeW1tZXRyaWNhbC1lbmNyeXB0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL3JhbmRvbSc7XG5cbiJdfQ==
@@ -0,0 +1,52 @@
1
+ export const Random = () => {
2
+ const typedArray = new Uint8Array(1);
3
+ const randomValue = crypto.getRandomValues(typedArray)[0];
4
+ const randomFloat = randomValue / Math.pow(2, 8);
5
+ return randomFloat;
6
+ };
7
+ export const RandomNumber = (min, max) => {
8
+ return Math.floor(Random() * max) + min;
9
+ };
10
+ export const RandomNumbers = (min, max, length) => {
11
+ const numbers = [];
12
+ for (let i = 0; i < length; i++)
13
+ numbers.push(Math.floor(Random() * max) + min);
14
+ return numbers;
15
+ };
16
+ export const RandomNumbersUnique = (min, max, length) => {
17
+ let count = 0;
18
+ // Adjust the length if it exceeds the number of unique numbers possible in the range
19
+ if (length > (max - min + 1)) {
20
+ console.error('error encountered');
21
+ length = max - min + 1;
22
+ }
23
+ console.log('length', length);
24
+ const numbers = [];
25
+ const maxAttempts = length * 100; // Safeguard to prevent infinite loops
26
+ while (numbers.length < length && count < maxAttempts) {
27
+ const num = Math.floor(Random() * max) + min;
28
+ if (!numbers.includes(num)) {
29
+ numbers.push(num);
30
+ }
31
+ }
32
+ if (count >= maxAttempts) {
33
+ throw new Error('Maximum attempts exceeded while generating unique numbers');
34
+ }
35
+ return numbers;
36
+ };
37
+ export const RandomStr = () => {
38
+ const typedArray = new Uint8Array(8);
39
+ const array = new Uint32Array(1);
40
+ crypto.getRandomValues(array);
41
+ return array[0].toString(36);
42
+ };
43
+ export const RandomSignature = () => {
44
+ const typedArray = new Uint8Array(8);
45
+ const array = new Uint32Array(1);
46
+ crypto.getRandomValues(array);
47
+ return array[0];
48
+ };
49
+ export const UUID = () => {
50
+ return self.crypto.randomUUID();
51
+ };
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9lbmNyeXB0aW9uL3JhbmRvbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFO0lBQ3pCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3BDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekQsTUFBTSxXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2hELE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsRUFBRTtJQUN2RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFBO0FBQ3pDLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQUUsTUFBYyxFQUFFLEVBQUU7SUFDeEUsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFBO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBQy9FLE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxNQUFjLEVBQUUsRUFBRTtJQUM5RSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFZCxxRkFBcUY7SUFDckYsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNuQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDeEI7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBRSxDQUFDLHNDQUFzQztJQUV6RSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxJQUFJLEtBQUssR0FBRyxXQUFXLEVBQUU7UUFFckQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNuQjtLQUNGO0lBRUQsSUFBSSxLQUFLLElBQUksV0FBVyxFQUFFO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztLQUM5RTtJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7SUFFNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7QUFFOUIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRTtJQUVsQyxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNoQyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRWpCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7SUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFBO0FBQ2pDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBSYW5kb20gPSAoKSA9PiB7XG4gIGNvbnN0IHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheSgxKVxuICBjb25zdCByYW5kb21WYWx1ZSA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXModHlwZWRBcnJheSlbMF1cbiAgY29uc3QgcmFuZG9tRmxvYXQgPSByYW5kb21WYWx1ZSAvIE1hdGgucG93KDIsIDgpXG4gIHJldHVybiByYW5kb21GbG9hdFxufVxuXG5leHBvcnQgY29uc3QgUmFuZG9tTnVtYmVyID0gKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikgPT4ge1xuICByZXR1cm4gTWF0aC5mbG9vcihSYW5kb20oKSAqIG1heCkgKyBtaW5cbn1cblxuZXhwb3J0IGNvbnN0IFJhbmRvbU51bWJlcnMgPSAobWluOiBudW1iZXIsIG1heDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcikgPT4ge1xuICBjb25zdCBudW1iZXJzOiBudW1iZXJbXSA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIG51bWJlcnMucHVzaChNYXRoLmZsb29yKFJhbmRvbSgpICogbWF4KSArIG1pbilcbiAgcmV0dXJuIG51bWJlcnNcbn1cblxuZXhwb3J0IGNvbnN0IFJhbmRvbU51bWJlcnNVbmlxdWUgPSAobWluOiBudW1iZXIsIG1heDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcikgPT4ge1xuICBsZXQgY291bnQgPSAwO1xuXG4gIC8vIEFkanVzdCB0aGUgbGVuZ3RoIGlmIGl0IGV4Y2VlZHMgdGhlIG51bWJlciBvZiB1bmlxdWUgbnVtYmVycyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2VcbiAgaWYgKGxlbmd0aCA+IChtYXggLSBtaW4gKyAxKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIGVuY291bnRlcmVkJyk7XG4gICAgbGVuZ3RoID0gbWF4IC0gbWluICsgMTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdsZW5ndGgnLCBsZW5ndGgpO1xuICBjb25zdCBudW1iZXJzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBtYXhBdHRlbXB0cyA9IGxlbmd0aCAqIDEwMCA7IC8vIFNhZmVndWFyZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG5cbiAgd2hpbGUgKG51bWJlcnMubGVuZ3RoIDwgbGVuZ3RoICYmIGNvdW50IDwgbWF4QXR0ZW1wdHMpIHtcblxuICAgIGNvbnN0IG51bSA9IE1hdGguZmxvb3IoUmFuZG9tKCkgKiBtYXgpICsgbWluO1xuXG4gICAgaWYgKCFudW1iZXJzLmluY2x1ZGVzKG51bSkpIHtcbiAgICAgIG51bWJlcnMucHVzaChudW0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb3VudCA+PSBtYXhBdHRlbXB0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSBhdHRlbXB0cyBleGNlZWRlZCB3aGlsZSBnZW5lcmF0aW5nIHVuaXF1ZSBudW1iZXJzJyk7XG4gIH1cblxuICByZXR1cm4gbnVtYmVycztcbn07XG5cbmV4cG9ydCBjb25zdCBSYW5kb21TdHIgPSAoKSA9PiB7XG5cbiAgY29uc3QgdHlwZWRBcnJheSA9IG5ldyBVaW50OEFycmF5KDgpXG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpXG4gIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpXG4gIHJldHVybiBhcnJheVswXS50b1N0cmluZygzNilcblxufVxuXG5leHBvcnQgY29uc3QgUmFuZG9tU2lnbmF0dXJlID0gKCkgPT4ge1xuXG4gIGNvbnN0IHR5cGVkQXJyYXkgPSBuZXcgVWludDhBcnJheSg4KVxuICBjb25zdCBhcnJheSA9IG5ldyBVaW50MzJBcnJheSgxKVxuICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KVxuICByZXR1cm4gYXJyYXlbMF1cblxufVxuXG5leHBvcnQgY29uc3QgVVVJRCA9ICgpID0+IHtcbiAgcmV0dXJuIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQoKVxufVxuXG5cbiJdfQ==
@@ -0,0 +1,77 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import * as CryptoJS from 'crypto-js';
3
+ import { RandomSignature } from './random';
4
+ import { AppService } from '../app.service';
5
+ import * as i0 from "@angular/core";
6
+ export class SymmetricalEncryptionService {
7
+ constructor() {
8
+ this.appService = inject(AppService);
9
+ // TODO: The APP ID is not a string, it is a function
10
+ this.appID = (this.appService.appID) ? this.appService.appID : '';
11
+ if (this.appID === '')
12
+ console.warn('No App Key has been define');
13
+ }
14
+ generateCipherKey() {
15
+ return (RandomSignature().toString() + RandomSignature().toString()).substring(0, 8);
16
+ }
17
+ encrypt(str, key = this.appID) {
18
+ if (!str || key === '')
19
+ return '';
20
+ let _key = CryptoJS.enc.Utf8.parse(key);
21
+ let _iv = CryptoJS.enc.Utf8.parse(key);
22
+ try {
23
+ const encrypted = CryptoJS.AES.encrypt(JSON.stringify(str), _key, {
24
+ keySize: 16,
25
+ iv: _iv,
26
+ mode: CryptoJS.mode.ECB,
27
+ padding: CryptoJS.pad.Pkcs7
28
+ });
29
+ return encrypted.toString();
30
+ }
31
+ catch (error) {
32
+ console.log(error);
33
+ }
34
+ return;
35
+ }
36
+ decrypt(str, key = this.appID) {
37
+ if (!str || key === '')
38
+ return;
39
+ let _key = CryptoJS.enc.Utf8.parse(key);
40
+ let _iv = CryptoJS.enc.Utf8.parse(key);
41
+ try {
42
+ return CryptoJS.AES.decrypt(str, _key, {
43
+ keySize: 16,
44
+ iv: _iv,
45
+ mode: CryptoJS.mode.ECB,
46
+ padding: CryptoJS.pad.Pkcs7
47
+ }).toString(CryptoJS.enc.Utf8);
48
+ }
49
+ catch (error) {
50
+ console.log(error);
51
+ }
52
+ return;
53
+ }
54
+ createSignature(url, len = 16) {
55
+ const sig = CryptoJS.SHA256(url).toString(CryptoJS.enc.Hex);
56
+ return sig.substring(0, len).toUpperCase();
57
+ }
58
+ normalizeURL(url) {
59
+ const normalizedURL = url.replace(/(https?:\/\/)?(www\.)?/, '').replace(/\/+$/, '');
60
+ return normalizedURL;
61
+ }
62
+ generateSignature(url) {
63
+ const normalizedURL = this.normalizeURL(url);
64
+ const hash = CryptoJS.SHA256(normalizedURL);
65
+ const signature = hash.toString(CryptoJS.enc.Hex);
66
+ return signature;
67
+ }
68
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
69
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, providedIn: 'root' }); }
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, decorators: [{
72
+ type: Injectable,
73
+ args: [{
74
+ providedIn: 'root'
75
+ }]
76
+ }], ctorParameters: function () { return []; } });
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltbWV0cmljYWwtZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9lbmNyeXB0aW9uL3N5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLNUMsTUFBTSxPQUFPLDRCQUE0QjtJQU12QztRQUZRLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFHckMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pFLElBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBUSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSztRQUVoQyxJQUFHLENBQUMs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QWpGVSw0QkFBNEI7bUhBQTVCLDRCQUE0QixjQUYzQixNQUFNOzs0RkFFUCw0QkFBNEI7a0JBSHhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBDcnlwdG9KUyBmcm9tICdjcnlwdG8tanMnO1xuXG5pbXBvcnQgeyBSYW5kb21TaWduYXR1cmUgfSBmcm9tICcuL3JhbmRvbSc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vYXBwLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTeW1tZXRyaWNhbEVuY3J5cHRpb25TZXJ2aWNlIHtcblxuICBhcHBJRDogc3RyaW5nOyAvLyBBUFAgU0VSVklDRSBUTyBNQU5BR0VSIEVOQ1JZUFRJT04gS0VZXG5cbiAgcHJpdmF0ZSBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gVE9ETzogVGhlIEFQUCBJRCBpcyBub3QgYSBzdHJpbmcsIGl0IGlzIGEgZnVuY3Rpb25cbiAgICB0aGlzLmFwcElEID0gKHRoaXMuYXBwU2VydmljZS5hcHBJRCkgPyB0aGlzLmFwcFNlcnZpY2UuYXBwSUQgOiAnJ1xuICAgIGlmKHRoaXMuYXBwSUQgPT09ICcnKSBjb25zb2xlLndhcm4oJ05vIEFwcCBLZXkgaGFzIGJlZW4gZGVmaW5lJylcbiAgfVxuXG4gIGdlbmVyYXRlQ2lwaGVyS2V5KCkge1xuICAgIHJldHVybiAoUmFuZG9tU2lnbmF0dXJlKCkudG9TdHJpbmcoKSArIFJhbmRvbVNpZ25hdHVyZSgpLnRvU3RyaW5nKCkpLnN1YnN0cmluZygwLCA4KVxuICB9XG5cbiAgZW5jcnlwdChzdHI6IGFueSwga2V5ID0gdGhpcy5hcHBJRCkge1xuXG4gICAgaWYoIXN0ciB8fCBrZXkgPT09ICcnKSByZXR1cm4gJydcblxuICAgIGxldCBfa2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uoa2V5KVxuICAgIGxldCBfaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShrZXkpXG5cbiAgICB0cnkge1xuXG4gICAgY29uc3QgZW5jcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQoXG4gICAgICBKU09OLnN0cmluZ2lmeShzdHIpLCBfa2V5LCB7XG4gICAgICAgIGtleVNpemU6IDE2LFxuICAgICAgICBpdjogX2l2LFxuICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQixcbiAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZygpXG5cbiAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgZGVjcnlwdChzdHI6IHN0cmluZywga2V5ID0gdGhpcy5hcHBJRCkge1xuXG4gICAgaWYoIXN0ciB8fCBrZXkgPT09ICcnKSByZXR1cm5cblxuICAgIGxldCBfa2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uoa2V5KVxuICAgIGxldCBfaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShrZXkpXG5cbiAgICB0cnkge1xuXG4gICAgcmV0dXJuIENyeXB0b0pTLkFFUy5kZWNyeXB0KFxuICAgICAgc3RyLCBfa2V5LCB7XG4gICAgICAgIGtleVNpemU6IDE2LFxuICAgICAgICBpdjogX2l2LFxuICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQixcbiAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XG4gICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG5cbiAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgY3JlYXRlU2lnbmF0dXJlKHVybDogc3RyaW5nLCBsZW4gPSAxNikge1xuICAgIGNvbnN0IHNpZyA9IENyeXB0b0pTLlNIQTI1Nih1cmwpLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpXG4gICAgcmV0dXJuIHNpZy5zdWJzdHJpbmcoMCwgbGVuKS50b1VwcGVyQ2FzZSgpXG4gIH1cblxuICBub3JtYWxpemVVUkwodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVVJMID0gdXJsLnJlcGxhY2UoLyhodHRwcz86XFwvXFwvKT8od3d3XFwuKT8vLCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRVUkw7XG4gIH1cblxuICBnZW5lcmF0ZVNpZ25hdHVyZSh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVUkwgPSB0aGlzLm5vcm1hbGl6ZVVSTCh1cmwpXG4gICAgY29uc3QgaGFzaCA9IENyeXB0b0pTLlNIQTI1Nihub3JtYWxpemVkVVJMKVxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGhhc2gudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleClcbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,21 @@
1
+ import { HttpHeaders } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class HeadersService {
5
+ constructor() {
6
+ this.headers = {};
7
+ }
8
+ generateHeaders(headers) {
9
+ const allHeaders = headers ? { ...this.headers, ...headers } : {};
10
+ return { headers: new HttpHeaders(allHeaders) };
11
+ }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HeadersService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
13
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HeadersService, providedIn: 'root' }); }
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HeadersService, decorators: [{
16
+ type: Injectable,
17
+ args: [{
18
+ providedIn: 'root'
19
+ }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVycy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9oZWFkZXJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSzNDLE1BQU0sT0FBTyxjQUFjO0lBSDNCO1FBS0UsWUFBTyxHQUFHLEVBQUUsQ0FBQTtLQVNiO0lBUEMsZUFBZSxDQUFDLE9BQWdDO1FBRTlDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQTtJQUVqRCxDQUFDOytHQVRVLGNBQWM7bUhBQWQsY0FBYyxjQUZiLE1BQU07OzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEhlYWRlcnNTZXJ2aWNlIHtcblxuICBoZWFkZXJzID0ge31cblxuICBnZW5lcmF0ZUhlYWRlcnMoaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB7IGhlYWRlcnM6IEh0dHBIZWFkZXJzIH0ge1xuXG4gICAgY29uc3QgYWxsSGVhZGVycyA9IGhlYWRlcnMgPyB7IC4uLnRoaXMuaGVhZGVycywgLi4uaGVhZGVycyB9IDoge31cbiAgICByZXR1cm4geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoYWxsSGVhZGVycykgfVxuXG4gIH1cblxufVxuIl19
@@ -0,0 +1,6 @@
1
+ export * from './app.service';
2
+ export * from './headers.service';
3
+ export * from './path-query.service';
4
+ export * from './utils.service';
5
+ export * from './encryption/index';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL3NlcnZpY2VzL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGlCQUFpQixDQUFDO0FBRWhDLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FwcC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaGVhZGVycy5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcGF0aC1xdWVyeS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMuc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vZW5jcnlwdGlvbi9pbmRleCc7XG5cbiJdfQ==
@@ -0,0 +1,53 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class PathQueryService {
4
+ constructor() {
5
+ this.removeEmptyParams = (obj) => Object.fromEntries(Object.entries(obj)
6
+ .map(([key, value]) => [key, value && typeof value === 'object' ? this.removeEmptyParams(value) : value])
7
+ .filter(([_, value]) => value !== undefined && value !== ""));
8
+ }
9
+ buildAPIPath(server, params) {
10
+ server = (Array.isArray(server)) ? server.join('/') : server;
11
+ const pathObjects = (params) ? params.filter((path) => (!this.isObject(path))) : [];
12
+ const queryObjects = (params) ? params.filter((path) => (this.isObject(path))) : [];
13
+ const query = this.removeEmptyParams(queryObjects.reduce((r, c) => {
14
+ Object.entries(c).forEach(([key, value]) => {
15
+ r[key] = Array.isArray(value) ? value.join(',') : value;
16
+ });
17
+ return r;
18
+ }, {}));
19
+ let path = this.buildRestPath(server, pathObjects);
20
+ return (Object.keys(query).length > 0) ? path + '?' + this.buildQueryPath(query) : path;
21
+ }
22
+ buildRestPath(server, params) {
23
+ server = (server.charAt(0) === '/') ? server.substring(1) : server;
24
+ return this.cleanUrlPath(server + '/' + params.join('/'));
25
+ }
26
+ buildQueryPath(params) {
27
+ const searchParams = new URLSearchParams();
28
+ for (const key in params) {
29
+ if (Array.isArray(params[key])) {
30
+ params[key].forEach((value) => searchParams.append(key, value));
31
+ }
32
+ else {
33
+ searchParams.append(key, params[key]);
34
+ }
35
+ }
36
+ return searchParams.toString();
37
+ }
38
+ cleanUrlPath(str) {
39
+ return str.replace(/([^:]\/)\/+/g, "$1").replace(/\/$/, '');
40
+ }
41
+ isObject(val) {
42
+ return (val === null) ? false : ((typeof val === 'function') || (typeof val === 'object'));
43
+ }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PathQueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
45
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PathQueryService, providedIn: 'root' }); }
46
+ }
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PathQueryService, decorators: [{
48
+ type: Injectable,
49
+ args: [{
50
+ providedIn: 'root'
51
+ }]
52
+ }] });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC1xdWVyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9wYXRoLXF1ZXJ5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLGdCQUFnQjtJQUg3QjtRQXdEVSxzQkFBaUIsR0FBRyxDQUFDLEdBQVEsRUFBdUIsRUFBRSxDQUM1RCxNQUFNLENBQUMsV0FBVyxDQUNoQixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQzthQUNoQixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQ3BCLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQ2xGO2FBQ0EsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUMvRCxDQUFBO0tBRUo7SUE1REMsWUFBWSxDQUFDLE1BQXVCLEVBQUUsTUFBa0I7UUFFdEQsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFFNUQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVEsRUFB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QVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUUsQ0FBQTtJQUM5RixDQUFDOytHQW5EVSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQUZmLE1BQU07OzRGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBhdGhRdWVyeVNlcnZpY2Uge1xuXG4gIGJ1aWxkQVBJUGF0aChzZXJ2ZXI6IHN0cmluZ3xzdHJpbmdbXSwgcGFyYW1zPzogYW55W118YW55KSB7XG5cbiAgICBzZXJ2ZXIgPSAoQXJyYXkuaXNBcnJheShzZXJ2ZXIpKSA/IHNlcnZlci5qb2luKCcvJykgOiBzZXJ2ZXJcblxuICAgIGNvbnN0IHBhdGhPYmplY3RzID0gKHBhcmFtcykgPyBwYXJhbXMuZmlsdGVyKChwYXRoOmFueSkgPT4gKCF0aGlzLmlzT2JqZWN0KHBhdGgpKSkgOiBbXVxuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0cyA9IChwYXJhbXMpID8gcGFyYW1zLmZpbHRlcigocGF0aDphbnkpID0+ICh0aGlzLmlzT2JqZWN0KHBhdGgpKSkgOiBbXVxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnJlbW92ZUVtcHR5UGFyYW1zKHF1ZXJ5T2JqZWN0cy5yZWR1Y2UoKHI6IGFueSwgYzogYW55KSA9PiB7XG4gICAgICBPYmplY3QuZW50cmllcyhjKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcltrZXldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKCcsJykgOiB2YWx1ZVxuICAgICAgfSlcbiAgICAgIHJldHVybiByXG4gICAgfSwge30pKVxuXG4gICAgbGV0IHBhdGggPSB0aGlzLmJ1aWxkUmVzdFBhdGgoc2VydmVyLCBwYXRoT2JqZWN0cylcblxuICAgIHJldHVybihPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoID4gMCkgPyBwYXRoICsgJz8nICsgdGhpcy5idWlsZFF1ZXJ5UGF0aChxdWVyeSkgOiBwYXRoXG5cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSZXN0UGF0aChzZXJ2ZXI6IHN0cmluZywgcGFyYW1zOiBhbnlbXSk6IHN0cmluZyB7XG4gICAgc2VydmVyID0gKHNlcnZlci5jaGFyQXQoMCkgPT09ICcvJykgPyBzZXJ2ZXIuc3Vic3RyaW5nKDEpIDogc2VydmVyXG4gICAgcmV0dXJuIHRoaXMuY2xlYW5VcmxQYXRoKHNlcnZlciArJy8nKyBwYXJhbXMuam9pbignLycpKVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFF1ZXJ5UGF0aChwYXJhbXM6IGFueSk6IHN0cmluZyB7XG5cbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHBhcmFtcykge1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXNba2V5XSkpIHtcbiAgICAgICAgcGFyYW1zW2tleV0uZm9yRWFjaCgodmFsdWU6IGFueSkgPT4gc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgcGFyYW1zW2tleV0pO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlYXJjaFBhcmFtcy50b1N0cmluZygpXG5cbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5VcmxQYXRoKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csIFwiJDFcIikucmVwbGFjZSgvXFwvJC8sJycpXG4gIH1cblxuICBwcml2YXRlIGlzT2JqZWN0KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh2YWwgPT09IG51bGwpID8gZmFsc2UgOiAoICh0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB8fCAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIClcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRW1wdHlQYXJhbXMgPSAob2JqOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+XG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMob2JqKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgW2tleSwgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRoaXMucmVtb3ZlRW1wdHlQYXJhbXModmFsdWUpIDogdmFsdWVdXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gXCJcIilcbiAgICApXG5cbn1cbiJdfQ==