@bitgo/sdk-coin-stx 4.4.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/src/lib/abstractContractBuilder.d.ts +2 -2
  2. package/dist/src/lib/abstractContractBuilder.d.ts.map +1 -1
  3. package/dist/src/lib/abstractContractBuilder.js +11 -7
  4. package/dist/src/lib/constants.d.ts +0 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +2 -4
  7. package/dist/src/lib/contractBuilder.d.ts +14 -0
  8. package/dist/src/lib/contractBuilder.d.ts.map +1 -1
  9. package/dist/src/lib/contractBuilder.js +29 -5
  10. package/dist/src/lib/fungibleTokenTransferBuilder.d.ts.map +1 -1
  11. package/dist/src/lib/fungibleTokenTransferBuilder.js +10 -5
  12. package/dist/src/lib/index.d.ts +1 -0
  13. package/dist/src/lib/index.d.ts.map +1 -1
  14. package/dist/src/lib/index.js +2 -1
  15. package/dist/src/lib/keyPair.d.ts +1 -1
  16. package/dist/src/lib/keyPair.d.ts.map +1 -1
  17. package/dist/src/lib/keyPair.js +8 -4
  18. package/dist/src/lib/network.d.ts.map +1 -1
  19. package/dist/src/lib/network.js +4 -3
  20. package/dist/src/lib/postConditions.d.ts +31 -0
  21. package/dist/src/lib/postConditions.d.ts.map +1 -0
  22. package/dist/src/lib/postConditions.js +61 -0
  23. package/dist/src/lib/sbtcWithdrawBuilder.d.ts +1 -1
  24. package/dist/src/lib/sbtcWithdrawBuilder.d.ts.map +1 -1
  25. package/dist/src/lib/sbtcWithdrawBuilder.js +11 -9
  26. package/dist/src/lib/sendmanyBuilder.d.ts +1 -1
  27. package/dist/src/lib/sendmanyBuilder.d.ts.map +1 -1
  28. package/dist/src/lib/sendmanyBuilder.js +5 -3
  29. package/dist/src/lib/transaction.d.ts +3 -3
  30. package/dist/src/lib/transaction.d.ts.map +1 -1
  31. package/dist/src/lib/transaction.js +22 -20
  32. package/dist/src/lib/transactionBuilder.d.ts +0 -1
  33. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  34. package/dist/src/lib/transactionBuilder.js +20 -10
  35. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  36. package/dist/src/lib/transactionBuilderFactory.js +2 -2
  37. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  38. package/dist/src/lib/transferBuilder.js +1 -2
  39. package/dist/src/lib/utils.d.ts +2 -2
  40. package/dist/src/lib/utils.d.ts.map +1 -1
  41. package/dist/src/lib/utils.js +30 -21
  42. package/dist/src/stx.d.ts.map +1 -1
  43. package/dist/src/stx.js +13 -13
  44. package/dist/test/fixtures.d.ts +3 -18
  45. package/dist/test/fixtures.d.ts.map +1 -1
  46. package/dist/test/fixtures.js +7 -20
  47. package/dist/test/unit/btcAddressUtils.js +54 -1
  48. package/dist/test/unit/keyPair.js +9 -4
  49. package/dist/test/unit/network.js +5 -5
  50. package/dist/test/unit/postConditions.d.ts +2 -0
  51. package/dist/test/unit/postConditions.d.ts.map +1 -0
  52. package/dist/test/unit/postConditions.js +56 -0
  53. package/dist/test/unit/register.d.ts +2 -0
  54. package/dist/test/unit/register.d.ts.map +1 -0
  55. package/dist/test/unit/register.js +94 -0
  56. package/dist/test/unit/resources.d.ts +2 -0
  57. package/dist/test/unit/resources.d.ts.map +1 -1
  58. package/dist/test/unit/resources.js +7 -4
  59. package/dist/test/unit/sip10Token.js +47 -1
  60. package/dist/test/unit/stx.js +71 -2
  61. package/dist/test/unit/stxNodeErrors.d.ts +2 -0
  62. package/dist/test/unit/stxNodeErrors.d.ts.map +1 -0
  63. package/dist/test/unit/stxNodeErrors.js +118 -0
  64. package/dist/test/unit/transaction.js +24 -1
  65. package/dist/test/unit/transactionBuilder/builderValidators.d.ts +2 -0
  66. package/dist/test/unit/transactionBuilder/builderValidators.d.ts.map +1 -0
  67. package/dist/test/unit/transactionBuilder/builderValidators.js +119 -0
  68. package/dist/test/unit/transactionBuilder/contractBuilder.js +37 -3
  69. package/dist/test/unit/transactionBuilder/fungibleTokenTransferBuilder.js +86 -3
  70. package/dist/test/unit/transactionBuilder/pox5Builder.js +51 -2
  71. package/dist/test/unit/transactionBuilder/sbtcWithdrawBuilder.js +94 -27
  72. package/dist/test/unit/transactionBuilder/sendmanyBuilder.js +31 -8
  73. package/dist/test/unit/transactionBuilder/transferBuilder.js +69 -3
  74. package/dist/test/unit/transactionBuilderFactory.d.ts +2 -0
  75. package/dist/test/unit/transactionBuilderFactory.d.ts.map +1 -0
  76. package/dist/test/unit/transactionBuilderFactory.js +63 -0
  77. package/dist/test/unit/tstxsignet.js +14 -3
  78. package/dist/test/unit/util.js +94 -14
  79. package/dist/tsconfig.tsbuildinfo +1 -1
  80. package/package.json +8 -8
@@ -437,6 +437,20 @@ describe('STX:', function () {
437
437
  .verifyTransaction({ txPrebuild, txParams })
438
438
  .should.be.rejectedWith('Tx memo does not match with expected txParams recipient memo');
439
439
  });
440
+ it('should derive the memo from the recipient address memo id when no memo is passed', async function () {
441
+ const wallet = new sdk_core_1.Wallet(bitgo, basecoin, {});
442
+ const txParams = {
443
+ recipients: [
444
+ {
445
+ address: `${testData.txExplainedTransfer.recipient}?memoId=${encodeURIComponent(testData.txExplainedTransfer.memo)}`,
446
+ amount: testData.txExplainedTransfer.outputAmount,
447
+ },
448
+ ],
449
+ wallet,
450
+ };
451
+ const result = await basecoin.verifyTransaction({ txPrebuild, txParams });
452
+ result.should.equal(true);
453
+ });
440
454
  });
441
455
  describe('Verify sBTC Withdraw Transaction', function () {
442
456
  const factory = new src_1.StxLib.TransactionBuilderFactory(statics_1.coins.get('tstx'));
@@ -445,7 +459,7 @@ describe('STX:', function () {
445
459
  const builder = factory.getSbtcWithdrawBuilder();
446
460
  builder.fee({ fee: '1000' });
447
461
  builder.nonce(1);
448
- const pubKeys = prvKeysString.map((prv) => (0, transactions_1.publicKeyToString)((0, transactions_1.pubKeyfromPrivKey)(prv)));
462
+ const pubKeys = prvKeysString.map((prv) => (0, transactions_1.publicKeyToHex)((0, transactions_1.privateKeyToPublic)(prv)));
449
463
  builder.fromPubKey(pubKeys);
450
464
  builder.numberSignatures(2);
451
465
  builder.withdraw(withdrawParams);
@@ -513,6 +527,19 @@ describe('STX:', function () {
513
527
  .verifyTransaction({ txPrebuild: { txHex }, txParams })
514
528
  .should.be.rejectedWith(/sBTC withdrawal btcAddress does not match/);
515
529
  });
530
+ it('should reject verifying withdrawal params against a non-withdrawal transaction', async function () {
531
+ const txParams = {
532
+ sbtcWithdrawParams: {
533
+ amount: '1000',
534
+ btcAddress: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
535
+ maxFee: '10000',
536
+ },
537
+ recipients: [{ address: 'SM1K9VF5GN48Q0AC2C7SB8WM5N5NR6DYC9VM3QEJE', amount: '10' }],
538
+ };
539
+ await basecoin
540
+ .verifyTransaction({ txPrebuild: { txHex: resources.RAW_TX_UNSIGNED }, txParams })
541
+ .should.be.rejectedWith(/Tx is not a valid sBTC withdrawal transaction/);
542
+ });
516
543
  });
517
544
  describe('Recover Transaction STX', function () {
518
545
  before(function () {
@@ -657,6 +684,48 @@ describe('STX:', function () {
657
684
  };
658
685
  await basecoin.recover(recoveryOptions).should.rejectedWith(sdk_core_1.RecoveryProviderError);
659
686
  });
687
+ it('should include a memo when recovering to a destination with a memo id', async function () {
688
+ const rootAddress = testData.HOT_WALLET_ROOT_ADDRESS;
689
+ (0, nock_1.default)(`https://api.testnet.hiro.so`)
690
+ .get(`/extended/v2/addresses/${rootAddress}/balances/stx`)
691
+ .reply(200, testData.ACCOUNT_BALANCE_RESPONSE);
692
+ (0, nock_1.default)(`https://api.testnet.hiro.so`)
693
+ .get(`/extended/v1/address/${rootAddress}/nonces`)
694
+ .reply(200, testData.ACCOUNT_NONCE_RESPONSE);
695
+ (0, nock_1.default)(`https://api.testnet.hiro.so`, { allowUnmocked: true })
696
+ .post(`/v2/fees/transaction`)
697
+ .reply(200, testData.FEE_ESTIMATION_RESPONSE);
698
+ const recoveryOptions = {
699
+ backupKey: testData.HOT_WALLET_KEY_CARD_INFO.BACKUP_KEY,
700
+ userKey: testData.HOT_WALLET_KEY_CARD_INFO.USER_KEY,
701
+ rootAddress: rootAddress,
702
+ recoveryDestination: `${testData.DESTINATION_ADDRESS_WRW}?memoId=8`,
703
+ bitgoKey: testData.HOT_WALLET_KEY_CARD_INFO.BITGO_PUB_KEY,
704
+ walletPassphrase: testData.HOT_WALLET_KEY_CARD_INFO.WALLET_PASSPHRASE,
705
+ };
706
+ const response = await basecoin.recover(recoveryOptions);
707
+ response.should.have.property('txHex');
708
+ });
709
+ it('should reject recover when the backup key is not a private key', async function () {
710
+ const rootAddress = testData.HOT_WALLET_ROOT_ADDRESS;
711
+ (0, nock_1.default)(`https://api.testnet.hiro.so`)
712
+ .get(`/extended/v2/addresses/${rootAddress}/balances/stx`)
713
+ .reply(200, testData.ACCOUNT_BALANCE_RESPONSE);
714
+ (0, nock_1.default)(`https://api.testnet.hiro.so`)
715
+ .get(`/extended/v1/address/${rootAddress}/nonces`)
716
+ .reply(200, testData.ACCOUNT_NONCE_RESPONSE);
717
+ (0, nock_1.default)(`https://api.testnet.hiro.so`, { allowUnmocked: true })
718
+ .post(`/v2/fees/transaction`)
719
+ .reply(200, testData.FEE_ESTIMATION_RESPONSE);
720
+ const recoveryOptions = {
721
+ backupKey: testData.COLD_WALLET_PUBLIC_KEY_INFO.BACKUP_KEY,
722
+ userKey: resources.xprv1,
723
+ rootAddress: rootAddress,
724
+ recoveryDestination: testData.DESTINATION_ADDRESS_WRW,
725
+ bitgoKey: testData.HOT_WALLET_KEY_CARD_INFO.BITGO_PUB_KEY,
726
+ };
727
+ await basecoin.recover(recoveryOptions).should.be.rejectedWith('backupKey is not a private key');
728
+ });
660
729
  });
661
730
  });
662
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3N0eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixnREFBd0I7QUFFeEIsNENBQTBDO0FBQzFDLDhDQUF1RjtBQUN2Riw4Q0FBMEQ7QUFDMUQsNENBQXVDO0FBQ3ZDLHVEQUF1RztBQUV2RyxzREFBd0M7QUFDeEMsdURBQXlDO0FBQ3pDLHVFQUF1RTtBQUN2RSxtQ0FBOEM7QUFHOUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFlBQU0sQ0FBQztBQUUzQixRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztJQUM1QixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFFYixNQUFNLGlCQUFpQixHQUFHO1FBQ3hCLEVBQUU7UUFDRixJQUFJO1FBQ0osS0FBSztRQUNMLDBDQUEwQztRQUMxQywyQ0FBMkM7S0FDNUMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHO1FBQ3BCLDBDQUEwQztRQUMxQywyQ0FBMkM7UUFDM0MsMkNBQTJDO1FBQzNDLDJDQUEyQztRQUMzQyxvREFBb0Q7UUFDcEQsb0RBQW9EO0tBQ3JELENBQUM7SUFFRixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRTtZQUNuQyxHQUFHLEVBQUUsTUFBTTtTQUNaLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxD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LENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgbm9jayBmcm9tICdub2NrJztcblxuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5pbXBvcnQgeyBFcnJvck5vSW5wdXRUb1JlY292ZXIsIFJlY292ZXJ5UHJvdmlkZXJFcnJvciwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgY3ZUb1N0cmluZywgZGVzZXJpYWxpemVDViwgcHViS2V5ZnJvbVByaXZLZXksIHB1YmxpY0tleVRvU3RyaW5nIH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuXG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9maXh0dXJlcyc7XG5pbXBvcnQgKiBhcyByZXNvdXJjZXMgZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgcG94NVJlZ2lzdGVyRm9yQm9uZEFyZ3NIZXggfSBmcm9tICcuL3JlZ2lzdGVyRm9yQm9uZFJlYWxBcmdzJztcbmltcG9ydCB7IFN0eCwgU3R4TGliLCBUc3R4IH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IFJlY292ZXJ5SW5mbywgUmVjb3ZlcnlPcHRpb25zLCBSZWNvdmVyeVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5cbmNvbnN0IHsgS2V5UGFpciB9ID0gU3R4TGliO1xuXG5kZXNjcmliZSgnU1RYOicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbk5hbWUgPSAnc3R4JztcbiAgY29uc3QgY29pbk5hbWVUZXN0ID0gJ3RzdHgnO1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGNvbnN0IGJhZFZhbGlkQWRkcmVzc2VzID0gW1xuICAgICcnLFxuICAgIG51bGwsXG4gICAgJ2FiYycsXG4gICAgJ1NQMjQ0SFlQWUFUMkJCMlFFNTEzTlNQODFIVE1ZV0JKUDAySFBHSzYnLFxuICAgICdTVDFUNzU4SzZUMllSS0c5UTBUSjE2QjZGUDVRUVJFV1pTRVNSUzBQWScsXG4gIF07XG5cbiAgY29uc3QgZ29vZEFkZHJlc3NlcyA9IFtcbiAgICAnU1RCNDRIWVBZQVQyQkIyUUU1MTNOU1A4MUhUTVlXQkpQMDJIUEdLNicsXG4gICAgJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZJyxcbiAgICAnU1AyVDc1OEs2VDJZUktHOVEwVEoxNkI2RlA1UVFSRVdaU0VTUlMwUFknLFxuICAgICdTTTNXNVFGV0dQRzFKQzhSMjVFVlpERVAzQkVTSlo4MzFKUE5OUUZUWicsXG4gICAgJ1NNM1c1UUZXR1BHMUpDOFIyNUVWWkRFUDNCRVNKWjgzMUpQTk5RRlRaP21lbW9JZD0xJyxcbiAgICAnU1QxV1ZKTVM1VlM0MUYwWU1IN0QyTTBWSFhSRzRDWTQzWkpaQlM2MEE/bWVtb0lkPTQnLFxuICBdO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHtcbiAgICAgIGVudjogJ21vY2snLFxuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3Rlcignc3R4JywgU3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RzdHgnLCBUc3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oY29pbk5hbWVUZXN0KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIHVuc2lnbmVkIGFjY291bnQtbGliIHNpZ25sZS1zaWduYXR1cmUgc2VuZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBzZW5kIHRvIHRoZSByZWNpcGllbnRcbiAgICovXG4gIGNvbnN0IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICh7IGRlc3RpbmF0aW9uLCBhbW91bnQgPSAnMTAwMDAwJywgcHVibGljS2V5LCBtZW1vID0gJycgfSkge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzE4MCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uKTtcbiAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KHB1YmxpY0tleSk7XG4gICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgdHhCdWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMSk7XG4gICAgcmV0dXJuIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiB1bnNpZ25lZCBhY2NvdW50LWxpYiBtdWx0aS1zaWduYXR1cmUgc2VuZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBzZW5kIHRvIHRoZSByZWNpcGllbnRcbiAgICovXG4gIGNvbnN0IGJ1aWxkbXVsdGlTaWdVbnNpZ25lZFRyYW5zYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKHsgZGVzdGluYXRpb24sIGFtb3VudCA9ICcxMDAwMDAnLCBwdWJsaWNLZXlzLCBtZW1vID0gJycgfSkge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzE4MCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uKTtcbiAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KHB1YmxpY0tleXMpO1xuICAgIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgIHJldHVybiBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgfTtcblxuICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBjb2luJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbigndHN0eCcpO1xuICAgIGxvY2FsQmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVHN0eCk7XG5cbiAgICBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbignc3R4Jyk7XG4gICAgbG9jYWxCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihTdHgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIHZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBiYWRWYWxpZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gICAgZ29vZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgaXNXYWxsZXRBZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZXJLZXkgPSB7XG4gICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjR1MySE1kdkFOTjdvOEVTV3F3dnI1VTRyeTVmWmREOVZIaHltV3lmb0RRRjR2emZLb3RYZ0d0SlRyd3JGUno3WGJHRm92NEZxZEtLbzZtUllOV3ZNcDdQMjNEanVKblMnLFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwS2V5ID0ge1xuICAgICAgcHViOiAneHB1YjY2MU15TXdBcVJiY0ZFenI1Q2NwRnpQRzQ1cm1QZjc1RFR2RG9iTjVnSmltQ2F0Ykh0elI1M1NiSHpEWjFKNTZieUtTc2RjOHZTdWpHdVFweVBqYjdMc3VhMk5mQURKZXdQeE56TDNONlRqJyxcbiAgICB9O1xuICAgIGNvbnN0IGJpdGdvS2V5ID0ge1xuICAgICAgcHViOiAneHB1YjY2MU15TXdBcVJiY0dQMWFkazM0VnpSUUpFTVgyNXJDeGpFeVU5WUZGV05oV056d1BvcWdqTG9LZm5xb3RMd3J6N2tCZXZXYlJabnFUU1FyUUR1SnVZVVFhRFE1RERQRXpFWE13UFM5UEVmJyxcbiAgICB9O1xuICAgIGNvbnN0IGtleWNoYWlucyA9IFt1c2VyS2V5LCBiYWNrdXBLZXksIGJpdGdvS2V5XTtcbiAgICBjb25zdCB2YWxpZEFkZHJlc3MxID0gJ1NOQVlRRlo2RUY1NEQ1WFdKUDNHQUUxWThEUFlYS0ZDN1RUTVlYRlYnO1xuICAgIGNvbnN0IHZhbGlkQWRkcmVzczIgPSAnU05BWVFGWjZFRjU0RDVYV0pQM0dBRTFZOERQWVhLRkM3VFRNWVhGVj9tZW1vSWQ9Mic7XG4gICAgY29uc3QgdW5yZWxhdGVkVmFsaWRBZGRyZXNzID0gJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZP21lbW9JZD0xJztcbiAgICBjb25zdCBpbnZhbGlkQWRkcmVzcyA9ICdTVDFUNzU4SzZUMllSS0c5UTBUSjE2QjZGUDVRUVJFV1pTRVNSUzBQWSc7XG4gICAgKGF3YWl0IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyh7IGFkZHJlc3M6IHZhbGlkQWRkcmVzczEsIGtleWNoYWlucyB9KSkuc2hvdWxkLnRydWUoKTtcbiAgICAoYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogdmFsaWRBZGRyZXNzMiwga2V5Y2hhaW5zIH0pKS5zaG91bGQudHJ1ZSgpO1xuICAgIChhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MoeyBhZGRyZXNzOiB1bnJlbGF0ZWRWYWxpZEFkZHJlc3MsIGtleWNoYWlucyB9KSkuc2hvdWxkLmZhbHNlKCk7XG5cbiAgICBhc3NlcnQucmVqZWN0cyhcbiAgICAgIGFzeW5jICgpID0+IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyh7IGFkZHJlc3M6IGludmFsaWRBZGRyZXNzLCBrZXljaGFpbnMgfSksXG4gICAgICBgaW52YWxpZCBhZGRyZXNzICR7aW52YWxpZEFkZHJlc3N9YFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZXhwbGFpbiBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGxhaW4gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHRlc3REYXRhLnR4Rm9yRXhwbGFpblRyYW5zZmVyLFxuICAgICAgZmVlSW5mbzogeyBmZWU6ICcnIH0sXG4gICAgfSk7XG4gICAgZXhwbGFpbi5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5pZCk7XG4gICAgZXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIucmVjaXBpZW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0ubWVtby5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5mZWUpO1xuICAgIGV4cGxhaW4uY2hhbmdlQW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cGxhaW4gYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5ID0gbmV3IEtleVBhaXIoKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICdTVDExTkpUVEtHVlQ2RDFIWTROSlJWUVdNUU03VFZBUjA5MUVKOFAyWSc7XG4gICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMCc7XG4gICAgY29uc3QgbWVtbyA9ICdpIGNhbm5vdCBiZSBicm9hZGNhc3QnO1xuXG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbih7XG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIGFtb3VudCxcbiAgICAgIHB1YmxpY0tleToga2V5LmdldEtleXMoKS5wdWIsXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH0pO1xuICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdW5zaWduZWRIZXgsXG4gICAgICBwdWJsaWNLZXlzOiBba2V5LmdldEtleXMoKS5wdWJdLFxuICAgICAgZmVlSW5mbzogeyBmZWU6ICcnIH0sXG4gICAgfSk7XG5cbiAgICBleHBsYWluLm1lbW8uc2hvdWxkLmVxdWFsKG1lbW8pO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKGRlc3RpbmF0aW9uKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBsYWluIHVuc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBleHBsYWluID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiB0ZXN0RGF0YS51bnNpZ25lZFR4Rm9yRXhwbGFpblRyYW5zZmVyLFxuICAgICAgcHVibGljS2V5czogWycwMzc5N2RkNjUzMDQwZDM0NGZkMDQ4YzFhZDA1ZDRjYmNiMjE3OGIzMGM2YTBjNDI3Njk5NDc5NWYzZTgzM2RhNDEnXSxcbiAgICAgIGZlZUluZm86IHsgZmVlOiAnJyB9LFxuICAgIH0pO1xuICAgIGV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS51bnNpZ25lZFR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS51bnNpZ25lZFR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRUeEV4cGxhaW5lZFRyYW5zZmVyLnJlY2lwaWVudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLm1lbW8uc2hvdWxkLmVxdWFsKHRlc3REYXRhLnVuc2lnbmVkVHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRUeEV4cGxhaW5lZFRyYW5zZmVyLmZlZSk7XG4gICAgZXhwbGFpbi5jaGFuZ2VBbW91bnQuc2hvdWxkLmVxdWFsKCcwJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZXhwbGFpbiBhIGNvbnRyYWN0IGNhbGwgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdGVzdERhdGEudHhGb3JFeHBsYWluQ29udHJhY3QsXG4gICAgICBmZWVJbmZvOiB7IGZlZTogJycgfSxcbiAgICB9KTtcbiAgICBleHBsYWluLmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZENvbnRyYWN0LmlkKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRDb250cmFjdC5mZWUpO1xuICAgIGV4cGxhaW4uY29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZENvbnRyYWN0LmNvbnRyYWN0QWRkcmVzcyk7XG4gICAgZXhwbGFpbi5jb250cmFjdE5hbWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuY29udHJhY3ROYW1lKTtcbiAgICBleHBsYWluLmNvbnRyYWN0RnVuY3Rpb24uc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuZnVuY3Rpb25OYW1lKTtcbiAgICBleHBsYWluLmNvbnRyYWN0RnVuY3Rpb25BcmdzWzBdLnR5cGUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuZnVuY3Rpb25BcmdzWzBdLnR5cGUpO1xuICAgIGV4cGxhaW4uY29udHJhY3RGdW5jdGlvbkFyZ3NbMF0udmFsdWUudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRDb250cmFjdC5mdW5jdGlvbkFyZ3NbMF0udmFsdWUpO1xuICB9KTtcblxuICBpdCgnZXhwbGFpbnMgYSByZWdpc3Rlci1mb3ItYm9uZCB0cmFuc2FjdGlvbiB3aXRoIEpTT04tc2VyaWFsaXNhYmxlIGNvbnRyYWN0RnVuY3Rpb25BcmdzIChTSS0xOTIyKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZVRlc3QpKTtcbiAgICBjb25zdCBmdW5jdGlvbkFyZ3MgPSBwb3g1UmVnaXN0ZXJGb3JCb25kQXJnc0hleC5tYXAoKGhleCkgPT5cbiAgICAgIGRlc2VyaWFsaXplQ1YoQnVmZmVyLmZyb20oaGV4LnJlcGxhY2UoL14weC8sICcnKSwgJ2hleCcpKVxuICAgICk7XG4gICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKTtcbiAgICBidWlsZGVyLmZlZSh7IGZlZTogJzE4ODEwJyB9KTtcbiAgICBidWlsZGVyLm5vbmNlKDApO1xuICAgIGJ1aWxkZXIuZnJvbVB1YktleShyZXNvdXJjZXMuVFhfU0VOREVSLnB1Yik7XG4gICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDEpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25OYW1lKCdyZWdpc3Rlci1mb3ItYm9uZCcpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKGZ1bmN0aW9uQXJncyk7XG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICBjb25zdCBleHBsYWluID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgcHVibGljS2V5czogW3Jlc291cmNlcy5UWF9TRU5ERVIucHViXSxcbiAgICAgIGZlZUluZm86IHsgZmVlOiAnJyB9LFxuICAgIH0pO1xuICAgIGV4cGxhaW4uY29udHJhY3ROYW1lLnNob3VsZC5lcXVhbCgncG94LTUnKTtcbiAgICBleHBsYWluLmNvbnRyYWN0RnVuY3Rpb24uc2hvdWxkLmVxdWFsKCdyZWdpc3Rlci1mb3ItYm9uZCcpO1xuICAgIC8vIHRoZSBzZWNvbmQgY29uc3VtZXIgb2YgdGhlc2UgYXJncyAoZXhwbGFpblRyYW5zYWN0aW9uKSBtdXN0IGFsc28gYmUgSlNPTi1zZXJpYWxpc2FibGVcbiAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IEpTT04uc3RyaW5naWZ5KGV4cGxhaW4uY29udHJhY3RGdW5jdGlvbkFyZ3MpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBsYWluIGEgZnVuZ2libGUgdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBtZW1vJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGxhaW4gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHRlc3REYXRhLnR4Rm9yRXhwbGFpbkZ1bmdpYmxlVG9rZW5UcmFuc2ZlcixcbiAgICAgIGZlZUluZm86IHsgZmVlOiAnJyB9LFxuICAgIH0pO1xuICAgIGV4cGxhaW4uaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmlkKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguZmVlKTtcbiAgICBleHBsYWluLm1lbW8uc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgZXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmZ1bmN0aW9uQXJnc1syXS52YWx1ZSk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguZnVuY3Rpb25BcmdzWzJdLnZhbHVlKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoY3ZUb1N0cmluZyh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mdW5jdGlvbkFyZ3NbMV0pKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0ubWVtby5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0udG9rZW5OYW1lLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC50b2tlbk5hbWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBmdW5naWJsZSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRob3V0IG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdGVzdERhdGEudHhGb3JFeHBsYWluRnVuZ2libGVUb2tlblRyYW5zZmVyV2l0aG91dE1lbW8sXG4gICAgICBmZWVJbmZvOiB7IGZlZTogJycgfSxcbiAgICB9KTtcbiAgICBleHBsYWluLmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5oZXhXaXRob3V0TWVtb1RyYW5zZmVySWQpO1xuICAgIGV4cGxhaW4uZmVlLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mZWUpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwbGFpbi5tZW1vLCB1bmRlZmluZWQsICdtZW1vIHNob3VsZCBiZSB1bmRlZmluZWQnKTtcbiAgICBleHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguZnVuY3Rpb25BcmdzWzJdLnZhbHVlKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mdW5jdGlvbkFyZ3NbMl0udmFsdWUpO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChjdlRvU3RyaW5nKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmZ1bmN0aW9uQXJnc1sxXSkpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwbGFpbi5vdXRwdXRzWzBdLm1lbW8sIHVuZGVmaW5lZCwgJ21lbW8gc2hvdWxkIGJlIHVuZGVmaW5lZCcpO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LnRva2VuTmFtZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXlwYWlyczonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIGtleXBhaXIgZnJvbSByYW5kb20gc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3B1YicpO1xuICAgICAga2V5UGFpci5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJ2Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEga2V5cGFpciBmcm9tIGEgc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlZWRUZXh0ID1cbiAgICAgICAgJzgwMzUwYjQyMDhkMzgxZmJmZTIyNzZhMzI2NjAzMDQ5ZmU1MDA3MzFjNDZkM2M5OTM2YjVjZTAzNmI1MTM3N2YyNGJhYjdkZDBjMmFmN2YxMDc0MTZlZjg1OGZmNzliMDY3MGM3MjQwNmRhZDA2NGU3MmJiMTdmYzBhOTAzOGJiJztcbiAgICAgIGNvbnN0IHNlZWQgPSBCdWZmZXIuZnJvbShzZWVkVGV4dCwgJ2hleCcpO1xuICAgICAgY29uc3Qga2V5UGFpciA9IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcbiAgICAgIGtleVBhaXIucHViLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGQXdxdlNHYmszNWtKZjdDUXFkTjF3NENNVUJCVHFINWUzaXZqVTZEOHVndjloUlNnUmJSZW5DNHczYWhYZExWYWh3amdqWGhTdVFLTWROZG41NVk5VE5TYWdCa3R3cydcbiAgICAgICk7XG4gICAgICBrZXlQYWlyLnBydi5zaG91bGQuZXF1YWwoXG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLMmdzTnBRamJOdTkxa2RHaTFOdVdlaThiWjVtWnVWazZtRlBuQnZteGI3TlNKUWRiWlczRkdwSzNZY243am9yQVhjRXpNdnZpR3RieUJ6NXRCcmpmbld5UXAzZzc1RksnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2lnbiB0cmFuc2FjdGlvbjonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwcnY6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICdTVERFN1k4SFYzUlg4VkJNMlRaVldKVFM3WkExWEIwU1NDM05FVkgwJztcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAnO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgYnVpbGRVbnNpZ25lZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgcHVibGljS2V5OiBrZXkuZ2V0S2V5cygpLnB1YixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICBwcnY6IGtleS5nZXRLZXlzKCkucHJ2IS50b1N0cmluZygpLFxuICAgICAgICBwdWJLZXlzOiBba2V5LmdldEtleXMoKS5wdWJdLFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoY29pbk5hbWUpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eC5oYWxmU2lnbmVkLnR4SGV4KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSBzaWduZWRUeC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5wYXlsb2FkLnRvLnNob3VsZC5lcXVhbChkZXN0aW5hdGlvbik7XG4gICAgICB0eEpzb24ucGF5bG9hZC5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBtdWx0aXNpZyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleTEgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHBydjogJzIxZDQzZDJhZTBkYTFkOWQwNGNmY2FhYzdkMzk3YTMzNzMzODgxMDgxZjBiMmNkMDM4MDYyY2YwY2NiYjc1MjYwMScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGtleTIgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHBydjogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGtleTMgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHBydjogJ2U3NWRjYjY2Zjg0Mjg3ZWFmMzQ3OTU1ZTk0ZmEwNDMzNzI5OGRiZDk1YWEwZGJiOTg1NzcxMTA0ZWYxOTEzZGIwMScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAnO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMCc7XG4gICAgICBjb25zdCBwdWJsaWNLZXlzID0gW2tleTEuZ2V0S2V5cyh0cnVlKS5wdWIsIGtleTIuZ2V0S2V5cyh0cnVlKS5wdWIsIGtleTMuZ2V0S2V5cyh0cnVlKS5wdWJdO1xuICAgICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJ1aWxkbXVsdGlTaWdVbnNpZ25lZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgcHVibGljS2V5cyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICBwcnY6IFtcbiAgICAgICAgICAnMjFkNDNkMmFlMGRhMWQ5ZDA0Y2ZjYWFjN2QzOTdhMzM3MzM4ODEwODFmMGIyY2QwMzgwNjJjZjBjY2JiNzUyNjAxJyxcbiAgICAgICAgICAnYzcxNzAwYjA3ZDUyMGE4Yzk3MzFlNGQwZjA5NWFhNmVmYjkxZTE2ZTI1ZmIyN2NlMmI3MmU3YjY5OGY4MTI3YTAxJyxcbiAgICAgICAgXSxcbiAgICAgICAgcHViS2V5czogW2tleTEuZ2V0S2V5cygpLnB1Yiwga2V5Mi5nZXRLZXlzKCkucHViLCBrZXkzLmdldEtleXMoKS5wdWJdLFxuICAgICAgICBudW1iZXJTaWduYXR1cmU6IDIsXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZSkpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4LnR4SGV4KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSBzaWduZWRUeC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5wYXlsb2FkLnRvLnNob3VsZC5lcXVhbChkZXN0aW5hdGlvbik7XG4gICAgICB0eEpzb24ucGF5bG9hZC5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRTaWduaW5nUGF5bG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdHggYXMgYSBidWZmZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBub25UU1NDb2luID0gYml0Z28uY29pbigndHN0eCcpO1xuICAgICAgY29uc3QgYnVmZmVyVHggPSBhd2FpdCBub25UU1NDb2luLmdldFNpZ25hYmxlUGF5bG9hZCh0ZXN0RGF0YS51bnNpZ25lZFR4Rm9yRXhwbGFpblRyYW5zZmVyKTtcbiAgICAgIGJ1ZmZlclR4LnNob3VsZC5iZS5kZWVwRXF1YWwoQnVmZmVyLmZyb20odGVzdERhdGEudW5zaWduZWRUeEZvckV4cGxhaW5UcmFuc2ZlcikpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFkZHJlc3MxID0gJzB4MTc0Y2ZkODIzYWY4Y2UyN2VkMGFmZWUzZmNmM2MzYmEyNTkxMTZiZSc7XG4gICAgY29uc3QgYWRkcmVzczIgPSAnMHg3ZTg1YmRjMjdjMDUwZTM5MDVlYmY0YjhlNjM0ZDlhZDZlZGQwZGU2JztcbiAgICBjb25zdCB0eFByZWJ1aWxkID0geyB0eEhleDogdGVzdERhdGEudHhGb3JFeHBsYWluVHJhbnNmZXIsIHR4SW5mbzoge30gfTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgdHhQcmVidWlsZCB3aXRoIG1vcmUgdGhhbiBvbmUgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9LFxuICAgICAgICAgIHsgYW1vdW50OiAnMjUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MyIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYHRzdHggZG9lc24ndCBzdXBwb3J0IHNlbmRpbmcgdG8gbW9yZSB0aGFuIDEgZGVzdGluYXRpb24gYWRkcmVzcyB3aXRoaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uIFRyeSBhZ2FpbiwgdXNpbmcgb25seSBhIHNpbmdsZSByZWNpcGllbnQuYFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiB0eFByZWJ1aWxkIGlzIG1pc3NpbmcgdHhIZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwge30pO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzEwMDAnLCBhZGRyZXNzOiB0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLnJlY2lwaWVudCB9XSxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHt9LCB0eFBhcmFtcyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSBhIG5hdGl2ZSBTVFggdHJhbnNmZXIgd2l0aCBtYXRjaGluZyByZWNpcGllbnQgYW5kIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB7fSk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIucmVjaXBpZW50LFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBtZW1vOiB7IHR5cGU6ICcnLCB2YWx1ZTogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vIH0sXG4gICAgICAgIHdhbGxldCxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCB3cm9uZyByZWNpcGllbnQgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB7fSk7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRBZGRyZXNzID0gJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZJztcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogcmVxdWVzdGVkQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5vdXRwdXRBbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbWVtbzogeyB0eXBlOiAnJywgdmFsdWU6IHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIubWVtbyB9LFxuICAgICAgICB3YWxsZXQsXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQcmVidWlsZCwgdHhQYXJhbXMgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYFR4IGRlc3RpbmF0aW9uIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50OiBleHBlY3RlZCAke3JlcXVlc3RlZEFkZHJlc3N9IGJ1dCBnb3QgJHt0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLnJlY2lwaWVudH1gXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggd3JvbmcgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHt9KTtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEFtb3VudCA9ICc5OTk5JztcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5yZWNpcGllbnQsXG4gICAgICAgICAgICBhbW91bnQ6IHJlcXVlc3RlZEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBtZW1vOiB7IHR5cGU6ICcnLCB2YWx1ZTogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vIH0sXG4gICAgICAgIHdhbGxldCxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCB0eFBhcmFtcyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICBgVHggYW1vdW50IGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50IGFtb3VudDogZXhwZWN0ZWQgJHtyZXF1ZXN0ZWRBbW91bnR9IGJ1dCBnb3QgJHt0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudH1gXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggd3JvbmcgbWVtbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB7fSk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIucmVjaXBpZW50LFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBtZW1vOiB7IHR5cGU6ICcnLCB2YWx1ZTogJ3dyb25nIG1lbW8nIH0sXG4gICAgICAgIHdhbGxldCxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCB0eFBhcmFtcyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVHggbWVtbyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudCBtZW1vJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWZXJpZnkgc0JUQyBXaXRoZHJhdyBUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndHN0eCcpKTtcbiAgICBjb25zdCBwcnZLZXlzU3RyaW5nID0gcmVzb3VyY2VzLnBydktleXNTdHJpbmcuc2xpY2UoMCwgMik7XG5cbiAgICBjb25zdCBidWlsZFdpdGhkcmF3VHggPSBhc3luYyAod2l0aGRyYXdQYXJhbXM6IHsgYW1vdW50OiBzdHJpbmc7IGJ0Y0FkZHJlc3M6IHN0cmluZzsgbWF4RmVlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0U2J0Y1dpdGhkcmF3QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5mZWUoeyBmZWU6ICcxMDAwJyB9KTtcbiAgICAgIGJ1aWxkZXIubm9uY2UoMSk7XG4gICAgICBjb25zdCBwdWJLZXlzID0gcHJ2S2V5c1N0cmluZy5tYXAoKHBydikgPT4gcHVibGljS2V5VG9TdHJpbmcocHViS2V5ZnJvbVByaXZLZXkocHJ2KSkpO1xuICAgICAgYnVpbGRlci5mcm9tUHViS2V5KHB1YktleXMpO1xuICAgICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgICAgYnVpbGRlci53aXRoZHJhdyh3aXRoZHJhd1BhcmFtcyk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHBydktleXNTdHJpbmdbMF0gfSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHBydktleXNTdHJpbmdbMV0gfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHJldHVybiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIH07XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IGEgbWF0Y2hpbmcgc0JUQyB3aXRoZHJhd2FsJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2l0aGRyYXdQYXJhbXMgPSB7XG4gICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICBidGNBZGRyZXNzOiAnYmMxcHJ4bDg4dzQ3c3JxaDcwM3B4djU2N3E0N2U3ZXB6dW1lNG5sejhjZ2V3Zmh0dWVubjhuZ3Fnd204MHcnLFxuICAgICAgICBtYXhGZWU6ICcxMDAwMCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZFdpdGhkcmF3VHgod2l0aGRyYXdQYXJhbXMpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHNidGNXaXRoZHJhd1BhcmFtczogd2l0aGRyYXdQYXJhbXMsXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICdTTTFLOVZGNUdONDhRMEFDMkM3U0I4V001TjVOUjZEWUM5Vk0zUUVKRScsIGFtb3VudDogJzEwJyB9XSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgdHhIZXggfSwgdHhQYXJhbXMgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSB3aXRoIHdyb25nIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdpdGhkcmF3UGFyYW1zID0ge1xuICAgICAgICBhbW91bnQ6ICcxMDAwJyxcbiAgICAgICAgYnRjQWRkcmVzczogJ2JjMXByeGw4OHc0N3NycWg3MDNweHY1NjdxNDdlN2VwenVtZTRubHo4Y2dld2ZodHVlbm44bmdxZ3dtODB3JyxcbiAgICAgICAgbWF4RmVlOiAnMTAwMDAnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgYnVpbGRXaXRoZHJhd1R4KHdpdGhkcmF3UGFyYW1zKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICBzYnRjV2l0aGRyYXdQYXJhbXM6IHsgLi4ud2l0aGRyYXdQYXJhbXMsIGFtb3VudDogJzk5OTknIH0sXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICdTTTFLOVZGNUdONDhRMEFDMkM3U0I4V001TjVOUjZEWUM5Vk0zUUVKRScsIGFtb3VudDogJzEwJyB9XSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHR4SGV4IH0sIHR4UGFyYW1zIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9zQlRDIHdpdGhkcmF3YWwgYW1vdW50IGRvZXMgbm90IG1hdGNoLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHdpdGggd3JvbmcgbWF4RmVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2l0aGRyYXdQYXJhbXMgPSB7XG4gICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICBidGNBZGRyZXNzOiAnYmMxcHJ4bDg4dzQ3c3JxaDcwM3B4djU2N3E0N2U3ZXB6dW1lNG5sejhjZ2V3Zmh0dWVubjhuZ3Fnd204MHcnLFxuICAgICAgICBtYXhGZWU6ICcxMDAwMCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZFdpdGhkcmF3VHgod2l0aGRyYXdQYXJhbXMpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHNidGNXaXRoZHJhd1BhcmFtczogeyAuLi53aXRoZHJhd1BhcmFtcywgbWF4RmVlOiAnMScgfSxcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1NNMUs5VkY1R040OFEwQUMyQzdTQjhXTTVONU5SNkRZQzlWTTNRRUpFJywgYW1vdW50OiAnMTAnIH1dLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgdHhIZXggfSwgdHhQYXJhbXMgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3NCVEMgd2l0aGRyYXdhbCBtYXhGZWUgZG9lcyBub3QgbWF0Y2gvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgd2l0aCB3cm9uZyBidGNBZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2l0aGRyYXdQYXJhbXMgPSB7XG4gICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICBidGNBZGRyZXNzOiAnYmMxcHJ4bDg4dzQ3c3JxaDcwM3B4djU2N3E0N2U3ZXB6dW1lNG5sejhjZ2V3Zmh0dWVubjhuZ3Fnd204MHcnLFxuICAgICAgICBtYXhGZWU6ICcxMDAwMCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZFdpdGhkcmF3VHgod2l0aGRyYXdQYXJhbXMpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHNidGNXaXRoZHJhd1BhcmFtczogeyAuLi53aXRoZHJhd1BhcmFtcywgYnRjQWRkcmVzczogJzFCdkJNU0VZc3RXZXRxVEZuNUF1NG00R0ZnN3hKYU5WTjInIH0sXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICdTTTFLOVZGNUdONDhRMEFDMkM3U0I4V001TjVOUjZEWUM5Vk0zUUVKRScsIGFtb3VudDogJzEwJyB9XSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHR4SGV4IH0sIHR4UGFyYW1zIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9zQlRDIHdpdGhkcmF3YWwgYnRjQWRkcmVzcyBkb2VzIG5vdCBtYXRjaC8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlciBUcmFuc2FjdGlvbiBTVFgnLCBmdW5jdGlvbiAoKSB7XG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suZW5hYmxlTmV0Q29ubmVjdCgpO1xuICAgIH0pO1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suZGlzYWJsZU5ldENvbm5lY3QoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBzaWduZWQgcmVjb3ZlciB0cmFuc2FjdGlvbiB3aGVuIHByaXZhdGUga2V5IGRhdGEgaXMgcGFzc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB0ZXN0RGF0YS5IT1RfV0FMTEVUX1JPT1RfQUREUkVTUztcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92Mi9hZGRyZXNzZXMvJHtyb290QWRkcmVzc30vYmFsYW5jZXMvc3R4YClcbiAgICAgICAgLnJlcGx5KDIwMCwgdGVzdERhdGEuQUNDT1VOVF9CQUxBTkNFX1JFU1BPTlNFKTtcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92MS9hZGRyZXNzLyR7cm9vdEFkZHJlc3N9L25vbmNlc2ApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkFDQ09VTlRfTk9OQ0VfUkVTUE9OU0UpO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYCwgeyBhbGxvd1VubW9ja2VkOiB0cnVlIH0pXG4gICAgICAgIC5wb3N0KGAvdjIvZmVlcy90cmFuc2FjdGlvbmAsIHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFUVVFU1QpXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFU1BPTlNFKTtcblxuICAgICAgY29uc3QgcmVjb3ZlcnlPcHRpb25zOiBSZWNvdmVyeU9wdGlvbnMgPSB7XG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLkJBQ0tVUF9LRVksXG4gICAgICAgIHVzZXJLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5VU0VSX0tFWSxcbiAgICAgICAgcm9vdEFkZHJlc3M6IHJvb3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5ERVNUSU5BVElPTl9BRERSRVNTX1dSVyxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CSVRHT19QVUJfS0VZLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uV0FMTEVUX1BBU1NQSFJBU0UsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2U6IFJlY292ZXJ5VHJhbnNhY3Rpb24gPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHJlY292ZXJ5T3B0aW9ucyk7XG4gICAgICByZXNwb25zZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndHhIZXgnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UudHhIZXgsIHRlc3REYXRhLkhPVF9XQUxMRVRfUkVDT1ZFUllfVFhfSEVYLCAndHggaGV4IG5vdCBtYXRjaGluZyEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24gd2hlbiBwdWJsaWMga2V5cyBhcmUgcGFzc2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB0ZXN0RGF0YS5DT0xEX1dBTExFVF9ST09UX0FERFJFU1M7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjIvYWRkcmVzc2VzLyR7cm9vdEFkZHJlc3N9L2JhbGFuY2VzL3N0eGApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkFDQ09VTlRfQkFMQU5DRV9SRVNQT05TRSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjEvYWRkcmVzcy8ke3Jvb3RBZGRyZXNzfS9ub25jZXNgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX05PTkNFX1JFU1BPTlNFKTtcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2AsIHsgYWxsb3dVbm1vY2tlZDogdHJ1ZSB9KVxuICAgICAgICAucG9zdChgL3YyL2ZlZXMvdHJhbnNhY3Rpb25gLCB0ZXN0RGF0YS5GRUVfRVNUSU1BVElPTl9SRVFVRVNUKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5GRUVfRVNUSU1BVElPTl9SRVNQT05TRSk7XG5cbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkNPTERfV0FMTEVUX1BVQkxJQ19LRVlfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuREVTVElOQVRJT05fQUREUkVTU19XUlcsXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uQklUR09fUFVCX0tFWSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZTogUmVjb3ZlcnlJbmZvID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeU9wdGlvbnMpO1xuICAgICAgcmVzcG9uc2Uuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4SGV4Jyk7XG4gICAgICByZXNwb25zZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY29pbicpO1xuICAgICAgcmVzcG9uc2Uuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZlZUluZm8nKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UudHhIZXgsIHRlc3REYXRhLkNPTERfV0FMTEVUX1VOU0lHTkVEX1NXRUVQX1RYX0hFWCwgJ3R4IGhleCBub3QgbWF0Y2hpbmchJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmNvaW4sICd0c3R4JywgJ2NvaW4gbm90IG1hdGNoaW5nIScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpbnZhbGlkIHJvb3QgYWRkcmVzcyB3aGVuIHJvb3QgYWRkcmVzcyBpcyBtaXNzaW5nIG9yIGludmFsaWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNvdmVyeU9wdGlvbnM6IFJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uQkFDS1VQX0tFWSxcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLlVTRVJfS0VZLFxuICAgICAgICByb290QWRkcmVzczogJycsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHRlc3REYXRhLkRFU1RJTkFUSU9OX0FERFJFU1NfV1JXLFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLkJJVEdPX1BVQl9LRVksXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeU9wdGlvbnMpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2ludmFsaWQgcm9vdCBhZGRyZXNzIScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2hlbiBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIG1pc3Npbmcgb3IgaW52YWxpZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkNPTERfV0FMTEVUX1BVQkxJQ19LRVlfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9ST09UX0FERFJFU1MsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246ICcnLFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLkJJVEdPX1BVQl9LRVksXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeU9wdGlvbnMpLnNob3VsZC5yZWplY3RlZFdpdGgoJ2ludmFsaWQgZGVzdGluYXRpb24gYWRkcmVzcyEnKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGZhaWwgd2l0aCBubyBiYWxhbmNlIHdoZW4gcm9vdCBhZGRyZXNzIGRvZXNuJ3QgaGF2ZSBiYWxhbmNlXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuSE9UX1dBTExFVF9ST09UX0FERFJFU1M7XG4gICAgICBjb25zdCBzdHhCYWxhbmNlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0ZXN0RGF0YS5BQ0NPVU5UX0JBTEFOQ0VfUkVTUE9OU0UpKTtcbiAgICAgIHN0eEJhbGFuY2UuYmFsYW5jZSA9ICcwJztcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92Mi9hZGRyZXNzZXMvJHtyb290QWRkcmVzc30vYmFsYW5jZXMvc3R4YClcbiAgICAgICAgLnJlcGx5KDIwMCwgc3R4QmFsYW5jZSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjEvYWRkcmVzcy8ke3Jvb3RBZGRyZXNzfS9ub25jZXNgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX05PTkNFX1JFU1BPTlNFKTtcbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuREVTVElOQVRJT05fQUREUkVTU19XUlcsXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uQklUR09fUFVCX0tFWSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLldBTExFVF9QQVNTUEhSQVNFLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKS5zaG91bGQucmVqZWN0ZWRXaXRoKEVycm9yTm9JbnB1dFRvUmVjb3Zlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2l0aCBpbnN1ZmZpY2llbnQgYmFsYW5jZSB3aGVuIHN0eCBiYWxhbmNlIGlzIGxvd2VyIHRoYW4gZmVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB0ZXN0RGF0YS5IT1RfV0FMTEVUX1JPT1RfQUREUkVTUztcbiAgICAgIC8vIGRlZXAgY2xvbmUgdG8gc3RvcCBtdXRhdGlvblxuICAgICAgY29uc3QgYWNjb3VudEJhbGFuY2UgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRlc3REYXRhLkFDQ09VTlRfQkFMQU5DRV9SRVNQT05TRSkpO1xuICAgICAgYWNjb3VudEJhbGFuY2UuYmFsYW5jZSA9ICcxMDAnOyAvLyBzZXQgYmFsYW5jZSBsb3dlciB0aGFuIGZlZVxuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYClcbiAgICAgICAgLmdldChgL2V4dGVuZGVkL3YyL2FkZHJlc3Nlcy8ke3Jvb3RBZGRyZXNzfS9iYWxhbmNlcy9zdHhgKVxuICAgICAgICAucmVwbHkoMjAwLCBhY2NvdW50QmFsYW5jZSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjEvYWRkcmVzcy8ke3Jvb3RBZGRyZXNzfS9ub25jZXNgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX05PTkNFX1JFU1BPTlNFKTtcbiAgICAgIGNvbnN0IGZlZVJlcXVlc3RCb2R5ID0gdGVzdERhdGEuRkVFX0VTVElNQVRJT05fUkVRVUVTVDtcbiAgICAgIGZlZVJlcXVlc3RCb2R5LnRyYW5zYWN0aW9uX3BheWxvYWQgPVxuICAgICAgICAnMDAwNTFhMTUwMGExYzQyZjBjMTFiZmUzODkzZjQ3OWFmMTg5MDQ2Nzc2ODViZTAwMDAwMDAwMDAwMDAwNjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gLCB7IGFsbG93VW5tb2NrZWQ6IHRydWUgfSlcbiAgICAgICAgLnBvc3QoYC92Mi9mZWVzL3RyYW5zYWN0aW9uYCwgZmVlUmVxdWVzdEJvZHkpXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFU1BPTlNFKTtcbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuREVTVElOQVRJT05fQUREUkVTU19XUlcsXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uQklUR09fUFVCX0tFWSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLldBTExFVF9QQVNTUEhSQVNFLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdpbnN1ZmZpY2llbnQgYmFsYW5jZSB0byBidWlsZCB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgUmVjb3ZlcnlQcm92aWRlckVycm9yIHdoZW4gdGhlIG5vZGUgZmFpbHMgdG8gcmV0dXJuIHRoZSBzdHggYmFsYW5jZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuSE9UX1dBTExFVF9ST09UX0FERFJFU1M7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjIvYWRkcmVzc2VzLyR7cm9vdEFkZHJlc3N9L2JhbGFuY2VzL3N0eGApXG4gICAgICAgIC5yZXBseSg1MDAsIHsgZXJyb3I6ICdub2RlIHVuYXZhaWxhYmxlJyB9KTtcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92MS9hZGRyZXNzLyR7cm9vdEFkZHJlc3N9L25vbmNlc2ApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkFDQ09VTlRfTk9OQ0VfUkVTUE9OU0UpO1xuICAgICAgY29uc3QgcmVjb3ZlcnlPcHRpb25zOiBSZWNvdmVyeU9wdGlvbnMgPSB7XG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLkJBQ0tVUF9LRVksXG4gICAgICAgIHVzZXJLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5VU0VSX0tFWSxcbiAgICAgICAgcm9vdEFkZHJlc3M6IHJvb3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5ERVNUSU5BVElPTl9BRERSRVNTX1dSVyxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CSVRHT19QVUJfS0VZLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uV0FMTEVUX1BBU1NQSFJBU0UsXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeU9wdGlvbnMpLnNob3VsZC5yZWplY3RlZFdpdGgoUmVjb3ZlcnlQcm92aWRlckVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
731
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3N0eC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixnREFBd0I7QUFFeEIsNENBQTBDO0FBQzFDLDhDQUF1RjtBQUN2Riw4Q0FBMEQ7QUFDMUQsNENBQXVDO0FBQ3ZDLHVEQUFxRztBQUVyRyxzREFBd0M7QUFDeEMsdURBQXlDO0FBQ3pDLHVFQUF1RTtBQUN2RSxtQ0FBOEM7QUFHOUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFlBQU0sQ0FBQztBQUUzQixRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQztJQUM1QixJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFRLENBQUM7SUFFYixNQUFNLGlCQUFpQixHQUFHO1FBQ3hCLEVBQUU7UUFDRixJQUFJO1FBQ0osS0FBSztRQUNMLDBDQUEwQztRQUMxQywyQ0FBMkM7S0FDNUMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHO1FBQ3BCLDBDQUEwQztRQUMxQywyQ0FBMkM7UUFDM0MsMkNBQTJDO1FBQzNDLDJDQUEyQztRQUMzQyxvREFBb0Q7UUFDcEQsb0RBQW9EO0tBQ3JELENBQUM7SUFFRixNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRTtZQUNuQyxHQUFHLEVBQUUsTUFBTTtTQUNaLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFJLENBQUMsY0FBYyxD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Z0UsRUFBRSxLQUFLO1lBQ3hFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztZQUNyRCxJQUFBLGNBQUksRUFBQyw2QkFBNkIsQ0FBQztpQkFDaEMsR0FBRyxDQUFDLDBCQUEwQixXQUFXLGVBQWUsQ0FBQztpQkFDekQsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUNqRCxJQUFBLGNBQUksRUFBQyw2QkFBNkIsQ0FBQztpQkFDaEMsR0FBRyxDQUFDLHdCQUF3QixXQUFXLFNBQVMsQ0FBQztpQkFDakQsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUMvQyxJQUFBLGNBQUksRUFBQyw2QkFBNkIsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDekQsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2lCQUM1QixLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBRWhELE1BQU0sZUFBZSxHQUFvQjtnQkFDdkMsU0FBUyxFQUFFLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVO2dCQUMxRCxPQUFPLEVBQUUsU0FBUyxDQUFDLEtBQUs7Z0JBQ3hCLFdBQVcsRUFBRSxXQUFXO2dCQUN4QixtQkFBbUIsRUFBRSxRQUFRLENBQUMsdUJBQXVCO2dCQUNyRCxRQUFRLEVBQUUsUUFBUSxDQUFDLHdCQUF3QixDQUFDLGFBQWE7YUFDMUQsQ0FBQztZQUNGLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ25HLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBub2NrIGZyb20gJ25vY2snO1xuXG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IEVycm9yTm9JbnB1dFRvUmVjb3ZlciwgUmVjb3ZlcnlQcm92aWRlckVycm9yLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBjdlRvU3RyaW5nLCBkZXNlcmlhbGl6ZUNWLCBwcml2YXRlS2V5VG9QdWJsaWMsIHB1YmxpY0tleVRvSGV4IH0gZnJvbSAnQHN0YWNrcy90cmFuc2FjdGlvbnMnO1xuXG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9maXh0dXJlcyc7XG5pbXBvcnQgKiBhcyByZXNvdXJjZXMgZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgcG94NVJlZ2lzdGVyRm9yQm9uZEFyZ3NIZXggfSBmcm9tICcuL3JlZ2lzdGVyRm9yQm9uZFJlYWxBcmdzJztcbmltcG9ydCB7IFN0eCwgU3R4TGliLCBUc3R4IH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IFJlY292ZXJ5SW5mbywgUmVjb3ZlcnlPcHRpb25zLCBSZWNvdmVyeVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5cbmNvbnN0IHsgS2V5UGFpciB9ID0gU3R4TGliO1xuXG5kZXNjcmliZSgnU1RYOicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbk5hbWUgPSAnc3R4JztcbiAgY29uc3QgY29pbk5hbWVUZXN0ID0gJ3RzdHgnO1xuICBsZXQgYml0Z286IFRlc3RCaXRHb0FQSTtcbiAgbGV0IGJhc2Vjb2luO1xuXG4gIGNvbnN0IGJhZFZhbGlkQWRkcmVzc2VzID0gW1xuICAgICcnLFxuICAgIG51bGwsXG4gICAgJ2FiYycsXG4gICAgJ1NQMjQ0SFlQWUFUMkJCMlFFNTEzTlNQODFIVE1ZV0JKUDAySFBHSzYnLFxuICAgICdTVDFUNzU4SzZUMllSS0c5UTBUSjE2QjZGUDVRUVJFV1pTRVNSUzBQWScsXG4gIF07XG5cbiAgY29uc3QgZ29vZEFkZHJlc3NlcyA9IFtcbiAgICAnU1RCNDRIWVBZQVQyQkIyUUU1MTNOU1A4MUhUTVlXQkpQMDJIUEdLNicsXG4gICAgJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZJyxcbiAgICAnU1AyVDc1OEs2VDJZUktHOVEwVEoxNkI2RlA1UVFSRVdaU0VTUlMwUFknLFxuICAgICdTTTNXNVFGV0dQRzFKQzhSMjVFVlpERVAzQkVTSlo4MzFKUE5OUUZUWicsXG4gICAgJ1NNM1c1UUZXR1BHMUpDOFIyNUVWWkRFUDNCRVNKWjgzMUpQTk5RRlRaP21lbW9JZD0xJyxcbiAgICAnU1QxV1ZKTVM1VlM0MUYwWU1IN0QyTTBWSFhSRzRDWTQzWkpaQlM2MEE/bWVtb0lkPTQnLFxuICBdO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHtcbiAgICAgIGVudjogJ21vY2snLFxuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJpdGdvLnNhZmVSZWdpc3Rlcignc3R4JywgU3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RzdHgnLCBUc3R4LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oY29pbk5hbWVUZXN0KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIHVuc2lnbmVkIGFjY291bnQtbGliIHNpZ25sZS1zaWduYXR1cmUgc2VuZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBzZW5kIHRvIHRoZSByZWNpcGllbnRcbiAgICovXG4gIGNvbnN0IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICh7IGRlc3RpbmF0aW9uLCBhbW91bnQgPSAnMTAwMDAwJywgcHVibGljS2V5LCBtZW1vID0gJycgfSkge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzE4MCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uKTtcbiAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KHB1YmxpY0tleSk7XG4gICAgdHhCdWlsZGVyLm1lbW8obWVtbyk7XG4gICAgdHhCdWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMSk7XG4gICAgcmV0dXJuIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiB1bnNpZ25lZCBhY2NvdW50LWxpYiBtdWx0aS1zaWduYXR1cmUgc2VuZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gZGVzdGluYXRpb24gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0byBzZW5kIHRvIHRoZSByZWNpcGllbnRcbiAgICovXG4gIGNvbnN0IGJ1aWxkbXVsdGlTaWdVbnNpZ25lZFRyYW5zYWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gKHsgZGVzdGluYXRpb24sIGFtb3VudCA9ICcxMDAwMDAnLCBwdWJsaWNLZXlzLCBtZW1vID0gJycgfSkge1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgU3R4TGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KGNvaW5OYW1lKSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHtcbiAgICAgIGZlZTogJzE4MCcsXG4gICAgfSk7XG4gICAgdHhCdWlsZGVyLnRvKGRlc3RpbmF0aW9uKTtcbiAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKDEpO1xuICAgIHR4QnVpbGRlci5mcm9tUHViS2V5KHB1YmxpY0tleXMpO1xuICAgIHR4QnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDIpO1xuICAgIHR4QnVpbGRlci5tZW1vKG1lbW8pO1xuICAgIHJldHVybiBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgfTtcblxuICBpdCgnc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBjb2luJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbigndHN0eCcpO1xuICAgIGxvY2FsQmFzZWNvaW4uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoVHN0eCk7XG5cbiAgICBsb2NhbEJhc2Vjb2luID0gYml0Z28uY29pbignc3R4Jyk7XG4gICAgbG9jYWxCYXNlY29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihTdHgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNoZWNrIHZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBiYWRWYWxpZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gICAgZ29vZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IHtcbiAgICAgIGJhc2Vjb2luLmlzVmFsaWRBZGRyZXNzKGFkZHIpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgaXNXYWxsZXRBZGRyZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZXJLZXkgPSB7XG4gICAgICBwdWI6ICd4cHViNjYxTXlNd0FxUmJjR1MySE1kdkFOTjdvOEVTV3F3dnI1VTRyeTVmWmREOVZIaHltV3lmb0RRRjR2emZLb3RYZ0d0SlRyd3JGUno3WGJHRm92NEZxZEtLbzZtUllOV3ZNcDdQMjNEanVKblMnLFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwS2V5ID0ge1xuICAgICAgcHViOiAneHB1YjY2MU15TXdBcVJiY0ZFenI1Q2NwRnpQRzQ1cm1QZjc1RFR2RG9iTjVnSmltQ2F0Ykh0elI1M1NiSHpEWjFKNTZieUtTc2RjOHZTdWpHdVFweVBqYjdMc3VhMk5mQURKZXdQeE56TDNONlRqJyxcbiAgICB9O1xuICAgIGNvbnN0IGJpdGdvS2V5ID0ge1xuICAgICAgcHViOiAneHB1YjY2MU15TXdBcVJiY0dQMWFkazM0VnpSUUpFTVgyNXJDeGpFeVU5WUZGV05oV056d1BvcWdqTG9LZm5xb3RMd3J6N2tCZXZXYlJabnFUU1FyUUR1SnVZVVFhRFE1RERQRXpFWE13UFM5UEVmJyxcbiAgICB9O1xuICAgIGNvbnN0IGtleWNoYWlucyA9IFt1c2VyS2V5LCBiYWNrdXBLZXksIGJpdGdvS2V5XTtcbiAgICBjb25zdCB2YWxpZEFkZHJlc3MxID0gJ1NOQVlRRlo2RUY1NEQ1WFdKUDNHQUUxWThEUFlYS0ZDN1RUTVlYRlYnO1xuICAgIGNvbnN0IHZhbGlkQWRkcmVzczIgPSAnU05BWVFGWjZFRjU0RDVYV0pQM0dBRTFZOERQWVhLRkM3VFRNWVhGVj9tZW1vSWQ9Mic7XG4gICAgY29uc3QgdW5yZWxhdGVkVmFsaWRBZGRyZXNzID0gJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZP21lbW9JZD0xJztcbiAgICBjb25zdCBpbnZhbGlkQWRkcmVzcyA9ICdTVDFUNzU4SzZUMllSS0c5UTBUSjE2QjZGUDVRUVJFV1pTRVNSUzBQWSc7XG4gICAgKGF3YWl0IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyh7IGFkZHJlc3M6IHZhbGlkQWRkcmVzczEsIGtleWNoYWlucyB9KSkuc2hvdWxkLnRydWUoKTtcbiAgICAoYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHsgYWRkcmVzczogdmFsaWRBZGRyZXNzMiwga2V5Y2hhaW5zIH0pKS5zaG91bGQudHJ1ZSgpO1xuICAgIChhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MoeyBhZGRyZXNzOiB1bnJlbGF0ZWRWYWxpZEFkZHJlc3MsIGtleWNoYWlucyB9KSkuc2hvdWxkLmZhbHNlKCk7XG5cbiAgICBhc3NlcnQucmVqZWN0cyhcbiAgICAgIGFzeW5jICgpID0+IGJhc2Vjb2luLmlzV2FsbGV0QWRkcmVzcyh7IGFkZHJlc3M6IGludmFsaWRBZGRyZXNzLCBrZXljaGFpbnMgfSksXG4gICAgICBgaW52YWxpZCBhZGRyZXNzICR7aW52YWxpZEFkZHJlc3N9YFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZXhwbGFpbiBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGxhaW4gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHRlc3REYXRhLnR4Rm9yRXhwbGFpblRyYW5zZmVyLFxuICAgICAgZmVlSW5mbzogeyBmZWU6ICcnIH0sXG4gICAgfSk7XG4gICAgZXhwbGFpbi5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5pZCk7XG4gICAgZXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIucmVjaXBpZW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0ubWVtby5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5mZWUpO1xuICAgIGV4cGxhaW4uY2hhbmdlQW1vdW50LnNob3VsZC5lcXVhbCgnMCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cGxhaW4gYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qga2V5ID0gbmV3IEtleVBhaXIoKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICdTVDExTkpUVEtHVlQ2RDFIWTROSlJWUVdNUU03VFZBUjA5MUVKOFAyWSc7XG4gICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMCc7XG4gICAgY29uc3QgbWVtbyA9ICdpIGNhbm5vdCBiZSBicm9hZGNhc3QnO1xuXG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJ1aWxkVW5zaWduZWRUcmFuc2FjdGlvbih7XG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIGFtb3VudCxcbiAgICAgIHB1YmxpY0tleToga2V5LmdldEtleXMoKS5wdWIsXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH0pO1xuICAgIGNvbnN0IHVuc2lnbmVkSGV4ID0gdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdW5zaWduZWRIZXgsXG4gICAgICBwdWJsaWNLZXlzOiBba2V5LmdldEtleXMoKS5wdWJdLFxuICAgICAgZmVlSW5mbzogeyBmZWU6ICcnIH0sXG4gICAgfSk7XG5cbiAgICBleHBsYWluLm1lbW8uc2hvdWxkLmVxdWFsKG1lbW8pO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKGRlc3RpbmF0aW9uKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBsYWluIHVuc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGhleCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBleHBsYWluID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiB0ZXN0RGF0YS51bnNpZ25lZFR4Rm9yRXhwbGFpblRyYW5zZmVyLFxuICAgICAgcHVibGljS2V5czogWycwMzc5N2RkNjUzMDQwZDM0NGZkMDQ4YzFhZDA1ZDRjYmNiMjE3OGIzMGM2YTBjNDI3Njk5NDc5NWYzZTgzM2RhNDEnXSxcbiAgICAgIGZlZUluZm86IHsgZmVlOiAnJyB9LFxuICAgIH0pO1xuICAgIGV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS51bnNpZ25lZFR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS51bnNpZ25lZFR4RXhwbGFpbmVkVHJhbnNmZXIub3V0cHV0QW1vdW50KTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRUeEV4cGxhaW5lZFRyYW5zZmVyLnJlY2lwaWVudCk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLm1lbW8uc2hvdWxkLmVxdWFsKHRlc3REYXRhLnVuc2lnbmVkVHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRUeEV4cGxhaW5lZFRyYW5zZmVyLmZlZSk7XG4gICAgZXhwbGFpbi5jaGFuZ2VBbW91bnQuc2hvdWxkLmVxdWFsKCcwJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZXhwbGFpbiBhIGNvbnRyYWN0IGNhbGwgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdGVzdERhdGEudHhGb3JFeHBsYWluQ29udHJhY3QsXG4gICAgICBmZWVJbmZvOiB7IGZlZTogJycgfSxcbiAgICB9KTtcbiAgICBleHBsYWluLmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZENvbnRyYWN0LmlkKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRDb250cmFjdC5mZWUpO1xuICAgIGV4cGxhaW4uY29udHJhY3RBZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eEV4cGxhaW5lZENvbnRyYWN0LmNvbnRyYWN0QWRkcmVzcyk7XG4gICAgZXhwbGFpbi5jb250cmFjdE5hbWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuY29udHJhY3ROYW1lKTtcbiAgICBleHBsYWluLmNvbnRyYWN0RnVuY3Rpb24uc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuZnVuY3Rpb25OYW1lKTtcbiAgICBleHBsYWluLmNvbnRyYWN0RnVuY3Rpb25BcmdzWzBdLnR5cGUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4RXhwbGFpbmVkQ29udHJhY3QuZnVuY3Rpb25BcmdzWzBdLnR5cGUpO1xuICAgIGV4cGxhaW4uY29udHJhY3RGdW5jdGlvbkFyZ3NbMF0udmFsdWUudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwodGVzdERhdGEudHhFeHBsYWluZWRDb250cmFjdC5mdW5jdGlvbkFyZ3NbMF0udmFsdWUpO1xuICB9KTtcblxuICBpdCgnZXhwbGFpbnMgYSByZWdpc3Rlci1mb3ItYm9uZCB0cmFuc2FjdGlvbiB3aXRoIEpTT04tc2VyaWFsaXNhYmxlIGNvbnRyYWN0RnVuY3Rpb25BcmdzIChTSS0xOTIyKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZVRlc3QpKTtcbiAgICBjb25zdCBmdW5jdGlvbkFyZ3MgPSBwb3g1UmVnaXN0ZXJGb3JCb25kQXJnc0hleC5tYXAoKGhleCkgPT5cbiAgICAgIGRlc2VyaWFsaXplQ1YoQnVmZmVyLmZyb20oaGV4LnJlcGxhY2UoL14weC8sICcnKSwgJ2hleCcpKVxuICAgICk7XG4gICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0UG94NUJ1aWxkZXIoKTtcbiAgICBidWlsZGVyLmZlZSh7IGZlZTogJzE4ODEwJyB9KTtcbiAgICBidWlsZGVyLm5vbmNlKDApO1xuICAgIGJ1aWxkZXIuZnJvbVB1YktleShyZXNvdXJjZXMuVFhfU0VOREVSLnB1Yik7XG4gICAgYnVpbGRlci5udW1iZXJTaWduYXR1cmVzKDEpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25OYW1lKCdyZWdpc3Rlci1mb3ItYm9uZCcpO1xuICAgIGJ1aWxkZXIuZnVuY3Rpb25BcmdzKGZ1bmN0aW9uQXJncyk7XG4gICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICBjb25zdCBleHBsYWluID0gYXdhaXQgYmFzZWNvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgcHVibGljS2V5czogW3Jlc291cmNlcy5UWF9TRU5ERVIucHViXSxcbiAgICAgIGZlZUluZm86IHsgZmVlOiAnJyB9LFxuICAgIH0pO1xuICAgIGV4cGxhaW4uY29udHJhY3ROYW1lLnNob3VsZC5lcXVhbCgncG94LTUnKTtcbiAgICBleHBsYWluLmNvbnRyYWN0RnVuY3Rpb24uc2hvdWxkLmVxdWFsKCdyZWdpc3Rlci1mb3ItYm9uZCcpO1xuICAgIC8vIHRoZSBzZWNvbmQgY29uc3VtZXIgb2YgdGhlc2UgYXJncyAoZXhwbGFpblRyYW5zYWN0aW9uKSBtdXN0IGFsc28gYmUgSlNPTi1zZXJpYWxpc2FibGVcbiAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IEpTT04uc3RyaW5naWZ5KGV4cGxhaW4uY29udHJhY3RGdW5jdGlvbkFyZ3MpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBsYWluIGEgZnVuZ2libGUgdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBtZW1vJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV4cGxhaW4gPSBhd2FpdCBiYXNlY29pbi5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHRlc3REYXRhLnR4Rm9yRXhwbGFpbkZ1bmdpYmxlVG9rZW5UcmFuc2ZlcixcbiAgICAgIGZlZUluZm86IHsgZmVlOiAnJyB9LFxuICAgIH0pO1xuICAgIGV4cGxhaW4uaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmlkKTtcbiAgICBleHBsYWluLmZlZS5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguZmVlKTtcbiAgICBleHBsYWluLm1lbW8uc2hvdWxkLmVxdWFsKCcxJyk7XG4gICAgZXhwbGFpbi5vdXRwdXRBbW91bnQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmZ1bmN0aW9uQXJnc1syXS52YWx1ZSk7XG4gICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguZnVuY3Rpb25BcmdzWzJdLnZhbHVlKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoY3ZUb1N0cmluZyh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mdW5jdGlvbkFyZ3NbMV0pKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0ubWVtby5zaG91bGQuZXF1YWwoJzEnKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0udG9rZW5OYW1lLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC50b2tlbk5hbWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGV4cGxhaW4gYSBmdW5naWJsZSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRob3V0IG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXhwbGFpbiA9IGF3YWl0IGJhc2Vjb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdGVzdERhdGEudHhGb3JFeHBsYWluRnVuZ2libGVUb2tlblRyYW5zZmVyV2l0aG91dE1lbW8sXG4gICAgICBmZWVJbmZvOiB7IGZlZTogJycgfSxcbiAgICB9KTtcbiAgICBleHBsYWluLmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5oZXhXaXRob3V0TWVtb1RyYW5zZmVySWQpO1xuICAgIGV4cGxhaW4uZmVlLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mZWUpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwbGFpbi5tZW1vLCB1bmRlZmluZWQsICdtZW1vIHNob3VsZCBiZSB1bmRlZmluZWQnKTtcbiAgICBleHBsYWluLm91dHB1dEFtb3VudC5zaG91bGQuZXF1YWwodGVzdERhdGEuZnVuZ2libGVUb2tlblRyYW5zZmVyVHguZnVuY3Rpb25BcmdzWzJdLnZhbHVlKTtcbiAgICBleHBsYWluLm91dHB1dHNbMF0uYW1vdW50LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5mdW5naWJsZVRva2VuVHJhbnNmZXJUeC5mdW5jdGlvbkFyZ3NbMl0udmFsdWUpO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbChjdlRvU3RyaW5nKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LmZ1bmN0aW9uQXJnc1sxXSkpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwbGFpbi5vdXRwdXRzWzBdLm1lbW8sIHVuZGVmaW5lZCwgJ21lbW8gc2hvdWxkIGJlIHVuZGVmaW5lZCcpO1xuICAgIGV4cGxhaW4ub3V0cHV0c1swXS50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKHRlc3REYXRhLmZ1bmdpYmxlVG9rZW5UcmFuc2ZlclR4LnRva2VuTmFtZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXlwYWlyczonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZW5lcmF0ZSBhIGtleXBhaXIgZnJvbSByYW5kb20gc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBiYXNlY29pbi5nZW5lcmF0ZUtleVBhaXIoKTtcbiAgICAgIGtleVBhaXIuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3B1YicpO1xuICAgICAga2V5UGFpci5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJ2Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIGEga2V5cGFpciBmcm9tIGEgc2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlZWRUZXh0ID1cbiAgICAgICAgJzgwMzUwYjQyMDhkMzgxZmJmZTIyNzZhMzI2NjAzMDQ5ZmU1MDA3MzFjNDZkM2M5OTM2YjVjZTAzNmI1MTM3N2YyNGJhYjdkZDBjMmFmN2YxMDc0MTZlZjg1OGZmNzliMDY3MGM3MjQwNmRhZDA2NGU3MmJiMTdmYzBhOTAzOGJiJztcbiAgICAgIGNvbnN0IHNlZWQgPSBCdWZmZXIuZnJvbShzZWVkVGV4dCwgJ2hleCcpO1xuICAgICAgY29uc3Qga2V5UGFpciA9IGJhc2Vjb2luLmdlbmVyYXRlS2V5UGFpcihzZWVkKTtcbiAgICAgIGtleVBhaXIucHViLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3hwdWI2NjFNeU13QXFSYmNGQXdxdlNHYmszNWtKZjdDUXFkTjF3NENNVUJCVHFINWUzaXZqVTZEOHVndjloUlNnUmJSZW5DNHczYWhYZExWYWh3amdqWGhTdVFLTWROZG41NVk5VE5TYWdCa3R3cydcbiAgICAgICk7XG4gICAgICBrZXlQYWlyLnBydi5zaG91bGQuZXF1YWwoXG4gICAgICAgICd4cHJ2OXMyMVpyUUgxNDNLMmdzTnBRamJOdTkxa2RHaTFOdVdlaThiWjVtWnVWazZtRlBuQnZteGI3TlNKUWRiWlczRkdwSzNZY243am9yQVhjRXpNdnZpR3RieUJ6NXRCcmpmbld5UXAzZzc1RksnXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2lnbiB0cmFuc2FjdGlvbjonLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBzaWduIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qga2V5ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwcnY6ICcyMWQ0M2QyYWUwZGExZDlkMDRjZmNhYWM3ZDM5N2EzMzczMzg4MTA4MWYwYjJjZDAzODA2MmNmMGNjYmI3NTI2MDEnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICdTVERFN1k4SFYzUlg4VkJNMlRaVldKVFM3WkExWEIwU1NDM05FVkgwJztcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAnO1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgYnVpbGRVbnNpZ25lZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgcHVibGljS2V5OiBrZXkuZ2V0S2V5cygpLnB1YixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICBwcnY6IGtleS5nZXRLZXlzKCkucHJ2IS50b1N0cmluZygpLFxuICAgICAgICBwdWJLZXlzOiBba2V5LmdldEtleXMoKS5wdWJdLFxuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgdHhIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoY29pbk5hbWUpKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eC5oYWxmU2lnbmVkLnR4SGV4KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSBzaWduZWRUeC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5wYXlsb2FkLnRvLnNob3VsZC5lcXVhbChkZXN0aW5hdGlvbik7XG4gICAgICB0eEpzb24ucGF5bG9hZC5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2lnbiBtdWx0aXNpZyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGtleTEgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHBydjogJzIxZDQzZDJhZTBkYTFkOWQwNGNmY2FhYzdkMzk3YTMzNzMzODgxMDgxZjBiMmNkMDM4MDYyY2YwY2NiYjc1MjYwMScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGtleTIgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHBydjogJ2M3MTcwMGIwN2Q1MjBhOGM5NzMxZTRkMGYwOTVhYTZlZmI5MWUxNmUyNWZiMjdjZTJiNzJlN2I2OThmODEyN2EwMScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGtleTMgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHBydjogJ2U3NWRjYjY2Zjg0Mjg3ZWFmMzQ3OTU1ZTk0ZmEwNDMzNzI5OGRiZDk1YWEwZGJiOTg1NzcxMTA0ZWYxOTEzZGIwMScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gJ1NUREU3WThIVjNSWDhWQk0yVFpWV0pUUzdaQTFYQjBTU0MzTkVWSDAnO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMCc7XG4gICAgICBjb25zdCBwdWJsaWNLZXlzID0gW2tleTEuZ2V0S2V5cyh0cnVlKS5wdWIsIGtleTIuZ2V0S2V5cyh0cnVlKS5wdWIsIGtleTMuZ2V0S2V5cyh0cnVlKS5wdWJdO1xuICAgICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IGJ1aWxkbXVsdGlTaWdVbnNpZ25lZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgcHVibGljS2V5cyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBiYXNlY29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICBwcnY6IFtcbiAgICAgICAgICAnMjFkNDNkMmFlMGRhMWQ5ZDA0Y2ZjYWFjN2QzOTdhMzM3MzM4ODEwODFmMGIyY2QwMzgwNjJjZjBjY2JiNzUyNjAxJyxcbiAgICAgICAgICAnYzcxNzAwYjA3ZDUyMGE4Yzk3MzFlNGQwZjA5NWFhNmVmYjkxZTE2ZTI1ZmIyN2NlMmI3MmU3YjY5OGY4MTI3YTAxJyxcbiAgICAgICAgXSxcbiAgICAgICAgcHViS2V5czogW2tleTEuZ2V0S2V5cygpLnB1Yiwga2V5Mi5nZXRLZXlzKCkucHViLCBrZXkzLmdldEtleXMoKS5wdWJdLFxuICAgICAgICBudW1iZXJTaWduYXR1cmU6IDIsXG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleDogdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFN0eExpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldChjb2luTmFtZSkpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4LnR4SGV4KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSBzaWduZWRUeC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5wYXlsb2FkLnRvLnNob3VsZC5lcXVhbChkZXN0aW5hdGlvbik7XG4gICAgICB0eEpzb24ucGF5bG9hZC5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRTaWduaW5nUGF5bG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdHggYXMgYSBidWZmZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBub25UU1NDb2luID0gYml0Z28uY29pbigndHN0eCcpO1xuICAgICAgY29uc3QgYnVmZmVyVHggPSBhd2FpdCBub25UU1NDb2luLmdldFNpZ25hYmxlUGF5bG9hZCh0ZXN0RGF0YS51bnNpZ25lZFR4Rm9yRXhwbGFpblRyYW5zZmVyKTtcbiAgICAgIGJ1ZmZlclR4LnNob3VsZC5iZS5kZWVwRXF1YWwoQnVmZmVyLmZyb20odGVzdERhdGEudW5zaWduZWRUeEZvckV4cGxhaW5UcmFuc2ZlcikpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGFkZHJlc3MxID0gJzB4MTc0Y2ZkODIzYWY4Y2UyN2VkMGFmZWUzZmNmM2MzYmEyNTkxMTZiZSc7XG4gICAgY29uc3QgYWRkcmVzczIgPSAnMHg3ZTg1YmRjMjdjMDUwZTM5MDVlYmY0YjhlNjM0ZDlhZDZlZGQwZGU2JztcbiAgICBjb25zdCB0eFByZWJ1aWxkID0geyB0eEhleDogdGVzdERhdGEudHhGb3JFeHBsYWluVHJhbnNmZXIsIHR4SW5mbzoge30gfTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgdHhQcmVidWlsZCB3aXRoIG1vcmUgdGhhbiBvbmUgcmVjaXBpZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHt9KTtcblxuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7IGFtb3VudDogJzEwMDAwMDAwMDAwMDAnLCBhZGRyZXNzOiBhZGRyZXNzMSB9LFxuICAgICAgICAgIHsgYW1vdW50OiAnMjUwMDAwMDAwMDAwMCcsIGFkZHJlc3M6IGFkZHJlc3MyIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHdhbGxldDogd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYHRzdHggZG9lc24ndCBzdXBwb3J0IHNlbmRpbmcgdG8gbW9yZSB0aGFuIDEgZGVzdGluYXRpb24gYWRkcmVzcyB3aXRoaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uIFRyeSBhZ2FpbiwgdXNpbmcgb25seSBhIHNpbmdsZSByZWNpcGllbnQuYFxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiB0eFByZWJ1aWxkIGlzIG1pc3NpbmcgdHhIZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwge30pO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFtb3VudDogJzEwMDAnLCBhZGRyZXNzOiB0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLnJlY2lwaWVudCB9XSxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnZmFrZVdhbGxldFBhc3NwaHJhc2UnLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHt9LCB0eFBhcmFtcyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSBhIG5hdGl2ZSBTVFggdHJhbnNmZXIgd2l0aCBtYXRjaGluZyByZWNpcGllbnQgYW5kIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB7fSk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIucmVjaXBpZW50LFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBtZW1vOiB7IHR5cGU6ICcnLCB2YWx1ZTogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vIH0sXG4gICAgICAgIHdhbGxldCxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCB3cm9uZyByZWNpcGllbnQgYWRkcmVzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB7fSk7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRBZGRyZXNzID0gJ1NUMTFOSlRUS0dWVDZEMUhZNE5KUlZRV01RTTdUVkFSMDkxRUo4UDJZJztcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogcmVxdWVzdGVkQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5vdXRwdXRBbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbWVtbzogeyB0eXBlOiAnJywgdmFsdWU6IHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIubWVtbyB9LFxuICAgICAgICB3YWxsZXQsXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQcmVidWlsZCwgdHhQYXJhbXMgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYFR4IGRlc3RpbmF0aW9uIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50OiBleHBlY3RlZCAke3JlcXVlc3RlZEFkZHJlc3N9IGJ1dCBnb3QgJHt0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLnJlY2lwaWVudH1gXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggd3JvbmcgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbmV3IFdhbGxldChiaXRnbywgYmFzZWNvaW4sIHt9KTtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEFtb3VudCA9ICc5OTk5JztcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5yZWNpcGllbnQsXG4gICAgICAgICAgICBhbW91bnQ6IHJlcXVlc3RlZEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBtZW1vOiB7IHR5cGU6ICcnLCB2YWx1ZTogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5tZW1vIH0sXG4gICAgICAgIHdhbGxldCxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCB0eFBhcmFtcyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICBgVHggYW1vdW50IGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50IGFtb3VudDogZXhwZWN0ZWQgJHtyZXF1ZXN0ZWRBbW91bnR9IGJ1dCBnb3QgJHt0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudH1gXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggd3JvbmcgbWVtbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXQoYml0Z28sIGJhc2Vjb2luLCB7fSk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnR4RXhwbGFpbmVkVHJhbnNmZXIucmVjaXBpZW50LFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm91dHB1dEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBtZW1vOiB7IHR5cGU6ICcnLCB2YWx1ZTogJ3dyb25nIG1lbW8nIH0sXG4gICAgICAgIHdhbGxldCxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkLCB0eFBhcmFtcyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgnVHggbWVtbyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudCBtZW1vJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlcml2ZSB0aGUgbWVtbyBmcm9tIHRoZSByZWNpcGllbnQgYWRkcmVzcyBtZW1vIGlkIHdoZW4gbm8gbWVtbyBpcyBwYXNzZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlY29pbiwge30pO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBgJHt0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLnJlY2lwaWVudH0/bWVtb0lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICAgICAgICB0ZXN0RGF0YS50eEV4cGxhaW5lZFRyYW5zZmVyLm1lbW9cbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEudHhFeHBsYWluZWRUcmFuc2Zlci5vdXRwdXRBbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQcmVidWlsZCwgdHhQYXJhbXMgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5IHNCVEMgV2l0aGRyYXcgVHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBTdHhMaWIuVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RzdHgnKSk7XG4gICAgY29uc3QgcHJ2S2V5c1N0cmluZyA9IHJlc291cmNlcy5wcnZLZXlzU3RyaW5nLnNsaWNlKDAsIDIpO1xuXG4gICAgY29uc3QgYnVpbGRXaXRoZHJhd1R4ID0gYXN5bmMgKHdpdGhkcmF3UGFyYW1zOiB7IGFtb3VudDogc3RyaW5nOyBidGNBZGRyZXNzOiBzdHJpbmc7IG1heEZlZTogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFNidGNXaXRoZHJhd0J1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuZmVlKHsgZmVlOiAnMTAwMCcgfSk7XG4gICAgICBidWlsZGVyLm5vbmNlKDEpO1xuICAgICAgY29uc3QgcHViS2V5cyA9IHBydktleXNTdHJpbmcubWFwKChwcnYpID0+IHB1YmxpY0tleVRvSGV4KHByaXZhdGVLZXlUb1B1YmxpYyhwcnYpKSk7XG4gICAgICBidWlsZGVyLmZyb21QdWJLZXkocHViS2V5cyk7XG4gICAgICBidWlsZGVyLm51bWJlclNpZ25hdHVyZXMoMik7XG4gICAgICBidWlsZGVyLndpdGhkcmF3KHdpdGhkcmF3UGFyYW1zKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogcHJ2S2V5c1N0cmluZ1swXSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogcHJ2S2V5c1N0cmluZ1sxXSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgcmV0dXJuIHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgfTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgYSBtYXRjaGluZyBzQlRDIHdpdGhkcmF3YWwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3aXRoZHJhd1BhcmFtcyA9IHtcbiAgICAgICAgYW1vdW50OiAnMTAwMCcsXG4gICAgICAgIGJ0Y0FkZHJlc3M6ICdiYzFwcnhsODh3NDdzcnFoNzAzcHh2NTY3cTQ3ZTdlcHp1bWU0bmx6OGNnZXdmaHR1ZW5uOG5ncWd3bTgwdycsXG4gICAgICAgIG1heEZlZTogJzEwMDAwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkV2l0aGRyYXdUeCh3aXRoZHJhd1BhcmFtcyk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgc2J0Y1dpdGhkcmF3UGFyYW1zOiB3aXRoZHJhd1BhcmFtcyxcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1NNMUs5VkY1R040OFEwQUMyQzdTQjhXTTVONU5SNkRZQzlWTTNRRUpFJywgYW1vdW50OiAnMTAnIH1dLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQcmVidWlsZDogeyB0eEhleCB9LCB0eFBhcmFtcyB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHdpdGggd3JvbmcgYW1vdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2l0aGRyYXdQYXJhbXMgPSB7XG4gICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICBidGNBZGRyZXNzOiAnYmMxcHJ4bDg4dzQ3c3JxaDcwM3B4djU2N3E0N2U3ZXB6dW1lNG5sejhjZ2V3Zmh0dWVubjhuZ3Fnd204MHcnLFxuICAgICAgICBtYXhGZWU6ICcxMDAwMCcsXG4gICAgICB9O1xuICAgICAgY29uc3QgdHhIZXggPSBhd2FpdCBidWlsZFdpdGhkcmF3VHgod2l0aGRyYXdQYXJhbXMpO1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHNidGNXaXRoZHJhd1BhcmFtczogeyAuLi53aXRoZHJhd1BhcmFtcywgYW1vdW50OiAnOTk5OScgfSxcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1NNMUs5VkY1R040OFEwQUMyQzdTQjhXTTVONU5SNkRZQzlWTTNRRUpFJywgYW1vdW50OiAnMTAnIH1dLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgdHhIZXggfSwgdHhQYXJhbXMgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3NCVEMgd2l0aGRyYXdhbCBhbW91bnQgZG9lcyBub3QgbWF0Y2gvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgd2l0aCB3cm9uZyBtYXhGZWUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3aXRoZHJhd1BhcmFtcyA9IHtcbiAgICAgICAgYW1vdW50OiAnMTAwMCcsXG4gICAgICAgIGJ0Y0FkZHJlc3M6ICdiYzFwcnhsODh3NDdzcnFoNzAzcHh2NTY3cTQ3ZTdlcHp1bWU0bmx6OGNnZXdmaHR1ZW5uOG5ncWd3bTgwdycsXG4gICAgICAgIG1heEZlZTogJzEwMDAwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkV2l0aGRyYXdUeCh3aXRoZHJhd1BhcmFtcyk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgc2J0Y1dpdGhkcmF3UGFyYW1zOiB7IC4uLndpdGhkcmF3UGFyYW1zLCBtYXhGZWU6ICcxJyB9LFxuICAgICAgICByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnU00xSzlWRjVHTjQ4UTBBQzJDN1NCOFdNNU41TlI2RFlDOVZNM1FFSkUnLCBhbW91bnQ6ICcxMCcgfV0sXG4gICAgICB9O1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQcmVidWlsZDogeyB0eEhleCB9LCB0eFBhcmFtcyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvc0JUQyB3aXRoZHJhd2FsIG1heEZlZSBkb2VzIG5vdCBtYXRjaC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSB3aXRoIHdyb25nIGJ0Y0FkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3aXRoZHJhd1BhcmFtcyA9IHtcbiAgICAgICAgYW1vdW50OiAnMTAwMCcsXG4gICAgICAgIGJ0Y0FkZHJlc3M6ICdiYzFwcnhsODh3NDdzcnFoNzAzcHh2NTY3cTQ3ZTdlcHp1bWU0bmx6OGNnZXdmaHR1ZW5uOG5ncWd3bTgwdycsXG4gICAgICAgIG1heEZlZTogJzEwMDAwJyxcbiAgICAgIH07XG4gICAgICBjb25zdCB0eEhleCA9IGF3YWl0IGJ1aWxkV2l0aGRyYXdUeCh3aXRoZHJhd1BhcmFtcyk7XG4gICAgICBjb25zdCB0eFBhcmFtcyA9IHtcbiAgICAgICAgc2J0Y1dpdGhkcmF3UGFyYW1zOiB7IC4uLndpdGhkcmF3UGFyYW1zLCBidGNBZGRyZXNzOiAnMUJ2Qk1TRVlzdFdldHFURm41QXU0bTRHRmc3eEphTlZOMicgfSxcbiAgICAgICAgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1NNMUs5VkY1R040OFEwQUMyQzdTQjhXTTVONU5SNkRZQzlWTTNRRUpFJywgYW1vdW50OiAnMTAnIH1dLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UHJlYnVpbGQ6IHsgdHhIZXggfSwgdHhQYXJhbXMgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3NCVEMgd2l0aGRyYXdhbCBidGNBZGRyZXNzIGRvZXMgbm90IG1hdGNoLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB2ZXJpZnlpbmcgd2l0aGRyYXdhbCBwYXJhbXMgYWdhaW5zdCBhIG5vbi13aXRoZHJhd2FsIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgICAgIHNidGNXaXRoZHJhd1BhcmFtczoge1xuICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgIGJ0Y0FkZHJlc3M6ICcxQnZCTVNFWXN0V2V0cVRGbjVBdTRtNEdGZzd4SmFOVk4yJyxcbiAgICAgICAgICBtYXhGZWU6ICcxMDAwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6ICdTTTFLOVZGNUdONDhRMEFDMkM3U0I4V001TjVOUjZEWUM5Vk0zUUVKRScsIGFtb3VudDogJzEwJyB9XSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAudmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHR4SGV4OiByZXNvdXJjZXMuUkFXX1RYX1VOU0lHTkVEIH0sIHR4UGFyYW1zIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9UeCBpcyBub3QgYSB2YWxpZCBzQlRDIHdpdGhkcmF3YWwgdHJhbnNhY3Rpb24vKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JlY292ZXIgVHJhbnNhY3Rpb24gU1RYJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrLmVuYWJsZU5ldENvbm5lY3QoKTtcbiAgICB9KTtcbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcbiAgICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgICBub2NrLmRpc2FibGVOZXRDb25uZWN0KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2lnbmVkIHJlY292ZXIgdHJhbnNhY3Rpb24gd2hlbiBwcml2YXRlIGtleSBkYXRhIGlzIHBhc3NlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuSE9UX1dBTExFVF9ST09UX0FERFJFU1M7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjIvYWRkcmVzc2VzLyR7cm9vdEFkZHJlc3N9L2JhbGFuY2VzL3N0eGApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkFDQ09VTlRfQkFMQU5DRV9SRVNQT05TRSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjEvYWRkcmVzcy8ke3Jvb3RBZGRyZXNzfS9ub25jZXNgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX05PTkNFX1JFU1BPTlNFKTtcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2AsIHsgYWxsb3dVbm1vY2tlZDogdHJ1ZSB9KVxuICAgICAgICAucG9zdChgL3YyL2ZlZXMvdHJhbnNhY3Rpb25gLCB0ZXN0RGF0YS5GRUVfRVNUSU1BVElPTl9SRVFVRVNUKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5GRUVfRVNUSU1BVElPTl9SRVNQT05TRSk7XG5cbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuREVTVElOQVRJT05fQUREUkVTU19XUlcsXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uQklUR09fUFVCX0tFWSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLldBTExFVF9QQVNTUEhSQVNFLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBSZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcihyZWNvdmVyeU9wdGlvbnMpO1xuICAgICAgcmVzcG9uc2Uuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3R4SGV4Jyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLnR4SGV4LCB0ZXN0RGF0YS5IT1RfV0FMTEVUX1JFQ09WRVJZX1RYX0hFWCwgJ3R4IGhleCBub3QgbWF0Y2hpbmchJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHdoZW4gcHVibGljIGtleXMgYXJlIHBhc3NlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuQ09MRF9XQUxMRVRfUk9PVF9BRERSRVNTO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYClcbiAgICAgICAgLmdldChgL2V4dGVuZGVkL3YyL2FkZHJlc3Nlcy8ke3Jvb3RBZGRyZXNzfS9iYWxhbmNlcy9zdHhgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX0JBTEFOQ0VfUkVTUE9OU0UpO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYClcbiAgICAgICAgLmdldChgL2V4dGVuZGVkL3YxL2FkZHJlc3MvJHtyb290QWRkcmVzc30vbm9uY2VzYClcbiAgICAgICAgLnJlcGx5KDIwMCwgdGVzdERhdGEuQUNDT1VOVF9OT05DRV9SRVNQT05TRSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gLCB7IGFsbG93VW5tb2NrZWQ6IHRydWUgfSlcbiAgICAgICAgLnBvc3QoYC92Mi9mZWVzL3RyYW5zYWN0aW9uYCwgdGVzdERhdGEuRkVFX0VTVElNQVRJT05fUkVRVUVTVClcbiAgICAgICAgLnJlcGx5KDIwMCwgdGVzdERhdGEuRkVFX0VTVElNQVRJT05fUkVTUE9OU0UpO1xuXG4gICAgICBjb25zdCByZWNvdmVyeU9wdGlvbnM6IFJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uQkFDS1VQX0tFWSxcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLlVTRVJfS0VZLFxuICAgICAgICByb290QWRkcmVzczogcm9vdEFkZHJlc3MsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHRlc3REYXRhLkRFU1RJTkFUSU9OX0FERFJFU1NfV1JXLFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLkJJVEdPX1BVQl9LRVksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2U6IFJlY292ZXJ5SW5mbyA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eEhleCcpO1xuICAgICAgcmVzcG9uc2Uuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2NvaW4nKTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdmZWVJbmZvJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLnR4SGV4LCB0ZXN0RGF0YS5DT0xEX1dBTExFVF9VTlNJR05FRF9TV0VFUF9UWF9IRVgsICd0eCBoZXggbm90IG1hdGNoaW5nIScpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZS5jb2luLCAndHN0eCcsICdjb2luIG5vdCBtYXRjaGluZyEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaW52YWxpZCByb290IGFkZHJlc3Mgd2hlbiByb290IGFkZHJlc3MgaXMgbWlzc2luZyBvciBpbnZhbGlkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjb3ZlcnlPcHRpb25zOiBSZWNvdmVyeU9wdGlvbnMgPSB7XG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLkJBQ0tVUF9LRVksXG4gICAgICAgIHVzZXJLZXk6IHRlc3REYXRhLkNPTERfV0FMTEVUX1BVQkxJQ19LRVlfSU5GTy5VU0VSX0tFWSxcbiAgICAgICAgcm9vdEFkZHJlc3M6ICcnLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5ERVNUSU5BVElPTl9BRERSRVNTX1dSVyxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLkNPTERfV0FMTEVUX1BVQkxJQ19LRVlfSU5GTy5CSVRHT19QVUJfS0VZLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdpbnZhbGlkIHJvb3QgYWRkcmVzcyEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzIHdoZW4gZGVzdGluYXRpb24gYWRkcmVzcyBpcyBtaXNzaW5nIG9yIGludmFsaWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNvdmVyeU9wdGlvbnM6IFJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5DT0xEX1dBTExFVF9QVUJMSUNfS0VZX0lORk8uQkFDS1VQX0tFWSxcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLlVTRVJfS0VZLFxuICAgICAgICByb290QWRkcmVzczogdGVzdERhdGEuQ09MRF9XQUxMRVRfUk9PVF9BRERSRVNTLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiAnJyxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLkNPTERfV0FMTEVUX1BVQkxJQ19LRVlfSU5GTy5CSVRHT19QVUJfS0VZLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKS5zaG91bGQucmVqZWN0ZWRXaXRoKCdpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3MhJyk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBmYWlsIHdpdGggbm8gYmFsYW5jZSB3aGVuIHJvb3QgYWRkcmVzcyBkb2Vzbid0IGhhdmUgYmFsYW5jZVwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByb290QWRkcmVzcyA9IHRlc3REYXRhLkhPVF9XQUxMRVRfUk9PVF9BRERSRVNTO1xuICAgICAgY29uc3Qgc3R4QmFsYW5jZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGVzdERhdGEuQUNDT1VOVF9CQUxBTkNFX1JFU1BPTlNFKSk7XG4gICAgICBzdHhCYWxhbmNlLmJhbGFuY2UgPSAnMCc7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjIvYWRkcmVzc2VzLyR7cm9vdEFkZHJlc3N9L2JhbGFuY2VzL3N0eGApXG4gICAgICAgIC5yZXBseSgyMDAsIHN0eEJhbGFuY2UpO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYClcbiAgICAgICAgLmdldChgL2V4dGVuZGVkL3YxL2FkZHJlc3MvJHtyb290QWRkcmVzc30vbm9uY2VzYClcbiAgICAgICAgLnJlcGx5KDIwMCwgdGVzdERhdGEuQUNDT1VOVF9OT05DRV9SRVNQT05TRSk7XG4gICAgICBjb25zdCByZWNvdmVyeU9wdGlvbnM6IFJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uQkFDS1VQX0tFWSxcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLlVTRVJfS0VZLFxuICAgICAgICByb290QWRkcmVzczogcm9vdEFkZHJlc3MsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHRlc3REYXRhLkRFU1RJTkFUSU9OX0FERFJFU1NfV1JXLFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLkJJVEdPX1BVQl9LRVksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5XQUxMRVRfUEFTU1BIUkFTRSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHJlY292ZXJ5T3B0aW9ucykuc2hvdWxkLnJlamVjdGVkV2l0aChFcnJvck5vSW5wdXRUb1JlY292ZXIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggaW5zdWZmaWNpZW50IGJhbGFuY2Ugd2hlbiBzdHggYmFsYW5jZSBpcyBsb3dlciB0aGFuIGZlZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gdGVzdERhdGEuSE9UX1dBTExFVF9ST09UX0FERFJFU1M7XG4gICAgICAvLyBkZWVwIGNsb25lIHRvIHN0b3AgbXV0YXRpb25cbiAgICAgIGNvbnN0IGFjY291bnRCYWxhbmNlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0ZXN0RGF0YS5BQ0NPVU5UX0JBTEFOQ0VfUkVTUE9OU0UpKTtcbiAgICAgIGFjY291bnRCYWxhbmNlLmJhbGFuY2UgPSAnMTAwJzsgLy8gc2V0IGJhbGFuY2UgbG93ZXIgdGhhbiBmZWVcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92Mi9hZGRyZXNzZXMvJHtyb290QWRkcmVzc30vYmFsYW5jZXMvc3R4YClcbiAgICAgICAgLnJlcGx5KDIwMCwgYWNjb3VudEJhbGFuY2UpO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYClcbiAgICAgICAgLmdldChgL2V4dGVuZGVkL3YxL2FkZHJlc3MvJHtyb290QWRkcmVzc30vbm9uY2VzYClcbiAgICAgICAgLnJlcGx5KDIwMCwgdGVzdERhdGEuQUNDT1VOVF9OT05DRV9SRVNQT05TRSk7XG4gICAgICBjb25zdCBmZWVSZXF1ZXN0Qm9keSA9IHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFUVVFU1Q7XG4gICAgICBmZWVSZXF1ZXN0Qm9keS50cmFuc2FjdGlvbl9wYXlsb2FkID1cbiAgICAgICAgJzAwMDUxYTE1MDBhMWM0MmYwYzExYmZlMzg5M2Y0NzlhZjE4OTA0Njc3Njg1YmUwMDAwMDAwMDAwMDAwMDY0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYCwgeyBhbGxvd1VubW9ja2VkOiB0cnVlIH0pXG4gICAgICAgIC5wb3N0KGAvdjIvZmVlcy90cmFuc2FjdGlvbmAsIGZlZVJlcXVlc3RCb2R5KVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5GRUVfRVNUSU1BVElPTl9SRVNQT05TRSk7XG4gICAgICBjb25zdCByZWNvdmVyeU9wdGlvbnM6IFJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgYmFja3VwS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uQkFDS1VQX0tFWSxcbiAgICAgICAgdXNlcktleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLlVTRVJfS0VZLFxuICAgICAgICByb290QWRkcmVzczogcm9vdEFkZHJlc3MsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHRlc3REYXRhLkRFU1RJTkFUSU9OX0FERFJFU1NfV1JXLFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLkJJVEdPX1BVQl9LRVksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5XQUxMRVRfUEFTU1BIUkFTRSxcbiAgICAgIH07XG4gICAgICBhd2FpdCBiYXNlY29pbi5yZWNvdmVyKHJlY292ZXJ5T3B0aW9ucykuc2hvdWxkLnJlamVjdGVkV2l0aCgnaW5zdWZmaWNpZW50IGJhbGFuY2UgdG8gYnVpbGQgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IFJlY292ZXJ5UHJvdmlkZXJFcnJvciB3aGVuIHRoZSBub2RlIGZhaWxzIHRvIHJldHVybiB0aGUgc3R4IGJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByb290QWRkcmVzcyA9IHRlc3REYXRhLkhPVF9XQUxMRVRfUk9PVF9BRERSRVNTO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYClcbiAgICAgICAgLmdldChgL2V4dGVuZGVkL3YyL2FkZHJlc3Nlcy8ke3Jvb3RBZGRyZXNzfS9iYWxhbmNlcy9zdHhgKVxuICAgICAgICAucmVwbHkoNTAwLCB7IGVycm9yOiAnbm9kZSB1bmF2YWlsYWJsZScgfSk7XG4gICAgICBub2NrKGBodHRwczovL2FwaS50ZXN0bmV0Lmhpcm8uc29gKVxuICAgICAgICAuZ2V0KGAvZXh0ZW5kZWQvdjEvYWRkcmVzcy8ke3Jvb3RBZGRyZXNzfS9ub25jZXNgKVxuICAgICAgICAucmVwbHkoMjAwLCB0ZXN0RGF0YS5BQ0NPVU5UX05PTkNFX1JFU1BPTlNFKTtcbiAgICAgIGNvbnN0IHJlY292ZXJ5T3B0aW9uczogUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICBiYWNrdXBLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CQUNLVVBfS0VZLFxuICAgICAgICB1c2VyS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uVVNFUl9LRVksXG4gICAgICAgIHJvb3RBZGRyZXNzOiByb290QWRkcmVzcyxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogdGVzdERhdGEuREVTVElOQVRJT05fQUREUkVTU19XUlcsXG4gICAgICAgIGJpdGdvS2V5OiB0ZXN0RGF0YS5IT1RfV0FMTEVUX0tFWV9DQVJEX0lORk8uQklUR09fUFVCX0tFWSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLldBTExFVF9QQVNTUEhSQVNFLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKS5zaG91bGQucmVqZWN0ZWRXaXRoKFJlY292ZXJ5UHJvdmlkZXJFcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluY2x1ZGUgYSBtZW1vIHdoZW4gcmVjb3ZlcmluZyB0byBhIGRlc3RpbmF0aW9uIHdpdGggYSBtZW1vIGlkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB0ZXN0RGF0YS5IT1RfV0FMTEVUX1JPT1RfQUREUkVTUztcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92Mi9hZGRyZXNzZXMvJHtyb290QWRkcmVzc30vYmFsYW5jZXMvc3R4YClcbiAgICAgICAgLnJlcGx5KDIwMCwgdGVzdERhdGEuQUNDT1VOVF9CQUxBTkNFX1JFU1BPTlNFKTtcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92MS9hZGRyZXNzLyR7cm9vdEFkZHJlc3N9L25vbmNlc2ApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkFDQ09VTlRfTk9OQ0VfUkVTUE9OU0UpO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYCwgeyBhbGxvd1VubW9ja2VkOiB0cnVlIH0pXG4gICAgICAgIC5wb3N0KGAvdjIvZmVlcy90cmFuc2FjdGlvbmApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFU1BPTlNFKTtcblxuICAgICAgY29uc3QgcmVjb3ZlcnlPcHRpb25zOiBSZWNvdmVyeU9wdGlvbnMgPSB7XG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLkJBQ0tVUF9LRVksXG4gICAgICAgIHVzZXJLZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5VU0VSX0tFWSxcbiAgICAgICAgcm9vdEFkZHJlc3M6IHJvb3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBgJHt0ZXN0RGF0YS5ERVNUSU5BVElPTl9BRERSRVNTX1dSV30/bWVtb0lkPThgLFxuICAgICAgICBiaXRnb0tleTogdGVzdERhdGEuSE9UX1dBTExFVF9LRVlfQ0FSRF9JTkZPLkJJVEdPX1BVQl9LRVksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5XQUxMRVRfUEFTU1BIUkFTRSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZTogUmVjb3ZlcnlUcmFuc2FjdGlvbiA9IGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKTtcbiAgICAgIHJlc3BvbnNlLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0eEhleCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcmVjb3ZlciB3aGVuIHRoZSBiYWNrdXAga2V5IGlzIG5vdCBhIHByaXZhdGUga2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdEFkZHJlc3MgPSB0ZXN0RGF0YS5IT1RfV0FMTEVUX1JPT1RfQUREUkVTUztcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92Mi9hZGRyZXNzZXMvJHtyb290QWRkcmVzc30vYmFsYW5jZXMvc3R4YClcbiAgICAgICAgLnJlcGx5KDIwMCwgdGVzdERhdGEuQUNDT1VOVF9CQUxBTkNFX1JFU1BPTlNFKTtcbiAgICAgIG5vY2soYGh0dHBzOi8vYXBpLnRlc3RuZXQuaGlyby5zb2ApXG4gICAgICAgIC5nZXQoYC9leHRlbmRlZC92MS9hZGRyZXNzLyR7cm9vdEFkZHJlc3N9L25vbmNlc2ApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkFDQ09VTlRfTk9OQ0VfUkVTUE9OU0UpO1xuICAgICAgbm9jayhgaHR0cHM6Ly9hcGkudGVzdG5ldC5oaXJvLnNvYCwgeyBhbGxvd1VubW9ja2VkOiB0cnVlIH0pXG4gICAgICAgIC5wb3N0KGAvdjIvZmVlcy90cmFuc2FjdGlvbmApXG4gICAgICAgIC5yZXBseSgyMDAsIHRlc3REYXRhLkZFRV9FU1RJTUFUSU9OX1JFU1BPTlNFKTtcblxuICAgICAgY29uc3QgcmVjb3ZlcnlPcHRpb25zOiBSZWNvdmVyeU9wdGlvbnMgPSB7XG4gICAgICAgIGJhY2t1cEtleTogdGVzdERhdGEuQ09MRF9XQUxMRVRfUFVCTElDX0tFWV9JTkZPLkJBQ0tVUF9LRVksXG4gICAgICAgIHVzZXJLZXk6IHJlc291cmNlcy54cHJ2MSxcbiAgICAgICAgcm9vdEFkZHJlc3M6IHJvb3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiB0ZXN0RGF0YS5ERVNUSU5BVElPTl9BRERSRVNTX1dSVyxcbiAgICAgICAgYml0Z29LZXk6IHRlc3REYXRhLkhPVF9XQUxMRVRfS0VZX0NBUkRfSU5GTy5CSVRHT19QVUJfS0VZLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGJhc2Vjb2luLnJlY292ZXIocmVjb3ZlcnlPcHRpb25zKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdiYWNrdXBLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stxNodeErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stxNodeErrors.d.ts","sourceRoot":"","sources":["../../../test/unit/stxNodeErrors.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const sdk_api_1 = require("@bitgo/sdk-api");
8
+ const sdk_test_1 = require("@bitgo/sdk-test");
9
+ const src_1 = require("../../src");
10
+ describe('Stx node request error handling', function () {
11
+ let bitgo;
12
+ let basecoin;
13
+ const address = 'STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6';
14
+ const call = (method, arg) => basecoin[method](arg);
15
+ const stubBitgo = (get, post) => {
16
+ const bg = basecoin.bitgo;
17
+ const originalGet = bg.get;
18
+ const originalPost = bg.post;
19
+ bg.get = get;
20
+ bg.post = post;
21
+ return () => {
22
+ bg.get = originalGet;
23
+ bg.post = originalPost;
24
+ };
25
+ };
26
+ const errorStubs = () => stubBitgo(async () => ({ statusCode: 500, body: {} }), () => ({ send: async () => ({ statusCode: 500, body: {} }) }));
27
+ before(function () {
28
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
29
+ bitgo.initializeTestVars();
30
+ bitgo.safeRegister('stx', src_1.Stx.createInstance);
31
+ basecoin = bitgo.coin('stx');
32
+ });
33
+ it('wraps a failed native stx balance request', async function () {
34
+ const restore = errorStubs();
35
+ try {
36
+ await assert_1.default.rejects(call('getNativeStxBalanceFromNode', { address }), /unable to get native stx balance from node/);
37
+ }
38
+ finally {
39
+ restore();
40
+ }
41
+ });
42
+ it('wraps a failed fungible token balance request', async function () {
43
+ const restore = errorStubs();
44
+ try {
45
+ await assert_1.default.rejects(call('getSingleFungibleTokenBalanceFromNode', {
46
+ address,
47
+ assetId: 'ST000000000000000000002AMW42H.token::token',
48
+ }), /unable to get native stx balance from node/);
49
+ }
50
+ finally {
51
+ restore();
52
+ }
53
+ });
54
+ it('wraps a failed account nonce request', async function () {
55
+ const restore = errorStubs();
56
+ try {
57
+ await assert_1.default.rejects(call('getAccountNonceFromNode', { address }), /unable to get account nonce from node/);
58
+ }
59
+ finally {
60
+ restore();
61
+ }
62
+ });
63
+ it('wraps a failed transaction fee estimation request', async function () {
64
+ const restore = stubBitgo(async () => ({ statusCode: 200, body: {} }), () => ({ send: async () => ({ statusCode: 500, body: {} }) }));
65
+ try {
66
+ await assert_1.default.rejects(call('getTransactionFeeEstimation', { txHex: '00', txHexLength: 1 }), /unable to get transaction fee estimation/);
67
+ }
68
+ finally {
69
+ restore();
70
+ }
71
+ });
72
+ it('rejects a fee estimation response with an unexpected number of estimations', async function () {
73
+ const restore = stubBitgo(async () => ({ statusCode: 200, body: {} }), () => ({ send: async () => ({ statusCode: 200, body: { estimations: [] } }) }));
74
+ try {
75
+ await assert_1.default.rejects(call('getTransactionFeeEstimation', { txHex: '00', txHexLength: 1 }), /unable to get transaction fee estimation/);
76
+ }
77
+ finally {
78
+ restore();
79
+ }
80
+ });
81
+ it('rejects an unsupported token contract when selecting a builder', function () {
82
+ const selectBuilder = basecoin;
83
+ assert_1.default.throws(() => selectBuilder.getTokenOrNativeTransferBuilder('ST000000000000000000002AMW42H', 'not-a-token'), /invalid contract address or contract name, not supported/);
84
+ });
85
+ it('rejects building a token transfer for an unsupported contract', async function () {
86
+ const build = basecoin;
87
+ await assert_1.default.rejects(build.buildTokenTransferTransaction({
88
+ builder: {},
89
+ contractAddress: 'ST000000000000000000002AMW42H',
90
+ contractName: 'not-a-token',
91
+ pubs: [],
92
+ nonce: 0,
93
+ rootAddressDetails: { address },
94
+ destinationAddressDetails: { address },
95
+ stxBalance: '0',
96
+ }), /invalid contract address or contract name, not supported/);
97
+ });
98
+ it('rejects building a token transfer with no recoverable token balance', async function () {
99
+ const restore = stubBitgo(async () => ({ statusCode: 200, body: { balance: '0' } }), () => ({ send: async () => ({ statusCode: 200, body: {} }) }));
100
+ const build = basecoin;
101
+ try {
102
+ await assert_1.default.rejects(build.buildTokenTransferTransaction({
103
+ builder: {},
104
+ contractAddress: 'STAG18E45W613FZ3H4ZMF6QHH426EXM5QTSAVWYH',
105
+ contractName: 'tsip6dp-token',
106
+ pubs: [],
107
+ nonce: 0,
108
+ rootAddressDetails: { address },
109
+ destinationAddressDetails: { address },
110
+ stxBalance: '0',
111
+ }), /no token balance found to recover/);
112
+ }
113
+ finally {
114
+ restore();
115
+ }
116
+ });
117
+ });
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R4Tm9kZUVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9zdHhOb2RlRXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLDRDQUEwQztBQUMxQyw4Q0FBMEQ7QUFFMUQsbUNBQWdDO0FBS2hDLFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRTtJQUMxQyxJQUFJLEtBQW1CLENBQUM7SUFDeEIsSUFBSSxRQUFhLENBQUM7SUFDbEIsTUFBTSxPQUFPLEdBQUcsMENBQTBDLENBQUM7SUFFM0QsTUFBTSxJQUFJLEdBQUcsQ0FBSSxNQUFjLEVBQUUsR0FBWSxFQUFjLEVBQUUsQ0FDMUQsUUFBa0UsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVuRixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQVksRUFBRSxJQUFjLEVBQUUsRUFBRTtRQUNqRCxNQUFNLEVBQUUsR0FBSSxRQUFrRSxDQUFDLEtBQUssQ0FBQztRQUNyRixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQzNCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDN0IsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDYixFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNmLE9BQU8sR0FBRyxFQUFFO1lBQ1YsRUFBRSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUM7WUFDckIsRUFBRSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7UUFDekIsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUYsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQ3RCLFNBQVMsQ0FDUCxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUMzQyxHQUFHLEVBQUUsQ0FBQyxDQUFD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QUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUVBQXFFLEVBQUUsS0FBSztRQUM3RSxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQ3ZCLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFDekQsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FDOUQsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLFFBQStGLENBQUM7UUFDOUcsSUFBSSxDQUFDO1lBQ0gsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsS0FBSyxDQUFDLDZCQUE2QixDQUFDO2dCQUNsQyxPQUFPLEVBQUUsRUFBRTtnQkFDWCxlQUFlLEVBQUUsMENBQTBDO2dCQUMzRCxZQUFZLEVBQUUsZUFBZTtnQkFDN0IsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLENBQUM7Z0JBQ1Isa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUU7Z0JBQy9CLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFO2dCQUN0QyxVQUFVLEVBQUUsR0FBRzthQUNoQixDQUFDLEVBQ0YsbUNBQW1DLENBQ3BDLENBQUM7UUFDSixDQUFDO2dCQUFTLENBQUM7WUFDVCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvL3Nkay10ZXN0JztcblxuaW1wb3J0IHsgU3R4IH0gZnJvbSAnLi4vLi4vc3JjJztcblxudHlwZSBHZXRTdHViID0gKHVybDogc3RyaW5nKSA9PiBQcm9taXNlPHsgc3RhdHVzQ29kZTogbnVtYmVyOyBib2R5OiB1bmtub3duIH0+O1xudHlwZSBQb3N0U3R1YiA9ICh1cmw6IHN0cmluZykgPT4geyBzZW5kOiAoYm9keTogdW5rbm93bikgPT4gUHJvbWlzZTx7IHN0YXR1c0NvZGU6IG51bWJlcjsgYm9keTogdW5rbm93biB9PiB9O1xuXG5kZXNjcmliZSgnU3R4IG5vZGUgcmVxdWVzdCBlcnJvciBoYW5kbGluZycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogU3R4O1xuICBjb25zdCBhZGRyZXNzID0gJ1NUQjQ0SFlQWUFUMkJCMlFFNTEzTlNQODFIVE1ZV0JKUDAySFBHSzYnO1xuXG4gIGNvbnN0IGNhbGwgPSA8VD4obWV0aG9kOiBzdHJpbmcsIGFyZzogdW5rbm93bik6IFByb21pc2U8VD4gPT5cbiAgICAoYmFzZWNvaW4gYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCAoYTogdW5rbm93bikgPT4gUHJvbWlzZTxUPj4pW21ldGhvZF0oYXJnKTtcblxuICBjb25zdCBzdHViQml0Z28gPSAoZ2V0OiBHZXRTdHViLCBwb3N0OiBQb3N0U3R1YikgPT4ge1xuICAgIGNvbnN0IGJnID0gKGJhc2Vjb2luIGFzIHVua25vd24gYXMgeyBiaXRnbzogeyBnZXQ6IHVua25vd247IHBvc3Q6IHVua25vd24gfSB9KS5iaXRnbztcbiAgICBjb25zdCBvcmlnaW5hbEdldCA9IGJnLmdldDtcbiAgICBjb25zdCBvcmlnaW5hbFBvc3QgPSBiZy5wb3N0O1xuICAgIGJnLmdldCA9IGdldDtcbiAgICBiZy5wb3N0ID0gcG9zdDtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYmcuZ2V0ID0gb3JpZ2luYWxHZXQ7XG4gICAgICBiZy5wb3N0ID0gb3JpZ2luYWxQb3N0O1xuICAgIH07XG4gIH07XG5cbiAgY29uc3QgZXJyb3JTdHVicyA9ICgpID0+XG4gICAgc3R1YkJpdGdvKFxuICAgICAgYXN5bmMgKCkgPT4gKHsgc3RhdHVzQ29kZTogNTAwLCBib2R5OiB7fSB9KSxcbiAgICAgICgpID0+ICh7IHNlbmQ6IGFzeW5jICgpID0+ICh7IHN0YXR1c0NvZGU6IDUwMCwgYm9keToge30gfSkgfSlcbiAgICApO1xuXG4gIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG4gICAgYml0Z28uc2FmZVJlZ2lzdGVyKCdzdHgnLCBTdHguY3JlYXRlSW5zdGFuY2UpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbignc3R4JykgYXMgU3R4O1xuICB9KTtcblxuICBpdCgnd3JhcHMgYSBmYWlsZWQgbmF0aXZlIHN0eCBiYWxhbmNlIHJlcXVlc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVzdG9yZSA9IGVycm9yU3R1YnMoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGNhbGwoJ2dldE5hdGl2ZVN0eEJhbGFuY2VGcm9tTm9kZScsIHsgYWRkcmVzcyB9KSxcbiAgICAgICAgL3VuYWJsZSB0byBnZXQgbmF0aXZlIHN0eCBiYWxhbmNlIGZyb20gbm9kZS9cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCd3cmFwcyBhIGZhaWxlZCBmdW5naWJsZSB0b2tlbiBiYWxhbmNlIHJlcXVlc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVzdG9yZSA9IGVycm9yU3R1YnMoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGNhbGwoJ2dldFNpbmdsZUZ1bmdpYmxlVG9rZW5CYWxhbmNlRnJvbU5vZGUnLCB7XG4gICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgICBhc3NldElkOiAnU1QwMDAwMDAwMDAwMDAwMDAwMDAwMDJBTVc0MkgudG9rZW46OnRva2VuJyxcbiAgICAgICAgfSksXG4gICAgICAgIC91bmFibGUgdG8gZ2V0IG5hdGl2ZSBzdHggYmFsYW5jZSBmcm9tIG5vZGUvXG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnd3JhcHMgYSBmYWlsZWQgYWNjb3VudCBub25jZSByZXF1ZXN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3RvcmUgPSBlcnJvclN0dWJzKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGNhbGwoJ2dldEFjY291bnROb25jZUZyb21Ob2RlJywgeyBhZGRyZXNzIH0pLCAvdW5hYmxlIHRvIGdldCBhY2NvdW50IG5vbmNlIGZyb20gbm9kZS8pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnd3JhcHMgYSBmYWlsZWQgdHJhbnNhY3Rpb24gZmVlIGVzdGltYXRpb24gcmVxdWVzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCByZXN0b3JlID0gc3R1YkJpdGdvKFxuICAgICAgYXN5bmMgKCkgPT4gKHsgc3RhdHVzQ29kZTogMjAwLCBib2R5OiB7fSB9KSxcbiAgICAgICgpID0+ICh7IHNlbmQ6IGFzeW5jICgpID0+ICh7IHN0YXR1c0NvZGU6IDUwMCwgYm9keToge30gfSkgfSlcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgY2FsbCgnZ2V0VHJhbnNhY3Rpb25GZWVFc3RpbWF0aW9uJywgeyB0eEhleDogJzAwJywgdHhIZXhMZW5ndGg6IDEgfSksXG4gICAgICAgIC91bmFibGUgdG8gZ2V0IHRyYW5zYWN0aW9uIGZlZSBlc3RpbWF0aW9uL1xuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYSBmZWUgZXN0aW1hdGlvbiByZXNwb25zZSB3aXRoIGFuIHVuZXhwZWN0ZWQgbnVtYmVyIG9mIGVzdGltYXRpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlc3RvcmUgPSBzdHViQml0Z28oXG4gICAgICBhc3luYyAoKSA9PiAoeyBzdGF0dXNDb2RlOiAyMDAsIGJvZHk6IHt9IH0pLFxuICAgICAgKCkgPT4gKHsgc2VuZDogYXN5bmMgKCkgPT4gKHsgc3RhdHVzQ29kZTogMjAwLCBib2R5OiB7IGVzdGltYXRpb25zOiBbXSB9IH0pIH0pXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIGNhbGwoJ2dldFRyYW5zYWN0aW9uRmVlRXN0aW1hdGlvbicsIHsgdHhIZXg6ICcwMCcsIHR4SGV4TGVuZ3RoOiAxIH0pLFxuICAgICAgICAvdW5hYmxlIHRvIGdldCB0cmFuc2FjdGlvbiBmZWUgZXN0aW1hdGlvbi9cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc3RvcmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGFuIHVuc3VwcG9ydGVkIHRva2VuIGNvbnRyYWN0IHdoZW4gc2VsZWN0aW5nIGEgYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzZWxlY3RCdWlsZGVyID0gYmFzZWNvaW4gYXMgdW5rbm93biBhcyB7XG4gICAgICBnZXRUb2tlbk9yTmF0aXZlVHJhbnNmZXJCdWlsZGVyOiAoY29udHJhY3RBZGRyZXNzPzogc3RyaW5nLCBjb250cmFjdE5hbWU/OiBzdHJpbmcpID0+IHVua25vd247XG4gICAgfTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gc2VsZWN0QnVpbGRlci5nZXRUb2tlbk9yTmF0aXZlVHJhbnNmZXJCdWlsZGVyKCdTVDAwMDAwMDAwMDAwMDAwMDAwMDAwMkFNVzQySCcsICdub3QtYS10b2tlbicpLFxuICAgICAgL2ludmFsaWQgY29udHJhY3QgYWRkcmVzcyBvciBjb250cmFjdCBuYW1lLCBub3Qgc3VwcG9ydGVkL1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIGJ1aWxkaW5nIGEgdG9rZW4gdHJhbnNmZXIgZm9yIGFuIHVuc3VwcG9ydGVkIGNvbnRyYWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJ1aWxkID0gYmFzZWNvaW4gYXMgdW5rbm93biBhcyB7IGJ1aWxkVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uOiAocGFyYW1zOiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+IH07XG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICBidWlsZC5idWlsZFRva2VuVHJhbnNmZXJUcmFuc2FjdGlvbih7XG4gICAgICAgIGJ1aWxkZXI6IHt9LFxuICAgICAgICBjb250cmFjdEFkZHJlc3M6ICdTVDAwMDAwMDAwMDAwMDAwMDAwMDAwMkFNVzQySCcsXG4gICAgICAgIGNvbnRyYWN0TmFtZTogJ25vdC1hLXRva2VuJyxcbiAgICAgICAgcHViczogW10sXG4gICAgICAgIG5vbmNlOiAwLFxuICAgICAgICByb290QWRkcmVzc0RldGFpbHM6IHsgYWRkcmVzcyB9LFxuICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3NEZXRhaWxzOiB7IGFkZHJlc3MgfSxcbiAgICAgICAgc3R4QmFsYW5jZTogJzAnLFxuICAgICAgfSksXG4gICAgICAvaW52YWxpZCBjb250cmFjdCBhZGRyZXNzIG9yIGNvbnRyYWN0IG5hbWUsIG5vdCBzdXBwb3J0ZWQvXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYnVpbGRpbmcgYSB0b2tlbiB0cmFuc2ZlciB3aXRoIG5vIHJlY292ZXJhYmxlIHRva2VuIGJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcmVzdG9yZSA9IHN0dWJCaXRnbyhcbiAgICAgIGFzeW5jICgpID0+ICh7IHN0YXR1c0NvZGU6IDIwMCwgYm9keTogeyBiYWxhbmNlOiAnMCcgfSB9KSxcbiAgICAgICgpID0+ICh7IHNlbmQ6IGFzeW5jICgpID0+ICh7IHN0YXR1c0NvZGU6IDIwMCwgYm9keToge30gfSkgfSlcbiAgICApO1xuICAgIGNvbnN0IGJ1aWxkID0gYmFzZWNvaW4gYXMgdW5rbm93biBhcyB7IGJ1aWxkVG9rZW5UcmFuc2ZlclRyYW5zYWN0aW9uOiAocGFyYW1zOiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+IH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICBidWlsZC5idWlsZFRva2VuVHJhbnNmZXJUcmFuc2FjdGlvbih7XG4gICAgICAgICAgYnVpbGRlcjoge30sXG4gICAgICAgICAgY29udHJhY3RBZGRyZXNzOiAnU1RBRzE4RTQ1VzYxM0ZaM0g0Wk1GNlFISDQyNkVYTTVRVFNBVldZSCcsXG4gICAgICAgICAgY29udHJhY3ROYW1lOiAndHNpcDZkcC10b2tlbicsXG4gICAgICAgICAgcHViczogW10sXG4gICAgICAgICAgbm9uY2U6IDAsXG4gICAgICAgICAgcm9vdEFkZHJlc3NEZXRhaWxzOiB7IGFkZHJlc3MgfSxcbiAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3NEZXRhaWxzOiB7IGFkZHJlc3MgfSxcbiAgICAgICAgICBzdHhCYWxhbmNlOiAnMCcsXG4gICAgICAgIH0pLFxuICAgICAgICAvbm8gdG9rZW4gYmFsYW5jZSBmb3VuZCB0byByZWNvdmVyL1xuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdfQ==