@bitgo-beta/sdk-coin-iota 1.0.1-beta.324 → 1.0.1-beta.326

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 (42) hide show
  1. package/dist/src/iota.d.ts +123 -27
  2. package/dist/src/iota.d.ts.map +1 -1
  3. package/dist/src/iota.js +217 -103
  4. package/dist/src/lib/constants.d.ts +50 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +68 -4
  7. package/dist/src/lib/iface.d.ts +141 -1
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +1 -1
  10. package/dist/src/lib/keyPair.d.ts +100 -6
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +103 -10
  13. package/dist/src/lib/transaction.d.ts +117 -14
  14. package/dist/src/lib/transaction.d.ts.map +1 -1
  15. package/dist/src/lib/transaction.js +190 -67
  16. package/dist/src/lib/transactionBuilder.d.ts +73 -34
  17. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  18. package/dist/src/lib/transactionBuilder.js +90 -45
  19. package/dist/src/lib/transactionBuilderFactory.d.ts +89 -6
  20. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  21. package/dist/src/lib/transactionBuilderFactory.js +103 -16
  22. package/dist/src/lib/transferBuilder.d.ts +43 -0
  23. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/transferBuilder.js +50 -5
  25. package/dist/src/lib/transferTransaction.d.ts +93 -2
  26. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  27. package/dist/src/lib/transferTransaction.js +180 -51
  28. package/dist/src/lib/utils.d.ts +107 -8
  29. package/dist/src/lib/utils.d.ts.map +1 -1
  30. package/dist/src/lib/utils.js +134 -23
  31. package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
  32. package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
  33. package/dist/test/unit/helpers/testHelpers.js +176 -0
  34. package/dist/test/unit/iota.js +47 -152
  35. package/dist/test/unit/keyPair.js +34 -61
  36. package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
  37. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -108
  38. package/dist/test/unit/transactionBuilder/transferBuilder.js +296 -762
  39. package/dist/test/unit/transferTransaction.js +106 -353
  40. package/dist/test/unit/utils.js +171 -197
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +7 -7
@@ -39,240 +39,214 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const testData = __importStar(require("../resources/iota"));
40
40
  const should_1 = __importDefault(require("should"));
41
41
  const utils_1 = __importDefault(require("../../src/lib/utils"));
42
- const src_1 = require("../../src");
43
- const statics_1 = require("@bitgo-beta/statics");
42
+ const testHelpers_1 = require("./helpers/testHelpers");
44
43
  describe('Iota util library', function () {
45
- describe('isValidAddress', function () {
46
- it('should succeed to validate addresses', function () {
47
- for (const address of testData.addresses.validAddresses) {
48
- should_1.default.equal(utils_1.default.isValidAddress(address), true);
49
- }
50
- });
51
- it('should fail to validate invalid addresses', function () {
52
- for (const address of testData.addresses.invalidAddresses) {
53
- should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(address));
54
- should_1.default.equal(utils_1.default.isValidAddress(address), false);
55
- }
56
- // @ts-expect-error Testing for missing param, should not throw an error
57
- should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(undefined));
58
- // @ts-expect-error Testing for missing param, should return false
59
- should_1.default.equal(utils_1.default.isValidAddress(undefined), false);
60
- });
61
- it('should validate addresses with correct length', function () {
62
- // IOTA addresses are 64 characters hex with 0x prefix
63
- const validAddress = '0x' + 'a'.repeat(64);
64
- should_1.default.equal(utils_1.default.isValidAddress(validAddress), true);
65
- });
66
- it('should reject addresses with incorrect length', function () {
67
- const shortAddress = '0x' + 'a'.repeat(32);
68
- const longAddress = '0x' + 'a'.repeat(128);
69
- should_1.default.equal(utils_1.default.isValidAddress(shortAddress), false);
70
- should_1.default.equal(utils_1.default.isValidAddress(longAddress), false);
71
- });
72
- it('should reject addresses without 0x prefix', function () {
73
- const addressWithoutPrefix = 'a'.repeat(64);
74
- should_1.default.equal(utils_1.default.isValidAddress(addressWithoutPrefix), false);
75
- });
76
- it('should reject addresses with non-hex characters', function () {
77
- const invalidHex = '0x' + 'g'.repeat(64);
78
- should_1.default.equal(utils_1.default.isValidAddress(invalidHex), false);
44
+ describe('Address Validation', function () {
45
+ it('should validate all correct addresses', function () {
46
+ testData.addresses.validAddresses.forEach((address) => {
47
+ utils_1.default.isValidAddress(address).should.be.true();
48
+ });
49
+ });
50
+ it('should reject all invalid addresses', function () {
51
+ testData.addresses.invalidAddresses.forEach((address) => {
52
+ utils_1.default.isValidAddress(address).should.be.false();
53
+ });
54
+ });
55
+ const addressTestCases = [
56
+ { address: '0x' + 'a'.repeat(64), valid: true, description: 'correct length (64 hex chars)' },
57
+ { address: '0x' + 'a'.repeat(32), valid: false, description: 'too short' },
58
+ { address: '0x' + 'a'.repeat(128), valid: false, description: 'too long' },
59
+ { address: 'a'.repeat(64), valid: false, description: 'missing 0x prefix' },
60
+ { address: '0x' + 'g'.repeat(64), valid: false, description: 'non-hex characters' },
61
+ { address: undefined, valid: false, description: 'undefined' },
62
+ ];
63
+ addressTestCases.forEach(({ address, valid, description }) => {
64
+ it(`should ${valid ? 'accept' : 'reject'} address with ${description}`, function () {
65
+ // @ts-expect-error Testing for undefined
66
+ utils_1.default.isValidAddress(address).should.equal(valid);
67
+ });
79
68
  });
80
69
  });
81
- describe('isValidPublicKey', function () {
82
- it('should validate correct public keys', function () {
83
- // without 0x prefix (64 hex chars)
84
- should_1.default.equal(true, utils_1.default.isValidPublicKey('b2051899478edeb36a79d1d16dfec56dc3a6ebd29fbbbb4a4ef2dfaf46043355'));
85
- should_1.default.equal(true, utils_1.default.isValidPublicKey(testData.sender.publicKey));
86
- });
87
- it('should reject public keys with 0x prefix', function () {
88
- should_1.default.equal(false, utils_1.default.isValidPublicKey('0x413f7fa8beb54459e1e9ede3af3b12e5a4a3550390bb616da30dd72017701263'));
89
- });
90
- it('should reject invalid public keys', function () {
91
- should_1.default.equal(false, utils_1.default.isValidPublicKey('invalid'));
92
- should_1.default.equal(false, utils_1.default.isValidPublicKey(''));
93
- should_1.default.equal(false, utils_1.default.isValidPublicKey('123'));
94
- });
95
- it('should reject public keys with incorrect length', function () {
96
- should_1.default.equal(false, utils_1.default.isValidPublicKey('a'.repeat(32))); // Too short
97
- should_1.default.equal(false, utils_1.default.isValidPublicKey('a'.repeat(128))); // Too long
70
+ describe('Public Key Validation', function () {
71
+ const validPublicKeys = [
72
+ 'b2051899478edeb36a79d1d16dfec56dc3a6ebd29fbbbb4a4ef2dfaf46043355',
73
+ testData.sender.publicKey,
74
+ ];
75
+ it('should validate all correct public keys', function () {
76
+ validPublicKeys.forEach((key) => {
77
+ utils_1.default.isValidPublicKey(key).should.be.true();
78
+ });
79
+ });
80
+ const invalidPublicKeyTestCases = [
81
+ { key: '0x413f7fa8beb54459e1e9ede3af3b12e5a4a3550390bb616da30dd72017701263', description: 'with 0x prefix' },
82
+ { key: 'invalid', description: 'invalid format' },
83
+ { key: '', description: 'empty string' },
84
+ { key: '123', description: 'too short' },
85
+ { key: 'a'.repeat(32), description: 'incorrect length (too short)' },
86
+ { key: 'a'.repeat(128), description: 'incorrect length (too long)' },
87
+ ];
88
+ invalidPublicKeyTestCases.forEach(({ key, description }) => {
89
+ it(`should reject public key ${description}`, function () {
90
+ utils_1.default.isValidPublicKey(key).should.be.false();
91
+ });
98
92
  });
99
93
  });
100
- describe('isValidPrivateKey', function () {
101
- it('should validate ed25519 secret keys', function () {
102
- // Ed25519 secret keys (as used by tweetnacl) are 64 bytes (128 hex chars)
103
- // This includes the 32-byte seed + 32-byte public key
94
+ describe('Private Key Validation', function () {
95
+ it('should validate ed25519 secret keys with correct length', function () {
96
+ // Ed25519 secret keys are 128 hex chars (64 bytes: 32-byte seed + 32-byte public key)
104
97
  const validSecretKey = '0'.repeat(128);
105
- should_1.default.equal(utils_1.default.isValidPrivateKey(validSecretKey), true);
106
- });
107
- it('should reject invalid private keys', function () {
108
- should_1.default.equal(utils_1.default.isValidPrivateKey('invalid'), false);
109
- should_1.default.equal(utils_1.default.isValidPrivateKey(''), false);
110
- should_1.default.equal(utils_1.default.isValidPrivateKey('123'), false);
111
- });
112
- it('should reject private keys with wrong length', function () {
113
- should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(32)), false); // Too short (16 bytes)
114
- should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(64)), false); // Seed length, not full secret key (32 bytes)
115
- should_1.default.equal(utils_1.default.isValidPrivateKey('a'.repeat(256)), false); // Too long (128 bytes)
116
- });
117
- });
118
- describe('isValidTransactionId', function () {
119
- it('should validate correct transaction IDs', function () {
120
- should_1.default.equal(true, utils_1.default.isValidTransactionId('BftEk3BeKUWTj9uzVGntd4Ka16QZG8hUnr6KsAb7q7bt'));
121
- });
122
- it('should reject invalid transaction IDs', function () {
123
- should_1.default.equal(false, utils_1.default.isValidTransactionId('0xff86b121181a43d03df52e8930785af3dda944ec87654cdba3a378ff518cd75b'));
124
- should_1.default.equal(false, utils_1.default.isValidTransactionId('BftEk3BeKUWTj9uzVGntd4Ka16QZG8hUnr6KsAb7q7b53t')); // Wrong length
125
- });
126
- it('should reject hex strings', function () {
127
- should_1.default.equal(false, utils_1.default.isValidTransactionId('0xabcdef123456'));
128
- });
129
- it('should reject empty strings', function () {
130
- should_1.default.equal(false, utils_1.default.isValidTransactionId(''));
98
+ utils_1.default.isValidPrivateKey(validSecretKey).should.be.true();
99
+ });
100
+ const invalidPrivateKeyTestCases = [
101
+ { key: 'invalid', description: 'invalid format' },
102
+ { key: '', description: 'empty string' },
103
+ { key: '123', description: 'too short' },
104
+ { key: 'a'.repeat(32), description: '16 bytes (too short)' },
105
+ { key: 'a'.repeat(64), description: '32 bytes (seed only, not full secret)' },
106
+ { key: 'a'.repeat(256), description: '128 bytes (too long)' },
107
+ ];
108
+ invalidPrivateKeyTestCases.forEach(({ key, description }) => {
109
+ it(`should reject private key: ${description}`, function () {
110
+ utils_1.default.isValidPrivateKey(key).should.be.false();
111
+ });
131
112
  });
132
113
  });
133
- describe('isValidBlockId', function () {
134
- it('should validate correct block IDs', function () {
135
- should_1.default.equal(true, utils_1.default.isValidBlockId('GZXZvvLS3ZnuE4E9CxQJJ2ij5xeNsvUXdAKVrPCQKrPz'));
136
- });
137
- it('should reject invalid block IDs', function () {
138
- should_1.default.equal(false, utils_1.default.isValidBlockId('0x9ac6a0c313c4a0563a169dad29f1d018647683be54a314ed229a2693293dfc98'));
139
- should_1.default.equal(false, utils_1.default.isValidBlockId('GZXZvvLS3ZnuE4E9CxQJJ2ij5xeNsvUXdAK56VrPCQKrPz')); // Wrong length
140
- });
141
- it('should reject hex strings', function () {
142
- should_1.default.equal(false, utils_1.default.isValidBlockId('0xabcdef'));
143
- });
144
- it('should reject empty strings', function () {
145
- should_1.default.equal(false, utils_1.default.isValidBlockId(''));
114
+ describe('Transaction and Block ID Validation', function () {
115
+ it('should validate correct transaction ID (base58)', function () {
116
+ utils_1.default.isValidTransactionId('BftEk3BeKUWTj9uzVGntd4Ka16QZG8hUnr6KsAb7q7bt').should.be.true();
117
+ });
118
+ it('should validate correct block ID (base58)', function () {
119
+ utils_1.default.isValidBlockId('GZXZvvLS3ZnuE4E9CxQJJ2ij5xeNsvUXdAKVrPCQKrPz').should.be.true();
120
+ });
121
+ const invalidIdTestCases = [
122
+ {
123
+ validator: 'isValidTransactionId',
124
+ cases: [
125
+ { id: '0xff86b121181a43d03df52e8930785af3dda944ec87654cdba3a378ff518cd75b', description: 'hex format' },
126
+ { id: 'BftEk3BeKUWTj9uzVGntd4Ka16QZG8hUnr6KsAb7q7b53t', description: 'wrong length' },
127
+ { id: '0xabcdef123456', description: 'hex with prefix' },
128
+ { id: '', description: 'empty string' },
129
+ ],
130
+ },
131
+ {
132
+ validator: 'isValidBlockId',
133
+ cases: [
134
+ { id: '0x9ac6a0c313c4a0563a169dad29f1d018647683be54a314ed229a2693293dfc98', description: 'hex format' },
135
+ { id: 'GZXZvvLS3ZnuE4E9CxQJJ2ij5xeNsvUXdAK56VrPCQKrPz', description: 'wrong length' },
136
+ { id: '0xabcdef', description: 'hex with prefix' },
137
+ { id: '', description: 'empty string' },
138
+ ],
139
+ },
140
+ ];
141
+ invalidIdTestCases.forEach(({ validator, cases }) => {
142
+ cases.forEach(({ id, description }) => {
143
+ it(`${validator} should reject ${description}`, function () {
144
+ utils_1.default[validator](id).should.be.false();
145
+ });
146
+ });
146
147
  });
147
148
  });
148
- describe('isValidSignature', function () {
149
- it('should validate correct signatures', function () {
150
- should_1.default.equal(true, utils_1.default.isValidSignature('iXrcUjgQgpYUsa7O90KZicdTmIdJSjB99+tJW6l6wPCqI/lUTou6sQ2sLoZgC0n4qQKX+vFDz+lBIXl7J/ZgCg=='));
151
- });
152
- it('should reject invalid signatures', function () {
153
- should_1.default.equal(false, utils_1.default.isValidSignature('0x9ac6a0c313c4a0563a169dad29f1d018647683be54a314ed229a2693293dfc98'));
154
- should_1.default.equal(false, utils_1.default.isValidSignature('goppBTDgLuBbcU5tP90n3igvZGHmcE23HCoxLfdJwOCcbyztVh9r0TPacJRXmjZ6'));
155
- });
156
- it('should reject signatures with incorrect length', function () {
157
- should_1.default.equal(false, utils_1.default.isValidSignature('dG9vU2hvcnQ=')); // Too short base64
158
- });
159
- it('should reject non-base64 strings', function () {
160
- should_1.default.equal(false, utils_1.default.isValidSignature('not a base64 string!!!'));
161
- should_1.default.equal(false, utils_1.default.isValidSignature(''));
149
+ describe('Signature Validation', function () {
150
+ it('should validate correct base64-encoded 64-byte signature', function () {
151
+ const validSignature = 'iXrcUjgQgpYUsa7O90KZicdTmIdJSjB99+tJW6l6wPCqI/lUTou6sQ2sLoZgC0n4qQKX+vFDz+lBIXl7J/ZgCg==';
152
+ utils_1.default.isValidSignature(validSignature).should.be.true();
153
+ });
154
+ const invalidSignatureTestCases = [
155
+ { sig: '0x9ac6a0c313c4a0563a169dad29f1d018647683be54a314ed229a2693293dfc98', description: 'hex format' },
156
+ { sig: 'goppBTDgLuBbcU5tP90n3igvZGHmcE23HCoxLfdJwOCcbyztVh9r0TPacJRXmjZ6', description: 'wrong format' },
157
+ { sig: 'dG9vU2hvcnQ=', description: 'too short (base64)' },
158
+ { sig: 'not a base64 string!!!', description: 'invalid base64' },
159
+ { sig: '', description: 'empty string' },
160
+ ];
161
+ invalidSignatureTestCases.forEach(({ sig, description }) => {
162
+ it(`should reject ${description}`, function () {
163
+ utils_1.default.isValidSignature(sig).should.be.false();
164
+ });
162
165
  });
163
166
  });
164
- describe('isValidHex', function () {
165
- it('should validate correct hex strings', function () {
166
- should_1.default.equal(true, utils_1.default.isValidHex('0xabcdef', 6));
167
- should_1.default.equal(true, utils_1.default.isValidHex('0x123456', 6));
168
- should_1.default.equal(true, utils_1.default.isValidHex('0XABCDEF', 6));
169
- });
170
- it('should reject hex strings with incorrect length', function () {
171
- should_1.default.equal(false, utils_1.default.isValidHex('0xabcd', 6));
172
- should_1.default.equal(false, utils_1.default.isValidHex('0xabcdefgh', 6));
173
- });
174
- it('should reject hex strings without prefix', function () {
175
- should_1.default.equal(false, utils_1.default.isValidHex('abcdef', 6));
176
- });
177
- it('should reject hex strings with non-hex characters', function () {
178
- should_1.default.equal(false, utils_1.default.isValidHex('0xghijkl', 6));
179
- should_1.default.equal(false, utils_1.default.isValidHex('0xabcdeg', 6));
180
- });
181
- it('should handle uppercase and lowercase', function () {
182
- should_1.default.equal(true, utils_1.default.isValidHex('0xABCDEF', 6));
183
- should_1.default.equal(true, utils_1.default.isValidHex('0xabcdef', 6));
184
- should_1.default.equal(true, utils_1.default.isValidHex('0xAbCdEf', 6));
167
+ describe('Hex String Validation', function () {
168
+ const hexTestCases = [
169
+ { hex: '0xabcdef', length: 6, valid: true, description: 'lowercase' },
170
+ { hex: '0x123456', length: 6, valid: true, description: 'numbers' },
171
+ { hex: '0XABCDEF', length: 6, valid: true, description: 'uppercase prefix' },
172
+ { hex: '0xABCDEF', length: 6, valid: true, description: 'uppercase' },
173
+ { hex: '0xAbCdEf', length: 6, valid: true, description: 'mixed case' },
174
+ { hex: '0xabcd', length: 6, valid: false, description: 'too short' },
175
+ { hex: '0xabcdefgh', length: 6, valid: false, description: 'too long' },
176
+ { hex: 'abcdef', length: 6, valid: false, description: 'no prefix' },
177
+ { hex: '0xghijkl', length: 6, valid: false, description: 'non-hex chars' },
178
+ { hex: '0xabcdeg', length: 6, valid: false, description: 'invalid char at end' },
179
+ ];
180
+ hexTestCases.forEach(({ hex, length, valid, description }) => {
181
+ it(`should ${valid ? 'accept' : 'reject'} ${description}`, function () {
182
+ utils_1.default.isValidHex(hex, length).should.equal(valid);
183
+ });
185
184
  });
186
185
  });
187
- describe('getAddressFromPublicKey', function () {
186
+ describe('Address Derivation from Public Key', function () {
188
187
  it('should generate valid address from public key', function () {
189
188
  const address = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
190
189
  should_1.default.exist(address);
191
- should_1.default.equal(utils_1.default.isValidAddress(address), true);
190
+ utils_1.default.isValidAddress(address).should.be.true();
192
191
  });
193
- it('should generate consistent addresses', function () {
192
+ it('should generate consistent addresses from same key', function () {
194
193
  const address1 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
195
194
  const address2 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
196
- should_1.default.equal(address1, address2);
195
+ address1.should.equal(address2);
197
196
  });
198
197
  it('should generate different addresses for different keys', function () {
199
198
  const address1 = utils_1.default.getAddressFromPublicKey(testData.sender.publicKey);
200
199
  const address2 = utils_1.default.getAddressFromPublicKey(testData.gasSponsor.publicKey);
201
- should_1.default.notEqual(address1, address2);
200
+ address1.should.not.equal(address2);
202
201
  });
203
202
  });
204
- describe('getBase64String', function () {
205
- it('should convert Uint8Array to base64', function () {
206
- const uint8Array = new Uint8Array([72, 101, 108, 108, 111]); // "Hello"
207
- const result = utils_1.default.getBase64String(uint8Array);
208
- should_1.default.exist(result);
209
- should_1.default.equal(typeof result, 'string');
210
- should_1.default.equal(result.length > 0, true);
211
- });
212
- it('should convert hex string to base64', function () {
213
- const hexString = '48656c6c6f'; // "Hello" in hex
214
- const result = utils_1.default.getBase64String(hexString);
215
- should_1.default.exist(result);
216
- should_1.default.equal(typeof result, 'string');
217
- should_1.default.equal(result.length > 0, true);
218
- });
219
- it('should handle empty Uint8Array', function () {
220
- const emptyArray = new Uint8Array([]);
221
- const result = utils_1.default.getBase64String(emptyArray);
222
- should_1.default.exist(result);
223
- should_1.default.equal(typeof result, 'string');
224
- });
225
- it('should handle Buffer conversion to base64', function () {
226
- const buffer = Buffer.from('Hello World');
227
- const uint8Array = new Uint8Array(buffer);
228
- const result = utils_1.default.getBase64String(uint8Array);
229
- should_1.default.exist(result);
230
- should_1.default.equal(typeof result, 'string');
231
- should_1.default.equal(result.length > 0, true);
232
- });
233
- it('should consistently convert same input to same output', function () {
203
+ describe('Base64 String Conversion', function () {
204
+ const conversionTestCases = [
205
+ { input: new Uint8Array([72, 101, 108, 108, 111]), description: 'Uint8Array ("Hello")' },
206
+ { input: '48656c6c6f', description: 'hex string ("Hello")' },
207
+ { input: new Uint8Array([]), description: 'empty Uint8Array' },
208
+ { input: new Uint8Array(Buffer.from('Hello World')), description: 'Buffer as Uint8Array' },
209
+ ];
210
+ conversionTestCases.forEach(({ input, description }) => {
211
+ it(`should convert ${description} to base64`, function () {
212
+ const result = utils_1.default.getBase64String(input);
213
+ should_1.default.exist(result);
214
+ should_1.default.equal(typeof result, 'string');
215
+ });
216
+ });
217
+ it('should produce consistent output for same input', function () {
234
218
  const uint8Array = new Uint8Array([1, 2, 3, 4, 5]);
235
219
  const result1 = utils_1.default.getBase64String(uint8Array);
236
220
  const result2 = utils_1.default.getBase64String(new Uint8Array([1, 2, 3, 4, 5]));
237
- should_1.default.equal(result1, result2);
221
+ result1.should.equal(result2);
238
222
  });
239
223
  });
240
- describe('isValidRawTransaction', function () {
241
- it('should validate proper raw transactions', async function () {
242
- const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
243
- const txBuilder = factory.getTransferBuilder();
244
- txBuilder.sender(testData.sender.address);
245
- txBuilder.recipients(testData.recipients);
246
- txBuilder.paymentObjects(testData.paymentObjects);
247
- txBuilder.gasData(testData.gasData);
224
+ describe('Raw Transaction Validation', function () {
225
+ it('should validate properly built transaction (base64)', async function () {
226
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
248
227
  const tx = await txBuilder.build();
249
228
  const rawTx = await tx.toBroadcastFormat();
250
- should_1.default.equal(utils_1.default.isValidRawTransaction(rawTx), true);
229
+ utils_1.default.isValidRawTransaction(rawTx).should.be.true();
251
230
  });
252
- it('should validate raw transactions as Uint8Array', async function () {
253
- const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tiota'));
254
- const txBuilder = factory.getTransferBuilder();
255
- txBuilder.sender(testData.sender.address);
256
- txBuilder.recipients(testData.recipients);
257
- txBuilder.paymentObjects(testData.paymentObjects);
258
- txBuilder.gasData(testData.gasData);
231
+ it('should validate transaction as Uint8Array', async function () {
232
+ const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
259
233
  const tx = await txBuilder.build();
260
234
  const rawTx = await tx.toBroadcastFormat();
261
235
  const rawTxBytes = Buffer.from(rawTx, 'base64');
262
- should_1.default.equal(utils_1.default.isValidRawTransaction(rawTxBytes), true);
263
- });
264
- it('should reject invalid raw transactions', function () {
265
- should_1.default.equal(utils_1.default.isValidRawTransaction('invalidRawTx'), false);
266
- should_1.default.equal(utils_1.default.isValidRawTransaction(''), false);
267
- should_1.default.equal(utils_1.default.isValidRawTransaction('0x123456'), false);
268
- });
269
- it('should reject invalid base64 strings', function () {
270
- should_1.default.equal(utils_1.default.isValidRawTransaction('not-base64!!!'), false);
271
- });
272
- it('should reject malformed transaction data', function () {
273
- const malformedBase64 = Buffer.from('malformed data').toString('base64');
274
- should_1.default.equal(utils_1.default.isValidRawTransaction(malformedBase64), false);
236
+ utils_1.default.isValidRawTransaction(rawTxBytes).should.be.true();
237
+ });
238
+ const invalidRawTxTestCases = [
239
+ { tx: 'invalidRawTx', description: 'invalid string' },
240
+ { tx: '', description: 'empty string' },
241
+ { tx: '0x123456', description: 'hex format' },
242
+ { tx: 'not-base64!!!', description: 'invalid base64' },
243
+ { tx: Buffer.from('malformed data').toString('base64'), description: 'malformed data' },
244
+ ];
245
+ invalidRawTxTestCases.forEach(({ tx, description }) => {
246
+ it(`should reject ${description}`, function () {
247
+ utils_1.default.isValidRawTransaction(tx).should.be.false();
248
+ });
275
249
  });
276
250
  });
277
251
  });
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0REFBOEM7QUFDOUMsb0RBQTRCO0FBQzVCLGdFQUF3QztBQUN4QyxtQ0FBc0Q7QUFDdEQsaURBQTRDO0FBRTVDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDekQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQ0Qsd0VBQXdFO1lBQ3hFLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMzRCxrRUFBa0U7WUFDbEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxL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LGVBQUssQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbURBQW1ELEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNsQyxFQUFFLENBQUMsK0NBQStDLEVBQUU7WUFDbEQsTUFBTSxPQUFPLEdBQUcsZUFBSyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekUsZ0JB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SyxDQUFDLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtZQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL2lvdGEnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuXG5kZXNjcmliZSgnSW90YSB1dGlsIGxpYnJhcnknLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdpc1ZhbGlkQWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmFsaWRhdGUgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZhbGlkYXRlIGludmFsaWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHRlc3REYXRhLmFkZHJlc3Nlcy5pbnZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpO1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgbWlzc2luZyBwYXJhbSwgc2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvclxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5pc1ZhbGlkQWRkcmVzcyh1bmRlZmluZWQpKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgbWlzc2luZyBwYXJhbSwgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgYWRkcmVzc2VzIHdpdGggY29ycmVjdCBsZW5ndGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJT1RBIGFkZHJlc3NlcyBhcmUgNjQgY2hhcmFjdGVycyBoZXggd2l0aCAweCBwcmVmaXhcbiAgICAgIGNvbnN0IHZhbGlkQWRkcmVzcyA9ICcweCcgKyAnYScucmVwZWF0KDY0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyh2YWxpZEFkZHJlc3MpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3NlcyB3aXRoIGluY29ycmVjdCBsZW5ndGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaG9ydEFkZHJlc3MgPSAnMHgnICsgJ2EnLnJlcGVhdCgzMik7XG4gICAgICBjb25zdCBsb25nQWRkcmVzcyA9ICcweCcgKyAnYScucmVwZWF0KDEyOCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3Moc2hvcnRBZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGxvbmdBZGRyZXNzKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYWRkcmVzc2VzIHdpdGhvdXQgMHggcHJlZml4JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzc1dpdGhvdXRQcmVmaXggPSAnYScucmVwZWF0KDY0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzV2l0aG91dFByZWZpeCksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFkZHJlc3NlcyB3aXRoIG5vbi1oZXggY2hhcmFjdGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRIZXggPSAnMHgnICsgJ2cnLnJlcGVhdCg2NCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoaW52YWxpZEhleCksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRQdWJsaWNLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IHB1YmxpYyBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gd2l0aG91dCAweCBwcmVmaXggKDY0IGhleCBjaGFycylcbiAgICAgIHNob3VsZC5lcXVhbCh0cnVlLCB1dGlscy5pc1ZhbGlkUHVibGljS2V5KCdiMjA1MTg5OTQ3OGVkZWIzNmE3OWQxZDE2ZGZlYzU2ZGMzYTZlYmQyOWZiYmJiNGE0ZWYyZGZhZjQ2MDQzMzU1JykpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHVibGljIGtleXMgd2l0aCAweCBwcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJzB4NDEzZjdmYThiZWI1NDQ1OWUxZTllZGUzYWYzYjEyZTVhNGEzNTUwMzkwYmI2MTZkYTMwZGQ3MjAxNzcwMTI2MycpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgcHVibGljIGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJ2ludmFsaWQnKSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJycpKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSgnMTIzJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHVibGljIGtleXMgd2l0aCBpbmNvcnJlY3QgbGVuZ3RoJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkUHVibGljS2V5KCdhJy5yZXBlYXQoMzIpKSk7IC8vIFRvbyBzaG9ydFxuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkUHVibGljS2V5KCdhJy5yZXBlYXQoMTI4KSkpOyAvLyBUb28gbG9uZ1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZFByaXZhdGVLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBlZDI1NTE5IHNlY3JldCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRWQyNTUxOSBzZWNyZXQga2V5cyAoYXMgdXNlZCBieSB0d2VldG5hY2wpIGFyZSA2NCBieXRlcyAoMTI4IGhleCBjaGFycylcbiAgICAgIC8vIFRoaXMgaW5jbHVkZXMgdGhlIDMyLWJ5dGUgc2VlZCArIDMyLWJ5dGUgcHVibGljIGtleVxuICAgICAgY29uc3QgdmFsaWRTZWNyZXRLZXkgPSAnMCcucmVwZWF0KDEyOCk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFByaXZhdGVLZXkodmFsaWRTZWNyZXRLZXkpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGludmFsaWQgcHJpdmF0ZSBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KCdpbnZhbGlkJyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSgnJyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSgnMTIzJyksIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHByaXZhdGUga2V5cyB3aXRoIHdyb25nIGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSgnYScucmVwZWF0KDMyKSksIGZhbHNlKTsgLy8gVG9vIHNob3J0ICgxNiBieXRlcylcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleSgnYScucmVwZWF0KDY0KSksIGZhbHNlKTsgLy8gU2VlZCBsZW5ndGgsIG5vdCBmdWxsIHNlY3JldCBrZXkgKDMyIGJ5dGVzKVxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KCdhJy5yZXBlYXQoMjU2KSksIGZhbHNlKTsgLy8gVG9vIGxvbmcgKDEyOCBieXRlcylcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRUcmFuc2FjdGlvbklkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCB0cmFuc2FjdGlvbiBJRHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwodHJ1ZSwgdXRpbHMuaXNWYWxpZFRyYW5zYWN0aW9uSWQoJ0JmdEVrM0JlS1VXVGo5dXpWR250ZDRLYTE2UVpHOGhVbnI2S3NBYjdxN2J0JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCB0cmFuc2FjdGlvbiBJRHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIGZhbHNlLFxuICAgICAgICB1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCgnMHhmZjg2YjEyMTE4MWE0M2QwM2RmNTJlODkzMDc4NWFmM2RkYTk0NGVjODc2NTRjZGJhM2EzNzhmZjUxOGNkNzViJylcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRUcmFuc2FjdGlvbklkKCdCZnRFazNCZUtVV1RqOXV6VkdudGQ0S2ExNlFaRzhoVW5yNktzQWI3cTdiNTN0JykpOyAvLyBXcm9uZyBsZW5ndGhcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGhleCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCgnMHhhYmNkZWYxMjM0NTYnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBlbXB0eSBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkVHJhbnNhY3Rpb25JZCgnJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZEJsb2NrSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IGJsb2NrIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbCh0cnVlLCB1dGlscy5pc1ZhbGlkQmxvY2tJZCgnR1pYWnZ2TFMzWm51RTRFOUN4UUpKMmlqNXhlTnN2VVhkQUtWclBDUUtyUHonKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIGJsb2NrIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEJsb2NrSWQoJzB4OWFjNmEwYzMxM2M0YTA1NjNhMTY5ZGFkMjlmMWQwMTg2NDc2ODNiZTU0YTMxNGVkMjI5YTI2OTMyOTNkZmM5OCcpKTtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEJsb2NrSWQoJ0daWFp2dkxTM1pudUU0RTlDeFFKSjJpajV4ZU5zdlVYZEFLNTZWclBDUUtyUHonKSk7IC8vIFdyb25nIGxlbmd0aFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaGV4IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRCbG9ja0lkKCcweGFiY2RlZicpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGVtcHR5IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRCbG9ja0lkKCcnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkU2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICB0cnVlLFxuICAgICAgICB1dGlscy5pc1ZhbGlkU2lnbmF0dXJlKFxuICAgICAgICAgICdpWHJjVWpnUWdwWVVzYTdPOTBLWmljZFRtSWRKU2pCOTkrdEpXNmw2d1BDcUkvbFVUb3U2c1Eyc0xvWmdDMG40cVFLWCt2RkR6K2xCSVhsN0ovWmdDZz09J1xuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCBzaWduYXR1cmVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkU2lnbmF0dXJlKCcweDlhYzZhMGMzMTNjNGEwNTYzYTE2OWRhZDI5ZjFkMDE4NjQ3NjgzYmU1NGEzMTRlZDIyOWEyNjkzMjkzZGZjOTgnKSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoJ2dvcHBCVERnTHVCYmNVNXRQOTBuM2lndlpHSG1jRTIzSENveExmZEp3T0NjYnl6dFZoOXIwVFBhY0pSWG1qWjYnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBzaWduYXR1cmVzIHdpdGggaW5jb3JyZWN0IGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFNpZ25hdHVyZSgnZEc5dlUyaHZjblE9JykpOyAvLyBUb28gc2hvcnQgYmFzZTY0XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBub24tYmFzZTY0IHN0cmluZ3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoJ25vdCBhIGJhc2U2NCBzdHJpbmchISEnKSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRTaWduYXR1cmUoJycpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRIZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBjb3JyZWN0IGhleCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4YWJjZGVmJywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4MTIzNDU2JywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzBYQUJDREVGJywgNikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaGV4IHN0cmluZ3Mgd2l0aCBpbmNvcnJlY3QgbGVuZ3RoJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkSGV4KCcweGFiY2QnLCA2KSk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRIZXgoJzB4YWJjZGVmZ2gnLCA2KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBoZXggc3RyaW5ncyB3aXRob3V0IHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZEhleCgnYWJjZGVmJywgNikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaGV4IHN0cmluZ3Mgd2l0aCBub24taGV4IGNoYXJhY3RlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQuZXF1YWwoZmFsc2UsIHV0aWxzLmlzVmFsaWRIZXgoJzB4Z2hpamtsJywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKGZhbHNlLCB1dGlscy5pc1ZhbGlkSGV4KCcweGFiY2RlZycsIDYpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4QUJDREVGJywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4YWJjZGVmJywgNikpO1xuICAgICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRIZXgoJzB4QWJDZEVmJywgNikpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSB2YWxpZCBhZGRyZXNzIGZyb20gcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleSh0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5leGlzdChhZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGNvbnNpc3RlbnQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzczEgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleSh0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5KTtcbiAgICAgIGNvbnN0IGFkZHJlc3MyID0gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoYWRkcmVzczEsIGFkZHJlc3MyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgZGlmZmVyZW50IGFkZHJlc3NlcyBmb3IgZGlmZmVyZW50IGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzMSA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgICAgY29uc3QgYWRkcmVzczIgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleSh0ZXN0RGF0YS5nYXNTcG9uc29yLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQubm90RXF1YWwoYWRkcmVzczEsIGFkZHJlc3MyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJhc2U2NFN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgVWludDhBcnJheSB0byBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoWzcyLCAxMDEsIDEwOCwgMTA4LCAxMTFdKTsgLy8gXCJIZWxsb1wiXG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5nZXRCYXNlNjRTdHJpbmcodWludDhBcnJheSk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eXBlb2YgcmVzdWx0LCAnc3RyaW5nJyk7XG4gICAgICBzaG91bGQuZXF1YWwocmVzdWx0Lmxlbmd0aCA+IDAsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGhleCBzdHJpbmcgdG8gYmFzZTY0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaGV4U3RyaW5nID0gJzQ4NjU2YzZjNmYnOyAvLyBcIkhlbGxvXCIgaW4gaGV4XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5nZXRCYXNlNjRTdHJpbmcoaGV4U3RyaW5nKTtcbiAgICAgIHNob3VsZC5leGlzdChyZXN1bHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQubGVuZ3RoID4gMCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBVaW50OEFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZW1wdHlBcnJheSA9IG5ldyBVaW50OEFycmF5KFtdKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLmdldEJhc2U2NFN0cmluZyhlbXB0eUFycmF5KTtcbiAgICAgIHNob3VsZC5leGlzdChyZXN1bHQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIEJ1ZmZlciBjb252ZXJzaW9uIHRvIGJhc2U2NCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCdIZWxsbyBXb3JsZCcpO1xuICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5nZXRCYXNlNjRTdHJpbmcodWludDhBcnJheSk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eXBlb2YgcmVzdWx0LCAnc3RyaW5nJyk7XG4gICAgICBzaG91bGQuZXF1YWwocmVzdWx0Lmxlbmd0aCA+IDAsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb25zaXN0ZW50bHkgY29udmVydCBzYW1lIGlucHV0IHRvIHNhbWUgb3V0cHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzLCA0LCA1XSk7XG4gICAgICBjb25zdCByZXN1bHQxID0gdXRpbHMuZ2V0QmFzZTY0U3RyaW5nKHVpbnQ4QXJyYXkpO1xuICAgICAgY29uc3QgcmVzdWx0MiA9IHV0aWxzLmdldEJhc2U2NFN0cmluZyhuZXcgVWludDhBcnJheShbMSwgMiwgMywgNCwgNV0pKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZXN1bHQxLCByZXN1bHQyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWRSYXdUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHByb3BlciByYXcgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGlvdGEnKSk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHR4QnVpbGRlci5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICB0eEJ1aWxkZXIuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSByYXcgdHJhbnNhY3Rpb25zIGFzIFVpbnQ4QXJyYXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0aW90YScpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpO1xuICAgICAgdHhCdWlsZGVyLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4QnVpbGRlci5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgcmF3VHhCeXRlcyA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0Jyk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHhCeXRlcyksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCByYXcgdHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbignaW52YWxpZFJhd1R4JyksIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24oJycpLCBmYWxzZSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKCcweDEyMzQ1NicpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpbnZhbGlkIGJhc2U2NCBzdHJpbmdzJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbignbm90LWJhc2U2NCEhIScpLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtYWxmb3JtZWQgdHJhbnNhY3Rpb24gZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1hbGZvcm1lZEJhc2U2NCA9IEJ1ZmZlci5mcm9tKCdtYWxmb3JtZWQgZGF0YScpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24obWFsZm9ybWVkQmFzZTY0KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0REFBOEM7QUFDOUMsb0RBQTRCO0FBQzVCLGdFQUF3QztBQUN4Qyx1REFBcUU7QUFFckUsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtRQUM3QixFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3BELGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFO1lBQ3hDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3RELGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxnQkFBZ0IsR0FBRztZQUN2QixFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtZQUM3RixFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUU7WUFDMUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFO1lBQzFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUU7WUFDM0UsRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUU7WUFDbkYsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRTtTQUMvRCxDQUFDO1FBRUYsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDM0QsRUFBRSxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsaUJBQWlCLFdBQVcsRUFBRSxFQUFFO2dCQUN0RSx5Q0FBeUM7Z0JBQ3pDLGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsdUJBQXVCLEVBQUU7UUFDaEMsTUFBTSxlQUFlLEdBQUc7WUFDdEIsa0VBQWtFO1lBQ2xFLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUztTQUMxQixDQUFDO1FBRUYsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDOUIsZUFBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0seUJBQXlCLEdBQUc7WUFDaEMsRUFBRSxHQUFHLEVBQUUsb0VBQW9FLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFO1lBQzVHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUU7WUFDakQsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUU7WUFDeEMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUU7WUFDeEMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsOEJBQThCLEVBQUU7WUFDcEUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsNkJBQTZCLEVBQUU7U0FDckUsQ0FBQztRQUVGLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDekQsRUFBRSxDQUFDLDRCQUE0QixXQUFXLEVBQUUsRUFBRTtnQkFDNUMsZUFBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHdCQUF3QixFQUFFO1FBQ2pDLEVBQUUsQ0FBQyx5REFBeUQsRUFBRTtZQUM1RCxzRkFBc0Y7WUFDdEYsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxlQUFLLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sMEJBQTBCLEdBQUc7WUFDakMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRTtZQUNqRCxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRTtZQUN4QyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRTtZQUN4QyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRTtZQUM1RCxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSx1Q0FBdUMsRUFBRTtZQUM3RSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRTtTQUM5RCxDQUFDO1FBRUYsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRTtZQUMxRCxFQUFFLENBQUMsOEJBQThCLFdBQVcsRUFBRSxFQUFFO2dCQUM5QyxlQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUNBQXFDLEVBQUU7UUFDOUMsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELGVBQUssQ0FBQyxvQkFBb0IsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGtCQUFrQixHQUFHO1lBQ3pCO2dCQUNFLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLEtBQUssRUFBRTtvQkFDTCxFQUFFLEVBQUUsRUFBRSxvRUFBb0UsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFO29CQUN2RyxFQUFFLEVBQUUsRUFBRSxnREFBZ0QsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFO29CQUNyRixFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUU7b0JBQ3hELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFO2lCQUN4QzthQUNGO1lBQ0Q7Z0JBQ0UsU0FBUyxFQUFFLGdCQUFnQjtnQkFDM0IsS0FBSyxFQUFFO29CQUNMLEVBQUUsRUFBRSxFQUFFLG9FQUFvRSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUU7b0JBQ3ZHLEVBQUUsRUFBRSxFQUFFLGdEQUFnRCxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUU7b0JBQ3JGLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUU7b0JBQ2xELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFO2lCQUN4QzthQUNGO1NBQ0YsQ0FBQztRQUVGLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDbEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7Z0JBQ3BDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsa0JBQWtCLFdBQVcsRUFBRSxFQUFFO29CQUM5QyxlQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQXNCLEVBQUU7UUFDL0IsRUFBRSxDQUFDLDBEQUEwRCxFQUFFO1lBQzdELE1BQU0sY0FBYyxHQUFHLDBGQUEwRixDQUFDO1lBQ2xILGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSx5QkFBeUIsR0FBRztZQUNoQyxFQUFFLEdBQUcsRUFBRSxvRUFBb0UsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFO1lBQ3hHLEVBQUUsR0FBRyxFQUFFLGtFQUFrRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUU7WUFDeEcsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRTtZQUMxRCxFQUFFLEdBQUcsRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUU7WUFDaEUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUU7U0FDekMsQ0FBQztRQUVGLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDekQsRUFBRSxDQUFDLGlCQUFpQixXQUFXLEVBQUUsRUFBRTtnQkFDakMsZUFBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHVCQUF1QixFQUFFO1FBQ2hDLE1BQU0sWUFBWSxHQUFHO1lBQ25CLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRTtZQUNyRSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUU7WUFDbkUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUU7WUFDNUUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFO1lBQ3JFLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRTtZQUN0RSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUU7WUFDcEUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFO1lBQ3ZFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRTtZQUNwRSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUU7WUFDMUUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFB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YXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL2lvdGEnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcyB9IGZyb20gJy4vaGVscGVycy90ZXN0SGVscGVycyc7XG5cbmRlc2NyaWJlKCdJb3RhIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ0FkZHJlc3MgVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFsbCBjb3JyZWN0IGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFsbCBpbnZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRlc3REYXRhLmFkZHJlc3Nlcy5pbnZhbGlkQWRkcmVzc2VzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFkZHJlc3NUZXN0Q2FzZXMgPSBbXG4gICAgICB7IGFkZHJlc3M6ICcweCcgKyAnYScucmVwZWF0KDY0KSwgdmFsaWQ6IHRydWUsIGRlc2NyaXB0aW9uOiAnY29ycmVjdCBsZW5ndGggKDY0IGhleCBjaGFycyknIH0sXG4gICAgICB7IGFkZHJlc3M6ICcweCcgKyAnYScucmVwZWF0KDMyKSwgdmFsaWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogJ3RvbyBzaG9ydCcgfSxcbiAgICAgIHsgYWRkcmVzczogJzB4JyArICdhJy5yZXBlYXQoMTI4KSwgdmFsaWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogJ3RvbyBsb25nJyB9LFxuICAgICAgeyBhZGRyZXNzOiAnYScucmVwZWF0KDY0KSwgdmFsaWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogJ21pc3NpbmcgMHggcHJlZml4JyB9LFxuICAgICAgeyBhZGRyZXNzOiAnMHgnICsgJ2cnLnJlcGVhdCg2NCksIHZhbGlkOiBmYWxzZSwgZGVzY3JpcHRpb246ICdub24taGV4IGNoYXJhY3RlcnMnIH0sXG4gICAgICB7IGFkZHJlc3M6IHVuZGVmaW5lZCwgdmFsaWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogJ3VuZGVmaW5lZCcgfSxcbiAgICBdO1xuXG4gICAgYWRkcmVzc1Rlc3RDYXNlcy5mb3JFYWNoKCh7IGFkZHJlc3MsIHZhbGlkLCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkICR7dmFsaWQgPyAnYWNjZXB0JyA6ICdyZWplY3QnfSBhZGRyZXNzIHdpdGggJHtkZXNjcmlwdGlvbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgdW5kZWZpbmVkXG4gICAgICAgIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLnNob3VsZC5lcXVhbCh2YWxpZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1B1YmxpYyBLZXkgVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB2YWxpZFB1YmxpY0tleXMgPSBbXG4gICAgICAnYjIwNTE4OTk0NzhlZGViMzZhNzlkMWQxNmRmZWM1NmRjM2E2ZWJkMjlmYmJiYjRhNGVmMmRmYWY0NjA0MzM1NScsXG4gICAgICB0ZXN0RGF0YS5zZW5kZXIucHVibGljS2V5LFxuICAgIF07XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFsbCBjb3JyZWN0IHB1YmxpYyBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFsaWRQdWJsaWNLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICB1dGlscy5pc1ZhbGlkUHVibGljS2V5KGtleSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW52YWxpZFB1YmxpY0tleVRlc3RDYXNlcyA9IFtcbiAgICAgIHsga2V5OiAnMHg0MTNmN2ZhOGJlYjU0NDU5ZTFlOWVkZTNhZjNiMTJlNWE0YTM1NTAzOTBiYjYxNmRhMzBkZDcyMDE3NzAxMjYzJywgZGVzY3JpcHRpb246ICd3aXRoIDB4IHByZWZpeCcgfSxcbiAgICAgIHsga2V5OiAnaW52YWxpZCcsIGRlc2NyaXB0aW9uOiAnaW52YWxpZCBmb3JtYXQnIH0sXG4gICAgICB7IGtleTogJycsIGRlc2NyaXB0aW9uOiAnZW1wdHkgc3RyaW5nJyB9LFxuICAgICAgeyBrZXk6ICcxMjMnLCBkZXNjcmlwdGlvbjogJ3RvbyBzaG9ydCcgfSxcbiAgICAgIHsga2V5OiAnYScucmVwZWF0KDMyKSwgZGVzY3JpcHRpb246ICdpbmNvcnJlY3QgbGVuZ3RoICh0b28gc2hvcnQpJyB9LFxuICAgICAgeyBrZXk6ICdhJy5yZXBlYXQoMTI4KSwgZGVzY3JpcHRpb246ICdpbmNvcnJlY3QgbGVuZ3RoICh0b28gbG9uZyknIH0sXG4gICAgXTtcblxuICAgIGludmFsaWRQdWJsaWNLZXlUZXN0Q2FzZXMuZm9yRWFjaCgoeyBrZXksIGRlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgcmVqZWN0IHB1YmxpYyBrZXkgJHtkZXNjcmlwdGlvbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoa2V5KS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUHJpdmF0ZSBLZXkgVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGVkMjU1MTkgc2VjcmV0IGtleXMgd2l0aCBjb3JyZWN0IGxlbmd0aCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEVkMjU1MTkgc2VjcmV0IGtleXMgYXJlIDEyOCBoZXggY2hhcnMgKDY0IGJ5dGVzOiAzMi1ieXRlIHNlZWQgKyAzMi1ieXRlIHB1YmxpYyBrZXkpXG4gICAgICBjb25zdCB2YWxpZFNlY3JldEtleSA9ICcwJy5yZXBlYXQoMTI4KTtcbiAgICAgIHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KHZhbGlkU2VjcmV0S2V5KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW52YWxpZFByaXZhdGVLZXlUZXN0Q2FzZXMgPSBbXG4gICAgICB7IGtleTogJ2ludmFsaWQnLCBkZXNjcmlwdGlvbjogJ2ludmFsaWQgZm9ybWF0JyB9LFxuICAgICAgeyBrZXk6ICcnLCBkZXNjcmlwdGlvbjogJ2VtcHR5IHN0cmluZycgfSxcbiAgICAgIHsga2V5OiAnMTIzJywgZGVzY3JpcHRpb246ICd0b28gc2hvcnQnIH0sXG4gICAgICB7IGtleTogJ2EnLnJlcGVhdCgzMiksIGRlc2NyaXB0aW9uOiAnMTYgYnl0ZXMgKHRvbyBzaG9ydCknIH0sXG4gICAgICB7IGtleTogJ2EnLnJlcGVhdCg2NCksIGRlc2NyaXB0aW9uOiAnMzIgYnl0ZXMgKHNlZWQgb25seSwgbm90IGZ1bGwgc2VjcmV0KScgfSxcbiAgICAgIHsga2V5OiAnYScucmVwZWF0KDI1NiksIGRlc2NyaXB0aW9uOiAnMTI4IGJ5dGVzICh0b28gbG9uZyknIH0sXG4gICAgXTtcblxuICAgIGludmFsaWRQcml2YXRlS2V5VGVzdENhc2VzLmZvckVhY2goKHsga2V5LCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkIHJlamVjdCBwcml2YXRlIGtleTogJHtkZXNjcmlwdGlvbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KGtleSkuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIGFuZCBCbG9jayBJRCBWYWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCB0cmFuc2FjdGlvbiBJRCAoYmFzZTU4KScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHV0aWxzLmlzVmFsaWRUcmFuc2FjdGlvbklkKCdCZnRFazNCZUtVV1RqOXV6VkdudGQ0S2ExNlFaRzhoVW5yNktzQWI3cTdidCcpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGNvcnJlY3QgYmxvY2sgSUQgKGJhc2U1OCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICB1dGlscy5pc1ZhbGlkQmxvY2tJZCgnR1pYWnZ2TFMzWm51RTRFOUN4UUpKMmlqNXhlTnN2VVhkQUtWclBDUUtyUHonKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW52YWxpZElkVGVzdENhc2VzID0gW1xuICAgICAge1xuICAgICAgICB2YWxpZGF0b3I6ICdpc1ZhbGlkVHJhbnNhY3Rpb25JZCcsXG4gICAgICAgIGNhc2VzOiBbXG4gICAgICAgICAgeyBpZDogJzB4ZmY4NmIxMjExODFhNDNkMDNkZjUyZTg5MzA3ODVhZjNkZGE5NDRlYzg3NjU0Y2RiYTNhMzc4ZmY1MThjZDc1YicsIGRlc2NyaXB0aW9uOiAnaGV4IGZvcm1hdCcgfSxcbiAgICAgICAgICB7IGlkOiAnQmZ0RWszQmVLVVdUajl1elZHbnRkNEthMTZRWkc4aFVucjZLc0FiN3E3YjUzdCcsIGRlc2NyaXB0aW9uOiAnd3JvbmcgbGVuZ3RoJyB9LFxuICAgICAgICAgIHsgaWQ6ICcweGFiY2RlZjEyMzQ1NicsIGRlc2NyaXB0aW9uOiAnaGV4IHdpdGggcHJlZml4JyB9LFxuICAgICAgICAgIHsgaWQ6ICcnLCBkZXNjcmlwdGlvbjogJ2VtcHR5IHN0cmluZycgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRvcjogJ2lzVmFsaWRCbG9ja0lkJyxcbiAgICAgICAgY2FzZXM6IFtcbiAgICAgICAgICB7IGlkOiAnMHg5YWM2YTBjMzEzYzRhMDU2M2ExNjlkYWQyOWYxZDAxODY0NzY4M2JlNTRhMzE0ZWQyMjlhMjY5MzI5M2RmYzk4JywgZGVzY3JpcHRpb246ICdoZXggZm9ybWF0JyB9LFxuICAgICAgICAgIHsgaWQ6ICdHWlhadnZMUzNabnVFNEU5Q3hRSkoyaWo1eGVOc3ZVWGRBSzU2VnJQQ1FLclB6JywgZGVzY3JpcHRpb246ICd3cm9uZyBsZW5ndGgnIH0sXG4gICAgICAgICAgeyBpZDogJzB4YWJjZGVmJywgZGVzY3JpcHRpb246ICdoZXggd2l0aCBwcmVmaXgnIH0sXG4gICAgICAgICAgeyBpZDogJycsIGRlc2NyaXB0aW9uOiAnZW1wdHkgc3RyaW5nJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgaW52YWxpZElkVGVzdENhc2VzLmZvckVhY2goKHsgdmFsaWRhdG9yLCBjYXNlcyB9KSA9PiB7XG4gICAgICBjYXNlcy5mb3JFYWNoKCh7IGlkLCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICAgIGl0KGAke3ZhbGlkYXRvcn0gc2hvdWxkIHJlamVjdCAke2Rlc2NyaXB0aW9ufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB1dGlsc1t2YWxpZGF0b3JdKGlkKS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NpZ25hdHVyZSBWYWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgY29ycmVjdCBiYXNlNjQtZW5jb2RlZCA2NC1ieXRlIHNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkU2lnbmF0dXJlID0gJ2lYcmNVamdRZ3BZVXNhN085MEtaaWNkVG1JZEpTakI5OSt0Slc2bDZ3UENxSS9sVVRvdTZzUTJzTG9aZ0MwbjRxUUtYK3ZGRHorbEJJWGw3Si9aZ0NnPT0nO1xuICAgICAgdXRpbHMuaXNWYWxpZFNpZ25hdHVyZSh2YWxpZFNpZ25hdHVyZSkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGludmFsaWRTaWduYXR1cmVUZXN0Q2FzZXMgPSBbXG4gICAgICB7IHNpZzogJzB4OWFjNmEwYzMxM2M0YTA1NjNhMTY5ZGFkMjlmMWQwMTg2NDc2ODNiZTU0YTMxNGVkMjI5YTI2OTMyOTNkZmM5OCcsIGRlc2NyaXB0aW9uOiAnaGV4IGZvcm1hdCcgfSxcbiAgICAgIHsgc2lnOiAnZ29wcEJURGdMdUJiY1U1dFA5MG4zaWd2WkdIbWNFMjNIQ294TGZkSndPQ2NieXp0Vmg5cjBUUGFjSlJYbWpaNicsIGRlc2NyaXB0aW9uOiAnd3JvbmcgZm9ybWF0JyB9LFxuICAgICAgeyBzaWc6ICdkRzl2VTJodmNuUT0nLCBkZXNjcmlwdGlvbjogJ3RvbyBzaG9ydCAoYmFzZTY0KScgfSxcbiAgICAgIHsgc2lnOiAnbm90IGEgYmFzZTY0IHN0cmluZyEhIScsIGRlc2NyaXB0aW9uOiAnaW52YWxpZCBiYXNlNjQnIH0sXG4gICAgICB7IHNpZzogJycsIGRlc2NyaXB0aW9uOiAnZW1wdHkgc3RyaW5nJyB9LFxuICAgIF07XG5cbiAgICBpbnZhbGlkU2lnbmF0dXJlVGVzdENhc2VzLmZvckVhY2goKHsgc2lnLCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkIHJlamVjdCAke2Rlc2NyaXB0aW9ufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdXRpbHMuaXNWYWxpZFNpZ25hdHVyZShzaWcpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdIZXggU3RyaW5nIFZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaGV4VGVzdENhc2VzID0gW1xuICAgICAgeyBoZXg6ICcweGFiY2RlZicsIGxlbmd0aDogNiwgdmFsaWQ6IHRydWUsIGRlc2NyaXB0aW9uOiAnbG93ZXJjYXNlJyB9LFxuICAgICAgeyBoZXg6ICcweDEyMzQ1NicsIGxlbmd0aDogNiwgdmFsaWQ6IHRydWUsIGRlc2NyaXB0aW9uOiAnbnVtYmVycycgfSxcbiAgICAgIHsgaGV4OiAnMFhBQkNERUYnLCBsZW5ndGg6IDYsIHZhbGlkOiB0cnVlLCBkZXNjcmlwdGlvbjogJ3VwcGVyY2FzZSBwcmVmaXgnIH0sXG4gICAgICB7IGhleDogJzB4QUJDREVGJywgbGVuZ3RoOiA2LCB2YWxpZDogdHJ1ZSwgZGVzY3JpcHRpb246ICd1cHBlcmNhc2UnIH0sXG4gICAgICB7IGhleDogJzB4QWJDZEVmJywgbGVuZ3RoOiA2LCB2YWxpZDogdHJ1ZSwgZGVzY3JpcHRpb246ICdtaXhlZCBjYXNlJyB9LFxuICAgICAgeyBoZXg6ICcweGFiY2QnLCBsZW5ndGg6IDYsIHZhbGlkOiBmYWxzZSwgZGVzY3JpcHRpb246ICd0b28gc2hvcnQnIH0sXG4gICAgICB7IGhleDogJzB4YWJjZGVmZ2gnLCBsZW5ndGg6IDYsIHZhbGlkOiBmYWxzZSwgZGVzY3JpcHRpb246ICd0b28gbG9uZycgfSxcbiAgICAgIHsgaGV4OiAnYWJjZGVmJywgbGVuZ3RoOiA2LCB2YWxpZDogZmFsc2UsIGRlc2NyaXB0aW9uOiAnbm8gcHJlZml4JyB9LFxuICAgICAgeyBoZXg6ICcweGdoaWprbCcsIGxlbmd0aDogNiwgdmFsaWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogJ25vbi1oZXggY2hhcnMnIH0sXG4gICAgICB7IGhleDogJzB4YWJjZGVnJywgbGVuZ3RoOiA2LCB2YWxpZDogZmFsc2UsIGRlc2NyaXB0aW9uOiAnaW52YWxpZCBjaGFyIGF0IGVuZCcgfSxcbiAgICBdO1xuXG4gICAgaGV4VGVzdENhc2VzLmZvckVhY2goKHsgaGV4LCBsZW5ndGgsIHZhbGlkLCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkICR7dmFsaWQgPyAnYWNjZXB0JyA6ICdyZWplY3QnfSAke2Rlc2NyaXB0aW9ufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdXRpbHMuaXNWYWxpZEhleChoZXgsIGxlbmd0aCkuc2hvdWxkLmVxdWFsKHZhbGlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQWRkcmVzcyBEZXJpdmF0aW9uIGZyb20gUHVibGljIEtleScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGFkZHJlc3MgZnJvbSBwdWJsaWMga2V5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmV4aXN0KGFkZHJlc3MpO1xuICAgICAgdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgY29uc2lzdGVudCBhZGRyZXNzZXMgZnJvbSBzYW1lIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MxID0gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkodGVzdERhdGEuc2VuZGVyLnB1YmxpY0tleSk7XG4gICAgICBjb25zdCBhZGRyZXNzMiA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgICAgYWRkcmVzczEuc2hvdWxkLmVxdWFsKGFkZHJlc3MyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgZGlmZmVyZW50IGFkZHJlc3NlcyBmb3IgZGlmZmVyZW50IGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzMSA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHRlc3REYXRhLnNlbmRlci5wdWJsaWNLZXkpO1xuICAgICAgY29uc3QgYWRkcmVzczIgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleSh0ZXN0RGF0YS5nYXNTcG9uc29yLnB1YmxpY0tleSk7XG4gICAgICBhZGRyZXNzMS5zaG91bGQubm90LmVxdWFsKGFkZHJlc3MyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Jhc2U2NCBTdHJpbmcgQ29udmVyc2lvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb252ZXJzaW9uVGVzdENhc2VzID0gW1xuICAgICAgeyBpbnB1dDogbmV3IFVpbnQ4QXJyYXkoWzcyLCAxMDEsIDEwOCwgMTA4LCAxMTFdKSwgZGVzY3JpcHRpb246ICdVaW50OEFycmF5IChcIkhlbGxvXCIpJyB9LFxuICAgICAgeyBpbnB1dDogJzQ4NjU2YzZjNmYnLCBkZXNjcmlwdGlvbjogJ2hleCBzdHJpbmcgKFwiSGVsbG9cIiknIH0sXG4gICAgICB7IGlucHV0OiBuZXcgVWludDhBcnJheShbXSksIGRlc2NyaXB0aW9uOiAnZW1wdHkgVWludDhBcnJheScgfSxcbiAgICAgIHsgaW5wdXQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCdIZWxsbyBXb3JsZCcpKSwgZGVzY3JpcHRpb246ICdCdWZmZXIgYXMgVWludDhBcnJheScgfSxcbiAgICBdO1xuXG4gICAgY29udmVyc2lvblRlc3RDYXNlcy5mb3JFYWNoKCh7IGlucHV0LCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkIGNvbnZlcnQgJHtkZXNjcmlwdGlvbn0gdG8gYmFzZTY0YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5nZXRCYXNlNjRTdHJpbmcoaW5wdXQpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVzdWx0KTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiByZXN1bHQsICdzdHJpbmcnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGNvbnNpc3RlbnQgb3V0cHV0IGZvciBzYW1lIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzLCA0LCA1XSk7XG4gICAgICBjb25zdCByZXN1bHQxID0gdXRpbHMuZ2V0QmFzZTY0U3RyaW5nKHVpbnQ4QXJyYXkpO1xuICAgICAgY29uc3QgcmVzdWx0MiA9IHV0aWxzLmdldEJhc2U2NFN0cmluZyhuZXcgVWludDhBcnJheShbMSwgMiwgMywgNCwgNV0pKTtcbiAgICAgIHJlc3VsdDEuc2hvdWxkLmVxdWFsKHJlc3VsdDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmF3IFRyYW5zYWN0aW9uIFZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBwcm9wZXJseSBidWlsdCB0cmFuc2FjdGlvbiAoYmFzZTY0KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdHJhbnNhY3Rpb24gYXMgVWludDhBcnJheScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCByYXdUeEJ5dGVzID0gQnVmZmVyLmZyb20ocmF3VHgsICdiYXNlNjQnKTtcblxuICAgICAgdXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4Qnl0ZXMpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnZhbGlkUmF3VHhUZXN0Q2FzZXMgPSBbXG4gICAgICB7IHR4OiAnaW52YWxpZFJhd1R4JywgZGVzY3JpcHRpb246ICdpbnZhbGlkIHN0cmluZycgfSxcbiAgICAgIHsgdHg6ICcnLCBkZXNjcmlwdGlvbjogJ2VtcHR5IHN0cmluZycgfSxcbiAgICAgIHsgdHg6ICcweDEyMzQ1NicsIGRlc2NyaXB0aW9uOiAnaGV4IGZvcm1hdCcgfSxcbiAgICAgIHsgdHg6ICdub3QtYmFzZTY0ISEhJywgZGVzY3JpcHRpb246ICdpbnZhbGlkIGJhc2U2NCcgfSxcbiAgICAgIHsgdHg6IEJ1ZmZlci5mcm9tKCdtYWxmb3JtZWQgZGF0YScpLnRvU3RyaW5nKCdiYXNlNjQnKSwgZGVzY3JpcHRpb246ICdtYWxmb3JtZWQgZGF0YScgfSxcbiAgICBdO1xuXG4gICAgaW52YWxpZFJhd1R4VGVzdENhc2VzLmZvckVhY2goKHsgdHgsIGRlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIGl0KGBzaG91bGQgcmVqZWN0ICR7ZGVzY3JpcHRpb259YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB1dGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24odHgpLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=