@bitgo/abstract-utxo 11.6.0 → 11.7.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 (124) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts +20 -39
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  3. package/dist/cjs/src/abstractUtxoCoin.js +67 -140
  4. package/dist/cjs/src/impl/doge/doge.d.ts +0 -2
  5. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -1
  6. package/dist/cjs/src/impl/doge/doge.js +1 -4
  7. package/dist/cjs/src/index.d.ts +0 -1
  8. package/dist/cjs/src/index.d.ts.map +1 -1
  9. package/dist/cjs/src/index.js +1 -2
  10. package/dist/cjs/src/keychains.d.ts +1 -2
  11. package/dist/cjs/src/keychains.d.ts.map +1 -1
  12. package/dist/cjs/src/keychains.js +3 -4
  13. package/dist/cjs/src/names.d.ts +0 -23
  14. package/dist/cjs/src/names.d.ts.map +1 -1
  15. package/dist/cjs/src/names.js +2 -140
  16. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
  17. package/dist/cjs/src/recovery/backupKeyRecovery.js +3 -3
  18. package/dist/cjs/src/transaction/decode.d.ts +2 -6
  19. package/dist/cjs/src/transaction/decode.d.ts.map +1 -1
  20. package/dist/cjs/src/transaction/decode.js +4 -65
  21. package/dist/cjs/src/transaction/explainTransaction.d.ts +3 -6
  22. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
  23. package/dist/cjs/src/transaction/explainTransaction.js +4 -12
  24. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +1 -37
  25. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
  26. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +1 -344
  27. package/dist/cjs/src/transaction/fixedScript/index.d.ts +0 -2
  28. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -1
  29. package/dist/cjs/src/transaction/fixedScript/index.js +2 -6
  30. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  31. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +1 -2
  32. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +2 -14
  33. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  34. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +17 -49
  35. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -1
  36. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +4 -51
  37. package/dist/cjs/src/transaction/index.d.ts +1 -2
  38. package/dist/cjs/src/transaction/index.d.ts.map +1 -1
  39. package/dist/cjs/src/transaction/index.js +2 -4
  40. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
  41. package/dist/cjs/src/transaction/signTransaction.js +2 -9
  42. package/dist/cjs/src/transaction/types.d.ts +1 -4
  43. package/dist/cjs/src/transaction/types.d.ts.map +1 -1
  44. package/dist/cjs/src/transaction/types.js +1 -5
  45. package/dist/cjs/test/unit/address.js +24 -1
  46. package/dist/cjs/test/unit/buildSignSendLegacyFormat.js +3 -3
  47. package/dist/cjs/test/unit/customSigner.js +3 -3
  48. package/dist/cjs/test/unit/prebuildAndSign.js +5 -5
  49. package/dist/cjs/test/unit/signTransaction.js +9 -9
  50. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +25 -47
  51. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +19 -84
  52. package/dist/cjs/test/unit/transaction.js +9 -9
  53. package/dist/cjs/test/unit/verifyTransaction.js +1 -21
  54. package/dist/cjs/test/unit/wallet.js +3 -3
  55. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  56. package/dist/esm/abstractUtxoCoin.d.ts +20 -39
  57. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  58. package/dist/esm/abstractUtxoCoin.js +71 -111
  59. package/dist/esm/impl/doge/doge.d.ts +0 -2
  60. package/dist/esm/impl/doge/doge.d.ts.map +1 -1
  61. package/dist/esm/impl/doge/doge.js +1 -4
  62. package/dist/esm/index.d.ts +0 -1
  63. package/dist/esm/index.d.ts.map +1 -1
  64. package/dist/esm/index.js +1 -2
  65. package/dist/esm/keychains.d.ts +1 -2
  66. package/dist/esm/keychains.d.ts.map +1 -1
  67. package/dist/esm/keychains.js +3 -4
  68. package/dist/esm/names.d.ts +0 -23
  69. package/dist/esm/names.d.ts.map +1 -1
  70. package/dist/esm/names.js +1 -102
  71. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
  72. package/dist/esm/recovery/backupKeyRecovery.js +4 -4
  73. package/dist/esm/transaction/decode.d.ts +2 -6
  74. package/dist/esm/transaction/decode.d.ts.map +1 -1
  75. package/dist/esm/transaction/decode.js +4 -31
  76. package/dist/esm/transaction/explainTransaction.d.ts +3 -6
  77. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
  78. package/dist/esm/transaction/explainTransaction.js +4 -12
  79. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +1 -37
  80. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
  81. package/dist/esm/transaction/fixedScript/explainTransaction.js +2 -309
  82. package/dist/esm/transaction/fixedScript/index.d.ts +0 -2
  83. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -1
  84. package/dist/esm/transaction/fixedScript/index.js +1 -3
  85. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  86. package/dist/esm/transaction/fixedScript/parseTransaction.js +1 -2
  87. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +2 -14
  88. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  89. package/dist/esm/transaction/fixedScript/signTransaction.js +17 -49
  90. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -1
  91. package/dist/esm/transaction/fixedScript/verifyTransaction.js +4 -18
  92. package/dist/esm/transaction/index.d.ts +1 -2
  93. package/dist/esm/transaction/index.d.ts.map +1 -1
  94. package/dist/esm/transaction/index.js +2 -3
  95. package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
  96. package/dist/esm/transaction/signTransaction.js +3 -10
  97. package/dist/esm/transaction/types.d.ts +1 -4
  98. package/dist/esm/transaction/types.d.ts.map +1 -1
  99. package/dist/esm/transaction/types.js +2 -4
  100. package/package.json +6 -5
  101. package/dist/cjs/src/transaction/fetchInputs.d.ts +0 -27
  102. package/dist/cjs/src/transaction/fetchInputs.d.ts.map +0 -1
  103. package/dist/cjs/src/transaction/fetchInputs.js +0 -111
  104. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +0 -32
  105. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +0 -1
  106. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +0 -163
  107. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +0 -20
  108. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +0 -1
  109. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +0 -157
  110. package/dist/cjs/src/wasmUtil.d.ts +0 -34
  111. package/dist/cjs/src/wasmUtil.d.ts.map +0 -1
  112. package/dist/cjs/src/wasmUtil.js +0 -95
  113. package/dist/esm/transaction/fetchInputs.d.ts +0 -27
  114. package/dist/esm/transaction/fetchInputs.d.ts.map +0 -1
  115. package/dist/esm/transaction/fetchInputs.js +0 -74
  116. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +0 -32
  117. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +0 -1
  118. package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +0 -123
  119. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +0 -20
  120. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +0 -1
  121. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +0 -117
  122. package/dist/esm/wasmUtil.d.ts +0 -34
  123. package/dist/esm/wasmUtil.d.ts.map +0 -1
  124. package/dist/esm/wasmUtil.js +0 -54
@@ -41,69 +41,33 @@ const utxolib = __importStar(require("@bitgo/utxo-lib"));
41
41
  const utxo_lib_1 = require("@bitgo/utxo-lib");
42
42
  const wasm_utxo_1 = require("@bitgo/wasm-utxo");
43
43
  const fixedScript_1 = require("../../../../src/transaction/fixedScript");
44
- const names_1 = require("../../../../src/names");
45
44
  function describeTransactionWith(acidTest) {
46
45
  describe(`${acidTest.name}`, function () {
47
- let psbt;
48
- let psbtBytes;
49
46
  let walletXpubs;
50
47
  let customChangeWalletXpubs;
51
48
  let wasmPsbt;
52
- let refExplanation;
53
49
  before('prepare', function () {
54
- psbt = acidTest.createPsbt();
55
- const coinName = (0, names_1.getCoinName)(acidTest.network);
56
- refExplanation = (0, fixedScript_1.explainPsbt)(psbt, { pubs: acidTest.rootWalletKeys }, coinName, {
57
- strict: true,
58
- });
59
- psbtBytes = psbt.toBuffer();
50
+ const psbt = acidTest.createPsbt();
51
+ const psbtBytes = psbt.toBuffer();
60
52
  const networkName = utxolib.getNetworkName(acidTest.network);
61
53
  (0, strict_1.default)(networkName);
62
54
  walletXpubs = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from(acidTest.rootWalletKeys);
63
55
  customChangeWalletXpubs = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from(acidTest.otherWalletKeys);
64
56
  wasmPsbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(psbtBytes, networkName);
65
57
  });
66
- it('should match the expected values for explainPsbt', function () {
67
- // note: `outputs` means external outputs here
68
- strict_1.default.strictEqual(refExplanation.outputs.length, 3);
69
- strict_1.default.strictEqual(refExplanation.changeOutputs.length, acidTest.outputs.length - 3);
70
- strict_1.default.strictEqual(refExplanation.outputAmount, '1800');
71
- strict_1.default.strictEqual(refExplanation.changeOutputs.length, acidTest.outputs.length - 3);
72
- refExplanation.changeOutputs.forEach((change) => {
73
- strict_1.default.strictEqual(change.amount, '900');
74
- strict_1.default.strictEqual(typeof change.address, 'string');
75
- });
76
- });
77
- it('reference implementation should support custom change outputs', function () {
78
- const coinName = (0, names_1.getCoinName)(acidTest.network);
79
- const customChangeExplanation = (0, fixedScript_1.explainPsbt)(psbt, { pubs: acidTest.rootWalletKeys, customChangePubs: acidTest.otherWalletKeys }, coinName, { strict: true });
80
- strict_1.default.ok(customChangeExplanation.customChangeOutputs);
81
- strict_1.default.strictEqual(customChangeExplanation.changeOutputs.length, refExplanation.changeOutputs.length);
82
- strict_1.default.strictEqual(customChangeExplanation.outputs.length, refExplanation.outputs.length - 1);
83
- strict_1.default.strictEqual(customChangeExplanation.customChangeOutputs.length, 1);
84
- strict_1.default.strictEqual(customChangeExplanation.customChangeOutputs[0].amount, '900');
85
- });
86
- it('should match explainPsbtWasm', function () {
58
+ it('should return expected outputs from explainPsbtWasm', function () {
87
59
  const wasmExplanation = (0, fixedScript_1.explainPsbtWasm)(wasmPsbt, walletXpubs, {
88
60
  replayProtection: {
89
61
  publicKeys: [acidTest.getReplayProtectionPublicKey()],
90
62
  },
91
63
  });
92
- for (const key of Object.keys(refExplanation)) {
93
- const refValue = refExplanation[key];
94
- const wasmValue = wasmExplanation[key];
95
- switch (key) {
96
- case 'displayOrder':
97
- case 'inputSignatures':
98
- case 'signatures':
99
- // these are deprecated fields that we want to get rid of
100
- strict_1.default.deepStrictEqual(wasmValue, undefined);
101
- break;
102
- default:
103
- strict_1.default.deepStrictEqual(wasmValue, refValue, `mismatch for key ${key}`);
104
- break;
105
- }
106
- }
64
+ strict_1.default.strictEqual(wasmExplanation.outputs.length, 3);
65
+ strict_1.default.strictEqual(wasmExplanation.changeOutputs.length, acidTest.outputs.length - 3);
66
+ strict_1.default.strictEqual(wasmExplanation.outputAmount, '1800');
67
+ wasmExplanation.changeOutputs.forEach((change) => {
68
+ strict_1.default.strictEqual(change.amount, '900');
69
+ strict_1.default.strictEqual(typeof change.address, 'string');
70
+ });
107
71
  // verify new fields are present and stringified
108
72
  strict_1.default.strictEqual(typeof wasmExplanation.inputAmount, 'string');
109
73
  strict_1.default.ok(Array.isArray(wasmExplanation.inputs));
@@ -150,6 +114,20 @@ function describeTransactionWith(acidTest) {
150
114
  }
151
115
  describe('explainPsbt(Wasm)', function () {
152
116
  utxo_lib_1.testutil.AcidTest.suite().forEach((test) => describeTransactionWith(test));
117
+ it('explainPsbtWasmBigInt throws when total output value exceeds total input value', function () {
118
+ const network = utxolib.networks.bitcoin;
119
+ const rootWalletKeys = utxo_lib_1.testutil.getDefaultWalletKeys();
120
+ // Valid PSBT: one p2wsh input (5000 sat), one internal p2wsh output (3000 sat), fee = 2000
121
+ const psbt = utxo_lib_1.testutil.constructPsbt([{ scriptType: 'p2wsh', value: 5000n }], [{ scriptType: 'p2wsh', value: 3000n, isInternalAddress: true }], network, rootWalletKeys, 'unsigned');
122
+ // Tamper: reduce the witnessUtxo.value so that inputs (1000) < outputs (3000).
123
+ // Direct mutation avoids bip174's "duplicate data" guard on updateInput.
124
+ psbt.data.inputs[0].witnessUtxo.value = 1000n;
125
+ const wasmPsbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(psbt.toBuffer(), 'bitcoin');
126
+ const walletXpubs = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from(rootWalletKeys);
127
+ strict_1.default.throws(() => (0, fixedScript_1.explainPsbtWasmBigInt)(wasmPsbt, walletXpubs, {
128
+ replayProtection: { publicKeys: [] },
129
+ }), /Fee calculation error: outputs exceed inputs/);
130
+ });
153
131
  });
154
132
  describe('aggregateTransactionExplanations', function () {
155
133
  utxo_lib_1.testutil.AcidTest.suite()
@@ -190,4 +168,4 @@ describe('aggregateTransactionExplanations', function () {
190
168
  });
191
169
  });
192
170
  });
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblBzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvZXhwbGFpblBzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBd0M7QUFFeEMseURBQTJDO0FBQzNDLDhDQUEyQztBQUMzQyxnREFBcUQ7QUFHckQseUVBTWlEO0FBQ2pELGlEQUFvRDtBQUVwRCxTQUFTLHVCQUF1QixDQUFDLFFBQTJCO0lBQzFELFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUMzQixJQUFJLElBQTRCLENBQUM7UUFDakMsSUFBSSxTQUFpQixDQUFDO1FBQ3RCLElBQUksV0FBNkMsQ0FBQztRQUNsRCxJQUFJLHVCQUFxRSxDQUFDO1FBQzFFLElBQUksUUFBcUMsQ0FBQztRQUMxQyxJQUFJLGNBQXNDLENBQUM7UUFDM0MsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUEsbUJBQVcsRUFBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsY0FBYyxHQUFHLElBQUEseUJBQVcsRUFBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRTtnQkFDOUUsTUFBTSxFQUFFLElBQUk7YUFDYixDQUFDLENBQUM7WUFDSCxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdELElBQUEsZ0JBQU0sRUFBQyxXQUFXLENBQUMsQ0FBQztZQUNwQixXQUFXLEdBQUcsNkJB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QUFDLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IHRlc3R1dGlsIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGZpeGVkU2NyaXB0V2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB0eXBlIHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9leHBsYWluVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgZXhwbGFpblBzYnQsXG4gIGV4cGxhaW5Qc2J0V2FzbSxcbiAgZXhwbGFpblBzYnRXYXNtQmlnSW50LFxuICBhZ2dyZWdhdGVUcmFuc2FjdGlvbkV4cGxhbmF0aW9ucyxcbiAgdHlwZSBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uQmlnSW50LFxufSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQnO1xuaW1wb3J0IHsgZ2V0Q29pbk5hbWUgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbmFtZXMnO1xuXG5mdW5jdGlvbiBkZXNjcmliZVRyYW5zYWN0aW9uV2l0aChhY2lkVGVzdDogdGVzdHV0aWwuQWNpZFRlc3QpIHtcbiAgZGVzY3JpYmUoYCR7YWNpZFRlc3QubmFtZX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQ7XG4gICAgbGV0IHBzYnRCeXRlczogQnVmZmVyO1xuICAgIGxldCB3YWxsZXRYcHViczogZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXM7XG4gICAgbGV0IGN1c3RvbUNoYW5nZVdhbGxldFhwdWJzOiBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidDtcbiAgICBsZXQgcmVmRXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG4gICAgYmVmb3JlKCdwcmVwYXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgcHNidCA9IGFjaWRUZXN0LmNyZWF0ZVBzYnQoKTtcbiAgICAgIGNvbnN0IGNvaW5OYW1lID0gZ2V0Q29pbk5hbWUoYWNpZFRlc3QubmV0d29yayk7XG4gICAgICByZWZFeHBsYW5hdGlvbiA9IGV4cGxhaW5Qc2J0KHBzYnQsIHsgcHViczogYWNpZFRlc3Qucm9vdFdhbGxldEtleXMgfSwgY29pbk5hbWUsIHtcbiAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBwc2J0Qnl0ZXMgPSBwc2J0LnRvQnVmZmVyKCk7XG4gICAgICBjb25zdCBuZXR3b3JrTmFtZSA9IHV0eG9saWIuZ2V0TmV0d29ya05hbWUoYWNpZFRlc3QubmV0d29yayk7XG4gICAgICBhc3NlcnQobmV0d29ya05hbWUpO1xuICAgICAgd2FsbGV0WHB1YnMgPSBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tKGFjaWRUZXN0LnJvb3RXYWxsZXRLZXlzKTtcbiAgICAgIGN1c3RvbUNoYW5nZVdhbGxldFhwdWJzID0gZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbShhY2lkVGVzdC5vdGhlcldhbGxldEtleXMpO1xuICAgICAgd2FzbVBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuZnJvbUJ5dGVzKHBzYnRCeXRlcywgbmV0d29ya05hbWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWVzIGZvciBleHBsYWluUHNidCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIG5vdGU6IGBvdXRwdXRzYCBtZWFucyBleHRlcm5hbCBvdXRwdXRzIGhlcmVcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWZFeHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVmRXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5sZW5ndGgsIGFjaWRUZXN0Lm91dHB1dHMubGVuZ3RoIC0gMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVmRXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LCAnMTgwMCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlZkV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoLCBhY2lkVGVzdC5vdXRwdXRzLmxlbmd0aCAtIDMpO1xuICAgICAgcmVmRXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNoYW5nZS5hbW91bnQsICc5MDAnKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBjaGFuZ2UuYWRkcmVzcywgJ3N0cmluZycpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHNob3VsZCBzdXBwb3J0IGN1c3RvbSBjaGFuZ2Ugb3V0cHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvaW5OYW1lID0gZ2V0Q29pbk5hbWUoYWNpZFRlc3QubmV0d29yayk7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VFeHBsYW5hdGlvbiA9IGV4cGxhaW5Qc2J0KFxuICAgICAgICBwc2J0LFxuICAgICAgICB7IHB1YnM6IGFjaWRUZXN0LnJvb3RXYWxsZXRLZXlzLCBjdXN0b21DaGFuZ2VQdWJzOiBhY2lkVGVzdC5vdGhlcldhbGxldEtleXMgfSxcbiAgICAgICAgY29pbk5hbWUsXG4gICAgICAgIHsgc3RyaWN0OiB0cnVlIH1cbiAgICAgICk7XG4gICAgICBhc3NlcnQub2soY3VzdG9tQ2hhbmdlRXhwbGFuYXRpb24uY3VzdG9tQ2hhbmdlT3V0cHV0cyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VzdG9tQ2hhbmdlRXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5sZW5ndGgsIHJlZkV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXN0b21DaGFuZ2VFeHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgcmVmRXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGggLSAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXN0b21DaGFuZ2VFeHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VPdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VzdG9tQ2hhbmdlRXhwbGFuYXRpb24uY3VzdG9tQ2hhbmdlT3V0cHV0c1swXS5hbW91bnQsICc5MDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWF0Y2ggZXhwbGFpblBzYnRXYXNtJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbUV4cGxhbmF0aW9uID0gZXhwbGFpblBzYnRXYXNtKHdhc21Qc2J0LCB3YWxsZXRYcHVicywge1xuICAgICAgICByZXBsYXlQcm90ZWN0aW9uOiB7XG4gICAgICAgICAgcHVibGljS2V5czogW2FjaWRUZXN0LmdldFJlcGxheVByb3RlY3Rpb25QdWJsaWNLZXkoKV0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVmRXhwbGFuYXRpb24pKSB7XG4gICAgICAgIGNvbnN0IHJlZlZhbHVlID0gcmVmRXhwbGFuYXRpb25ba2V5XTtcbiAgICAgICAgY29uc3Qgd2FzbVZhbHVlID0gd2FzbUV4cGxhbmF0aW9uW2tleV07XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgY2FzZSAnZGlzcGxheU9yZGVyJzpcbiAgICAgICAgICBjYXNlICdpbnB1dFNpZ25hdHVyZXMnOlxuICAgICAgICAgIGNhc2UgJ3NpZ25hdHVyZXMnOlxuICAgICAgICAgICAgLy8gdGhlc2UgYXJlIGRlcHJlY2F0ZWQgZmllbGRzIHRoYXQgd2Ugd2FudCB0byBnZXQgcmlkIG9mXG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHdhc21WYWx1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHdhc21WYWx1ZSwgcmVmVmFsdWUsIGBtaXNtYXRjaCBmb3Iga2V5ICR7a2V5fWApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdmVyaWZ5IG5ldyBmaWVsZHMgYXJlIHByZXNlbnQgYW5kIHN0cmluZ2lmaWVkXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIHdhc21FeHBsYW5hdGlvbi5pbnB1dEFtb3VudCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0Lm9rKEFycmF5LmlzQXJyYXkod2FzbUV4cGxhbmF0aW9uLmlucHV0cykpO1xuICAgICAgYXNzZXJ0Lm9rKHdhc21FeHBsYW5hdGlvbi5pbnB1dHMubGVuZ3RoID4gMCk7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHdhc21FeHBsYW5hdGlvbi5pbnB1dHMpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBpbnB1dC5hZGRyZXNzLCAnc3RyaW5nJyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgaW5wdXQudmFsdWUsICdzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhY2lkVGVzdC5uZXR3b3JrICE9PSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpdCgnZXhwbGFpblBzYnRXYXNtQmlnSW50IHJldHVybnMgYmlnaW50IGFtb3VudHMgYW5kIGlucHV0cyBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cGxhaW5Qc2J0V2FzbUJpZ0ludCh3YXNtUHNidCwgd2FsbGV0WHB1YnMsIHtcbiAgICAgICAgcmVwbGF5UHJvdGVjdGlvbjogeyBwdWJsaWNLZXlzOiBbYWNpZFRlc3QuZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmxpY0tleSgpXSB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIHJlc3VsdC5mZWUsICdiaWdpbnQnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgcmVzdWx0Lm91dHB1dEFtb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQuY2hhbmdlQW1vdW50LCAnYmlnaW50Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIHJlc3VsdC5pbnB1dEFtb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5pbnB1dHMubGVuZ3RoID4gMCk7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHJlc3VsdC5pbnB1dHMpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBpbnB1dC5hZGRyZXNzLCAnc3RyaW5nJyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgaW5wdXQudmFsdWUsICdiaWdpbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN1bUlucHV0cyA9IHJlc3VsdC5pbnB1dHMucmVkdWNlKChzLCBpKSA9PiBzICsgaS52YWx1ZSwgMG4pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5pbnB1dEFtb3VudCwgc3VtSW5wdXRzKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgcmVzdWx0LmZlZSxcbiAgICAgICAgcmVzdWx0LmlucHV0QW1vdW50IC0gcmVzdWx0Lm91dHB1dEFtb3VudCAtIHJlc3VsdC5jaGFuZ2VBbW91bnQgLSByZXN1bHQuY3VzdG9tQ2hhbmdlQW1vdW50XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gZXh0ZW5kZWQgdGVzdCBzdWl0ZSBmb3IgYml0Y29pblxuXG4gICAgaXQoJ3JldHVybnMgY3VzdG9tIGNoYW5nZSBvdXRwdXRzIHdoZW4gcGFyYW1ldGVyIGlzIHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21FeHBsYW5hdGlvbiA9IGV4cGxhaW5Qc2J0V2FzbSh3YXNtUHNidCwgd2FsbGV0WHB1YnMsIHtcbiAgICAgICAgcmVwbGF5UHJvdGVjdGlvbjoge1xuICAgICAgICAgIHB1YmxpY0tleXM6IFthY2lkVGVzdC5nZXRSZXBsYXlQcm90ZWN0aW9uUHVibGljS2V5KCldLFxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21DaGFuZ2VXYWxsZXRYcHVicyxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0Lm9rKHdhc21FeHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VPdXRwdXRzKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwod2FzbUV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwod2FzbUV4cGxhbmF0aW9uLmN1c3RvbUNoYW5nZU91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwod2FzbUV4cGxhbmF0aW9uLmN1c3RvbUNoYW5nZU91dHB1dHNbMF0uYW1vdW50LCAnOTAwJyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5kZXNjcmliZSgnZXhwbGFpblBzYnQoV2FzbSknLCBmdW5jdGlvbiAoKSB7XG4gIHRlc3R1dGlsLkFjaWRUZXN0LnN1aXRlKCkuZm9yRWFjaCgodGVzdCkgPT4gZGVzY3JpYmVUcmFuc2FjdGlvbldpdGgodGVzdCkpO1xufSk7XG5cbmRlc2NyaWJlKCdhZ2dyZWdhdGVUcmFuc2FjdGlvbkV4cGxhbmF0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgdGVzdHV0aWwuQWNpZFRlc3Quc3VpdGUoKVxuICAgIC5maWx0ZXIoKHQpID0+IHQubmV0d29yayA9PT0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKVxuICAgIC5mb3JFYWNoKChhY2lkVGVzdCkgPT4ge1xuICAgICAgZGVzY3JpYmUoYWNpZFRlc3QubmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgZXhwOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uQmlnSW50O1xuXG4gICAgICAgIGJlZm9yZSgncHJlcGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBwc2J0Qnl0ZXMgPSBhY2lkVGVzdC5jcmVhdGVQc2J0KCkudG9CdWZmZXIoKTtcbiAgICAgICAgICBjb25zdCBuZXR3b3JrTmFtZSA9IHV0eG9saWIuZ2V0TmV0d29ya05hbWUoYWNpZFRlc3QubmV0d29yayk7XG4gICAgICAgICAgYXNzZXJ0KG5ldHdvcmtOYW1lKTtcbiAgICAgICAgICBjb25zdCB3YXNtUHNidCA9IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidC5mcm9tQnl0ZXMocHNidEJ5dGVzLCBuZXR3b3JrTmFtZSk7XG4gICAgICAgICAgY29uc3Qgd2FsbGV0WHB1YnMgPSBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tKGFjaWRUZXN0LnJvb3RXYWxsZXRLZXlzKTtcbiAgICAgICAgICBleHAgPSBleHBsYWluUHNidFdhc21CaWdJbnQod2FzbVBzYnQsIHdhbGxldFhwdWJzLCB7XG4gICAgICAgICAgICByZXBsYXlQcm90ZWN0aW9uOiB7IHB1YmxpY0tleXM6IFthY2lkVGVzdC5nZXRSZXBsYXlQcm90ZWN0aW9uUHVibGljS2V5KCldIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhZ2dyZWdhdGluZyBhIHNpbmdsZSBleHBsYW5hdGlvbiBpcyBpZGVudGl0eScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBhZ2cgPSBhZ2dyZWdhdGVUcmFuc2FjdGlvbkV4cGxhbmF0aW9ucyhbZXhwXSk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5pbnB1dENvdW50LCBleHAuaW5wdXRzLmxlbmd0aCk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5vdXRwdXRDb3VudCwgZXhwLm91dHB1dHMubGVuZ3RoKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLmNoYW5nZU91dHB1dENvdW50LCBleHAuY2hhbmdlT3V0cHV0cy5sZW5ndGgpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cuaW5wdXRBbW91bnQsIGV4cC5pbnB1dEFtb3VudCk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5vdXRwdXRBbW91bnQsIGV4cC5vdXRwdXRBbW91bnQpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cuY2hhbmdlQW1vdW50LCBleHAuY2hhbmdlQW1vdW50KTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLmZlZSwgZXhwLmZlZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhZ2dyZWdhdGluZyB0d28gaWRlbnRpY2FsIGV4cGxhbmF0aW9ucyBkb3VibGVzIGFsbCBjb3VudHMgYW5kIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgYWdnID0gYWdncmVnYXRlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbnMoW2V4cCwgZXhwXSk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5pbnB1dENvdW50LCBleHAuaW5wdXRzLmxlbmd0aCAqIDIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cub3V0cHV0Q291bnQsIGV4cC5vdXRwdXRzLmxlbmd0aCAqIDIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cuY2hhbmdlT3V0cHV0Q291bnQsIGV4cC5jaGFuZ2VPdXRwdXRzLmxlbmd0aCAqIDIpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cuaW5wdXRBbW91bnQsIGV4cC5pbnB1dEFtb3VudCAqIDJuKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLm91dHB1dEFtb3VudCwgZXhwLm91dHB1dEFtb3VudCAqIDJuKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLmNoYW5nZUFtb3VudCwgZXhwLmNoYW5nZUFtb3VudCAqIDJuKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLmZlZSwgZXhwLmZlZSAqIDJuKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbn0pO1xuIl19
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblBzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvZXhwbGFpblBzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBd0M7QUFFeEMseURBQTJDO0FBQzNDLDhDQUEyQztBQUMzQyxnREFBcUQ7QUFFckQseUVBS2lEO0FBRWpELFNBQVMsdUJBQXVCLENBQUMsUUFBMkI7SUFDMUQsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzNCLElBQUksV0FBNkMsQ0FBQztRQUNsRCxJQUFJLHVCQUFxRSxDQUFDO1FBQzFFLElBQUksUUFBcUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BCLFdBQVcsR0FBRyw2QkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3RSx1QkFBdUIsR0FBRyw2QkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMxRixRQUFRLEdBQUcsNkJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUU7WUFDeEQsTUFB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QUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzVELGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydC9zdHJpY3QnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyB0ZXN0dXRpbCB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQge1xuICBleHBsYWluUHNidFdhc20sXG4gIGV4cGxhaW5Qc2J0V2FzbUJpZ0ludCxcbiAgYWdncmVnYXRlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbnMsXG4gIHR5cGUgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbkJpZ0ludCxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0JztcblxuZnVuY3Rpb24gZGVzY3JpYmVUcmFuc2FjdGlvbldpdGgoYWNpZFRlc3Q6IHRlc3R1dGlsLkFjaWRUZXN0KSB7XG4gIGRlc2NyaWJlKGAke2FjaWRUZXN0Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXRYcHViczogZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXM7XG4gICAgbGV0IGN1c3RvbUNoYW5nZVdhbGxldFhwdWJzOiBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidDtcbiAgICBiZWZvcmUoJ3ByZXBhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwc2J0ID0gYWNpZFRlc3QuY3JlYXRlUHNidCgpO1xuICAgICAgY29uc3QgcHNidEJ5dGVzID0gcHNidC50b0J1ZmZlcigpO1xuICAgICAgY29uc3QgbmV0d29ya05hbWUgPSB1dHhvbGliLmdldE5ldHdvcmtOYW1lKGFjaWRUZXN0Lm5ldHdvcmspO1xuICAgICAgYXNzZXJ0KG5ldHdvcmtOYW1lKTtcbiAgICAgIHdhbGxldFhwdWJzID0gZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbShhY2lkVGVzdC5yb290V2FsbGV0S2V5cyk7XG4gICAgICBjdXN0b21DaGFuZ2VXYWxsZXRYcHVicyA9IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzLmZyb20oYWNpZFRlc3Qub3RoZXJXYWxsZXRLZXlzKTtcbiAgICAgIHdhc21Qc2J0ID0gZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LmZyb21CeXRlcyhwc2J0Qnl0ZXMsIG5ldHdvcmtOYW1lKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGVjdGVkIG91dHB1dHMgZnJvbSBleHBsYWluUHNidFdhc20nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtRXhwbGFuYXRpb24gPSBleHBsYWluUHNidFdhc20od2FzbVBzYnQsIHdhbGxldFhwdWJzLCB7XG4gICAgICAgIHJlcGxheVByb3RlY3Rpb246IHtcbiAgICAgICAgICBwdWJsaWNLZXlzOiBbYWNpZFRlc3QuZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmxpY0tleSgpXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21FeHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoLCBhY2lkVGVzdC5vdXRwdXRzLmxlbmd0aCAtIDMpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21FeHBsYW5hdGlvbi5vdXRwdXRBbW91bnQsICcxODAwJyk7XG4gICAgICB3YXNtRXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNoYW5nZS5hbW91bnQsICc5MDAnKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiBjaGFuZ2UuYWRkcmVzcywgJ3N0cmluZycpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHZlcmlmeSBuZXcgZmllbGRzIGFyZSBwcmVzZW50IGFuZCBzdHJpbmdpZmllZFxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiB3YXNtRXhwbGFuYXRpb24uaW5wdXRBbW91bnQsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC5vayhBcnJheS5pc0FycmF5KHdhc21FeHBsYW5hdGlvbi5pbnB1dHMpKTtcbiAgICAgIGFzc2VydC5vayh3YXNtRXhwbGFuYXRpb24uaW5wdXRzLmxlbmd0aCA+IDApO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB3YXNtRXhwbGFuYXRpb24uaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgaW5wdXQuYWRkcmVzcywgJ3N0cmluZycpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGlucHV0LnZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYWNpZFRlc3QubmV0d29yayAhPT0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXQoJ2V4cGxhaW5Qc2J0V2FzbUJpZ0ludCByZXR1cm5zIGJpZ2ludCBhbW91bnRzIGFuZCBpbnB1dHMgYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBleHBsYWluUHNidFdhc21CaWdJbnQod2FzbVBzYnQsIHdhbGxldFhwdWJzLCB7XG4gICAgICAgIHJlcGxheVByb3RlY3Rpb246IHsgcHVibGljS2V5czogW2FjaWRUZXN0LmdldFJlcGxheVByb3RlY3Rpb25QdWJsaWNLZXkoKV0gfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQuZmVlLCAnYmlnaW50Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIHJlc3VsdC5vdXRwdXRBbW91bnQsICdiaWdpbnQnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgcmVzdWx0LmNoYW5nZUFtb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiByZXN1bHQuaW5wdXRBbW91bnQsICdiaWdpbnQnKTtcbiAgICAgIGFzc2VydC5vayhyZXN1bHQuaW5wdXRzLmxlbmd0aCA+IDApO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiByZXN1bHQuaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eXBlb2YgaW5wdXQuYWRkcmVzcywgJ3N0cmluZycpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGlucHV0LnZhbHVlLCAnYmlnaW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdW1JbnB1dHMgPSByZXN1bHQuaW5wdXRzLnJlZHVjZSgocywgaSkgPT4gcyArIGkudmFsdWUsIDBuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQuaW5wdXRBbW91bnQsIHN1bUlucHV0cyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIHJlc3VsdC5mZWUsXG4gICAgICAgIHJlc3VsdC5pbnB1dEFtb3VudCAtIHJlc3VsdC5vdXRwdXRBbW91bnQgLSByZXN1bHQuY2hhbmdlQW1vdW50IC0gcmVzdWx0LmN1c3RvbUNoYW5nZUFtb3VudFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIGV4dGVuZGVkIHRlc3Qgc3VpdGUgZm9yIGJpdGNvaW5cblxuICAgIGl0KCdyZXR1cm5zIGN1c3RvbSBjaGFuZ2Ugb3V0cHV0cyB3aGVuIHBhcmFtZXRlciBpcyBzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtRXhwbGFuYXRpb24gPSBleHBsYWluUHNidFdhc20od2FzbVBzYnQsIHdhbGxldFhwdWJzLCB7XG4gICAgICAgIHJlcGxheVByb3RlY3Rpb246IHtcbiAgICAgICAgICBwdWJsaWNLZXlzOiBbYWNpZFRlc3QuZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmxpY0tleSgpXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9tQ2hhbmdlV2FsbGV0WHB1YnMsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5vayh3YXNtRXhwbGFuYXRpb24uY3VzdG9tQ2hhbmdlT3V0cHV0cyk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHdhc21FeHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMik7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHdhc21FeHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VPdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHdhc21FeHBsYW5hdGlvbi5jdXN0b21DaGFuZ2VPdXRwdXRzWzBdLmFtb3VudCwgJzkwMCcpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZGVzY3JpYmUoJ2V4cGxhaW5Qc2J0KFdhc20pJywgZnVuY3Rpb24gKCkge1xuICB0ZXN0dXRpbC5BY2lkVGVzdC5zdWl0ZSgpLmZvckVhY2goKHRlc3QpID0+IGRlc2NyaWJlVHJhbnNhY3Rpb25XaXRoKHRlc3QpKTtcblxuICBpdCgnZXhwbGFpblBzYnRXYXNtQmlnSW50IHRocm93cyB3aGVuIHRvdGFsIG91dHB1dCB2YWx1ZSBleGNlZWRzIHRvdGFsIGlucHV0IHZhbHVlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW47XG4gICAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB0ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICAgIC8vIFZhbGlkIFBTQlQ6IG9uZSBwMndzaCBpbnB1dCAoNTAwMCBzYXQpLCBvbmUgaW50ZXJuYWwgcDJ3c2ggb3V0cHV0ICgzMDAwIHNhdCksIGZlZSA9IDIwMDBcbiAgICBjb25zdCBwc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChcbiAgICAgIFt7IHNjcmlwdFR5cGU6ICdwMndzaCcsIHZhbHVlOiA1MDAwbiB9XSxcbiAgICAgIFt7IHNjcmlwdFR5cGU6ICdwMndzaCcsIHZhbHVlOiAzMDAwbiwgaXNJbnRlcm5hbEFkZHJlc3M6IHRydWUgfV0sXG4gICAgICBuZXR3b3JrLFxuICAgICAgcm9vdFdhbGxldEtleXMsXG4gICAgICAndW5zaWduZWQnXG4gICAgKTtcbiAgICAvLyBUYW1wZXI6IHJlZHVjZSB0aGUgd2l0bmVzc1V0eG8udmFsdWUgc28gdGhhdCBpbnB1dHMgKDEwMDApIDwgb3V0cHV0cyAoMzAwMCkuXG4gICAgLy8gRGlyZWN0IG11dGF0aW9uIGF2b2lkcyBiaXAxNzQncyBcImR1cGxpY2F0ZSBkYXRhXCIgZ3VhcmQgb24gdXBkYXRlSW5wdXQuXG4gICAgcHNidC5kYXRhLmlucHV0c1swXS53aXRuZXNzVXR4byEudmFsdWUgPSAxMDAwbjtcblxuICAgIGNvbnN0IHdhc21Qc2J0ID0gZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LmZyb21CeXRlcyhwc2J0LnRvQnVmZmVyKCksICdiaXRjb2luJyk7XG4gICAgY29uc3Qgd2FsbGV0WHB1YnMgPSBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tKHJvb3RXYWxsZXRLZXlzKTtcblxuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PlxuICAgICAgICBleHBsYWluUHNidFdhc21CaWdJbnQod2FzbVBzYnQsIHdhbGxldFhwdWJzLCB7XG4gICAgICAgICAgcmVwbGF5UHJvdGVjdGlvbjogeyBwdWJsaWNLZXlzOiBbXSB9LFxuICAgICAgICB9KSxcbiAgICAgIC9GZWUgY2FsY3VsYXRpb24gZXJyb3I6IG91dHB1dHMgZXhjZWVkIGlucHV0cy9cbiAgICApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnYWdncmVnYXRlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gIHRlc3R1dGlsLkFjaWRUZXN0LnN1aXRlKClcbiAgICAuZmlsdGVyKCh0KSA9PiB0Lm5ldHdvcmsgPT09IHV0eG9saWIubmV0d29ya3MuYml0Y29pbilcbiAgICAuZm9yRWFjaCgoYWNpZFRlc3QpID0+IHtcbiAgICAgIGRlc2NyaWJlKGFjaWRUZXN0Lm5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGV4cDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbkJpZ0ludDtcblxuICAgICAgICBiZWZvcmUoJ3ByZXBhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgcHNidEJ5dGVzID0gYWNpZFRlc3QuY3JlYXRlUHNidCgpLnRvQnVmZmVyKCk7XG4gICAgICAgICAgY29uc3QgbmV0d29ya05hbWUgPSB1dHhvbGliLmdldE5ldHdvcmtOYW1lKGFjaWRUZXN0Lm5ldHdvcmspO1xuICAgICAgICAgIGFzc2VydChuZXR3b3JrTmFtZSk7XG4gICAgICAgICAgY29uc3Qgd2FzbVBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuZnJvbUJ5dGVzKHBzYnRCeXRlcywgbmV0d29ya05hbWUpO1xuICAgICAgICAgIGNvbnN0IHdhbGxldFhwdWJzID0gZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbShhY2lkVGVzdC5yb290V2FsbGV0S2V5cyk7XG4gICAgICAgICAgZXhwID0gZXhwbGFpblBzYnRXYXNtQmlnSW50KHdhc21Qc2J0LCB3YWxsZXRYcHVicywge1xuICAgICAgICAgICAgcmVwbGF5UHJvdGVjdGlvbjogeyBwdWJsaWNLZXlzOiBbYWNpZFRlc3QuZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmxpY0tleSgpXSB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYWdncmVnYXRpbmcgYSBzaW5nbGUgZXhwbGFuYXRpb24gaXMgaWRlbnRpdHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgYWdnID0gYWdncmVnYXRlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbnMoW2V4cF0pO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cuaW5wdXRDb3VudCwgZXhwLmlucHV0cy5sZW5ndGgpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cub3V0cHV0Q291bnQsIGV4cC5vdXRwdXRzLmxlbmd0aCk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5jaGFuZ2VPdXRwdXRDb3VudCwgZXhwLmNoYW5nZU91dHB1dHMubGVuZ3RoKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLmlucHV0QW1vdW50LCBleHAuaW5wdXRBbW91bnQpO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cub3V0cHV0QW1vdW50LCBleHAub3V0cHV0QW1vdW50KTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLmNoYW5nZUFtb3VudCwgZXhwLmNoYW5nZUFtb3VudCk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5mZWUsIGV4cC5mZWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYWdncmVnYXRpbmcgdHdvIGlkZW50aWNhbCBleHBsYW5hdGlvbnMgZG91YmxlcyBhbGwgY291bnRzIGFuZCBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGFnZyA9IGFnZ3JlZ2F0ZVRyYW5zYWN0aW9uRXhwbGFuYXRpb25zKFtleHAsIGV4cF0pO1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZ2cuaW5wdXRDb3VudCwgZXhwLmlucHV0cy5sZW5ndGggKiAyKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLm91dHB1dENvdW50LCBleHAub3V0cHV0cy5sZW5ndGggKiAyKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLmNoYW5nZU91dHB1dENvdW50LCBleHAuY2hhbmdlT3V0cHV0cy5sZW5ndGggKiAyKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWdnLmlucHV0QW1vdW50LCBleHAuaW5wdXRBbW91bnQgKiAybik7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5vdXRwdXRBbW91bnQsIGV4cC5vdXRwdXRBbW91bnQgKiAybik7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5jaGFuZ2VBbW91bnQsIGV4cC5jaGFuZ2VBbW91bnQgKiAybik7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFnZy5mZWUsIGV4cC5mZWUgKiAybik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdfQ==
@@ -44,7 +44,6 @@ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
44
44
  const parseTransaction_1 = require("../../../../src/transaction/fixedScript/parseTransaction");
45
45
  const util_1 = require("../../util");
46
46
  const fixedScript_1 = require("../../../../src/transaction/fixedScript");
47
- const names_1 = require("../../../../src/names");
48
47
  function getTxParamsFromExplanation(explanation, { externalCustomChangeAddress }) {
49
48
  // The external outputs are the ones that are in outputs but not in changeOutputs
50
49
  const changeAddresses = new Set(explanation.changeOutputs.map((o) => o.address));
@@ -71,71 +70,25 @@ function getTxParamsFromExplanation(explanation, { externalCustomChangeAddress }
71
70
  changeAddress,
72
71
  };
73
72
  }
74
- function getChangeInfoFromPsbt(psbt) {
75
- try {
76
- return utxolib.bitgo.findInternalOutputIndices(psbt).map((i) => {
77
- const output = psbt.data.outputs[i];
78
- const derivations = output.bip32Derivation ?? output.tapBip32Derivation ?? undefined;
79
- if (!derivations || derivations.length !== 3) {
80
- throw new Error('expected 3 derivation paths');
81
- }
82
- const path = derivations[0].path;
83
- const { chain, index } = utxolib.bitgo.getChainAndIndexFromPath(path);
84
- return {
85
- address: wasm_utxo_1.address.fromOutputScriptWithCoin(psbt.txOutputs[i].script, (0, names_1.getCoinName)(psbt.network)),
86
- chain,
87
- index,
88
- };
89
- });
90
- }
91
- catch (e) {
92
- if (e instanceof utxolib.bitgo.ErrorNoMultiSigInputFound) {
93
- return undefined;
94
- }
95
- throw e;
96
- }
97
- }
98
- function describeParseTransactionWith(acidTest, label, backend, { txParams, externalCustomChangeAddress = false, expectedExplicitExternalSpendAmount, expectedImplicitExternalSpendAmount, txFormat = 'psbt', }) {
73
+ function describeParseTransactionWith(acidTest, label, { txParams, externalCustomChangeAddress = false, expectedExplicitExternalSpendAmount, expectedImplicitExternalSpendAmount, }) {
99
74
  describe(`${acidTest.name}/${label}`, function () {
100
75
  let refParsedTransaction;
101
76
  let coin;
102
77
  let mockWallet;
103
78
  let stubExplainTransaction;
104
79
  before('prepare', async function () {
105
- const coinName = (0, names_1.getCoinName)(acidTest.network);
80
+ const coinName = (0, util_1.getCoinNameForNetwork)(acidTest.network);
106
81
  coin = (0, util_1.getUtxoCoin)(coinName);
107
82
  // Create PSBT and explanation
108
83
  const psbt = acidTest.createPsbt();
109
84
  const tx = psbt.getUnsignedTx();
110
85
  const txHash = tx.getId();
111
- let explanation;
112
- if (txFormat === 'psbt') {
113
- if (backend === 'utxolib') {
114
- explanation = (0, fixedScript_1.explainPsbt)(psbt, { pubs: acidTest.rootWalletKeys }, coinName, {
115
- strict: true,
116
- });
117
- }
118
- else if (backend === 'wasm') {
119
- const wasmPsbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(psbt.toBuffer(), utxolib.getNetworkName(acidTest.network));
120
- explanation = (0, fixedScript_1.explainPsbtWasm)(wasmPsbt, acidTest.rootWalletKeys.triple.map((k) => k.neutered().toBase58()), {
121
- replayProtection: {
122
- publicKeys: [acidTest.getReplayProtectionPublicKey()],
123
- },
124
- });
125
- }
126
- else {
127
- throw new Error(`Invalid backend: ${backend}`);
128
- }
129
- }
130
- else if (txFormat === 'legacy') {
131
- const pubs = acidTest.rootWalletKeys.triple.map((k) => k.neutered().toBase58());
132
- // Extract change info from PSBT to pass to explainLegacyTx
133
- const changeInfo = getChangeInfoFromPsbt(psbt);
134
- explanation = (0, fixedScript_1.explainLegacyTx)(tx, { pubs, changeInfo }, coinName);
135
- }
136
- else {
137
- throw new Error(`Invalid txFormat: ${txFormat}`);
138
- }
86
+ const wasmPsbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(psbt.toBuffer(), utxolib.getNetworkName(acidTest.network));
87
+ const explanation = (0, fixedScript_1.explainPsbtWasm)(wasmPsbt, acidTest.rootWalletKeys.triple.map((k) => k.neutered().toBase58()), {
88
+ replayProtection: {
89
+ publicKeys: [acidTest.getReplayProtectionPublicKey()],
90
+ },
91
+ });
139
92
  // Determine txParams
140
93
  let resolvedTxParams;
141
94
  if (txParams === 'inferFromExplanation' || txParams === undefined) {
@@ -182,20 +135,9 @@ function describeParseTransactionWith(acidTest, label, backend, { txParams, exte
182
135
  };
183
136
  // Stub explainTransaction to return the explanation without making network calls
184
137
  stubExplainTransaction = sinon.stub(coin, 'explainTransaction').resolves(explanation);
185
- let txPrebuild;
186
- if (txFormat === 'psbt') {
187
- txPrebuild = {
188
- txHex: psbt.toHex(),
189
- };
190
- }
191
- else if (txFormat === 'legacy') {
192
- txPrebuild = {
193
- txHex: psbt.getUnsignedTx().toHex(),
194
- };
195
- }
196
- else {
197
- throw new Error(`Invalid txFormat: ${txFormat}`);
198
- }
138
+ const txPrebuild = {
139
+ txHex: psbt.toHex(),
140
+ };
199
141
  refParsedTransaction = await (0, parseTransaction_1.parseTransaction)(coin, {
200
142
  wallet: mockWallet,
201
143
  txParams: resolvedTxParams,
@@ -238,13 +180,13 @@ function describeParseTransactionWith(acidTest, label, backend, { txParams, exte
238
180
  });
239
181
  });
240
182
  }
241
- function describeTransaction(backend, filter = () => true) {
242
- describe(`parseTransaction (${backend})`, function () {
183
+ function describeTransaction(filter = () => true) {
184
+ describe(`parseTransaction`, function () {
243
185
  utxolib.testutil.AcidTest.suite()
244
186
  .filter(filter)
245
187
  .forEach((test) => {
246
188
  // Default case: psbt format, infer recipients from explanation
247
- describeParseTransactionWith(test, 'default', backend, {
189
+ describeParseTransactionWith(test, 'default', {
248
190
  txParams: 'inferFromExplanation',
249
191
  expectedExplicitExternalSpendAmount: 1800n,
250
192
  expectedImplicitExternalSpendAmount: 0n,
@@ -253,27 +195,21 @@ function describeTransaction(backend, filter = () => true) {
253
195
  return;
254
196
  }
255
197
  // extended test suite for bitcoin
256
- describeParseTransactionWith(test, 'legacy', backend, {
257
- txFormat: 'legacy',
258
- txParams: 'inferFromExplanation',
259
- expectedExplicitExternalSpendAmount: 1800n,
260
- expectedImplicitExternalSpendAmount: 0n,
261
- });
262
- describeParseTransactionWith(test, 'empty recipients', backend, {
198
+ describeParseTransactionWith(test, 'empty recipients', {
263
199
  txParams: {
264
200
  recipients: [],
265
201
  },
266
202
  expectedExplicitExternalSpendAmount: 0n,
267
203
  expectedImplicitExternalSpendAmount: 1800n,
268
204
  });
269
- describeParseTransactionWith(test, 'rbf', backend, {
205
+ describeParseTransactionWith(test, 'rbf', {
270
206
  txParams: {
271
207
  rbfTxIds: ['PLACEHOLDER'],
272
208
  },
273
209
  expectedExplicitExternalSpendAmount: 1800n,
274
210
  expectedImplicitExternalSpendAmount: 0n,
275
211
  });
276
- describeParseTransactionWith(test, 'allowExternalChangeAddress', backend, {
212
+ describeParseTransactionWith(test, 'allowExternalChangeAddress', {
277
213
  txParams: 'inferFromExplanation',
278
214
  externalCustomChangeAddress: true,
279
215
  expectedExplicitExternalSpendAmount: 1800n,
@@ -282,6 +218,5 @@ function describeTransaction(backend, filter = () => true) {
282
218
  });
283
219
  });
284
220
  }
285
- describeTransaction('utxolib');
286
- describeTransaction('wasm');
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VQc2J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3BhcnNlUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdFQUF3QztBQUV4Qyw2Q0FBK0I7QUFDL0IseURBQTJDO0FBQzNDLDhDQUE2RjtBQUM3RixnREFBNkU7QUFFN0UsK0ZBQTRGO0FBRzVGLHFDQUF5QztBQUN6Qyx5RUFBd0c7QUFLeEcsaURBQW9EO0FBR3BELFNBQVMsMEJBQTBCLENBQ2pDLFdBQW1DLEVBQ25DLEVBQUUsMkJBQTJCLEVBQTRDO0lBS3pFLGlGQUFpRjtJQUNqRixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakYsSUFBSSxlQUFlLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXRHLElBQUksYUFBaUMsQ0FBQztJQUN0QyxJQUFJLDJCQUEyQixFQUFFLENBQUM7UUFDaEMsZ0RBQWdEO1FBQ2hELEVBQUU7UUFDRiwwRUFBMEU7UUFDMUUsc0RBQXNEO1FBQ3RELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxhQUFhLEdBQUcsY0FBYyxDQUFD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LENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0IsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IFdhbGxldCwgVmVyaWZpY2F0aW9uT3B0aW9ucywgSVRyYW5zYWN0aW9uUmVjaXBpZW50LCBUcmlwbGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcywgZml4ZWRTY3JpcHRXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHsgcGFyc2VUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFBhcnNlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL3R5cGVzJztcbmltcG9ydCB7IFV0eG9XYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvd2FsbGV0JztcbmltcG9ydCB7IGdldFV0eG9Db2luIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBleHBsYWluTGVnYWN5VHgsIGV4cGxhaW5Qc2J0LCBleHBsYWluUHNidFdhc20gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQnO1xuaW1wb3J0IHR5cGUge1xuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBDaGFuZ2VBZGRyZXNzSW5mbyxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L2V4cGxhaW5UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBnZXRDb2luTmFtZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9uYW1lcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblByZWJ1aWxkIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2Fic3RyYWN0VXR4b0NvaW4nO1xuXG5mdW5jdGlvbiBnZXRUeFBhcmFtc0Zyb21FeHBsYW5hdGlvbihcbiAgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIHsgZXh0ZXJuYWxDdXN0b21DaGFuZ2VBZGRyZXNzIH06IHsgZXh0ZXJuYWxDdXN0b21DaGFuZ2VBZGRyZXNzOiBib29sZWFuIH1cbik6IHtcbiAgcmVjaXBpZW50czogSVRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG59IHtcbiAgLy8gVGhlIGV4dGVybmFsIG91dHB1dHMgYXJlIHRoZSBvbmVzIHRoYXQgYXJlIGluIG91dHB1dHMgYnV0IG5vdCBpbiBjaGFuZ2VPdXRwdXRzXG4gIGNvbnN0IGNoYW5nZUFkZHJlc3NlcyA9IG5ldyBTZXQoZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5tYXAoKG8pID0+IG8uYWRkcmVzcykpO1xuICBsZXQgZXh0ZXJuYWxPdXRwdXRzID0gZXhwbGFuYXRpb24ub3V0cHV0cy5maWx0ZXIoKG8pID0+IG8uYWRkcmVzcyAmJiAhY2hhbmdlQWRkcmVzc2VzLmhhcyhvLmFkZHJlc3MpKTtcblxuICBsZXQgY2hhbmdlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoZXh0ZXJuYWxDdXN0b21DaGFuZ2VBZGRyZXNzKSB7XG4gICAgLy8gY29udmVydCBhbiBleHRlcm5hbCBvdXRwdXQgdG8gYSBjaGFuZ2Ugb3V0cHV0XG4gICAgLy9cbiAgICAvLyBpbiBjb21iaW5hdGlvbiB3aXRoIGFsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzLCB0aGlzIGFsbG93cyBhbiBleHRlcm5hbFxuICAgIC8vIG91dHB1dCBvbiB0aGUgdHJhbnNhY3Rpb24gd2l0aG91dCBhIHNpemUgY29uc3RyYWludFxuICAgIGNvbnN0IGV4dGVybmFsT3V0cHV0ID0gZXh0ZXJuYWxPdXRwdXRzWzBdO1xuICAgIGlmICghZXh0ZXJuYWxPdXRwdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZXh0ZXJuYWwgb3V0cHV0IGZvdW5kJyk7XG4gICAgfVxuICAgIGNoYW5nZUFkZHJlc3MgPSBleHRlcm5hbE91dHB1dC5hZGRyZXNzO1xuICAgIGV4dGVybmFsT3V0cHV0cyA9IGV4dGVybmFsT3V0cHV0cy5zbGljZSgxKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVjaXBpZW50czogZXh0ZXJuYWxPdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzISxcbiAgICAgIGFtb3VudDogb3V0cHV0LmFtb3VudCxcbiAgICB9KSksXG4gICAgY2hhbmdlQWRkcmVzcyxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhbmdlSW5mb0Zyb21Qc2J0KHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQpOiBDaGFuZ2VBZGRyZXNzSW5mb1tdIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdXR4b2xpYi5iaXRnby5maW5kSW50ZXJuYWxPdXRwdXRJbmRpY2VzKHBzYnQpLm1hcCgoaSkgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gcHNidC5kYXRhLm91dHB1dHNbaV07XG4gICAgICBjb25zdCBkZXJpdmF0aW9ucyA9IG91dHB1dC5iaXAzMkRlcml2YXRpb24gPz8gb3V0cHV0LnRhcEJpcDMyRGVyaXZhdGlvbiA/PyB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWRlcml2YXRpb25zIHx8IGRlcml2YXRpb25zLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIDMgZGVyaXZhdGlvbiBwYXRocycpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aCA9IGRlcml2YXRpb25zWzBdLnBhdGg7XG4gICAgICBjb25zdCB7IGNoYWluLCBpbmRleCB9ID0gdXR4b2xpYi5iaXRnby5nZXRDaGFpbkFuZEluZGV4RnJvbVBhdGgocGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzOiB3YXNtQWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0V2l0aENvaW4ocHNidC50eE91dHB1dHNbaV0uc2NyaXB0LCBnZXRDb2luTmFtZShwc2J0Lm5ldHdvcmspKSxcbiAgICAgICAgY2hhaW4sXG4gICAgICAgIGluZGV4LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5FcnJvck5vTXVsdGlTaWdJbnB1dEZvdW5kKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUGFyc2VUcmFuc2FjdGlvbldpdGgoXG4gIGFjaWRUZXN0OiB1dHhvbGliLnRlc3R1dGlsLkFjaWRUZXN0LFxuICBsYWJlbDogc3RyaW5nLFxuICBiYWNrZW5kOiAndXR4b2xpYicgfCAnd2FzbScsXG4gIHtcbiAgICB0eFBhcmFtcyxcbiAgICBleHRlcm5hbEN1c3RvbUNoYW5nZUFkZHJlc3MgPSBmYWxzZSxcbiAgICBleHBlY3RlZEV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCxcbiAgICBleHBlY3RlZEltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCxcbiAgICB0eEZvcm1hdCA9ICdwc2J0JyxcbiAgfToge1xuICAgIHR4UGFyYW1zOlxuICAgICAgfCB7XG4gICAgICAgICAgcmVjaXBpZW50czogSVRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIHJiZlR4SWRzOiBzdHJpbmdbXTtcbiAgICAgICAgfVxuICAgICAgfCAnaW5mZXJGcm9tRXhwbGFuYXRpb24nO1xuICAgIGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzcz86IGJvb2xlYW47XG4gICAgZXhwZWN0ZWRFeHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IGJpZ2ludDtcbiAgICBleHBlY3RlZEltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogYmlnaW50O1xuICAgIHR4Rm9ybWF0PzogJ3BzYnQnIHwgJ2xlZ2FjeSc7XG4gIH1cbikge1xuICBkZXNjcmliZShgJHthY2lkVGVzdC5uYW1lfS8ke2xhYmVsfWAsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVmUGFyc2VkVHJhbnNhY3Rpb246IFBhcnNlZFRyYW5zYWN0aW9uPGJpZ2ludD47XG4gICAgbGV0IGNvaW46IFJldHVyblR5cGU8dHlwZW9mIGdldFV0eG9Db2luPjtcbiAgICBsZXQgbW9ja1dhbGxldDogc2lub24uU2lub25TdHViYmVkSW5zdGFuY2U8V2FsbGV0PjtcbiAgICBsZXQgc3R1YkV4cGxhaW5UcmFuc2FjdGlvbjogc2lub24uU2lub25TdHViO1xuXG4gICAgYmVmb3JlKCdwcmVwYXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29pbk5hbWUgPSBnZXRDb2luTmFtZShhY2lkVGVzdC5uZXR3b3JrKTtcbiAgICAgIGNvaW4gPSBnZXRVdHhvQ29pbihjb2luTmFtZSk7XG5cbiAgICAgIC8vIENyZWF0ZSBQU0JUIGFuZCBleHBsYW5hdGlvblxuICAgICAgY29uc3QgcHNidCA9IGFjaWRUZXN0LmNyZWF0ZVBzYnQoKTtcbiAgICAgIGNvbnN0IHR4ID0gcHNidC5nZXRVbnNpZ25lZFR4KCk7XG4gICAgICBjb25zdCB0eEhhc2ggPSB0eC5nZXRJZCgpO1xuXG4gICAgICBsZXQgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG4gICAgICBpZiAodHhGb3JtYXQgPT09ICdwc2J0Jykge1xuICAgICAgICBpZiAoYmFja2VuZCA9PT0gJ3V0eG9saWInKSB7XG4gICAgICAgICAgZXhwbGFuYXRpb24gPSBleHBsYWluUHNidChwc2J0LCB7IHB1YnM6IGFjaWRUZXN0LnJvb3RXYWxsZXRLZXlzIH0sIGNvaW5OYW1lLCB7XG4gICAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoYmFja2VuZCA9PT0gJ3dhc20nKSB7XG4gICAgICAgICAgY29uc3Qgd2FzbVBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuZnJvbUJ5dGVzKFxuICAgICAgICAgICAgcHNidC50b0J1ZmZlcigpLFxuICAgICAgICAgICAgdXR4b2xpYi5nZXROZXR3b3JrTmFtZShhY2lkVGVzdC5uZXR3b3JrKSFcbiAgICAgICAgICApO1xuICAgICAgICAgIGV4cGxhbmF0aW9uID0gZXhwbGFpblBzYnRXYXNtKFxuICAgICAgICAgICAgd2FzbVBzYnQsXG4gICAgICAgICAgICBhY2lkVGVzdC5yb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSkgYXMgVHJpcGxlPHN0cmluZz4sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJlcGxheVByb3RlY3Rpb246IHtcbiAgICAgICAgICAgICAgICBwdWJsaWNLZXlzOiBbYWNpZFRlc3QuZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmxpY0tleSgpXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYWNrZW5kOiAke2JhY2tlbmR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHhGb3JtYXQgPT09ICdsZWdhY3knKSB7XG4gICAgICAgIGNvbnN0IHB1YnMgPSBhY2lkVGVzdC5yb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSk7XG4gICAgICAgIC8vIEV4dHJhY3QgY2hhbmdlIGluZm8gZnJvbSBQU0JUIHRvIHBhc3MgdG8gZXhwbGFpbkxlZ2FjeVR4XG4gICAgICAgIGNvbnN0IGNoYW5nZUluZm8gPSBnZXRDaGFuZ2VJbmZvRnJvbVBzYnQocHNidCk7XG4gICAgICAgIGV4cGxhbmF0aW9uID0gZXhwbGFpbkxlZ2FjeVR4KHR4LCB7IHB1YnMsIGNoYW5nZUluZm8gfSwgY29pbk5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR4Rm9ybWF0OiAke3R4Rm9ybWF0fWApO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgdHhQYXJhbXNcbiAgICAgIGxldCByZXNvbHZlZFR4UGFyYW1zO1xuICAgICAgaWYgKHR4UGFyYW1zID09PSAnaW5mZXJGcm9tRXhwbGFuYXRpb24nIHx8IHR4UGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzb2x2ZWRUeFBhcmFtcyA9IGdldFR4UGFyYW1zRnJvbUV4cGxhbmF0aW9uKGV4cGxhbmF0aW9uLCB7IGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzcyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoJ3JiZlR4SWRzJyBpbiB0eFBhcmFtcykge1xuICAgICAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVyIHR4SGFzaCB3aXRoIGFjdHVhbCBjb21wdXRlZCB0eEhhc2hcbiAgICAgICAgcmVzb2x2ZWRUeFBhcmFtcyA9IHtcbiAgICAgICAgICByYmZUeElkczogdHhQYXJhbXMucmJmVHhJZHMubWFwKChoYXNoKSA9PiAoaGFzaCA9PT0gJ1BMQUNFSE9MREVSJyA/IHR4SGFzaCA6IGhhc2gpKSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkVHhQYXJhbXMgPSB0eFBhcmFtcztcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzcykge1xuICAgICAgICByZXNvbHZlZFR4UGFyYW1zLmFsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIG1vY2sgd2FsbGV0XG4gICAgICBtb2NrV2FsbGV0ID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFdhbGxldCk7XG4gICAgICBtb2NrV2FsbGV0LmlkLnJldHVybnMoJ3Rlc3Qtd2FsbGV0LWlkJyk7XG4gICAgICBtb2NrV2FsbGV0LmNvaW4ucmV0dXJucyhjb2luLmdldENoYWluKCkpO1xuICAgICAgbW9ja1dhbGxldC5jb2luU3BlY2lmaWMucmV0dXJucyh1bmRlZmluZWQpO1xuXG4gICAgICAvLyBNb2NrIGdldFRyYW5zYWN0aW9uIGZvciBSQkYgY2FzZVxuICAgICAgaWYgKCdyYmZUeElkcycgaW4gcmVzb2x2ZWRUeFBhcmFtcykge1xuICAgICAgICBjb25zdCByYmZUeFBhcmFtcyA9IGdldFR4UGFyYW1zRnJvbUV4cGxhbmF0aW9uKGV4cGxhbmF0aW9uLCB7IGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzczogZmFsc2UgfSk7XG4gICAgICAgIG1vY2tXYWxsZXQuZ2V0VHJhbnNhY3Rpb24ucmVzb2x2ZXMoe1xuICAgICAgICAgIG91dHB1dHM6IHJiZlR4UGFyYW1zLnJlY2lwaWVudHMubWFwKChyKSA9PiAoe1xuICAgICAgICAgICAgdmFsdWVTdHJpbmc6IHR5cGVvZiByLmFtb3VudCA9PT0gJ3N0cmluZycgPyByLmFtb3VudCA6IHIuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhZGRyZXNzOiByLmFkZHJlc3MsXG4gICAgICAgICAgICAvLyB3YWxsZXQgZmllbGQgaXMgdW5kZWZpbmVkIGZvciBleHRlcm5hbCBvdXRwdXRzIChub3Qgc2VsZi1zZW5kcylcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBNb2NrIHZlcmlmaWNhdGlvbiBvcHRpb25zIHdpdGgga2V5Y2hhaW5zIHRvIGRpc2FibGUgbmV0d29ya2luZ1xuICAgICAgLy8gVXNlIHRoZSBzYW1lIGtleWNoYWlucyB0aGF0IHdlcmUgdXNlZCB0byBjcmVhdGUgdGhlIFBTQlRcbiAgICAgIGNvbnN0IHB1YnMgPSBhY2lkVGVzdC5yb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSk7XG4gICAgICBjb25zdCB2ZXJpZmljYXRpb246IFZlcmlmaWNhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgIGRpc2FibGVOZXR3b3JraW5nOiB0cnVlLFxuICAgICAgICBrZXljaGFpbnM6IHtcbiAgICAgICAgICB1c2VyOiB7IGlkOiAnMCcsIHB1YjogcHVic1swXSwgdHlwZTogJ2luZGVwZW5kZW50JyB9LFxuICAgICAgICAgIGJhY2t1cDogeyBpZDogJzEnLCBwdWI6IHB1YnNbMV0sIHR5cGU6ICdpbmRlcGVuZGVudCcgfSxcbiAgICAgICAgICBiaXRnbzogeyBpZDogJzInLCBwdWI6IHB1YnNbMl0sIHR5cGU6ICdpbmRlcGVuZGVudCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0dWIgZXhwbGFpblRyYW5zYWN0aW9uIHRvIHJldHVybiB0aGUgZXhwbGFuYXRpb24gd2l0aG91dCBtYWtpbmcgbmV0d29yayBjYWxsc1xuICAgICAgc3R1YkV4cGxhaW5UcmFuc2FjdGlvbiA9IHNpbm9uLnN0dWIoY29pbiwgJ2V4cGxhaW5UcmFuc2FjdGlvbicpLnJlc29sdmVzKGV4cGxhbmF0aW9uKTtcblxuICAgICAgbGV0IHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8YmlnaW50PjtcbiAgICAgIGlmICh0eEZvcm1hdCA9PT0gJ3BzYnQnKSB7XG4gICAgICAgIHR4UHJlYnVpbGQgPSB7XG4gICAgICAgICAgdHhIZXg6IHBzYnQudG9IZXgoKSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHhGb3JtYXQgPT09ICdsZWdhY3knKSB7XG4gICAgICAgIHR4UHJlYnVpbGQgPSB7XG4gICAgICAgICAgdHhIZXg6IHBzYnQuZ2V0VW5zaWduZWRUeCgpLnRvSGV4KCksXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHhGb3JtYXQ6ICR7dHhGb3JtYXR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJlZlBhcnNlZFRyYW5zYWN0aW9uID0gYXdhaXQgcGFyc2VUcmFuc2FjdGlvbihjb2luLCB7XG4gICAgICAgIHdhbGxldDogbW9ja1dhbGxldCBhcyB1bmtub3duIGFzIFV0eG9XYWxsZXQsXG4gICAgICAgIHR4UGFyYW1zOiByZXNvbHZlZFR4UGFyYW1zLFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGFmdGVyKCdjbGVhbnVwJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHN0dWJFeHBsYWluVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgc3R1YkV4cGxhaW5UcmFuc2FjdGlvbi5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHRyYW5zYWN0aW9uIHdpdGhvdXQgbmV0d29yayBjYWxscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhyZWZQYXJzZWRUcmFuc2FjdGlvbik7XG4gICAgICBhc3NlcnQub2socmVmUGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zKTtcbiAgICAgIGFzc2VydC5vayhyZWZQYXJzZWRUcmFuc2FjdGlvbi5vdXRwdXRzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB2YWxpZCBrZXljaGFpbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2socmVmUGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zLnVzZXIpO1xuICAgICAgYXNzZXJ0Lm9rKHJlZlBhcnNlZFRyYW5zYWN0aW9uLmtleWNoYWlucy5iYWNrdXApO1xuICAgICAgYXNzZXJ0Lm9rKHJlZlBhcnNlZFRyYW5zYWN0aW9uLmtleWNoYWlucy5iaXRnbyk7XG4gICAgICBjb25zdCBwdWJzID0gYWNpZFRlc3Qucm9vdFdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlZlBhcnNlZFRyYW5zYWN0aW9uLmtleWNoYWlucy51c2VyLnB1YiwgcHVic1swXSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVmUGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zLmJhY2t1cC5wdWIsIHB1YnNbMV0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlZlBhcnNlZFRyYW5zYWN0aW9uLmtleWNoYWlucy5iaXRnby5wdWIsIHB1YnNbMl0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIG91dHB1dHMgY2xhc3NpZmllZCBhcyBpbnRlcm5hbCBvciBleHRlcm5hbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNpbmNlIHdlIGRpZG4ndCBzcGVjaWZ5IGFueSByZWNpcGllbnRzLCBvdXRwdXRzIHdpbGwgYmUgY2xhc3NpZmllZCBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgY2FuIGJlXG4gICAgICAvLyB2ZXJpZmllZCBhcyB3YWxsZXQgYWRkcmVzc2VzLiBTb21lIG1heSBiZSBleHRlcm5hbCBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBmYWlscyB3aXRob3V0IGEgcHJvcGVyIHdhbGxldCBzZXR1cC5cbiAgICAgIGNvbnN0IHRvdGFsT3V0cHV0cyA9IHJlZlBhcnNlZFRyYW5zYWN0aW9uLm91dHB1dHMubGVuZ3RoO1xuICAgICAgY29uc3QgY2hhbmdlT3V0cHV0cyA9IHJlZlBhcnNlZFRyYW5zYWN0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoO1xuICAgICAgY29uc3QgZXh0ZXJuYWxPdXRwdXRzID0gcmVmUGFyc2VkVHJhbnNhY3Rpb24ub3V0cHV0cy5maWx0ZXIoKG8pID0+IG8uZXh0ZXJuYWwgPT09IHRydWUpLmxlbmd0aDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHRlcm5hbE91dHB1dHMsIDMpO1xuXG4gICAgICBhc3NlcnQub2sodG90YWxPdXRwdXRzID4gMCwgJ3Nob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSBvdXRwdXQnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjaGFuZ2VPdXRwdXRzICsgZXh0ZXJuYWxPdXRwdXRzLCB0b3RhbE91dHB1dHMsICdhbGwgb3V0cHV0cyBzaG91bGQgYmUgY2xhc3NpZmllZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGV4cGVjdGVkIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZCBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKEJpZ0ludChyZWZQYXJzZWRUcmFuc2FjdGlvbi5leHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQpLCBleHBlY3RlZEV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoQmlnSW50KHJlZlBhcnNlZFRyYW5zYWN0aW9uLmltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCksIGV4cGVjdGVkSW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVHJhbnNhY3Rpb24oXG4gIGJhY2tlbmQ6ICd1dHhvbGliJyB8ICd3YXNtJyxcbiAgZmlsdGVyOiAodGVzdDogdXR4b2xpYi50ZXN0dXRpbC5BY2lkVGVzdCkgPT4gYm9vbGVhbiA9ICgpID0+IHRydWVcbikge1xuICBkZXNjcmliZShgcGFyc2VUcmFuc2FjdGlvbiAoJHtiYWNrZW5kfSlgLCBmdW5jdGlvbiAoKSB7XG4gICAgdXR4b2xpYi50ZXN0dXRpbC5BY2lkVGVzdC5zdWl0ZSgpXG4gICAgICAuZmlsdGVyKGZpbHRlcilcbiAgICAgIC5mb3JFYWNoKCh0ZXN0KSA9PiB7XG4gICAgICAgIC8vIERlZmF1bHQgY2FzZTogcHNidCBmb3JtYXQsIGluZmVyIHJlY2lwaWVudHMgZnJvbSBleHBsYW5hdGlvblxuICAgICAgICBkZXNjcmliZVBhcnNlVHJhbnNhY3Rpb25XaXRoKHRlc3QsICdkZWZhdWx0JywgYmFja2VuZCwge1xuICAgICAgICAgIHR4UGFyYW1zOiAnaW5mZXJGcm9tRXhwbGFuYXRpb24nLFxuICAgICAgICAgIGV4cGVjdGVkRXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAxODAwbixcbiAgICAgICAgICBleHBlY3RlZEltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMG4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0ZXN0Lm5ldHdvcmsgIT09IHV0eG9saWIubmV0d29ya3MuYml0Y29pbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBleHRlbmRlZCB0ZXN0IHN1aXRlIGZvciBiaXRjb2luXG5cbiAgICAgICAgZGVzY3JpYmVQYXJzZVRyYW5zYWN0aW9uV2l0aCh0ZXN0LCAnbGVnYWN5JywgYmFja2VuZCwge1xuICAgICAgICAgIHR4Rm9ybWF0OiAnbGVnYWN5JyxcbiAgICAgICAgICB0eFBhcmFtczogJ2luZmVyRnJvbUV4cGxhbmF0aW9uJyxcbiAgICAgICAgICBleHBlY3RlZEV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMTgwMG4sXG4gICAgICAgICAgZXhwZWN0ZWRJbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDBuLFxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZVBhcnNlVHJhbnNhY3Rpb25XaXRoKHRlc3QsICdlbXB0eSByZWNpcGllbnRzJywgYmFja2VuZCwge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4cGVjdGVkRXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAwbixcbiAgICAgICAgICBleHBlY3RlZEltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMTgwMG4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlUGFyc2VUcmFuc2FjdGlvbldpdGgodGVzdCwgJ3JiZicsIGJhY2tlbmQsIHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmJmVHhJZHM6IFsnUExBQ0VIT0xERVInXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4cGVjdGVkRXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAxODAwbixcbiAgICAgICAgICBleHBlY3RlZEltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMG4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlUGFyc2VUcmFuc2FjdGlvbldpdGgodGVzdCwgJ2FsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzJywgYmFja2VuZCwge1xuICAgICAgICAgIHR4UGFyYW1zOiAnaW5mZXJGcm9tRXhwbGFuYXRpb24nLFxuICAgICAgICAgIGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgICBleHBlY3RlZEV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMTgwMG4sXG4gICAgICAgICAgZXhwZWN0ZWRJbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDBuLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuZGVzY3JpYmVUcmFuc2FjdGlvbigndXR4b2xpYicpO1xuZGVzY3JpYmVUcmFuc2FjdGlvbignd2FzbScpO1xuIl19
221
+ describeTransaction();
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VQc2J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3BhcnNlUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdFQUF3QztBQUV4Qyw2Q0FBK0I7QUFDL0IseURBQTJDO0FBQzNDLDhDQUE2RjtBQUM3RixnREFBcUQ7QUFFckQsK0ZBQTRGO0FBRzVGLHFDQUFnRTtBQUNoRSx5RUFBMEU7QUFJMUUsU0FBUywwQkFBMEIsQ0FDakMsV0FBbUMsRUFDbkMsRUFBRSwyQkFBMkIsRUFBNEM7SUFLekUsaUZBQWlGO0lBQ2pGLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNqRixJQUFJLGVBQWUsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFdEcsSUFBSSxhQUFpQyxDQUFDO0lBQ3RDLElBQUksMkJBQTJCLEVBQUUsQ0FBQztRQUNoQyxnREFBZ0Q7UUFDaEQsRUFBRTtRQUNGLDBFQUEwRTtRQUMxRSxzREFBc0Q7UUFDdEQsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELGFBQWEsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDO1FB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a0M7WUFFbEMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO2dCQUNyRCxRQUFRLEVBQUU7b0JBQ1IsVUFBVSxFQUFFLEVBQUU7aUJBQ2Y7Z0JBQ0QsbUNBQW1DLEVBQUUsRUFBRTtnQkFDdkMsbUNBQW1DLEVBQUUsS0FBSzthQUMzQyxDQUFDLENBQUM7WUFFSCw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUN4QyxRQUFRLEVBQUU7b0JBQ1IsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUMxQjtnQkFDRCxtQ0FBbUMsRUFBRSxLQUFLO2dCQUMxQyxtQ0FBbUMsRUFBRSxFQUFFO2FBQ3hDLENBQUMsQ0FBQztZQUVILDRCQUE0QixDQUFDLElBQUksRUFBRSw0QkFBNEIsRUFBRTtnQkFDL0QsUUFBUSxFQUFFLHNCQUFzQjtnQkFDaEMsMkJBQTJCLEVBQUUsSUFBSTtnQkFDakMsbUNBQW1DLEVBQUUsS0FBSztnQkFDMUMsbUNBQW1DLEVBQUUsRUFBRTthQUN4QyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELG1CQUFtQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ25vZGU6YXNzZXJ0L3N0cmljdCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IFdhbGxldCwgVmVyaWZpY2F0aW9uT3B0aW9ucywgSVRyYW5zYWN0aW9uUmVjaXBpZW50LCBUcmlwbGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZml4ZWRTY3JpcHRXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHsgcGFyc2VUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFBhcnNlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL3R5cGVzJztcbmltcG9ydCB7IFV0eG9XYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvd2FsbGV0JztcbmltcG9ydCB7IGdldENvaW5OYW1lRm9yTmV0d29yaywgZ2V0VXR4b0NvaW4gfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGV4cGxhaW5Qc2J0V2FzbSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdCc7XG5pbXBvcnQgdHlwZSB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvZXhwbGFpblRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uUHJlYnVpbGQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYWJzdHJhY3RVdHhvQ29pbic7XG5cbmZ1bmN0aW9uIGdldFR4UGFyYW1zRnJvbUV4cGxhbmF0aW9uKFxuICBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgeyBleHRlcm5hbEN1c3RvbUNoYW5nZUFkZHJlc3MgfTogeyBleHRlcm5hbEN1c3RvbUNoYW5nZUFkZHJlc3M6IGJvb2xlYW4gfVxuKToge1xuICByZWNpcGllbnRzOiBJVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgY2hhbmdlQWRkcmVzcz86IHN0cmluZztcbn0ge1xuICAvLyBUaGUgZXh0ZXJuYWwgb3V0cHV0cyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgaW4gb3V0cHV0cyBidXQgbm90IGluIGNoYW5nZU91dHB1dHNcbiAgY29uc3QgY2hhbmdlQWRkcmVzc2VzID0gbmV3IFNldChleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gby5hZGRyZXNzKSk7XG4gIGxldCBleHRlcm5hbE91dHB1dHMgPSBleHBsYW5hdGlvbi5vdXRwdXRzLmZpbHRlcigobykgPT4gby5hZGRyZXNzICYmICFjaGFuZ2VBZGRyZXNzZXMuaGFzKG8uYWRkcmVzcykpO1xuXG4gIGxldCBjaGFuZ2VBZGRyZXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChleHRlcm5hbEN1c3RvbUNoYW5nZUFkZHJlc3MpIHtcbiAgICAvLyBjb252ZXJ0IGFuIGV4dGVybmFsIG91dHB1dCB0byBhIGNoYW5nZSBvdXRwdXRcbiAgICAvL1xuICAgIC8vIGluIGNvbWJpbmF0aW9uIHdpdGggYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3MsIHRoaXMgYWxsb3dzIGFuIGV4dGVybmFsXG4gICAgLy8gb3V0cHV0IG9uIHRoZSB0cmFuc2FjdGlvbiB3aXRob3V0IGEgc2l6ZSBjb25zdHJhaW50XG4gICAgY29uc3QgZXh0ZXJuYWxPdXRwdXQgPSBleHRlcm5hbE91dHB1dHNbMF07XG4gICAgaWYgKCFleHRlcm5hbE91dHB1dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBleHRlcm5hbCBvdXRwdXQgZm91bmQnKTtcbiAgICB9XG4gICAgY2hhbmdlQWRkcmVzcyA9IGV4dGVybmFsT3V0cHV0LmFkZHJlc3M7XG4gICAgZXh0ZXJuYWxPdXRwdXRzID0gZXh0ZXJuYWxPdXRwdXRzLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZWNpcGllbnRzOiBleHRlcm5hbE91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MhLFxuICAgICAgYW1vdW50OiBvdXRwdXQuYW1vdW50LFxuICAgIH0pKSxcbiAgICBjaGFuZ2VBZGRyZXNzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVBhcnNlVHJhbnNhY3Rpb25XaXRoKFxuICBhY2lkVGVzdDogdXR4b2xpYi50ZXN0dXRpbC5BY2lkVGVzdCxcbiAgbGFiZWw6IHN0cmluZyxcbiAge1xuICAgIHR4UGFyYW1zLFxuICAgIGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzcyA9IGZhbHNlLFxuICAgIGV4cGVjdGVkRXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICAgIGV4cGVjdGVkSW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICB9OiB7XG4gICAgdHhQYXJhbXM6XG4gICAgICB8IHtcbiAgICAgICAgICByZWNpcGllbnRzOiBJVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgcmJmVHhJZHM6IHN0cmluZ1tdO1xuICAgICAgICB9XG4gICAgICB8ICdpbmZlckZyb21FeHBsYW5hdGlvbic7XG4gICAgZXh0ZXJuYWxDdXN0b21DaGFuZ2VBZGRyZXNzPzogYm9vbGVhbjtcbiAgICBleHBlY3RlZEV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogYmlnaW50O1xuICAgIGV4cGVjdGVkSW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiBiaWdpbnQ7XG4gIH1cbikge1xuICBkZXNjcmliZShgJHthY2lkVGVzdC5uYW1lfS8ke2xhYmVsfWAsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVmUGFyc2VkVHJhbnNhY3Rpb246IFBhcnNlZFRyYW5zYWN0aW9uPGJpZ2ludD47XG4gICAgbGV0IGNvaW46IFJldHVyblR5cGU8dHlwZW9mIGdldFV0eG9Db2luPjtcbiAgICBsZXQgbW9ja1dhbGxldDogc2lub24uU2lub25TdHViYmVkSW5zdGFuY2U8V2FsbGV0PjtcbiAgICBsZXQgc3R1YkV4cGxhaW5UcmFuc2FjdGlvbjogc2lub24uU2lub25TdHViO1xuXG4gICAgYmVmb3JlKCdwcmVwYXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29pbk5hbWUgPSBnZXRDb2luTmFtZUZvck5ldHdvcmsoYWNpZFRlc3QubmV0d29yayk7XG4gICAgICBjb2luID0gZ2V0VXR4b0NvaW4oY29pbk5hbWUpO1xuXG4gICAgICAvLyBDcmVhdGUgUFNCVCBhbmQgZXhwbGFuYXRpb25cbiAgICAgIGNvbnN0IHBzYnQgPSBhY2lkVGVzdC5jcmVhdGVQc2J0KCk7XG4gICAgICBjb25zdCB0eCA9IHBzYnQuZ2V0VW5zaWduZWRUeCgpO1xuICAgICAgY29uc3QgdHhIYXNoID0gdHguZ2V0SWQoKTtcblxuICAgICAgY29uc3Qgd2FzbVBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuZnJvbUJ5dGVzKFxuICAgICAgICBwc2J0LnRvQnVmZmVyKCksXG4gICAgICAgIHV0eG9saWIuZ2V0TmV0d29ya05hbWUoYWNpZFRlc3QubmV0d29yaykhXG4gICAgICApO1xuICAgICAgY29uc3QgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSBleHBsYWluUHNidFdhc20oXG4gICAgICAgIHdhc21Qc2J0LFxuICAgICAgICBhY2lkVGVzdC5yb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSkgYXMgVHJpcGxlPHN0cmluZz4sXG4gICAgICAgIHtcbiAgICAgICAgICByZXBsYXlQcm90ZWN0aW9uOiB7XG4gICAgICAgICAgICBwdWJsaWNLZXlzOiBbYWNpZFRlc3QuZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmxpY0tleSgpXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdHhQYXJhbXNcbiAgICAgIGxldCByZXNvbHZlZFR4UGFyYW1zO1xuICAgICAgaWYgKHR4UGFyYW1zID09PSAnaW5mZXJGcm9tRXhwbGFuYXRpb24nIHx8IHR4UGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzb2x2ZWRUeFBhcmFtcyA9IGdldFR4UGFyYW1zRnJvbUV4cGxhbmF0aW9uKGV4cGxhbmF0aW9uLCB7IGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzcyB9KTtcbiAgICAgIH0gZWxzZSBpZiAoJ3JiZlR4SWRzJyBpbiB0eFBhcmFtcykge1xuICAgICAgICAvLyBSZXBsYWNlIHBsYWNlaG9sZGVyIHR4SGFzaCB3aXRoIGFjdHVhbCBjb21wdXRlZCB0eEhhc2hcbiAgICAgICAgcmVzb2x2ZWRUeFBhcmFtcyA9IHtcbiAgICAgICAgICByYmZUeElkczogdHhQYXJhbXMucmJmVHhJZHMubWFwKChoYXNoKSA9PiAoaGFzaCA9PT0gJ1BMQUNFSE9MREVSJyA/IHR4SGFzaCA6IGhhc2gpKSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkVHhQYXJhbXMgPSB0eFBhcmFtcztcbiAgICAgIH1cblxuICAgICAgaWYgKGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzcykge1xuICAgICAgICByZXNvbHZlZFR4UGFyYW1zLmFsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIG1vY2sgd2FsbGV0XG4gICAgICBtb2NrV2FsbGV0ID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKFdhbGxldCk7XG4gICAgICBtb2NrV2FsbGV0LmlkLnJldHVybnMoJ3Rlc3Qtd2FsbGV0LWlkJyk7XG4gICAgICBtb2NrV2FsbGV0LmNvaW4ucmV0dXJucyhjb2luLmdldENoYWluKCkpO1xuICAgICAgbW9ja1dhbGxldC5jb2luU3BlY2lmaWMucmV0dXJucyh1bmRlZmluZWQpO1xuXG4gICAgICAvLyBNb2NrIGdldFRyYW5zYWN0aW9uIGZvciBSQkYgY2FzZVxuICAgICAgaWYgKCdyYmZUeElkcycgaW4gcmVzb2x2ZWRUeFBhcmFtcykge1xuICAgICAgICBjb25zdCByYmZUeFBhcmFtcyA9IGdldFR4UGFyYW1zRnJvbUV4cGxhbmF0aW9uKGV4cGxhbmF0aW9uLCB7IGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzczogZmFsc2UgfSk7XG4gICAgICAgIG1vY2tXYWxsZXQuZ2V0VHJhbnNhY3Rpb24ucmVzb2x2ZXMoe1xuICAgICAgICAgIG91dHB1dHM6IHJiZlR4UGFyYW1zLnJlY2lwaWVudHMubWFwKChyKSA9PiAoe1xuICAgICAgICAgICAgdmFsdWVTdHJpbmc6IHR5cGVvZiByLmFtb3VudCA9PT0gJ3N0cmluZycgPyByLmFtb3VudCA6IHIuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhZGRyZXNzOiByLmFkZHJlc3MsXG4gICAgICAgICAgICAvLyB3YWxsZXQgZmllbGQgaXMgdW5kZWZpbmVkIGZvciBleHRlcm5hbCBvdXRwdXRzIChub3Qgc2VsZi1zZW5kcylcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBNb2NrIHZlcmlmaWNhdGlvbiBvcHRpb25zIHdpdGgga2V5Y2hhaW5zIHRvIGRpc2FibGUgbmV0d29ya2luZ1xuICAgICAgLy8gVXNlIHRoZSBzYW1lIGtleWNoYWlucyB0aGF0IHdlcmUgdXNlZCB0byBjcmVhdGUgdGhlIFBTQlRcbiAgICAgIGNvbnN0IHB1YnMgPSBhY2lkVGVzdC5yb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSk7XG4gICAgICBjb25zdCB2ZXJpZmljYXRpb246IFZlcmlmaWNhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgIGRpc2FibGVOZXR3b3JraW5nOiB0cnVlLFxuICAgICAgICBrZXljaGFpbnM6IHtcbiAgICAgICAgICB1c2VyOiB7IGlkOiAnMCcsIHB1YjogcHVic1swXSwgdHlwZTogJ2luZGVwZW5kZW50JyB9LFxuICAgICAgICAgIGJhY2t1cDogeyBpZDogJzEnLCBwdWI6IHB1YnNbMV0sIHR5cGU6ICdpbmRlcGVuZGVudCcgfSxcbiAgICAgICAgICBiaXRnbzogeyBpZDogJzInLCBwdWI6IHB1YnNbMl0sIHR5cGU6ICdpbmRlcGVuZGVudCcgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0dWIgZXhwbGFpblRyYW5zYWN0aW9uIHRvIHJldHVybiB0aGUgZXhwbGFuYXRpb24gd2l0aG91dCBtYWtpbmcgbmV0d29yayBjYWxsc1xuICAgICAgc3R1YkV4cGxhaW5UcmFuc2FjdGlvbiA9IHNpbm9uLnN0dWIoY29pbiwgJ2V4cGxhaW5UcmFuc2FjdGlvbicpLnJlc29sdmVzKGV4cGxhbmF0aW9uKTtcblxuICAgICAgY29uc3QgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxiaWdpbnQ+ID0ge1xuICAgICAgICB0eEhleDogcHNidC50b0hleCgpLFxuICAgICAgfTtcblxuICAgICAgcmVmUGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCBwYXJzZVRyYW5zYWN0aW9uKGNvaW4sIHtcbiAgICAgICAgd2FsbGV0OiBtb2NrV2FsbGV0IGFzIHVua25vd24gYXMgVXR4b1dhbGxldCxcbiAgICAgICAgdHhQYXJhbXM6IHJlc29sdmVkVHhQYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXIoJ2NsZWFudXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc3R1YkV4cGxhaW5UcmFuc2FjdGlvbikge1xuICAgICAgICBzdHViRXhwbGFpblRyYW5zYWN0aW9uLnJlc3RvcmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgdHJhbnNhY3Rpb24gd2l0aG91dCBuZXR3b3JrIGNhbGxzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0Lm9rKHJlZlBhcnNlZFRyYW5zYWN0aW9uKTtcbiAgICAgIGFzc2VydC5vayhyZWZQYXJzZWRUcmFuc2FjdGlvbi5rZXljaGFpbnMpO1xuICAgICAgYXNzZXJ0Lm9rKHJlZlBhcnNlZFRyYW5zYWN0aW9uLm91dHB1dHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHZhbGlkIGtleWNoYWlucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhyZWZQYXJzZWRUcmFuc2FjdGlvbi5rZXljaGFpbnMudXNlcik7XG4gICAgICBhc3NlcnQub2socmVmUGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zLmJhY2t1cCk7XG4gICAgICBhc3NlcnQub2socmVmUGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zLmJpdGdvKTtcbiAgICAgIGNvbnN0IHB1YnMgPSBhY2lkVGVzdC5yb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVmUGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zLnVzZXIucHViLCBwdWJzWzBdKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZWZQYXJzZWRUcmFuc2FjdGlvbi5rZXljaGFpbnMuYmFja3VwLnB1YiwgcHVic1sxXSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVmUGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zLmJpdGdvLnB1YiwgcHVic1syXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgb3V0cHV0cyBjbGFzc2lmaWVkIGFzIGludGVybmFsIG9yIGV4dGVybmFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gU2luY2Ugd2UgZGlkbid0IHNwZWNpZnkgYW55IHJlY2lwaWVudHMsIG91dHB1dHMgd2lsbCBiZSBjbGFzc2lmaWVkIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBjYW4gYmVcbiAgICAgIC8vIHZlcmlmaWVkIGFzIHdhbGxldCBhZGRyZXNzZXMuIFNvbWUgbWF5IGJlIGV4dGVybmFsIGlmIGFkZHJlc3MgdmVyaWZpY2F0aW9uIGZhaWxzIHdpdGhvdXQgYSBwcm9wZXIgd2FsbGV0IHNldHVwLlxuICAgICAgY29uc3QgdG90YWxPdXRwdXRzID0gcmVmUGFyc2VkVHJhbnNhY3Rpb24ub3V0cHV0cy5sZW5ndGg7XG4gICAgICBjb25zdCBjaGFuZ2VPdXRwdXRzID0gcmVmUGFyc2VkVHJhbnNhY3Rpb24uY2hhbmdlT3V0cHV0cy5sZW5ndGg7XG4gICAgICBjb25zdCBleHRlcm5hbE91dHB1dHMgPSByZWZQYXJzZWRUcmFuc2FjdGlvbi5vdXRwdXRzLmZpbHRlcigobykgPT4gby5leHRlcm5hbCA9PT0gdHJ1ZSkubGVuZ3RoO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4dGVybmFsT3V0cHV0cywgMyk7XG5cbiAgICAgIGFzc2VydC5vayh0b3RhbE91dHB1dHMgPiAwLCAnc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIG91dHB1dCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNoYW5nZU91dHB1dHMgKyBleHRlcm5hbE91dHB1dHMsIHRvdGFsT3V0cHV0cywgJ2FsbCBvdXRwdXRzIHNob3VsZCBiZSBjbGFzc2lmaWVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgZXhwZWN0ZWQgZXhwbGljaXQgYW5kIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoQmlnSW50KHJlZlBhcnNlZFRyYW5zYWN0aW9uLmV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCksIGV4cGVjdGVkRXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChCaWdJbnQocmVmUGFyc2VkVHJhbnNhY3Rpb24uaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50KSwgZXhwZWN0ZWRJbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVUcmFuc2FjdGlvbihmaWx0ZXI6ICh0ZXN0OiB1dHhvbGliLnRlc3R1dGlsLkFjaWRUZXN0KSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZSkge1xuICBkZXNjcmliZShgcGFyc2VUcmFuc2FjdGlvbmAsIGZ1bmN0aW9uICgpIHtcbiAgICB1dHhvbGliLnRlc3R1dGlsLkFjaWRUZXN0LnN1aXRlKClcbiAgICAgIC5maWx0ZXIoZmlsdGVyKVxuICAgICAgLmZvckVhY2goKHRlc3QpID0+IHtcbiAgICAgICAgLy8gRGVmYXVsdCBjYXNlOiBwc2J0IGZvcm1hdCwgaW5mZXIgcmVjaXBpZW50cyBmcm9tIGV4cGxhbmF0aW9uXG4gICAgICAgIGRlc2NyaWJlUGFyc2VUcmFuc2FjdGlvbldpdGgodGVzdCwgJ2RlZmF1bHQnLCB7XG4gICAgICAgICAgdHhQYXJhbXM6ICdpbmZlckZyb21FeHBsYW5hdGlvbicsXG4gICAgICAgICAgZXhwZWN0ZWRFeHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDE4MDBuLFxuICAgICAgICAgIGV4cGVjdGVkSW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAwbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRlc3QubmV0d29yayAhPT0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4dGVuZGVkIHRlc3Qgc3VpdGUgZm9yIGJpdGNvaW5cblxuICAgICAgICBkZXNjcmliZVBhcnNlVHJhbnNhY3Rpb25XaXRoKHRlc3QsICdlbXB0eSByZWNpcGllbnRzJywge1xuICAgICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4cGVjdGVkRXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAwbixcbiAgICAgICAgICBleHBlY3RlZEltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMTgwMG4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlUGFyc2VUcmFuc2FjdGlvbldpdGgodGVzdCwgJ3JiZicsIHtcbiAgICAgICAgICB0eFBhcmFtczoge1xuICAgICAgICAgICAgcmJmVHhJZHM6IFsnUExBQ0VIT0xERVInXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4cGVjdGVkRXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiAxODAwbixcbiAgICAgICAgICBleHBlY3RlZEltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMG4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlUGFyc2VUcmFuc2FjdGlvbldpdGgodGVzdCwgJ2FsbG93RXh0ZXJuYWxDaGFuZ2VBZGRyZXNzJywge1xuICAgICAgICAgIHR4UGFyYW1zOiAnaW5mZXJGcm9tRXhwbGFuYXRpb24nLFxuICAgICAgICAgIGV4dGVybmFsQ3VzdG9tQ2hhbmdlQWRkcmVzczogdHJ1ZSxcbiAgICAgICAgICBleHBlY3RlZEV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogMTgwMG4sXG4gICAgICAgICAgZXhwZWN0ZWRJbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQ6IDBuLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuZGVzY3JpYmVUcmFuc2FjdGlvbigpO1xuIl19