@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.
- package/dist/cjs/src/abstractUtxoCoin.d.ts +20 -39
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/cjs/src/abstractUtxoCoin.js +67 -140
- package/dist/cjs/src/impl/doge/doge.d.ts +0 -2
- package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -1
- package/dist/cjs/src/impl/doge/doge.js +1 -4
- package/dist/cjs/src/index.d.ts +0 -1
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +1 -2
- package/dist/cjs/src/keychains.d.ts +1 -2
- package/dist/cjs/src/keychains.d.ts.map +1 -1
- package/dist/cjs/src/keychains.js +3 -4
- package/dist/cjs/src/names.d.ts +0 -23
- package/dist/cjs/src/names.d.ts.map +1 -1
- package/dist/cjs/src/names.js +2 -140
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/cjs/src/recovery/backupKeyRecovery.js +3 -3
- package/dist/cjs/src/transaction/decode.d.ts +2 -6
- package/dist/cjs/src/transaction/decode.d.ts.map +1 -1
- package/dist/cjs/src/transaction/decode.js +4 -65
- package/dist/cjs/src/transaction/explainTransaction.d.ts +3 -6
- package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/explainTransaction.js +4 -12
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +1 -37
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +1 -344
- package/dist/cjs/src/transaction/fixedScript/index.d.ts +0 -2
- package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/index.js +2 -6
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +1 -2
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +2 -14
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +17 -49
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +4 -51
- package/dist/cjs/src/transaction/index.d.ts +1 -2
- package/dist/cjs/src/transaction/index.d.ts.map +1 -1
- package/dist/cjs/src/transaction/index.js +2 -4
- package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/signTransaction.js +2 -9
- package/dist/cjs/src/transaction/types.d.ts +1 -4
- package/dist/cjs/src/transaction/types.d.ts.map +1 -1
- package/dist/cjs/src/transaction/types.js +1 -5
- package/dist/cjs/test/unit/address.js +24 -1
- package/dist/cjs/test/unit/buildSignSendLegacyFormat.js +3 -3
- package/dist/cjs/test/unit/customSigner.js +3 -3
- package/dist/cjs/test/unit/prebuildAndSign.js +5 -5
- package/dist/cjs/test/unit/signTransaction.js +9 -9
- package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +25 -47
- package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +19 -84
- package/dist/cjs/test/unit/transaction.js +9 -9
- package/dist/cjs/test/unit/verifyTransaction.js +1 -21
- package/dist/cjs/test/unit/wallet.js +3 -3
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/abstractUtxoCoin.d.ts +20 -39
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/esm/abstractUtxoCoin.js +71 -111
- package/dist/esm/impl/doge/doge.d.ts +0 -2
- package/dist/esm/impl/doge/doge.d.ts.map +1 -1
- package/dist/esm/impl/doge/doge.js +1 -4
- package/dist/esm/index.d.ts +0 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -2
- package/dist/esm/keychains.d.ts +1 -2
- package/dist/esm/keychains.d.ts.map +1 -1
- package/dist/esm/keychains.js +3 -4
- package/dist/esm/names.d.ts +0 -23
- package/dist/esm/names.d.ts.map +1 -1
- package/dist/esm/names.js +1 -102
- package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/esm/recovery/backupKeyRecovery.js +4 -4
- package/dist/esm/transaction/decode.d.ts +2 -6
- package/dist/esm/transaction/decode.d.ts.map +1 -1
- package/dist/esm/transaction/decode.js +4 -31
- package/dist/esm/transaction/explainTransaction.d.ts +3 -6
- package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/explainTransaction.js +4 -12
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +1 -37
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/explainTransaction.js +2 -309
- package/dist/esm/transaction/fixedScript/index.d.ts +0 -2
- package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/index.js +1 -3
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/parseTransaction.js +1 -2
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +2 -14
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signTransaction.js +17 -49
- package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/verifyTransaction.js +4 -18
- package/dist/esm/transaction/index.d.ts +1 -2
- package/dist/esm/transaction/index.d.ts.map +1 -1
- package/dist/esm/transaction/index.js +2 -3
- package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/signTransaction.js +3 -10
- package/dist/esm/transaction/types.d.ts +1 -4
- package/dist/esm/transaction/types.d.ts.map +1 -1
- package/dist/esm/transaction/types.js +2 -4
- package/package.json +6 -5
- package/dist/cjs/src/transaction/fetchInputs.d.ts +0 -27
- package/dist/cjs/src/transaction/fetchInputs.d.ts.map +0 -1
- package/dist/cjs/src/transaction/fetchInputs.js +0 -111
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +0 -32
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +0 -1
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +0 -163
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +0 -20
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +0 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +0 -157
- package/dist/cjs/src/wasmUtil.d.ts +0 -34
- package/dist/cjs/src/wasmUtil.d.ts.map +0 -1
- package/dist/cjs/src/wasmUtil.js +0 -95
- package/dist/esm/transaction/fetchInputs.d.ts +0 -27
- package/dist/esm/transaction/fetchInputs.d.ts.map +0 -1
- package/dist/esm/transaction/fetchInputs.js +0 -74
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +0 -32
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +0 -1
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +0 -123
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +0 -20
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +0 -1
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +0 -117
- package/dist/esm/wasmUtil.d.ts +0 -34
- package/dist/esm/wasmUtil.d.ts.map +0 -1
- 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
|
|
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
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpblBzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvZXhwbGFpblBzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBd0M7QUFFeEMseURBQTJDO0FBQzNDLDhDQUEyQztBQUMzQyxnREFBcUQ7QUFFckQseUVBS2lEO0FBRWpELFNBQVMsdUJBQXVCLENBQUMsUUFBMkI7SUFDMUQsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzNCLElBQUksV0FBNkMsQ0FBQztRQUNsRCxJQUFJLHVCQUFxRSxDQUFDO1FBQzFFLElBQUksUUFBcUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BCLFdBQVcsR0FBRyw2QkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3RSx1QkFBdUIsR0FBRyw2QkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMxRixRQUFRLEdBQUcsNkJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUU7WUFDeEQsTUFBTSxlQUFlLEdBQUcsSUFBQSw2QkFBZSxFQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7Z0JBQzdELGdCQUFnQixFQUFFO29CQUNoQixVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztpQkFDdEQ7YUFDRixDQUFDLENBQUM7WUFDSCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3pELGVBQWUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQy9DLGdCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztZQUVILGdEQUFnRDtZQUNoRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLGVBQWUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDakUsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqRCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3QyxLQUFLLE1BQU0sS0FBSyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDM0MsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCxFQUFFLENBQUMsK0RBQStELEVBQUU7WUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBQSxtQ0FBcUIsRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFFO2dCQUMxRCxnQkFBZ0IsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLEVBQUU7YUFDNUUsQ0FBQyxDQUFDO1lBQ0gsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hELGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sTUFBTSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxNQUFNLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELGdCQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ25ELGdCQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsRSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2xELGdCQUFNLENBQUMsV0FBVyxDQUNoQixNQUFNLENBQUMsR0FBRyxFQUNWLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDM0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsa0NBQWtDO1FBRWxDLEVBQUUsQ0FBQyxxREFBcUQsRUFBRTtZQUN4RCxNQUFNLGVBQWUsR0FBRyxJQUFBLDZCQUFlLEVBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRTtnQkFDN0QsZ0JBQWdCLEVBQUU7b0JBQ2hCLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2lCQUN0RDtnQkFDRCx1QkFBdUI7YUFDeEIsQ0FBQyxDQUFDO1lBQ0gsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDL0MsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUQsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RSxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLG1CQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUzRSxFQUFFLENBQUMsZ0ZBQWdGLEVBQUU7UUFDbkYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDekMsTUFBTSxjQUFjLEdBQUcsbUJBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZELDJGQUEyRjtRQUMzRixNQUFNLElBQUksR0FBRyxtQkFBUSxDQUFDLGFBQWEsQ0FDakMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQ3ZDLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFDaEUsT0FBTyxFQUNQLGNBQWMsRUFDZCxVQUFVLENBQ1gsQ0FBQztRQUNGLCtFQUErRTtRQUMvRSx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBWSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFL0MsTUFBTSxRQUFRLEdBQUcsNkJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkYsTUFBTSxXQUFXLEdBQUcsNkJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUUxRSxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxJQUFBLG1DQUFxQixFQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7WUFDM0MsZ0JBQWdCLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO1NBQ3JDLENBQUMsRUFDSiw4Q0FBOEMsQ0FDL0MsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsa0NBQWtDLEVBQUU7SUFDM0MsbUJBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1NBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztTQUNyRCxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNwQixRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUN0QixJQUFJLEdBQWlDLENBQUM7WUFFdEMsTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDaEIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0QsSUFBQSxnQkFBTSxFQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNwQixNQUFNLFFBQVEsR0FBRyw2QkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDL0UsTUFBTSxXQUFXLEdBQUcsNkJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ25GLEdBQUcsR0FBRyxJQUFBLG1DQUFxQixFQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7b0JBQ2pELGdCQUFnQixFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLDRCQUE0QixFQUFFLENBQUMsRUFBRTtpQkFDNUUsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7Z0JBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUEsOENBQWdDLEVBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3RELGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BFLGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdkQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZELGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHVFQUF1RSxFQUFFO2dCQUMxRSxNQUFNLEdBQUcsR0FBRyxJQUFBLDhDQUFnQyxFQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzVELGdCQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydC9zdHJpY3QnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyB0ZXN0dXRpbCB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQge1xuICBleHBsYWluUHNidFdhc20sXG4gIGV4cGxhaW5Qc2J0V2FzbUJpZ0ludCxcbiAgYWdncmVnYXRlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbnMsXG4gIHR5cGUgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbkJpZ0ludCxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0JztcblxuZnVuY3Rpb24gZGVzY3JpYmVUcmFuc2FjdGlvbldpdGgoYWNpZFRlc3Q6IHRlc3R1dGlsLkFjaWRUZXN0KSB7XG4gIGRlc2NyaWJlKGAke2FjaWRUZXN0Lm5hbWV9YCwgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXRYcHViczogZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXM7XG4gICAgbGV0IGN1c3RvbUNoYW5nZVdhbGxldFhwdWJzOiBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidDtcbiAgICBiZWZvcmUoJ3ByZXBhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwc2J0ID0gYWNpZFRlc3QuY3JlYXRlUHNidCgpO1xuICAgICAgY29uc3QgcHNidEJ5dGVzID0gcHNidC50b0J1ZmZlcigpO1xuICAgICAgY29uc3QgbmV0d29ya05hbWUgPSB1dHhvbGliLmdldE5ldHdvcmtOYW1lKGFjaWRUZXN0Lm5ldHdvcmspO1xuICAgICAgYXNzZXJ0KG5ldHdvcmtOYW1lKTtcbiAgICAgIHdhbGxldFhwdWJzID0gZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbShhY2lkVGVzdC5yb290V2FsbGV0S2V5cyk7XG4gICAgICBjdXN0b21DaGFuZ2VXYWxsZXRYcHVicyA9IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzLmZyb20oYWNpZFRlc3Qub3RoZXJXYWxsZXRLZXlzKTtcbiAgICAgIHdhc21Qc2J0ID0gZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LmZyb21CeXRlcyhwc2J0Qnl0ZXMsIG5ldHdvcmtOYW1lKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGVjdGVkIG91dHB1dHMgZnJvbSBleHBsYWluUHNidFdhc20nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtRXhwbGFuYXRpb24gPSBleHBsYWluUHNidFdhc20od2FzbVBzYnQsIHdhbGxldFhwdWJzLCB7XG4gICAgICAgIHJlcGxheVByb3RlY3Rpb246IHtcbiAgICAgICAgICBwdWJsaWNLZXlzOiBbYWNpZFRlc3QuZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmxpY0tleSgpXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21FeHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHMubGVuZ3RoLCBhY2lkVGVzdC5vdXRwdXRzLmxlbmd0aCAtIDMpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21FeHBsYW5hdGlvbi5vdXRwdXRBbW91bnQsICcxODAwJyk7XG4gICAgICB3YXNtRXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0cy5mb3JFYWNoKChjaGFuZ2UpID0+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
|
|
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,
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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(
|
|
242
|
-
describe(`parseTransaction
|
|
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',
|
|
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, '
|
|
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',
|
|
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',
|
|
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(
|
|
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
|