@bitgo/abstract-utxo 10.24.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts +14 -2
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  3. package/dist/cjs/src/abstractUtxoCoin.js +15 -7
  4. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +5 -1
  5. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -1
  6. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +33 -4
  7. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +3 -0
  8. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
  9. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +1 -1
  10. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  11. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +4 -3
  12. package/dist/cjs/test/unit/bip322.js +99 -28
  13. package/dist/cjs/test/unit/customChangeWallet.js +144 -155
  14. package/dist/cjs/test/unit/explainTransaction.js +1 -61
  15. package/dist/cjs/test/unit/parseTransaction.js +31 -1
  16. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts +2 -0
  17. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts.map +1 -0
  18. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.js +99 -0
  19. package/dist/cjs/test/unit/prebuildAndSign.js +28 -59
  20. package/dist/cjs/test/unit/signTransaction.js +17 -39
  21. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +4 -4
  22. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +21 -77
  23. package/dist/cjs/test/unit/transaction/recipient.d.ts +2 -0
  24. package/dist/cjs/test/unit/transaction/recipient.d.ts.map +1 -0
  25. package/dist/cjs/test/unit/transaction/recipient.js +52 -0
  26. package/dist/cjs/test/unit/transaction.js +16 -23
  27. package/dist/cjs/test/unit/webauthn.d.ts +2 -0
  28. package/dist/cjs/test/unit/webauthn.d.ts.map +1 -0
  29. package/dist/cjs/test/unit/webauthn.js +73 -0
  30. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  31. package/dist/esm/abstractUtxoCoin.d.ts +14 -2
  32. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  33. package/dist/esm/abstractUtxoCoin.js +16 -8
  34. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +5 -1
  35. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -1
  36. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +33 -4
  37. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +3 -0
  38. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
  39. package/dist/esm/transaction/fixedScript/explainTransaction.js +1 -1
  40. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
  41. package/dist/esm/transaction/fixedScript/parseTransaction.js +4 -3
  42. package/package.json +10 -10
  43. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +0 -15
  44. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +0 -1
  45. package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +0 -51
@@ -43,14 +43,9 @@ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
43
43
  const sdk_core_1 = require("@bitgo/sdk-core");
44
44
  const src_1 = require("../../src");
45
45
  const util_1 = require("./util");
46
- function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
46
+ function run(coin, inputScripts, txFormat) {
47
47
  const amountType = coin.amountType;
48
- const title = [
49
- inputScripts.join(','),
50
- `txFormat=${txFormat}`,
51
- `amountType=${amountType}`,
52
- decodeWith ? `decodeWith=${decodeWith}` : '',
53
- ];
48
+ const title = [inputScripts.join(','), `txFormat=${txFormat}`, `amountType=${amountType}`];
54
49
  describe(`${title.join(' ')}`, function () {
55
50
  const bgUrl = sdk_core_1.common.Environments[util_1.defaultBitGo.getEnv()].uri;
56
51
  const isTransactionWithKeyPathSpend = inputScripts.some((s) => s === 'taprootKeyPathSpend');
@@ -77,7 +72,7 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
77
72
  keychains: rootWalletKeys.triple.map((k) => ({ pub: k.neutered().toBase58() })),
78
73
  });
79
74
  }
80
- function getSignParams(prebuildHex, signer, cosigner, decodeWith) {
75
+ function getSignParams(prebuildHex, signer, cosigner) {
81
76
  const txInfo = {
82
77
  unspents: txFormat === 'psbt' ? undefined : getUnspents(),
83
78
  };
@@ -86,7 +81,6 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
86
81
  walletId: isTransactionWithKeyPathSpend ? wallet.id() : undefined,
87
82
  txHex: prebuildHex,
88
83
  txInfo,
89
- decodeWith,
90
84
  },
91
85
  prv: signer.toBase58(),
92
86
  pubs: walletKeys.triple.map((k) => k.neutered().toBase58()),
@@ -96,14 +90,20 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
96
90
  }
97
91
  async function createHalfSignedTransaction(prebuild, signer, cosigner) {
98
92
  let scope;
99
- if (prebuild instanceof utxolib.bitgo.UtxoPsbt && isTransactionWithKeyPathSpend) {
100
- const psbt = prebuild.clone().setAllInputsMusig2NonceHD(cosigner);
93
+ if (isTransactionWithKeyPathSpend) {
101
94
  scope = nock(bgUrl)
102
95
  .post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/signpsbt`, (body) => body.psbt)
103
- .reply(200, { psbt: psbt.toHex() });
96
+ .reply(200, (_uri, requestBody) => {
97
+ const networkName = utxolib.getNetworkName(coin.network);
98
+ const reqBytes = Buffer.from(requestBody.psbt, 'hex');
99
+ const reqPsbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(reqBytes, networkName);
100
+ const cosignerWasm = wasm_utxo_1.BIP32.fromBase58(cosigner.toBase58());
101
+ reqPsbt.generateMusig2Nonces(cosignerWasm);
102
+ return { psbt: Buffer.from(reqPsbt.serialize()).toString('hex') };
103
+ });
104
104
  }
105
105
  // half-sign with the user key
106
- const result = (await wallet.signTransaction(getSignParams(prebuild.toBuffer().toString('hex'), signer, cosigner, decodeWith)));
106
+ const result = (await wallet.signTransaction(getSignParams(prebuild.toBuffer().toString('hex'), signer, cosigner)));
107
107
  if (scope) {
108
108
  assert.strictEqual(scope.isDone(), true);
109
109
  }
@@ -111,7 +111,7 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
111
111
  }
112
112
  async function createFullSignedTransaction(halfSigned, signer, cosigner) {
113
113
  return (await wallet.signTransaction({
114
- ...getSignParams(halfSigned.txHex, signer, cosigner, decodeWith),
114
+ ...getSignParams(halfSigned.txHex, signer, cosigner),
115
115
  isLastSignature: true,
116
116
  }));
117
117
  }
@@ -220,12 +220,8 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
220
220
  unspents,
221
221
  },
222
222
  pubs,
223
- decodeWith,
224
223
  });
225
224
  const expectedProperties = ['id', 'outputs', 'changeOutputs', 'changeAmount', 'outputAmount'];
226
- if (decodeWith !== 'wasm-utxo') {
227
- expectedProperties.push('displayOrder', 'inputSignatures', 'signatures');
228
- }
229
225
  for (const prop of expectedProperties) {
230
226
  assert.ok(prop in explanation, `expected explanation to have property '${prop}'`);
231
227
  }
@@ -288,15 +284,12 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
288
284
  ? getUnspentsForPsbt().map((u) => ({ ...u, value: utxo_lib_1.bitgo.toTNumber(u.value, amountType) }))
289
285
  : getUnspents();
290
286
  await testExplainTx(stageName, txHex, unspents, pubs);
291
- if (decodeWith !== 'wasm-utxo') {
292
- await testExplainTx(stageName, txHex, unspents, undefined);
293
- }
294
287
  }
295
288
  });
296
289
  });
297
290
  }
298
291
  function runTestForCoin(coin) {
299
- run(coin, (0, util_1.getScriptTypes)(coin, 'psbt'), 'psbt', { decodeWith: 'wasm-utxo' });
292
+ run(coin, (0, util_1.getScriptTypes)(coin, 'psbt'), 'psbt');
300
293
  }
301
294
  describe('Transaction Suite', function () {
302
295
  (0, util_1.getMinUtxoCoins)().forEach((coin) => {
@@ -305,4 +298,4 @@ describe('Transaction Suite', function () {
305
298
  });
306
299
  });
307
300
  });
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQkFBZTtBQUNmLCtDQUFpQztBQUVqQywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLDZCQUE4QjtBQUM5Qiw4Q0FBa0U7QUFDbEUsZ0RBQTZFO0FBQzdFLDhDQU15QjtBQUV6QixtQ0FBMEY7QUFJMUYsaUNBZWdCO0FBRWhCLFNBQVMsR0FBRyxDQUNWLElBQXNCLEVBQ3RCLFlBQXdDLEVBQ3hDLFFBQTJCLEVBQzNCLEVBQUUsVUFBVSxLQUFrQyxFQUFFO0lBRWhELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQUc7UUFDWixZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN0QixZQUFZLFFBQVEsRUFBRTtRQUN0QixjQUFjLFVBQVUsRUFBRTtRQUMxQixVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7S0FDN0MsQ0FBQztJQUNGLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtRQUM3QixNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRTdELE1BQU0sNkJBQTZCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLHFCQUFxQixDQUFDLENBQUM7UUFDNUYsTUFBTSxpQ0FBaUMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssVUFBVSxD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c0NvbnRlbnQiOlsiaW1wb3J0ICdtb2NoYSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSwgYml0Z28sIHRlc3R1dGlsIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGFkZHJlc3MgYXMgd2FzbUFkZHJlc3MsIGZpeGVkU2NyaXB0V2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQge1xuICBjb21tb24sXG4gIEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24sXG4gIEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24sXG4gIFRyaXBsZSxcbiAgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgQWJzdHJhY3RVdHhvQ29pbiwgZ2VuZXJhdGVBZGRyZXNzLCBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBTZGtCYWNrZW5kIH0gZnJvbSAnLi4vLi4vc3JjL3RyYW5zYWN0aW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgVW5zcGVudCwgV2FsbGV0VW5zcGVudCB9IGZyb20gJy4uLy4uL3NyYy91bnNwZW50JztcblxuaW1wb3J0IHtcbiAgYXNzZXJ0RXF1YWxKU09OLFxuICBnZXRGaXh0dXJlLFxuICBnZXRVdHhvV2FsbGV0LFxuICBtb2NrVW5zcGVudCxcbiAgSW5wdXRTY3JpcHRUeXBlLFxuICBUcmFuc2FjdGlvbk9iaixcbiAgdHJhbnNhY3Rpb25Ub09iaixcbiAgdHJhbnNhY3Rpb25IZXhUb09iaixcbiAgY3JlYXRlUHJlYnVpbGRUcmFuc2FjdGlvbixcbiAgZ2V0RGVmYXVsdFdhbGxldEtleXMsXG4gIGdldFdhbGxldEtleXMsXG4gIGRlZmF1bHRCaXRHbyxcbiAgZ2V0TWluVXR4b0NvaW5zLFxuICBnZXRTY3JpcHRUeXBlcyxcbn0gZnJvbSAnLi91dGlsJztcblxuZnVuY3Rpb24gcnVuPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBpbnB1dFNjcmlwdHM6IHRlc3R1dGlsLklucHV0U2NyaXB0VHlwZVtdLFxuICB0eEZvcm1hdDogJ2xlZ2FjeScgfCAncHNidCcsXG4gIHsgZGVjb2RlV2l0aCB9OiB7IGRlY29kZVdpdGg/OiBTZGtCYWNrZW5kIH0gPSB7fVxuKSB7XG4gIGNvbnN0IGFtb3VudFR5cGUgPSBjb2luLmFtb3VudFR5cGU7XG4gIGNvbnN0IHRpdGxlID0gW1xuICAgIGlucHV0U2NyaXB0cy5qb2luKCcsJyksXG4gICAgYHR4Rm9ybWF0PSR7dHhGb3JtYXR9YCxcbiAgICBgYW1vdW50VHlwZT0ke2Ftb3VudFR5cGV9YCxcbiAgICBkZWNvZGVXaXRoID8gYGRlY29kZVdpdGg9JHtkZWNvZGVXaXRofWAgOiAnJyxcbiAgXTtcbiAgZGVzY3JpYmUoYCR7dGl0bGUuam9pbignICcpfWAsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZGVmYXVsdEJpdEdvLmdldEVudigpXS51cmk7XG5cbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCA9IGlucHV0U2NyaXB0cy5zb21lKChzKSA9PiBzID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpO1xuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25XaXRoUmVwbGF5UHJvdGVjdGlvbiA9IGlucHV0U2NyaXB0cy5zb21lKChzKSA9PiBzID09PSAncDJzaFAycGsnKTtcbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aFAydHIgPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3AydHInKTtcbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aFAydHJNdXNpZzIgPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3AydHJNdXNpZzInKTtcblxuICAgIGNvbnN0IHZhbHVlID0gKGFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gQmlnSW50KCcxMDk5OTk5OTgwMDAwMDAwMScpIDogMWU4KSBhcyBUTnVtYmVyO1xuICAgIGNvbnN0IHdhbGxldCA9IGdldFV0eG9XYWxsZXQoY29pbiwgeyBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJywgY29pbjogY29pbi5nZXRDaGFpbigpIH0pO1xuICAgIGNvbnN0IHdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuXG4gICAgY29uc3QgZnVsbFNpZ24gPSAhKGlzVHJhbnNhY3Rpb25XaXRoUmVwbGF5UHJvdGVjdGlvbiB8fCBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCk7XG5cbiAgICBmdW5jdGlvbiBnZXRVbnNwZW50c0ZvclBzYnQoKTogVW5zcGVudDxiaWdpbnQ+W10ge1xuICAgICAgcmV0dXJuIGlucHV0U2NyaXB0cy5tYXAoKHQsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB0ZXN0dXRpbC50b1Vuc3BlbnQoXG4gICAgICAgICAgeyBzY3JpcHRUeXBlOiB0LCB2YWx1ZTogdCA9PT0gJ3Ayc2hQMnBrJyA/IEJpZ0ludCgxMDAwKSA6IEJpZ0ludCh2YWx1ZSkgfSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBjb2luLm5ldHdvcmssXG4gICAgICAgICAgd2FsbGV0S2V5c1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9UeG5JbnB1dFNjcmlwdFR5cGUodHlwZTogdGVzdHV0aWwuSW5wdXRTY3JpcHRUeXBlKTogSW5wdXRTY3JpcHRUeXBlIHtcbiAgICAgIHJldHVybiB0eXBlID09PSAncDJzaFAycGsnID8gJ3JlcGxheVByb3RlY3Rpb24nIDogdHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnID8gJ3AydHJNdXNpZzInIDogdHlwZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRVbnNwZW50cygpOiBVbnNwZW50PFROdW1iZXI+W10ge1xuICAgICAgcmV0dXJuIGlucHV0U2NyaXB0cy5tYXAoKHR5cGUsIGkpID0+XG4gICAgICAgIG1vY2tVbnNwZW50PFROdW1iZXI+KGNvaW4ubmV0d29yaywgd2FsbGV0S2V5cywgdG9UeG5JbnB1dFNjcmlwdFR5cGUodHlwZSksIGksIHZhbHVlKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRPdXRwdXRBZGRyZXNzKHJvb3RXYWxsZXRLZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZUFkZHJlc3MoY29pbi5uYW1lLCB7XG4gICAgICAgIGtleWNoYWluczogcm9vdFdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gKHsgcHViOiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTaWduUGFyYW1zKFxuICAgICAgcHJlYnVpbGRIZXg6IHN0cmluZyxcbiAgICAgIHNpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBjb3NpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBkZWNvZGVXaXRoOiBTZGtCYWNrZW5kIHwgdW5kZWZpbmVkXG4gICAgKTogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gICAgICBjb25zdCB0eEluZm8gPSB7XG4gICAgICAgIHVuc3BlbnRzOiB0eEZvcm1hdCA9PT0gJ3BzYnQnID8gdW5kZWZpbmVkIDogZ2V0VW5zcGVudHMoKSxcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgd2FsbGV0SWQ6IGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kID8gd2FsbGV0LmlkKCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHhIZXg6IHByZWJ1aWxkSGV4LFxuICAgICAgICAgIHR4SW5mbyxcbiAgICAgICAgICBkZWNvZGVXaXRoLFxuICAgICAgICB9LFxuICAgICAgICBwcnY6IHNpZ25lci50b0Jhc2U1OCgpLFxuICAgICAgICBwdWJzOiB3YWxsZXRLZXlzLnRyaXBsZS5tYXAoKGspID0+IGsubmV1dGVyZWQoKS50b0Jhc2U1OCgpKSxcbiAgICAgICAgY29zaWduZXJQdWI6IGNvc2lnbmVyLm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgICAgZXh0cmFjdFRyYW5zYWN0aW9uOiBmYWxzZSxcbiAgICAgIH0gYXMgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucztcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVIYWxmU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICBwcmVidWlsZDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4gfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LFxuICAgICAgc2lnbmVyOiBCSVAzMkludGVyZmFjZSxcbiAgICAgIGNvc2lnbmVyOiBCSVAzMkludGVyZmFjZVxuICAgICk6IFByb21pc2U8SGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj4ge1xuICAgICAgbGV0IHNjb3BlOiBub2NrLlNjb3BlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHByZWJ1aWxkIGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCAmJiBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCkge1xuICAgICAgICBjb25zdCBwc2J0ID0gcHJlYnVpbGQuY2xvbmUoKS5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKGNvc2lnbmVyKTtcbiAgICAgICAgc2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3R4L3NpZ25wc2J0YCwgKGJvZHkpID0+IGJvZHkucHNidClcbiAgICAgICAgICAucmVwbHkoMjAwLCB7IHBzYnQ6IHBzYnQudG9IZXgoKSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gaGFsZi1zaWduIHdpdGggdGhlIHVzZXIga2V5XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbihcbiAgICAgICAgZ2V0U2lnblBhcmFtcyhwcmVidWlsZC50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSwgc2lnbmVyLCBjb3NpZ25lciwgZGVjb2RlV2l0aClcbiAgICAgICkpIGFzIFByb21pc2U8SGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj47XG5cbiAgICAgIGlmIChzY29wZSkge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NvcGUuaXNEb25lKCksIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTaWduZWRUcmFuc2FjdGlvbihcbiAgICAgIGhhbGZTaWduZWQ6IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24sXG4gICAgICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgY29zaWduZXI6IEJJUDMySW50ZXJmYWNlXG4gICAgKTogUHJvbWlzZTxGdWxseVNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgICByZXR1cm4gKGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5nZXRTaWduUGFyYW1zKGhhbGZTaWduZWQudHhIZXgsIHNpZ25lciwgY29zaWduZXIsIGRlY29kZVdpdGgpLFxuICAgICAgICBpc0xhc3RTaWduYXR1cmU6IHRydWUsXG4gICAgICB9KSkgYXMgRnVsbHlTaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9XG5cbiAgICB0eXBlIFRyYW5zYWN0aW9uU3RhZ2VzID0ge1xuICAgICAgcHJlYnVpbGQ6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidDtcbiAgICAgIGhhbGZTaWduZWRVc2VyQmFja3VwPzogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbjtcbiAgICAgIGhhbGZTaWduZWRVc2VyQml0R286IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb247XG4gICAgICBmdWxsU2lnbmVkVXNlckJhY2t1cD86IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb247XG4gICAgICBmdWxsU2lnbmVkVXNlckJpdEdvPzogRnVsbHlTaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9O1xuXG4gICAgdHlwZSBUcmFuc2FjdGlvbk9ialN0YWdlcyA9IFJlY29yZDxrZXlvZiBUcmFuc2FjdGlvblN0YWdlcywgVHJhbnNhY3Rpb25PYmo+O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlUHJlYnVpbGRQc2J0KCkge1xuICAgICAgY29uc3QgaW5wdXRzID0gaW5wdXRTY3JpcHRzLm1hcChcbiAgICAgICAgKHQpOiB0ZXN0dXRpbC5JbnB1dCA9PiAoe1xuICAgICAgICAgIHNjcmlwdFR5cGU6IHQsXG4gICAgICAgICAgdmFsdWU6IHQgPT09ICdwMnNoUDJwaycgPyBCaWdJbnQoMTAwMCkgOiBCaWdJbnQodmFsdWUpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHVuc3BlbnRTdW0gPSBpbnB1dHMucmVkdWNlKChwcmV2OiBiaWdpbnQsIGN1cnIpID0+IHByZXYgKyBjdXJyLnZhbHVlLCBCaWdJbnQoMCkpO1xuICAgICAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuT3V0cHV0W10gPSBbXG4gICAgICAgIHsgYWRkcmVzczogZ2V0T3V0cHV0QWRkcmVzcyhnZXRXYWxsZXRLZXlzKCd0ZXN0JykpLCB2YWx1ZTogdW5zcGVudFN1bSAtIEJpZ0ludCgxMDAwKSB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHBzYnQgPSB0ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KGlucHV0cywgb3V0cHV0cywgY29pbi5uZXR3b3JrLCB3YWxsZXRLZXlzLCAndW5zaWduZWQnLCB7XG4gICAgICAgIHAyc2hQMnBrS2V5OiBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyhjb2luLm5hbWUpWzBdLFxuICAgICAgfSk7XG4gICAgICB1dHhvbGliLmJpdGdvLmFkZFhwdWJzVG9Qc2J0KHBzYnQsIHdhbGxldEtleXMpO1xuICAgICAgcmV0dXJuIHBzYnQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25TdGFnZXMoKTogUHJvbWlzZTxUcmFuc2FjdGlvblN0YWdlcz4ge1xuICAgICAgY29uc3QgcHJlYnVpbGQgPVxuICAgICAgICB0eEZvcm1hdCA9PT0gJ3BzYnQnXG4gICAgICAgICAgPyBjcmVhdGVQcmVidWlsZFBzYnQoKVxuICAgICAgICAgIDogY3JlYXRlUHJlYnVpbGRUcmFuc2FjdGlvbjxUTnVtYmVyPihjb2luLm5ldHdvcmssIGdldFVuc3BlbnRzKCksIGdldE91dHB1dEFkZHJlc3Mod2FsbGV0S2V5cykpO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkVXNlckJpdEdvID0gYXdhaXQgY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKHByZWJ1aWxkLCB3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYml0Z28pO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFVzZXJCaXRHbyA9XG4gICAgICAgIGZ1bGxTaWduICYmICFpc1RyYW5zYWN0aW9uV2l0aFAydHJNdXNpZzJcbiAgICAgICAgICA/IGF3YWl0IGNyZWF0ZUZ1bGxTaWduZWRUcmFuc2FjdGlvbihoYWxmU2lnbmVkVXNlckJpdEdvLCB3YWxsZXRLZXlzLmJpdGdvLCB3YWxsZXRLZXlzLnVzZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGhhbGZTaWduZWRVc2VyQmFja3VwID1cbiAgICAgICAgIWlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kICYmICEodHhGb3JtYXQgPT09ICdwc2J0JyAmJiBpc1RyYW5zYWN0aW9uV2l0aFAydHIpXG4gICAgICAgICAgPyBhd2FpdCBjcmVhdGVIYWxmU2lnbmVkVHJhbnNhY3Rpb24ocHJlYnVpbGQsIHdhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iYWNrdXApXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBmdWxsU2lnbmVkVXNlckJhY2t1cCA9XG4gICAgICAgIGZ1bGxTaWduICYmIGhhbGZTaWduZWRVc2VyQmFja3VwXG4gICAgICAgICAgPyBhd2FpdCBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oaGFsZlNpZ25lZFVzZXJCYWNrdXAsIHdhbGxldEtleXMuYmFja3VwLCB3YWxsZXRLZXlzLnVzZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWJ1aWxkLFxuICAgICAgICBoYWxmU2lnbmVkVXNlckJhY2t1cCxcbiAgICAgICAgaGFsZlNpZ25lZFVzZXJCaXRHbyxcbiAgICAgICAgZnVsbFNpZ25lZFVzZXJCYWNrdXAsXG4gICAgICAgIGZ1bGxTaWduZWRVc2VyQml0R28sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCB0cmFuc2FjdGlvblN0YWdlczogVHJhbnNhY3Rpb25TdGFnZXM7XG5cbiAgICBiZWZvcmUoJ3ByZXBhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0cmFuc2FjdGlvblN0YWdlcyA9IGF3YWl0IGdldFRyYW5zYWN0aW9uU3RhZ2VzKCk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2gobm9jay5jbGVhbkFsbCk7XG5cbiAgICBpdCgnbWF0Y2ggZml4dHVyZXMnLCBhc3luYyBmdW5jdGlvbiAodGhpczogTW9jaGEuQ29udGV4dCkge1xuICAgICAgaWYgKHR4Rm9ybWF0ID09PSAncHNidCcpIHtcbiAgICAgICAgLy8gVE9ETyAobWF5YmUpIC0gb25jZSBmdWxsIFBTQlQgc3VwcG9ydCBpcyBhZGRlZCB0byBhYnN0cmFjdC11dHhvIG1vZHVsZSwgY3VzdG9tIEpTT04gcmVwcmVzZW50YXRpb24gb2YgUFNCVCBjYW4gYmUgY3JlYXRlZCBhbmQgdGVzdGVkIGhlcmUuXG4gICAgICAgIC8vIHNpZ25hdHVyZXMgb2YgdGFwcm9vdEtleVBhdGhTcGVuZHMgYXJlIHJhbmRvbSBzaW5jZSByYW5kb20gbmF0dXJlIG9mIE11U2lnMiBub25jZSwgc28gcHNidCBoZXggY29tcGFyaXNvbiBhbHNvIHdvbnQgd29yay5cblxuICAgICAgICByZXR1cm4gdGhpcy5za2lwKCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRvVHJhbnNhY3Rpb25TdGFnZXNPYmooc3RhZ2VzOiBUcmFuc2FjdGlvblN0YWdlcyk6IFRyYW5zYWN0aW9uT2JqU3RhZ2VzIHtcbiAgICAgICAgcmV0dXJuIF8ubWFwVmFsdWVzKHN0YWdlcywgKHYpID0+XG4gICAgICAgICAgdiA9PT0gdW5kZWZpbmVkIHx8IHYgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHx8IHYgaW5zdGFuY2VvZiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnRcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHYgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvblxuICAgICAgICAgICAgPyB0cmFuc2FjdGlvblRvT2JqPFROdW1iZXI+KHYpXG4gICAgICAgICAgICA6IHRyYW5zYWN0aW9uSGV4VG9PYmoodi50eEhleCwgY29pbi5uZXR3b3JrLCBhbW91bnRUeXBlKVxuICAgICAgICApIGFzIFRyYW5zYWN0aW9uT2JqU3RhZ2VzO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnRFcXVhbEpTT04oXG4gICAgICAgIHRvVHJhbnNhY3Rpb25TdGFnZXNPYmoodHJhbnNhY3Rpb25TdGFnZXMpLFxuICAgICAgICBhd2FpdCBnZXRGaXh0dXJlKFxuICAgICAgICAgIGNvaW4sXG4gICAgICAgICAgYHRyYW5zYWN0aW9ucy0ke2lucHV0U2NyaXB0cy5tYXAoKHQpID0+IHRvVHhuSW5wdXRTY3JpcHRUeXBlKHQpKS5qb2luKCctJyl9YCxcbiAgICAgICAgICB0b1RyYW5zYWN0aW9uU3RhZ2VzT2JqKHRyYW5zYWN0aW9uU3RhZ2VzKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gdGVzdFBzYnRWYWxpZFNpZ25hdHVyZXModHg6IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24sIHNpZ25lZEJ5OiBCSVAzMkludGVyZmFjZVtdKSB7XG4gICAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eC50eEhleCwgY29pbi5uZXR3b3JrKTtcbiAgICAgIGNvbnN0IHVuc3BlbnRzID0gZ2V0VW5zcGVudHNGb3JQc2J0KCk7XG4gICAgICBwc2J0LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB1bnNwZW50ID0gdW5zcGVudHNbaW5kZXhdO1xuICAgICAgICBpZiAoIXV0eG9saWIuYml0Z28uaXNXYWxsZXRVbnNwZW50KHVuc3BlbnQpKSB7XG4gICAgICAgICAgYXNzZXJ0Lm9rKHV0eG9saWIuYml0Z28uZ2V0UHNidElucHV0U2NyaXB0VHlwZShpbnB1dCksICdwMnNoUDJwaycpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3YWxsZXRVbnNwZW50ID0gdW5zcGVudCBhcyBXYWxsZXRVbnNwZW50PGJpZ2ludD47XG4gICAgICAgIGNvbnN0IHB1YmtleXMgPSB3YWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgod2FsbGV0VW5zcGVudC5jaGFpbiwgd2FsbGV0VW5zcGVudC5pbmRleCkucHVibGljS2V5cztcbiAgICAgICAgcHVia2V5cy5mb3JFYWNoKChwaywgcGtJbmRleCkgPT4ge1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgICAgIHBzYnQudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbmRleCwgcGspLFxuICAgICAgICAgICAgc2lnbmVkQnkuaW5jbHVkZXMod2FsbGV0S2V5cy50cmlwbGVbcGtJbmRleF0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0ZXN0VmFsaWRTaWduYXR1cmVzKFxuICAgICAgdHg6IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24gfCBGdWxseVNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgc2lnbmVkQnk6IEJJUDMySW50ZXJmYWNlW10sXG4gICAgICBzaWduOiAnaGFsZnNpZ25lZCcgfCAnZnVsbHNpZ25lZCdcbiAgICApIHtcbiAgICAgIGlmICh0eEZvcm1hdCA9PT0gJ3BzYnQnKSB7XG4gICAgICAgIHRlc3RQc2J0VmFsaWRTaWduYXR1cmVzKHR4LCBzaWduZWRCeSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc3BlbnRzID0gZ2V0VW5zcGVudHMoKTtcbiAgICAgIGNvbnN0IHByZXZPdXRwdXRzID0gdW5zcGVudHMubWFwKFxuICAgICAgICAodSk6IHV0eG9saWIuVHhPdXRwdXQ8VE51bWJlcj4gPT4gKHtcbiAgICAgICAgICBzY3JpcHQ6IEJ1ZmZlci5mcm9tKHdhc21BZGRyZXNzLnRvT3V0cHV0U2NyaXB0V2l0aENvaW4odS5hZGRyZXNzLCBjb2luLm5hbWUpKSxcbiAgICAgICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXI8VE51bWJlcj4oXG4gICAgICAgIEJ1ZmZlci5mcm9tKHR4LnR4SGV4LCAnaGV4JyksXG4gICAgICAgIGNvaW4ubmV0d29yayxcbiAgICAgICAgeyBhbW91bnRUeXBlIH1cbiAgICAgICk7XG4gICAgICB0cmFuc2FjdGlvbi5pbnMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbnB1dFNjcmlwdHNbaW5kZXhdID09PSAncDJzaFAycGsnKSB7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGNvaW4uaXNCaXRHb1RhaW50ZWRVbnNwZW50KHVuc3BlbnRzW2luZGV4XSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbmRleF0gYXMgV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcbiAgICAgICAgY29uc3QgcHVia2V5cyA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KS5wdWJsaWNLZXlzO1xuXG4gICAgICAgIHB1YmtleXMuZm9yRWFjaCgocGssIHBrSW5kZXgpID0+IHtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgICB1dHhvbGliLmJpdGdvLnZlcmlmeVNpZ25hdHVyZTxUTnVtYmVyPihcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBwcmV2T3V0cHV0c1tpbmRleF0udmFsdWUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwdWJsaWNLZXk6IHBrLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwcmV2T3V0cHV0c1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHNpZ25lZEJ5LmluY2x1ZGVzKHdhbGxldEtleXMudHJpcGxlW3BrSW5kZXhdKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gdGVzdEV4cGxhaW5UeChcbiAgICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgICAgdHhIZXg6IHN0cmluZyxcbiAgICAgIHVuc3BlbnRzOiBVbnNwZW50PFROdW1iZXI+W10sXG4gICAgICBwdWJzOiBUcmlwbGU8c3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICB1bnNwZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAgcHVicyxcbiAgICAgICAgZGVjb2RlV2l0aCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFByb3BlcnRpZXMgPSBbJ2lkJywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0QW1vdW50J107XG5cbiAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICBleHBlY3RlZFByb3BlcnRpZXMucHVzaCgnZGlzcGxheU9yZGVyJywgJ2lucHV0U2lnbmF0dXJlcycsICdzaWduYXR1cmVzJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBleHBlY3RlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgYXNzZXJ0Lm9rKHByb3AgaW4gZXhwbGFuYXRpb24sIGBleHBlY3RlZCBleHBsYW5hdGlvbiB0byBoYXZlIHByb3BlcnR5ICcke3Byb3B9J2ApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHBlY3RlZFNpZ25hdHVyZUNvdW50ID1cbiAgICAgICAgc3RhZ2VOYW1lID09PSAncHJlYnVpbGQnIHx8IHB1YnMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogc3RhZ2VOYW1lLnN0YXJ0c1dpdGgoJ2hhbGZTaWduZWQnKVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogc3RhZ2VOYW1lLnN0YXJ0c1dpdGgoJ2Z1bGxTaWduZWQnKVxuICAgICAgICAgID8gMlxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoJ2lucHV0U2lnbmF0dXJlcycgaW4gZXhwbGFuYXRpb24pIHtcbiAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgICBleHBsYW5hdGlvbi5pbnB1dFNpZ25hdHVyZXMsXG4gICAgICAgICAgLy8gRklYTUUoQkctMzUxNTQpOiBpbXBsZW1lbnQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmb3IgcmVwbGF5IHByb3RlY3Rpb24gaW5wdXRzXG4gICAgICAgICAgaW5wdXRTY3JpcHRzLm1hcCgodHlwZSkgPT4gKHR5cGUgPT09ICdwMnNoUDJwaycgPyAwIDogZXhwZWN0ZWRTaWduYXR1cmVDb3VudCkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoJ3NpZ25hdHVyZXMnIGluIGV4cGxhbmF0aW9uKSB7XG4gICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXhwbGFuYXRpb24uc2lnbmF0dXJlcywgZXhwZWN0ZWRTaWduYXR1cmVDb3VudCk7XG4gICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXhwbGFuYXRpb24uY2hhbmdlQW1vdW50LCAnMCcpOyAvLyBubyBjaGFuZ2UgYWRkcmVzc2VzIGdpdmVuXG4gICAgICB9XG4gICAgICBsZXQgZXhwZWN0ZWRPdXRwdXRBbW91bnQgPVxuICAgICAgICBCaWdJbnQoKHR4Rm9ybWF0ID09PSAncHNidCcgPyBnZXRVbnNwZW50c0ZvclBzYnQoKSA6IGdldFVuc3BlbnRzKCkpLmxlbmd0aCkgKiBCaWdJbnQodmFsdWUpO1xuICAgICAgaW5wdXRTY3JpcHRzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgICAgICAvLyByZXBsYXlQcm90ZWN0aW9uIHVuc3BlbnRzIGhhdmUgdmFsdWUgMTAwMFxuICAgICAgICAgIGV4cGVjdGVkT3V0cHV0QW1vdW50IC09IEJpZ0ludCh2YWx1ZSk7XG4gICAgICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgKz0gQmlnSW50KDEwMDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGV4cGVjdGVkT3V0cHV0QW1vdW50IC09IEJpZ0ludCgxMDAwKTsgLy8gZmVlIG9mIDEwMDBcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LCBleHBlY3RlZE91dHB1dEFtb3VudC50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBpdCgnaGF2ZSB2YWxpZCBzaWduYXR1cmUgZm9yIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhZ2VzLmhhbGZTaWduZWRVc2VyQmFja3VwKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuaGFsZlNpZ25lZFVzZXJCYWNrdXAsIFt3YWxsZXRLZXlzLnVzZXJdLCAnaGFsZnNpZ25lZCcpO1xuICAgICAgfVxuICAgICAgdGVzdFZhbGlkU2lnbmF0dXJlcyh0cmFuc2FjdGlvblN0YWdlcy5oYWxmU2lnbmVkVXNlckJpdEdvLCBbd2FsbGV0S2V5cy51c2VyXSwgJ2hhbGZzaWduZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXZlIHZhbGlkIHNpZ25hdHVyZXMgZm9yIGZ1bGwtc2lnbmVkIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFmdWxsU2lnbikge1xuICAgICAgICByZXR1cm4gdGhpcy5za2lwKCk7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCYWNrdXApIHtcbiAgICAgICAgdGVzdFZhbGlkU2lnbmF0dXJlcyh0cmFuc2FjdGlvblN0YWdlcy5mdWxsU2lnbmVkVXNlckJhY2t1cCwgW3dhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iYWNrdXBdLCAnZnVsbHNpZ25lZCcpO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhZ2VzLmZ1bGxTaWduZWRVc2VyQml0R28pIHtcbiAgICAgICAgdGVzdFZhbGlkU2lnbmF0dXJlcyh0cmFuc2FjdGlvblN0YWdlcy5mdWxsU2lnbmVkVXNlckJpdEdvLCBbd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJpdGdvXSwgJ2Z1bGxzaWduZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdoYXZlIGNvcnJlY3QgcmVzdWx0cyBmb3IgZXhwbGFpblRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBbc3RhZ2VOYW1lLCBzdGFnZVR4XSBvZiBPYmplY3QuZW50cmllcyh0cmFuc2FjdGlvblN0YWdlcykpIHtcbiAgICAgICAgaWYgKCFzdGFnZVR4KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eEhleCA9XG4gICAgICAgICAgc3RhZ2VUeCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgfHwgc3RhZ2VUeCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uXG4gICAgICAgICAgICA/IHN0YWdlVHgudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgIDogc3RhZ2VUeCBpbnN0YW5jZW9mIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidFxuICAgICAgICAgICAgPyBCdWZmZXIuZnJvbShzdGFnZVR4LnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgIDogc3RhZ2VUeC50eEhleDtcblxuICAgICAgICBjb25zdCBwdWJzID0gd2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSkgYXMgVHJpcGxlPHN0cmluZz47XG4gICAgICAgIGNvbnN0IHVuc3BlbnRzID1cbiAgICAgICAgICB0eEZvcm1hdCA9PT0gJ3BzYnQnXG4gICAgICAgICAgICA/IGdldFVuc3BlbnRzRm9yUHNidCgpLm1hcCgodSkgPT4gKHsgLi4udSwgdmFsdWU6IGJpdGdvLnRvVE51bWJlcih1LnZhbHVlLCBhbW91bnRUeXBlKSBhcyBUTnVtYmVyIH0pKVxuICAgICAgICAgICAgOiBnZXRVbnNwZW50cygpO1xuICAgICAgICBhd2FpdCB0ZXN0RXhwbGFpblR4KHN0YWdlTmFtZSwgdHhIZXgsIHVuc3BlbnRzLCBwdWJzKTtcbiAgICAgICAgaWYgKGRlY29kZVdpdGggIT09ICd3YXNtLXV0eG8nKSB7XG4gICAgICAgICAgYXdhaXQgdGVzdEV4cGxhaW5UeChzdGFnZU5hbWUsIHR4SGV4LCB1bnNwZW50cywgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVGVzdEZvckNvaW4oY29pbjogQWJzdHJhY3RVdHhvQ29pbikge1xuICBydW4oY29pbiwgZ2V0U2NyaXB0VHlwZXMoY29pbiwgJ3BzYnQnKSwgJ3BzYnQnLCB7IGRlY29kZVdpdGg6ICd3YXNtLXV0eG8nIH0pO1xufVxuXG5kZXNjcmliZSgnVHJhbnNhY3Rpb24gU3VpdGUnLCBmdW5jdGlvbiAoKSB7XG4gIGdldE1pblV0eG9Db2lucygpLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICBkZXNjcmliZShgJHtjb2luLmdldENoYWluKCl9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgcnVuVGVzdEZvckNvaW4oY29pbik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQkFBZTtBQUNmLCtDQUFpQztBQUVqQywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLDZCQUE4QjtBQUM5Qiw4Q0FBa0U7QUFDbEUsZ0RBQW9GO0FBQ3BGLDhDQU15QjtBQUV6QixtQ0FBMEY7QUFHMUYsaUNBZWdCO0FBRWhCLFNBQVMsR0FBRyxDQUNWLElBQXNCLEVBQ3RCLFlBQXdDLEVBQ3hDLFFBQTJCO0lBRTNCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFlBQVksUUFBUSxFQUFFLEVBQUUsY0FBYyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzNGLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtRQUM3QixNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRTdELE1BQU0sNkJBQTZCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLHFCQUFxQixDQUFDLENBQUM7UUFDNUYsTUFBTSxpQ0FBaUMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDLENBQUM7UUFDckYsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFB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QUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFtQixDQUFDO2dCQUNyRixNQUFNLFFBQVEsR0FDWixRQUFRLEtBQUssTUFBTTtvQkFDakIsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLGdCQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFZLEVBQUUsQ0FBQyxDQUFDO29CQUNyRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQXNCO0lBQzVDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBQSxxQkFBYyxFQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLElBQUEsc0JBQWUsR0FBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2pDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQzdCLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBiaXRnbywgdGVzdHV0aWwgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcywgZml4ZWRTY3JpcHRXYWxsZXQsIEJJUDMyIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQge1xuICBjb21tb24sXG4gIEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24sXG4gIEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24sXG4gIFRyaXBsZSxcbiAgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgQWJzdHJhY3RVdHhvQ29pbiwgZ2VuZXJhdGVBZGRyZXNzLCBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgdHlwZSB7IFVuc3BlbnQsIFdhbGxldFVuc3BlbnQgfSBmcm9tICcuLi8uLi9zcmMvdW5zcGVudCc7XG5cbmltcG9ydCB7XG4gIGFzc2VydEVxdWFsSlNPTixcbiAgZ2V0Rml4dHVyZSxcbiAgZ2V0VXR4b1dhbGxldCxcbiAgbW9ja1Vuc3BlbnQsXG4gIElucHV0U2NyaXB0VHlwZSxcbiAgVHJhbnNhY3Rpb25PYmosXG4gIHRyYW5zYWN0aW9uVG9PYmosXG4gIHRyYW5zYWN0aW9uSGV4VG9PYmosXG4gIGNyZWF0ZVByZWJ1aWxkVHJhbnNhY3Rpb24sXG4gIGdldERlZmF1bHRXYWxsZXRLZXlzLFxuICBnZXRXYWxsZXRLZXlzLFxuICBkZWZhdWx0Qml0R28sXG4gIGdldE1pblV0eG9Db2lucyxcbiAgZ2V0U2NyaXB0VHlwZXMsXG59IGZyb20gJy4vdXRpbCc7XG5cbmZ1bmN0aW9uIHJ1bjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgaW5wdXRTY3JpcHRzOiB0ZXN0dXRpbC5JbnB1dFNjcmlwdFR5cGVbXSxcbiAgdHhGb3JtYXQ6ICdsZWdhY3knIHwgJ3BzYnQnXG4pIHtcbiAgY29uc3QgYW1vdW50VHlwZSA9IGNvaW4uYW1vdW50VHlwZTtcbiAgY29uc3QgdGl0bGUgPSBbaW5wdXRTY3JpcHRzLmpvaW4oJywnKSwgYHR4Rm9ybWF0PSR7dHhGb3JtYXR9YCwgYGFtb3VudFR5cGU9JHthbW91bnRUeXBlfWBdO1xuICBkZXNjcmliZShgJHt0aXRsZS5qb2luKCcgJyl9YCwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tkZWZhdWx0Qml0R28uZ2V0RW52KCldLnVyaTtcblxuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyk7XG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhSZXBsYXlQcm90ZWN0aW9uID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICdwMnNoUDJwaycpO1xuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25XaXRoUDJ0ciA9IGlucHV0U2NyaXB0cy5zb21lKChzKSA9PiBzID09PSAncDJ0cicpO1xuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25XaXRoUDJ0ck11c2lnMiA9IGlucHV0U2NyaXB0cy5zb21lKChzKSA9PiBzID09PSAncDJ0ck11c2lnMicpO1xuXG4gICAgY29uc3QgdmFsdWUgPSAoYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcgPyBCaWdJbnQoJzEwOTk5OTk5ODAwMDAwMDAxJykgOiAxZTgpIGFzIFROdW1iZXI7XG4gICAgY29uc3Qgd2FsbGV0ID0gZ2V0VXR4b1dhbGxldChjb2luLCB7IGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnLCBjb2luOiBjb2luLmdldENoYWluKCkgfSk7XG4gICAgY29uc3Qgd2FsbGV0S2V5cyA9IGdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG5cbiAgICBjb25zdCBmdWxsU2lnbiA9ICEoaXNUcmFuc2FjdGlvbldpdGhSZXBsYXlQcm90ZWN0aW9uIHx8IGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kKTtcblxuICAgIGZ1bmN0aW9uIGdldFVuc3BlbnRzRm9yUHNidCgpOiBVbnNwZW50PGJpZ2ludD5bXSB7XG4gICAgICByZXR1cm4gaW5wdXRTY3JpcHRzLm1hcCgodCwgaW5kZXgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRlc3R1dGlsLnRvVW5zcGVudChcbiAgICAgICAgICB7IHNjcmlwdFR5cGU6IHQsIHZhbHVlOiB0ID09PSAncDJzaFAycGsnID8gQmlnSW50KDEwMDApIDogQmlnSW50KHZhbHVlKSB9LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGNvaW4ubmV0d29yayxcbiAgICAgICAgICB3YWxsZXRLZXlzXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b1R4bklucHV0U2NyaXB0VHlwZSh0eXBlOiB0ZXN0dXRpbC5JbnB1dFNjcmlwdFR5cGUpOiBJbnB1dFNjcmlwdFR5cGUge1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICdwMnNoUDJwaycgPyAncmVwbGF5UHJvdGVjdGlvbicgOiB0eXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiB0eXBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFVuc3BlbnRzKCk6IFVuc3BlbnQ8VE51bWJlcj5bXSB7XG4gICAgICByZXR1cm4gaW5wdXRTY3JpcHRzLm1hcCgodHlwZSwgaSkgPT5cbiAgICAgICAgbW9ja1Vuc3BlbnQ8VE51bWJlcj4oY29pbi5uZXR3b3JrLCB3YWxsZXRLZXlzLCB0b1R4bklucHV0U2NyaXB0VHlwZSh0eXBlKSwgaSwgdmFsdWUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE91dHB1dEFkZHJlc3Mocm9vdFdhbGxldEtleXM6IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGdlbmVyYXRlQWRkcmVzcyhjb2luLm5hbWUsIHtcbiAgICAgICAga2V5Y2hhaW5zOiByb290V2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiAoeyBwdWI6IGsubmV1dGVyZWQoKS50b0Jhc2U1OCgpIH0pKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNpZ25QYXJhbXMoXG4gICAgICBwcmVidWlsZEhleDogc3RyaW5nLFxuICAgICAgc2lnbmVyOiBCSVAzMkludGVyZmFjZSxcbiAgICAgIGNvc2lnbmVyOiBCSVAzMkludGVyZmFjZVxuICAgICk6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICAgICAgY29uc3QgdHhJbmZvID0ge1xuICAgICAgICB1bnNwZW50czogdHhGb3JtYXQgPT09ICdwc2J0JyA/IHVuZGVmaW5lZCA6IGdldFVuc3BlbnRzKCksXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHdhbGxldElkOiBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCA/IHdhbGxldC5pZCgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR4SGV4OiBwcmVidWlsZEhleCxcbiAgICAgICAgICB0eEluZm8sXG4gICAgICAgIH0sXG4gICAgICAgIHBydjogc2lnbmVyLnRvQmFzZTU4KCksXG4gICAgICAgIHB1YnM6IHdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpLFxuICAgICAgICBjb3NpZ25lclB1YjogY29zaWduZXIubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgICBleHRyYWN0VHJhbnNhY3Rpb246IGZhbHNlLFxuICAgICAgfSBhcyBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUhhbGZTaWduZWRUcmFuc2FjdGlvbihcbiAgICAgIHByZWJ1aWxkOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gICAgICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgY29zaWduZXI6IEJJUDMySW50ZXJmYWNlXG4gICAgKTogUHJvbWlzZTxIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPiB7XG4gICAgICBsZXQgc2NvcGU6IG5vY2suU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQpIHtcbiAgICAgICAgc2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3R4L3NpZ25wc2J0YCwgKGJvZHkpID0+IGJvZHkucHNidClcbiAgICAgICAgICAucmVwbHkoMjAwLCAoX3VyaTogc3RyaW5nLCByZXF1ZXN0Qm9keTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV0d29ya05hbWUgPSB1dHhvbGliLmdldE5ldHdvcmtOYW1lKGNvaW4ubmV0d29yaykgYXMgZml4ZWRTY3JpcHRXYWxsZXQuTmV0d29ya05hbWU7XG4gICAgICAgICAgICBjb25zdCByZXFCeXRlcyA9IEJ1ZmZlci5mcm9tKChyZXF1ZXN0Qm9keSBhcyB7IHBzYnQ6IHN0cmluZyB9KS5wc2J0LCAnaGV4Jyk7XG4gICAgICAgICAgICBjb25zdCByZXFQc2J0ID0gZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0LmZyb21CeXRlcyhyZXFCeXRlcywgbmV0d29ya05hbWUpO1xuICAgICAgICAgICAgY29uc3QgY29zaWduZXJXYXNtID0gQklQMzIuZnJvbUJhc2U1OChjb3NpZ25lci50b0Jhc2U1OCgpKTtcbiAgICAgICAgICAgIHJlcVBzYnQuZ2VuZXJhdGVNdXNpZzJOb25jZXMoY29zaWduZXJXYXNtKTtcbiAgICAgICAgICAgIHJldHVybiB7IHBzYnQ6IEJ1ZmZlci5mcm9tKHJlcVBzYnQuc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdoZXgnKSB9O1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBoYWxmLXNpZ24gd2l0aCB0aGUgdXNlciBrZXlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB3YWxsZXQuc2lnblRyYW5zYWN0aW9uKFxuICAgICAgICBnZXRTaWduUGFyYW1zKHByZWJ1aWxkLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLCBzaWduZXIsIGNvc2lnbmVyKVxuICAgICAgKSkgYXMgUHJvbWlzZTxIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPjtcblxuICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY29wZS5pc0RvbmUoKSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRnVsbFNpZ25lZFRyYW5zYWN0aW9uKFxuICAgICAgaGFsZlNpZ25lZDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgICAgIHNpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBjb3NpZ25lcjogQklQMzJJbnRlcmZhY2VcbiAgICApOiBQcm9taXNlPEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICAgIHJldHVybiAoYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIC4uLmdldFNpZ25QYXJhbXMoaGFsZlNpZ25lZC50eEhleCwgc2lnbmVyLCBjb3NpZ25lciksXG4gICAgICAgIGlzTGFzdFNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgIH0pKSBhcyBGdWxseVNpZ25lZFRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIHR5cGUgVHJhbnNhY3Rpb25TdGFnZXMgPSB7XG4gICAgICBwcmVidWlsZDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4gfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuICAgICAgaGFsZlNpZ25lZFVzZXJCYWNrdXA/OiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uO1xuICAgICAgaGFsZlNpZ25lZFVzZXJCaXRHbzogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbjtcbiAgICAgIGZ1bGxTaWduZWRVc2VyQmFja3VwPzogRnVsbHlTaWduZWRUcmFuc2FjdGlvbjtcbiAgICAgIGZ1bGxTaWduZWRVc2VyQml0R28/OiBGdWxseVNpZ25lZFRyYW5zYWN0aW9uO1xuICAgIH07XG5cbiAgICB0eXBlIFRyYW5zYWN0aW9uT2JqU3RhZ2VzID0gUmVjb3JkPGtleW9mIFRyYW5zYWN0aW9uU3RhZ2VzLCBUcmFuc2FjdGlvbk9iaj47XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVQcmVidWlsZFBzYnQoKSB7XG4gICAgICBjb25zdCBpbnB1dHMgPSBpbnB1dFNjcmlwdHMubWFwKFxuICAgICAgICAodCk6IHRlc3R1dGlsLklucHV0ID0+ICh7XG4gICAgICAgICAgc2NyaXB0VHlwZTogdCxcbiAgICAgICAgICB2YWx1ZTogdCA9PT0gJ3Ayc2hQMnBrJyA/IEJpZ0ludCgxMDAwKSA6IEJpZ0ludCh2YWx1ZSksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgY29uc3QgdW5zcGVudFN1bSA9IGlucHV0cy5yZWR1Y2UoKHByZXY6IGJpZ2ludCwgY3VycikgPT4gcHJldiArIGN1cnIudmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgICBjb25zdCBvdXRwdXRzOiB0ZXN0dXRpbC5PdXRwdXRbXSA9IFtcbiAgICAgICAgeyBhZGRyZXNzOiBnZXRPdXRwdXRBZGRyZXNzKGdldFdhbGxldEtleXMoJ3Rlc3QnKSksIHZhbHVlOiB1bnNwZW50U3VtIC0gQmlnSW50KDEwMDApIH0sXG4gICAgICBdO1xuICAgICAgY29uc3QgcHNidCA9IHRlc3R1dGlsLmNvbnN0cnVjdFBzYnQoaW5wdXRzLCBvdXRwdXRzLCBjb2luLm5ldHdvcmssIHdhbGxldEtleXMsICd1bnNpZ25lZCcsIHtcbiAgICAgICAgcDJzaFAycGtLZXk6IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzKGNvaW4ubmFtZSlbMF0sXG4gICAgICB9KTtcbiAgICAgIHV0eG9saWIuYml0Z28uYWRkWHB1YnNUb1BzYnQocHNidCwgd2FsbGV0S2V5cyk7XG4gICAgICByZXR1cm4gcHNidDtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvblN0YWdlcygpOiBQcm9taXNlPFRyYW5zYWN0aW9uU3RhZ2VzPiB7XG4gICAgICBjb25zdCBwcmVidWlsZCA9XG4gICAgICAgIHR4Rm9ybWF0ID09PSAncHNidCdcbiAgICAgICAgICA/IGNyZWF0ZVByZWJ1aWxkUHNidCgpXG4gICAgICAgICAgOiBjcmVhdGVQcmVidWlsZFRyYW5zYWN0aW9uPFROdW1iZXI+KGNvaW4ubmV0d29yaywgZ2V0VW5zcGVudHMoKSwgZ2V0T3V0cHV0QWRkcmVzcyh3YWxsZXRLZXlzKSk7XG5cbiAgICAgIGNvbnN0IGhhbGZTaWduZWRVc2VyQml0R28gPSBhd2FpdCBjcmVhdGVIYWxmU2lnbmVkVHJhbnNhY3Rpb24ocHJlYnVpbGQsIHdhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iaXRnbyk7XG4gICAgICBjb25zdCBmdWxsU2lnbmVkVXNlckJpdEdvID1cbiAgICAgICAgZnVsbFNpZ24gJiYgIWlzVHJhbnNhY3Rpb25XaXRoUDJ0ck11c2lnMlxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlRnVsbFNpZ25lZFRyYW5zYWN0aW9uKGhhbGZTaWduZWRVc2VyQml0R28sIHdhbGxldEtleXMuYml0Z28sIHdhbGxldEtleXMudXNlcilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFVzZXJCYWNrdXAgPVxuICAgICAgICAhaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQgJiYgISh0eEZvcm1hdCA9PT0gJ3BzYnQnICYmIGlzVHJhbnNhY3Rpb25XaXRoUDJ0cilcbiAgICAgICAgICA/IGF3YWl0IGNyZWF0ZUhhbGZTaWduZWRUcmFuc2FjdGlvbihwcmVidWlsZCwgd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJhY2t1cClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGZ1bGxTaWduZWRVc2VyQmFja3VwID1cbiAgICAgICAgZnVsbFNpZ24gJiYgaGFsZlNpZ25lZFVzZXJCYWNrdXBcbiAgICAgICAgICA/IGF3YWl0IGNyZWF0ZUZ1bGxTaWduZWRUcmFuc2FjdGlvbihoYWxmU2lnbmVkVXNlckJhY2t1cCwgd2FsbGV0S2V5cy5iYWNrdXAsIHdhbGxldEtleXMudXNlcilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJlYnVpbGQsXG4gICAgICAgIGhhbGZTaWduZWRVc2VyQmFja3VwLFxuICAgICAgICBoYWxmU2lnbmVkVXNlckJpdEdvLFxuICAgICAgICBmdWxsU2lnbmVkVXNlckJhY2t1cCxcbiAgICAgICAgZnVsbFNpZ25lZFVzZXJCaXRHbyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHRyYW5zYWN0aW9uU3RhZ2VzOiBUcmFuc2FjdGlvblN0YWdlcztcblxuICAgIGJlZm9yZSgncHJlcGFyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyYW5zYWN0aW9uU3RhZ2VzID0gYXdhaXQgZ2V0VHJhbnNhY3Rpb25TdGFnZXMoKTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChub2NrLmNsZWFuQWxsKTtcblxuICAgIGl0KCdtYXRjaCBmaXh0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBNb2NoYS5Db250ZXh0KSB7XG4gICAgICBpZiAodHhGb3JtYXQgPT09ICdwc2J0Jykge1xuICAgICAgICAvLyBUT0RPIChtYXliZSkgLSBvbmNlIGZ1bGwgUFNCVCBzdXBwb3J0IGlzIGFkZGVkIHRvIGFic3RyYWN0LXV0eG8gbW9kdWxlLCBjdXN0b20gSlNPTiByZXByZXNlbnRhdGlvbiBvZiBQU0JUIGNhbiBiZSBjcmVhdGVkIGFuZCB0ZXN0ZWQgaGVyZS5cbiAgICAgICAgLy8gc2lnbmF0dXJlcyBvZiB0YXByb290S2V5UGF0aFNwZW5kcyBhcmUgcmFuZG9tIHNpbmNlIHJhbmRvbSBuYXR1cmUgb2YgTXVTaWcyIG5vbmNlLCBzbyBwc2J0IGhleCBjb21wYXJpc29uIGFsc28gd29udCB3b3JrLlxuXG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdG9UcmFuc2FjdGlvblN0YWdlc09iaihzdGFnZXM6IFRyYW5zYWN0aW9uU3RhZ2VzKTogVHJhbnNhY3Rpb25PYmpTdGFnZXMge1xuICAgICAgICByZXR1cm4gXy5tYXBWYWx1ZXMoc3RhZ2VzLCAodikgPT5cbiAgICAgICAgICB2ID09PSB1bmRlZmluZWQgfHwgdiBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgfHwgdiBpbnN0YW5jZW9mIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogdiBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uXG4gICAgICAgICAgICA/IHRyYW5zYWN0aW9uVG9PYmo8VE51bWJlcj4odilcbiAgICAgICAgICAgIDogdHJhbnNhY3Rpb25IZXhUb09iaih2LnR4SGV4LCBjb2luLm5ldHdvcmssIGFtb3VudFR5cGUpXG4gICAgICAgICkgYXMgVHJhbnNhY3Rpb25PYmpTdGFnZXM7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydEVxdWFsSlNPTihcbiAgICAgICAgdG9UcmFuc2FjdGlvblN0YWdlc09iaih0cmFuc2FjdGlvblN0YWdlcyksXG4gICAgICAgIGF3YWl0IGdldEZpeHR1cmUoXG4gICAgICAgICAgY29pbixcbiAgICAgICAgICBgdHJhbnNhY3Rpb25zLSR7aW5wdXRTY3JpcHRzLm1hcCgodCkgPT4gdG9UeG5JbnB1dFNjcmlwdFR5cGUodCkpLmpvaW4oJy0nKX1gLFxuICAgICAgICAgIHRvVHJhbnNhY3Rpb25TdGFnZXNPYmoodHJhbnNhY3Rpb25TdGFnZXMpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHNidFZhbGlkU2lnbmF0dXJlcyh0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiwgc2lnbmVkQnk6IEJJUDMySW50ZXJmYWNlW10pIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4LnR4SGV4LCBjb2luLm5ldHdvcmspO1xuICAgICAgY29uc3QgdW5zcGVudHMgPSBnZXRVbnNwZW50c0ZvclBzYnQoKTtcbiAgICAgIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbmRleF07XG4gICAgICAgIGlmICghdXR4b2xpYi5iaXRnby5pc1dhbGxldFVuc3BlbnQodW5zcGVudCkpIHtcbiAgICAgICAgICBhc3NlcnQub2sodXR4b2xpYi5iaXRnby5nZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KSwgJ3Ayc2hQMnBrJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhbGxldFVuc3BlbnQgPSB1bnNwZW50IGFzIFdhbGxldFVuc3BlbnQ8YmlnaW50PjtcbiAgICAgICAgY29uc3QgcHVia2V5cyA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh3YWxsZXRVbnNwZW50LmNoYWluLCB3YWxsZXRVbnNwZW50LmluZGV4KS5wdWJsaWNLZXlzO1xuICAgICAgICBwdWJrZXlzLmZvckVhY2goKHBrLCBwa0luZGV4KSA9PiB7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICAgICAgcHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGluZGV4LCBwayksXG4gICAgICAgICAgICBzaWduZWRCeS5pbmNsdWRlcyh3YWxsZXRLZXlzLnRyaXBsZVtwa0luZGV4XSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRlc3RWYWxpZFNpZ25hdHVyZXMoXG4gICAgICB0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiB8IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICBzaWduZWRCeTogQklQMzJJbnRlcmZhY2VbXSxcbiAgICAgIHNpZ246ICdoYWxmc2lnbmVkJyB8ICdmdWxsc2lnbmVkJ1xuICAgICkge1xuICAgICAgaWYgKHR4Rm9ybWF0ID09PSAncHNidCcpIHtcbiAgICAgICAgdGVzdFBzYnRWYWxpZFNpZ25hdHVyZXModHgsIHNpZ25lZEJ5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdW5zcGVudHMgPSBnZXRVbnNwZW50cygpO1xuICAgICAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoXG4gICAgICAgICh1KTogdXR4b2xpYi5UeE91dHB1dDxUTnVtYmVyPiA9PiAoe1xuICAgICAgICAgIHNjcmlwdDogQnVmZmVyLmZyb20od2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbih1LmFkZHJlc3MsIGNvaW4ubmFtZSkpLFxuICAgICAgICAgIHZhbHVlOiB1LnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcjxUTnVtYmVyPihcbiAgICAgICAgQnVmZmVyLmZyb20odHgudHhIZXgsICdoZXgnKSxcbiAgICAgICAgY29pbi5uZXR3b3JrLFxuICAgICAgICB7IGFtb3VudFR5cGUgfVxuICAgICAgKTtcbiAgICAgIHRyYW5zYWN0aW9uLmlucy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGlucHV0U2NyaXB0c1tpbmRleF0gPT09ICdwMnNoUDJwaycpIHtcbiAgICAgICAgICBhc3NlcnQub2soY29pbi5pc0JpdEdvVGFpbnRlZFVuc3BlbnQodW5zcGVudHNbaW5kZXhdKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHVuc3BlbnRzW2luZGV4XSBhcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+O1xuICAgICAgICBjb25zdCBwdWJrZXlzID0gd2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KHVuc3BlbnQuY2hhaW4sIHVuc3BlbnQuaW5kZXgpLnB1YmxpY0tleXM7XG5cbiAgICAgICAgcHVia2V5cy5mb3JFYWNoKChwaywgcGtJbmRleCkgPT4ge1xuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgICAgIHV0eG9saWIuYml0Z28udmVyaWZ5U2lnbmF0dXJlPFROdW1iZXI+KFxuICAgICAgICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHByZXZPdXRwdXRzW2luZGV4XS52YWx1ZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHB1YmxpY0tleTogcGssXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByZXZPdXRwdXRzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc2lnbmVkQnkuaW5jbHVkZXMod2FsbGV0S2V5cy50cmlwbGVbcGtJbmRleF0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiB0ZXN0RXhwbGFpblR4KFxuICAgICAgc3RhZ2VOYW1lOiBzdHJpbmcsXG4gICAgICB0eEhleDogc3RyaW5nLFxuICAgICAgdW5zcGVudHM6IFVuc3BlbnQ8VE51bWJlcj5bXSxcbiAgICAgIHB1YnM6IFRyaXBsZTxzdHJpbmc+IHwgdW5kZWZpbmVkXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IGF3YWl0IGNvaW4uZXhwbGFpblRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICAgICAgdHhIZXgsXG4gICAgICAgIHR4SW5mbzoge1xuICAgICAgICAgIHVuc3BlbnRzLFxuICAgICAgICB9LFxuICAgICAgICBwdWJzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkUHJvcGVydGllcyA9IFsnaWQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRBbW91bnQnXTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGV4cGVjdGVkUHJvcGVydGllcykge1xuICAgICAgICBhc3NlcnQub2socHJvcCBpbiBleHBsYW5hdGlvbiwgYGV4cGVjdGVkIGV4cGxhbmF0aW9uIHRvIGhhdmUgcHJvcGVydHkgJyR7cHJvcH0nYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkU2lnbmF0dXJlQ291bnQgPVxuICAgICAgICBzdGFnZU5hbWUgPT09ICdwcmVidWlsZCcgfHwgcHVicyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiBzdGFnZU5hbWUuc3RhcnRzV2l0aCgnaGFsZlNpZ25lZCcpXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiBzdGFnZU5hbWUuc3RhcnRzV2l0aCgnZnVsbFNpZ25lZCcpXG4gICAgICAgICAgPyAyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICgnaW5wdXRTaWduYXR1cmVzJyBpbiBleHBsYW5hdGlvbikge1xuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgIGV4cGxhbmF0aW9uLmlucHV0U2lnbmF0dXJlcyxcbiAgICAgICAgICAvLyBGSVhNRShCRy0zNTE1NCk6IGltcGxlbWVudCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZvciByZXBsYXkgcHJvdGVjdGlvbiBpbnB1dHNcbiAgICAgICAgICBpbnB1dFNjcmlwdHMubWFwKCh0eXBlKSA9PiAodHlwZSA9PT0gJ3Ayc2hQMnBrJyA/IDAgOiBleHBlY3RlZFNpZ25hdHVyZUNvdW50KSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICgnc2lnbmF0dXJlcycgaW4gZXhwbGFuYXRpb24pIHtcbiAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChleHBsYW5hdGlvbi5zaWduYXR1cmVzLCBleHBlY3RlZFNpZ25hdHVyZUNvdW50KTtcbiAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChleHBsYW5hdGlvbi5jaGFuZ2VBbW91bnQsICcwJyk7IC8vIG5vIGNoYW5nZSBhZGRyZXNzZXMgZ2l2ZW5cbiAgICAgIH1cbiAgICAgIGxldCBleHBlY3RlZE91dHB1dEFtb3VudCA9XG4gICAgICAgIEJpZ0ludCgodHhGb3JtYXQgPT09ICdwc2J0JyA/IGdldFVuc3BlbnRzRm9yUHNidCgpIDogZ2V0VW5zcGVudHMoKSkubGVuZ3RoKSAqIEJpZ0ludCh2YWx1ZSk7XG4gICAgICBpbnB1dFNjcmlwdHMuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICAgIC8vIHJlcGxheVByb3RlY3Rpb24gdW5zcGVudHMgaGF2ZSB2YWx1ZSAxMDAwXG4gICAgICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICBleHBlY3RlZE91dHB1dEFtb3VudCArPSBCaWdJbnQoMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KDEwMDApOyAvLyBmZWUgb2YgMTAwMFxuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQsIGV4cGVjdGVkT3V0cHV0QW1vdW50LnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGl0KCdoYXZlIHZhbGlkIHNpZ25hdHVyZSBmb3IgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodHJhbnNhY3Rpb25TdGFnZXMuaGFsZlNpZ25lZFVzZXJCYWNrdXApIHtcbiAgICAgICAgdGVzdFZhbGlkU2lnbmF0dXJlcyh0cmFuc2FjdGlvblN0YWdlcy5oYWxmU2lnbmVkVXNlckJhY2t1cCwgW3dhbGxldEtleXMudXNlcl0sICdoYWxmc2lnbmVkJyk7XG4gICAgICB9XG4gICAgICB0ZXN0VmFsaWRTaWduYXR1cmVzKHRyYW5zYWN0aW9uU3RhZ2VzLmhhbGZTaWduZWRVc2VyQml0R28sIFt3YWxsZXRLZXlzLnVzZXJdLCAnaGFsZnNpZ25lZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhdmUgdmFsaWQgc2lnbmF0dXJlcyBmb3IgZnVsbC1zaWduZWQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWZ1bGxTaWduKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5mdWxsU2lnbmVkVXNlckJhY2t1cCkge1xuICAgICAgICB0ZXN0VmFsaWRTaWduYXR1cmVzKHRyYW5zYWN0aW9uU3RhZ2VzLmZ1bGxTaWduZWRVc2VyQmFja3VwLCBbd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJhY2t1cF0sICdmdWxsc2lnbmVkJyk7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCaXRHbykge1xuICAgICAgICB0ZXN0VmFsaWRTaWduYXR1cmVzKHRyYW5zYWN0aW9uU3RhZ2VzLmZ1bGxTaWduZWRVc2VyQml0R28sIFt3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYml0Z29dLCAnZnVsbHNpZ25lZCcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ2hhdmUgY29ycmVjdCByZXN1bHRzIGZvciBleHBsYWluVHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtzdGFnZU5hbWUsIHN0YWdlVHhdIG9mIE9iamVjdC5lbnRyaWVzKHRyYW5zYWN0aW9uU3RhZ2VzKSkge1xuICAgICAgICBpZiAoIXN0YWdlVHgpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHR4SGV4ID1cbiAgICAgICAgICBzdGFnZVR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8fCBzdGFnZVR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb25cbiAgICAgICAgICAgID8gc3RhZ2VUeC50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAgICAgOiBzdGFnZVR4IGluc3RhbmNlb2YgZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0XG4gICAgICAgICAgICA/IEJ1ZmZlci5mcm9tKHN0YWdlVHguc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAgICAgOiBzdGFnZVR4LnR4SGV4O1xuXG4gICAgICAgIGNvbnN0IHB1YnMgPSB3YWxsZXRLZXlzLnRyaXBsZS5tYXAoKGspID0+IGsubmV1dGVyZWQoKS50b0Jhc2U1OCgpKSBhcyBUcmlwbGU8c3RyaW5nPjtcbiAgICAgICAgY29uc3QgdW5zcGVudHMgPVxuICAgICAgICAgIHR4Rm9ybWF0ID09PSAncHNidCdcbiAgICAgICAgICAgID8gZ2V0VW5zcGVudHNGb3JQc2J0KCkubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogYml0Z28udG9UTnVtYmVyKHUudmFsdWUsIGFtb3VudFR5cGUpIGFzIFROdW1iZXIgfSkpXG4gICAgICAgICAgICA6IGdldFVuc3BlbnRzKCk7XG4gICAgICAgIGF3YWl0IHRlc3RFeHBsYWluVHgoc3RhZ2VOYW1lLCB0eEhleCwgdW5zcGVudHMsIHB1YnMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVGVzdEZvckNvaW4oY29pbjogQWJzdHJhY3RVdHhvQ29pbikge1xuICBydW4oY29pbiwgZ2V0U2NyaXB0VHlwZXMoY29pbiwgJ3BzYnQnKSwgJ3BzYnQnKTtcbn1cblxuZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFN1aXRlJywgZnVuY3Rpb24gKCkge1xuICBnZXRNaW5VdHhvQ29pbnMoKS5mb3JFYWNoKChjb2luKSA9PiB7XG4gICAgZGVzY3JpYmUoYCR7Y29pbi5nZXRDaGFpbigpfWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJ1blRlc3RGb3JDb2luKGNvaW4pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=webauthn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../../../../test/unit/webauthn.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const assert = __importStar(require("assert"));
37
+ const sdk_test_1 = require("@bitgo/sdk-test");
38
+ const util_1 = require("./util");
39
+ const regularPassphrase = 'passphrase-a';
40
+ const webauthnPassphrase = 'passphrase-b';
41
+ describe('webauthn passphrase decryption', function () {
42
+ const [coin] = (0, util_1.getMinUtxoCoins)();
43
+ const wallet = (0, util_1.getUtxoWallet)(coin);
44
+ // keychain encrypted with regularPassphrase; webauthn device encrypted with webauthnPassphrase
45
+ const keychain = {
46
+ id: (0, sdk_test_1.getSeed)(util_1.keychainsBase58[0].pub).toString('hex'),
47
+ pub: util_1.keychainsBase58[0].pub,
48
+ type: 'independent',
49
+ encryptedPrv: (0, util_1.encryptKeychain)(regularPassphrase, util_1.keychainsBase58[0]),
50
+ webauthnDevices: [
51
+ {
52
+ otpDeviceId: '123',
53
+ authenticatorInfo: { credID: 'credID', fmt: 'packed', publicKey: 'some value' },
54
+ prfSalt: '456',
55
+ encryptedPrv: (0, util_1.encryptKeychain)(webauthnPassphrase, util_1.keychainsBase58[0]),
56
+ },
57
+ ],
58
+ };
59
+ it('should decrypt with the regular passphrase', function () {
60
+ const prv = wallet.getUserPrv({ keychain, walletPassphrase: regularPassphrase });
61
+ assert.strictEqual(prv, util_1.keychainsBase58[0].prv);
62
+ });
63
+ it('should fall back to webauthn device when the regular passphrase fails', function () {
64
+ const prv = wallet.getUserPrv({ keychain, walletPassphrase: webauthnPassphrase });
65
+ assert.strictEqual(prv, util_1.keychainsBase58[0].prv);
66
+ });
67
+ it('should throw when all passphrases are wrong', function () {
68
+ assert.throws(() => wallet.getUserPrv({ keychain, walletPassphrase: 'wrong' }), {
69
+ message: 'failed to decrypt user keychain',
70
+ });
71
+ });
72
+ });
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXV0aG4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvd2ViYXV0aG4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFHakMsOENBQTBDO0FBRTFDLGlDQUEwRjtBQUUxRixNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztBQUN6QyxNQUFNLGtCQUFrQixHQUFHLGNBQWMsQ0FBQztBQUUxQyxRQUFRLENBQUMsZ0NBQWdDLEVBQUU7SUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsc0JBQWUsR0FBRSxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUEsb0JBQWEsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUVuQywrRkFBK0Y7SUFDL0YsTUFBTSxRQUFRLEdBQWE7UUFDekIsRUFBRSxFQUFFLElBQUEsa0JBQU8sRUFBQyxzQkFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDbkQsR0FBRyxFQUFFLHNCQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztRQUMzQixJQUFJLEVBQUUsYUFBYTtRQUNuQixZQUFZLEVBQUUsSUFBQSxzQkFBZSxFQUFDLGlCQUFpQixFQUFFLHNCQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsZUFBZSxFQUFFO1lBQ2Y7Z0JBQ0UsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUU7Z0JBQy9FLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFlBQVksRUFBRSxJQUFBLHNCQUFlLEVBQUMsa0JBQWtCLEVBQUUsc0JBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0RTtTQUNGO0tBQ0YsQ0FBQztJQUVGLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRTtRQUMvQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUNqRixNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxzQkFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVFQUF1RSxFQUFFO1FBQzFFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLHNCQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUU7UUFDaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7WUFDOUUsT0FBTyxFQUFFLGlDQUFpQztTQUMzQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IEtleWNoYWluIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGdldFNlZWQgfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuXG5pbXBvcnQgeyBnZXRNaW5VdHhvQ29pbnMsIGdldFV0eG9XYWxsZXQsIGVuY3J5cHRLZXljaGFpbiwga2V5Y2hhaW5zQmFzZTU4IH0gZnJvbSAnLi91dGlsJztcblxuY29uc3QgcmVndWxhclBhc3NwaHJhc2UgPSAncGFzc3BocmFzZS1hJztcbmNvbnN0IHdlYmF1dGhuUGFzc3BocmFzZSA9ICdwYXNzcGhyYXNlLWInO1xuXG5kZXNjcmliZSgnd2ViYXV0aG4gcGFzc3BocmFzZSBkZWNyeXB0aW9uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBbY29pbl0gPSBnZXRNaW5VdHhvQ29pbnMoKTtcbiAgY29uc3Qgd2FsbGV0ID0gZ2V0VXR4b1dhbGxldChjb2luKTtcblxuICAvLyBrZXljaGFpbiBlbmNyeXB0ZWQgd2l0aCByZWd1bGFyUGFzc3BocmFzZTsgd2ViYXV0aG4gZGV2aWNlIGVuY3J5cHRlZCB3aXRoIHdlYmF1dGhuUGFzc3BocmFzZVxuICBjb25zdCBrZXljaGFpbjogS2V5Y2hhaW4gPSB7XG4gICAgaWQ6IGdldFNlZWQoa2V5Y2hhaW5zQmFzZTU4WzBdLnB1YikudG9TdHJpbmcoJ2hleCcpLFxuICAgIHB1Yjoga2V5Y2hhaW5zQmFzZTU4WzBdLnB1YixcbiAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgIGVuY3J5cHRlZFBydjogZW5jcnlwdEtleWNoYWluKHJlZ3VsYXJQYXNzcGhyYXNlLCBrZXljaGFpbnNCYXNlNThbMF0pLFxuICAgIHdlYmF1dGhuRGV2aWNlczogW1xuICAgICAge1xuICAgICAgICBvdHBEZXZpY2VJZDogJzEyMycsXG4gICAgICAgIGF1dGhlbnRpY2F0b3JJbmZvOiB7IGNyZWRJRDogJ2NyZWRJRCcsIGZtdDogJ3BhY2tlZCcsIHB1YmxpY0tleTogJ3NvbWUgdmFsdWUnIH0sXG4gICAgICAgIHByZlNhbHQ6ICc0NTYnLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGVuY3J5cHRLZXljaGFpbih3ZWJhdXRoblBhc3NwaHJhc2UsIGtleWNoYWluc0Jhc2U1OFswXSksXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG5cbiAgaXQoJ3Nob3VsZCBkZWNyeXB0IHdpdGggdGhlIHJlZ3VsYXIgcGFzc3BocmFzZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwcnYgPSB3YWxsZXQuZ2V0VXNlclBydih7IGtleWNoYWluLCB3YWxsZXRQYXNzcGhyYXNlOiByZWd1bGFyUGFzc3BocmFzZSB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwocHJ2LCBrZXljaGFpbnNCYXNlNThbMF0ucHJ2KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWxsIGJhY2sgdG8gd2ViYXV0aG4gZGV2aWNlIHdoZW4gdGhlIHJlZ3VsYXIgcGFzc3BocmFzZSBmYWlscycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwcnYgPSB3YWxsZXQuZ2V0VXNlclBydih7IGtleWNoYWluLCB3YWxsZXRQYXNzcGhyYXNlOiB3ZWJhdXRoblBhc3NwaHJhc2UgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBydiwga2V5Y2hhaW5zQmFzZTU4WzBdLnBydik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhbGwgcGFzc3BocmFzZXMgYXJlIHdyb25nJywgZnVuY3Rpb24gKCkge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gd2FsbGV0LmdldFVzZXJQcnYoeyBrZXljaGFpbiwgd2FsbGV0UGFzc3BocmFzZTogJ3dyb25nJyB9KSwge1xuICAgICAgbWVzc2FnZTogJ2ZhaWxlZCB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nLFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19