@bitgo/abstract-utxo 10.11.0 → 10.12.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.
@@ -3,8 +3,8 @@ import { bip32 } from '@bitgo/secp256k1';
3
3
  import { Dimensions } from '@bitgo/unspents';
4
4
  import { Wallet } from '@bitgo/sdk-core';
5
5
  import { decrypt } from '@bitgo/sdk-api';
6
- import { signAndVerifyWalletTransaction } from '../transaction/fixedScript/signLegacyTransaction';
7
- const { unspentSum, scriptTypeForChain, outputScripts } = utxolib.bitgo;
6
+ import { signAndVerifyPsbt } from '../transaction/fixedScript/signPsbt';
7
+ const { unspentSum } = utxolib.bitgo;
8
8
  export async function getWallet(bitgo, coin, walletId) {
9
9
  try {
10
10
  return await coin.wallets().get({ id: walletId });
@@ -234,90 +234,31 @@ async function getPrv(xprv, passphrase, wallet) {
234
234
  return getPrv(decrypt(passphrase, encryptedPrv));
235
235
  }
236
236
  /**
237
+ * Create a sweep transaction for cross-chain recovery using PSBT
237
238
  * @param network
239
+ * @param walletKeys
238
240
  * @param unspents
239
241
  * @param targetAddress
240
242
  * @param feeRateSatVB
241
- * @param signer - if set, sign transaction
242
- * @param amountType
243
- * @return transaction spending full input amount to targetAddress
243
+ * @return unsigned PSBT
244
244
  */
245
- function createSweepTransaction(network, unspents, targetAddress, feeRateSatVB, signer, amountType = 'number') {
246
- const inputValue = unspentSum(unspents, amountType);
245
+ function createSweepTransaction(network, walletKeys, unspents, targetAddress, feeRateSatVB) {
246
+ const inputValue = unspentSum(unspents.map((u) => ({ ...u, value: BigInt(u.value) })), 'bigint');
247
247
  const vsize = Dimensions.fromUnspents(unspents, {
248
248
  p2tr: { scriptPathLevel: 1 },
249
249
  p2trMusig2: { scriptPathLevel: undefined },
250
250
  })
251
251
  .plus(Dimensions.fromOutput({ script: utxolib.address.toOutputScript(targetAddress, network) }))
252
252
  .getVSize();
253
- const fee = vsize * feeRateSatVB;
254
- const transactionBuilder = utxolib.bitgo.createTransactionBuilderForNetwork(network);
255
- transactionBuilder.addOutput(targetAddress, utxolib.bitgo.toTNumber(BigInt(inputValue) - BigInt(fee), amountType));
253
+ const fee = BigInt(Math.round(vsize * feeRateSatVB));
254
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
255
+ utxolib.bitgo.addXpubsToPsbt(psbt, walletKeys);
256
256
  unspents.forEach((unspent) => {
257
- utxolib.bitgo.addToTransactionBuilder(transactionBuilder, unspent);
258
- });
259
- let transaction = transactionBuilder.buildIncomplete();
260
- if (signer) {
261
- transaction = signAndVerifyWalletTransaction(transactionBuilder, unspents, signer, {
262
- isLastSignature: false,
263
- });
264
- }
265
- return transaction;
266
- }
267
- function getTxInfo(transaction, unspents, walletId, walletKeys, amountType = 'number') {
268
- const inputAmount = utxolib.bitgo.unspentSum(unspents, amountType);
269
- const outputAmount = utxolib.bitgo.toTNumber(transaction.outs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), amountType);
270
- const outputs = transaction.outs.map((o) => ({
271
- address: utxolib.address.fromOutputScript(o.script, transaction.network),
272
- valueString: o.value.toString(),
273
- change: false,
274
- }));
275
- const inputs = unspents.map((u) => {
276
- // NOTE:
277
- // The `redeemScript` and `walletScript` properties are required for legacy versions of BitGoJS
278
- // which might require these scripts for signing. The Wallet Recovery Wizard (WRW) can create
279
- // unsigned prebuilds that are submitted to BitGoJS instances which are not necessarily the same
280
- // version.
281
- const addressKeys = walletKeys.deriveForChainAndIndex(u.chain, u.index);
282
- const scriptType = scriptTypeForChain(u.chain);
283
- const { redeemScript, witnessScript } = outputScripts.createOutputScript2of3(addressKeys.publicKeys, scriptType);
284
- return {
285
- ...u,
286
- wallet: walletId,
287
- fromWallet: walletId,
288
- redeemScript: redeemScript?.toString('hex'),
289
- witnessScript: witnessScript?.toString('hex'),
290
- };
257
+ utxolib.bitgo.addWalletUnspentToPsbt(psbt, { ...unspent, value: BigInt(unspent.value) }, walletKeys, 'user', 'backup', { skipNonWitnessUtxo: true });
291
258
  });
292
- return {
293
- inputAmount,
294
- outputAmount,
295
- minerFee: inputAmount - outputAmount,
296
- spendAmount: outputAmount,
297
- inputs,
298
- unspents: inputs,
299
- outputs,
300
- externalOutputs: outputs,
301
- changeOutputs: [],
302
- payGoFee: 0,
303
- } /* cast to TransactionInfo to allow extra fields may be required by legacy consumers of this data */;
304
- }
305
- function getFeeInfo(transaction, unspents, amountType = 'number') {
306
- const vsize = Dimensions.fromUnspents(unspents, {
307
- p2tr: { scriptPathLevel: 1 },
308
- p2trMusig2: { scriptPathLevel: undefined },
309
- })
310
- .plus(Dimensions.fromOutputs(transaction.outs))
311
- .getVSize();
312
- const inputAmount = utxolib.bitgo.unspentSum(unspents, amountType);
313
- const outputAmount = transaction.outs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0));
314
- const fee = Number(BigInt(inputAmount) - outputAmount);
315
- return {
316
- size: vsize,
317
- fee,
318
- feeRate: fee / vsize,
319
- payGoFee: 0,
320
- };
259
+ const recoveryOutputScript = utxolib.address.toOutputScript(targetAddress, network);
260
+ psbt.addOutput({ script: recoveryOutputScript, value: inputValue - fee });
261
+ return psbt;
321
262
  }
322
263
  /**
323
264
  * Recover wallet deposits that were received on the wrong blockchain
@@ -335,34 +276,28 @@ export async function recoverCrossChain(bitgo, params) {
335
276
  const walletUnspents = await toWalletUnspents(params.sourceCoin, params.recoveryCoin, unspents, wallet);
336
277
  const walletKeys = await getWalletKeys(params.recoveryCoin, wallet);
337
278
  const prv = params.xprv || params.walletPassphrase ? await getPrv(params.xprv, params.walletPassphrase, wallet) : undefined;
338
- const signer = prv
339
- ? new utxolib.bitgo.WalletUnspentSigner(walletKeys, prv, walletKeys.bitgo)
340
- : undefined;
341
279
  const feeRateSatVB = await getFeeRateSatVB(params.sourceCoin);
342
- const transaction = createSweepTransaction(params.sourceCoin.network, walletUnspents, params.recoveryAddress, feeRateSatVB, signer, params.sourceCoin.amountType);
343
- const recoveryAmount = transaction.outs[0].value;
344
- const txHex = transaction.toBuffer().toString('hex');
345
- const txInfo = getTxInfo(transaction, walletUnspents, params.walletId, walletKeys, params.sourceCoin.amountType);
346
- if (prv) {
280
+ // Create PSBT for both signed and unsigned recovery
281
+ const psbt = createSweepTransaction(params.sourceCoin.network, walletKeys, walletUnspents, params.recoveryAddress, feeRateSatVB);
282
+ // For unsigned recovery, return unsigned PSBT hex
283
+ if (!prv) {
347
284
  return {
348
- version: wallet instanceof Wallet ? 2 : 1,
285
+ txHex: psbt.toHex(),
349
286
  walletId: params.walletId,
350
- txHex,
351
- txInfo,
352
- sourceCoin: params.sourceCoin.getChain(),
353
- recoveryCoin: params.recoveryCoin.getChain(),
354
- recoveryAmount,
355
- };
356
- }
357
- else {
358
- return {
359
- txHex,
360
- txInfo,
361
- walletId: params.walletId,
362
- feeInfo: getFeeInfo(transaction, walletUnspents, params.sourceCoin.amountType),
363
287
  address: params.recoveryAddress,
364
288
  coin: params.sourceCoin.getChain(),
365
289
  };
366
290
  }
291
+ // For signed recovery, sign the PSBT with user key and return half-signed PSBT
292
+ signAndVerifyPsbt(psbt, prv, { isLastSignature: false });
293
+ const recoveryAmount = utxolib.bitgo.toTNumber(psbt.txOutputs[0].value, params.sourceCoin.amountType);
294
+ return {
295
+ version: wallet instanceof Wallet ? 2 : 1,
296
+ walletId: params.walletId,
297
+ txHex: psbt.toHex(),
298
+ sourceCoin: params.sourceCoin.getChain(),
299
+ recoveryCoin: params.recoveryCoin.getChain(),
300
+ recoveryAmount,
301
+ };
367
302
  }
368
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NDaGFpblJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBa0IsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBd0MsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRWxHLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQTZDeEUsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQzdCLEtBQWdCLEVBQ2hCLElBQXNCLEVBQ3RCLFFBQWdCO0lBRWhCLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCwrQ0FBK0M7UUFDL0Msa0pBQWtKO1FBQ2xKLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lB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VSxDQUFDLFVBQVUsQ0FBQztZQUM5RSxPQUFPLEVBQUUsTUFBTSxDQUFDLGVBQWU7WUFDL0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1NBQ25DLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBiaXAzMiB9IGZyb20gJ0BiaXRnby9zZWNwMjU2azEnO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UsIElXYWxsZXQsIEtleWNoYWluLCBUcmlwbGUsIFdhbGxldCB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBkZWNyeXB0IH0gZnJvbSAnQGJpdGdvL3Nkay1hcGknO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBUcmFuc2FjdGlvbkluZm8gfSBmcm9tICcuLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25MZWdhY3lUcmFuc2FjdGlvbic7XG5cbmNvbnN0IHsgdW5zcGVudFN1bSwgc2NyaXB0VHlwZUZvckNoYWluLCBvdXRwdXRTY3JpcHRzIH0gPSB1dHhvbGliLmJpdGdvO1xudHlwZSBSb290V2FsbGV0S2V5cyA9IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXM7XG50eXBlIFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSB1dHhvbGliLmJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG50eXBlIFdhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8VE51bWJlcj47XG50eXBlIFdhbGxldFVuc3BlbnRMZWdhY3k8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnRMZWdhY3k8VE51bWJlcj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRSZWNvdmVyeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHdhbGxldDogc3RyaW5nO1xuICBmYXVsdHlUeElkOiBzdHJpbmc7XG4gIHJlY292ZXJ5QWRkcmVzczogc3RyaW5nO1xufVxuXG50eXBlIEZlZUluZm8gPSB7XG4gIHNpemU6IG51bWJlcjtcbiAgZmVlUmF0ZTogbnVtYmVyO1xuICBmZWU6IG51bWJlcjtcbiAgcGF5R29GZWU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgd2FsbGV0SWQ6IHN0cmluZztcbiAgZmVlSW5mbzogRmVlSW5mbztcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdmVyc2lvbjogMSB8IDI7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIHR4SW5mbzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB3YWxsZXRJZDogc3RyaW5nO1xuICBzb3VyY2VDb2luOiBzdHJpbmc7XG4gIHJlY292ZXJ5Q29pbjogc3RyaW5nO1xuICByZWNvdmVyeUFkZHJlc3M/OiBzdHJpbmc7XG4gIHJlY292ZXJ5QW1vdW50PzogVE51bWJlcjtcbn1cblxudHlwZSBXYWxsZXRWMSA9IHtcbiAga2V5Y2hhaW5zOiB7IHhwdWI6IHN0cmluZyB9W107XG4gIGFkZHJlc3MoeyBhZGRyZXNzIH06IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2hhaW46IG51bWJlcjsgaW5kZXg6IG51bWJlciB9PjtcbiAgZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk6IFByb21pc2U8eyBlbmNyeXB0ZWRYcHJ2OiBzdHJpbmcgfT47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V2FsbGV0KFxuICBiaXRnbzogQml0R29CYXNlLFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB3YWxsZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPElXYWxsZXQgfCBXYWxsZXRWMT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjb2luLndhbGxldHMoKS5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBCRy00NjM2NCBoYW5kbGUgZXJyb3JzIG1vcmUgZ3JhY2VmdWxseVxuICAgIC8vIFRoZSB2MiBlbmRwb2ludCBjb2luLndhbGxldHMoKS5nZXQoKSBtYXkgdGhyb3cgNDA0IG9yIDQwMCBlcnJvcnMsIGJ1dCB0aGlzIHNob3VsZCBub3QgcHJldmVudCB1cyBmcm9tIHNlYXJjaGluZyBmb3IgdGhlIHdhbGxldElkIGluIHYxIHdhbGxldHMuXG4gICAgaWYgKGUuc3RhdHVzID49IDUwMCkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBiaXRnby53YWxsZXRzKCkuZ2V0KHsgaWQ6IHdhbGxldElkIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjb3VsZCBub3QgZ2V0IHdhbGxldCAke3dhbGxldElkfSBmcm9tIHYxIG9yIHYyOiAke2UudG9TdHJpbmcoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSByZWNvdmVyeUNvaW5cbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gd2FsbGV0IHB1YmtleXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdhbGxldEtleXMoXG4gIHJlY292ZXJ5Q29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgd2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjFcbik6IFByb21pc2U8Um9vdFdhbGxldEtleXM+IHtcbiAgbGV0IHhwdWJzOiBUcmlwbGU8c3RyaW5nPjtcblxuICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHJlY292ZXJ5Q29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldCB9KSkgYXMgdW5rbm93biBhcyBLZXljaGFpbltdO1xuICAgIGlmIChrZXljaGFpbnMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIHRyaXBsZSBnb3QgJHtrZXljaGFpbnMubGVuZ3RofWApO1xuICAgIH1cbiAgICB4cHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPjtcbiAgfSBlbHNlIHtcbiAgICB4cHVicyA9ICh3YWxsZXQgYXMgV2FsbGV0VjEpLmtleWNoYWlucy5tYXAoKGspID0+IGsueHB1YikgYXMgVHJpcGxlPHN0cmluZz47XG4gIH1cblxuICByZXR1cm4gbmV3IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMoeHB1YnMubWFwKChrKSA9PiBiaXAzMi5mcm9tQmFzZTU4KGspKSBhcyBUcmlwbGU8QklQMzJJbnRlcmZhY2U+KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzV2FsbGV0QWRkcmVzcyh3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMSwgYWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgbGV0IGFkZHJlc3NEYXRhO1xuICAgIGlmICh3YWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQpIHtcbiAgICAgIGFkZHJlc3NEYXRhID0gYXdhaXQgd2FsbGV0LmdldEFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRyZXNzRGF0YSA9IGF3YWl0ICh3YWxsZXQgYXMgV2FsbGV0VjEpLmFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRyZXNzRGF0YSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIExpdGVjb2luIFAyU0ggYWRkcmVzcyBmcm9tIE0uLi4gZm9ybWF0IChzY3JpcHRIYXNoIDB4MzIpIHRvIHRoZSBsZWdhY3kgMy4uLiBmb3JtYXQgKHNjcmlwdEhhc2ggMHgwNSkuXG4gKiBUaGlzIGlzIG5lZWRlZCBmb3IgY3Jvc3MtY2hhaW4gcmVjb3Zlcnkgd2hlbiBMVEMgd2FzIHNlbnQgdG8gYSBCVEMgYWRkcmVzcywgYmVjYXVzZSB0aGUgQlRDIHdhbGxldFxuICogc3RvcmVzIGFkZHJlc3NlcyBpbiB0aGUgMy4uLiBmb3JtYXQgd2hpbGUgdGhlIExUQyBibG9ja2NoYWluIHJldHVybnMgYWRkcmVzc2VzIGluIE0uLi4gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBhZGRyZXNzIC0gTFRDIGFkZHJlc3MgdG8gY29udmVydFxuICogQHBhcmFtIG5ldHdvcmsgLSBUaGUgTGl0ZWNvaW4gbmV0d29ya1xuICogQHJldHVybnMgVGhlIGFkZHJlc3MgaW4gbGVnYWN5IDMuLi4gZm9ybWF0LCBvciB0aGUgb3JpZ2luYWwgYWRkcmVzcyBpZiBpdCdzIG5vdCBhIFAyU0ggYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEx0Y0FkZHJlc3NUb0xlZ2FjeUZvcm1hdChhZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGRlY29kZSBhcyBiZWNoMzIgLSB0aGVzZSBkb24ndCBuZWVkIGNvbnZlcnNpb25cbiAgICB1dHhvbGliLmFkZHJlc3MuZnJvbUJlY2gzMihhZGRyZXNzKTtcbiAgICByZXR1cm4gYWRkcmVzcztcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIE5vdCBiZWNoMzIsIGNvbnRpbnVlIHRvIGJhc2U1OFxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkZWNvZGVkID0gdXR4b2xpYi5hZGRyZXNzLmZyb21CYXNlNThDaGVjayhhZGRyZXNzLCBuZXR3b3JrKTtcbiAgICAvLyBPbmx5IGNvbnZlcnQgUDJTSCBhZGRyZXNzZXMgKHNjcmlwdEhhc2gpLCBub3QgUDJQS0ggKHB1YktleUhhc2gpXG4gICAgaWYgKGRlY29kZWQudmVyc2lvbiA9PT0gbmV0d29yay5zY3JpcHRIYXNoKSB7XG4gICAgICAvLyBDb252ZXJ0IHRvIGxlZ2FjeSBmb3JtYXQgdXNpbmcgQml0Y29pbidzIHNjcmlwdEhhc2ggKDB4MDUpXG4gICAgICBjb25zdCBsZWdhY3lTY3JpcHRIYXNoID0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLnNjcmlwdEhhc2g7XG4gICAgICByZXR1cm4gdXR4b2xpYi5hZGRyZXNzLnRvQmFzZTU4Q2hlY2soZGVjb2RlZC5oYXNoLCBsZWdhY3lTY3JpcHRIYXNoLCBuZXR3b3JrKTtcbiAgICB9XG4gICAgLy8gUDJQS0ggb3Igb3RoZXIgLSByZXR1cm4gdW5jaGFuZ2VkXG4gICAgcmV0dXJuIGFkZHJlc3M7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiBkZWNvZGluZyBmYWlscywgcmV0dXJuIHRoZSBvcmlnaW5hbCBhZGRyZXNzXG4gICAgcmV0dXJuIGFkZHJlc3M7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gY29pblxuICogQHBhcmFtIHR4aWRcbiAqIEBwYXJhbSBhbW91bnRUeXBlXG4gKiBAcGFyYW0gd2FsbGV0XG4gKiBAcGFyYW0gYXBpS2V5IC0gYSBibG9ja2NoYWlyIGFwaSBrZXlcbiAqIEByZXR1cm4gYWxsIHVuc3BlbnRzIGZvciB0cmFuc2FjdGlvbiBvdXRwdXRzLCBpbmNsdWRpbmcgb3V0cHV0cyBmcm9tIG90aGVyIHRyYW5zYWN0aW9uc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxSZWNvdmVyeU91dHB1dHM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHR4aWQ6IHN0cmluZyxcbiAgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInLFxuICB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMSxcbiAgYXBpS2V5Pzogc3RyaW5nXG4pOiBQcm9taXNlPFVuc3BlbnQ8VE51bWJlcj5bXT4ge1xuICBjb25zdCBhcGkgPSBjb2luLmdldFJlY292ZXJ5UHJvdmlkZXIoYXBpS2V5KTtcbiAgY29uc3QgdHggPSBhd2FpdCBhcGkuZ2V0VHJhbnNhY3Rpb25JTyh0eGlkKTtcbiAgY29uc3Qgd2FsbGV0QWRkcmVzc2VzID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHgub3V0cHV0cy5tYXAoYXN5bmMgKG91dHB1dCkgPT4ge1xuICAgICAgICAvLyBGb3Igc29tZSBjb2lucyAoYmNoKSB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGFkZHJlc3MgdG8gbGVnYWN5IGZvcm1hdCBzaW5jZSB0aGUgYXBpIHJldHVybnMgdGhlIGFkZHJlc3NcbiAgICAgICAgLy8gaW4gbm9uIGxlZ2FjeSBmb3JtYXQuIEhvd2V2ZXIsIHdlIHdhbnQgdG8ga2VlcCB0aGUgYWRkcmVzcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHJlc3BvbnNlIHNpbmNlIHdlXG4gICAgICAgIC8vIGFyZSBnb2luZyB0byBoaXQgdGhlIEFQSSBhZ2FpbiB0byBmZXRjaCBhZGRyZXNzIHVuc3BlbnRzLlxuICAgICAgICBjb25zdCBjYW5vbmljYWxBZGRyZXNzID0gY29pbi5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKTtcbiAgICAgICAgbGV0IGlzV2FsbGV0T3duZWQgPSBhd2FpdCBpc1dhbGxldEFkZHJlc3Mod2FsbGV0LCBjYW5vbmljYWxBZGRyZXNzKTtcblxuICAgICAgICAvLyBGb3IgTFRDIGNyb3NzLWNoYWluIHJlY292ZXJ5OiBpZiB0aGUgYWRkcmVzcyBpc24ndCBmb3VuZCwgdHJ5IHRoZSBsZWdhY3kgZm9ybWF0LlxuICAgICAgICAvLyBXaGVuIExUQyBpcyBzZW50IHRvIGEgQlRDIGFkZHJlc3MsIHRoZSBMVEMgYmxvY2tjaGFpbiByZXR1cm5zIE0uLi4gYWRkcmVzc2VzXG4gICAgICAgIC8vIGJ1dCB0aGUgQlRDIHdhbGxldCBzdG9yZXMgYWRkcmVzc2VzIGluIDMuLi4gZm9ybWF0LlxuICAgICAgICBpZiAoIWlzV2FsbGV0T3duZWQgJiYgY29pbi5nZXRGYW1pbHkoKSA9PT0gJ2x0YycpIHtcbiAgICAgICAgICBjb25zdCBsZWdhY3lBZGRyZXNzID0gY29udmVydEx0Y0FkZHJlc3NUb0xlZ2FjeUZvcm1hdChvdXRwdXQuYWRkcmVzcywgY29pbi5uZXR3b3JrKTtcbiAgICAgICAgICBpZiAobGVnYWN5QWRkcmVzcyAhPT0gb3V0cHV0LmFkZHJlc3MpIHtcbiAgICAgICAgICAgIGlzV2FsbGV0T3duZWQgPSBhd2FpdCBpc1dhbGxldEFkZHJlc3Mod2FsbGV0LCBsZWdhY3lBZGRyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNXYWxsZXRPd25lZCA/IG91dHB1dC5hZGRyZXNzIDogbnVsbDtcbiAgICAgIH0pXG4gICAgKVxuICApLmZpbHRlcigoYWRkcmVzcykgPT4gYWRkcmVzcyAhPT0gbnVsbCk7XG5cbiAgY29uc3QgdW5zcGVudHMgPSBhd2FpdCBhcGkuZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMod2FsbGV0QWRkcmVzc2VzIGFzIHN0cmluZ1tdKTtcbiAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVjb3ZlcnkgdW5zcGVudHMgZm91bmQuYCk7XG4gIH1cbiAgLy8gdGhlIGFwaSBtYXkgcmV0dXJuIGNhc2hhZGRyJ3MgaW5zdGVhZCBvZiBsZWdhY3kgZm9yIEJDSCBhbmQgQkNIQVxuICAvLyBkb3duc3RyZWFtIHByb2Nlc3NlcydzIG9ubHkgZXhwZWN0IGxlZ2FjeSBhZGRyZXNzZXNcbiAgcmV0dXJuIHVuc3BlbnRzLm1hcCgocmVjb3ZlcnlPdXRwdXQpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVjb3ZlcnlPdXRwdXQsXG4gICAgICBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3MocmVjb3ZlcnlPdXRwdXQuYWRkcmVzcyksXG4gICAgICB2YWx1ZTogdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oQmlnSW50KHJlY292ZXJ5T3V0cHV0LnZhbHVlKSwgYW1vdW50VHlwZSksXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGF0YSByZXF1aXJlZCBmb3IgYWRkcmVzcyBhbmQgc2lnbmF0dXJlIGRlcml2YXRpb25cbiAqL1xudHlwZSBTY3JpcHRJZCA9IHtcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNjcmlwdElkKGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxLCBzY3JpcHQ6IEJ1ZmZlcik6IFByb21pc2U8U2NyaXB0SWQ+IHtcbiAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHNjcmlwdCwgY29pbi5uZXR3b3JrKTtcbiAgbGV0IGFkZHJlc3NEYXRhOiB7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfTtcbiAgaWYgKHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkge1xuICAgIGFkZHJlc3NEYXRhID0gYXdhaXQgd2FsbGV0LmdldEFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICB9IGVsc2Uge1xuICAgIGFkZHJlc3NEYXRhID0gYXdhaXQgKHdhbGxldCBhcyBXYWxsZXRWMSkuYWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhZGRyZXNzRGF0YS5jaGFpbiA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGFkZHJlc3NEYXRhLmluZGV4ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IGNoYWluOiBhZGRyZXNzRGF0YS5jaGFpbiwgaW5kZXg6IGFkZHJlc3NEYXRhLmluZGV4IH07XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYWRkcmVzcyBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGFkZHJlc3NEYXRhKX1gKTtcbn1cblxuLyoqXG4gKiBMb29rdXAgYWRkcmVzcyBkYXRhIGZyb20gdW5zcGVudHMgb24gc291cmNlQ29pbiBpbiBhZGRyZXNzIGRhdGFiYXNlIG9mIHJlY292ZXJ5Q29pbi5cbiAqIFJldHVybiBmdWxsIHdhbGxldFVuc3BlbnRzIGluY2x1ZGluZyBzY3JpcHRJZCBpbiBzb3VyY2VDb2luIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gc291cmNlQ29pblxuICogQHBhcmFtIHJlY292ZXJ5Q29pblxuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gd2FsbGV0XG4gKiBAcmV0dXJuIHdhbGxldFVuc3BlbnRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvV2FsbGV0VW5zcGVudHM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIHNvdXJjZUNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHJlY292ZXJ5Q29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgdW5zcGVudHM6IFVuc3BlbnQ8VE51bWJlcj5bXSxcbiAgd2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjFcbik6IFByb21pc2U8V2FsbGV0VW5zcGVudDxUTnVtYmVyPltdPiB7XG4gIGNvbnN0IGFkZHJlc3NlcyA9IG5ldyBTZXQodW5zcGVudHMubWFwKCh1KSA9PiB1LmFkZHJlc3MpKTtcbiAgY29uc3Qgd2FsbGV0VW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYWRkcmVzcyBvZiBhZGRyZXNzZXMpIHtcbiAgICBsZXQgc2NyaXB0SWQ7XG4gICAgdHJ5IHtcbiAgICAgIHNjcmlwdElkID0gYXdhaXQgZ2V0U2NyaXB0SWQocmVjb3ZlcnlDb2luLCB3YWxsZXQsIHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChhZGRyZXNzLCBzb3VyY2VDb2luLm5ldHdvcmspKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBlcnJvciBnZXR0aW5nIHNjcmlwdElkIGZvciAke2FkZHJlc3N9OmAsIGUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcmVkVW5zcGVudHMgPSB1bnNwZW50c1xuICAgICAgLmZpbHRlcigodSkgPT4gdS5hZGRyZXNzID09PSBhZGRyZXNzKVxuICAgICAgLm1hcCgodSkgPT4gKHtcbiAgICAgICAgLi4udSxcbiAgICAgICAgLi4uc2NyaXB0SWQsXG4gICAgICB9KSk7XG4gICAgd2FsbGV0VW5zcGVudHMucHVzaCguLi5maWx0ZXJlZFVuc3BlbnRzKTtcbiAgfVxuXG4gIHJldHVybiB3YWxsZXRVbnNwZW50cztcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29pblxuICogQHJldHVybiBmZWVSYXRlIGZvciB0cmFuc2FjdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGZWVSYXRlU2F0VkIoY29pbjogQWJzdHJhY3RVdHhvQ29pbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIC8vIFRPRE86IHVzZSBmZWVSYXRlIEFQSVxuICBjb25zdCBmZWVSYXRlID0ge1xuICAgIGJjaDogMjAsXG4gICAgdGJjaDogMjAsXG4gICAgYmNoYTogMjAsXG4gICAgdGJjaGE6IDIwLFxuICAgIGJzdjogMjAsXG4gICAgdGJzdjogMjAsXG4gICAgYnRjOiA4MCxcbiAgICB0YnRjOiA4MCxcbiAgICB0YnRjc2lnOiA4MCxcbiAgICB0YnRjNDogODAsXG4gICAgdGJ0Y2Jnc2lnOiA4MCxcbiAgICBsdGM6IDEwMCxcbiAgICB0bHRjOiAxMDAsXG4gICAgZG9nZTogMTAwMCxcbiAgICB0ZG9nZTogMTAwMCxcbiAgfVtjb2luLmdldENoYWluKCldO1xuXG4gIGlmICghZmVlUmF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gZmVlUmF0ZSBmb3IgJHtjb2luLmdldENoYWluKCl9YCk7XG4gIH1cblxuICByZXR1cm4gZmVlUmF0ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0geHBydlxuICogQHBhcmFtIHBhc3NwaHJhc2VcbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gc2lnbmluZyBrZXlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHJ2KHhwcnY/OiBzdHJpbmcsIHBhc3NwaHJhc2U/OiBzdHJpbmcsIHdhbGxldD86IElXYWxsZXQgfCBXYWxsZXRWMSk6IFByb21pc2U8QklQMzJJbnRlcmZhY2U+IHtcbiAgaWYgKHhwcnYpIHtcbiAgICBjb25zdCBrZXkgPSBiaXAzMi5mcm9tQmFzZTU4KHhwcnYpO1xuICAgIGlmIChrZXkuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBpZiAoIXdhbGxldCB8fCAhcGFzc3BocmFzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8geHBydiBnaXZlbjogbmVlZCB3YWxsZXQgYW5kIHBhc3NwaHJhc2UgdG8gY29udGludWVgKTtcbiAgfVxuXG4gIGxldCBlbmNyeXB0ZWRQcnY6IHN0cmluZztcbiAgaWYgKHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkge1xuICAgIGVuY3J5cHRlZFBydiA9IChhd2FpdCB3YWxsZXQuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpLmVuY3J5cHRlZFBydjtcbiAgfSBlbHNlIHtcbiAgICBlbmNyeXB0ZWRQcnYgPSAoYXdhaXQgKHdhbGxldCBhcyBXYWxsZXRWMSkuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpLmVuY3J5cHRlZFhwcnY7XG4gIH1cblxuICByZXR1cm4gZ2V0UHJ2KGRlY3J5cHQocGFzc3BocmFzZSwgZW5jcnlwdGVkUHJ2KSk7XG59XG5cbi8qKlxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEBwYXJhbSB1bnNwZW50c1xuICogQHBhcmFtIHRhcmdldEFkZHJlc3NcbiAqIEBwYXJhbSBmZWVSYXRlU2F0VkJcbiAqIEBwYXJhbSBzaWduZXIgLSBpZiBzZXQsIHNpZ24gdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBhbW91bnRUeXBlXG4gKiBAcmV0dXJuIHRyYW5zYWN0aW9uIHNwZW5kaW5nIGZ1bGwgaW5wdXQgYW1vdW50IHRvIHRhcmdldEFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3dlZXBUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdLFxuICB0YXJnZXRBZGRyZXNzOiBzdHJpbmcsXG4gIGZlZVJhdGVTYXRWQjogbnVtYmVyLFxuICBzaWduZXI/OiB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnRTaWduZXI8Um9vdFdhbGxldEtleXM+LFxuICBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcidcbik6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgY29uc3QgaW5wdXRWYWx1ZSA9IHVuc3BlbnRTdW08VE51bWJlcj4odW5zcGVudHMsIGFtb3VudFR5cGUpO1xuICBjb25zdCB2c2l6ZSA9IERpbWVuc2lvbnMuZnJvbVVuc3BlbnRzKHVuc3BlbnRzLCB7XG4gICAgcDJ0cjogeyBzY3JpcHRQYXRoTGV2ZWw6IDEgfSxcbiAgICBwMnRyTXVzaWcyOiB7IHNjcmlwdFBhdGhMZXZlbDogdW5kZWZpbmVkIH0sXG4gIH0pXG4gICAgLnBsdXMoRGltZW5zaW9ucy5mcm9tT3V0cHV0KHsgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQodGFyZ2V0QWRkcmVzcywgbmV0d29yaykgfSkpXG4gICAgLmdldFZTaXplKCk7XG4gIGNvbnN0IGZlZSA9IHZzaXplICogZmVlUmF0ZVNhdFZCO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uQnVpbGRlciA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRm9yTmV0d29yazxUTnVtYmVyPihuZXR3b3JrKTtcbiAgdHJhbnNhY3Rpb25CdWlsZGVyLmFkZE91dHB1dChcbiAgICB0YXJnZXRBZGRyZXNzLFxuICAgIHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KEJpZ0ludChpbnB1dFZhbHVlKSAtIEJpZ0ludChmZWUpLCBhbW91bnRUeXBlKVxuICApO1xuICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PiB7XG4gICAgdXR4b2xpYi5iaXRnby5hZGRUb1RyYW5zYWN0aW9uQnVpbGRlcih0cmFuc2FjdGlvbkJ1aWxkZXIsIHVuc3BlbnQpO1xuICB9KTtcbiAgbGV0IHRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb25CdWlsZGVyLmJ1aWxkSW5jb21wbGV0ZSgpO1xuICBpZiAoc2lnbmVyKSB7XG4gICAgdHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb248VE51bWJlcj4odHJhbnNhY3Rpb25CdWlsZGVyLCB1bnNwZW50cywgc2lnbmVyLCB7XG4gICAgICBpc0xhc3RTaWduYXR1cmU6IGZhbHNlLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB0cmFuc2FjdGlvbjtcbn1cblxuZnVuY3Rpb24gZ2V0VHhJbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICB0cmFuc2FjdGlvbjogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10sXG4gIHdhbGxldElkOiBzdHJpbmcsXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcidcbik6IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPiB7XG4gIGNvbnN0IGlucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtPFROdW1iZXI+KHVuc3BlbnRzLCBhbW91bnRUeXBlKTtcbiAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgdHJhbnNhY3Rpb24ub3V0cy5yZWR1Y2UoKHN1bSwgbykgPT4gc3VtICsgQmlnSW50KG8udmFsdWUpLCBCaWdJbnQoMCkpLFxuICAgIGFtb3VudFR5cGVcbiAgKTtcbiAgY29uc3Qgb3V0cHV0cyA9IHRyYW5zYWN0aW9uLm91dHMubWFwKChvKSA9PiAoe1xuICAgIGFkZHJlc3M6IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG8uc2NyaXB0LCB0cmFuc2FjdGlvbi5uZXR3b3JrKSxcbiAgICB2YWx1ZVN0cmluZzogby52YWx1ZS50b1N0cmluZygpLFxuICAgIGNoYW5nZTogZmFsc2UsXG4gIH0pKTtcbiAgY29uc3QgaW5wdXRzID0gdW5zcGVudHMubWFwKCh1KSA9PiB7XG4gICAgLy8gTk9URTpcbiAgICAvLyBUaGUgYHJlZGVlbVNjcmlwdGAgYW5kIGB3YWxsZXRTY3JpcHRgIHByb3BlcnRpZXMgYXJlIHJlcXVpcmVkIGZvciBsZWdhY3kgdmVyc2lvbnMgb2YgQml0R29KU1xuICAgIC8vIHdoaWNoIG1pZ2h0IHJlcXVpcmUgdGhlc2Ugc2NyaXB0cyBmb3Igc2lnbmluZy4gVGhlIFdhbGxldCBSZWNvdmVyeSBXaXphcmQgKFdSVykgY2FuIGNyZWF0ZVxuICAgIC8vIHVuc2lnbmVkIHByZWJ1aWxkcyB0aGF0IGFyZSBzdWJtaXR0ZWQgdG8gQml0R29KUyBpbnN0YW5jZXMgd2hpY2ggYXJlIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZVxuICAgIC8vIHZlcnNpb24uXG4gICAgY29uc3QgYWRkcmVzc0tleXMgPSB3YWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodS5jaGFpbiwgdS5pbmRleCk7XG4gICAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1LmNoYWluKTtcbiAgICBjb25zdCB7IHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCB9ID0gb3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGFkZHJlc3NLZXlzLnB1YmxpY0tleXMsIHNjcmlwdFR5cGUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnUsXG4gICAgICB3YWxsZXQ6IHdhbGxldElkLFxuICAgICAgZnJvbVdhbGxldDogd2FsbGV0SWQsXG4gICAgICByZWRlZW1TY3JpcHQ6IHJlZGVlbVNjcmlwdD8udG9TdHJpbmcoJ2hleCcpLFxuICAgICAgd2l0bmVzc1NjcmlwdDogd2l0bmVzc1NjcmlwdD8udG9TdHJpbmcoJ2hleCcpLFxuICAgIH0gYXMgV2FsbGV0VW5zcGVudExlZ2FjeTxUTnVtYmVyPjtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgaW5wdXRBbW91bnQsXG4gICAgb3V0cHV0QW1vdW50LFxuICAgIG1pbmVyRmVlOiBpbnB1dEFtb3VudCAtIG91dHB1dEFtb3VudCxcbiAgICBzcGVuZEFtb3VudDogb3V0cHV0QW1vdW50LFxuICAgIGlucHV0cyxcbiAgICB1bnNwZW50czogaW5wdXRzLFxuICAgIG91dHB1dHMsXG4gICAgZXh0ZXJuYWxPdXRwdXRzOiBvdXRwdXRzLFxuICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgIHBheUdvRmVlOiAwLFxuICB9IC8qIGNhc3QgdG8gVHJhbnNhY3Rpb25JbmZvIHRvIGFsbG93IGV4dHJhIGZpZWxkcyBtYXkgYmUgcmVxdWlyZWQgYnkgbGVnYWN5IGNvbnN1bWVycyBvZiB0aGlzIGRhdGEgKi8gYXMgVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xufVxuXG5mdW5jdGlvbiBnZXRGZWVJbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICB0cmFuc2FjdGlvbjogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10sXG4gIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJ1xuKTogRmVlSW5mbyB7XG4gIGNvbnN0IHZzaXplID0gRGltZW5zaW9ucy5mcm9tVW5zcGVudHModW5zcGVudHMsIHtcbiAgICBwMnRyOiB7IHNjcmlwdFBhdGhMZXZlbDogMSB9LFxuICAgIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSxcbiAgfSlcbiAgICAucGx1cyhEaW1lbnNpb25zLmZyb21PdXRwdXRzKHRyYW5zYWN0aW9uLm91dHMpKVxuICAgIC5nZXRWU2l6ZSgpO1xuICBjb25zdCBpbnB1dEFtb3VudCA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bTxUTnVtYmVyPih1bnNwZW50cywgYW1vdW50VHlwZSk7XG4gIGNvbnN0IG91dHB1dEFtb3VudCA9IHRyYW5zYWN0aW9uLm91dHMucmVkdWNlKChzdW0sIG8pID0+IHN1bSArIEJpZ0ludChvLnZhbHVlKSwgQmlnSW50KDApKTtcbiAgY29uc3QgZmVlID0gTnVtYmVyKEJpZ0ludChpbnB1dEFtb3VudCkgLSBvdXRwdXRBbW91bnQpO1xuICByZXR1cm4ge1xuICAgIHNpemU6IHZzaXplLFxuICAgIGZlZSxcbiAgICBmZWVSYXRlOiBmZWUgLyB2c2l6ZSxcbiAgICBwYXlHb0ZlZTogMCxcbiAgfTtcbn1cblxudHlwZSBSZWNvdmVyUGFyYW1zID0ge1xuICAvKiogV2FsbGV0IElEIChjYW4gYmUgdjEgd2FsbGV0IG9yIHYyIHdhbGxldCkgKi9cbiAgd2FsbGV0SWQ6IHN0cmluZztcbiAgLyoqIENvaW4gdG8gY3JlYXRlIHRoZSB0cmFuc2FjdGlvbiBmb3IgKi9cbiAgc291cmNlQ29pbjogQWJzdHJhY3RVdHhvQ29pbjtcbiAgLyoqIENvaW4gdGhhdCB3YWxsZXQga2V5cyB3ZXJlIHNldCB1cCBmb3IgKi9cbiAgcmVjb3ZlcnlDb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICAvKiogU291cmNlIGNvaW4gdHJhbnNhY3Rpb24gdG8gcmVjb3ZlciBvdXRwdXRzIGZyb20gKHNvdXJjZUNvaW4pICovXG4gIHR4aWQ6IHN0cmluZztcbiAgLyoqIFNvdXJjZSBjb2luIGFkZHJlc3MgdG8gc2VuZCB0aGUgZnVuZHMgdG8gKi9cbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBJZiBzZXQsIGRlY3J5cHRzIHByaXZhdGUga2V5IGFuZCBzaWducyB0cmFuc2FjdGlvbiAqL1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICAvKiogSWYgc2V0LCBzaWducyB0cmFuc2FjdGlvbiAqL1xuICB4cHJ2Pzogc3RyaW5nO1xuICAvKiogZm9yIHV0eG8gY29pbnMgb3RoZXIgdGhhbiBbQlRDLFRCVENdIHRoaXMgaXMgYSBCbG9jayBDaGFpciBhcGkga2V5ICoqL1xuICBhcGlLZXk/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFJlY292ZXIgd2FsbGV0IGRlcG9zaXRzIHRoYXQgd2VyZSByZWNlaXZlZCBvbiB0aGUgd3JvbmcgYmxvY2tjaGFpblxuICogKGZvciBpbnN0YW5jZSBiaXRjb2luIGRlcG9zaXRzIHRoYXQgd2VyZSByZWNlaXZlZCBmb3IgYSBsaXRlY29pbiB3YWxsZXQpLlxuICpcbiAqIEZldGNoZXMgdGhlIHVuc3BlbnQgZGF0YSBmcm9tIEJpdEdvJ3MgcHVibGljIGJsb2NrY2hhaW4gQVBJIGFuZCB0aGUgc2NyaXB0IGRhdGEgZnJvbSB0aGUgdXNlcidzXG4gKiB3YWxsZXQuXG4gKlxuICogQHBhcmFtIHtCaXRHb0Jhc2V9IGJpdGdvXG4gKiBAcGFyYW0ge1JlY292ZXJQYXJhbXN9IHBhcmFtc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlckNyb3NzQ2hhaW48VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogUmVjb3ZlclBhcmFtc1xuKTogUHJvbWlzZTxDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlcj4gfCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPj4ge1xuICBjb25zdCB3YWxsZXQgPSBhd2FpdCBnZXRXYWxsZXQoYml0Z28sIHBhcmFtcy5yZWNvdmVyeUNvaW4sIHBhcmFtcy53YWxsZXRJZCk7XG4gIGNvbnN0IHVuc3BlbnRzID0gYXdhaXQgZ2V0QWxsUmVjb3ZlcnlPdXRwdXRzPFROdW1iZXI+KFxuICAgIHBhcmFtcy5zb3VyY2VDb2luLFxuICAgIHBhcmFtcy50eGlkLFxuICAgIHBhcmFtcy5zb3VyY2VDb2luLmFtb3VudFR5cGUsXG4gICAgd2FsbGV0LFxuICAgIHBhcmFtcy5hcGlLZXlcbiAgKTtcbiAgY29uc3Qgd2FsbGV0VW5zcGVudHMgPSBhd2FpdCB0b1dhbGxldFVuc3BlbnRzPFROdW1iZXI+KHBhcmFtcy5zb3VyY2VDb2luLCBwYXJhbXMucmVjb3ZlcnlDb2luLCB1bnNwZW50cywgd2FsbGV0KTtcbiAgY29uc3Qgd2FsbGV0S2V5cyA9IGF3YWl0IGdldFdhbGxldEtleXMocGFyYW1zLnJlY292ZXJ5Q29pbiwgd2FsbGV0KTtcbiAgY29uc3QgcHJ2ID1cbiAgICBwYXJhbXMueHBydiB8fCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSA/IGF3YWl0IGdldFBydihwYXJhbXMueHBydiwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIHdhbGxldCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNpZ25lciA9IHBydlxuICAgID8gbmV3IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4od2FsbGV0S2V5cywgcHJ2LCB3YWxsZXRLZXlzLmJpdGdvKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmZWVSYXRlU2F0VkIgPSBhd2FpdCBnZXRGZWVSYXRlU2F0VkIocGFyYW1zLnNvdXJjZUNvaW4pO1xuICBjb25zdCB0cmFuc2FjdGlvbiA9IGNyZWF0ZVN3ZWVwVHJhbnNhY3Rpb248VE51bWJlcj4oXG4gICAgcGFyYW1zLnNvdXJjZUNvaW4ubmV0d29yayxcbiAgICB3YWxsZXRVbnNwZW50cyxcbiAgICBwYXJhbXMucmVjb3ZlcnlBZGRyZXNzLFxuICAgIGZlZVJhdGVTYXRWQixcbiAgICBzaWduZXIsXG4gICAgcGFyYW1zLnNvdXJjZUNvaW4uYW1vdW50VHlwZVxuICApO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRyYW5zYWN0aW9uLm91dHNbMF0udmFsdWU7XG4gIGNvbnN0IHR4SGV4ID0gdHJhbnNhY3Rpb24udG9CdWZmZXIoKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IHR4SW5mbyA9IGdldFR4SW5mbzxUTnVtYmVyPihcbiAgICB0cmFuc2FjdGlvbixcbiAgICB3YWxsZXRVbnNwZW50cyxcbiAgICBwYXJhbXMud2FsbGV0SWQsXG4gICAgd2FsbGV0S2V5cyxcbiAgICBwYXJhbXMuc291cmNlQ29pbi5hbW91bnRUeXBlXG4gICk7XG4gIGlmIChwcnYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogd2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0ID8gMiA6IDEsXG4gICAgICB3YWxsZXRJZDogcGFyYW1zLndhbGxldElkLFxuICAgICAgdHhIZXgsXG4gICAgICB0eEluZm8sXG4gICAgICBzb3VyY2VDb2luOiBwYXJhbXMuc291cmNlQ29pbi5nZXRDaGFpbigpLFxuICAgICAgcmVjb3ZlcnlDb2luOiBwYXJhbXMucmVjb3ZlcnlDb2luLmdldENoYWluKCksXG4gICAgICByZWNvdmVyeUFtb3VudCxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICB0eEhleCxcbiAgICAgIHR4SW5mbyxcbiAgICAgIHdhbGxldElkOiBwYXJhbXMud2FsbGV0SWQsXG4gICAgICBmZWVJbmZvOiBnZXRGZWVJbmZvKHRyYW5zYWN0aW9uLCB3YWxsZXRVbnNwZW50cywgcGFyYW1zLnNvdXJjZUNvaW4uYW1vdW50VHlwZSksXG4gICAgICBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlBZGRyZXNzLFxuICAgICAgY29pbjogcGFyYW1zLnNvdXJjZUNvaW4uZ2V0Q2hhaW4oKSxcbiAgICB9O1xuICB9XG59XG4iXX0=
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NDaGFpblJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBa0IsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBd0MsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXhFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBNENyQyxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBZ0IsRUFDaEIsSUFBc0IsRUFDdEIsUUFBZ0I7SUFFaEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLCtDQUErQztRQUMvQyxrSkFBa0o7UUFDbEosSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFD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QU87WUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxlQUFlO1lBQy9CLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtTQUNuQyxDQUFDO0lBQ0osQ0FBQztJQUVELCtFQUErRTtJQUMvRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUvRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLE1BQU0sWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDbkIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1FBQ3hDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtRQUM1QyxjQUFjO0tBQ2YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSwgYmlwMzIgfSBmcm9tICdAYml0Z28vc2VjcDI1NmsxJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICdAYml0Z28vdW5zcGVudHMnO1xuaW1wb3J0IHsgQml0R29CYXNlLCBJV2FsbGV0LCBLZXljaGFpbiwgVHJpcGxlLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZGVjcnlwdCB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcblxuaW1wb3J0IHsgQWJzdHJhY3RVdHhvQ29pbiwgVHJhbnNhY3Rpb25JbmZvIH0gZnJvbSAnLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyBzaWduQW5kVmVyaWZ5UHNidCB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25Qc2J0JztcblxuY29uc3QgeyB1bnNwZW50U3VtIH0gPSB1dHhvbGliLmJpdGdvO1xudHlwZSBSb290V2FsbGV0S2V5cyA9IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXM7XG50eXBlIFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSB1dHhvbGliLmJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG50eXBlIFdhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8VE51bWJlcj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRSZWNvdmVyeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHdhbGxldDogc3RyaW5nO1xuICBmYXVsdHlUeElkOiBzdHJpbmc7XG4gIHJlY292ZXJ5QWRkcmVzczogc3RyaW5nO1xufVxuXG50eXBlIEZlZUluZm8gPSB7XG4gIHNpemU6IG51bWJlcjtcbiAgZmVlUmF0ZTogbnVtYmVyO1xuICBmZWU6IG51bWJlcjtcbiAgcGF5R29GZWU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm8/OiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIHdhbGxldElkOiBzdHJpbmc7XG4gIGZlZUluZm8/OiBGZWVJbmZvO1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNvaW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB2ZXJzaW9uOiAxIHwgMjtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB3YWxsZXRJZDogc3RyaW5nO1xuICBzb3VyY2VDb2luOiBzdHJpbmc7XG4gIHJlY292ZXJ5Q29pbjogc3RyaW5nO1xuICByZWNvdmVyeUFkZHJlc3M/OiBzdHJpbmc7XG4gIHJlY292ZXJ5QW1vdW50PzogVE51bWJlcjtcbn1cblxudHlwZSBXYWxsZXRWMSA9IHtcbiAga2V5Y2hhaW5zOiB7IHhwdWI6IHN0cmluZyB9W107XG4gIGFkZHJlc3MoeyBhZGRyZXNzIH06IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2hhaW46IG51bWJlcjsgaW5kZXg6IG51bWJlciB9PjtcbiAgZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk6IFByb21pc2U8eyBlbmNyeXB0ZWRYcHJ2OiBzdHJpbmcgfT47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V2FsbGV0KFxuICBiaXRnbzogQml0R29CYXNlLFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB3YWxsZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPElXYWxsZXQgfCBXYWxsZXRWMT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjb2luLndhbGxldHMoKS5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBCRy00NjM2NCBoYW5kbGUgZXJyb3JzIG1vcmUgZ3JhY2VmdWxseVxuICAgIC8vIFRoZSB2MiBlbmRwb2ludCBjb2luLndhbGxldHMoKS5nZXQoKSBtYXkgdGhyb3cgNDA0IG9yIDQwMCBlcnJvcnMsIGJ1dCB0aGlzIHNob3VsZCBub3QgcHJldmVudCB1cyBmcm9tIHNlYXJjaGluZyBmb3IgdGhlIHdhbGxldElkIGluIHYxIHdhbGxldHMuXG4gICAgaWYgKGUuc3RhdHVzID49IDUwMCkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBiaXRnby53YWxsZXRzKCkuZ2V0KHsgaWQ6IHdhbGxldElkIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjb3VsZCBub3QgZ2V0IHdhbGxldCAke3dhbGxldElkfSBmcm9tIHYxIG9yIHYyOiAke2UudG9TdHJpbmcoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSByZWNvdmVyeUNvaW5cbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gd2FsbGV0IHB1YmtleXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdhbGxldEtleXMoXG4gIHJlY292ZXJ5Q29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgd2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjFcbik6IFByb21pc2U8Um9vdFdhbGxldEtleXM+IHtcbiAgbGV0IHhwdWJzOiBUcmlwbGU8c3RyaW5nPjtcblxuICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHJlY292ZXJ5Q29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldCB9KSkgYXMgdW5rbm93biBhcyBLZXljaGFpbltdO1xuICAgIGlmIChrZXljaGFpbnMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIHRyaXBsZSBnb3QgJHtrZXljaGFpbnMubGVuZ3RofWApO1xuICAgIH1cbiAgICB4cHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPjtcbiAgfSBlbHNlIHtcbiAgICB4cHVicyA9ICh3YWxsZXQgYXMgV2FsbGV0VjEpLmtleWNoYWlucy5tYXAoKGspID0+IGsueHB1YikgYXMgVHJpcGxlPHN0cmluZz47XG4gIH1cblxuICByZXR1cm4gbmV3IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMoeHB1YnMubWFwKChrKSA9PiBiaXAzMi5mcm9tQmFzZTU4KGspKSBhcyBUcmlwbGU8QklQMzJJbnRlcmZhY2U+KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzV2FsbGV0QWRkcmVzcyh3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMSwgYWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgbGV0IGFkZHJlc3NEYXRhO1xuICAgIGlmICh3YWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQpIHtcbiAgICAgIGFkZHJlc3NEYXRhID0gYXdhaXQgd2FsbGV0LmdldEFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRyZXNzRGF0YSA9IGF3YWl0ICh3YWxsZXQgYXMgV2FsbGV0VjEpLmFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRyZXNzRGF0YSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIExpdGVjb2luIFAyU0ggYWRkcmVzcyBmcm9tIE0uLi4gZm9ybWF0IChzY3JpcHRIYXNoIDB4MzIpIHRvIHRoZSBsZWdhY3kgMy4uLiBmb3JtYXQgKHNjcmlwdEhhc2ggMHgwNSkuXG4gKiBUaGlzIGlzIG5lZWRlZCBmb3IgY3Jvc3MtY2hhaW4gcmVjb3Zlcnkgd2hlbiBMVEMgd2FzIHNlbnQgdG8gYSBCVEMgYWRkcmVzcywgYmVjYXVzZSB0aGUgQlRDIHdhbGxldFxuICogc3RvcmVzIGFkZHJlc3NlcyBpbiB0aGUgMy4uLiBmb3JtYXQgd2hpbGUgdGhlIExUQyBibG9ja2NoYWluIHJldHVybnMgYWRkcmVzc2VzIGluIE0uLi4gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBhZGRyZXNzIC0gTFRDIGFkZHJlc3MgdG8gY29udmVydFxuICogQHBhcmFtIG5ldHdvcmsgLSBUaGUgTGl0ZWNvaW4gbmV0d29ya1xuICogQHJldHVybnMgVGhlIGFkZHJlc3MgaW4gbGVnYWN5IDMuLi4gZm9ybWF0LCBvciB0aGUgb3JpZ2luYWwgYWRkcmVzcyBpZiBpdCdzIG5vdCBhIFAyU0ggYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEx0Y0FkZHJlc3NUb0xlZ2FjeUZvcm1hdChhZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGRlY29kZSBhcyBiZWNoMzIgLSB0aGVzZSBkb24ndCBuZWVkIGNvbnZlcnNpb25cbiAgICB1dHhvbGliLmFkZHJlc3MuZnJvbUJlY2gzMihhZGRyZXNzKTtcbiAgICByZXR1cm4gYWRkcmVzcztcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIE5vdCBiZWNoMzIsIGNvbnRpbnVlIHRvIGJhc2U1OFxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkZWNvZGVkID0gdXR4b2xpYi5hZGRyZXNzLmZyb21CYXNlNThDaGVjayhhZGRyZXNzLCBuZXR3b3JrKTtcbiAgICAvLyBPbmx5IGNvbnZlcnQgUDJTSCBhZGRyZXNzZXMgKHNjcmlwdEhhc2gpLCBub3QgUDJQS0ggKHB1YktleUhhc2gpXG4gICAgaWYgKGRlY29kZWQudmVyc2lvbiA9PT0gbmV0d29yay5zY3JpcHRIYXNoKSB7XG4gICAgICAvLyBDb252ZXJ0IHRvIGxlZ2FjeSBmb3JtYXQgdXNpbmcgQml0Y29pbidzIHNjcmlwdEhhc2ggKDB4MDUpXG4gICAgICBjb25zdCBsZWdhY3lTY3JpcHRIYXNoID0gdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLnNjcmlwdEhhc2g7XG4gICAgICByZXR1cm4gdXR4b2xpYi5hZGRyZXNzLnRvQmFzZTU4Q2hlY2soZGVjb2RlZC5oYXNoLCBsZWdhY3lTY3JpcHRIYXNoLCBuZXR3b3JrKTtcbiAgICB9XG4gICAgLy8gUDJQS0ggb3Igb3RoZXIgLSByZXR1cm4gdW5jaGFuZ2VkXG4gICAgcmV0dXJuIGFkZHJlc3M7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiBkZWNvZGluZyBmYWlscywgcmV0dXJuIHRoZSBvcmlnaW5hbCBhZGRyZXNzXG4gICAgcmV0dXJuIGFkZHJlc3M7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gY29pblxuICogQHBhcmFtIHR4aWRcbiAqIEBwYXJhbSBhbW91bnRUeXBlXG4gKiBAcGFyYW0gd2FsbGV0XG4gKiBAcGFyYW0gYXBpS2V5IC0gYSBibG9ja2NoYWlyIGFwaSBrZXlcbiAqIEByZXR1cm4gYWxsIHVuc3BlbnRzIGZvciB0cmFuc2FjdGlvbiBvdXRwdXRzLCBpbmNsdWRpbmcgb3V0cHV0cyBmcm9tIG90aGVyIHRyYW5zYWN0aW9uc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxSZWNvdmVyeU91dHB1dHM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHR4aWQ6IHN0cmluZyxcbiAgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInLFxuICB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMSxcbiAgYXBpS2V5Pzogc3RyaW5nXG4pOiBQcm9taXNlPFVuc3BlbnQ8VE51bWJlcj5bXT4ge1xuICBjb25zdCBhcGkgPSBjb2luLmdldFJlY292ZXJ5UHJvdmlkZXIoYXBpS2V5KTtcbiAgY29uc3QgdHggPSBhd2FpdCBhcGkuZ2V0VHJhbnNhY3Rpb25JTyh0eGlkKTtcbiAgY29uc3Qgd2FsbGV0QWRkcmVzc2VzID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHgub3V0cHV0cy5tYXAoYXN5bmMgKG91dHB1dCkgPT4ge1xuICAgICAgICAvLyBGb3Igc29tZSBjb2lucyAoYmNoKSB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGFkZHJlc3MgdG8gbGVnYWN5IGZvcm1hdCBzaW5jZSB0aGUgYXBpIHJldHVybnMgdGhlIGFkZHJlc3NcbiAgICAgICAgLy8gaW4gbm9uIGxlZ2FjeSBmb3JtYXQuIEhvd2V2ZXIsIHdlIHdhbnQgdG8ga2VlcCB0aGUgYWRkcmVzcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHJlc3BvbnNlIHNpbmNlIHdlXG4gICAgICAgIC8vIGFyZSBnb2luZyB0byBoaXQgdGhlIEFQSSBhZ2FpbiB0byBmZXRjaCBhZGRyZXNzIHVuc3BlbnRzLlxuICAgICAgICBjb25zdCBjYW5vbmljYWxBZGRyZXNzID0gY29pbi5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKTtcbiAgICAgICAgbGV0IGlzV2FsbGV0T3duZWQgPSBhd2FpdCBpc1dhbGxldEFkZHJlc3Mod2FsbGV0LCBjYW5vbmljYWxBZGRyZXNzKTtcblxuICAgICAgICAvLyBGb3IgTFRDIGNyb3NzLWNoYWluIHJlY292ZXJ5OiBpZiB0aGUgYWRkcmVzcyBpc24ndCBmb3VuZCwgdHJ5IHRoZSBsZWdhY3kgZm9ybWF0LlxuICAgICAgICAvLyBXaGVuIExUQyBpcyBzZW50IHRvIGEgQlRDIGFkZHJlc3MsIHRoZSBMVEMgYmxvY2tjaGFpbiByZXR1cm5zIE0uLi4gYWRkcmVzc2VzXG4gICAgICAgIC8vIGJ1dCB0aGUgQlRDIHdhbGxldCBzdG9yZXMgYWRkcmVzc2VzIGluIDMuLi4gZm9ybWF0LlxuICAgICAgICBpZiAoIWlzV2FsbGV0T3duZWQgJiYgY29pbi5nZXRGYW1pbHkoKSA9PT0gJ2x0YycpIHtcbiAgICAgICAgICBjb25zdCBsZWdhY3lBZGRyZXNzID0gY29udmVydEx0Y0FkZHJlc3NUb0xlZ2FjeUZvcm1hdChvdXRwdXQuYWRkcmVzcywgY29pbi5uZXR3b3JrKTtcbiAgICAgICAgICBpZiAobGVnYWN5QWRkcmVzcyAhPT0gb3V0cHV0LmFkZHJlc3MpIHtcbiAgICAgICAgICAgIGlzV2FsbGV0T3duZWQgPSBhd2FpdCBpc1dhbGxldEFkZHJlc3Mod2FsbGV0LCBsZWdhY3lBZGRyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNXYWxsZXRPd25lZCA/IG91dHB1dC5hZGRyZXNzIDogbnVsbDtcbiAgICAgIH0pXG4gICAgKVxuICApLmZpbHRlcigoYWRkcmVzcykgPT4gYWRkcmVzcyAhPT0gbnVsbCk7XG5cbiAgY29uc3QgdW5zcGVudHMgPSBhd2FpdCBhcGkuZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMod2FsbGV0QWRkcmVzc2VzIGFzIHN0cmluZ1tdKTtcbiAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVjb3ZlcnkgdW5zcGVudHMgZm91bmQuYCk7XG4gIH1cbiAgLy8gdGhlIGFwaSBtYXkgcmV0dXJuIGNhc2hhZGRyJ3MgaW5zdGVhZCBvZiBsZWdhY3kgZm9yIEJDSCBhbmQgQkNIQVxuICAvLyBkb3duc3RyZWFtIHByb2Nlc3NlcydzIG9ubHkgZXhwZWN0IGxlZ2FjeSBhZGRyZXNzZXNcbiAgcmV0dXJuIHVuc3BlbnRzLm1hcCgocmVjb3ZlcnlPdXRwdXQpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVjb3ZlcnlPdXRwdXQsXG4gICAgICBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3MocmVjb3ZlcnlPdXRwdXQuYWRkcmVzcyksXG4gICAgICB2YWx1ZTogdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oQmlnSW50KHJlY292ZXJ5T3V0cHV0LnZhbHVlKSwgYW1vdW50VHlwZSksXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGF0YSByZXF1aXJlZCBmb3IgYWRkcmVzcyBhbmQgc2lnbmF0dXJlIGRlcml2YXRpb25cbiAqL1xudHlwZSBTY3JpcHRJZCA9IHtcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNjcmlwdElkKGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxLCBzY3JpcHQ6IEJ1ZmZlcik6IFByb21pc2U8U2NyaXB0SWQ+IHtcbiAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHNjcmlwdCwgY29pbi5uZXR3b3JrKTtcbiAgbGV0IGFkZHJlc3NEYXRhOiB7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfTtcbiAgaWYgKHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkge1xuICAgIGFkZHJlc3NEYXRhID0gYXdhaXQgd2FsbGV0LmdldEFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICB9IGVsc2Uge1xuICAgIGFkZHJlc3NEYXRhID0gYXdhaXQgKHdhbGxldCBhcyBXYWxsZXRWMSkuYWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBhZGRyZXNzRGF0YS5jaGFpbiA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGFkZHJlc3NEYXRhLmluZGV4ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IGNoYWluOiBhZGRyZXNzRGF0YS5jaGFpbiwgaW5kZXg6IGFkZHJlc3NEYXRhLmluZGV4IH07XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYWRkcmVzcyBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGFkZHJlc3NEYXRhKX1gKTtcbn1cblxuLyoqXG4gKiBMb29rdXAgYWRkcmVzcyBkYXRhIGZyb20gdW5zcGVudHMgb24gc291cmNlQ29pbiBpbiBhZGRyZXNzIGRhdGFiYXNlIG9mIHJlY292ZXJ5Q29pbi5cbiAqIFJldHVybiBmdWxsIHdhbGxldFVuc3BlbnRzIGluY2x1ZGluZyBzY3JpcHRJZCBpbiBzb3VyY2VDb2luIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gc291cmNlQ29pblxuICogQHBhcmFtIHJlY292ZXJ5Q29pblxuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gd2FsbGV0XG4gKiBAcmV0dXJuIHdhbGxldFVuc3BlbnRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvV2FsbGV0VW5zcGVudHM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIHNvdXJjZUNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHJlY292ZXJ5Q29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgdW5zcGVudHM6IFVuc3BlbnQ8VE51bWJlcj5bXSxcbiAgd2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjFcbik6IFByb21pc2U8V2FsbGV0VW5zcGVudDxUTnVtYmVyPltdPiB7XG4gIGNvbnN0IGFkZHJlc3NlcyA9IG5ldyBTZXQodW5zcGVudHMubWFwKCh1KSA9PiB1LmFkZHJlc3MpKTtcbiAgY29uc3Qgd2FsbGV0VW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYWRkcmVzcyBvZiBhZGRyZXNzZXMpIHtcbiAgICBsZXQgc2NyaXB0SWQ7XG4gICAgdHJ5IHtcbiAgICAgIHNjcmlwdElkID0gYXdhaXQgZ2V0U2NyaXB0SWQocmVjb3ZlcnlDb2luLCB3YWxsZXQsIHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChhZGRyZXNzLCBzb3VyY2VDb2luLm5ldHdvcmspKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBlcnJvciBnZXR0aW5nIHNjcmlwdElkIGZvciAke2FkZHJlc3N9OmAsIGUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcmVkVW5zcGVudHMgPSB1bnNwZW50c1xuICAgICAgLmZpbHRlcigodSkgPT4gdS5hZGRyZXNzID09PSBhZGRyZXNzKVxuICAgICAgLm1hcCgodSkgPT4gKHtcbiAgICAgICAgLi4udSxcbiAgICAgICAgLi4uc2NyaXB0SWQsXG4gICAgICB9KSk7XG4gICAgd2FsbGV0VW5zcGVudHMucHVzaCguLi5maWx0ZXJlZFVuc3BlbnRzKTtcbiAgfVxuXG4gIHJldHVybiB3YWxsZXRVbnNwZW50cztcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29pblxuICogQHJldHVybiBmZWVSYXRlIGZvciB0cmFuc2FjdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGZWVSYXRlU2F0VkIoY29pbjogQWJzdHJhY3RVdHhvQ29pbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIC8vIFRPRE86IHVzZSBmZWVSYXRlIEFQSVxuICBjb25zdCBmZWVSYXRlID0ge1xuICAgIGJjaDogMjAsXG4gICAgdGJjaDogMjAsXG4gICAgYmNoYTogMjAsXG4gICAgdGJjaGE6IDIwLFxuICAgIGJzdjogMjAsXG4gICAgdGJzdjogMjAsXG4gICAgYnRjOiA4MCxcbiAgICB0YnRjOiA4MCxcbiAgICB0YnRjc2lnOiA4MCxcbiAgICB0YnRjNDogODAsXG4gICAgdGJ0Y2Jnc2lnOiA4MCxcbiAgICBsdGM6IDEwMCxcbiAgICB0bHRjOiAxMDAsXG4gICAgZG9nZTogMTAwMCxcbiAgICB0ZG9nZTogMTAwMCxcbiAgfVtjb2luLmdldENoYWluKCldO1xuXG4gIGlmICghZmVlUmF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gZmVlUmF0ZSBmb3IgJHtjb2luLmdldENoYWluKCl9YCk7XG4gIH1cblxuICByZXR1cm4gZmVlUmF0ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0geHBydlxuICogQHBhcmFtIHBhc3NwaHJhc2VcbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gc2lnbmluZyBrZXlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHJ2KHhwcnY/OiBzdHJpbmcsIHBhc3NwaHJhc2U/OiBzdHJpbmcsIHdhbGxldD86IElXYWxsZXQgfCBXYWxsZXRWMSk6IFByb21pc2U8QklQMzJJbnRlcmZhY2U+IHtcbiAgaWYgKHhwcnYpIHtcbiAgICBjb25zdCBrZXkgPSBiaXAzMi5mcm9tQmFzZTU4KHhwcnYpO1xuICAgIGlmIChrZXkuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBpZiAoIXdhbGxldCB8fCAhcGFzc3BocmFzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8geHBydiBnaXZlbjogbmVlZCB3YWxsZXQgYW5kIHBhc3NwaHJhc2UgdG8gY29udGludWVgKTtcbiAgfVxuXG4gIGxldCBlbmNyeXB0ZWRQcnY6IHN0cmluZztcbiAgaWYgKHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkge1xuICAgIGVuY3J5cHRlZFBydiA9IChhd2FpdCB3YWxsZXQuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpLmVuY3J5cHRlZFBydjtcbiAgfSBlbHNlIHtcbiAgICBlbmNyeXB0ZWRQcnYgPSAoYXdhaXQgKHdhbGxldCBhcyBXYWxsZXRWMSkuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpLmVuY3J5cHRlZFhwcnY7XG4gIH1cblxuICByZXR1cm4gZ2V0UHJ2KGRlY3J5cHQocGFzc3BocmFzZSwgZW5jcnlwdGVkUHJ2KSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc3dlZXAgdHJhbnNhY3Rpb24gZm9yIGNyb3NzLWNoYWluIHJlY292ZXJ5IHVzaW5nIFBTQlRcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcGFyYW0gd2FsbGV0S2V5c1xuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gdGFyZ2V0QWRkcmVzc1xuICogQHBhcmFtIGZlZVJhdGVTYXRWQlxuICogQHJldHVybiB1bnNpZ25lZCBQU0JUXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN3ZWVwVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10sXG4gIHRhcmdldEFkZHJlc3M6IHN0cmluZyxcbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXJcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCBpbnB1dFZhbHVlID0gdW5zcGVudFN1bTxiaWdpbnQ+KFxuICAgIHVuc3BlbnRzLm1hcCgodSkgPT4gKHsgLi4udSwgdmFsdWU6IEJpZ0ludCh1LnZhbHVlKSB9KSksXG4gICAgJ2JpZ2ludCdcbiAgKTtcbiAgY29uc3QgdnNpemUgPSBEaW1lbnNpb25zLmZyb21VbnNwZW50cyh1bnNwZW50cywge1xuICAgIHAydHI6IHsgc2NyaXB0UGF0aExldmVsOiAxIH0sXG4gICAgcDJ0ck11c2lnMjogeyBzY3JpcHRQYXRoTGV2ZWw6IHVuZGVmaW5lZCB9LFxuICB9KVxuICAgIC5wbHVzKERpbWVuc2lvbnMuZnJvbU91dHB1dCh7IHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHRhcmdldEFkZHJlc3MsIG5ldHdvcmspIH0pKVxuICAgIC5nZXRWU2l6ZSgpO1xuICBjb25zdCBmZWUgPSBCaWdJbnQoTWF0aC5yb3VuZCh2c2l6ZSAqIGZlZVJhdGVTYXRWQikpO1xuXG4gIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcbiAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCB3YWxsZXRLZXlzKTtcblxuICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PiB7XG4gICAgdXR4b2xpYi5iaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KFxuICAgICAgcHNidCxcbiAgICAgIHsgLi4udW5zcGVudCwgdmFsdWU6IEJpZ0ludCh1bnNwZW50LnZhbHVlKSB9LFxuICAgICAgd2FsbGV0S2V5cyxcbiAgICAgICd1c2VyJyxcbiAgICAgICdiYWNrdXAnLFxuICAgICAgeyBza2lwTm9uV2l0bmVzc1V0eG86IHRydWUgfVxuICAgICk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlY292ZXJ5T3V0cHV0U2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHRhcmdldEFkZHJlc3MsIG5ldHdvcmspO1xuICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDogcmVjb3ZlcnlPdXRwdXRTY3JpcHQsIHZhbHVlOiBpbnB1dFZhbHVlIC0gZmVlIH0pO1xuXG4gIHJldHVybiBwc2J0O1xufVxuXG50eXBlIFJlY292ZXJQYXJhbXMgPSB7XG4gIC8qKiBXYWxsZXQgSUQgKGNhbiBiZSB2MSB3YWxsZXQgb3IgdjIgd2FsbGV0KSAqL1xuICB3YWxsZXRJZDogc3RyaW5nO1xuICAvKiogQ29pbiB0byBjcmVhdGUgdGhlIHRyYW5zYWN0aW9uIGZvciAqL1xuICBzb3VyY2VDb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICAvKiogQ29pbiB0aGF0IHdhbGxldCBrZXlzIHdlcmUgc2V0IHVwIGZvciAqL1xuICByZWNvdmVyeUNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIC8qKiBTb3VyY2UgY29pbiB0cmFuc2FjdGlvbiB0byByZWNvdmVyIG91dHB1dHMgZnJvbSAoc291cmNlQ29pbikgKi9cbiAgdHhpZDogc3RyaW5nO1xuICAvKiogU291cmNlIGNvaW4gYWRkcmVzcyB0byBzZW5kIHRoZSBmdW5kcyB0byAqL1xuICByZWNvdmVyeUFkZHJlc3M6IHN0cmluZztcbiAgLyoqIElmIHNldCwgZGVjcnlwdHMgcHJpdmF0ZSBrZXkgYW5kIHNpZ25zIHRyYW5zYWN0aW9uICovXG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIC8qKiBJZiBzZXQsIHNpZ25zIHRyYW5zYWN0aW9uICovXG4gIHhwcnY/OiBzdHJpbmc7XG4gIC8qKiBmb3IgdXR4byBjb2lucyBvdGhlciB0aGFuIFtCVEMsVEJUQ10gdGhpcyBpcyBhIEJsb2NrIENoYWlyIGFwaSBrZXkgKiovXG4gIGFwaUtleT86IHN0cmluZztcbn07XG5cbi8qKlxuICogUmVjb3ZlciB3YWxsZXQgZGVwb3NpdHMgdGhhdCB3ZXJlIHJlY2VpdmVkIG9uIHRoZSB3cm9uZyBibG9ja2NoYWluXG4gKiAoZm9yIGluc3RhbmNlIGJpdGNvaW4gZGVwb3NpdHMgdGhhdCB3ZXJlIHJlY2VpdmVkIGZvciBhIGxpdGVjb2luIHdhbGxldCkuXG4gKlxuICogRmV0Y2hlcyB0aGUgdW5zcGVudCBkYXRhIGZyb20gQml0R28ncyBwdWJsaWMgYmxvY2tjaGFpbiBBUEkgYW5kIHRoZSBzY3JpcHQgZGF0YSBmcm9tIHRoZSB1c2VyJ3NcbiAqIHdhbGxldC5cbiAqXG4gKiBAcGFyYW0ge0JpdEdvQmFzZX0gYml0Z29cbiAqIEBwYXJhbSB7UmVjb3ZlclBhcmFtc30gcGFyYW1zXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyQ3Jvc3NDaGFpbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgcGFyYW1zOiBSZWNvdmVyUGFyYW1zXG4pOiBQcm9taXNlPENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZDxUTnVtYmVyPiB8IENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkPFROdW1iZXI+PiB7XG4gIGNvbnN0IHdhbGxldCA9IGF3YWl0IGdldFdhbGxldChiaXRnbywgcGFyYW1zLnJlY292ZXJ5Q29pbiwgcGFyYW1zLndhbGxldElkKTtcbiAgY29uc3QgdW5zcGVudHMgPSBhd2FpdCBnZXRBbGxSZWNvdmVyeU91dHB1dHM8VE51bWJlcj4oXG4gICAgcGFyYW1zLnNvdXJjZUNvaW4sXG4gICAgcGFyYW1zLnR4aWQsXG4gICAgcGFyYW1zLnNvdXJjZUNvaW4uYW1vdW50VHlwZSxcbiAgICB3YWxsZXQsXG4gICAgcGFyYW1zLmFwaUtleVxuICApO1xuICBjb25zdCB3YWxsZXRVbnNwZW50cyA9IGF3YWl0IHRvV2FsbGV0VW5zcGVudHM8VE51bWJlcj4ocGFyYW1zLnNvdXJjZUNvaW4sIHBhcmFtcy5yZWNvdmVyeUNvaW4sIHVuc3BlbnRzLCB3YWxsZXQpO1xuICBjb25zdCB3YWxsZXRLZXlzID0gYXdhaXQgZ2V0V2FsbGV0S2V5cyhwYXJhbXMucmVjb3ZlcnlDb2luLCB3YWxsZXQpO1xuICBjb25zdCBwcnYgPVxuICAgIHBhcmFtcy54cHJ2IHx8IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlID8gYXdhaXQgZ2V0UHJ2KHBhcmFtcy54cHJ2LCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgd2FsbGV0KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZmVlUmF0ZVNhdFZCID0gYXdhaXQgZ2V0RmVlUmF0ZVNhdFZCKHBhcmFtcy5zb3VyY2VDb2luKTtcblxuICAvLyBDcmVhdGUgUFNCVCBmb3IgYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkIHJlY292ZXJ5XG4gIGNvbnN0IHBzYnQgPSBjcmVhdGVTd2VlcFRyYW5zYWN0aW9uPFROdW1iZXI+KFxuICAgIHBhcmFtcy5zb3VyY2VDb2luLm5ldHdvcmssXG4gICAgd2FsbGV0S2V5cyxcbiAgICB3YWxsZXRVbnNwZW50cyxcbiAgICBwYXJhbXMucmVjb3ZlcnlBZGRyZXNzLFxuICAgIGZlZVJhdGVTYXRWQlxuICApO1xuXG4gIC8vIEZvciB1bnNpZ25lZCByZWNvdmVyeSwgcmV0dXJuIHVuc2lnbmVkIFBTQlQgaGV4XG4gIGlmICghcHJ2KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4SGV4OiBwc2J0LnRvSGV4KCksXG4gICAgICB3YWxsZXRJZDogcGFyYW1zLndhbGxldElkLFxuICAgICAgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5QWRkcmVzcyxcbiAgICAgIGNvaW46IHBhcmFtcy5zb3VyY2VDb2luLmdldENoYWluKCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZvciBzaWduZWQgcmVjb3ZlcnksIHNpZ24gdGhlIFBTQlQgd2l0aCB1c2VyIGtleSBhbmQgcmV0dXJuIGhhbGYtc2lnbmVkIFBTQlRcbiAgc2lnbkFuZFZlcmlmeVBzYnQocHNidCwgcHJ2LCB7IGlzTGFzdFNpZ25hdHVyZTogZmFsc2UgfSk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4ocHNidC50eE91dHB1dHNbMF0udmFsdWUsIHBhcmFtcy5zb3VyY2VDb2luLmFtb3VudFR5cGUpO1xuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogd2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0ID8gMiA6IDEsXG4gICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXRJZCxcbiAgICB0eEhleDogcHNidC50b0hleCgpLFxuICAgIHNvdXJjZUNvaW46IHBhcmFtcy5zb3VyY2VDb2luLmdldENoYWluKCksXG4gICAgcmVjb3ZlcnlDb2luOiBwYXJhbXMucmVjb3ZlcnlDb2luLmdldENoYWluKCksXG4gICAgcmVjb3ZlcnlBbW91bnQsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,30 @@
1
+ import * as utxolib from '@bitgo/utxo-lib';
2
+ type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
3
+ type WalletUnspent<TNumber extends number | bigint> = utxolib.bitgo.WalletUnspent<TNumber>;
4
+ /**
5
+ * Backend to use for PSBT creation.
6
+ * - 'wasm-utxo': Use wasm-utxo for PSBT creation (default)
7
+ * - 'utxolib': Use utxolib for PSBT creation (legacy)
8
+ */
9
+ export type PsbtBackend = 'wasm-utxo' | 'utxolib';
10
+ interface CreateBackupKeyRecoveryPsbtOptions {
11
+ feeRateSatVB: number;
12
+ recoveryDestination: string;
13
+ keyRecoveryServiceFee: bigint;
14
+ keyRecoveryServiceFeeAddress: string | undefined;
15
+ /** Block height for Zcash networks (required to determine consensus branch ID) */
16
+ blockHeight?: number;
17
+ }
18
+ /**
19
+ * Create a backup key recovery PSBT.
20
+ *
21
+ * @param network - The network for the PSBT
22
+ * @param rootWalletKeys - The wallet keys
23
+ * @param unspents - The unspents to include in the PSBT
24
+ * @param options - Options for creating the PSBT
25
+ * @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
26
+ */
27
+ export declare function createBackupKeyRecoveryPsbt(network: utxolib.Network, rootWalletKeys: RootWalletKeys, unspents: WalletUnspent<bigint>[], options: CreateBackupKeyRecoveryPsbtOptions, backend?: PsbtBackend): utxolib.bitgo.UtxoPsbt;
28
+ export declare function getRecoveryAmount(psbt: utxolib.bitgo.UtxoPsbt, address: string): bigint;
29
+ export {};
30
+ //# sourceMappingURL=psbt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../../src/recovery/psbt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAI3C,KAAK,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;AACnD,KAAK,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAM3F;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAuClD,UAAU,kCAAkC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA0JD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,OAAO,EAAE,kCAAkC,EAC3C,OAAO,GAAE,WAAyB,GACjC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAUxB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAOvF"}
@@ -0,0 +1,167 @@
1
+ import * as utxolib from '@bitgo/utxo-lib';
2
+ import { Dimensions } from '@bitgo/unspents';
3
+ import { fixedScriptWallet } from '@bitgo/wasm-utxo';
4
+ const { chainCodesP2tr, chainCodesP2trMusig2 } = utxolib.bitgo;
5
+ /**
6
+ * Check if a chain code is for a taproot script type
7
+ */
8
+ function isTaprootChain(chain) {
9
+ return (chainCodesP2tr.includes(chain) || chainCodesP2trMusig2.includes(chain));
10
+ }
11
+ /**
12
+ * Convert utxolib Network to wasm-utxo network name
13
+ */
14
+ function toNetworkName(network) {
15
+ const networkName = utxolib.getNetworkName(network);
16
+ if (!networkName) {
17
+ throw new Error(`Invalid network`);
18
+ }
19
+ return networkName;
20
+ }
21
+ class InsufficientFundsError extends Error {
22
+ constructor(totalInputAmount, approximateFee, krsFee, recoveryAmount) {
23
+ super(`This wallet's balance is too low to pay the fees specified by the KRS provider.` +
24
+ `Existing balance on wallet: ${totalInputAmount.toString()}. ` +
25
+ `Estimated network fee for the recovery transaction: ${approximateFee.toString()}` +
26
+ `KRS fee to pay: ${krsFee.toString()}. ` +
27
+ `After deducting fees, your total recoverable balance is ${recoveryAmount.toString()}`);
28
+ this.totalInputAmount = totalInputAmount;
29
+ this.approximateFee = approximateFee;
30
+ this.krsFee = krsFee;
31
+ this.recoveryAmount = recoveryAmount;
32
+ }
33
+ }
34
+ /**
35
+ * Create a backup key recovery PSBT using utxolib (legacy implementation)
36
+ */
37
+ function createBackupKeyRecoveryPsbtUtxolib(network, rootWalletKeys, unspents, options) {
38
+ const { feeRateSatVB, recoveryDestination, keyRecoveryServiceFee, keyRecoveryServiceFeeAddress } = options;
39
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
40
+ utxolib.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
41
+ unspents.forEach((unspent) => {
42
+ utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, rootWalletKeys, 'user', 'backup');
43
+ });
44
+ let dimensions = Dimensions.fromPsbt(psbt).plus(Dimensions.fromOutput({ script: utxolib.address.toOutputScript(recoveryDestination, network) }));
45
+ if (keyRecoveryServiceFeeAddress) {
46
+ dimensions = dimensions.plus(Dimensions.fromOutput({
47
+ script: utxolib.address.toOutputScript(keyRecoveryServiceFeeAddress, network),
48
+ }));
49
+ }
50
+ const approximateFee = BigInt(dimensions.getVSize() * feeRateSatVB);
51
+ const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
52
+ const recoveryAmount = totalInputAmount - approximateFee - keyRecoveryServiceFee;
53
+ if (recoveryAmount < BigInt(0)) {
54
+ throw new InsufficientFundsError(totalInputAmount, approximateFee, keyRecoveryServiceFee, recoveryAmount);
55
+ }
56
+ psbt.addOutput({ script: utxolib.address.toOutputScript(recoveryDestination, network), value: recoveryAmount });
57
+ if (keyRecoveryServiceFeeAddress) {
58
+ psbt.addOutput({
59
+ script: utxolib.address.toOutputScript(keyRecoveryServiceFeeAddress, network),
60
+ value: keyRecoveryServiceFee,
61
+ });
62
+ }
63
+ return psbt;
64
+ }
65
+ /**
66
+ * Check if the network is a Zcash network
67
+ */
68
+ function isZcashNetwork(networkName) {
69
+ return networkName === 'zcash' || networkName === 'zcashTest';
70
+ }
71
+ /**
72
+ * Default block heights for Zcash networks if not provided.
73
+ * These should be set to a height after the latest network upgrade.
74
+ * TODO(BTC-2901): get the height from blockchair API instead of hardcoding.
75
+ */
76
+ const ZCASH_DEFAULT_BLOCK_HEIGHTS = {
77
+ zcash: 3146400,
78
+ zcashTest: 3536500,
79
+ };
80
+ /**
81
+ * Create a backup key recovery PSBT using wasm-utxo
82
+ */
83
+ function createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, options) {
84
+ const { feeRateSatVB, recoveryDestination, keyRecoveryServiceFee, keyRecoveryServiceFeeAddress } = options;
85
+ const networkName = toNetworkName(network);
86
+ // Create PSBT with wasm-utxo and add wallet inputs
87
+ // wasm-utxo's RootWalletKeys.from() accepts utxolib's RootWalletKeys format (IWalletKeys interface)
88
+ let wasmPsbt;
89
+ if (isZcashNetwork(networkName)) {
90
+ // For Zcash, use ZcashBitGoPsbt which requires block height to determine consensus branch ID
91
+ const blockHeight = options.blockHeight ?? ZCASH_DEFAULT_BLOCK_HEIGHTS[networkName];
92
+ wasmPsbt = fixedScriptWallet.ZcashBitGoPsbt.createEmpty(networkName, rootWalletKeys, {
93
+ blockHeight,
94
+ });
95
+ }
96
+ else {
97
+ wasmPsbt = fixedScriptWallet.BitGoPsbt.createEmpty(networkName, rootWalletKeys);
98
+ }
99
+ unspents.forEach((unspent) => {
100
+ const { txid, vout } = utxolib.bitgo.parseOutputId(unspent.id);
101
+ const signPath = isTaprootChain(unspent.chain)
102
+ ? { signer: 'user', cosigner: 'backup' }
103
+ : undefined;
104
+ // prevTx may be added dynamically in backupKeyRecovery for non-segwit inputs
105
+ const prevTx = unspent.prevTx;
106
+ wasmPsbt.addWalletInput({
107
+ txid,
108
+ vout,
109
+ value: unspent.value,
110
+ prevTx: prevTx,
111
+ }, rootWalletKeys, {
112
+ scriptId: { chain: unspent.chain, index: unspent.index },
113
+ signPath,
114
+ });
115
+ });
116
+ // Convert wasm-utxo PSBT to utxolib PSBT for dimension calculation and output addition
117
+ const psbt = utxolib.bitgo.createPsbtFromBuffer(Buffer.from(wasmPsbt.serialize()), network);
118
+ let dimensions = Dimensions.fromPsbt(psbt).plus(Dimensions.fromOutput({ script: utxolib.address.toOutputScript(recoveryDestination, network) }));
119
+ if (keyRecoveryServiceFeeAddress) {
120
+ dimensions = dimensions.plus(Dimensions.fromOutput({
121
+ script: utxolib.address.toOutputScript(keyRecoveryServiceFeeAddress, network),
122
+ }));
123
+ }
124
+ const approximateFee = BigInt(dimensions.getVSize() * feeRateSatVB);
125
+ const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
126
+ const recoveryAmount = totalInputAmount - approximateFee - keyRecoveryServiceFee;
127
+ if (recoveryAmount < BigInt(0)) {
128
+ throw new InsufficientFundsError(totalInputAmount, approximateFee, keyRecoveryServiceFee, recoveryAmount);
129
+ }
130
+ psbt.addOutput({ script: utxolib.address.toOutputScript(recoveryDestination, network), value: recoveryAmount });
131
+ if (keyRecoveryServiceFeeAddress) {
132
+ psbt.addOutput({
133
+ script: utxolib.address.toOutputScript(keyRecoveryServiceFeeAddress, network),
134
+ value: keyRecoveryServiceFee,
135
+ });
136
+ }
137
+ return psbt;
138
+ }
139
+ /**
140
+ * Create a backup key recovery PSBT.
141
+ *
142
+ * @param network - The network for the PSBT
143
+ * @param rootWalletKeys - The wallet keys
144
+ * @param unspents - The unspents to include in the PSBT
145
+ * @param options - Options for creating the PSBT
146
+ * @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
147
+ */
148
+ export function createBackupKeyRecoveryPsbt(network, rootWalletKeys, unspents, options, backend = 'wasm-utxo') {
149
+ if (options.keyRecoveryServiceFee > 0 && !options.keyRecoveryServiceFeeAddress) {
150
+ throw new Error('keyRecoveryServiceFeeAddress is required when keyRecoveryServiceFee is provided');
151
+ }
152
+ if (backend === 'wasm-utxo') {
153
+ return createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, options);
154
+ }
155
+ else {
156
+ return createBackupKeyRecoveryPsbtUtxolib(network, rootWalletKeys, unspents, options);
157
+ }
158
+ }
159
+ export function getRecoveryAmount(psbt, address) {
160
+ const recoveryOutputScript = utxolib.address.toOutputScript(address, psbt.network);
161
+ const output = psbt.txOutputs.find((o) => o.script.equals(recoveryOutputScript));
162
+ if (!output) {
163
+ throw new Error(`Recovery destination output not found in PSBT: ${address}`);
164
+ }
165
+ return output.value;
166
+ }
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWNvdmVyeS9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQztBQUtwRSxNQUFNLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQVcvRDs7R0FFRztBQUNILFNBQVMsY0FBYyxDQUFDLEtBQWdCO0lBQ3RDLE9BQU8sQ0FDSixjQUFvQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSyxvQkFBMEMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQ3JILENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxPQUF3QjtJQUM3QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLHNCQUF1QixTQUFRLEtBQUs7SUFDeEMsWUFDUyxnQkFBd0IsRUFDeEIsY0FBc0IsRUFDdEIsTUFBYyxFQUNkLGNBQXNCO1FBRTdCLEtBQUssQ0FDSCxpRkFBaUY7WUFDL0UsK0JBQStCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJO1lBQzlELHVEQUF1RCxjQUFjLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbEYsbUJBQW1CLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSTtZQUN4QywyREFBMkQsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ3pGLENBQUM7UUFYSyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVE7UUFDeEIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFRO0lBUy9CLENBQUM7Q0FDRjtBQVdEOztHQUVHO0FBQ0gsU0FBUyxrQ0FBa0MsQ0FDekMsT0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsUUFBaUMsRUFDakMsT0FBMkM7SUFFM0MsTUFBTSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSw0QkFBNEIsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUUzRyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbkQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hGLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzdDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUNoRyxDQUFDO0lBRUYsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1FBQ2pDLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUMxQixVQUFVLENBQUMsVUFBVSxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsRUFBRSxPQUFPLENBQUM7U0FDOUUsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNwRSxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RSxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsR0FBRyxjQUFjLEdBQUcscUJBQXFCLENBQUM7SUFFakYsSUFBSSxjQUFjLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM1RyxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUVoSCxJQUFJLDRCQUE0QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNiLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsRUFBRSxPQUFPLENBQUM7WUFDN0UsS0FBSyxFQUFFLHFCQUFxQjtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxXQUFzQztJQUM1RCxPQUFPLFdBQVcsS0FBSyxPQUFPLElBQUksV0FBVyxLQUFLLFdBQVcsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sMkJBQTJCLEdBQTJCO0lBQzFELEtBQUssRUFBRSxPQUFPO0lBQ2QsU0FBUyxFQUFFLE9BQU87Q0FDbkIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsU0FBUywrQkFBK0IsQ0FDdEMsT0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsUUFBaUMsRUFDakMsT0FBMkM7SUFFM0MsTUFBTSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSw0QkFBNEIsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUUzRyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFM0MsbURBQW1EO0lBQ25ELG9HQUFvRztJQUNwRyxJQUFJLFFBQXFDLENBQUM7SUFFMUMsSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNoQyw2RkFBNkY7UUFDN0YsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSwyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRixRQUFRLEdBQUcsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxXQUFvQyxFQUFFLGNBQWMsRUFBRTtZQUM1RyxXQUFXO1NBQ1osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDTixRQUFRLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUMzQixNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRCxNQUFNLFFBQVEsR0FBMkMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDcEYsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO1lBQ3hDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFZCw2RUFBNkU7UUFDN0UsTUFBTSxNQUFNLEdBQUksT0FBdUQsQ0FBQyxNQUFNLENBQUM7UUFFL0UsUUFBUSxDQUFDLGNBQWMsQ0FDckI7WUFDRSxJQUFJO1lBQ0osSUFBSTtZQUNKLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixNQUFNLEVBQUUsTUFBTTtTQUNmLEVBQ0QsY0FBYyxFQUNkO1lBQ0UsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDeEQsUUFBUTtTQUNULENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsdUZBQXVGO0lBQ3ZGLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1RixJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDN0MsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQ2hHLENBQUM7SUFFRixJQUFJLDRCQUE0QixFQUFFLENBQUM7UUFDakMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQzFCLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDcEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLDRCQUE0QixFQUFFLE9BQU8sQ0FBQztTQUM5RSxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixHQUFHLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQztJQUVqRixJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksc0JBQXNCLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBRWhILElBQUksNEJBQTRCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2IsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLDRCQUE0QixFQUFFLE9BQU8sQ0FBQztZQUM3RSxLQUFLLEVBQUUscUJBQXFCO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsT0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsUUFBaUMsRUFDakMsT0FBMkMsRUFDM0MsVUFBdUIsV0FBVztJQUVsQyxJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksS0FBSyxDQUFDLGlGQUFpRixDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzVCLE9BQU8sK0JBQStCLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckYsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLGtDQUFrQyxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hGLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQTRCLEVBQUUsT0FBZTtJQUM3RSxNQUFNLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUNqRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICdAYml0Z28vdW5zcGVudHMnO1xuaW1wb3J0IHsgZml4ZWRTY3JpcHRXYWxsZXQsIHV0eG9saWJDb21wYXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxudHlwZSBSb290V2FsbGV0S2V5cyA9IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXM7XG50eXBlIFdhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8VE51bWJlcj47XG5cbmNvbnN0IHsgY2hhaW5Db2Rlc1AydHIsIGNoYWluQ29kZXNQMnRyTXVzaWcyIH0gPSB1dHhvbGliLmJpdGdvO1xuXG50eXBlIENoYWluQ29kZSA9IHV0eG9saWIuYml0Z28uQ2hhaW5Db2RlO1xuXG4vKipcbiAqIEJhY2tlbmQgdG8gdXNlIGZvciBQU0JUIGNyZWF0aW9uLlxuICogLSAnd2FzbS11dHhvJzogVXNlIHdhc20tdXR4byBmb3IgUFNCVCBjcmVhdGlvbiAoZGVmYXVsdClcbiAqIC0gJ3V0eG9saWInOiBVc2UgdXR4b2xpYiBmb3IgUFNCVCBjcmVhdGlvbiAobGVnYWN5KVxuICovXG5leHBvcnQgdHlwZSBQc2J0QmFja2VuZCA9ICd3YXNtLXV0eG8nIHwgJ3V0eG9saWInO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgY2hhaW4gY29kZSBpcyBmb3IgYSB0YXByb290IHNjcmlwdCB0eXBlXG4gKi9cbmZ1bmN0aW9uIGlzVGFwcm9vdENoYWluKGNoYWluOiBDaGFpbkNvZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAoY2hhaW5Db2Rlc1AydHIgYXMgcmVhZG9ubHkgbnVtYmVyW10pLmluY2x1ZGVzKGNoYWluKSB8fCAoY2hhaW5Db2Rlc1AydHJNdXNpZzIgYXMgcmVhZG9ubHkgbnVtYmVyW10pLmluY2x1ZGVzKGNoYWluKVxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnQgdXR4b2xpYiBOZXR3b3JrIHRvIHdhc20tdXR4byBuZXR3b3JrIG5hbWVcbiAqL1xuZnVuY3Rpb24gdG9OZXR3b3JrTmFtZShuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmspOiB1dHhvbGliQ29tcGF0LlV0eG9saWJOYW1lIHtcbiAgY29uc3QgbmV0d29ya05hbWUgPSB1dHhvbGliLmdldE5ldHdvcmtOYW1lKG5ldHdvcmspO1xuICBpZiAoIW5ldHdvcmtOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5ldHdvcmtgKTtcbiAgfVxuICByZXR1cm4gbmV0d29ya05hbWU7XG59XG5cbmNsYXNzIEluc3VmZmljaWVudEZ1bmRzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0b3RhbElucHV0QW1vdW50OiBiaWdpbnQsXG4gICAgcHVibGljIGFwcHJveGltYXRlRmVlOiBiaWdpbnQsXG4gICAgcHVibGljIGtyc0ZlZTogYmlnaW50LFxuICAgIHB1YmxpYyByZWNvdmVyeUFtb3VudDogYmlnaW50XG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgYFRoaXMgd2FsbGV0J3MgYmFsYW5jZSBpcyB0b28gbG93IHRvIHBheSB0aGUgZmVlcyBzcGVjaWZpZWQgYnkgdGhlIEtSUyBwcm92aWRlci5gICtcbiAgICAgICAgYEV4aXN0aW5nIGJhbGFuY2Ugb24gd2FsbGV0OiAke3RvdGFsSW5wdXRBbW91bnQudG9TdHJpbmcoKX0uIGAgK1xuICAgICAgICBgRXN0aW1hdGVkIG5ldHdvcmsgZmVlIGZvciB0aGUgcmVjb3ZlcnkgdHJhbnNhY3Rpb246ICR7YXBwcm94aW1hdGVGZWUudG9TdHJpbmcoKX1gICtcbiAgICAgICAgYEtSUyBmZWUgdG8gcGF5OiAke2tyc0ZlZS50b1N0cmluZygpfS4gYCArXG4gICAgICAgIGBBZnRlciBkZWR1Y3RpbmcgZmVlcywgeW91ciB0b3RhbCByZWNvdmVyYWJsZSBiYWxhbmNlIGlzICR7cmVjb3ZlcnlBbW91bnQudG9TdHJpbmcoKX1gXG4gICAgKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0T3B0aW9ucyB7XG4gIGZlZVJhdGVTYXRWQjogbnVtYmVyO1xuICByZWNvdmVyeURlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIGtleVJlY292ZXJ5U2VydmljZUZlZTogYmlnaW50O1xuICBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBCbG9jayBoZWlnaHQgZm9yIFpjYXNoIG5ldHdvcmtzIChyZXF1aXJlZCB0byBkZXRlcm1pbmUgY29uc2Vuc3VzIGJyYW5jaCBJRCkgKi9cbiAgYmxvY2tIZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFja3VwIGtleSByZWNvdmVyeSBQU0JUIHVzaW5nIHV0eG9saWIgKGxlZ2FjeSBpbXBsZW1lbnRhdGlvbilcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0VXR4b2xpYihcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSxcbiAgb3B0aW9uczogQ3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0T3B0aW9uc1xuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGNvbnN0IHsgZmVlUmF0ZVNhdFZCLCByZWNvdmVyeURlc3RpbmF0aW9uLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrIH0pO1xuICB1dHhvbGliLmJpdGdvLmFkZFhwdWJzVG9Qc2J0KHBzYnQsIHJvb3RXYWxsZXRLZXlzKTtcbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT4ge1xuICAgIHV0eG9saWIuYml0Z28uYWRkV2FsbGV0VW5zcGVudFRvUHNidChwc2J0LCB1bnNwZW50LCByb290V2FsbGV0S2V5cywgJ3VzZXInLCAnYmFja3VwJyk7XG4gIH0pO1xuXG4gIGxldCBkaW1lbnNpb25zID0gRGltZW5zaW9ucy5mcm9tUHNidChwc2J0KS5wbHVzKFxuICAgIERpbWVuc2lvbnMuZnJvbU91dHB1dCh7IHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY292ZXJ5RGVzdGluYXRpb24sIG5ldHdvcmspIH0pXG4gICk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBkaW1lbnNpb25zID0gZGltZW5zaW9ucy5wbHVzKFxuICAgICAgRGltZW5zaW9ucy5mcm9tT3V0cHV0KHtcbiAgICAgICAgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywgbmV0d29yayksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IEJpZ0ludChkaW1lbnNpb25zLmdldFZTaXplKCkgKiBmZWVSYXRlU2F0VkIpO1xuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHVuc3BlbnRzLCAnYmlnaW50Jyk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGFwcHJveGltYXRlRmVlIC0ga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlO1xuXG4gIGlmIChyZWNvdmVyeUFtb3VudCA8IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBJbnN1ZmZpY2llbnRGdW5kc0Vycm9yKHRvdGFsSW5wdXRBbW91bnQsIGFwcHJveGltYXRlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIHJlY292ZXJ5QW1vdW50KTtcbiAgfVxuXG4gIHBzYnQuYWRkT3V0cHV0KHsgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjb3ZlcnlEZXN0aW5hdGlvbiwgbmV0d29yayksIHZhbHVlOiByZWNvdmVyeUFtb3VudCB9KTtcblxuICBpZiAoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcykge1xuICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgIHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIG5ldHdvcmspLFxuICAgICAgdmFsdWU6IGtleVJlY292ZXJ5U2VydmljZUZlZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBuZXR3b3JrIGlzIGEgWmNhc2ggbmV0d29ya1xuICovXG5mdW5jdGlvbiBpc1pjYXNoTmV0d29yayhuZXR3b3JrTmFtZTogdXR4b2xpYkNvbXBhdC5VdHhvbGliTmFtZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbmV0d29ya05hbWUgPT09ICd6Y2FzaCcgfHwgbmV0d29ya05hbWUgPT09ICd6Y2FzaFRlc3QnO1xufVxuXG4vKipcbiAqIERlZmF1bHQgYmxvY2sgaGVpZ2h0cyBmb3IgWmNhc2ggbmV0d29ya3MgaWYgbm90IHByb3ZpZGVkLlxuICogVGhlc2Ugc2hvdWxkIGJlIHNldCB0byBhIGhlaWdodCBhZnRlciB0aGUgbGF0ZXN0IG5ldHdvcmsgdXBncmFkZS5cbiAqIFRPRE8oQlRDLTI5MDEpOiBnZXQgdGhlIGhlaWdodCBmcm9tIGJsb2NrY2hhaXIgQVBJIGluc3RlYWQgb2YgaGFyZGNvZGluZy5cbiAqL1xuY29uc3QgWkNBU0hfREVGQVVMVF9CTE9DS19IRUlHSFRTOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICB6Y2FzaDogMzE0NjQwMCxcbiAgemNhc2hUZXN0OiAzNTM2NTAwLFxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQgdXNpbmcgd2FzbS11dHhvXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFdhc20oXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnNcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCB7IGZlZVJhdGVTYXRWQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbiwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IG5ldHdvcmtOYW1lID0gdG9OZXR3b3JrTmFtZShuZXR3b3JrKTtcblxuICAvLyBDcmVhdGUgUFNCVCB3aXRoIHdhc20tdXR4byBhbmQgYWRkIHdhbGxldCBpbnB1dHNcbiAgLy8gd2FzbS11dHhvJ3MgUm9vdFdhbGxldEtleXMuZnJvbSgpIGFjY2VwdHMgdXR4b2xpYidzIFJvb3RXYWxsZXRLZXlzIGZvcm1hdCAoSVdhbGxldEtleXMgaW50ZXJmYWNlKVxuICBsZXQgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidDtcblxuICBpZiAoaXNaY2FzaE5ldHdvcmsobmV0d29ya05hbWUpKSB7XG4gICAgLy8gRm9yIFpjYXNoLCB1c2UgWmNhc2hCaXRHb1BzYnQgd2hpY2ggcmVxdWlyZXMgYmxvY2sgaGVpZ2h0IHRvIGRldGVybWluZSBjb25zZW5zdXMgYnJhbmNoIElEXG4gICAgY29uc3QgYmxvY2tIZWlnaHQgPSBvcHRpb25zLmJsb2NrSGVpZ2h0ID8/IFpDQVNIX0RFRkFVTFRfQkxPQ0tfSEVJR0hUU1tuZXR3b3JrTmFtZV07XG4gICAgd2FzbVBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaEJpdEdvUHNidC5jcmVhdGVFbXB0eShuZXR3b3JrTmFtZSBhcyAnemNhc2gnIHwgJ3pjYXNoVGVzdCcsIHJvb3RXYWxsZXRLZXlzLCB7XG4gICAgICBibG9ja0hlaWdodCxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB3YXNtUHNidCA9IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidC5jcmVhdGVFbXB0eShuZXR3b3JrTmFtZSwgcm9vdFdhbGxldEtleXMpO1xuICB9XG5cbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT4ge1xuICAgIGNvbnN0IHsgdHhpZCwgdm91dCB9ID0gdXR4b2xpYi5iaXRnby5wYXJzZU91dHB1dElkKHVuc3BlbnQuaWQpO1xuICAgIGNvbnN0IHNpZ25QYXRoOiBmaXhlZFNjcmlwdFdhbGxldC5TaWduUGF0aCB8IHVuZGVmaW5lZCA9IGlzVGFwcm9vdENoYWluKHVuc3BlbnQuY2hhaW4pXG4gICAgICA/IHsgc2lnbmVyOiAndXNlcicsIGNvc2lnbmVyOiAnYmFja3VwJyB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIHByZXZUeCBtYXkgYmUgYWRkZWQgZHluYW1pY2FsbHkgaW4gYmFja3VwS2V5UmVjb3ZlcnkgZm9yIG5vbi1zZWd3aXQgaW5wdXRzXG4gICAgY29uc3QgcHJldlR4ID0gKHVuc3BlbnQgYXMgV2FsbGV0VW5zcGVudDxiaWdpbnQ+ICYgeyBwcmV2VHg/OiBCdWZmZXIgfSkucHJldlR4O1xuXG4gICAgd2FzbVBzYnQuYWRkV2FsbGV0SW5wdXQoXG4gICAgICB7XG4gICAgICAgIHR4aWQsXG4gICAgICAgIHZvdXQsXG4gICAgICAgIHZhbHVlOiB1bnNwZW50LnZhbHVlLFxuICAgICAgICBwcmV2VHg6IHByZXZUeCxcbiAgICAgIH0sXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIHtcbiAgICAgICAgc2NyaXB0SWQ6IHsgY2hhaW46IHVuc3BlbnQuY2hhaW4sIGluZGV4OiB1bnNwZW50LmluZGV4IH0sXG4gICAgICAgIHNpZ25QYXRoLFxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuXG4gIC8vIENvbnZlcnQgd2FzbS11dHhvIFBTQlQgdG8gdXR4b2xpYiBQU0JUIGZvciBkaW1lbnNpb24gY2FsY3VsYXRpb24gYW5kIG91dHB1dCBhZGRpdGlvblxuICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUJ1ZmZlcihCdWZmZXIuZnJvbSh3YXNtUHNidC5zZXJpYWxpemUoKSksIG5ldHdvcmspO1xuXG4gIGxldCBkaW1lbnNpb25zID0gRGltZW5zaW9ucy5mcm9tUHNidChwc2J0KS5wbHVzKFxuICAgIERpbWVuc2lvbnMuZnJvbU91dHB1dCh7IHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY292ZXJ5RGVzdGluYXRpb24sIG5ldHdvcmspIH0pXG4gICk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBkaW1lbnNpb25zID0gZGltZW5zaW9ucy5wbHVzKFxuICAgICAgRGltZW5zaW9ucy5mcm9tT3V0cHV0KHtcbiAgICAgICAgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywgbmV0d29yayksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IEJpZ0ludChkaW1lbnNpb25zLmdldFZTaXplKCkgKiBmZWVSYXRlU2F0VkIpO1xuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHVuc3BlbnRzLCAnYmlnaW50Jyk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGFwcHJveGltYXRlRmVlIC0ga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlO1xuXG4gIGlmIChyZWNvdmVyeUFtb3VudCA8IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBJbnN1ZmZpY2llbnRGdW5kc0Vycm9yKHRvdGFsSW5wdXRBbW91bnQsIGFwcHJveGltYXRlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIHJlY292ZXJ5QW1vdW50KTtcbiAgfVxuXG4gIHBzYnQuYWRkT3V0cHV0KHsgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjb3ZlcnlEZXN0aW5hdGlvbiwgbmV0d29yayksIHZhbHVlOiByZWNvdmVyeUFtb3VudCB9KTtcblxuICBpZiAoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcykge1xuICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgIHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIG5ldHdvcmspLFxuICAgICAgdmFsdWU6IGtleVJlY292ZXJ5U2VydmljZUZlZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhY2t1cCBrZXkgcmVjb3ZlcnkgUFNCVC5cbiAqXG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrIGZvciB0aGUgUFNCVFxuICogQHBhcmFtIHJvb3RXYWxsZXRLZXlzIC0gVGhlIHdhbGxldCBrZXlzXG4gKiBAcGFyYW0gdW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gaW5jbHVkZSBpbiB0aGUgUFNCVFxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgUFNCVFxuICogQHBhcmFtIGJhY2tlbmQgLSBXaGljaCBiYWNrZW5kIHRvIHVzZSBmb3IgUFNCVCBjcmVhdGlvbiAoZGVmYXVsdDogJ3dhc20tdXR4bycpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnQoXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnMsXG4gIGJhY2tlbmQ6IFBzYnRCYWNrZW5kID0gJ3dhc20tdXR4bydcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBpZiAob3B0aW9ucy5rZXlSZWNvdmVyeVNlcnZpY2VGZWUgPiAwICYmICFvcHRpb25zLmtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MgaXMgcmVxdWlyZWQgd2hlbiBrZXlSZWNvdmVyeVNlcnZpY2VGZWUgaXMgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChiYWNrZW5kID09PSAnd2FzbS11dHhvJykge1xuICAgIHJldHVybiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRXYXNtKG5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCB1bnNwZW50cywgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFV0eG9saWIobmV0d29yaywgcm9vdFdhbGxldEtleXMsIHVuc3BlbnRzLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjb3ZlcnlBbW91bnQocHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCwgYWRkcmVzczogc3RyaW5nKTogYmlnaW50IHtcbiAgY29uc3QgcmVjb3ZlcnlPdXRwdXRTY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgcHNidC5uZXR3b3JrKTtcbiAgY29uc3Qgb3V0cHV0ID0gcHNidC50eE91dHB1dHMuZmluZCgobykgPT4gby5zY3JpcHQuZXF1YWxzKHJlY292ZXJ5T3V0cHV0U2NyaXB0KSk7XG4gIGlmICghb3V0cHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZWNvdmVyeSBkZXN0aW5hdGlvbiBvdXRwdXQgbm90IGZvdW5kIGluIFBTQlQ6ICR7YWRkcmVzc31gKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0LnZhbHVlO1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo/abstract-utxo",
3
- "version": "10.11.0",
3
+ "version": "10.12.0",
4
4
  "description": "BitGo SDK coin library for UTXO base implementation",
5
5
  "main": "./dist/cjs/src/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -60,15 +60,15 @@
60
60
  ]
61
61
  },
62
62
  "dependencies": {
63
- "@bitgo/blockapis": "^1.12.10",
64
- "@bitgo/sdk-api": "^1.72.0",
65
- "@bitgo/sdk-core": "^36.23.2",
66
- "@bitgo/secp256k1": "^1.7.0",
67
- "@bitgo/unspents": "^0.50.12",
68
- "@bitgo/utxo-core": "^1.27.0",
69
- "@bitgo/utxo-lib": "^11.18.0",
70
- "@bitgo/utxo-ord": "^1.22.18",
71
- "@bitgo/wasm-utxo": "1.11.0",
63
+ "@bitgo/blockapis": "^1.12.11",
64
+ "@bitgo/sdk-api": "^1.72.2",
65
+ "@bitgo/sdk-core": "^36.25.0",
66
+ "@bitgo/secp256k1": "^1.8.0",
67
+ "@bitgo/unspents": "^0.50.13",
68
+ "@bitgo/utxo-core": "^1.28.0",
69
+ "@bitgo/utxo-lib": "^11.19.0",
70
+ "@bitgo/utxo-ord": "^1.22.20",
71
+ "@bitgo/wasm-utxo": "1.17.0",
72
72
  "@types/lodash": "^4.14.121",
73
73
  "@types/superagent": "4.1.15",
74
74
  "bignumber.js": "^9.0.2",
@@ -79,8 +79,8 @@
79
79
  "superagent": "^9.0.1"
80
80
  },
81
81
  "devDependencies": {
82
- "@bitgo/sdk-test": "^9.1.18",
82
+ "@bitgo/sdk-test": "^9.1.20",
83
83
  "mocha": "^10.2.0"
84
84
  },
85
- "gitHead": "ccb0078309c4e875a65cf56e0a25c00269901d9f"
85
+ "gitHead": "00ebae47599abef8805ec2940a2eda0d441d1a32"
86
86
  }