@bitgo/sdk-coin-flrp 1.6.2 → 1.7.2

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.
@@ -123,385 +123,82 @@ describe('Flrp Import In C Tx Builder', () => {
123
123
  },
124
124
  txHash: importInC_1.IMPORT_IN_C.txhash,
125
125
  });
126
- // /**
127
- // * This test verifies the fix for the "insufficient unlocked funds" error that occurred
128
- // * during P-to-C chain transactions.
129
- // *
130
- // * Real-world transaction data:
131
- // * - Input: 100,000,000 nanoFLRP (from P-chain export)
132
- // * - Original feeRate: 500, which caused "needs 280000 more" error
133
- // * - Old (buggy) calculation:
134
- // * - Size: 12,234 (only unsignedTx.toBytes())
135
- // * - Fee: 500 × 12,234 = 6,117,000
136
- // * - Error: "insufficient unlocked funds: needs 280000 more"
137
- // * - Required fee: 6,117,000 + 280,000 = 6,397,000
138
- // *
139
- // * The fix has two parts:
140
- // * 1. Use getSignedTx().toBytes() to include credentials in size calculation (~140+ bytes)
141
- // * 2. Increase feeRate from 500 to 550 to provide additional buffer
142
- // *
143
- // * With fix: size ~12,376 × feeRate 550 = 6,806,800 > 6,397,000 ✓
144
- // */
145
- // it('should calculate sufficient fee to avoid "insufficient unlocked funds" error', async () => {
146
- // const inputAmount = '100000000';
147
- // const feeRate = 550;
148
- // const threshold = 2;
149
- // const pAddresses = [
150
- // 'P-costwo1060n6skw5lsz7ch8z4vnv2s24vetjv5w73g4k2',
151
- // 'P-costwo1kt5hrl4kr5dt92ayxjash6uujkf4nh5ex0y9rj',
152
- // 'P-costwo1eys86hynecjn8400j30e7y706aecv8wz0l875x',
153
- // ];
154
- // const cChainDestination = '0x7e9f3d42cea7e02f62e71559362a0aab32b9328e';
155
- // const utxo: DecodedUtxoObj = {
156
- // outputID: 7,
157
- // amount: inputAmount,
158
- // txid: '2b2A4CyaRawiVAycUhpfvaxizymUT3TwRUbrzwiy3qp7DnKznj',
159
- // outputidx: '0',
160
- // addresses: [
161
- // '0x7e9f3d42cea7e02f62e71559362a0aab32b9328e',
162
- // 'C9207d5c93ce2533d5ef945f9f13cfd773861dc2',
163
- // 'b2e971feb61d1ab2aba434bb0beb9c959359de99',
164
- // ],
165
- // threshold: threshold,
166
- // };
167
- // const txBuilder = factory
168
- // .getImportInCBuilder()
169
- // .threshold(threshold)
170
- // .fromPubKey(pAddresses)
171
- // .utxos([utxo])
172
- // .to(cChainDestination)
173
- // .feeRate(feeRate.toString());
174
- // const tx = await txBuilder.build();
175
- // const feeInfo = (tx as any).fee;
176
- // const calculatedFee = BigInt(feeInfo.fee);
177
- // const calculatedSize = feeInfo.size;
178
- // const oldBuggyFeeAt500 = BigInt(12234) * BigInt(500);
179
- // const shortfall = BigInt(280000);
180
- // const requiredFee = oldBuggyFeeAt500 + shortfall;
181
- // assert(
182
- // calculatedFee >= requiredFee,
183
- // `Fee ${calculatedFee} should be at least ${requiredFee} (old fee ${oldBuggyFeeAt500} + shortfall ${shortfall})`
184
- // );
185
- // const oldBuggySize = 12234;
186
- // assert(
187
- // calculatedSize > oldBuggySize,
188
- // `Size ${calculatedSize} should be greater than old buggy size ${oldBuggySize}`
189
- // );
190
- // const outputAmount = BigInt(tx.outputs[0].value);
191
- // assert(outputAmount > BigInt(0), 'Output amount should be positive');
192
- // const inputBigInt = BigInt(inputAmount);
193
- // const expectedOutput = inputBigInt - calculatedFee;
194
- // assert(
195
- // outputAmount === expectedOutput,
196
- // `Output ${outputAmount} should equal input ${inputBigInt} minus fee ${calculatedFee}`
197
- // );
198
- // });
199
- // it('should match AVAXP costImportTx formula: bytesCost + inputCosts + fixedFee', async () => {
200
- // const inputAmount = '100000000';
201
- // const feeRate = 500;
202
- // const threshold = 2;
203
- // const utxo: DecodedUtxoObj = {
204
- // outputID: 7,
205
- // amount: inputAmount,
206
- // txid: '2b2A4CyaRawiVAycUhpfvaxizymUT3TwRUbrzwiy3qp7DnKznj',
207
- // outputidx: '0',
208
- // addresses: [
209
- // '0x7e9f3d42cea7e02f62e71559362a0aab32b9328e',
210
- // 'C9207d5c93ce2533d5ef945f9f13cfd773861dc2',
211
- // 'b2e971feb61d1ab2aba434bb0beb9c959359de99',
212
- // ],
213
- // threshold: threshold,
214
- // };
215
- // const txBuilder = factory
216
- // .getImportInCBuilder()
217
- // .threshold(threshold)
218
- // .fromPubKey(testData.pAddresses)
219
- // .utxos([utxo])
220
- // .to(testData.to)
221
- // .feeRate(feeRate.toString());
222
- // const tx = await txBuilder.build();
223
- // const feeInfo = (tx as any).fee;
224
- // const calculatedSize = feeInfo.size;
225
- // const expectedInputCost = 1000 * threshold;
226
- // const fixedFee = 10000;
227
- // const expectedMinBytesCost = 200;
228
- // const impliedBytesCost = calculatedSize - expectedInputCost - fixedFee;
229
- // assert(
230
- // impliedBytesCost >= expectedMinBytesCost,
231
- // `Implied bytes cost ${impliedBytesCost} should be at least ${expectedMinBytesCost}`
232
- // );
233
- // const expectedMinTotalSize = expectedMinBytesCost + expectedInputCost + fixedFee;
234
- // assert(
235
- // calculatedSize >= expectedMinTotalSize,
236
- // `Total size ${calculatedSize} should be at least ${expectedMinTotalSize} (bytes + inputCost + fixedFee)`
237
- // );
238
- // });
239
- // it('should produce consistent fees between build and parse (initBuilder vs buildFlareTransaction)', async () => {
240
- // const inputAmount = '100000000';
241
- // const feeRate = 500;
242
- // const threshold = 2;
243
- // const utxo: DecodedUtxoObj = {
244
- // outputID: 7,
245
- // amount: inputAmount,
246
- // txid: '2b2A4CyaRawiVAycUhpfvaxizymUT3TwRUbrzwiy3qp7DnKznj',
247
- // outputidx: '0',
248
- // addresses: [
249
- // '0x7e9f3d42cea7e02f62e71559362a0aab32b9328e',
250
- // 'C9207d5c93ce2533d5ef945f9f13cfd773861dc2',
251
- // 'b2e971feb61d1ab2aba434bb0beb9c959359de99',
252
- // ],
253
- // threshold: threshold,
254
- // };
255
- // const txBuilder = factory
256
- // .getImportInCBuilder()
257
- // .threshold(threshold)
258
- // .fromPubKey(testData.pAddresses)
259
- // .utxos([utxo])
260
- // .to(testData.to)
261
- // .feeRate(feeRate.toString());
262
- // const originalTx = await txBuilder.build();
263
- // const originalFeeInfo = (originalTx as any).fee;
264
- // const originalSize = originalFeeInfo.size;
265
- // const txHex = originalTx.toBroadcastFormat();
266
- // const parsedBuilder = factory.from(txHex);
267
- // const parsedTx = await parsedBuilder.build();
268
- // const parsedFeeInfo = (parsedTx as any).fee;
269
- // const parsedFeeRate = parsedFeeInfo.feeRate;
270
- // const parsedSize = parsedFeeInfo.size;
271
- // const feeRateDiff = Math.abs(parsedFeeRate - feeRate);
272
- // const maxAllowedDiff = 50;
273
- // assert(
274
- // feeRateDiff <= maxAllowedDiff,
275
- // `Parsed feeRate ${parsedFeeRate} should be close to original ${feeRate} (diff: ${feeRateDiff})`
276
- // );
277
- // const sizeDiff = Math.abs(parsedSize - originalSize);
278
- // const maxSizeDiff = 100;
279
- // assert(
280
- // sizeDiff <= maxSizeDiff,
281
- // `Parsed size ${parsedSize} should be close to original ${originalSize} (diff: ${sizeDiff})`
282
- // );
283
- // });
284
- // });
285
- // describe('on-chain verified transactions', () => {
286
- // it('should verify on-chain tx id for signed C-chain import', async () => {
287
- // const signedImportHex =
288
- // '0x0000000000000000007278db5c30bed04c05ce209179812850bbb3fe6d46d7eef3744d814c0da555247900000000000000000000000000000000000000000000000000000000000000000000000162ef0c8ced5668d1230c82e274f5c19357df8c005743367421e8a2b48c73989a0000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000050000000002faf0800000000200000000000000010000000117dbd11b9dd1c9be337353db7c14f9fb3662e5b50000000002aea54058734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000010000000900000002ab32c15c75c763b24adf26eee85aa7d6a76b366e6b88e34b94f76baec91bae7336a32ed637fc232cccb2f772d3092eee66594070a2be92751148feffc76005b1013ee78fb11f3f9ffd90d970cd5c95e9dee611bb4feafaa0b0220cc641ef054c9f5701fde4fad2fe7f2594db9dafd858c62f9cf6fe6b58334d73da40a5a8412d4600';
289
- // const txBuilder = new TransactionBuilderFactory(coins.get('tflrp')).from(signedImportHex);
290
- // const tx = await txBuilder.build();
291
- // const rawTx = tx.toBroadcastFormat();
292
- // rawTx.should.equal(signedImportHex);
293
- // tx.id.should.equal('2ks9vW1SVWD4KsNPHgXnV5dpJaCcaxVNbQW4H7t9BMDxApGvfa');
294
- // });
295
- // it('should FAIL with unsorted UTXO addresses - demonstrates AddressMap mismatch issue for import in C-chain tx', async () => {
296
- // // This test uses UTXO addresses in UNSORTED order to demonstrate the issue.
297
- // // With unsorted addresses, the current implementation will create AddressMaps incorrectly
298
- // // because it uses sequential indices, not UTXO address order.
299
- // //
300
- // // Expected: AddressMap should map addresses to signature slots based on UTXO order (addressesIndex)
301
- // // Current (WRONG): AddressMap uses sequential indices (0, 1, 2...)
302
- // //
303
- // // This test WILL FAIL with current implementation because AddressMaps don't match credential order
304
- // // UTXO addresses in UNSORTED order (different from sorted)
305
- // // Sorted would be: [0x3329... (smallest), 0x7e91... (middle), 0xc732... (largest)]
306
- // // Unsorted: [0xc732... (largest), 0x3329... (smallest), 0x7e91... (middle)]
307
- // const unsortedUtxoAddresses = [
308
- // '0xc7324437c96c7c8a6a152da2385c1db5c3ab1f91', // Largest (would be index 2 if sorted)
309
- // '0x3329be7d01cd3ebaae6654d7327dd9f17a2e1581', // Smallest (would be index 0 if sorted)
310
- // '0x7e918a5e8083ae4c9f2f0ed77055c24bf3665001', // Middle (would be index 1 if sorted)
311
- // ];
312
- // // Corresponding P-chain addresses (in same order as _fromAddresses)
313
- // const pAddresses = [
314
- // 'P-costwo1xv5mulgpe5lt4tnx2ntnylwe79azu9vpja6lut', // Maps to 0xc732... (UTXO index 0 in unsorted)
315
- // 'P-costwo106gc5h5qswhye8e0pmthq4wzf0ekv5qppsrvpu', // Maps to 0x3329... (UTXO index 1 in unsorted)
316
- // 'P-costwo1cueygd7fd37g56s49k3rshqakhp6k8u3adzt6m', // Maps to 0x7e91... (UTXO index 2 in unsorted)
317
- // ];
318
- // // Create UTXO with UNSORTED addresses
319
- // const amount = '500000000'; // 0.5 FLR
320
- // const fee = '5000000'; // Example fee
321
- // const utxoAmount = (BigInt(amount) + BigInt(fee) + BigInt('10000000')).toString(); // amount + fee + some buffer
322
- // const utxo: DecodedUtxoObj = {
323
- // outputID: 0,
324
- // amount: utxoAmount,
325
- // txid: '2vPMx8P63adgBae7GAWFx7qvJDwRmMnDCyKddHRBXWhysjX4BP',
326
- // outputidx: '1',
327
- // addresses: unsortedUtxoAddresses, // UNSORTED order
328
- // threshold: 2,
329
- // };
330
- // // Build transaction
331
- // const txBuilder = factory
332
- // .getImportInCBuilder()
333
- // .threshold(2)
334
- // .fromPubKey(pAddresses)
335
- // .utxos([utxo])
336
- // .to(testData.to)
337
- // .feeRate(testData.fee);
338
- // // Build unsigned transaction
339
- // const unsignedTx = await txBuilder.build();
340
- // const unsignedHex = unsignedTx.toBroadcastFormat();
341
- // // Get AddressMaps from the ORIGINAL transaction (before parsing)
342
- // // The parsed transaction's AddressMap only contains the output address, not _fromAddresses
343
- // const originalFlareTx = (unsignedTx as any)._flareTransaction;
344
- // const originalAddressMaps = (originalFlareTx as any as UnsignedTx).addressMaps;
345
- // // Parse it back to inspect AddressMaps and credentials
346
- // const parsedBuilder = factory.from(unsignedHex);
347
- // const parsedTx = await parsedBuilder.build();
348
- // const flareTx = (parsedTx as any)._flareTransaction;
349
- // // Get the input to check sigIndicies (for C-chain imports, inputs are importedInputs)
350
- // const importTx = flareTx.tx as any;
351
- // const input = importTx.importedInputs[0];
352
- // const sigIndicies = input.sigIndicies();
353
- // // sigIndicies tells us: sigIndicies[slotIndex] = utxoAddressIndex
354
- // // For threshold=2, we need signatures for first 2 addresses in UTXO order
355
- // // UTXO order: [0xc732... (index 0), 0x3329... (index 1), 0x7e91... (index 2)]
356
- // // So sigIndicies should be [0, 1] meaning: slot 0 = UTXO index 0, slot 1 = UTXO index 1
357
- // // Verify sigIndicies are [0, 1] (first 2 addresses in UTXO order, NOT sorted order)
358
- // sigIndicies.length.should.equal(2);
359
- // sigIndicies[0].should.equal(0, 'First signature slot should be UTXO address index 0 (0xc732...)');
360
- // sigIndicies[1].should.equal(1, 'Second signature slot should be UTXO address index 1 (0x3329...)');
361
- // // The critical test: Verify that signature slots have embedded addresses based on UTXO order
362
- // // With unsorted UTXO addresses, this will FAIL if AddressMaps don't match UTXO order
363
- // //
364
- // // Parse the credential to see which slots have which embedded addresses
365
- // const credential = flareTx.credentials[0];
366
- // const signatures = credential.getSignatures();
367
- // // Extract embedded addresses from signature slots
368
- // const embeddedAddresses: string[] = [];
369
- // const isEmptySignature = (signature: string): boolean => {
370
- // return !!signature && testUtils.removeHexPrefix(signature).startsWith('0'.repeat(90));
371
- // };
372
- // const hasEmbeddedAddress = (signature: string): boolean => {
373
- // if (!isEmptySignature(signature)) return false;
374
- // const cleanSig = testUtils.removeHexPrefix(signature);
375
- // if (cleanSig.length < 130) return false;
376
- // const embeddedPart = cleanSig.substring(90, 130);
377
- // // Check if embedded part is not all zeros
378
- // return embeddedPart !== '0'.repeat(40);
379
- // };
380
- // signatures.forEach((sig: string, slotIndex: number) => {
381
- // if (hasEmbeddedAddress(sig)) {
382
- // // Extract embedded address (after position 90, 40 chars = 20 bytes)
383
- // const cleanSig = testUtils.removeHexPrefix(sig);
384
- // const embeddedAddr = cleanSig.substring(90, 130).toLowerCase();
385
- // embeddedAddresses[slotIndex] = '0x' + embeddedAddr;
386
- // }
387
- // });
388
- // // Verify: Credentials only embed ONE address (user/recovery), not both
389
- // // The embedded address should be based on addressesIndex logic, not sequential order
390
- // //
391
- // // Compute addressesIndex to determine expected signature order
392
- // const utxoAddressBytes = unsortedUtxoAddresses.map((addr) => testUtils.parseAddress(addr));
393
- // const pAddressBytes = pAddresses.map((addr) => testUtils.parseAddress(addr));
394
- // const addressesIndex: number[] = [];
395
- // pAddressBytes.forEach((pAddr) => {
396
- // const utxoIndex = utxoAddressBytes.findIndex(
397
- // (uAddr) => Buffer.compare(Buffer.from(uAddr), Buffer.from(pAddr)) === 0
398
- // );
399
- // addressesIndex.push(utxoIndex);
400
- // });
401
- // // firstIndex = 0 (user), bitgoIndex = 1
402
- // const firstIndex = 0;
403
- // const bitgoIndex = 1;
404
- // // Determine expected signature order based on addressesIndex
405
- // const userComesFirst = addressesIndex[bitgoIndex] > addressesIndex[firstIndex];
406
- // // Expected credential structure:
407
- // // - If user comes first: [userAddress, zeros]
408
- // // - If bitgo comes first: [zeros, userAddress]
409
- // const userAddressHex = Buffer.from(pAddressBytes[firstIndex]).toString('hex').toLowerCase();
410
- // const expectedUserAddr = '0x' + userAddressHex;
411
- // if (userComesFirst) {
412
- // // Expected: [userAddress, zeros]
413
- // // Slot 0 should have user address (pAddr0 = 0xc732... = UTXO index 0)
414
- // if (embeddedAddresses[0]) {
415
- // embeddedAddresses[0]
416
- // .toLowerCase()
417
- // .should.equal(
418
- // expectedUserAddr,
419
- // `Slot 0 should have user address (${expectedUserAddr}) because user comes first in UTXO order`
420
- // );
421
- // } else {
422
- // throw new Error(`Slot 0 should have embedded user address, but is empty`);
423
- // }
424
- // // Slot 1 should be zeros (no embedded address)
425
- // if (embeddedAddresses[1]) {
426
- // throw new Error(`Slot 1 should be zeros, but has embedded address: ${embeddedAddresses[1]}`);
427
- // }
428
- // } else {
429
- // // Expected: [zeros, userAddress]
430
- // // Slot 0 should be zeros
431
- // if (embeddedAddresses[0]) {
432
- // throw new Error(`Slot 0 should be zeros, but has embedded address: ${embeddedAddresses[0]}`);
433
- // }
434
- // // Slot 1 should have user address
435
- // if (embeddedAddresses[1]) {
436
- // embeddedAddresses[1]
437
- // .toLowerCase()
438
- // .should.equal(
439
- // expectedUserAddr,
440
- // `Slot 1 should have user address (${expectedUserAddr}) because bitgo comes first in UTXO order`
441
- // );
442
- // } else {
443
- // throw new Error(`Slot 1 should have embedded user address, but is empty`);
444
- // }
445
- // }
446
- // // The key verification: AddressMaps should match the credential order
447
- // // Current implementation (WRONG): AddressMaps use sequential indices (0, 1, 2...)
448
- // // Expected (CORRECT): AddressMaps should use addressesIndex logic, matching credential order
449
- // //
450
- // // Get AddressMaps from the ORIGINAL transaction (not parsed, because parsed AddressMap only has output address)
451
- // // For C-chain imports, originalFlareTx is EVMUnsignedTx which has addressMaps property
452
- // const addressMaps = originalAddressMaps;
453
- // addressMaps.toArray().length.should.equal(1, 'Should have one AddressMap for one input');
454
- // const addressMap = addressMaps.toArray()[0];
455
- // // Expected: Based on addressesIndex logic
456
- // // If user comes first: slot 0 = user, slot 1 = bitgo
457
- // // If bitgo comes first: slot 0 = bitgo, slot 1 = user
458
- // const expectedSlot0Addr = userComesFirst ? pAddressBytes[firstIndex] : pAddressBytes[bitgoIndex];
459
- // const expectedSlot1Addr = userComesFirst ? pAddressBytes[bitgoIndex] : pAddressBytes[firstIndex];
460
- // // AddressMap maps: Address -> slot index
461
- // // We need to check which addresses are mapped to slots 0 and 1
462
- // // AddressMap.get() returns the slot index for a given address
463
- // // Verify that AddressMap correctly maps addresses based on credential order (UTXO order)
464
- // // The AddressMap should map the addresses that appear in credentials to the correct slots
465
- // const { Address } = require('@flarenetwork/flarejs');
466
- // const expectedSlot0Address = new Address(expectedSlot0Addr);
467
- // const expectedSlot1Address = new Address(expectedSlot1Addr);
468
- // const expectedSlot0FromMap = addressMap.get(expectedSlot0Address);
469
- // const expectedSlot1FromMap = addressMap.get(expectedSlot1Address);
470
- // // Verify that the expected addresses map to the correct slots
471
- // if (expectedSlot0FromMap === undefined) {
472
- // throw new Error(`Address at UTXO index ${addressesIndex[firstIndex]} not found in AddressMap`);
473
- // }
474
- // if (expectedSlot1FromMap === undefined) {
475
- // throw new Error(`Address at UTXO index ${addressesIndex[bitgoIndex]} not found in AddressMap`);
476
- // }
477
- // expectedSlot0FromMap.should.equal(0, `Address at UTXO index ${addressesIndex[firstIndex]} should map to slot 0`);
478
- // expectedSlot1FromMap.should.equal(1, `Address at UTXO index ${addressesIndex[bitgoIndex]} should map to slot 1`);
479
- // // If addressesIndex is not sequential ([0, 1, ...]), verify that sequential mapping is NOT used incorrectly
480
- // // Sequential mapping means: pAddresses[0] -> slot 0, pAddresses[1] -> slot 1, regardless of UTXO order
481
- // const usesSequentialMapping = addressesIndex[0] === 0 && addressesIndex[1] === 1;
482
- // if (!usesSequentialMapping) {
483
- // // Check if AddressMap uses sequential mapping (array order) instead of UTXO order
484
- // const sequentialSlot0 = addressMap.get(new Address(pAddressBytes[0]));
485
- // const sequentialSlot1 = addressMap.get(new Address(pAddressBytes[1]));
486
- // // Sequential mapping would map pAddresses[0] -> slot 0, pAddresses[1] -> slot 1
487
- // // But we want UTXO order mapping based on addressesIndex
488
- // const isSequential = sequentialSlot0 === 0 && sequentialSlot1 === 1;
489
- // // Check if pAddresses[0] and pAddresses[1] are the expected addresses for slots 0 and 1
490
- // // If they are, then sequential mapping happens to be correct (by coincidence)
491
- // const pAddress0IsExpectedSlot0 =
492
- // Buffer.compare(Buffer.from(pAddressBytes[0]), Buffer.from(expectedSlot0Addr)) === 0;
493
- // const pAddress1IsExpectedSlot1 =
494
- // Buffer.compare(Buffer.from(pAddressBytes[1]), Buffer.from(expectedSlot1Addr)) === 0;
495
- // // If sequential mapping is used but it's NOT correct (doesn't match expected addresses), fail
496
- // if (isSequential && (!pAddress0IsExpectedSlot0 || !pAddress1IsExpectedSlot1)) {
497
- // throw new Error(
498
- // `AddressMap uses sequential mapping (array order) but should use UTXO order. ` +
499
- // `addressesIndex: [${addressesIndex.join(', ')}]. ` +
500
- // `Expected slot 0 = address at UTXO index ${addressesIndex[firstIndex]}, slot 1 = address at UTXO index ${addressesIndex[bitgoIndex]}`
501
- // );
502
- // }
503
- // }
504
- // });
505
- // });
126
+ describe('addressesIndex extraction and signature slot mapping for ImportInC', () => {
127
+ it('should correctly parse half-signed ImportInC tx and add second signature', async () => {
128
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.halfSigntxHex);
129
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
130
+ const tx = await txBuilder.build();
131
+ const rawTx = tx.toBroadcastFormat();
132
+ rawTx.should.equal(importInC_1.IMPORT_IN_C.fullSigntxHex);
133
+ tx.id.should.equal(importInC_1.IMPORT_IN_C.txhash);
134
+ });
135
+ it('should preserve transaction structure when parsing unsigned ImportInC tx', async () => {
136
+ const parsedBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
137
+ const parsedTx = await parsedBuilder.build();
138
+ const parsedHex = parsedTx.toBroadcastFormat();
139
+ parsedHex.should.equal(importInC_1.IMPORT_IN_C.unsignedHex);
140
+ });
141
+ it('should correctly handle ImportInC signing flow: parse -> sign -> parse -> sign', async () => {
142
+ // Step 1: unsigned transaction
143
+ const builder1 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
144
+ const unsignedTx = await builder1.build();
145
+ const unsignedHex = unsignedTx.toBroadcastFormat();
146
+ unsignedHex.should.equal(importInC_1.IMPORT_IN_C.unsignedHex);
147
+ const builder2 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(unsignedHex);
148
+ builder2.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[2] });
149
+ const halfSignedTx = await builder2.build();
150
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
151
+ const builder3 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(halfSignedHex);
152
+ builder3.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
153
+ const fullSignedTx = await builder3.build();
154
+ fullSignedTx.toBroadcastFormat().should.equal(importInC_1.IMPORT_IN_C.fullSigntxHex);
155
+ fullSignedTx.id.should.equal(importInC_1.IMPORT_IN_C.txhash);
156
+ });
157
+ it('should have correct number of signatures for ImportInC after full sign flow', async () => {
158
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.fullSigntxHex);
159
+ const tx = await txBuilder.build();
160
+ const txJson = tx.toJson();
161
+ txJson.signatures.length.should.equal(2);
162
+ });
163
+ it('should have correct number of signatures for ImportInC half-signed tx', async () => {
164
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.halfSigntxHex);
165
+ const tx = await txBuilder.build();
166
+ const txJson = tx.toJson();
167
+ txJson.signatures.length.should.equal(1);
168
+ });
169
+ it('should have 0 signatures for unsigned ImportInC tx', async () => {
170
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
171
+ const tx = await txBuilder.build();
172
+ const txJson = tx.toJson();
173
+ txJson.signatures.length.should.equal(0);
174
+ });
175
+ });
176
+ describe('fresh build with different UTXO address order for ImportInC', () => {
177
+ it('should correctly complete full sign flow with different UTXO address order for ImportInC', async () => {
178
+ const builder1 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
179
+ const unsignedTx = await builder1.build();
180
+ const unsignedHex = unsignedTx.toBroadcastFormat();
181
+ const builder2 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(unsignedHex);
182
+ builder2.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[2] });
183
+ const halfSignedTx = await builder2.build();
184
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
185
+ halfSignedTx.toJson().signatures.length.should.equal(1);
186
+ const builder3 = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(halfSignedHex);
187
+ builder3.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
188
+ const fullSignedTx = await builder3.build();
189
+ fullSignedTx.toJson().signatures.length.should.equal(2);
190
+ const txId = fullSignedTx.id;
191
+ txId.should.be.a.String();
192
+ txId.length.should.be.greaterThan(0);
193
+ });
194
+ it('should handle ImportInC signing in different order and still produce valid tx', async () => {
195
+ const txBuilder = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(importInC_1.IMPORT_IN_C.unsignedHex);
196
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[0] });
197
+ txBuilder.sign({ key: importInC_1.IMPORT_IN_C.privateKeys[2] });
198
+ const tx = await txBuilder.build();
199
+ const txJson = tx.toJson();
200
+ txJson.signatures.length.should.equal(2);
201
+ });
202
+ });
506
203
  });
507
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLDBDQUE2RDtBQUM3RCw0Q0FBdUM7QUFDdkMseUVBQW9GO0FBQ3BGLDBFQUE4QztBQUU5QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWxFLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDekMsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNoRCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QixDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssNkJBQTZCLENBQ3hELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNyRCxNQUFNLFNBQVMsR0FBRyxPQUFPO2lCQUN0QixtQkFBbUIsRUFBRTtpQkFDckIsU0FBUyxDQUFDLHVCQUFRLENBQUMsU0FBUyxDQUFDO2lCQUM3QixVQUFVLENBQUMsdUJBQVEsQ0FBQyxVQUFVLENBQUM7aUJBQy9CLFlBQVksQ0FBQyx1QkFBUSxDQUFDLEtBQUssQ0FBQztpQkFDNUIsR0FBRyxDQUFDLHVCQUFRLENBQUMsR0FBRyxDQUFDO2lCQUNqQixPQUFPLENBQUMs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O1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBJTVBPUlRfSU5fQyBhcyB0ZXN0RGF0YSB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy90cmFuc2FjdGlvbkRhdGEvaW1wb3J0SW5DJztcbmltcG9ydCBzaWduRmxvd1Rlc3QgZnJvbSAnLi9zaWduRmxvd1Rlc3RTdWl0JztcblxuZGVzY3JpYmUoJ0ZscnAgSW1wb3J0IEluIEMgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHR4QnVpbGRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW10pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdVVFhPcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0byBhZGRyZXNzIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KTtcbiAgICAgIC8vIHRvIGlzIE5PVCBzZXRcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgndG8gaXMgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgY29udGV4dCBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHRlc3REYXRhLnV0eG9zKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKTtcbiAgICAgIC8vIGNvbnRleHQgaXMgTk9UIHNldFxuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdjb250ZXh0IGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGZyb21BZGRyZXNzZXMgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcylcbiAgICAgICAgLnRvKHRlc3REYXRhLnRvKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dCk7XG4gICAgICAvLyBmcm9tUHViS2V5IGlzIE5PVCBzZXRcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnZnJvbUFkZHJlc3NlcyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgVVRYT3MgYXJlIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgICAgICAgLmZlZSh0ZXN0RGF0YS5mZWUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpO1xuICAgICAgLy8gdXR4b3MgaXMgTk9UIHNldFxuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdVVFhPcyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHV0eG9zIGhleCBhcnJheSBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5kZWNvZGVkVXR4b3MoW10pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdVVFhPcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggaW52YWxpZCB0aHJlc2hvbGQgdmFsdWUgKDApJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnRocmVzaG9sZCgwKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCd0aHJlc2hvbGQnKSB8fCBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2dyZWF0ZXInKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgdGhyZXNob2xkIHZhbHVlIChuZWdhdGl2ZSknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudGhyZXNob2xkKC0xKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCd0aHJlc2hvbGQnKSB8fCBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2dyZWF0ZXInKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgdG8gYWRkcmVzcyBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudG8oJ2ludmFsaWQtYWRkcmVzcycpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQnKSB8fCBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2FkZHJlc3MnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIHRvIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgICgoKSA9PiB0eEJ1aWxkZXIudG8odGVzdERhdGEudG8pKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCB0aHJlc2hvbGQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgICgoKSA9PiB0eEJ1aWxkZXIudGhyZXNob2xkKDIpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBjb250ZXh0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAoKCkgPT4gdHhCdWlsZGVyLmNvbnRleHQodGVzdERhdGEuY29udGV4dCkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIGZyb21QdWJLZXkgYWRkcmVzc2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAoKCkgPT4gdHhCdWlsZGVyLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcykpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdJbXBvcnQgQzJQJyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHRlc3REYXRhLnV0eG9zKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS51bnNpZ25lZEhleCxcbiAgICBoYWxmU2lnbmVkVHhIZXg6IHRlc3REYXRhLmhhbGZTaWdudHhIZXgsXG4gICAgZnVsbFNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5mdWxsU2lnbnR4SGV4LFxuICAgIHByaXZhdGVLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLnByaXZhdGVLZXlzWzJdLFxuICAgICAgcHJ2MjogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0sXG4gICAgfSxcbiAgICB0eEhhc2g6IHRlc3REYXRhLnR4aGFzaCxcbiAgfSk7XG4gIC8vICAgLyoqXG4gIC8vICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBmaXggZm9yIHRoZSBcImluc3VmZmljaWVudCB1bmxvY2tlZCBmdW5kc1wiIGVycm9yIHRoYXQgb2NjdXJyZWRcbiAgLy8gICAgKiBkdXJpbmcgUC10by1DIGNoYWluIHRyYW5zYWN0aW9ucy5cbiAgLy8gICAgKlxuICAvLyAgICAqIFJlYWwtd29ybGQgdHJhbnNhY3Rpb24gZGF0YTpcbiAgLy8gICAgKiAtIElucHV0OiAxMDAsMDAwLDAwMCBuYW5vRkxSUCAoZnJvbSBQLWNoYWluIGV4cG9ydClcbiAgLy8gICAgKiAtIE9yaWdpbmFsIGZlZVJhdGU6IDUwMCwgd2hpY2ggY2F1c2VkIFwibmVlZHMgMjgwMDAwIG1vcmVcIiBlcnJvclxuICAvLyAgICAqIC0gT2xkIChidWdneSkgY2FsY3VsYXRpb246XG4gIC8vICAgICogICAtIFNpemU6IDEyLDIzNCAob25seSB1bnNpZ25lZFR4LnRvQnl0ZXMoKSlcbiAgLy8gICAgKiAgIC0gRmVlOiA1MDAgw5cgMTIsMjM0ID0gNiwxMTcsMDAwXG4gIC8vICAgICogLSBFcnJvcjogXCJpbnN1ZmZpY2llbnQgdW5sb2NrZWQgZnVuZHM6IG5lZWRzIDI4MDAwMCBtb3JlXCJcbiAgLy8gICAgKiAtIFJlcXVpcmVkIGZlZTogNiwxMTcsMDAwICsgMjgwLDAwMCA9IDYsMzk3LDAwMFxuICAvLyAgICAqXG4gIC8vICAgICogVGhlIGZpeCBoYXMgdHdvIHBhcnRzOlxuICAvLyAgICAqIDEuIFVzZSBnZXRTaWduZWRUeCgpLnRvQnl0ZXMoKSB0byBpbmNsdWRlIGNyZWRlbnRpYWxzIGluIHNpemUgY2FsY3VsYXRpb24gKH4xNDArIGJ5dGVzKVxuICAvLyAgICAqIDIuIEluY3JlYXNlIGZlZVJhdGUgZnJvbSA1MDAgdG8gNTUwIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBidWZmZXJcbiAgLy8gICAgKlxuICAvLyAgICAqIFdpdGggZml4OiBzaXplIH4xMiwzNzYgw5cgZmVlUmF0ZSA1NTAgPSA2LDgwNiw4MDAgPiA2LDM5NywwMDAg4pyTXG4gIC8vICAgICovXG4gIC8vICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgc3VmZmljaWVudCBmZWUgdG8gYXZvaWQgXCJpbnN1ZmZpY2llbnQgdW5sb2NrZWQgZnVuZHNcIiBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgLy8gICAgIGNvbnN0IGlucHV0QW1vdW50ID0gJzEwMDAwMDAwMCc7XG4gIC8vICAgICBjb25zdCBmZWVSYXRlID0gNTUwO1xuICAvLyAgICAgY29uc3QgdGhyZXNob2xkID0gMjtcblxuICAvLyAgICAgY29uc3QgcEFkZHJlc3NlcyA9IFtcbiAgLy8gICAgICAgJ1AtY29zdHdvMTA2MG42c2t3NWxzejdjaDh6NHZudjJzMjR2ZXRqdjV3NzNnNGsyJyxcbiAgLy8gICAgICAgJ1AtY29zdHdvMWt0NWhybDRrcjVkdDkyYXl4amFzaDZ1dWprZjRuaDVleDB5OXJqJyxcbiAgLy8gICAgICAgJ1AtY29zdHdvMWV5czg2aHluZWNqbjg0MDBqMzBlN3k3MDZhZWN2OHd6MGw4NzV4JyxcbiAgLy8gICAgIF07XG5cbiAgLy8gICAgIGNvbnN0IGNDaGFpbkRlc3RpbmF0aW9uID0gJzB4N2U5ZjNkNDJjZWE3ZTAyZjYyZTcxNTU5MzYyYTBhYWIzMmI5MzI4ZSc7XG5cbiAgLy8gICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAvLyAgICAgICBvdXRwdXRJRDogNyxcbiAgLy8gICAgICAgYW1vdW50OiBpbnB1dEFtb3VudCxcbiAgLy8gICAgICAgdHhpZDogJzJiMkE0Q3lhUmF3aVZBeWNVaHBmdmF4aXp5bVVUM1R3UlVicnp3aXkzcXA3RG5Lem5qJyxcbiAgLy8gICAgICAgb3V0cHV0aWR4OiAnMCcsXG4gIC8vICAgICAgIGFkZHJlc3NlczogW1xuICAvLyAgICAgICAgICcweDdlOWYzZDQyY2VhN2UwMmY2MmU3MTU1OTM2MmEwYWFiMzJiOTMyOGUnLFxuICAvLyAgICAgICAgICdDOTIwN2Q1YzkzY2UyNTMzZDVlZjk0NWY5ZjEzY2ZkNzczODYxZGMyJyxcbiAgLy8gICAgICAgICAnYjJlOTcxZmViNjFkMWFiMmFiYTQzNGJiMGJlYjljOTU5MzU5ZGU5OScsXG4gIC8vICAgICAgIF0sXG4gIC8vICAgICAgIHRocmVzaG9sZDogdGhyZXNob2xkLFxuICAvLyAgICAgfTtcblxuICAvLyAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAvLyAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gIC8vICAgICAgIC50aHJlc2hvbGQodGhyZXNob2xkKVxuICAvLyAgICAgICAuZnJvbVB1YktleShwQWRkcmVzc2VzKVxuICAvLyAgICAgICAudXR4b3MoW3V0eG9dKVxuICAvLyAgICAgICAudG8oY0NoYWluRGVzdGluYXRpb24pXG4gIC8vICAgICAgIC5mZWVSYXRlKGZlZVJhdGUudG9TdHJpbmcoKSk7XG5cbiAgLy8gICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gIC8vICAgICBjb25zdCBmZWVJbmZvID0gKHR4IGFzIGFueSkuZmVlO1xuICAvLyAgICAgY29uc3QgY2FsY3VsYXRlZEZlZSA9IEJpZ0ludChmZWVJbmZvLmZlZSk7XG4gIC8vICAgICBjb25zdCBjYWxjdWxhdGVkU2l6ZSA9IGZlZUluZm8uc2l6ZTtcblxuICAvLyAgICAgY29uc3Qgb2xkQnVnZ3lGZWVBdDUwMCA9IEJpZ0ludCgxMjIzNCkgKiBCaWdJbnQoNTAwKTtcbiAgLy8gICAgIGNvbnN0IHNob3J0ZmFsbCA9IEJpZ0ludCgyODAwMDApO1xuICAvLyAgICAgY29uc3QgcmVxdWlyZWRGZWUgPSBvbGRCdWdneUZlZUF0NTAwICsgc2hvcnRmYWxsO1xuXG4gIC8vICAgICBhc3NlcnQoXG4gIC8vICAgICAgIGNhbGN1bGF0ZWRGZWUgPj0gcmVxdWlyZWRGZWUsXG4gIC8vICAgICAgIGBGZWUgJHtjYWxjdWxhdGVkRmVlfSBzaG91bGQgYmUgYXQgbGVhc3QgJHtyZXF1aXJlZEZlZX0gKG9sZCBmZWUgJHtvbGRCdWdneUZlZUF0NTAwfSArIHNob3J0ZmFsbCAke3Nob3J0ZmFsbH0pYFxuICAvLyAgICAgKTtcblxuICAvLyAgICAgY29uc3Qgb2xkQnVnZ3lTaXplID0gMTIyMzQ7XG4gIC8vICAgICBhc3NlcnQoXG4gIC8vICAgICAgIGNhbGN1bGF0ZWRTaXplID4gb2xkQnVnZ3lTaXplLFxuICAvLyAgICAgICBgU2l6ZSAke2NhbGN1bGF0ZWRTaXplfSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9sZCBidWdneSBzaXplICR7b2xkQnVnZ3lTaXplfWBcbiAgLy8gICAgICk7XG5cbiAgLy8gICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IEJpZ0ludCh0eC5vdXRwdXRzWzBdLnZhbHVlKTtcbiAgLy8gICAgIGFzc2VydChvdXRwdXRBbW91bnQgPiBCaWdJbnQoMCksICdPdXRwdXQgYW1vdW50IHNob3VsZCBiZSBwb3NpdGl2ZScpO1xuXG4gIC8vICAgICBjb25zdCBpbnB1dEJpZ0ludCA9IEJpZ0ludChpbnB1dEFtb3VudCk7XG4gIC8vICAgICBjb25zdCBleHBlY3RlZE91dHB1dCA9IGlucHV0QmlnSW50IC0gY2FsY3VsYXRlZEZlZTtcbiAgLy8gICAgIGFzc2VydChcbiAgLy8gICAgICAgb3V0cHV0QW1vdW50ID09PSBleHBlY3RlZE91dHB1dCxcbiAgLy8gICAgICAgYE91dHB1dCAke291dHB1dEFtb3VudH0gc2hvdWxkIGVxdWFsIGlucHV0ICR7aW5wdXRCaWdJbnR9IG1pbnVzIGZlZSAke2NhbGN1bGF0ZWRGZWV9YFxuICAvLyAgICAgKTtcbiAgLy8gICB9KTtcblxuICAvLyAgIGl0KCdzaG91bGQgbWF0Y2ggQVZBWFAgY29zdEltcG9ydFR4IGZvcm11bGE6IGJ5dGVzQ29zdCArIGlucHV0Q29zdHMgKyBmaXhlZEZlZScsIGFzeW5jICgpID0+IHtcbiAgLy8gICAgIGNvbnN0IGlucHV0QW1vdW50ID0gJzEwMDAwMDAwMCc7XG4gIC8vICAgICBjb25zdCBmZWVSYXRlID0gNTAwO1xuICAvLyAgICAgY29uc3QgdGhyZXNob2xkID0gMjtcblxuICAvLyAgICAgY29uc3QgdXR4bzogRGVjb2RlZFV0eG9PYmogPSB7XG4gIC8vICAgICAgIG91dHB1dElEOiA3LFxuICAvLyAgICAgICBhbW91bnQ6IGlucHV0QW1vdW50LFxuICAvLyAgICAgICB0eGlkOiAnMmIyQTRDeWFSYXdpVkF5Y1VocGZ2YXhpenltVVQzVHdSVWJyendpeTNxcDdEbkt6bmonLFxuICAvLyAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgLy8gICAgICAgYWRkcmVzc2VzOiBbXG4gIC8vICAgICAgICAgJzB4N2U5ZjNkNDJjZWE3ZTAyZjYyZTcxNTU5MzYyYTBhYWIzMmI5MzI4ZScsXG4gIC8vICAgICAgICAgJ0M5MjA3ZDVjOTNjZTI1MzNkNWVmOTQ1ZjlmMTNjZmQ3NzM4NjFkYzInLFxuICAvLyAgICAgICAgICdiMmU5NzFmZWI2MWQxYWIyYWJhNDM0YmIwYmViOWM5NTkzNTlkZTk5JyxcbiAgLy8gICAgICAgXSxcbiAgLy8gICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGQsXG4gIC8vICAgICB9O1xuXG4gIC8vICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gIC8vICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgLy8gICAgICAgLnRocmVzaG9sZCh0aHJlc2hvbGQpXG4gIC8vICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gIC8vICAgICAgIC51dHhvcyhbdXR4b10pXG4gIC8vICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgLy8gICAgICAgLmZlZVJhdGUoZmVlUmF0ZS50b1N0cmluZygpKTtcblxuICAvLyAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgLy8gICAgIGNvbnN0IGZlZUluZm8gPSAodHggYXMgYW55KS5mZWU7XG4gIC8vICAgICBjb25zdCBjYWxjdWxhdGVkU2l6ZSA9IGZlZUluZm8uc2l6ZTtcblxuICAvLyAgICAgY29uc3QgZXhwZWN0ZWRJbnB1dENvc3QgPSAxMDAwICogdGhyZXNob2xkO1xuICAvLyAgICAgY29uc3QgZml4ZWRGZWUgPSAxMDAwMDtcbiAgLy8gICAgIGNvbnN0IGV4cGVjdGVkTWluQnl0ZXNDb3N0ID0gMjAwO1xuXG4gIC8vICAgICBjb25zdCBpbXBsaWVkQnl0ZXNDb3N0ID0gY2FsY3VsYXRlZFNpemUgLSBleHBlY3RlZElucHV0Q29zdCAtIGZpeGVkRmVlO1xuXG4gIC8vICAgICBhc3NlcnQoXG4gIC8vICAgICAgIGltcGxpZWRCeXRlc0Nvc3QgPj0gZXhwZWN0ZWRNaW5CeXRlc0Nvc3QsXG4gIC8vICAgICAgIGBJbXBsaWVkIGJ5dGVzIGNvc3QgJHtpbXBsaWVkQnl0ZXNDb3N0fSBzaG91bGQgYmUgYXQgbGVhc3QgJHtleHBlY3RlZE1pbkJ5dGVzQ29zdH1gXG4gIC8vICAgICApO1xuXG4gIC8vICAgICBjb25zdCBleHBlY3RlZE1pblRvdGFsU2l6ZSA9IGV4cGVjdGVkTWluQnl0ZXNDb3N0ICsgZXhwZWN0ZWRJbnB1dENvc3QgKyBmaXhlZEZlZTtcbiAgLy8gICAgIGFzc2VydChcbiAgLy8gICAgICAgY2FsY3VsYXRlZFNpemUgPj0gZXhwZWN0ZWRNaW5Ub3RhbFNpemUsXG4gIC8vICAgICAgIGBUb3RhbCBzaXplICR7Y2FsY3VsYXRlZFNpemV9IHNob3VsZCBiZSBhdCBsZWFzdCAke2V4cGVjdGVkTWluVG90YWxTaXplfSAoYnl0ZXMgKyBpbnB1dENvc3QgKyBmaXhlZEZlZSlgXG4gIC8vICAgICApO1xuICAvLyAgIH0pO1xuXG4gIC8vICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGNvbnNpc3RlbnQgZmVlcyBiZXR3ZWVuIGJ1aWxkIGFuZCBwYXJzZSAoaW5pdEJ1aWxkZXIgdnMgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKScsIGFzeW5jICgpID0+IHtcbiAgLy8gICAgIGNvbnN0IGlucHV0QW1vdW50ID0gJzEwMDAwMDAwMCc7XG4gIC8vICAgICBjb25zdCBmZWVSYXRlID0gNTAwO1xuICAvLyAgICAgY29uc3QgdGhyZXNob2xkID0gMjtcblxuICAvLyAgICAgY29uc3QgdXR4bzogRGVjb2RlZFV0eG9PYmogPSB7XG4gIC8vICAgICAgIG91dHB1dElEOiA3LFxuICAvLyAgICAgICBhbW91bnQ6IGlucHV0QW1vdW50LFxuICAvLyAgICAgICB0eGlkOiAnMmIyQTRDeWFSYXdpVkF5Y1VocGZ2YXhpenltVVQzVHdSVWJyendpeTNxcDdEbkt6bmonLFxuICAvLyAgICAgICBvdXRwdXRpZHg6ICcwJyxcbiAgLy8gICAgICAgYWRkcmVzc2VzOiBbXG4gIC8vICAgICAgICAgJzB4N2U5ZjNkNDJjZWE3ZTAyZjYyZTcxNTU5MzYyYTBhYWIzMmI5MzI4ZScsXG4gIC8vICAgICAgICAgJ0M5MjA3ZDVjOTNjZTI1MzNkNWVmOTQ1ZjlmMTNjZmQ3NzM4NjFkYzInLFxuICAvLyAgICAgICAgICdiMmU5NzFmZWI2MWQxYWIyYWJhNDM0YmIwYmViOWM5NTkzNTlkZTk5JyxcbiAgLy8gICAgICAgXSxcbiAgLy8gICAgICAgdGhyZXNob2xkOiB0aHJlc2hvbGQsXG4gIC8vICAgICB9O1xuXG4gIC8vICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gIC8vICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgLy8gICAgICAgLnRocmVzaG9sZCh0aHJlc2hvbGQpXG4gIC8vICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gIC8vICAgICAgIC51dHhvcyhbdXR4b10pXG4gIC8vICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgLy8gICAgICAgLmZlZVJhdGUoZmVlUmF0ZS50b1N0cmluZygpKTtcblxuICAvLyAgICAgY29uc3Qgb3JpZ2luYWxUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAvLyAgICAgY29uc3Qgb3JpZ2luYWxGZWVJbmZvID0gKG9yaWdpbmFsVHggYXMgYW55KS5mZWU7XG4gIC8vICAgICBjb25zdCBvcmlnaW5hbFNpemUgPSBvcmlnaW5hbEZlZUluZm8uc2l6ZTtcblxuICAvLyAgICAgY29uc3QgdHhIZXggPSBvcmlnaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gIC8vICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgLy8gICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgcGFyc2VkQnVpbGRlci5idWlsZCgpO1xuICAvLyAgICAgY29uc3QgcGFyc2VkRmVlSW5mbyA9IChwYXJzZWRUeCBhcyBhbnkpLmZlZTtcbiAgLy8gICAgIGNvbnN0IHBhcnNlZEZlZVJhdGUgPSBwYXJzZWRGZWVJbmZvLmZlZVJhdGU7XG4gIC8vICAgICBjb25zdCBwYXJzZWRTaXplID0gcGFyc2VkRmVlSW5mby5zaXplO1xuXG4gIC8vICAgICBjb25zdCBmZWVSYXRlRGlmZiA9IE1hdGguYWJzKHBhcnNlZEZlZVJhdGUgLSBmZWVSYXRlKTtcbiAgLy8gICAgIGNvbnN0IG1heEFsbG93ZWREaWZmID0gNTA7XG4gIC8vICAgICBhc3NlcnQoXG4gIC8vICAgICAgIGZlZVJhdGVEaWZmIDw9IG1heEFsbG93ZWREaWZmLFxuICAvLyAgICAgICBgUGFyc2VkIGZlZVJhdGUgJHtwYXJzZWRGZWVSYXRlfSBzaG91bGQgYmUgY2xvc2UgdG8gb3JpZ2luYWwgJHtmZWVSYXRlfSAoZGlmZjogJHtmZWVSYXRlRGlmZn0pYFxuICAvLyAgICAgKTtcblxuICAvLyAgICAgY29uc3Qgc2l6ZURpZmYgPSBNYXRoLmFicyhwYXJzZWRTaXplIC0gb3JpZ2luYWxTaXplKTtcbiAgLy8gICAgIGNvbnN0IG1heFNpemVEaWZmID0gMTAwO1xuICAvLyAgICAgYXNzZXJ0KFxuICAvLyAgICAgICBzaXplRGlmZiA8PSBtYXhTaXplRGlmZixcbiAgLy8gICAgICAgYFBhcnNlZCBzaXplICR7cGFyc2VkU2l6ZX0gc2hvdWxkIGJlIGNsb3NlIHRvIG9yaWdpbmFsICR7b3JpZ2luYWxTaXplfSAoZGlmZjogJHtzaXplRGlmZn0pYFxuICAvLyAgICAgKTtcbiAgLy8gICB9KTtcbiAgLy8gfSk7XG5cbiAgLy8gZGVzY3JpYmUoJ29uLWNoYWluIHZlcmlmaWVkIHRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgLy8gICBpdCgnc2hvdWxkIHZlcmlmeSBvbi1jaGFpbiB0eCBpZCBmb3Igc2lnbmVkIEMtY2hhaW4gaW1wb3J0JywgYXN5bmMgKCkgPT4ge1xuICAvLyAgICAgY29uc3Qgc2lnbmVkSW1wb3J0SGV4ID1cbiAgLy8gICAgICAgJzB4MDAwMDAwMDAwMDAwMDAwMDAwNzI3OGRiNWMzMGJlZDA0YzA1Y2UyMDkxNzk4MTI4NTBiYmIzZmU2ZDQ2ZDdlZWYzNzQ0ZDgxNGMwZGE1NTUyNDc5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNjJlZjBjOGNlZDU2NjhkMTIzMGM4MmUyNzRmNWMxOTM1N2RmOGMwMDU3NDMzNjc0MjFlOGEyYjQ4YzczOTg5YTAwMDAwMDAxNTg3MzRmOTRhZjg3MWMzZDEzMWI1NjEzMWI2ZmI3YTAyOTFlYWNhZGQyNjFlNjlkZmI0MmE5Y2RmNmY3ZmRkZDAwMDAwMDA1MDAwMDAwMDAwMmZhZjA4MDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAxMTdkYmQxMWI5ZGQxYzliZTMzNzM1M2RiN2MxNGY5ZmIzNjYyZTViNTAwMDAwMDAwMDJhZWE1NDA1ODczNGY5NGFmODcxYzNkMTMxYjU2MTMxYjZmYjdhMDI5MWVhY2FkZDI2MWU2OWRmYjQyYTljZGY2ZjdmZGRkMDAwMDAwMDEwMDAwMDAwOTAwMDAwMDAyYWIzMmMxNWM3NWM3NjNiMjRhZGYyNmVlZTg1YWE3ZDZhNzZiMzY2ZTZiODhlMzRiOTRmNzZiYWVjOTFiYWU3MzM2YTMyZWQ2MzdmYzIzMmNjY2IyZjc3MmQzMDkyZWVlNjY1OTQwNzBhMmJlOTI3NTExNDhmZWZmYzc2MDA1YjEwMTNlZTc4ZmIxMWYzZjlmZmQ5MGQ5NzBjZDVjOTVlOWRlZTYxMWJiNGZlYWZhYTBiMDIyMGNjNjQxZWYwNTRjOWY1NzAxZmRlNGZhZDJmZTdmMjU5NGRiOWRhZmQ4NThjNjJmOWNmNmZlNmI1ODMzNGQ3M2RhNDBhNWE4NDEyZDQ2MDAnO1xuICAvLyAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHNpZ25lZEltcG9ydEhleCk7XG4gIC8vICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAvLyAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAvLyAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHNpZ25lZEltcG9ydEhleCk7XG4gIC8vICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJzJrczl2VzFTVldENEtzTlBIZ1huVjVkcEphQ2NheFZOYlFXNEg3dDlCTUR4QXBHdmZhJyk7XG4gIC8vICAgfSk7XG5cbiAgLy8gICBpdCgnc2hvdWxkIEZBSUwgd2l0aCB1bnNvcnRlZCBVVFhPIGFkZHJlc3NlcyAtIGRlbW9uc3RyYXRlcyBBZGRyZXNzTWFwIG1pc21hdGNoIGlzc3VlIGZvciBpbXBvcnQgaW4gQy1jaGFpbiB0eCcsIGFzeW5jICgpID0+IHtcbiAgLy8gICAgIC8vIFRoaXMgdGVzdCB1c2VzIFVUWE8gYWRkcmVzc2VzIGluIFVOU09SVEVEIG9yZGVyIHRvIGRlbW9uc3RyYXRlIHRoZSBpc3N1ZS5cbiAgLy8gICAgIC8vIFdpdGggdW5zb3J0ZWQgYWRkcmVzc2VzLCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIGNyZWF0ZSBBZGRyZXNzTWFwcyBpbmNvcnJlY3RseVxuICAvLyAgICAgLy8gYmVjYXVzZSBpdCB1c2VzIHNlcXVlbnRpYWwgaW5kaWNlcywgbm90IFVUWE8gYWRkcmVzcyBvcmRlci5cbiAgLy8gICAgIC8vXG4gIC8vICAgICAvLyBFeHBlY3RlZDogQWRkcmVzc01hcCBzaG91bGQgbWFwIGFkZHJlc3NlcyB0byBzaWduYXR1cmUgc2xvdHMgYmFzZWQgb24gVVRYTyBvcmRlciAoYWRkcmVzc2VzSW5kZXgpXG4gIC8vICAgICAvLyBDdXJyZW50IChXUk9ORyk6IEFkZHJlc3NNYXAgdXNlcyBzZXF1ZW50aWFsIGluZGljZXMgKDAsIDEsIDIuLi4pXG4gIC8vICAgICAvL1xuICAvLyAgICAgLy8gVGhpcyB0ZXN0IFdJTEwgRkFJTCB3aXRoIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYmVjYXVzZSBBZGRyZXNzTWFwcyBkb24ndCBtYXRjaCBjcmVkZW50aWFsIG9yZGVyXG5cbiAgLy8gICAgIC8vIFVUWE8gYWRkcmVzc2VzIGluIFVOU09SVEVEIG9yZGVyIChkaWZmZXJlbnQgZnJvbSBzb3J0ZWQpXG4gIC8vICAgICAvLyBTb3J0ZWQgd291bGQgYmU6IFsweDMzMjkuLi4gKHNtYWxsZXN0KSwgMHg3ZTkxLi4uIChtaWRkbGUpLCAweGM3MzIuLi4gKGxhcmdlc3QpXVxuICAvLyAgICAgLy8gVW5zb3J0ZWQ6IFsweGM3MzIuLi4gKGxhcmdlc3QpLCAweDMzMjkuLi4gKHNtYWxsZXN0KSwgMHg3ZTkxLi4uIChtaWRkbGUpXVxuICAvLyAgICAgY29uc3QgdW5zb3J0ZWRVdHhvQWRkcmVzc2VzID0gW1xuICAvLyAgICAgICAnMHhjNzMyNDQzN2M5NmM3YzhhNmExNTJkYTIzODVjMWRiNWMzYWIxZjkxJywgLy8gTGFyZ2VzdCAod291bGQgYmUgaW5kZXggMiBpZiBzb3J0ZWQpXG4gIC8vICAgICAgICcweDMzMjliZTdkMDFjZDNlYmFhZTY2NTRkNzMyN2RkOWYxN2EyZTE1ODEnLCAvLyBTbWFsbGVzdCAod291bGQgYmUgaW5kZXggMCBpZiBzb3J0ZWQpXG4gIC8vICAgICAgICcweDdlOTE4YTVlODA4M2FlNGM5ZjJmMGVkNzcwNTVjMjRiZjM2NjUwMDEnLCAvLyBNaWRkbGUgKHdvdWxkIGJlIGluZGV4IDEgaWYgc29ydGVkKVxuICAvLyAgICAgXTtcblxuICAvLyAgICAgLy8gQ29ycmVzcG9uZGluZyBQLWNoYWluIGFkZHJlc3NlcyAoaW4gc2FtZSBvcmRlciBhcyBfZnJvbUFkZHJlc3NlcylcbiAgLy8gICAgIGNvbnN0IHBBZGRyZXNzZXMgPSBbXG4gIC8vICAgICAgICdQLWNvc3R3bzF4djVtdWxncGU1bHQ0dG54Mm50bnlsd2U3OWF6dTl2cGphNmx1dCcsIC8vIE1hcHMgdG8gMHhjNzMyLi4uIChVVFhPIGluZGV4IDAgaW4gdW5zb3J0ZWQpXG4gIC8vICAgICAgICdQLWNvc3R3bzEwNmdjNWg1cXN3aHllOGUwcG10aHE0d3pmMGVrdjVxcHBzcnZwdScsIC8vIE1hcHMgdG8gMHgzMzI5Li4uIChVVFhPIGluZGV4IDEgaW4gdW5zb3J0ZWQpXG4gIC8vICAgICAgICdQLWNvc3R3bzFjdWV5Z2Q3ZmQzN2c1NnM0OWszcnNocWFraHA2azh1M2FkenQ2bScsIC8vIE1hcHMgdG8gMHg3ZTkxLi4uIChVVFhPIGluZGV4IDIgaW4gdW5zb3J0ZWQpXG4gIC8vICAgICBdO1xuXG4gIC8vICAgICAvLyBDcmVhdGUgVVRYTyB3aXRoIFVOU09SVEVEIGFkZHJlc3Nlc1xuICAvLyAgICAgY29uc3QgYW1vdW50ID0gJzUwMDAwMDAwMCc7IC8vIDAuNSBGTFJcbiAgLy8gICAgIGNvbnN0IGZlZSA9ICc1MDAwMDAwJzsgLy8gRXhhbXBsZSBmZWVcbiAgLy8gICAgIGNvbnN0IHV0eG9BbW91bnQgPSAoQmlnSW50KGFtb3VudCkgKyBCaWdJbnQoZmVlKSArIEJpZ0ludCgnMTAwMDAwMDAnKSkudG9TdHJpbmcoKTsgLy8gYW1vdW50ICsgZmVlICsgc29tZSBidWZmZXJcblxuICAvLyAgICAgY29uc3QgdXR4bzogRGVjb2RlZFV0eG9PYmogPSB7XG4gIC8vICAgICAgIG91dHB1dElEOiAwLFxuICAvLyAgICAgICBhbW91bnQ6IHV0eG9BbW91bnQsXG4gIC8vICAgICAgIHR4aWQ6ICcydlBNeDhQNjNhZGdCYWU3R0FXRng3cXZKRHdSbU1uREN5S2RkSFJCWFdoeXNqWDRCUCcsXG4gIC8vICAgICAgIG91dHB1dGlkeDogJzEnLFxuICAvLyAgICAgICBhZGRyZXNzZXM6IHVuc29ydGVkVXR4b0FkZHJlc3NlcywgLy8gVU5TT1JURUQgb3JkZXJcbiAgLy8gICAgICAgdGhyZXNob2xkOiAyLFxuICAvLyAgICAgfTtcblxuICAvLyAgICAgLy8gQnVpbGQgdHJhbnNhY3Rpb25cbiAgLy8gICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgLy8gICAgICAgLmdldEltcG9ydEluQ0J1aWxkZXIoKVxuICAvLyAgICAgICAudGhyZXNob2xkKDIpXG4gIC8vICAgICAgIC5mcm9tUHViS2V5KHBBZGRyZXNzZXMpXG4gIC8vICAgICAgIC51dHhvcyhbdXR4b10pXG4gIC8vICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgLy8gICAgICAgLmZlZVJhdGUodGVzdERhdGEuZmVlKTtcblxuICAvLyAgICAgLy8gQnVpbGQgdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgLy8gICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgLy8gICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gIC8vICAgICAvLyBHZXQgQWRkcmVzc01hcHMgZnJvbSB0aGUgT1JJR0lOQUwgdHJhbnNhY3Rpb24gKGJlZm9yZSBwYXJzaW5nKVxuICAvLyAgICAgLy8gVGhlIHBhcnNlZCB0cmFuc2FjdGlvbidzIEFkZHJlc3NNYXAgb25seSBjb250YWlucyB0aGUgb3V0cHV0IGFkZHJlc3MsIG5vdCBfZnJvbUFkZHJlc3Nlc1xuICAvLyAgICAgY29uc3Qgb3JpZ2luYWxGbGFyZVR4ID0gKHVuc2lnbmVkVHggYXMgYW55KS5fZmxhcmVUcmFuc2FjdGlvbjtcbiAgLy8gICAgIGNvbnN0IG9yaWdpbmFsQWRkcmVzc01hcHMgPSAob3JpZ2luYWxGbGFyZVR4IGFzIGFueSBhcyBVbnNpZ25lZFR4KS5hZGRyZXNzTWFwcztcblxuICAvLyAgICAgLy8gUGFyc2UgaXQgYmFjayB0byBpbnNwZWN0IEFkZHJlc3NNYXBzIGFuZCBjcmVkZW50aWFsc1xuICAvLyAgICAgY29uc3QgcGFyc2VkQnVpbGRlciA9IGZhY3RvcnkuZnJvbSh1bnNpZ25lZEhleCk7XG4gIC8vICAgICBjb25zdCBwYXJzZWRUeCA9IGF3YWl0IHBhcnNlZEJ1aWxkZXIuYnVpbGQoKTtcbiAgLy8gICAgIGNvbnN0IGZsYXJlVHggPSAocGFyc2VkVHggYXMgYW55KS5fZmxhcmVUcmFuc2FjdGlvbjtcblxuICAvLyAgICAgLy8gR2V0IHRoZSBpbnB1dCB0byBjaGVjayBzaWdJbmRpY2llcyAoZm9yIEMtY2hhaW4gaW1wb3J0cywgaW5wdXRzIGFyZSBpbXBvcnRlZElucHV0cylcbiAgLy8gICAgIGNvbnN0IGltcG9ydFR4ID0gZmxhcmVUeC50eCBhcyBhbnk7XG4gIC8vICAgICBjb25zdCBpbnB1dCA9IGltcG9ydFR4LmltcG9ydGVkSW5wdXRzWzBdO1xuICAvLyAgICAgY29uc3Qgc2lnSW5kaWNpZXMgPSBpbnB1dC5zaWdJbmRpY2llcygpO1xuXG4gIC8vICAgICAvLyBzaWdJbmRpY2llcyB0ZWxscyB1czogc2lnSW5kaWNpZXNbc2xvdEluZGV4XSA9IHV0eG9BZGRyZXNzSW5kZXhcbiAgLy8gICAgIC8vIEZvciB0aHJlc2hvbGQ9Miwgd2UgbmVlZCBzaWduYXR1cmVzIGZvciBmaXJzdCAyIGFkZHJlc3NlcyBpbiBVVFhPIG9yZGVyXG4gIC8vICAgICAvLyBVVFhPIG9yZGVyOiBbMHhjNzMyLi4uIChpbmRleCAwKSwgMHgzMzI5Li4uIChpbmRleCAxKSwgMHg3ZTkxLi4uIChpbmRleCAyKV1cbiAgLy8gICAgIC8vIFNvIHNpZ0luZGljaWVzIHNob3VsZCBiZSBbMCwgMV0gbWVhbmluZzogc2xvdCAwID0gVVRYTyBpbmRleCAwLCBzbG90IDEgPSBVVFhPIGluZGV4IDFcblxuICAvLyAgICAgLy8gVmVyaWZ5IHNpZ0luZGljaWVzIGFyZSBbMCwgMV0gKGZpcnN0IDIgYWRkcmVzc2VzIGluIFVUWE8gb3JkZXIsIE5PVCBzb3J0ZWQgb3JkZXIpXG4gIC8vICAgICBzaWdJbmRpY2llcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAvLyAgICAgc2lnSW5kaWNpZXNbMF0uc2hvdWxkLmVxdWFsKDAsICdGaXJzdCBzaWduYXR1cmUgc2xvdCBzaG91bGQgYmUgVVRYTyBhZGRyZXNzIGluZGV4IDAgKDB4YzczMi4uLiknKTtcbiAgLy8gICAgIHNpZ0luZGljaWVzWzFdLnNob3VsZC5lcXVhbCgxLCAnU2Vjb25kIHNpZ25hdHVyZSBzbG90IHNob3VsZCBiZSBVVFhPIGFkZHJlc3MgaW5kZXggMSAoMHgzMzI5Li4uKScpO1xuXG4gIC8vICAgICAvLyBUaGUgY3JpdGljYWwgdGVzdDogVmVyaWZ5IHRoYXQgc2lnbmF0dXJlIHNsb3RzIGhhdmUgZW1iZWRkZWQgYWRkcmVzc2VzIGJhc2VkIG9uIFVUWE8gb3JkZXJcbiAgLy8gICAgIC8vIFdpdGggdW5zb3J0ZWQgVVRYTyBhZGRyZXNzZXMsIHRoaXMgd2lsbCBGQUlMIGlmIEFkZHJlc3NNYXBzIGRvbid0IG1hdGNoIFVUWE8gb3JkZXJcbiAgLy8gICAgIC8vXG4gIC8vICAgICAvLyBQYXJzZSB0aGUgY3JlZGVudGlhbCB0byBzZWUgd2hpY2ggc2xvdHMgaGF2ZSB3aGljaCBlbWJlZGRlZCBhZGRyZXNzZXNcbiAgLy8gICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBmbGFyZVR4LmNyZWRlbnRpYWxzWzBdO1xuICAvLyAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IGNyZWRlbnRpYWwuZ2V0U2lnbmF0dXJlcygpO1xuXG4gIC8vICAgICAvLyBFeHRyYWN0IGVtYmVkZGVkIGFkZHJlc3NlcyBmcm9tIHNpZ25hdHVyZSBzbG90c1xuICAvLyAgICAgY29uc3QgZW1iZWRkZWRBZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIC8vICAgICBjb25zdCBpc0VtcHR5U2lnbmF0dXJlID0gKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIC8vICAgICAgIHJldHVybiAhIXNpZ25hdHVyZSAmJiB0ZXN0VXRpbHMucmVtb3ZlSGV4UHJlZml4KHNpZ25hdHVyZSkuc3RhcnRzV2l0aCgnMCcucmVwZWF0KDkwKSk7XG4gIC8vICAgICB9O1xuXG4gIC8vICAgICBjb25zdCBoYXNFbWJlZGRlZEFkZHJlc3MgPSAoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgLy8gICAgICAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHNpZ25hdHVyZSkpIHJldHVybiBmYWxzZTtcbiAgLy8gICAgICAgY29uc3QgY2xlYW5TaWcgPSB0ZXN0VXRpbHMucmVtb3ZlSGV4UHJlZml4KHNpZ25hdHVyZSk7XG4gIC8vICAgICAgIGlmIChjbGVhblNpZy5sZW5ndGggPCAxMzApIHJldHVybiBmYWxzZTtcbiAgLy8gICAgICAgY29uc3QgZW1iZWRkZWRQYXJ0ID0gY2xlYW5TaWcuc3Vic3RyaW5nKDkwLCAxMzApO1xuICAvLyAgICAgICAvLyBDaGVjayBpZiBlbWJlZGRlZCBwYXJ0IGlzIG5vdCBhbGwgemVyb3NcbiAgLy8gICAgICAgcmV0dXJuIGVtYmVkZGVkUGFydCAhPT0gJzAnLnJlcGVhdCg0MCk7XG4gIC8vICAgICB9O1xuXG4gIC8vICAgICBzaWduYXR1cmVzLmZvckVhY2goKHNpZzogc3RyaW5nLCBzbG90SW5kZXg6IG51bWJlcikgPT4ge1xuICAvLyAgICAgICBpZiAoaGFzRW1iZWRkZWRBZGRyZXNzKHNpZykpIHtcbiAgLy8gICAgICAgICAvLyBFeHRyYWN0IGVtYmVkZGVkIGFkZHJlc3MgKGFmdGVyIHBvc2l0aW9uIDkwLCA0MCBjaGFycyA9IDIwIGJ5dGVzKVxuICAvLyAgICAgICAgIGNvbnN0IGNsZWFuU2lnID0gdGVzdFV0aWxzLnJlbW92ZUhleFByZWZpeChzaWcpO1xuICAvLyAgICAgICAgIGNvbnN0IGVtYmVkZGVkQWRkciA9IGNsZWFuU2lnLnN1YnN0cmluZyg5MCwgMTMwKS50b0xvd2VyQ2FzZSgpO1xuICAvLyAgICAgICAgIGVtYmVkZGVkQWRkcmVzc2VzW3Nsb3RJbmRleF0gPSAnMHgnICsgZW1iZWRkZWRBZGRyO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9KTtcblxuICAvLyAgICAgLy8gVmVyaWZ5OiBDcmVkZW50aWFscyBvbmx5IGVtYmVkIE9ORSBhZGRyZXNzICh1c2VyL3JlY292ZXJ5KSwgbm90IGJvdGhcbiAgLy8gICAgIC8vIFRoZSBlbWJlZGRlZCBhZGRyZXNzIHNob3VsZCBiZSBiYXNlZCBvbiBhZGRyZXNzZXNJbmRleCBsb2dpYywgbm90IHNlcXVlbnRpYWwgb3JkZXJcbiAgLy8gICAgIC8vXG4gIC8vICAgICAvLyBDb21wdXRlIGFkZHJlc3Nlc0luZGV4IHRvIGRldGVybWluZSBleHBlY3RlZCBzaWduYXR1cmUgb3JkZXJcbiAgLy8gICAgIGNvbnN0IHV0eG9BZGRyZXNzQnl0ZXMgPSB1bnNvcnRlZFV0eG9BZGRyZXNzZXMubWFwKChhZGRyKSA9PiB0ZXN0VXRpbHMucGFyc2VBZGRyZXNzKGFkZHIpKTtcbiAgLy8gICAgIGNvbnN0IHBBZGRyZXNzQnl0ZXMgPSBwQWRkcmVzc2VzLm1hcCgoYWRkcikgPT4gdGVzdFV0aWxzLnBhcnNlQWRkcmVzcyhhZGRyKSk7XG5cbiAgLy8gICAgIGNvbnN0IGFkZHJlc3Nlc0luZGV4OiBudW1iZXJbXSA9IFtdO1xuICAvLyAgICAgcEFkZHJlc3NCeXRlcy5mb3JFYWNoKChwQWRkcikgPT4ge1xuICAvLyAgICAgICBjb25zdCB1dHhvSW5kZXggPSB1dHhvQWRkcmVzc0J5dGVzLmZpbmRJbmRleChcbiAgLy8gICAgICAgICAodUFkZHIpID0+IEJ1ZmZlci5jb21wYXJlKEJ1ZmZlci5mcm9tKHVBZGRyKSwgQnVmZmVyLmZyb20ocEFkZHIpKSA9PT0gMFxuICAvLyAgICAgICApO1xuICAvLyAgICAgICBhZGRyZXNzZXNJbmRleC5wdXNoKHV0eG9JbmRleCk7XG4gIC8vICAgICB9KTtcblxuICAvLyAgICAgLy8gZmlyc3RJbmRleCA9IDAgKHVzZXIpLCBiaXRnb0luZGV4ID0gMVxuICAvLyAgICAgY29uc3QgZmlyc3RJbmRleCA9IDA7XG4gIC8vICAgICBjb25zdCBiaXRnb0luZGV4ID0gMTtcblxuICAvLyAgICAgLy8gRGV0ZXJtaW5lIGV4cGVjdGVkIHNpZ25hdHVyZSBvcmRlciBiYXNlZCBvbiBhZGRyZXNzZXNJbmRleFxuICAvLyAgICAgY29uc3QgdXNlckNvbWVzRmlyc3QgPSBhZGRyZXNzZXNJbmRleFtiaXRnb0luZGV4XSA+IGFkZHJlc3Nlc0luZGV4W2ZpcnN0SW5kZXhdO1xuXG4gIC8vICAgICAvLyBFeHBlY3RlZCBjcmVkZW50aWFsIHN0cnVjdHVyZTpcbiAgLy8gICAgIC8vIC0gSWYgdXNlciBjb21lcyBmaXJzdDogW3VzZXJBZGRyZXNzLCB6ZXJvc11cbiAgLy8gICAgIC8vIC0gSWYgYml0Z28gY29tZXMgZmlyc3Q6IFt6ZXJvcywgdXNlckFkZHJlc3NdXG4gIC8vICAgICBjb25zdCB1c2VyQWRkcmVzc0hleCA9IEJ1ZmZlci5mcm9tKHBBZGRyZXNzQnl0ZXNbZmlyc3RJbmRleF0pLnRvU3RyaW5nKCdoZXgnKS50b0xvd2VyQ2FzZSgpO1xuICAvLyAgICAgY29uc3QgZXhwZWN0ZWRVc2VyQWRkciA9ICcweCcgKyB1c2VyQWRkcmVzc0hleDtcblxuICAvLyAgICAgaWYgKHVzZXJDb21lc0ZpcnN0KSB7XG4gIC8vICAgICAgIC8vIEV4cGVjdGVkOiBbdXNlckFkZHJlc3MsIHplcm9zXVxuICAvLyAgICAgICAvLyBTbG90IDAgc2hvdWxkIGhhdmUgdXNlciBhZGRyZXNzIChwQWRkcjAgPSAweGM3MzIuLi4gPSBVVFhPIGluZGV4IDApXG4gIC8vICAgICAgIGlmIChlbWJlZGRlZEFkZHJlc3Nlc1swXSkge1xuICAvLyAgICAgICAgIGVtYmVkZGVkQWRkcmVzc2VzWzBdXG4gIC8vICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAvLyAgICAgICAgICAgLnNob3VsZC5lcXVhbChcbiAgLy8gICAgICAgICAgICAgZXhwZWN0ZWRVc2VyQWRkcixcbiAgLy8gICAgICAgICAgICAgYFNsb3QgMCBzaG91bGQgaGF2ZSB1c2VyIGFkZHJlc3MgKCR7ZXhwZWN0ZWRVc2VyQWRkcn0pIGJlY2F1c2UgdXNlciBjb21lcyBmaXJzdCBpbiBVVFhPIG9yZGVyYFxuICAvLyAgICAgICAgICAgKTtcbiAgLy8gICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsb3QgMCBzaG91bGQgaGF2ZSBlbWJlZGRlZCB1c2VyIGFkZHJlc3MsIGJ1dCBpcyBlbXB0eWApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIC8vIFNsb3QgMSBzaG91bGQgYmUgemVyb3MgKG5vIGVtYmVkZGVkIGFkZHJlc3MpXG4gIC8vICAgICAgIGlmIChlbWJlZGRlZEFkZHJlc3Nlc1sxXSkge1xuICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2xvdCAxIHNob3VsZCBiZSB6ZXJvcywgYnV0IGhhcyBlbWJlZGRlZCBhZGRyZXNzOiAke2VtYmVkZGVkQWRkcmVzc2VzWzFdfWApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAvLyBFeHBlY3RlZDogW3plcm9zLCB1c2VyQWRkcmVzc11cbiAgLy8gICAgICAgLy8gU2xvdCAwIHNob3VsZCBiZSB6ZXJvc1xuICAvLyAgICAgICBpZiAoZW1iZWRkZWRBZGRyZXNzZXNbMF0pIHtcbiAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsb3QgMCBzaG91bGQgYmUgemVyb3MsIGJ1dCBoYXMgZW1iZWRkZWQgYWRkcmVzczogJHtlbWJlZGRlZEFkZHJlc3Nlc1swXX1gKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICAvLyBTbG90IDEgc2hvdWxkIGhhdmUgdXNlciBhZGRyZXNzXG4gIC8vICAgICAgIGlmIChlbWJlZGRlZEFkZHJlc3Nlc1sxXSkge1xuICAvLyAgICAgICAgIGVtYmVkZGVkQWRkcmVzc2VzWzFdXG4gIC8vICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAvLyAgICAgICAgICAgLnNob3VsZC5lcXVhbChcbiAgLy8gICAgICAgICAgICAgZXhwZWN0ZWRVc2VyQWRkcixcbiAgLy8gICAgICAgICAgICAgYFNsb3QgMSBzaG91bGQgaGF2ZSB1c2VyIGFkZHJlc3MgKCR7ZXhwZWN0ZWRVc2VyQWRkcn0pIGJlY2F1c2UgYml0Z28gY29tZXMgZmlyc3QgaW4gVVRYTyBvcmRlcmBcbiAgLy8gICAgICAgICAgICk7XG4gIC8vICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbG90IDEgc2hvdWxkIGhhdmUgZW1iZWRkZWQgdXNlciBhZGRyZXNzLCBidXQgaXMgZW1wdHlgKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuXG4gIC8vICAgICAvLyBUaGUga2V5IHZlcmlmaWNhdGlvbjogQWRkcmVzc01hcHMgc2hvdWxkIG1hdGNoIHRoZSBjcmVkZW50aWFsIG9yZGVyXG4gIC8vICAgICAvLyBDdXJyZW50IGltcGxlbWVudGF0aW9uIChXUk9ORyk6IEFkZHJlc3NNYXBzIHVzZSBzZXF1ZW50aWFsIGluZGljZXMgKDAsIDEsIDIuLi4pXG4gIC8vICAgICAvLyBFeHBlY3RlZCAoQ09SUkVDVCk6IEFkZHJlc3NNYXBzIHNob3VsZCB1c2UgYWRkcmVzc2VzSW5kZXggbG9naWMsIG1hdGNoaW5nIGNyZWRlbnRpYWwgb3JkZXJcbiAgLy8gICAgIC8vXG4gIC8vICAgICAvLyBHZXQgQWRkcmVzc01hcHMgZnJvbSB0aGUgT1JJR0lOQUwgdHJhbnNhY3Rpb24gKG5vdCBwYXJzZWQsIGJlY2F1c2UgcGFyc2VkIEFkZHJlc3NNYXAgb25seSBoYXMgb3V0cHV0IGFkZHJlc3MpXG4gIC8vICAgICAvLyBGb3IgQy1jaGFpbiBpbXBvcnRzLCBvcmlnaW5hbEZsYXJlVHggaXMgRVZNVW5zaWduZWRUeCB3aGljaCBoYXMgYWRkcmVzc01hcHMgcHJvcGVydHlcblxuICAvLyAgICAgY29uc3QgYWRkcmVzc01hcHMgPSBvcmlnaW5hbEFkZHJlc3NNYXBzO1xuICAvLyAgICAgYWRkcmVzc01hcHMudG9BcnJheSgpLmxlbmd0aC5zaG91bGQuZXF1YWwoMSwgJ1Nob3VsZCBoYXZlIG9uZSBBZGRyZXNzTWFwIGZvciBvbmUgaW5wdXQnKTtcblxuICAvLyAgICAgY29uc3QgYWRkcmVzc01hcCA9IGFkZHJlc3NNYXBzLnRvQXJyYXkoKVswXTtcblxuICAvLyAgICAgLy8gRXhwZWN0ZWQ6IEJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4IGxvZ2ljXG4gIC8vICAgICAvLyBJZiB1c2VyIGNvbWVzIGZpcnN0OiBzbG90IDAgPSB1c2VyLCBzbG90IDEgPSBiaXRnb1xuICAvLyAgICAgLy8gSWYgYml0Z28gY29tZXMgZmlyc3Q6IHNsb3QgMCA9IGJpdGdvLCBzbG90IDEgPSB1c2VyXG4gIC8vICAgICBjb25zdCBleHBlY3RlZFNsb3QwQWRkciA9IHVzZXJDb21lc0ZpcnN0ID8gcEFkZHJlc3NCeXRlc1tmaXJzdEluZGV4XSA6IHBBZGRyZXNzQnl0ZXNbYml0Z29JbmRleF07XG4gIC8vICAgICBjb25zdCBleHBlY3RlZFNsb3QxQWRkciA9IHVzZXJDb21lc0ZpcnN0ID8gcEFkZHJlc3NCeXRlc1tiaXRnb0luZGV4XSA6IHBBZGRyZXNzQnl0ZXNbZmlyc3RJbmRleF07XG5cbiAgLy8gICAgIC8vIEFkZHJlc3NNYXAgbWFwczogQWRkcmVzcyAtPiBzbG90IGluZGV4XG4gIC8vICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHdoaWNoIGFkZHJlc3NlcyBhcmUgbWFwcGVkIHRvIHNsb3RzIDAgYW5kIDFcbiAgLy8gICAgIC8vIEFkZHJlc3NNYXAuZ2V0KCkgcmV0dXJucyB0aGUgc2xvdCBpbmRleCBmb3IgYSBnaXZlbiBhZGRyZXNzXG5cbiAgLy8gICAgIC8vIFZlcmlmeSB0aGF0IEFkZHJlc3NNYXAgY29ycmVjdGx5IG1hcHMgYWRkcmVzc2VzIGJhc2VkIG9uIGNyZWRlbnRpYWwgb3JkZXIgKFVUWE8gb3JkZXIpXG4gIC8vICAgICAvLyBUaGUgQWRkcmVzc01hcCBzaG91bGQgbWFwIHRoZSBhZGRyZXNzZXMgdGhhdCBhcHBlYXIgaW4gY3JlZGVudGlhbHMgdG8gdGhlIGNvcnJlY3Qgc2xvdHNcbiAgLy8gICAgIGNvbnN0IHsgQWRkcmVzcyB9ID0gcmVxdWlyZSgnQGZsYXJlbmV0d29yay9mbGFyZWpzJyk7XG4gIC8vICAgICBjb25zdCBleHBlY3RlZFNsb3QwQWRkcmVzcyA9IG5ldyBBZGRyZXNzKGV4cGVjdGVkU2xvdDBBZGRyKTtcbiAgLy8gICAgIGNvbnN0IGV4cGVjdGVkU2xvdDFBZGRyZXNzID0gbmV3IEFkZHJlc3MoZXhwZWN0ZWRTbG90MUFkZHIpO1xuICAvLyAgICAgY29uc3QgZXhwZWN0ZWRTbG90MEZyb21NYXAgPSBhZGRyZXNzTWFwLmdldChleHBlY3RlZFNsb3QwQWRkcmVzcyk7XG4gIC8vICAgICBjb25zdCBleHBlY3RlZFNsb3QxRnJvbU1hcCA9IGFkZHJlc3NNYXAuZ2V0KGV4cGVjdGVkU2xvdDFBZGRyZXNzKTtcblxuICAvLyAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGV4cGVjdGVkIGFkZHJlc3NlcyBtYXAgdG8gdGhlIGNvcnJlY3Qgc2xvdHNcbiAgLy8gICAgIGlmIChleHBlY3RlZFNsb3QwRnJvbU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gIC8vICAgICAgIHRocm93IG5ldyBFcnJvcihgQWRkcmVzcyBhdCBVVFhPIGluZGV4ICR7YWRkcmVzc2VzSW5kZXhbZmlyc3RJbmRleF19IG5vdCBmb3VuZCBpbiBBZGRyZXNzTWFwYCk7XG4gIC8vICAgICB9XG4gIC8vICAgICBpZiAoZXhwZWN0ZWRTbG90MUZyb21NYXAgPT09IHVuZGVmaW5lZCkge1xuICAvLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFkZHJlc3MgYXQgVVRYTyBpbmRleCAke2FkZHJlc3Nlc0luZGV4W2JpdGdvSW5kZXhdfSBub3QgZm91bmQgaW4gQWRkcmVzc01hcGApO1xuICAvLyAgICAgfVxuICAvLyAgICAgZXhwZWN0ZWRTbG90MEZyb21NYXAuc2hvdWxkLmVxdWFsKDAsIGBBZGRyZXNzIGF0IFVUWE8gaW5kZXggJHthZGRyZXNzZXNJbmRleFtmaXJzdEluZGV4XX0gc2hvdWxkIG1hcCB0byBzbG90IDBgKTtcbiAgLy8gICAgIGV4cGVjdGVkU2xvdDFGcm9tTWFwLnNob3VsZC5lcXVhbCgxLCBgQWRkcmVzcyBhdCBVVFhPIGluZGV4ICR7YWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF19IHNob3VsZCBtYXAgdG8gc2xvdCAxYCk7XG5cbiAgLy8gICAgIC8vIElmIGFkZHJlc3Nlc0luZGV4IGlzIG5vdCBzZXF1ZW50aWFsIChbMCwgMSwgLi4uXSksIHZlcmlmeSB0aGF0IHNlcXVlbnRpYWwgbWFwcGluZyBpcyBOT1QgdXNlZCBpbmNvcnJlY3RseVxuICAvLyAgICAgLy8gU2VxdWVudGlhbCBtYXBwaW5nIG1lYW5zOiBwQWRkcmVzc2VzWzBdIC0+IHNsb3QgMCwgcEFkZHJlc3Nlc1sxXSAtPiBzbG90IDEsIHJlZ2FyZGxlc3Mgb2YgVVRYTyBvcmRlclxuICAvLyAgICAgY29uc3QgdXNlc1NlcXVlbnRpYWxNYXBwaW5nID0gYWRkcmVzc2VzSW5kZXhbMF0gPT09IDAgJiYgYWRkcmVzc2VzSW5kZXhbMV0gPT09IDE7XG5cbiAgLy8gICAgIGlmICghdXNlc1NlcXVlbnRpYWxNYXBwaW5nKSB7XG4gIC8vICAgICAgIC8vIENoZWNrIGlmIEFkZHJlc3NNYXAgdXNlcyBzZXF1ZW50aWFsIG1hcHBpbmcgKGFycmF5IG9yZGVyKSBpbnN0ZWFkIG9mIFVUWE8gb3JkZXJcbiAgLy8gICAgICAgY29uc3Qgc2VxdWVudGlhbFNsb3QwID0gYWRkcmVzc01hcC5nZXQobmV3IEFkZHJlc3MocEFkZHJlc3NCeXRlc1swXSkpO1xuICAvLyAgICAgICBjb25zdCBzZXF1ZW50aWFsU2xvdDEgPSBhZGRyZXNzTWFwLmdldChuZXcgQWRkcmVzcyhwQWRkcmVzc0J5dGVzWzFdKSk7XG5cbiAgLy8gICAgICAgLy8gU2VxdWVudGlhbCBtYXBwaW5nIHdvdWxkIG1hcCBwQWRkcmVzc2VzWzBdIC0+IHNsb3QgMCwgcEFkZHJlc3Nlc1sxXSAtPiBzbG90IDFcbiAgLy8gICAgICAgLy8gQnV0IHdlIHdhbnQgVVRYTyBvcmRlciBtYXBwaW5nIGJhc2VkIG9uIGFkZHJlc3Nlc0luZGV4XG4gIC8vICAgICAgIGNvbnN0IGlzU2VxdWVudGlhbCA9IHNlcXVlbnRpYWxTbG90MCA9PT0gMCAmJiBzZXF1ZW50aWFsU2xvdDEgPT09IDE7XG5cbiAgLy8gICAgICAgLy8gQ2hlY2sgaWYgcEFkZHJlc3Nlc1swXSBhbmQgcEFkZHJlc3Nlc1sxXSBhcmUgdGhlIGV4cGVjdGVkIGFkZHJlc3NlcyBmb3Igc2xvdHMgMCBhbmQgMVxuICAvLyAgICAgICAvLyBJZiB0aGV5IGFyZSwgdGhlbiBzZXF1ZW50aWFsIG1hcHBpbmcgaGFwcGVucyB0byBiZSBjb3JyZWN0IChieSBjb2luY2lkZW5jZSlcbiAgLy8gICAgICAgY29uc3QgcEFkZHJlc3MwSXNFeHBlY3RlZFNsb3QwID1cbiAgLy8gICAgICAgICBCdWZmZXIuY29tcGFyZShCdWZmZXIuZnJvbShwQWRkcmVzc0J5dGVzWzBdKSwgQnVmZmVyLmZyb20oZXhwZWN0ZWRTbG90MEFkZHIpKSA9PT0gMDtcbiAgLy8gICAgICAgY29uc3QgcEFkZHJlc3MxSXNFeHBlY3RlZFNsb3QxID1cbiAgLy8gICAgICAgICBCdWZmZXIuY29tcGFyZShCdWZmZXIuZnJvbShwQWRkcmVzc0J5dGVzWzFdKSwgQnVmZmVyLmZyb20oZXhwZWN0ZWRTbG90MUFkZHIpKSA9PT0gMDtcblxuICAvLyAgICAgICAvLyBJZiBzZXF1ZW50aWFsIG1hcHBpbmcgaXMgdXNlZCBidXQgaXQncyBOT1QgY29ycmVjdCAoZG9lc24ndCBtYXRjaCBleHBlY3RlZCBhZGRyZXNzZXMpLCBmYWlsXG4gIC8vICAgICAgIGlmIChpc1NlcXVlbnRpYWwgJiYgKCFwQWRkcmVzczBJc0V4cGVjdGVkU2xvdDAgfHwgIXBBZGRyZXNzMUlzRXhwZWN0ZWRTbG90MSkpIHtcbiAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gIC8vICAgICAgICAgICBgQWRkcmVzc01hcCB1c2VzIHNlcXVlbnRpYWwgbWFwcGluZyAoYXJyYXkgb3JkZXIpIGJ1dCBzaG91bGQgdXNlIFVUWE8gb3JkZXIuIGAgK1xuICAvLyAgICAgICAgICAgICBgYWRkcmVzc2VzSW5kZXg6IFske2FkZHJlc3Nlc0luZGV4LmpvaW4oJywgJyl9XS4gYCArXG4gIC8vICAgICAgICAgICAgIGBFeHBlY3RlZCBzbG90IDAgPSBhZGRyZXNzIGF0IFVUWE8gaW5kZXggJHthZGRyZXNzZXNJbmRleFtmaXJzdEluZGV4XX0sIHNsb3QgMSA9IGFkZHJlc3MgYXQgVVRYTyBpbmRleCAke2FkZHJlc3Nlc0luZGV4W2JpdGdvSW5kZXhdfWBcbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfSk7XG4gIC8vIH0pO1xufSk7XG4iXX0=
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9pbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLDBDQUE2RDtBQUM3RCw0Q0FBdUM7QUFDdkMseUVBQW9GO0FBQ3BGLDBFQUE4QztBQUU5QyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWxFLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDekMsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNoRCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QixDQUFDLEVBQ0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssNkJBQTZCLENBQ3hELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNyRCxNQUFNLFNBQVMsR0FBRyxPQUFPO2lCQUN0QixtQkFBbUIsRUFBRTtpQkFDckIsU0FBUyxDQUFDLHVCQUFRLENBQUMsU0FBUyxDQUFDO2lCQUM3QixVQUFVLENBQUMsdUJBQVEsQ0FBQyxVQUFVLENBQUM7aUJBQy9CLFlBQVksQ0FBQyx1QkFBUSxDQUFDLEtBQUssQ0FBQztpQkFDNUIsR0FBRyxDQUFDLHVCQUFRLENBQUMsR0FBRyxDQUFDO2lCQUNqQixPQUFPLENBQUMs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QyxDQUFDO1lBRXhELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0VBQStFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDN0YsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFL0YsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSx1QkFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakQsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSx1QkFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFakQsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRTNCLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBJTVBPUlRfSU5fQyBhcyB0ZXN0RGF0YSB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy90cmFuc2FjdGlvbkRhdGEvaW1wb3J0SW5DJztcbmltcG9ydCBzaWduRmxvd1Rlc3QgZnJvbSAnLi9zaWduRmxvd1Rlc3RTdWl0JztcblxuZGVzY3JpYmUoJ0ZscnAgSW1wb3J0IEluIEMgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbGlkYXRlIHR4QnVpbGRlciBmaWVsZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW10pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdVVFhPcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB0byBhZGRyZXNzIGlzIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5kZWNvZGVkVXR4b3ModGVzdERhdGEudXR4b3MpXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KTtcbiAgICAgIC8vIHRvIGlzIE5PVCBzZXRcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgndG8gaXMgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgY29udGV4dCBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHRlc3REYXRhLnV0eG9zKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKTtcbiAgICAgIC8vIGNvbnRleHQgaXMgTk9UIHNldFxuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdjb250ZXh0IGlzIHJlcXVpcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGZyb21BZGRyZXNzZXMgaXMgbm90IHNldCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldEltcG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLnRocmVzaG9sZClcbiAgICAgICAgLmRlY29kZWRVdHhvcyh0ZXN0RGF0YS51dHhvcylcbiAgICAgICAgLnRvKHRlc3REYXRhLnRvKVxuICAgICAgICAuZmVlKHRlc3REYXRhLmZlZSlcbiAgICAgICAgLmNvbnRleHQodGVzdERhdGEuY29udGV4dCk7XG4gICAgICAvLyBmcm9tUHViS2V5IGlzIE5PVCBzZXRcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnZnJvbUFkZHJlc3NlcyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgVVRYT3MgYXJlIG5vdCBzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRJbXBvcnRJbkNCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC50byh0ZXN0RGF0YS50bylcbiAgICAgICAgLmZlZSh0ZXN0RGF0YS5mZWUpXG4gICAgICAgIC5jb250ZXh0KHRlc3REYXRhLmNvbnRleHQpO1xuICAgICAgLy8gdXR4b3MgaXMgTk9UIHNldFxuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdVVFhPcyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHV0eG9zIGhleCBhcnJheSBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0SW1wb3J0SW5DQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5kZWNvZGVkVXR4b3MoW10pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09ICdVVFhPcyBhcnJheSBjYW5ub3QgYmUgZW1wdHknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggaW52YWxpZCB0aHJlc2hvbGQgdmFsdWUgKDApJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnRocmVzaG9sZCgwKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCd0aHJlc2hvbGQnKSB8fCBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2dyZWF0ZXInKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgdGhyZXNob2xkIHZhbHVlIChuZWdhdGl2ZSknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudGhyZXNob2xkKC0xKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLmluY2x1ZGVzKCd0aHJlc2hvbGQnKSB8fCBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2dyZWF0ZXInKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB3aXRoIGludmFsaWQgdG8gYWRkcmVzcyBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudG8oJ2ludmFsaWQtYWRkcmVzcycpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQnKSB8fCBlLm1lc3NhZ2UuaW5jbHVkZXMoJ2FkZHJlc3MnKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIHRvIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgICgoKSA9PiB0eEJ1aWxkZXIudG8odGVzdERhdGEudG8pKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCB0aHJlc2hvbGQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEltcG9ydEluQ0J1aWxkZXIoKTtcbiAgICAgICgoKSA9PiB0eEJ1aWxkZXIudGhyZXNob2xkKDIpKS5zaG91bGQubm90LnRocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCB2YWxpZCBjb250ZXh0JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAoKCkgPT4gdHhCdWlsZGVyLmNvbnRleHQodGVzdERhdGEuY29udGV4dCkpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIGZyb21QdWJLZXkgYWRkcmVzc2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRJbXBvcnRJbkNCdWlsZGVyKCk7XG4gICAgICAoKCkgPT4gdHhCdWlsZGVyLmZyb21QdWJLZXkodGVzdERhdGEucEFkZHJlc3NlcykpLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdJbXBvcnQgQzJQJyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKVxuICAgICAgICAuZ2V0SW1wb3J0SW5DQnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEudGhyZXNob2xkKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKVxuICAgICAgICAuZGVjb2RlZFV0eG9zKHRlc3REYXRhLnV0eG9zKVxuICAgICAgICAudG8odGVzdERhdGEudG8pXG4gICAgICAgIC5mZWUodGVzdERhdGEuZmVlKVxuICAgICAgICAuY29udGV4dCh0ZXN0RGF0YS5jb250ZXh0KSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS51bnNpZ25lZEhleCxcbiAgICBoYWxmU2lnbmVkVHhIZXg6IHRlc3REYXRhLmhhbGZTaWdudHhIZXgsXG4gICAgZnVsbFNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5mdWxsU2lnbnR4SGV4LFxuICAgIHByaXZhdGVLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLnByaXZhdGVLZXlzWzJdLFxuICAgICAgcHJ2MjogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0sXG4gICAgfSxcbiAgICB0eEhhc2g6IHRlc3REYXRhLnR4aGFzaCxcbiAgfSk7XG4gIGRlc2NyaWJlKCdhZGRyZXNzZXNJbmRleCBleHRyYWN0aW9uIGFuZCBzaWduYXR1cmUgc2xvdCBtYXBwaW5nIGZvciBJbXBvcnRJbkMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgcGFyc2UgaGFsZi1zaWduZWQgSW1wb3J0SW5DIHR4IGFuZCBhZGQgc2Vjb25kIHNpZ25hdHVyZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS5oYWxmU2lnbnR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVsbFNpZ250eEhleCk7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEudHhoYXNoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJlc2VydmUgdHJhbnNhY3Rpb24gc3RydWN0dXJlIHdoZW4gcGFyc2luZyB1bnNpZ25lZCBJbXBvcnRJbkMgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgcGFyc2VkQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcGFyc2VkSGV4ID0gcGFyc2VkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHBhcnNlZEhleC5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRIZXgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaGFuZGxlIEltcG9ydEluQyBzaWduaW5nIGZsb3c6IHBhcnNlIC0+IHNpZ24gLT4gcGFyc2UgLT4gc2lnbicsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFN0ZXAgMTogIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBidWlsZGVyMSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgdW5zaWduZWRIZXguc2hvdWxkLmVxdWFsKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHVuc2lnbmVkSGV4KTtcbiAgICAgIGJ1aWxkZXIyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXlzWzJdIH0pO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlcjIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRIZXggPSBoYWxmU2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIzID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKGhhbGZTaWduZWRIZXgpO1xuICAgICAgYnVpbGRlcjMuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0gfSk7XG4gICAgICBjb25zdCBmdWxsU2lnbmVkVHggPSBhd2FpdCBidWlsZGVyMy5idWlsZCgpO1xuICAgICAgZnVsbFNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bGxTaWdudHhIZXgpO1xuICAgICAgZnVsbFNpZ25lZFR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eGhhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgbnVtYmVyIG9mIHNpZ25hdHVyZXMgZm9yIEltcG9ydEluQyBhZnRlciBmdWxsIHNpZ24gZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS5mdWxsU2lnbnR4SGV4KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5zaWduYXR1cmVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBudW1iZXIgb2Ygc2lnbmF0dXJlcyBmb3IgSW1wb3J0SW5DIGhhbGYtc2lnbmVkIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHRlc3REYXRhLmhhbGZTaWdudHhIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLnNpZ25hdHVyZXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSAwIHNpZ25hdHVyZXMgZm9yIHVuc2lnbmVkIEltcG9ydEluQyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICB0eEpzb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJlc2ggYnVpbGQgd2l0aCBkaWZmZXJlbnQgVVRYTyBhZGRyZXNzIG9yZGVyIGZvciBJbXBvcnRJbkMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgY29tcGxldGUgZnVsbCBzaWduIGZsb3cgd2l0aCBkaWZmZXJlbnQgVVRYTyBhZGRyZXNzIG9yZGVyIGZvciBJbXBvcnRJbkMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyMSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYXdhaXQgYnVpbGRlcjEuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCBidWlsZGVyMiA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh1bnNpZ25lZEhleCk7XG4gICAgICBidWlsZGVyMi5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1syXSB9KTtcbiAgICAgIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkSGV4ID0gaGFsZlNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGhhbGZTaWduZWRUeC50b0pzb24oKS5zaWduYXR1cmVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG5cbiAgICAgIGNvbnN0IGJ1aWxkZXIzID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKGhhbGZTaWduZWRIZXgpO1xuICAgICAgYnVpbGRlcjMuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleXNbMF0gfSk7XG4gICAgICBjb25zdCBmdWxsU2lnbmVkVHggPSBhd2FpdCBidWlsZGVyMy5idWlsZCgpO1xuXG4gICAgICBmdWxsU2lnbmVkVHgudG9Kc29uKCkuc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuXG4gICAgICBjb25zdCB0eElkID0gZnVsbFNpZ25lZFR4LmlkO1xuICAgICAgdHhJZC5zaG91bGQuYmUuYS5TdHJpbmcoKTtcbiAgICAgIHR4SWQubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIEltcG9ydEluQyBzaWduaW5nIGluIGRpZmZlcmVudCBvcmRlciBhbmQgc3RpbGwgcHJvZHVjZSB2YWxpZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG5cbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1swXSB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5c1syXSB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICB0eEpzb24uc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19