@bitgo-beta/sdk-coin-flrp 1.0.1-beta.380 → 1.0.1-beta.382

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.
@@ -122,5 +122,192 @@ describe('Flrp Import In P Tx Builder', () => {
122
122
  tx.id.should.equal('2vwvuXp47dsUmqb4vkaMk7UsukrZNapKXT2ruZhVibbjMDpqr9');
123
123
  });
124
124
  });
125
+ describe('addressesIndex extraction and signature slot mapping', () => {
126
+ it('should correctly parse half-signed tx and add second signature', async () => {
127
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInP_1.IMPORT_IN_P.halfSigntxHex);
128
+ txBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
129
+ const tx = await txBuilder.build();
130
+ const rawTx = tx.toBroadcastFormat();
131
+ rawTx.should.equal(importInP_1.IMPORT_IN_P.signedHex);
132
+ tx.id.should.equal(importInP_1.IMPORT_IN_P.txhash);
133
+ });
134
+ it('should preserve transaction structure when parsing unsigned tx', async () => {
135
+ const freshBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
136
+ .getImportInPBuilder()
137
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
138
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
139
+ .fromPubKey(importInP_1.IMPORT_IN_P.corethAddresses)
140
+ .to(importInP_1.IMPORT_IN_P.pAddresses)
141
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
142
+ .feeState(importInP_1.IMPORT_IN_P.feeState)
143
+ .context(importInP_1.IMPORT_IN_P.context)
144
+ .decodedUtxos(importInP_1.IMPORT_IN_P.utxos);
145
+ const freshTx = await freshBuilder.build();
146
+ const freshHex = freshTx.toBroadcastFormat();
147
+ const parsedBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(freshHex);
148
+ const parsedTx = await parsedBuilder.build();
149
+ const parsedHex = parsedTx.toBroadcastFormat();
150
+ parsedHex.should.equal(freshHex);
151
+ });
152
+ it('should sign parsed unsigned tx and produce same result as fresh sign', async () => {
153
+ const freshBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
154
+ .getImportInPBuilder()
155
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
156
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
157
+ .fromPubKey(importInP_1.IMPORT_IN_P.corethAddresses)
158
+ .to(importInP_1.IMPORT_IN_P.pAddresses)
159
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
160
+ .feeState(importInP_1.IMPORT_IN_P.feeState)
161
+ .context(importInP_1.IMPORT_IN_P.context)
162
+ .decodedUtxos(importInP_1.IMPORT_IN_P.utxos);
163
+ freshBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[2] });
164
+ freshBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
165
+ const freshTx = await freshBuilder.build();
166
+ const parsedBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInP_1.IMPORT_IN_P.unsignedHex);
167
+ parsedBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[2] });
168
+ parsedBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
169
+ const parsedTx = await parsedBuilder.build();
170
+ parsedTx.toBroadcastFormat().should.equal(freshTx.toBroadcastFormat());
171
+ parsedTx.id.should.equal(freshTx.id);
172
+ });
173
+ it('should correctly handle signing flow: build -> parse -> sign -> parse -> sign', async () => {
174
+ const builder1 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
175
+ .getImportInPBuilder()
176
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
177
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
178
+ .fromPubKey(importInP_1.IMPORT_IN_P.corethAddresses)
179
+ .to(importInP_1.IMPORT_IN_P.pAddresses)
180
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
181
+ .feeState(importInP_1.IMPORT_IN_P.feeState)
182
+ .context(importInP_1.IMPORT_IN_P.context)
183
+ .decodedUtxos(importInP_1.IMPORT_IN_P.utxos);
184
+ const unsignedTx = await builder1.build();
185
+ const unsignedHex = unsignedTx.toBroadcastFormat();
186
+ const builder2 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(unsignedHex);
187
+ builder2.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[2] });
188
+ const halfSignedTx = await builder2.build();
189
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
190
+ const builder3 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(halfSignedHex);
191
+ builder3.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
192
+ const fullSignedTx = await builder3.build();
193
+ fullSignedTx.toBroadcastFormat().should.equal(importInP_1.IMPORT_IN_P.signedHex);
194
+ fullSignedTx.id.should.equal(importInP_1.IMPORT_IN_P.txhash);
195
+ });
196
+ it('should have correct number of signatures after full sign flow', async () => {
197
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInP_1.IMPORT_IN_P.signedHex);
198
+ const tx = await txBuilder.build();
199
+ const txJson = tx.toJson();
200
+ txJson.signatures.length.should.equal(2);
201
+ });
202
+ it('should have 1 signature after half sign', async () => {
203
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInP_1.IMPORT_IN_P.halfSigntxHex);
204
+ const tx = await txBuilder.build();
205
+ const txJson = tx.toJson();
206
+ txJson.signatures.length.should.equal(1);
207
+ });
208
+ it('should have 0 signatures for unsigned tx', async () => {
209
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInP_1.IMPORT_IN_P.unsignedHex);
210
+ const tx = await txBuilder.build();
211
+ const txJson = tx.toJson();
212
+ txJson.signatures.length.should.equal(0);
213
+ });
214
+ });
215
+ describe('fresh build with different UTXO address order', () => {
216
+ it('should correctly set up addressMaps when UTXO addresses differ from fromAddresses order', async () => {
217
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
218
+ .getImportInPBuilder()
219
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
220
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
221
+ .fromPubKey(importInP_1.IMPORT_IN_P.corethAddresses)
222
+ .to(importInP_1.IMPORT_IN_P.pAddresses)
223
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
224
+ .feeState(importInP_1.IMPORT_IN_P.feeState)
225
+ .context(importInP_1.IMPORT_IN_P.context)
226
+ .decodedUtxos(importInP_1.IMPORT_IN_P.utxos);
227
+ const tx = await txBuilder.build();
228
+ const txJson = tx.toJson();
229
+ txJson.type.should.equal(23);
230
+ txJson.threshold.should.equal(2);
231
+ });
232
+ it('should produce correct signatures when signing fresh build with different address order', async () => {
233
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
234
+ .getImportInPBuilder()
235
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
236
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
237
+ .fromPubKey(importInP_1.IMPORT_IN_P.corethAddresses)
238
+ .to(importInP_1.IMPORT_IN_P.pAddresses)
239
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
240
+ .feeState(importInP_1.IMPORT_IN_P.feeState)
241
+ .context(importInP_1.IMPORT_IN_P.context)
242
+ .decodedUtxos(importInP_1.IMPORT_IN_P.utxos);
243
+ txBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[2] });
244
+ txBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
245
+ const tx = await txBuilder.build();
246
+ const txJson = tx.toJson();
247
+ txJson.signatures.length.should.equal(2);
248
+ });
249
+ it('should produce matching tx when fresh build is parsed and rebuilt', async () => {
250
+ const freshBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
251
+ .getImportInPBuilder()
252
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
253
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
254
+ .fromPubKey(importInP_1.IMPORT_IN_P.corethAddresses)
255
+ .to(importInP_1.IMPORT_IN_P.pAddresses)
256
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
257
+ .feeState(importInP_1.IMPORT_IN_P.feeState)
258
+ .context(importInP_1.IMPORT_IN_P.context)
259
+ .decodedUtxos(importInP_1.IMPORT_IN_P.utxos);
260
+ const freshTx = await freshBuilder.build();
261
+ const freshHex = freshTx.toBroadcastFormat();
262
+ const parsedBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(freshHex);
263
+ const parsedTx = await parsedBuilder.build();
264
+ const parsedHex = parsedTx.toBroadcastFormat();
265
+ parsedHex.should.equal(freshHex);
266
+ });
267
+ it('should correctly complete full sign flow with different UTXO address order', async () => {
268
+ // Step 1: Build fresh unsigned transaction
269
+ const builder1 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
270
+ .getImportInPBuilder()
271
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
272
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
273
+ .fromPubKey(importInP_1.IMPORT_IN_P.corethAddresses)
274
+ .to(importInP_1.IMPORT_IN_P.pAddresses)
275
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
276
+ .feeState(importInP_1.IMPORT_IN_P.feeState)
277
+ .context(importInP_1.IMPORT_IN_P.context)
278
+ .decodedUtxos(importInP_1.IMPORT_IN_P.utxos);
279
+ const unsignedTx = await builder1.build();
280
+ const unsignedHex = unsignedTx.toBroadcastFormat();
281
+ const builder2 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(unsignedHex);
282
+ builder2.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[2] });
283
+ const halfSignedTx = await builder2.build();
284
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
285
+ halfSignedTx.toJson().signatures.length.should.equal(1);
286
+ const builder3 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(halfSignedHex);
287
+ builder3.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
288
+ const fullSignedTx = await builder3.build();
289
+ fullSignedTx.toJson().signatures.length.should.equal(2);
290
+ const txId = fullSignedTx.id;
291
+ txId.should.be.a.String();
292
+ txId.length.should.be.greaterThan(0);
293
+ });
294
+ it('should handle signing in different order and still produce valid tx', async () => {
295
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
296
+ .getImportInPBuilder()
297
+ .threshold(importInP_1.IMPORT_IN_P.threshold)
298
+ .locktime(importInP_1.IMPORT_IN_P.locktime)
299
+ .fromPubKey(importInP_1.IMPORT_IN_P.corethAddresses)
300
+ .to(importInP_1.IMPORT_IN_P.pAddresses)
301
+ .externalChainId(importInP_1.IMPORT_IN_P.sourceChainId)
302
+ .feeState(importInP_1.IMPORT_IN_P.feeState)
303
+ .context(importInP_1.IMPORT_IN_P.context)
304
+ .decodedUtxos(importInP_1.IMPORT_IN_P.utxos);
305
+ txBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[0] });
306
+ txBuilder.sign({ key: importInP_1.IMPORT_IN_P.privateKeys[2] });
307
+ const tx = await txBuilder.build();
308
+ const txJson = tx.toJson();
309
+ txJson.signatures.length.should.equal(2);
310
+ });
311
+ });
125
312
  });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLHlFQUFvRjtBQUNwRiwwQ0FBNkQ7QUFDN0QsaURBQTRDO0FBQzVDLDBFQUE4QztBQUU5QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPO2lCQUN0QixtQkFBbUIsRUFBRTtpQkFDckIsU0FBUyxDQUFDLHVCQUFRLENBQUMsU0FBUyxDQUFDO2lCQUM3QixRQUFRLENBQUMsdUJBQVEsQ0FBQyxRQUFRLENBQUM7aUJBQzNCLFVBQVUsQ0FBQyx1QkFBUSxDQUFDLGVBQWUsQ0FBQztpQkFDcEMsZUFBZSxDQUFDLHVCQUFRLENBQUMsYUFBYSxDQUFDO2lCQUN2QyxZQUFZLENBQUMsdUJBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQzVCLE9BQU8sQ0FBQyx1QkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTdCLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLE9BQU8s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OUMsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RFLE1BQU0sZUFBZSxHQUNuQiw0M0JBQTQzQixDQUFDO1lBQy8zQixNQUFNLFNBQVMsR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUYsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDcEMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgSU1QT1JUX0lOX1AgYXMgdGVzdERhdGEgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL2ltcG9ydEluUCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHNpZ25GbG93VGVzdCBmcm9tICcuL3NpZ25GbG93VGVzdFN1aXQnO1xuXG5kZXNjcmliZSgnRmxycCBJbXBvcnQgSW4gUCBUeCBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZyk7XG5cbiAgZGVzY3JpYmUoJ2ZlZVN0YXRlIHJlcXVpcmVtZW50JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgZmVlU3RhdGUgaXMgbm90IHNldCB3aGVuIGJ1aWxkaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLmNvcmV0aEFkZHJlc3NlcylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHRlc3REYXRhLnV0eG9zKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KTtcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnRmVlIHN0YXRlIGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBmZWVTdGF0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5QQnVpbGRlcigpO1xuICAgICAgKCgpID0+IHR4QnVpbGRlci5mZWVTdGF0ZSh0ZXN0RGF0YS5mZWVTdGF0ZSkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHR4QnVpbGRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJblBCdWlsZGVyKCk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGxlbmd0aCBpbmNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVybmFsQ2hhaW5JZChCdWZmZXIuZnJvbSh0ZXN0RGF0YS5JTlZBTElEX0NIQUlOX0lEKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0NoYWluIGlkIGFyZSAzMiBieXRlIHNpemUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBub3QgYSB2YWxpZCBiYXNlNTggc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ05vbi1iYXNlNTggY2hhcmFjdGVyJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgY2I1OCBpbnZhbGlkIGNoZWNrc3VtJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuVkFMSURfQ19DSEFJTl9JRC5zbGljZSgyKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ0ludmFsaWQgY2hlY2tzdW0nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVVRYT3MgYXJyYXkgY2Fubm90IGJlIGVtcHR5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHV0eG9zIGhleCBhcnJheSBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZGVjb2RlZFV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVVRYT3MgYXJyYXkgY2Fubm90IGJlIGVtcHR5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGNvbnRleHQgaXMgbm90IHNldCB3aGVuIGJ1aWxkaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5jb3JldGhBZGRyZXNzZXMpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKHRlc3REYXRhLmZlZVN0YXRlKTtcbiAgICAgIC8vIGNvbnRleHQgaXMgTk9UIHNldFxuXG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnY29udGV4dCBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gZnJvbVB1YktleSBhZGRyZXNzZXMgYXJlIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcylcbiAgICAgICAgLmZlZVN0YXRlKHRlc3REYXRhLmZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2Zyb21BZGRyZXNzZXMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnSW1wb3J0IFAyQycsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgLmdldEltcG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5jb3JldGhBZGRyZXNzZXMpXG4gICAgICAgIC50byh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5mZWVTdGF0ZSh0ZXN0RGF0YS5mZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcyksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEudW5zaWduZWRIZXgsXG4gICAgaGFsZlNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4LFxuICAgIGZ1bGxTaWduZWRUeEhleDogdGVzdERhdGEuc2lnbmVkSGV4LFxuICAgIHByaXZhdGVLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLnByaXZhdGVLZXlzWzJdLFxuICAgICAgcHJ2MjogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0sXG4gICAgfSxcbiAgICB0eEhhc2g6IHRlc3REYXRhLnR4aGFzaCxcbiAgfSk7XG5cbiAgaXQoJ1Nob3VsZCBmdWxsIHNpZ24gYSBpbXBvcnQgdHggZnJvbSB1bnNpZ25lZCByYXcgdHgnLCAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0gfSk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuYnVpbGQoKVxuICAgICAgLnRoZW4oKCkgPT4gYXNzZXJ0LmZhaWwoJ2l0IGNhbiBzaWduJykpXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoJ1ByaXZhdGUga2V5IGNhbm5vdCBzaWduIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvbi1jaGFpbiB2ZXJpZmllZCB0cmFuc2FjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgb24tY2hhaW4gdHggaWQgZm9yIHNpZ25lZCBQLWNoYWluIGltcG9ydCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25lZEltcG9ydEhleCA9XG4gICAgICAgICcweDAwMDAwMDAwMDAxMTAwMDAwMDcyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNTg3MzRmOTRhZjg3MWMzZDEzMWI1NjEzMWI2ZmI3YTAyOTFlYWNhZGQyNjFlNjlkZmI0MmE5Y2RmNmY3ZmRkZDAwMDAwMDA3MDAwMDAwMDAwMmU3OWYwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAzMzMyOWJlN2QwMWNkM2ViYWFlNjY1NGQ3MzI3ZGQ5ZjE3YTJlMTU4MTdlOTE4YTVlODA4M2FlNGM5ZjJmMGVkNzcwNTVjMjRiZjM2NjUwMDFjNzMyNDQzN2M5NmM3YzhhNmExNTJkYTIzODVjMWRiNWMzYWIxZjkxMDAwMDAwMDAwMDAwMDAwMDc4ZGI1YzMwYmVkMDRjMDVjZTIwOTE3OTgxMjg1MGJiYjNmZTZkNDZkN2VlZjM3NDRkODE0YzBkYTU1NTI0NzkwMDAwMDAwMTA2M2VjNjIwZDE4OTJmODAyYzhmMGMxMjRkMDVjZTFlNzNhODU2ODZiZWEyYjA5MzgwZmM1OGY2ZDcyNDk3ZGIwMDAwMDAwMDU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwNTAwMDAwMDAwMDJmYWYwODAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMTAwMDAwMDA5MDAwMDAwMDIyZWQ0ZWJjMmM4MWUzODgyMGNjN2JkNmU5NTJkMTBiZDMwMzgyZmEwNjc5YzhhMGJhNWRjNjc5OTBhMDkxMjU2NTZkNDdlYWRjYzYyMmFmOTM1ZmQ1ZGFkNjU0ZjliMDBkM2I5NTYzZGYzOGU4NzVlZjE5NjRlMWM5ZGVkODUxMTAwZWM1MTRhY2UyNmJhZWZjZTNmZmVhYjk0ZTM1ODA0NDNhYmNjM2NlYTY2OWE4N2M3YzI2ZWY4ZmZhM2ZlNzliMzMwZTRiZGJhY2FiZmQxY2NlOWY3YjZhOWYyNTE1YjRmZGY2MjdmN2QyNjc4ZTk1MzJkODYxYTc2NzM0NDRhYTcwMCc7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20oc2lnbmVkSW1wb3J0SGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwoc2lnbmVkSW1wb3J0SGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCgnMnZ3dnVYcDQ3ZHNVbXFiNHZrYU1rN1VzdWtyWk5hcEtYVDJydVpoVmliYmpNRHBxcjknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLHlFQUFvRjtBQUNwRiwwQ0FBNkQ7QUFDN0QsaURBQTRDO0FBQzVDLDBFQUE4QztBQUU5QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBRyxPQUFPO2lCQUN0QixtQkFBbUIsRUFBRTtpQkFDckIsU0FBUyxDQUFDLHVCQUFRLENBQUMsU0FBUyxDQUFDO2lCQUM3QixRQUFRLENBQUMsdUJBQVEsQ0FBQyxRQUFRLENBQUM7aUJBQzNCLFVBQVUsQ0FBQyx1QkFBUSxDQUFDLGVBQWUsQ0FBQztpQkFDcEMsZUFBZSxDQUFDLHVCQUFRLENBQUMsYUFBYSxDQUFDO2lCQUN2QyxZQUFZLENBQUMsdUJBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQzVCLE9BQU8sQ0FBQyx1QkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTdCLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLE9BQU8s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QUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IElNUE9SVF9JTl9QIGFzIHRlc3REYXRhIH0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3RyYW5zYWN0aW9uRGF0YS9pbXBvcnRJblAnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBzaWduRmxvd1Rlc3QgZnJvbSAnLi9zaWduRmxvd1Rlc3RTdWl0JztcblxuZGVzY3JpYmUoJ0ZscnAgSW1wb3J0IEluIFAgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCgndGZscnAnKTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuXG4gIGRlc2NyaWJlKCdmZWVTdGF0ZSByZXF1aXJlbWVudCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGZlZVN0YXRlIGlzIG5vdCBzZXQgd2hlbiBidWlsZGluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5jb3JldGhBZGRyZXNzZXMpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcylcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dCk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ZlZSBzdGF0ZSBpcyByZXF1aXJlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgdmFsaWQgZmVlU3RhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluUEJ1aWxkZXIoKTtcbiAgICAgICgoKSA9PiB0eEJ1aWxkZXIuZmVlU3RhdGUodGVzdERhdGEuZmVlU3RhdGUpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSB0eEJ1aWxkZXIgZmllbGRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5QQnVpbGRlcigpO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBsZW5ndGggaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQoQnVmZmVyLmZyb20odGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCkpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdDaGFpbiBpZCBhcmUgMzIgYnl0ZSBzaXplJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgbm90IGEgdmFsaWQgYmFzZTU4IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLklOVkFMSURfQ0hBSU5fSUQpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdOb24tYmFzZTU4IGNoYXJhY3RlcidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGNiNTggaW52YWxpZCBjaGVja3N1bScsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLlZBTElEX0NfQ0hBSU5fSUQuc2xpY2UoMikpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdJbnZhbGlkIGNoZWNrc3VtJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB2YWxpZGF0ZSBVdHhvcyBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1VUWE9zIGFycmF5IGNhbm5vdCBiZSBlbXB0eSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiB1dHhvcyBoZXggYXJyYXkgaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmRlY29kZWRVdHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gJ1VUWE9zIGFycmF5IGNhbm5vdCBiZSBlbXB0eSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBjb250ZXh0IGlzIG5vdCBzZXQgd2hlbiBidWlsZGluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY29yZXRoQWRkcmVzc2VzKVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZSh0ZXN0RGF0YS5mZWVTdGF0ZSk7XG4gICAgICAvLyBjb250ZXh0IGlzIE5PVCBzZXRcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2NvbnRleHQgaXMgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGZyb21QdWJLZXkgYWRkcmVzc2VzIGFyZSBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpXG4gICAgICAgIC5mZWVTdGF0ZSh0ZXN0RGF0YS5mZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dCk7XG5cbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdmcm9tQWRkcmVzc2VzIGFyZSByZXF1aXJlZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0ltcG9ydCBQMkMnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRJbXBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY29yZXRoQWRkcmVzc2VzKVxuICAgICAgICAudG8odGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlU3RhdGUodGVzdERhdGEuZmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLnVuc2lnbmVkSGV4LFxuICAgIGhhbGZTaWduZWRUeEhleDogdGVzdERhdGEuaGFsZlNpZ250eEhleCxcbiAgICBmdWxsU2lnbmVkVHhIZXg6IHRlc3REYXRhLnNpZ25lZEhleCxcbiAgICBwcml2YXRlS2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5wcml2YXRlS2V5c1syXSxcbiAgICAgIHBydjI6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdLFxuICAgIH0sXG4gICAgdHhIYXNoOiB0ZXN0RGF0YS50eGhhc2gsXG4gIH0pO1xuXG4gIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgaW1wb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdIH0pO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmJ1aWxkKClcbiAgICAgIC50aGVuKCgpID0+IGFzc2VydC5mYWlsKCdpdCBjYW4gc2lnbicpKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgZXJyLm1lc3NhZ2Uuc2hvdWxkLmJlLmVxdWFsKCdQcml2YXRlIGtleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb24tY2hhaW4gdmVyaWZpZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdmVyaWZ5IG9uLWNoYWluIHR4IGlkIGZvciBzaWduZWQgUC1jaGFpbiBpbXBvcnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzaWduZWRJbXBvcnRIZXggPVxuICAgICAgICAnMHgwMDAwMDAwMDAwMTEwMDAwMDA3MjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTU4NzM0Zjk0YWY4NzFjM2QxMzFiNTYxMzFiNmZiN2EwMjkxZWFjYWRkMjYxZTY5ZGZiNDJhOWNkZjZmN2ZkZGQwMDAwMDAwNzAwMDAwMDAwMDJlNzlmMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMzMzMjliZTdkMDFjZDNlYmFhZTY2NTRkNzMyN2RkOWYxN2EyZTE1ODE3ZTkxOGE1ZTgwODNhZTRjOWYyZjBlZDc3MDU1YzI0YmYzNjY1MDAxYzczMjQ0MzdjOTZjN2M4YTZhMTUyZGEyMzg1YzFkYjVjM2FiMWY5MTAwMDAwMDAwMDAwMDAwMDA3OGRiNWMzMGJlZDA0YzA1Y2UyMDkxNzk4MTI4NTBiYmIzZmU2ZDQ2ZDdlZWYzNzQ0ZDgxNGMwZGE1NTUyNDc5MDAwMDAwMDEwNjNlYzYyMGQxODkyZjgwMmM4ZjBjMTI0ZDA1Y2UxZTczYTg1Njg2YmVhMmIwOTM4MGZjNThmNmQ3MjQ5N2RiMDAwMDAwMDA1ODczNGY5NGFmODcxYzNkMTMxYjU2MTMxYjZmYjdhMDI5MWVhY2FkZDI2MWU2OWRmYjQyYTljZGY2ZjdmZGRkMDAwMDAwMDUwMDAwMDAwMDAyZmFmMDgwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDEwMDAwMDAwOTAwMDAwMDAyMmVkNGViYzJjODFlMzg4MjBjYzdiZDZlOTUyZDEwYmQzMDM4MmZhMDY3OWM4YTBiYTVkYzY3OTkwYTA5MTI1NjU2ZDQ3ZWFkY2M2MjJhZjkzNWZkNWRhZDY1NGY5YjAwZDNiOTU2M2RmMzhlODc1ZWYxOTY0ZTFjOWRlZDg1MTEwMGVjNTE0YWNlMjZiYWVmY2UzZmZlYWI5NGUzNTgwNDQzYWJjYzNjZWE2NjlhODdjN2MyNmVmOGZmYTNmZTc5YjMzMGU0YmRiYWNhYmZkMWNjZTlmN2I2YTlmMjUxNWI0ZmRmNjI3ZjdkMjY3OGU5NTMyZDg2MWE3NjczNDQ0YWE3MDAnO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHNpZ25lZEltcG9ydEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHNpZ25lZEltcG9ydEhleCk7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJzJ2d3Z1WHA0N2RzVW1xYjR2a2FNazdVc3VrclpOYXBLWFQycnVaaFZpYmJqTURwcXI5Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRyZXNzZXNJbmRleCBleHRyYWN0aW9uIGFuZCBzaWduYXR1cmUgc2xvdCBtYXBwaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IHBhcnNlIGhhbGYtc2lnbmVkIHR4IGFuZCBhZGQgc2Vjb25kIHNpZ25hdHVyZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eGhhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcmVzZXJ2ZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgd2hlbiBwYXJzaW5nIHVuc2lnbmVkIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZnJlc2hCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKVxuICAgICAgICAuZ2V0SW1wb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLmNvcmV0aEFkZHJlc3NlcylcbiAgICAgICAgLnRvKHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLmZlZVN0YXRlKHRlc3REYXRhLmZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHRlc3REYXRhLnV0eG9zKTtcblxuICAgICAgY29uc3QgZnJlc2hUeCA9IGF3YWl0IGZyZXNoQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZnJlc2hIZXggPSBmcmVzaFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKGZyZXNoSGV4KTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgcGFyc2VkQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcGFyc2VkSGV4ID0gcGFyc2VkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHBhcnNlZEhleC5zaG91bGQuZXF1YWwoZnJlc2hIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaWduIHBhcnNlZCB1bnNpZ25lZCB0eCBhbmQgcHJvZHVjZSBzYW1lIHJlc3VsdCBhcyBmcmVzaCBzaWduJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZnJlc2hCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKVxuICAgICAgICAuZ2V0SW1wb3J0SW5QQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLmNvcmV0aEFkZHJlc3NlcylcbiAgICAgICAgLnRvKHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuc291cmNlQ2hhaW5JZClcbiAgICAgICAgLmZlZVN0YXRlKHRlc3REYXRhLmZlZVN0YXRlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHRlc3REYXRhLnV0eG9zKTtcblxuICAgICAgZnJlc2hCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzJdIH0pO1xuICAgICAgZnJlc2hCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdIH0pO1xuXG4gICAgICBjb25zdCBmcmVzaFR4ID0gYXdhaXQgZnJlc2hCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICAgIHBhcnNlZEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMl0gfSk7XG4gICAgICBwYXJzZWRCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzBdIH0pO1xuICAgICAgY29uc3QgcGFyc2VkVHggPSBhd2FpdCBwYXJzZWRCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBwYXJzZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChmcmVzaFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgcGFyc2VkVHguaWQuc2hvdWxkLmVxdWFsKGZyZXNoVHguaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaGFuZGxlIHNpZ25pbmcgZmxvdzogYnVpbGQgLT4gcGFyc2UgLT4gc2lnbiAtPiBwYXJzZSAtPiBzaWduJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlcjEgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRJbXBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY29yZXRoQWRkcmVzc2VzKVxuICAgICAgICAudG8odGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlU3RhdGUodGVzdERhdGEuZmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgYnVpbGRlcjIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20odW5zaWduZWRIZXgpO1xuICAgICAgYnVpbGRlcjIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMl0gfSk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkVHggPSBhd2FpdCBidWlsZGVyMi5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZEhleCA9IGhhbGZTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgYnVpbGRlcjMgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20oaGFsZlNpZ25lZEhleCk7XG4gICAgICBidWlsZGVyMy5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSB9KTtcbiAgICAgIGNvbnN0IGZ1bGxTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIzLmJ1aWxkKCk7XG4gICAgICBmdWxsU2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIGZ1bGxTaWduZWRUeC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEudHhoYXNoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IG51bWJlciBvZiBzaWduYXR1cmVzIGFmdGVyIGZ1bGwgc2lnbiBmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHRlc3REYXRhLnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIDEgc2lnbmF0dXJlIGFmdGVyIGhhbGYgc2lnbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5zaWduYXR1cmVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgMCBzaWduYXR1cmVzIGZvciB1bnNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJlc2ggYnVpbGQgd2l0aCBkaWZmZXJlbnQgVVRYTyBhZGRyZXNzIG9yZGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IHNldCB1cCBhZGRyZXNzTWFwcyB3aGVuIFVUWE8gYWRkcmVzc2VzIGRpZmZlciBmcm9tIGZyb21BZGRyZXNzZXMgb3JkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRJbXBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY29yZXRoQWRkcmVzc2VzKVxuICAgICAgICAudG8odGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlU3RhdGUodGVzdERhdGEuZmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHR4SnNvbi50eXBlLnNob3VsZC5lcXVhbCgyMyk7XG4gICAgICB0eEpzb24udGhyZXNob2xkLnNob3VsZC5lcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBjb3JyZWN0IHNpZ25hdHVyZXMgd2hlbiBzaWduaW5nIGZyZXNoIGJ1aWxkIHdpdGggZGlmZmVyZW50IGFkZHJlc3Mgb3JkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRJbXBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY29yZXRoQWRkcmVzc2VzKVxuICAgICAgICAudG8odGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlU3RhdGUodGVzdERhdGEuZmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpO1xuXG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMl0gfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0gfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgdHhKc29uLnNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBtYXRjaGluZyB0eCB3aGVuIGZyZXNoIGJ1aWxkIGlzIHBhcnNlZCBhbmQgcmVidWlsdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZyZXNoQnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgLmdldEltcG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5jb3JldGhBZGRyZXNzZXMpXG4gICAgICAgIC50byh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5mZWVTdGF0ZSh0ZXN0RGF0YS5mZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcyk7XG5cbiAgICAgIGNvbnN0IGZyZXNoVHggPSBhd2FpdCBmcmVzaEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGZyZXNoSGV4ID0gZnJlc2hUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKGZyZXNoSGV4KTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgcGFyc2VkQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcGFyc2VkSGV4ID0gcGFyc2VkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgcGFyc2VkSGV4LnNob3VsZC5lcXVhbChmcmVzaEhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBjb21wbGV0ZSBmdWxsIHNpZ24gZmxvdyB3aXRoIGRpZmZlcmVudCBVVFhPIGFkZHJlc3Mgb3JkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTdGVwIDE6IEJ1aWxkIGZyZXNoIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBidWlsZGVyMSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSlcbiAgICAgICAgLmdldEltcG9ydEluUEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5jb3JldGhBZGRyZXNzZXMpXG4gICAgICAgIC50byh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLnNvdXJjZUNoYWluSWQpXG4gICAgICAgIC5mZWVTdGF0ZSh0ZXN0RGF0YS5mZWVTdGF0ZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcyk7XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCBidWlsZGVyMS5idWlsZCgpO1xuICAgICAgY29uc3QgdW5zaWduZWRIZXggPSB1bnNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHVuc2lnbmVkSGV4KTtcbiAgICAgIGJ1aWxkZXIyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzJdIH0pO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRIZXggPSBoYWxmU2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgaGFsZlNpZ25lZFR4LnRvSnNvbigpLnNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcblxuICAgICAgY29uc3QgYnVpbGRlcjMgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpLmZyb20oaGFsZlNpZ25lZEhleCk7XG4gICAgICBidWlsZGVyMy5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSB9KTtcbiAgICAgIGNvbnN0IGZ1bGxTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIzLmJ1aWxkKCk7XG5cbiAgICAgIGZ1bGxTaWduZWRUeC50b0pzb24oKS5zaWduYXR1cmVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG5cbiAgICAgIGNvbnN0IHR4SWQgPSBmdWxsU2lnbmVkVHguaWQ7XG4gICAgICB0eElkLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgdHhJZC5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc2lnbmluZyBpbiBkaWZmZXJlbnQgb3JkZXIgYW5kIHN0aWxsIHByb2R1Y2UgdmFsaWQgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5nZXRJbXBvcnRJblBCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuY29yZXRoQWRkcmVzc2VzKVxuICAgICAgICAudG8odGVzdERhdGEucEFkZHJlc3NlcylcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5zb3VyY2VDaGFpbklkKVxuICAgICAgICAuZmVlU3RhdGUodGVzdERhdGEuZmVlU3RhdGUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpO1xuXG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0gfSk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMl0gfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgdHhKc29uLnNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==