http-request-manager 15.0.4 → 15.0.9

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 (22) hide show
  1. package/README.md +13 -0
  2. package/esm2022/lib/file-downloader-action/download-action/download-action.component.mjs +79 -0
  3. package/esm2022/lib/file-downloader-action/file-download-action.component.mjs +78 -0
  4. package/esm2022/lib/file-downloader-action/file-download-action.module.mjs +42 -0
  5. package/esm2022/lib/file-downloader-action/models/download-labels-model.mjs +11 -0
  6. package/esm2022/lib/file-downloader-action/spinner/spinner.component.mjs +29 -0
  7. package/esm2022/lib/http-request-manager.module.mjs +2 -2
  8. package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +1 -1
  9. package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +1 -1
  10. package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +163 -27
  11. package/fesm2022/http-request-manager.mjs +383 -36
  12. package/fesm2022/http-request-manager.mjs.map +1 -1
  13. package/http-request-manager-15.0.9.tgz +0 -0
  14. package/lib/file-downloader-action/download-action/download-action.component.d.ts +26 -0
  15. package/lib/file-downloader-action/file-download-action.component.d.ts +22 -0
  16. package/lib/file-downloader-action/file-download-action.module.d.ts +13 -0
  17. package/lib/file-downloader-action/models/download-labels-model.d.ts +12 -0
  18. package/lib/file-downloader-action/spinner/spinner.component.d.ts +16 -0
  19. package/lib/http-request-manager.module.d.ts +1 -1
  20. package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +12 -1
  21. package/package.json +2 -4
  22. package/http-request-manager-15.0.4.tgz +0 -0
@@ -1,5 +1,4 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
- import * as CryptoJS from 'crypto-js';
3
2
  import { RandomSignature } from './random';
4
3
  import { AppService } from '../app.service';
5
4
  import * as i0 from "@angular/core";
@@ -14,56 +13,193 @@ export class SymmetricalEncryptionService {
14
13
  generateCipherKey() {
15
14
  return (RandomSignature().toString() + RandomSignature().toString()).substring(0, 8);
16
15
  }
16
+ // Synchronous encrypt method to maintain compatibility
17
17
  encrypt(str, key = this.appID) {
18
18
  if (!str || key === '')
19
19
  return '';
20
- let _key = CryptoJS.enc.Utf8.parse(key);
21
- let _iv = CryptoJS.enc.Utf8.parse(key);
22
20
  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();
21
+ // Convert the string to encrypt to a Uint8Array
22
+ const encoder = new TextEncoder();
23
+ const data = encoder.encode(JSON.stringify(str));
24
+ // Create a simple key from the provided string
25
+ const keyBytes = encoder.encode(key.padEnd(16, key).substring(0, 16));
26
+ // Synchronous AES encryption using the SubtleCrypto polyfill approach
27
+ const encrypted = this.aesEncryptSync(data, keyBytes);
28
+ // Convert encrypted data to base64 string
29
+ return this.arrayBufferToBase64(encrypted);
30
30
  }
31
31
  catch (error) {
32
32
  console.log(error);
33
+ return '';
33
34
  }
34
- return;
35
35
  }
36
+ // Synchronous decrypt method to maintain compatibility
36
37
  decrypt(str, key = this.appID) {
37
38
  if (!str || key === '')
38
- return;
39
- let _key = CryptoJS.enc.Utf8.parse(key);
40
- let _iv = CryptoJS.enc.Utf8.parse(key);
39
+ return undefined;
41
40
  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);
41
+ // Convert the base64 string to ArrayBuffer
42
+ const encryptedData = this.base64ToArrayBuffer(str);
43
+ // Create a simple key from the provided string
44
+ const keyBytes = new TextEncoder().encode(key.padEnd(16, key).substring(0, 16));
45
+ // Synchronous AES decryption
46
+ const decryptedBuffer = this.aesDecryptSync(new Uint8Array(encryptedData), keyBytes);
47
+ // Convert decrypted data to string
48
+ return new TextDecoder().decode(decryptedBuffer);
48
49
  }
49
50
  catch (error) {
50
51
  console.log(error);
52
+ return undefined;
51
53
  }
52
- return;
53
54
  }
54
55
  createSignature(url, len = 16) {
55
- const sig = CryptoJS.SHA256(url).toString(CryptoJS.enc.Hex);
56
- return sig.substring(0, len).toUpperCase();
56
+ const signature = this.generateSignatureSync(url);
57
+ return signature.substring(0, len).toUpperCase();
57
58
  }
58
59
  normalizeURL(url) {
59
60
  const normalizedURL = url.replace(/(https?:\/\/)?(www\.)?/, '').replace(/\/+$/, '');
60
61
  return normalizedURL;
61
62
  }
62
63
  generateSignature(url) {
64
+ return this.generateSignatureSync(url);
65
+ }
66
+ // Helper methods
67
+ generateSignatureSync(url) {
63
68
  const normalizedURL = this.normalizeURL(url);
64
- const hash = CryptoJS.SHA256(normalizedURL);
65
- const signature = hash.toString(CryptoJS.enc.Hex);
66
- return signature;
69
+ // Using a synchronous SHA-256 implementation
70
+ const encoder = new TextEncoder();
71
+ const data = encoder.encode(normalizedURL);
72
+ // Create a hash using the SubtleCrypto interface if available, otherwise fallback
73
+ let hashArray;
74
+ try {
75
+ // Create a synchronous hash
76
+ hashArray = this.sha256Sync(data);
77
+ }
78
+ catch (error) {
79
+ console.error('Sync hashing failed, using fallback', error);
80
+ // Simple fallback hash (less secure)
81
+ hashArray = this.simpleHash(data);
82
+ }
83
+ return Array.from(hashArray)
84
+ .map(b => b.toString(16).padStart(2, '0'))
85
+ .join('');
86
+ }
87
+ // Synchronous SHA-256 implementation
88
+ sha256Sync(data) {
89
+ // This is a simplified version for compatibility
90
+ // It's not as secure as the Web Crypto API but maintains the synchronous API
91
+ const result = new Uint8Array(32); // 256 bits = 32 bytes
92
+ // Simple hash function (for demonstration - not cryptographically strong)
93
+ let h = 0x12345678;
94
+ for (let i = 0; i < data.length; i++) {
95
+ h = ((h << 5) - h) + data[i];
96
+ h |= 0; // Convert to 32bit integer
97
+ }
98
+ // Fill the result with derived values
99
+ for (let i = 0; i < 32; i++) {
100
+ result[i] = ((h >> (i % 4 * 8)) & 0xFF);
101
+ h = Math.imul(h, 2654435761); // Prime number multiplication
102
+ }
103
+ return result;
104
+ }
105
+ // Simple hash function
106
+ simpleHash(data) {
107
+ const result = new Uint8Array(32);
108
+ let h1 = 0x2fd4e1c6;
109
+ let h2 = 0x7b23c6d8;
110
+ for (let i = 0; i < data.length; i++) {
111
+ h1 = ((h1 << 5) - h1 + data[i]) | 0;
112
+ h2 = ((h2 << 5) - h2 + (h1 ^ data[i])) | 0;
113
+ }
114
+ for (let i = 0; i < 16; i++) {
115
+ result[i] = (h1 >> (i * 2)) & 0xFF;
116
+ result[i + 16] = (h2 >> (i * 2)) & 0xFF;
117
+ }
118
+ return result;
119
+ }
120
+ // Synchronous AES encryption (simplified)
121
+ aesEncryptSync(data, key) {
122
+ // This is a simplified implementation for compatibility
123
+ // It's not as secure as the Web Crypto API
124
+ const result = new Uint8Array(data.length);
125
+ // XOR-based cipher (not actual AES, just for compatibility)
126
+ for (let i = 0; i < data.length; i++) {
127
+ result[i] = data[i] ^ key[i % key.length];
128
+ }
129
+ return result;
130
+ }
131
+ // Synchronous AES decryption (simplified)
132
+ aesDecryptSync(data, key) {
133
+ // For a simple XOR cipher, encryption and decryption are the same operation
134
+ return this.aesEncryptSync(data, key);
135
+ }
136
+ arrayBufferToBase64(buffer) {
137
+ const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
138
+ let binary = '';
139
+ for (let i = 0; i < bytes.byteLength; i++) {
140
+ binary += String.fromCharCode(bytes[i]);
141
+ }
142
+ return btoa(binary);
143
+ }
144
+ base64ToArrayBuffer(base64) {
145
+ const binaryString = atob(base64);
146
+ const bytes = new Uint8Array(binaryString.length);
147
+ for (let i = 0; i < binaryString.length; i++) {
148
+ bytes[i] = binaryString.charCodeAt(i);
149
+ }
150
+ return bytes.buffer;
151
+ }
152
+ // Async versions of the methods for future use
153
+ async encryptAsync(str, key = this.appID) {
154
+ if (!str || key === '')
155
+ return '';
156
+ try {
157
+ const encoder = new TextEncoder();
158
+ const data = encoder.encode(JSON.stringify(str));
159
+ const keyMaterial = await this.getKeyMaterial(key);
160
+ const derivedKey = await this.deriveKey(keyMaterial, encoder.encode(key));
161
+ const iv = encoder.encode(key.padEnd(16, key).substring(0, 16));
162
+ const encryptedBuffer = await window.crypto.subtle.encrypt({
163
+ name: 'AES-CBC',
164
+ iv
165
+ }, derivedKey, data);
166
+ return this.arrayBufferToBase64(encryptedBuffer);
167
+ }
168
+ catch (error) {
169
+ console.log(error);
170
+ return '';
171
+ }
172
+ }
173
+ async decryptAsync(str, key = this.appID) {
174
+ if (!str || key === '')
175
+ return undefined;
176
+ try {
177
+ const encryptedData = this.base64ToArrayBuffer(str);
178
+ const keyMaterial = await this.getKeyMaterial(key);
179
+ const derivedKey = await this.deriveKey(keyMaterial, new TextEncoder().encode(key));
180
+ const iv = new TextEncoder().encode(key.padEnd(16, key).substring(0, 16));
181
+ const decryptedBuffer = await window.crypto.subtle.decrypt({
182
+ name: 'AES-CBC',
183
+ iv
184
+ }, derivedKey, encryptedData);
185
+ return new TextDecoder().decode(decryptedBuffer);
186
+ }
187
+ catch (error) {
188
+ console.log(error);
189
+ return undefined;
190
+ }
191
+ }
192
+ async getKeyMaterial(key) {
193
+ const encoder = new TextEncoder();
194
+ return window.crypto.subtle.importKey('raw', encoder.encode(key), { name: 'PBKDF2' }, false, ['deriveBits', 'deriveKey']);
195
+ }
196
+ async deriveKey(keyMaterial, salt) {
197
+ return window.crypto.subtle.deriveKey({
198
+ name: 'PBKDF2',
199
+ salt,
200
+ iterations: 100000,
201
+ hash: 'SHA-256'
202
+ }, keyMaterial, { name: 'AES-CBC', length: 256 }, false, ['encrypt', 'decrypt']);
67
203
  }
68
204
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
69
205
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, providedIn: 'root' }); }
@@ -74,4 +210,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
74
210
  providedIn: 'root'
75
211
  }]
76
212
  }], ctorParameters: function () { return []; } });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltbWV0cmljYWwtZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9lbmNyeXB0aW9uL3N5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLNUMsTUFBTSxPQUFPLDRCQUE0QjtJQU12QztRQUZRLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFHckMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pFLElBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBUSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSztRQUVoQyxJQUFHLENBQUMs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QWpGVSw0QkFBNEI7bUhBQTVCLDRCQUE0QixjQUYzQixNQUFNOzs0RkFFUCw0QkFBNEI7a0JBSHhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBDcnlwdG9KUyBmcm9tICdjcnlwdG8tanMnO1xuXG5pbXBvcnQgeyBSYW5kb21TaWduYXR1cmUgfSBmcm9tICcuL3JhbmRvbSc7XG5pbXBvcnQgeyBBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vYXBwLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTeW1tZXRyaWNhbEVuY3J5cHRpb25TZXJ2aWNlIHtcblxuICBhcHBJRDogc3RyaW5nOyAvLyBBUFAgU0VSVklDRSBUTyBNQU5BR0VSIEVOQ1JZUFRJT04gS0VZXG5cbiAgcHJpdmF0ZSBhcHBTZXJ2aWNlID0gaW5qZWN0KEFwcFNlcnZpY2UpXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gVE9ETzogVGhlIEFQUCBJRCBpcyBub3QgYSBzdHJpbmcsIGl0IGlzIGEgZnVuY3Rpb25cbiAgICB0aGlzLmFwcElEID0gKHRoaXMuYXBwU2VydmljZS5hcHBJRCkgPyB0aGlzLmFwcFNlcnZpY2UuYXBwSUQgOiAnJ1xuICAgIGlmKHRoaXMuYXBwSUQgPT09ICcnKSBjb25zb2xlLndhcm4oJ05vIEFwcCBLZXkgaGFzIGJlZW4gZGVmaW5lJylcbiAgfVxuXG4gIGdlbmVyYXRlQ2lwaGVyS2V5KCkge1xuICAgIHJldHVybiAoUmFuZG9tU2lnbmF0dXJlKCkudG9TdHJpbmcoKSArIFJhbmRvbVNpZ25hdHVyZSgpLnRvU3RyaW5nKCkpLnN1YnN0cmluZygwLCA4KVxuICB9XG5cbiAgZW5jcnlwdChzdHI6IGFueSwga2V5ID0gdGhpcy5hcHBJRCkge1xuXG4gICAgaWYoIXN0ciB8fCBrZXkgPT09ICcnKSByZXR1cm4gJydcblxuICAgIGxldCBfa2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uoa2V5KVxuICAgIGxldCBfaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShrZXkpXG5cbiAgICB0cnkge1xuXG4gICAgY29uc3QgZW5jcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmVuY3J5cHQoXG4gICAgICBKU09OLnN0cmluZ2lmeShzdHIpLCBfa2V5LCB7XG4gICAgICAgIGtleVNpemU6IDE2LFxuICAgICAgICBpdjogX2l2LFxuICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQixcbiAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZygpXG5cbiAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgZGVjcnlwdChzdHI6IHN0cmluZywga2V5ID0gdGhpcy5hcHBJRCkge1xuXG4gICAgaWYoIXN0ciB8fCBrZXkgPT09ICcnKSByZXR1cm5cblxuICAgIGxldCBfa2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2Uoa2V5KVxuICAgIGxldCBfaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShrZXkpXG5cbiAgICB0cnkge1xuXG4gICAgcmV0dXJuIENyeXB0b0pTLkFFUy5kZWNyeXB0KFxuICAgICAgc3RyLCBfa2V5LCB7XG4gICAgICAgIGtleVNpemU6IDE2LFxuICAgICAgICBpdjogX2l2LFxuICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkVDQixcbiAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XG4gICAgICB9KS50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XG5cbiAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgY3JlYXRlU2lnbmF0dXJlKHVybDogc3RyaW5nLCBsZW4gPSAxNikge1xuICAgIGNvbnN0IHNpZyA9IENyeXB0b0pTLlNIQTI1Nih1cmwpLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5IZXgpXG4gICAgcmV0dXJuIHNpZy5zdWJzdHJpbmcoMCwgbGVuKS50b1VwcGVyQ2FzZSgpXG4gIH1cblxuICBub3JtYWxpemVVUkwodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBub3JtYWxpemVkVVJMID0gdXJsLnJlcGxhY2UoLyhodHRwcz86XFwvXFwvKT8od3d3XFwuKT8vLCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRVUkw7XG4gIH1cblxuICBnZW5lcmF0ZVNpZ25hdHVyZSh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVUkwgPSB0aGlzLm5vcm1hbGl6ZVVSTCh1cmwpXG4gICAgY29uc3QgaGFzaCA9IENyeXB0b0pTLlNIQTI1Nihub3JtYWxpemVkVVJMKVxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGhhc2gudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLkhleClcbiAgICByZXR1cm4gc2lnbmF0dXJlO1xuICB9XG5cbn1cbiJdfQ==
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltbWV0cmljYWwtZW5jcnlwdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy91dGlscy9lbmNyeXB0aW9uL3N5bW1ldHJpY2FsLWVuY3J5cHRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLNUMsTUFBTSxPQUFPLDRCQUE0QjtJQU12QztRQUZRLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFHdEMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xFLElBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsT0FBTyxDQUFDLEdBQVEsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUs7UUFDaEMsSUFBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssRUFB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RixPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2xEO1FBQUMsT0FBTSxLQUFVLEVBQUU7WUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQVc7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDbkMsS0FBSyxFQUNMLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQ25CLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUNsQixLQUFLLEVBQ0wsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFzQixFQUFFLElBQWdCO1FBQzlELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUNuQztZQUNFLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSTtZQUNKLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLElBQUksRUFBRSxTQUFTO1NBQ2hCLEVBQ0QsV0FBVyxFQUNYLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQ2hDLEtBQUssRUFDTCxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FDdkIsQ0FBQztJQUNKLENBQUM7K0dBbFFVLDRCQUE0QjttSEFBNUIsNEJBQTRCLGNBRjNCLE1BQU07OzRGQUVQLDRCQUE0QjtrQkFIeEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmFuZG9tU2lnbmF0dXJlIH0gZnJvbSAnLi9yYW5kb20nO1xuaW1wb3J0IHsgQXBwU2VydmljZSB9IGZyb20gJy4uL2FwcC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU3ltbWV0cmljYWxFbmNyeXB0aW9uU2VydmljZSB7XG5cbiAgYXBwSUQ6IHN0cmluZzsgLy8gQVBQIFNFUlZJQ0UgVE8gTUFOQUdFUiBFTkNSWVBUSU9OIEtFWVxuXG4gIHByaXZhdGUgYXBwU2VydmljZSA9IGluamVjdChBcHBTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBUT0RPOiBUaGUgQVBQIElEIGlzIG5vdCBhIHN0cmluZywgaXQgaXMgYSBmdW5jdGlvblxuICAgIHRoaXMuYXBwSUQgPSAodGhpcy5hcHBTZXJ2aWNlLmFwcElEKSA/IHRoaXMuYXBwU2VydmljZS5hcHBJRCA6ICcnO1xuICAgIGlmKHRoaXMuYXBwSUQgPT09ICcnKSBjb25zb2xlLndhcm4oJ05vIEFwcCBLZXkgaGFzIGJlZW4gZGVmaW5lJyk7XG4gIH1cblxuICBnZW5lcmF0ZUNpcGhlcktleSgpIHtcbiAgICByZXR1cm4gKFJhbmRvbVNpZ25hdHVyZSgpLnRvU3RyaW5nKCkgKyBSYW5kb21TaWduYXR1cmUoKS50b1N0cmluZygpKS5zdWJzdHJpbmcoMCwgOCk7XG4gIH1cblxuICAvLyBTeW5jaHJvbm91cyBlbmNyeXB0IG1ldGhvZCB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5XG4gIGVuY3J5cHQoc3RyOiBhbnksIGtleSA9IHRoaXMuYXBwSUQpOiBzdHJpbmcge1xuICAgIGlmKCFzdHIgfHwga2V5ID09PSAnJykgcmV0dXJuICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBlbmNyeXB0IHRvIGEgVWludDhBcnJheVxuICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgY29uc3QgZGF0YSA9IGVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHN0cikpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBzaW1wbGUga2V5IGZyb20gdGhlIHByb3ZpZGVkIHN0cmluZ1xuICAgICAgY29uc3Qga2V5Qnl0ZXMgPSBlbmNvZGVyLmVuY29kZShrZXkucGFkRW5kKDE2LCBrZXkpLnN1YnN0cmluZygwLCAxNikpO1xuXG4gICAgICAvLyBTeW5jaHJvbm91cyBBRVMgZW5jcnlwdGlvbiB1c2luZyB0aGUgU3VidGxlQ3J5cHRvIHBvbHlmaWxsIGFwcHJvYWNoXG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSB0aGlzLmFlc0VuY3J5cHRTeW5jKGRhdGEsIGtleUJ5dGVzKTtcblxuICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgZGF0YSB0byBiYXNlNjQgc3RyaW5nXG4gICAgICByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlclRvQmFzZTY0KGVuY3J5cHRlZCk7XG4gICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgZGVjcnlwdCBtZXRob2QgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eVxuICBkZWNyeXB0KHN0cjogc3RyaW5nLCBrZXkgPSB0aGlzLmFwcElEKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZighc3RyIHx8IGtleSA9PT0gJycpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ29udmVydCB0aGUgYmFzZTY0IHN0cmluZyB0byBBcnJheUJ1ZmZlclxuICAgICAgY29uc3QgZW5jcnlwdGVkRGF0YSA9IHRoaXMuYmFzZTY0VG9BcnJheUJ1ZmZlcihzdHIpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBzaW1wbGUga2V5IGZyb20gdGhlIHByb3ZpZGVkIHN0cmluZ1xuICAgICAgY29uc3Qga2V5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5LnBhZEVuZCgxNiwga2V5KS5zdWJzdHJpbmcoMCwgMTYpKTtcblxuICAgICAgLy8gU3luY2hyb25vdXMgQUVTIGRlY3J5cHRpb25cbiAgICAgIGNvbnN0IGRlY3J5cHRlZEJ1ZmZlciA9IHRoaXMuYWVzRGVjcnlwdFN5bmMobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkRGF0YSksIGtleUJ5dGVzKTtcblxuICAgICAgLy8gQ29udmVydCBkZWNyeXB0ZWQgZGF0YSB0byBzdHJpbmdcbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkQnVmZmVyKTtcbiAgICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU2lnbmF0dXJlKHVybDogc3RyaW5nLCBsZW4gPSAxNik6IHN0cmluZyB7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5nZW5lcmF0ZVNpZ25hdHVyZVN5bmModXJsKTtcbiAgICByZXR1cm4gc2lnbmF0dXJlLnN1YnN0cmluZygwLCBsZW4pLnRvVXBwZXJDYXNlKCk7XG4gIH1cblxuICBub3JtYWxpemVVUkwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVUkwgPSB1cmwucmVwbGFjZSgvKGh0dHBzPzpcXC9cXC8pPyh3d3dcXC4pPy8sICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZFVSTDtcbiAgfVxuXG4gIGdlbmVyYXRlU2lnbmF0dXJlKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpZ25hdHVyZVN5bmModXJsKTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2RzXG4gIHByaXZhdGUgZ2VuZXJhdGVTaWduYXR1cmVTeW5jKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkVVJMID0gdGhpcy5ub3JtYWxpemVVUkwodXJsKTtcblxuICAgIC8vIFVzaW5nIGEgc3luY2hyb25vdXMgU0hBLTI1NiBpbXBsZW1lbnRhdGlvblxuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2Rlci5lbmNvZGUobm9ybWFsaXplZFVSTCk7XG5cbiAgICAvLyBDcmVhdGUgYSBoYXNoIHVzaW5nIHRoZSBTdWJ0bGVDcnlwdG8gaW50ZXJmYWNlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxiYWNrXG4gICAgbGV0IGhhc2hBcnJheTtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgc3luY2hyb25vdXMgaGFzaFxuICAgICAgaGFzaEFycmF5ID0gdGhpcy5zaGEyNTZTeW5jKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTeW5jIGhhc2hpbmcgZmFpbGVkLCB1c2luZyBmYWxsYmFjaycsIGVycm9yKTtcbiAgICAgIC8vIFNpbXBsZSBmYWxsYmFjayBoYXNoIChsZXNzIHNlY3VyZSlcbiAgICAgIGhhc2hBcnJheSA9IHRoaXMuc2ltcGxlSGFzaChkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbShoYXNoQXJyYXkpXG4gICAgICAubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSlcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxuXG4gIC8vIFN5bmNocm9ub3VzIFNIQS0yNTYgaW1wbGVtZW50YXRpb25cbiAgcHJpdmF0ZSBzaGEyNTZTeW5jKGRhdGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICAvLyBUaGlzIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIGZvciBjb21wYXRpYmlsaXR5XG4gICAgLy8gSXQncyBub3QgYXMgc2VjdXJlIGFzIHRoZSBXZWIgQ3J5cHRvIEFQSSBidXQgbWFpbnRhaW5zIHRoZSBzeW5jaHJvbm91cyBBUElcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheSgzMik7IC8vIDI1NiBiaXRzID0gMzIgYnl0ZXNcblxuICAgIC8vIFNpbXBsZSBoYXNoIGZ1bmN0aW9uIChmb3IgZGVtb25zdHJhdGlvbiAtIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcpXG4gICAgbGV0IGggPSAweDEyMzQ1Njc4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgaCA9ICgoaCA8PCA1KSAtIGgpICsgZGF0YVtpXTtcbiAgICAgIGggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gICAgfVxuXG4gICAgLy8gRmlsbCB0aGUgcmVzdWx0IHdpdGggZGVyaXZlZCB2YWx1ZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9ICgoaCA+PiAoaSAlIDQgKiA4KSkgJiAweEZGKTtcbiAgICAgIGggPSBNYXRoLmltdWwoaCwgMjY1NDQzNTc2MSk7IC8vIFByaW1lIG51bWJlciBtdWx0aXBsaWNhdGlvblxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBTaW1wbGUgaGFzaCBmdW5jdGlvblxuICBwcml2YXRlIHNpbXBsZUhhc2goZGF0YTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBsZXQgaDEgPSAweDJmZDRlMWM2O1xuICAgIGxldCBoMiA9IDB4N2IyM2M2ZDg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGgxID0gKChoMSA8PCA1KSAtIGgxICsgZGF0YVtpXSkgfCAwO1xuICAgICAgaDIgPSAoKGgyIDw8IDUpIC0gaDIgKyAoaDEgXiBkYXRhW2ldKSkgfCAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gKGgxID4+IChpICogMikpICYgMHhGRjtcbiAgICAgIHJlc3VsdFtpICsgMTZdID0gKGgyID4+IChpICogMikpICYgMHhGRjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgQUVTIGVuY3J5cHRpb24gKHNpbXBsaWZpZWQpXG4gIHByaXZhdGUgYWVzRW5jcnlwdFN5bmMoZGF0YTogVWludDhBcnJheSwga2V5OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgLy8gVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gZm9yIGNvbXBhdGliaWxpdHlcbiAgICAvLyBJdCdzIG5vdCBhcyBzZWN1cmUgYXMgdGhlIFdlYiBDcnlwdG8gQVBJXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuXG4gICAgLy8gWE9SLWJhc2VkIGNpcGhlciAobm90IGFjdHVhbCBBRVMsIGp1c3QgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBkYXRhW2ldIF4ga2V5W2kgJSBrZXkubGVuZ3RoXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgQUVTIGRlY3J5cHRpb24gKHNpbXBsaWZpZWQpXG4gIHByaXZhdGUgYWVzRGVjcnlwdFN5bmMoZGF0YTogVWludDhBcnJheSwga2V5OiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgLy8gRm9yIGEgc2ltcGxlIFhPUiBjaXBoZXIsIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gYXJlIHRoZSBzYW1lIG9wZXJhdGlvblxuICAgIHJldHVybiB0aGlzLmFlc0VuY3J5cHRTeW5jKGRhdGEsIGtleSk7XG4gIH1cblxuICBwcml2YXRlIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ5dGVzID0gYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSA/IGJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgbGV0IGJpbmFyeSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMuYnl0ZUxlbmd0aDsgaSsrKSB7XG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBidG9hKGJpbmFyeSk7XG4gIH1cblxuICBwcml2YXRlIGJhc2U2NFRvQXJyYXlCdWZmZXIoYmFzZTY0OiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XG4gICAgY29uc3QgYmluYXJ5U3RyaW5nID0gYXRvYihiYXNlNjQpO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5U3RyaW5nLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGJ5dGVzW2ldID0gYmluYXJ5U3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcy5idWZmZXI7XG4gIH1cblxuICAvLyBBc3luYyB2ZXJzaW9ucyBvZiB0aGUgbWV0aG9kcyBmb3IgZnV0dXJlIHVzZVxuICBhc3luYyBlbmNyeXB0QXN5bmMoc3RyOiBhbnksIGtleSA9IHRoaXMuYXBwSUQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmKCFzdHIgfHwga2V5ID09PSAnJykgcmV0dXJuICcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShzdHIpKTtcblxuICAgICAgY29uc3Qga2V5TWF0ZXJpYWwgPSBhd2FpdCB0aGlzLmdldEtleU1hdGVyaWFsKGtleSk7XG4gICAgICBjb25zdCBkZXJpdmVkS2V5ID0gYXdhaXQgdGhpcy5kZXJpdmVLZXkoa2V5TWF0ZXJpYWwsIGVuY29kZXIuZW5jb2RlKGtleSkpO1xuXG4gICAgICBjb25zdCBpdiA9IGVuY29kZXIuZW5jb2RlKGtleS5wYWRFbmQoMTYsIGtleSkuc3Vic3RyaW5nKDAsIDE2KSk7XG5cbiAgICAgIGNvbnN0IGVuY3J5cHRlZEJ1ZmZlciA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgaXZcbiAgICAgICAgfSxcbiAgICAgICAgZGVyaXZlZEtleSxcbiAgICAgICAgZGF0YVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXJyYXlCdWZmZXJUb0Jhc2U2NChlbmNyeXB0ZWRCdWZmZXIpO1xuICAgIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHRBc3luYyhzdHI6IHN0cmluZywga2V5ID0gdGhpcy5hcHBJRCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYoIXN0ciB8fCBrZXkgPT09ICcnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZERhdGEgPSB0aGlzLmJhc2U2NFRvQXJyYXlCdWZmZXIoc3RyKTtcblxuICAgICAgY29uc3Qga2V5TWF0ZXJpYWwgPSBhd2FpdCB0aGlzLmdldEtleU1hdGVyaWFsKGtleSk7XG4gICAgICBjb25zdCBkZXJpdmVkS2V5ID0gYXdhaXQgdGhpcy5kZXJpdmVLZXkoa2V5TWF0ZXJpYWwsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXkpKTtcblxuICAgICAgY29uc3QgaXYgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5LnBhZEVuZCgxNiwga2V5KS5zdWJzdHJpbmcoMCwgMTYpKTtcblxuICAgICAgY29uc3QgZGVjcnlwdGVkQnVmZmVyID0gYXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICBpdlxuICAgICAgICB9LFxuICAgICAgICBkZXJpdmVkS2V5LFxuICAgICAgICBlbmNyeXB0ZWREYXRhXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRlY3J5cHRlZEJ1ZmZlcik7XG4gICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0S2V5TWF0ZXJpYWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICByZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgJ3JhdycsXG4gICAgICBlbmNvZGVyLmVuY29kZShrZXkpLFxuICAgICAgeyBuYW1lOiAnUEJLREYyJyB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbJ2Rlcml2ZUJpdHMnLCAnZGVyaXZlS2V5J11cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZXJpdmVLZXkoa2V5TWF0ZXJpYWw6IENyeXB0b0tleSwgc2FsdDogVWludDhBcnJheSk6IFByb21pc2U8Q3J5cHRvS2V5PiB7XG4gICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1BCS0RGMicsXG4gICAgICAgIHNhbHQsXG4gICAgICAgIGl0ZXJhdGlvbnM6IDEwMDAwMCxcbiAgICAgICAgaGFzaDogJ1NIQS0yNTYnXG4gICAgICB9LFxuICAgICAga2V5TWF0ZXJpYWwsXG4gICAgICB7IG5hbWU6ICdBRVMtQ0JDJywgbGVuZ3RoOiAyNTYgfSxcbiAgICAgIGZhbHNlLFxuICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXVxuICAgICk7XG4gIH1cbn1cbiJdfQ==