@bitgo/abstract-utxo 10.17.0 → 10.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/src/abstractUtxoCoin.d.ts +5 -6
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/cjs/src/abstractUtxoCoin.js +24 -5
- package/dist/cjs/src/address/fixedScript.d.ts +1 -5
- package/dist/cjs/src/address/fixedScript.d.ts.map +1 -1
- package/dist/cjs/src/address/fixedScript.js +3 -5
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +4 -5
- package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/NamedDescriptor.js +4 -6
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +2 -2
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +3 -38
- package/dist/cjs/src/descriptor/builder/builder.d.ts +2 -3
- package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/builder/builder.js +1 -1
- package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/builder/parse.js +3 -3
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +2 -2
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +1 -1
- package/dist/cjs/src/descriptor/descriptorWallet.d.ts +1 -1
- package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/descriptorWallet.js +1 -1
- package/dist/cjs/src/descriptor/index.d.ts +1 -1
- package/dist/cjs/src/descriptor/index.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/index.js +1 -1
- package/dist/cjs/src/descriptor/validatePolicy.d.ts +3 -3
- package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -1
- package/dist/cjs/src/descriptor/validatePolicy.js +3 -3
- package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -1
- package/dist/cjs/src/impl/bch/bch.js +6 -38
- package/dist/cjs/src/impl/doge/doge.d.ts +2 -1
- package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -1
- package/dist/cjs/src/impl/doge/doge.js +1 -1
- package/dist/cjs/src/impl/ltc/ltc.d.ts +0 -1
- package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -1
- package/dist/cjs/src/impl/ltc/ltc.js +3 -41
- package/dist/cjs/src/impl/ltc/tltc.d.ts +0 -1
- package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -1
- package/dist/cjs/src/impl/ltc/tltc.js +3 -40
- package/dist/cjs/src/index.d.ts +2 -0
- package/dist/cjs/src/index.d.ts.map +1 -1
- package/dist/cjs/src/index.js +3 -1
- package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +2 -2
- package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +3 -2
- package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -1
- package/dist/cjs/src/offlineVault/descriptor/transaction.js +5 -8
- package/dist/cjs/src/recovery/RecoveryProvider.d.ts +1 -3
- package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -1
- package/dist/cjs/src/recovery/RecoveryProvider.js +1 -1
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +73 -4
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/cjs/src/recovery/backupKeyRecovery.js +163 -129
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts +5 -5
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/cjs/src/recovery/crossChainRecovery.js +22 -121
- package/dist/cjs/src/recovery/psbt.d.ts +8 -31
- package/dist/cjs/src/recovery/psbt.d.ts.map +1 -1
- package/dist/cjs/src/recovery/psbt.js +14 -126
- package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +3 -3
- package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/explainPsbt.js +17 -54
- package/dist/cjs/src/transaction/descriptor/index.d.ts +1 -1
- package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/index.js +1 -1
- package/dist/cjs/src/transaction/descriptor/parse.d.ts +6 -4
- package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/parse.js +24 -50
- package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +6 -7
- package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/signPsbt.js +19 -18
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +4 -4
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +10 -38
- package/dist/cjs/src/transaction/explainTransaction.d.ts +2 -1
- package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/explainTransaction.js +3 -2
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +1 -3
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/SigningError.js +1 -1
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +2 -1
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +1 -8
- package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/parseOutput.js +6 -11
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +2 -2
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +4 -2
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +2 -2
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +4 -8
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +6 -5
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +42 -7
- package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/signTransaction.js +10 -10
- package/dist/cjs/src/unspent.d.ts +55 -0
- package/dist/cjs/src/unspent.d.ts.map +1 -0
- package/dist/cjs/src/unspent.js +12 -0
- package/dist/cjs/src/wasmUtil.d.ts +29 -0
- package/dist/cjs/src/wasmUtil.d.ts.map +1 -0
- package/dist/cjs/src/wasmUtil.js +87 -0
- package/dist/cjs/test/unit/address.d.ts +1 -1
- package/dist/cjs/test/unit/address.d.ts.map +1 -1
- package/dist/cjs/test/unit/address.js +107 -137
- package/dist/cjs/test/unit/bip322.js +50 -1
- package/dist/cjs/test/unit/customSigner.js +5 -4
- package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +37 -4
- package/dist/cjs/test/unit/descriptor/builder.js +10 -4
- package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +37 -4
- package/dist/cjs/test/unit/descriptor/descriptorWallet.js +40 -6
- package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -1
- package/dist/cjs/test/unit/descriptorAddress.js +3 -3
- package/dist/cjs/test/unit/explainTransaction.js +26 -3
- package/dist/cjs/test/unit/keychains.js +40 -1
- package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
- package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
- package/dist/cjs/test/unit/postProcessPrebuild.js +62 -0
- package/dist/cjs/test/unit/prebuildAndSign.d.ts +0 -4
- package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -1
- package/dist/cjs/test/unit/prebuildAndSign.js +12 -32
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +82 -259
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -0
- package/dist/cjs/test/unit/recovery/crossChainRecovery.js +38 -35
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
- package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +186 -0
- package/dist/cjs/test/unit/recovery/mock.d.ts +15 -8
- package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -1
- package/dist/cjs/test/unit/recovery/mock.js +49 -77
- package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/signTransaction.js +244 -0
- package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
- package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
- package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +46 -12
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -1
- package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +38 -4
- package/dist/cjs/test/unit/transaction/descriptor/parse.js +22 -19
- package/dist/cjs/test/unit/transaction/descriptor/sign.js +60 -16
- package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +43 -10
- package/dist/cjs/test/unit/transaction.js +6 -225
- package/dist/cjs/test/unit/util/address.d.ts +13 -0
- package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/address.js +15 -0
- package/dist/cjs/test/unit/util/index.d.ts +3 -0
- package/dist/cjs/test/unit/util/index.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/index.js +4 -1
- package/dist/cjs/test/unit/util/keychains.d.ts +29 -0
- package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/keychains.js +51 -1
- package/dist/cjs/test/unit/util/nockBitGo.d.ts +8 -1
- package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/nockBitGo.js +17 -1
- package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
- package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
- package/dist/cjs/test/unit/util/psbt.js +21 -0
- package/dist/cjs/test/unit/util/transaction.d.ts +8 -4
- package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/transaction.js +19 -1
- package/dist/cjs/test/unit/util/unspents.d.ts +66 -8
- package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/unspents.js +130 -15
- package/dist/cjs/test/unit/util/utxoCoins.d.ts +13 -0
- package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/utxoCoins.js +33 -2
- package/dist/cjs/test/unit/wallet.js +4 -4
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/abstractUtxoCoin.d.ts +5 -6
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/esm/abstractUtxoCoin.js +26 -7
- package/dist/esm/address/fixedScript.d.ts +1 -5
- package/dist/esm/address/fixedScript.d.ts.map +1 -1
- package/dist/esm/address/fixedScript.js +3 -5
- package/dist/esm/descriptor/NamedDescriptor.d.ts +4 -5
- package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -1
- package/dist/esm/descriptor/NamedDescriptor.js +5 -7
- package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +2 -2
- package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
- package/dist/esm/descriptor/assertDescriptorWalletAddress.js +3 -5
- package/dist/esm/descriptor/builder/builder.d.ts +2 -3
- package/dist/esm/descriptor/builder/builder.d.ts.map +1 -1
- package/dist/esm/descriptor/builder/builder.js +1 -1
- package/dist/esm/descriptor/builder/parse.d.ts.map +1 -1
- package/dist/esm/descriptor/builder/parse.js +3 -3
- package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +2 -2
- package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -1
- package/dist/esm/descriptor/createWallet/createDescriptors.js +1 -1
- package/dist/esm/descriptor/descriptorWallet.d.ts +1 -1
- package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -1
- package/dist/esm/descriptor/descriptorWallet.js +1 -1
- package/dist/esm/descriptor/index.d.ts +1 -1
- package/dist/esm/descriptor/index.d.ts.map +1 -1
- package/dist/esm/descriptor/index.js +1 -1
- package/dist/esm/descriptor/validatePolicy.d.ts +3 -3
- package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -1
- package/dist/esm/descriptor/validatePolicy.js +3 -3
- package/dist/esm/impl/bch/bch.d.ts.map +1 -1
- package/dist/esm/impl/bch/bch.js +6 -5
- package/dist/esm/impl/doge/doge.d.ts +2 -1
- package/dist/esm/impl/doge/doge.d.ts.map +1 -1
- package/dist/esm/impl/doge/doge.js +1 -1
- package/dist/esm/impl/ltc/ltc.d.ts +0 -1
- package/dist/esm/impl/ltc/ltc.d.ts.map +1 -1
- package/dist/esm/impl/ltc/ltc.js +3 -8
- package/dist/esm/impl/ltc/tltc.d.ts +0 -1
- package/dist/esm/impl/ltc/tltc.d.ts.map +1 -1
- package/dist/esm/impl/ltc/tltc.js +3 -7
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +2 -2
- package/dist/esm/offlineVault/descriptor/transaction.d.ts +3 -2
- package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -1
- package/dist/esm/offlineVault/descriptor/transaction.js +5 -8
- package/dist/esm/recovery/RecoveryProvider.d.ts +1 -3
- package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -1
- package/dist/esm/recovery/RecoveryProvider.js +1 -1
- package/dist/esm/recovery/backupKeyRecovery.d.ts +73 -4
- package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/esm/recovery/backupKeyRecovery.js +165 -100
- package/dist/esm/recovery/crossChainRecovery.d.ts +5 -5
- package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/esm/recovery/crossChainRecovery.js +24 -90
- package/dist/esm/recovery/psbt.d.ts +8 -31
- package/dist/esm/recovery/psbt.d.ts.map +1 -1
- package/dist/esm/recovery/psbt.js +14 -91
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts +3 -3
- package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/explainPsbt.js +14 -18
- package/dist/esm/transaction/descriptor/index.d.ts +1 -1
- package/dist/esm/transaction/descriptor/index.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/index.js +1 -1
- package/dist/esm/transaction/descriptor/parse.d.ts +6 -4
- package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/parse.js +22 -15
- package/dist/esm/transaction/descriptor/signPsbt.d.ts +6 -7
- package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/signPsbt.js +19 -18
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +4 -4
- package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/descriptor/verifyTransaction.js +10 -5
- package/dist/esm/transaction/explainTransaction.d.ts +2 -1
- package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/explainTransaction.js +3 -2
- package/dist/esm/transaction/fixedScript/SigningError.d.ts +1 -3
- package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/SigningError.js +1 -1
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +2 -1
- package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/explainTransaction.js +1 -8
- package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/parseOutput.js +6 -11
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +2 -2
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +4 -2
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +2 -2
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtWasm.js +2 -6
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +6 -5
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signTransaction.js +10 -8
- package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/signTransaction.js +10 -10
- package/dist/esm/unspent.d.ts +55 -0
- package/dist/esm/unspent.d.ts.map +1 -0
- package/dist/esm/unspent.js +8 -0
- package/dist/esm/wasmUtil.d.ts +29 -0
- package/dist/esm/wasmUtil.d.ts.map +1 -0
- package/dist/esm/wasmUtil.js +47 -0
- package/package.json +11 -12
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +0 -2
- package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +0 -1
- package/dist/cjs/test/unit/impl/btc/unit/btc.js +0 -220
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +0 -4
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +0 -1
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +0 -10
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +0 -2
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +0 -1
- package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +0 -18
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +0 -2
- package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +0 -1
- package/dist/cjs/test/unit/impl/ltc/unit/index.js +0 -39
|
@@ -1,310 +1,133 @@
|
|
|
1
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
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
38
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
6
|
const assert_1 = __importDefault(require("assert"));
|
|
40
7
|
require("should");
|
|
41
|
-
const sinon = __importStar(require("sinon"));
|
|
42
8
|
const nock = require("nock");
|
|
43
|
-
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
44
|
-
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
45
|
-
const unspents_1 = require("@bitgo/unspents");
|
|
46
9
|
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
47
10
|
const src_1 = require("../../../src");
|
|
48
|
-
const names_1 = require("../../../src/names");
|
|
49
11
|
const util_1 = require("../util");
|
|
50
|
-
const mock_1 = require("./mock");
|
|
51
|
-
const { toOutput } = utxolib.bitgo;
|
|
52
|
-
const config = { krsProviders: sdk_core_1.krsProviders };
|
|
53
12
|
nock.disableNetConnect();
|
|
54
|
-
|
|
55
|
-
const backup = { ...sdk_core_1.krsProviders };
|
|
56
|
-
before(function () {
|
|
57
|
-
f(config);
|
|
58
|
-
});
|
|
59
|
-
after(function () {
|
|
60
|
-
Object.entries(backup).forEach(([k, v]) => {
|
|
61
|
-
config[k] = v;
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
const walletPassphrase = 'lol';
|
|
66
|
-
function getNamedKeys([userKey, backupKey, bitgoKey], password) {
|
|
67
|
-
function encode(k) {
|
|
68
|
-
return k.isNeutered() ? k.toBase58() : (0, util_1.encryptKeychain)(password, (0, util_1.toKeychainBase58)(k));
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
userKey: encode(userKey),
|
|
72
|
-
backupKey: encode(backupKey),
|
|
73
|
-
bitgoKey: encode(bitgoKey),
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
function getKeysForUnsignedSweep([userKey, backupKey, bitgoKey], password) {
|
|
77
|
-
return getNamedKeys([userKey.neutered(), backupKey.neutered(), bitgoKey.neutered()], password);
|
|
78
|
-
}
|
|
79
|
-
function getKeysForKeyRecoveryService([userKey, backupKey, bitgoKey], password) {
|
|
80
|
-
return getNamedKeys([userKey, backupKey.neutered(), bitgoKey.neutered()], password);
|
|
81
|
-
}
|
|
82
|
-
function getKeysForFullSignedRecovery([userKey, backupKey, bitgoKey], password) {
|
|
83
|
-
return getNamedKeys([userKey, backupKey, bitgoKey.neutered()], password);
|
|
84
|
-
}
|
|
85
|
-
const walletKeys = (0, util_1.getDefaultWalletKeys)();
|
|
86
|
-
const keysUnsignedSweep = getKeysForUnsignedSweep(walletKeys.triple, walletPassphrase);
|
|
87
|
-
const keysKeyRecoveryService = getKeysForKeyRecoveryService(walletKeys.triple, walletPassphrase);
|
|
88
|
-
const keysFullSignedRecovery = getKeysForFullSignedRecovery(walletKeys.triple, walletPassphrase);
|
|
13
|
+
const defaultDerivationPrefix = 'm/0/0';
|
|
89
14
|
const exoticUserKeyPath = '99/99';
|
|
90
|
-
|
|
15
|
+
// Create wallet keys using wasm-utxo primitives from default keychains
|
|
16
|
+
const { walletKeys: wasmWalletKeys, xprivs } = (0, util_1.getDefaultWasmWalletKeys)();
|
|
17
|
+
const { walletKeys: wasmExoticWalletKeys } = (0, util_1.getDefaultWasmWalletKeys)([
|
|
91
18
|
exoticUserKeyPath,
|
|
92
|
-
|
|
93
|
-
|
|
19
|
+
defaultDerivationPrefix,
|
|
20
|
+
defaultDerivationPrefix,
|
|
94
21
|
]);
|
|
95
|
-
|
|
96
|
-
|
|
22
|
+
// Private keys for signing
|
|
23
|
+
const userPrivkey = xprivs[0];
|
|
24
|
+
const backupPrivkey = xprivs[1];
|
|
25
|
+
function run(coin, scriptTypes, wasmWalletKeys, params, tags = []) {
|
|
97
26
|
const defaultFeeRateSatB = 100;
|
|
98
|
-
describe(`Backup Key Recovery [${[coin.getChain(), ...tags
|
|
99
|
-
const externalWallet = (0, util_1.
|
|
100
|
-
const recoveryDestination = (0, util_1.getWalletAddress)(coin.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
27
|
+
describe(`Backup Key Recovery PSBT [${[coin.getChain(), ...tags].join(',')}]`, function () {
|
|
28
|
+
const { walletKeys: externalWallet } = (0, util_1.createWasmWalletKeys)('external');
|
|
29
|
+
const recoveryDestination = (0, util_1.getWalletAddress)(coin.name, externalWallet);
|
|
30
|
+
const fixtureCoin = (0, util_1.getNormalTestnetCoin)(coin);
|
|
31
|
+
// Get xpubs from wallet keys
|
|
32
|
+
const userKey = wasmWalletKeys.userKey();
|
|
33
|
+
const backupKey = wasmWalletKeys.backupKey();
|
|
34
|
+
const bitgoKey = wasmWalletKeys.bitgoKey();
|
|
35
|
+
const replayProtection = [wasm_utxo_1.ECPair.fromPublicKey(Buffer.from(userKey.publicKey))];
|
|
104
36
|
// 1e8 * 9e7 < 9.007e15 but 2e8 * 9e7 > 9.007e15 to test both code paths in queryBlockchainUnspentsPath
|
|
105
37
|
const valueMul = coin.amountType === 'bigint' ? BigInt(9e7) : BigInt(1);
|
|
106
|
-
|
|
107
|
-
sinon.stub(src_1.CoingeckoApi.prototype, 'getUSDPrice').resolves(69420);
|
|
108
|
-
});
|
|
109
|
-
configOverride(function (config) {
|
|
110
|
-
const configKrsProviders = { ...config.krsProviders };
|
|
111
|
-
configKrsProviders.dai.supportedCoins = [coin.getFamily()];
|
|
112
|
-
configKrsProviders.keyternal.supportedCoins = [coin.getFamily()];
|
|
113
|
-
keyRecoveryServiceAddress = (0, util_1.getWalletAddress)(coin.network, externalWallet, 0, 100);
|
|
114
|
-
configKrsProviders.keyternal.feeAddresses = { [coin.getChain()]: keyRecoveryServiceAddress };
|
|
115
|
-
config.krsProviders = configKrsProviders;
|
|
116
|
-
});
|
|
117
|
-
after(function () {
|
|
118
|
-
sinon.restore();
|
|
119
|
-
});
|
|
38
|
+
let psbt;
|
|
120
39
|
let recoverUnspents;
|
|
121
|
-
let
|
|
122
|
-
|
|
40
|
+
let parsed;
|
|
41
|
+
let fixtureParsed;
|
|
42
|
+
before('create recovery data and load fixture', async function () {
|
|
123
43
|
this.timeout(10000);
|
|
124
44
|
recoverUnspents = scriptTypes.flatMap((scriptType, index) => [
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
45
|
+
(0, util_1.toUnspent)({ scriptType, value: BigInt(1e8) * valueMul }, index, coin.name, wasmWalletKeys),
|
|
46
|
+
(0, util_1.toUnspent)({ scriptType, value: BigInt(2e8) * valueMul }, index, coin.name, wasmWalletKeys),
|
|
47
|
+
(0, util_1.toUnspent)({ scriptType, value: BigInt(3e8) * valueMul }, index, coin.name, wasmWalletKeys),
|
|
128
48
|
]);
|
|
129
|
-
//
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
49
|
+
// Build signing keys triple: privkey if provided, otherwise xpub from wallet keys
|
|
50
|
+
const signingKeys = [
|
|
51
|
+
params.userPrivkey || userKey,
|
|
52
|
+
params.backupPrivkey || backupKey,
|
|
53
|
+
bitgoKey, // bitgo is always xpub
|
|
54
|
+
];
|
|
55
|
+
psbt = (0, src_1.backupKeyRecoveryWithWalletUnspents)(coin.name, {
|
|
56
|
+
walletKeys: wasmWalletKeys,
|
|
57
|
+
keys: signingKeys,
|
|
138
58
|
recoveryDestination,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
59
|
+
feeRateSatVB: defaultFeeRateSatB,
|
|
60
|
+
}, recoverUnspents);
|
|
61
|
+
// Parse generated PSBT
|
|
62
|
+
parsed = psbt.parseTransactionWithWalletKeys(wasmWalletKeys, { publicKeys: replayProtection });
|
|
63
|
+
// Load and parse fixture PSBT
|
|
64
|
+
const psbtHex = Buffer.from(psbt.serialize()).toString('hex');
|
|
65
|
+
const storedFixture = await (0, util_1.getFixture)(fixtureCoin, `recovery/backupKeyRecoveryPsbt-${tags.join('-')}`, {
|
|
66
|
+
psbtHex,
|
|
146
67
|
});
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
recovery.txid =
|
|
153
|
-
recoveryTx instanceof utxolib.bitgo.UtxoPsbt ? recoveryTx.getUnsignedTx().getId() : recoveryTx.getId();
|
|
68
|
+
const fixturePsbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(Buffer.from(storedFixture.psbtHex, 'hex'), fixtureCoin.name);
|
|
69
|
+
fixtureParsed = fixturePsbt.parseTransactionWithWalletKeys(wasmWalletKeys, { publicKeys: replayProtection });
|
|
70
|
+
});
|
|
71
|
+
it('has expected input count', function () {
|
|
72
|
+
parsed.inputs.length.should.eql(recoverUnspents.length);
|
|
154
73
|
});
|
|
155
|
-
it('has
|
|
156
|
-
|
|
157
|
-
|
|
74
|
+
it('has recovery destination output', function () {
|
|
75
|
+
parsed.outputs.length.should.be.greaterThanOrEqual(1);
|
|
76
|
+
const outputAddresses = parsed.outputs.map((o) => o.address);
|
|
77
|
+
outputAddresses.includes(recoveryDestination).should.eql(true);
|
|
158
78
|
});
|
|
159
79
|
it('has expected fee rate', function () {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
const inputSum = utxolib.bitgo.unspentSum(recoverUnspents, 'bigint');
|
|
164
|
-
const outputSum = recoveryTx.txOutputs.reduce((sum, o) => sum + o.value, BigInt(0));
|
|
80
|
+
const inputSum = recoverUnspents.reduce((sum, u) => sum + u.value, BigInt(0));
|
|
81
|
+
const outputSum = parsed.outputs.reduce((sum, o) => sum + o.value, BigInt(0));
|
|
165
82
|
const fee = inputSum - outputSum;
|
|
166
|
-
|
|
167
|
-
let vsize;
|
|
168
|
-
if (utxolib.isTestnet(coin.network)) {
|
|
169
|
-
const networkName = utxolib.getNetworkName(coin.network);
|
|
170
|
-
if (!networkName) {
|
|
171
|
-
throw new Error('Invalid network');
|
|
172
|
-
}
|
|
173
|
-
const wasmPsbt = wasm_utxo_1.fixedScriptWallet.BitGoPsbt.fromBytes(new Uint8Array(recoveryTx.toBuffer()), networkName);
|
|
174
|
-
vsize = wasm_utxo_1.fixedScriptWallet.Dimensions.fromPsbt(wasmPsbt).getVSize();
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
vsize = unspents_1.Dimensions.fromPsbt(recoveryTx).getVSize();
|
|
178
|
-
}
|
|
83
|
+
const vsize = wasm_utxo_1.fixedScriptWallet.Dimensions.fromPsbt(psbt).getVSize();
|
|
179
84
|
const feeRateSatB = Number(fee) / vsize;
|
|
180
85
|
const diff = Math.abs(feeRateSatB - defaultFeeRateSatB) / defaultFeeRateSatB;
|
|
181
86
|
// within 1%
|
|
182
87
|
assert_1.default.strictEqual(diff < 0.01, true, `expected fee rate ${defaultFeeRateSatB} but got ${feeRateSatB}`);
|
|
183
88
|
});
|
|
184
|
-
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
}
|
|
190
|
-
(0, util_1.shouldEqualJSON)(fixtureRecovery, await (0, util_1.getFixture)(fixtureCoin, `recovery/backupKeyRecovery-${(params.krsProvider ? tags.concat([params.krsProvider]) : tags).join('-')}`, recovery));
|
|
191
|
-
});
|
|
192
|
-
it('has expected input count', function () {
|
|
193
|
-
(recoveryTx instanceof utxolib.bitgo.UtxoPsbt ? recoveryTx.data.inputs : recoveryTx.ins).length.should.eql(recoverUnspents.length);
|
|
194
|
-
});
|
|
195
|
-
function checkInputsSignedBy(tx, rootKey, expectCount) {
|
|
196
|
-
if (tx instanceof utxolib.bitgo.UtxoPsbt) {
|
|
197
|
-
function validate(tx, inputIndex) {
|
|
198
|
-
try {
|
|
199
|
-
return tx.validateSignaturesOfInputHD(inputIndex, rootKey);
|
|
200
|
-
}
|
|
201
|
-
catch (e) {
|
|
202
|
-
if (e.message === 'No signatures to validate') {
|
|
203
|
-
return false;
|
|
204
|
-
}
|
|
205
|
-
throw e;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
tx.data.inputs.forEach((input, inputIndex) => {
|
|
209
|
-
validate(tx, inputIndex).should.eql(!!expectCount);
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
const prevOutputs = recoverUnspents
|
|
214
|
-
.map((u) => toOutput(u, coin.network))
|
|
215
|
-
.map((v) => ({ ...v, value: utxolib.bitgo.toTNumber(v.value, coin.amountType) }));
|
|
216
|
-
tx.ins.forEach((input, inputIndex) => {
|
|
217
|
-
const unspent = recoverUnspents[inputIndex];
|
|
218
|
-
const { publicKey } = rootKey.derivePath(walletKeys.getDerivationPath(rootKey, unspent.chain, unspent.index));
|
|
219
|
-
const signatures = utxolib.bitgo
|
|
220
|
-
.getSignatureVerifications(tx, inputIndex, utxolib.bitgo.toTNumber(unspent.value, coin.amountType), { publicKey }, prevOutputs)
|
|
221
|
-
.filter((s) => s.signedBy !== undefined);
|
|
222
|
-
signatures.length.should.eql(expectCount);
|
|
223
|
-
});
|
|
89
|
+
function checkInputsSignedBy(signerIndex, expectSigned) {
|
|
90
|
+
const signerKey = xprivs[signerIndex];
|
|
91
|
+
for (let inputIndex = 0; inputIndex < recoverUnspents.length; inputIndex++) {
|
|
92
|
+
const hasSig = psbt.verifySignature(inputIndex, signerKey);
|
|
93
|
+
hasSig.should.eql(expectSigned, `input ${inputIndex} signer ${signerIndex}`);
|
|
224
94
|
}
|
|
225
95
|
}
|
|
226
|
-
it((params.
|
|
227
|
-
checkInputsSignedBy(
|
|
96
|
+
it((params.userPrivkey ? 'has' : 'has no') + ' user signature', function () {
|
|
97
|
+
checkInputsSignedBy(0, !!params.userPrivkey);
|
|
228
98
|
});
|
|
229
|
-
it((params.
|
|
230
|
-
checkInputsSignedBy(
|
|
99
|
+
it((params.backupPrivkey ? 'has' : 'has no') + ' backup signature', function () {
|
|
100
|
+
checkInputsSignedBy(1, !!params.backupPrivkey);
|
|
231
101
|
});
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
if (recoveryTx instanceof utxolib.bitgo.UtxoTransaction) {
|
|
235
|
-
recoveryTx.ins.forEach((input) => {
|
|
236
|
-
const parsed = utxolib.bitgo.parseSignatureScript(input);
|
|
237
|
-
switch (parsed.scriptType) {
|
|
238
|
-
case 'p2sh':
|
|
239
|
-
case 'p2shP2wsh':
|
|
240
|
-
case 'p2wsh':
|
|
241
|
-
case 'taprootScriptPathSpend':
|
|
242
|
-
parsed.signatures.forEach((signature, i) => {
|
|
243
|
-
if (utxolib.bitgo.isPlaceholderSignature(signature)) {
|
|
244
|
-
throw new Error(`placeholder signature at index ${i}`);
|
|
245
|
-
}
|
|
246
|
-
});
|
|
247
|
-
break;
|
|
248
|
-
default:
|
|
249
|
-
throw new Error(`unexpected scriptType ${parsed.scriptType}`);
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
this.skip();
|
|
255
|
-
}
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
it((params.hasKrsOutput ? 'has' : 'has no') + ' key recovery service output', function () {
|
|
259
|
-
const outs = recoveryTx instanceof utxolib.bitgo.UtxoPsbt ? recoveryTx.getUnsignedTx().outs : recoveryTx.outs;
|
|
260
|
-
outs.length.should.eql(1);
|
|
261
|
-
const outputAddresses = outs.map((o) => wasm_utxo_1.address.fromOutputScriptWithCoin(o.script, (0, names_1.getCoinName)(recoveryTx.network)));
|
|
262
|
-
outputAddresses
|
|
263
|
-
.includes(keyRecoveryServiceAddress)
|
|
264
|
-
.should.eql(!!params.hasKrsOutput && params.krsProvider === 'keyternal');
|
|
265
|
-
outputAddresses.includes(recoveryDestination).should.eql(true);
|
|
102
|
+
it('matches PSBT fixture', function () {
|
|
103
|
+
assert_1.default.deepStrictEqual(parsed, fixtureParsed);
|
|
266
104
|
});
|
|
267
105
|
});
|
|
268
106
|
}
|
|
269
|
-
function runWithScriptTypes(scriptTypes
|
|
107
|
+
function runWithScriptTypes(scriptTypes) {
|
|
270
108
|
util_1.utxoCoins
|
|
271
109
|
.filter((coin) => scriptTypes.every((type) => coin.supportsAddressType(type)))
|
|
272
110
|
.forEach((coin) => {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
hasKrsOutput: false,
|
|
286
|
-
}, ['keyRecoveryService', ...scriptTypes]);
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
run(coin, scriptTypes, walletKeys, {
|
|
290
|
-
keys: keysFullSignedRecovery,
|
|
291
|
-
hasUserSignature: true,
|
|
292
|
-
hasBackupSignature: true,
|
|
293
|
-
}, ['fullSignedRecovery', ...scriptTypes]);
|
|
294
|
-
run(coin, scriptTypes, exoticWalletKeys, {
|
|
295
|
-
keys: keysFullSignedRecoveryExotic,
|
|
296
|
-
userKeyPath: exoticUserKeyPath,
|
|
297
|
-
hasUserSignature: true,
|
|
298
|
-
hasBackupSignature: true,
|
|
299
|
-
}, ['fullSignedRecovery', 'customUserKeyPath', ...scriptTypes]);
|
|
111
|
+
// Unsigned sweep - no signatures
|
|
112
|
+
run(coin, scriptTypes, wasmWalletKeys, {}, ['unsigned', ...scriptTypes]);
|
|
113
|
+
// User signed only (KRS scenario)
|
|
114
|
+
run(coin, scriptTypes, wasmWalletKeys, { userPrivkey }, ['userSigned', ...scriptTypes]);
|
|
115
|
+
// Fully signed recovery
|
|
116
|
+
run(coin, scriptTypes, wasmWalletKeys, { userPrivkey, backupPrivkey }, ['fullySigned', ...scriptTypes]);
|
|
117
|
+
// Fully signed with custom user key path
|
|
118
|
+
run(coin, scriptTypes, wasmExoticWalletKeys, { userPrivkey, backupPrivkey }, [
|
|
119
|
+
'fullySigned',
|
|
120
|
+
'customUserKeyPath',
|
|
121
|
+
...scriptTypes,
|
|
122
|
+
]);
|
|
300
123
|
});
|
|
301
124
|
}
|
|
302
|
-
describe('Backup Key Recovery', function () {
|
|
125
|
+
describe('Backup Key Recovery PSBT', function () {
|
|
303
126
|
// compatible with all coins
|
|
304
127
|
runWithScriptTypes(['p2sh']);
|
|
305
128
|
// segwit compatible coins
|
|
306
129
|
runWithScriptTypes(['p2shP2wsh', 'p2wsh']);
|
|
307
130
|
// taproot compatible coins
|
|
308
|
-
runWithScriptTypes(['p2tr', 'p2trMusig2']
|
|
131
|
+
runWithScriptTypes(['p2tr', 'p2trMusig2']);
|
|
309
132
|
});
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsa0JBQWdCO0FBRWhCLDZDQUErQjtBQUMvQiw2QkFBOEI7QUFFOUIseURBQTJDO0FBQzNDLDhDQUErRDtBQUMvRCw4Q0FBNkM7QUFDN0MsZ0RBQTZFO0FBRTdFLHNDQU1zQjtBQUN0Qiw4Q0FBaUQ7QUFDakQsa0NBWWlCO0FBRWpCLGlDQUE4QztBQUU5QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUtuQyxNQUFNLE1BQU0sR0FBRyxFQUFFLFlBQVksRUFBWix1QkFBWSxFQUFFLENBQUM7QUFFaEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7QUFFekIsU0FBUyxjQUFjLENBQUMsQ0FBMkI7SUFDakQsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLHVCQUFZLEVBQUUsQ0FBQztJQUNuQyxNQUFNLENBQUM7UUFDTCxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQztJQUNILEtBQUssQ0FBQztRQUNKLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFRL0IsU0FBUyxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEs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XG5cbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAqIGFzIG1vY2hhIGZyb20gJ21vY2hhJztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgQ29uZmlnLCBrcnNQcm92aWRlcnMsIFRyaXBsZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBEaW1lbnNpb25zIH0gZnJvbSAnQGJpdGdvL3Vuc3BlbnRzJztcbmltcG9ydCB7IGFkZHJlc3MgYXMgd2FzbUFkZHJlc3MsIGZpeGVkU2NyaXB0V2FsbGV0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7XG4gIEFic3RyYWN0VXR4b0NvaW4sXG4gIGJhY2t1cEtleVJlY292ZXJ5LFxuICBCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uLFxuICBDb2luZ2Vja29BcGksXG4gIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbyxcbn0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IGdldENvaW5OYW1lIH0gZnJvbSAnLi4vLi4vLi4vc3JjL25hbWVzJztcbmltcG9ydCB7XG4gIGRlZmF1bHRCaXRHbyxcbiAgZW5jcnlwdEtleWNoYWluLFxuICBnZXREZWZhdWx0V2FsbGV0S2V5cyxcbiAgZ2V0Rml4dHVyZSxcbiAgZ2V0Tm9ybWFsVGVzdG5ldENvaW4sXG4gIGdldFdhbGxldEFkZHJlc3MsXG4gIGdldFdhbGxldEtleXMsXG4gIGtleWNoYWlucyxcbiAgc2hvdWxkRXF1YWxKU09OLFxuICB0b0tleWNoYWluQmFzZTU4LFxuICB1dHhvQ29pbnMsXG59IGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgeyBNb2NrUmVjb3ZlcnlQcm92aWRlciB9IGZyb20gJy4vbW9jayc7XG5cbmNvbnN0IHsgdG9PdXRwdXQgfSA9IHV0eG9saWIuYml0Z287XG50eXBlIFdhbGxldFVuc3BlbnQgPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8YmlnaW50PjtcbnR5cGUgUm9vdFdhbGxldEtleXMgPSB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzO1xudHlwZSBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcblxuY29uc3QgY29uZmlnID0geyBrcnNQcm92aWRlcnMgfTtcblxubm9jay5kaXNhYmxlTmV0Q29ubmVjdCgpO1xuXG5mdW5jdGlvbiBjb25maWdPdmVycmlkZShmOiAoY29uZmlnOiBDb25maWcpID0+IHZvaWQpIHtcbiAgY29uc3QgYmFja3VwID0geyAuLi5rcnNQcm92aWRlcnMgfTtcbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBmKGNvbmZpZyk7XG4gIH0pO1xuICBhZnRlcihmdW5jdGlvbiAoKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoYmFja3VwKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIGNvbmZpZ1trXSA9IHY7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5jb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ2xvbCc7XG5cbnR5cGUgTmFtZWRLZXlzID0ge1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gZ2V0TmFtZWRLZXlzKFt1c2VyS2V5LCBiYWNrdXBLZXksIGJpdGdvS2V5XTogVHJpcGxlPEJJUDMySW50ZXJmYWNlPiwgcGFzc3dvcmQ6IHN0cmluZyk6IE5hbWVkS2V5cyB7XG4gIGZ1bmN0aW9uIGVuY29kZShrOiBCSVAzMkludGVyZmFjZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGsuaXNOZXV0ZXJlZCgpID8gay50b0Jhc2U1OCgpIDogZW5jcnlwdEtleWNoYWluKHBhc3N3b3JkLCB0b0tleWNoYWluQmFzZTU4KGspKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJLZXk6IGVuY29kZSh1c2VyS2V5KSxcbiAgICBiYWNrdXBLZXk6IGVuY29kZShiYWNrdXBLZXkpLFxuICAgIGJpdGdvS2V5OiBlbmNvZGUoYml0Z29LZXkpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRLZXlzRm9yVW5zaWduZWRTd2VlcChbdXNlcktleSwgYmFja3VwS2V5LCBiaXRnb0tleV06IFRyaXBsZTxCSVAzMkludGVyZmFjZT4sIHBhc3N3b3JkOiBzdHJpbmcpOiBOYW1lZEtleXMge1xuICByZXR1cm4gZ2V0TmFtZWRLZXlzKFt1c2VyS2V5Lm5ldXRlcmVkKCksIGJhY2t1cEtleS5uZXV0ZXJlZCgpLCBiaXRnb0tleS5uZXV0ZXJlZCgpXSwgcGFzc3dvcmQpO1xufVxuXG5mdW5jdGlvbiBnZXRLZXlzRm9yS2V5UmVjb3ZlcnlTZXJ2aWNlKFxuICBbdXNlcktleSwgYmFja3VwS2V5LCBiaXRnb0tleV06IFRyaXBsZTxCSVAzMkludGVyZmFjZT4sXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IE5hbWVkS2V5cyB7XG4gIHJldHVybiBnZXROYW1lZEtleXMoW3VzZXJLZXksIGJhY2t1cEtleS5uZXV0ZXJlZCgpLCBiaXRnb0tleS5uZXV0ZXJlZCgpXSwgcGFzc3dvcmQpO1xufVxuXG5mdW5jdGlvbiBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KFxuICBbdXNlcktleSwgYmFja3VwS2V5LCBiaXRnb0tleV06IFRyaXBsZTxCSVAzMkludGVyZmFjZT4sXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IE5hbWVkS2V5cyB7XG4gIHJldHVybiBnZXROYW1lZEtleXMoW3VzZXJLZXksIGJhY2t1cEtleSwgYml0Z29LZXkubmV1dGVyZWQoKV0sIHBhc3N3b3JkKTtcbn1cblxuY29uc3Qgd2FsbGV0S2V5cyA9IGdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG5jb25zdCBrZXlzVW5zaWduZWRTd2VlcCA9IGdldEtleXNGb3JVbnNpZ25lZFN3ZWVwKHdhbGxldEtleXMudHJpcGxlLCB3YWxsZXRQYXNzcGhyYXNlKTtcbmNvbnN0IGtleXNLZXlSZWNvdmVyeVNlcnZpY2UgPSBnZXRLZXlzRm9yS2V5UmVjb3ZlcnlTZXJ2aWNlKHdhbGxldEtleXMudHJpcGxlLCB3YWxsZXRQYXNzcGhyYXNlKTtcbmNvbnN0IGtleXNGdWxsU2lnbmVkUmVjb3ZlcnkgPSBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KHdhbGxldEtleXMudHJpcGxlLCB3YWxsZXRQYXNzcGhyYXNlKTtcblxuY29uc3QgZXhvdGljVXNlcktleVBhdGggPSAnOTkvOTknO1xuY29uc3QgZXhvdGljV2FsbGV0S2V5cyA9IG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKGtleWNoYWlucywgW1xuICBleG90aWNVc2VyS2V5UGF0aCxcbiAgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG5dKTtcbmNvbnN0IGtleXNGdWxsU2lnbmVkUmVjb3ZlcnlFeG90aWMgPSBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KGV4b3RpY1dhbGxldEtleXMudHJpcGxlLCB3YWxsZXRQYXNzcGhyYXNlKTtcblxuZnVuY3Rpb24gcnVuKFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBzY3JpcHRUeXBlczogU2NyaXB0VHlwZTJPZjNbXSxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHBhcmFtczoge1xuICAgIGtleXM6IE5hbWVkS2V5cztcbiAgICB1c2VyS2V5UGF0aD86IHN0cmluZztcbiAgICBrcnNQcm92aWRlcj86IHN0cmluZztcbiAgICBoYXNVc2VyU2lnbmF0dXJlOiBib29sZWFuO1xuICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogYm9vbGVhbjtcbiAgICBoYXNLcnNPdXRwdXQ/OiBib29sZWFuO1xuICB9LFxuICB0YWdzOiBzdHJpbmdbXSA9IFtdXG4pIHtcbiAgY29uc3QgZGVmYXVsdEZlZVJhdGVTYXRCID0gMTAwO1xuXG4gIGRlc2NyaWJlKGBCYWNrdXAgS2V5IFJlY292ZXJ5IFske1tjb2luLmdldENoYWluKCksIC4uLnRhZ3MsIHBhcmFtcy5rcnNQcm92aWRlcl0uam9pbignLCcpfV1gLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZXh0ZXJuYWxXYWxsZXQgPSBnZXRXYWxsZXRLZXlzKCdleHRlcm5hbCcpO1xuICAgIGNvbnN0IHJlY292ZXJ5RGVzdGluYXRpb24gPSBnZXRXYWxsZXRBZGRyZXNzKGNvaW4ubmV0d29yaywgZXh0ZXJuYWxXYWxsZXQpO1xuXG4gICAgbGV0IGtleVJlY292ZXJ5U2VydmljZUFkZHJlc3M6IHN0cmluZztcbiAgICBsZXQgcmVjb3Zlcnk6IChCYWNrdXBLZXlSZWNvdmVyeVRyYW5zYW5zYWN0aW9uIHwgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvKSAmIHsgdHhpZD86IHN0cmluZyB9O1xuICAgIGxldCByZWNvdmVyeVR4OiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxudW1iZXIgfCBiaWdpbnQ+IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidDtcblxuICAgIC8vIDFlOCAqIDllNyA8IDkuMDA3ZTE1IGJ1dCAyZTggKiA5ZTcgPiA5LjAwN2UxNSB0byB0ZXN0IGJvdGggY29kZSBwYXRocyBpbiBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGhcbiAgICBjb25zdCB2YWx1ZU11bCA9IGNvaW4uYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcgPyBCaWdJbnQoOWU3KSA6IEJpZ0ludCgxKTtcbiAgICBiZWZvcmUoJ21vY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKENvaW5nZWNrb0FwaS5wcm90b3R5cGUsICdnZXRVU0RQcmljZScpLnJlc29sdmVzKDY5XzQyMCk7XG4gICAgfSk7XG5cbiAgICBjb25maWdPdmVycmlkZShmdW5jdGlvbiAoY29uZmlnOiBDb25maWcpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ0tyc1Byb3ZpZGVycyA9IHsgLi4uY29uZmlnLmtyc1Byb3ZpZGVycyB9O1xuICAgICAgY29uZmlnS3JzUHJvdmlkZXJzLmRhaS5zdXBwb3J0ZWRDb2lucyA9IFtjb2luLmdldEZhbWlseSgpXTtcbiAgICAgIGNvbmZpZ0tyc1Byb3ZpZGVycy5rZXl0ZXJuYWwuc3VwcG9ydGVkQ29pbnMgPSBbY29pbi5nZXRGYW1pbHkoKV07XG4gICAgICBrZXlSZWNvdmVyeVNlcnZpY2VBZGRyZXNzID0gZ2V0V2FsbGV0QWRkcmVzcyhjb2luLm5ldHdvcmssIGV4dGVybmFsV2FsbGV0LCAwLCAxMDApO1xuICAgICAgY29uZmlnS3JzUHJvdmlkZXJzLmtleXRlcm5hbC5mZWVBZGRyZXNzZXMgPSB7IFtjb2luLmdldENoYWluKCldOiBrZXlSZWNvdmVyeVNlcnZpY2VBZGRyZXNzIH07XG4gICAgICBjb25maWcua3JzUHJvdmlkZXJzID0gY29uZmlnS3JzUHJvdmlkZXJzO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgbGV0IHJlY292ZXJVbnNwZW50czogdXR4b2xpYi5iaXRnby5VbnNwZW50PGJpZ2ludD5bXTtcbiAgICBsZXQgbW9ja2VkQXBpVW5zcGVudHM6IHV0eG9saWIuYml0Z28uVW5zcGVudDxiaWdpbnQ+W107XG5cbiAgICBiZWZvcmUoJ2NyZWF0ZSByZWNvdmVyeSBkYXRhJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50aW1lb3V0KDEwXzAwMCk7XG4gICAgICByZWNvdmVyVW5zcGVudHMgPSBzY3JpcHRUeXBlcy5mbGF0TWFwKChzY3JpcHRUeXBlLCBpbmRleCkgPT4gW1xuICAgICAgICB1dHhvbGliLnRlc3R1dGlsLnRvVW5zcGVudCh7IHNjcmlwdFR5cGUsIHZhbHVlOiBCaWdJbnQoMWU4KSAqIHZhbHVlTXVsIH0sIGluZGV4LCBjb2luLm5ldHdvcmssIHdhbGxldEtleXMpLFxuICAgICAgICB1dHhvbGliLnRlc3R1dGlsLnRvVW5zcGVudCh7IHNjcmlwdFR5cGUsIHZhbHVlOiBCaWdJbnQoMmU4KSAqIHZhbHVlTXVsIH0sIGluZGV4LCBjb2luLm5ldHdvcmssIHdhbGxldEtleXMpLFxuICAgICAgICB1dHhvbGliLnRlc3R1dGlsLnRvVW5zcGVudCh7IHNjcmlwdFR5cGUsIHZhbHVlOiBCaWdJbnQoM2U4KSAqIHZhbHVlTXVsIH0sIGluZGV4LCBjb2luLm5ldHdvcmssIHdhbGxldEtleXMpLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIElmIHRoZSBjb2luIGlzIGJjaCwgY29udmVydCB0aGUgbW9ja2VkIHVuc3BlbnQgYWRkcmVzcyB0byBjYXNoYWRkciBmb3JtYXQgc2luY2UgdGhhdCBpcyB0aGUgZm9ybWF0IHRoYXQgYmxvY2tjaGFpclxuICAgICAgLy8gcmV0dXJucyBvbiB0aGUgL2Rhc2hib2FyZHMvYWRkcmVzc2VzIHJlc3BvbnNlXG4gICAgICBtb2NrZWRBcGlVbnNwZW50cyA9XG4gICAgICAgIGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaCcgfHwgY29pbi5nZXRDaGFpbigpID09PSAnYmNoYSdcbiAgICAgICAgICA/IHJlY292ZXJVbnNwZW50cy5tYXAoKHUpID0+ICh7IC4uLnUsIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyh1LmFkZHJlc3MsICdjYXNoYWRkcicpLnNwbGl0KCc6JylbMV0gfSkpXG4gICAgICAgICAgOiByZWNvdmVyVW5zcGVudHM7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrZWRBcGlVbnNwZW50cy5sZW5ndGgsIHJlY292ZXJVbnNwZW50cy5sZW5ndGgpO1xuICAgICAgcmVjb3ZlcnkgPSBhd2FpdCBiYWNrdXBLZXlSZWNvdmVyeShjb2luLCBkZWZhdWx0Qml0R28sIHtcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgc2NhbjogNSxcbiAgICAgICAgaWdub3JlQWRkcmVzc1R5cGVzOiBbXSxcbiAgICAgICAgdXNlcktleVBhdGg6IHBhcmFtcy51c2VyS2V5UGF0aCxcbiAgICAgICAga3JzUHJvdmlkZXI6IHBhcmFtcy5rcnNQcm92aWRlcixcbiAgICAgICAgLi4ucGFyYW1zLmtleXMsXG4gICAgICAgIHJlY292ZXJ5UHJvdmlkZXI6IG5ldyBNb2NrUmVjb3ZlcnlQcm92aWRlcihtb2NrZWRBcGlVbnNwZW50cyksXG4gICAgICAgIGZlZVJhdGU6IGRlZmF1bHRGZWVSYXRlU2F0QixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAocmVjb3ZlcnkgYXMgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbikudHJhbnNhY3Rpb25IZXggPz8gKHJlY292ZXJ5IGFzIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbykudHhIZXg7XG4gICAgICBjb25zdCBpc1BzYnQgPSB1dHhvbGliLmJpdGdvLmlzUHNidCh0eEhleCk7XG4gICAgICByZWNvdmVyeVR4ID0gaXNQc2J0XG4gICAgICAgID8gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eEhleCwgY29pbi5uZXR3b3JrKVxuICAgICAgICA6IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHR4SGV4IGFzIHN0cmluZywgY29pbi5uZXR3b3JrLCBjb2luLmFtb3VudFR5cGUpO1xuICAgICAgcmVjb3ZlcnkudHhpZCA9XG4gICAgICAgIHJlY292ZXJ5VHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0ID8gcmVjb3ZlcnlUeC5nZXRVbnNpZ25lZFR4KCkuZ2V0SWQoKSA6IHJlY292ZXJ5VHguZ2V0SWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgY29ycmVjdCByZWNvdmVyeSBwcm92aWRlciBtb2NrcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5UHJvdmlkZXIgPSBuZXcgTW9ja1JlY292ZXJ5UHJvdmlkZXIobW9ja2VkQXBpVW5zcGVudHMpO1xuICAgICAgKGF3YWl0IHJlY292ZXJ5UHJvdmlkZXIuZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMobW9ja2VkQXBpVW5zcGVudHMubWFwKCh1KSA9PiB1LmFkZHJlc3MpKSkubGVuZ3RoLnNob3VsZC5lcWwoXG4gICAgICAgIG1vY2tlZEFwaVVuc3BlbnRzLmxlbmd0aFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgZXhwZWN0ZWQgZmVlIHJhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIShyZWNvdmVyeVR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkpIHtcbiAgICAgICAgdGhpcy5za2lwKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnB1dFN1bSA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bShyZWNvdmVyVW5zcGVudHMsICdiaWdpbnQnKTtcbiAgICAgIGNvbnN0IG91dHB1dFN1bSA9IHJlY292ZXJ5VHgudHhPdXRwdXRzLnJlZHVjZSgoc3VtLCBvKSA9PiBzdW0gKyBvLnZhbHVlLCBCaWdJbnQoMCkpO1xuICAgICAgY29uc3QgZmVlID0gaW5wdXRTdW0gLSBvdXRwdXRTdW07XG4gICAgICAvLyBVc2Ugd2FzbS11dHhvIERpbWVuc2lvbnMgZm9yIHRlc3RuZXQgKG1hdGNoZXMgaG93IGZlZSB3YXMgY2FsY3VsYXRlZCksIHV0eG9saWIgRGltZW5zaW9ucyBmb3IgbWFpbm5ldFxuICAgICAgbGV0IHZzaXplOiBudW1iZXI7XG4gICAgICBpZiAodXR4b2xpYi5pc1Rlc3RuZXQoY29pbi5uZXR3b3JrKSkge1xuICAgICAgICBjb25zdCBuZXR3b3JrTmFtZSA9IHV0eG9saWIuZ2V0TmV0d29ya05hbWUoY29pbi5uZXR3b3JrKTtcbiAgICAgICAgaWYgKCFuZXR3b3JrTmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBuZXR3b3JrJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2FzbVBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuZnJvbUJ5dGVzKG5ldyBVaW50OEFycmF5KHJlY292ZXJ5VHgudG9CdWZmZXIoKSksIG5ldHdvcmtOYW1lKTtcbiAgICAgICAgdnNpemUgPSBmaXhlZFNjcmlwdFdhbGxldC5EaW1lbnNpb25zLmZyb21Qc2J0KHdhc21Qc2J0KS5nZXRWU2l6ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdnNpemUgPSBEaW1lbnNpb25zLmZyb21Qc2J0KHJlY292ZXJ5VHgpLmdldFZTaXplKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmZWVSYXRlU2F0QiA9IE51bWJlcihmZWUpIC8gdnNpemU7XG4gICAgICBjb25zdCBkaWZmID0gTWF0aC5hYnMoZmVlUmF0ZVNhdEIgLSBkZWZhdWx0RmVlUmF0ZVNhdEIpIC8gZGVmYXVsdEZlZVJhdGVTYXRCO1xuICAgICAgLy8gd2l0aGluIDElXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGlmZiA8IDAuMDEsIHRydWUsIGBleHBlY3RlZCBmZWUgcmF0ZSAke2RlZmF1bHRGZWVSYXRlU2F0Qn0gYnV0IGdvdCAke2ZlZVJhdGVTYXRCfWApO1xuICAgIH0pO1xuXG4gICAgaXQoJ21hdGNoZXMgZml4dHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGZpeHR1cmVDb2luID0gZ2V0Tm9ybWFsVGVzdG5ldENvaW4oY29pbik7XG4gICAgICBjb25zdCBmaXh0dXJlUmVjb3ZlcnkgPSB7IC4uLnJlY292ZXJ5IH07XG4gICAgICBpZiAoZml4dHVyZVJlY292ZXJ5LmNvaW4pIHtcbiAgICAgICAgZml4dHVyZVJlY292ZXJ5LmNvaW4gPSBmaXh0dXJlQ29pbi5nZXRDaGFpbigpO1xuICAgICAgfVxuXG4gICAgICBzaG91bGRFcXVhbEpTT04oXG4gICAgICAgIGZpeHR1cmVSZWNvdmVyeSxcbiAgICAgICAgYXdhaXQgZ2V0Rml4dHVyZShcbiAgICAgICAgICBmaXh0dXJlQ29pbixcbiAgICAgICAgICBgcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnktJHsocGFyYW1zLmtyc1Byb3ZpZGVyID8gdGFncy5jb25jYXQoW3BhcmFtcy5rcnNQcm92aWRlcl0pIDogdGFncykuam9pbignLScpfWAsXG4gICAgICAgICAgcmVjb3ZlcnlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgZXhwZWN0ZWQgaW5wdXQgY291bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAocmVjb3ZlcnlUeCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgPyByZWNvdmVyeVR4LmRhdGEuaW5wdXRzIDogcmVjb3ZlcnlUeC5pbnMpLmxlbmd0aC5zaG91bGQuZXFsKFxuICAgICAgICByZWNvdmVyVW5zcGVudHMubGVuZ3RoXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tJbnB1dHNTaWduZWRCeShcbiAgICAgIHR4OiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxudW1iZXIgfCBiaWdpbnQ+IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgICAgIHJvb3RLZXk6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgZXhwZWN0Q291bnQ6IG51bWJlclxuICAgICkge1xuICAgICAgaWYgKHR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkge1xuICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZSh0eDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCwgaW5wdXRJbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0eC52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0SEQoaW5wdXRJbmRleCwgcm9vdEtleSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gJ05vIHNpZ25hdHVyZXMgdG8gdmFsaWRhdGUnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHR4LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiB7XG4gICAgICAgICAgdmFsaWRhdGUodHgsIGlucHV0SW5kZXgpLnNob3VsZC5lcWwoISFleHBlY3RDb3VudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldk91dHB1dHMgPSByZWNvdmVyVW5zcGVudHNcbiAgICAgICAgICAubWFwKCh1KSA9PiB0b091dHB1dCh1LCBjb2luLm5ldHdvcmspKVxuICAgICAgICAgIC5tYXAoKHYpID0+ICh7IC4uLnYsIHZhbHVlOiB1dHhvbGliLmJpdGdvLnRvVE51bWJlcih2LnZhbHVlLCBjb2luLmFtb3VudFR5cGUpIH0pKTtcbiAgICAgICAgdHguaW5zLmZvckVhY2goKGlucHV0LCBpbnB1dEluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5zcGVudCA9IHJlY292ZXJVbnNwZW50c1tpbnB1dEluZGV4XSBhcyBXYWxsZXRVbnNwZW50O1xuICAgICAgICAgIGNvbnN0IHsgcHVibGljS2V5IH0gPSByb290S2V5LmRlcml2ZVBhdGgod2FsbGV0S2V5cy5nZXREZXJpdmF0aW9uUGF0aChyb290S2V5LCB1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KSk7XG4gICAgICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IHV0eG9saWIuYml0Z29cbiAgICAgICAgICAgIC5nZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKFxuICAgICAgICAgICAgICB0eCxcbiAgICAgICAgICAgICAgaW5wdXRJbmRleCxcbiAgICAgICAgICAgICAgdXR4b2xpYi5iaXRnby50b1ROdW1iZXIodW5zcGVudC52YWx1ZSwgY29pbi5hbW91bnRUeXBlKSxcbiAgICAgICAgICAgICAgeyBwdWJsaWNLZXkgfSxcbiAgICAgICAgICAgICAgcHJldk91dHB1dHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoKHMpID0+IHMuc2lnbmVkQnkgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgc2lnbmF0dXJlcy5sZW5ndGguc2hvdWxkLmVxbChleHBlY3RDb3VudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGl0KChwYXJhbXMuaGFzVXNlclNpZ25hdHVyZSA/ICdoYXMnIDogJ2hhcyBubycpICsgJyB1c2VyIHNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrSW5wdXRzU2lnbmVkQnkocmVjb3ZlcnlUeCwgd2FsbGV0S2V5cy51c2VyLCBwYXJhbXMuaGFzVXNlclNpZ25hdHVyZSA/IDEgOiAwKTtcbiAgICB9KTtcblxuICAgIGl0KChwYXJhbXMuaGFzQmFja3VwU2lnbmF0dXJlID8gJ2hhcycgOiAnaGFzIG5vJykgKyAnIGJhY2t1cCBzaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjaGVja0lucHV0c1NpZ25lZEJ5KHJlY292ZXJ5VHgsIHdhbGxldEtleXMuYmFja3VwLCBwYXJhbXMuaGFzQmFja3VwU2lnbmF0dXJlID8gMSA6IDApO1xuICAgIH0pO1xuXG4gICAgaWYgKHBhcmFtcy5oYXNVc2VyU2lnbmF0dXJlICYmIHBhcmFtcy5oYXNCYWNrdXBTaWduYXR1cmUpIHtcbiAgICAgIGl0KCdoYXMgbm8gcGxhY2Vob2xkZXIgc2lnbmF0dXJlcycsIGZ1bmN0aW9uICh0aGlzOiBtb2NoYS5Db250ZXh0KSB7XG4gICAgICAgIGlmIChyZWNvdmVyeVR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICByZWNvdmVyeVR4Lmlucy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gdXR4b2xpYi5iaXRnby5wYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcnNlZC5zY3JpcHRUeXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3Ayc2gnOlxuICAgICAgICAgICAgICBjYXNlICdwMnNoUDJ3c2gnOlxuICAgICAgICAgICAgICBjYXNlICdwMndzaCc6XG4gICAgICAgICAgICAgIGNhc2UgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnOlxuICAgICAgICAgICAgICAgIHBhcnNlZC5zaWduYXR1cmVzLmZvckVhY2goKHNpZ25hdHVyZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHV0eG9saWIuYml0Z28uaXNQbGFjZWhvbGRlclNpZ25hdHVyZShzaWduYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcGxhY2Vob2xkZXIgc2lnbmF0dXJlIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgc2NyaXB0VHlwZSAke3BhcnNlZC5zY3JpcHRUeXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgocGFyYW1zLmhhc0tyc091dHB1dCA/ICdoYXMnIDogJ2hhcyBubycpICsgJyBrZXkgcmVjb3Zlcnkgc2VydmljZSBvdXRwdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdXRzID0gcmVjb3ZlcnlUeCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgPyByZWNvdmVyeVR4LmdldFVuc2lnbmVkVHgoKS5vdXRzIDogcmVjb3ZlcnlUeC5vdXRzO1xuICAgICAgb3V0cy5sZW5ndGguc2hvdWxkLmVxbCgxKTtcbiAgICAgIGNvbnN0IG91dHB1dEFkZHJlc3NlcyA9IG91dHMubWFwKChvKSA9PlxuICAgICAgICB3YXNtQWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0V2l0aENvaW4oby5zY3JpcHQsIGdldENvaW5OYW1lKHJlY292ZXJ5VHgubmV0d29yaykpXG4gICAgICApO1xuICAgICAgb3V0cHV0QWRkcmVzc2VzXG4gICAgICAgIC5pbmNsdWRlcyhrZXlSZWNvdmVyeVNlcnZpY2VBZGRyZXNzKVxuICAgICAgICAuc2hvdWxkLmVxbCghIXBhcmFtcy5oYXNLcnNPdXRwdXQgJiYgcGFyYW1zLmtyc1Byb3ZpZGVyID09PSAna2V5dGVybmFsJyk7XG4gICAgICBvdXRwdXRBZGRyZXNzZXMuaW5jbHVkZXMocmVjb3ZlcnlEZXN0aW5hdGlvbikuc2hvdWxkLmVxbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bldpdGhTY3JpcHRUeXBlcyhcbiAgc2NyaXB0VHlwZXM6IFNjcmlwdFR5cGUyT2YzW10sXG4gIHsgcnVuS2V5UHJvdmlkZXJUZXN0cyA9IHRydWUgfTogeyBydW5LZXlQcm92aWRlclRlc3RzPzogYm9vbGVhbiB9ID0ge31cbikge1xuICB1dHhvQ29pbnNcbiAgICAuZmlsdGVyKChjb2luKSA9PiBzY3JpcHRUeXBlcy5ldmVyeSgodHlwZSkgPT4gY29pbi5zdXBwb3J0c0FkZHJlc3NUeXBlKHR5cGUpKSlcbiAgICAuZm9yRWFjaCgoY29pbikgPT4ge1xuICAgICAgcnVuKFxuICAgICAgICBjb2luLFxuICAgICAgICBzY3JpcHRUeXBlcyxcbiAgICAgICAgd2FsbGV0S2V5cyxcbiAgICAgICAge1xuICAgICAgICAgIGtleXM6IGtleXNVbnNpZ25lZFN3ZWVwLFxuICAgICAgICAgIGhhc1VzZXJTaWduYXR1cmU6IGZhbHNlLFxuICAgICAgICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIFsndW5zaWduZWRSZWNvdmVyeScsIC4uLnNjcmlwdFR5cGVzXVxuICAgICAgKTtcblxuICAgICAgaWYgKHJ1bktleVByb3ZpZGVyVGVzdHMpIHtcbiAgICAgICAgWydkYWknLCAna2V5dGVybmFsJ10uZm9yRWFjaCgoa3JzUHJvdmlkZXIpID0+IHtcbiAgICAgICAgICBydW4oXG4gICAgICAgICAgICBjb2luLFxuICAgICAgICAgICAgc2NyaXB0VHlwZXMsXG4gICAgICAgICAgICB3YWxsZXRLZXlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXlzOiBrZXlzS2V5UmVjb3ZlcnlTZXJ2aWNlLFxuICAgICAgICAgICAgICBrcnNQcm92aWRlcjoga3JzUHJvdmlkZXIsXG4gICAgICAgICAgICAgIGhhc1VzZXJTaWduYXR1cmU6IHRydWUsXG4gICAgICAgICAgICAgIGhhc0JhY2t1cFNpZ25hdHVyZTogZmFsc2UsXG4gICAgICAgICAgICAgIGhhc0tyc091dHB1dDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgWydrZXlSZWNvdmVyeVNlcnZpY2UnLCAuLi5zY3JpcHRUeXBlc11cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcnVuKFxuICAgICAgICBjb2luLFxuICAgICAgICBzY3JpcHRUeXBlcyxcbiAgICAgICAgd2FsbGV0S2V5cyxcbiAgICAgICAge1xuICAgICAgICAgIGtleXM6IGtleXNGdWxsU2lnbmVkUmVjb3ZlcnksXG4gICAgICAgICAgaGFzVXNlclNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgICBoYXNCYWNrdXBTaWduYXR1cmU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIFsnZnVsbFNpZ25lZFJlY292ZXJ5JywgLi4uc2NyaXB0VHlwZXNdXG4gICAgICApO1xuXG4gICAgICBydW4oXG4gICAgICAgIGNvaW4sXG4gICAgICAgIHNjcmlwdFR5cGVzLFxuICAgICAgICBleG90aWNXYWxsZXRLZXlzLFxuICAgICAgICB7XG4gICAgICAgICAga2V5czoga2V5c0Z1bGxTaWduZWRSZWNvdmVyeUV4b3RpYyxcbiAgICAgICAgICB1c2VyS2V5UGF0aDogZXhvdGljVXNlcktleVBhdGgsXG4gICAgICAgICAgaGFzVXNlclNpZ25hdHVyZTogdHJ1ZSxcbiAgICAgICAgICBoYXNCYWNrdXBTaWduYXR1cmU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIFsnZnVsbFNpZ25lZFJlY292ZXJ5JywgJ2N1c3RvbVVzZXJLZXlQYXRoJywgLi4uc2NyaXB0VHlwZXNdXG4gICAgICApO1xuICAgIH0pO1xufVxuXG5kZXNjcmliZSgnQmFja3VwIEtleSBSZWNvdmVyeScsIGZ1bmN0aW9uICgpIHtcbiAgLy8gY29tcGF0aWJsZSB3aXRoIGFsbCBjb2luc1xuICBydW5XaXRoU2NyaXB0VHlwZXMoWydwMnNoJ10pO1xuXG4gIC8vIHNlZ3dpdCBjb21wYXRpYmxlIGNvaW5zXG4gIHJ1bldpdGhTY3JpcHRUeXBlcyhbJ3Ayc2hQMndzaCcsICdwMndzaCddKTtcblxuICAvLyB0YXByb290IGNvbXBhdGlibGUgY29pbnNcbiAgcnVuV2l0aFNjcmlwdFR5cGVzKFsncDJ0cicsICdwMnRyTXVzaWcyJ10sIHsgcnVuS2V5UHJvdmlkZXJUZXN0czogZmFsc2UgfSk7XG59KTtcbiJdfQ==
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsa0JBQWdCO0FBQ2hCLDZCQUE4QjtBQUU5QixnREFBb0U7QUFFcEUsc0NBQXFGO0FBRXJGLGtDQVFpQjtBQUdqQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUV6QixNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztBQUN4QyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUVsQyx1RUFBdUU7QUFDdkUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBQSwrQkFBd0IsR0FBRSxDQUFDO0FBQzFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxJQUFBLCtCQUF3QixFQUFDO0lBQ3BFLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsdUJBQXVCO0NBQ3hCLENBQUMsQ0FBQztBQUVILDJCQUEyQjtBQUMzQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWhDLFNBQVMsR0FBRyxDQUNWLElBQXNCLEVBQ3RCLFdBQTZCLEVBQzdCLGNBQWdELEVBQ2hELE1BR0MsRUFDRCxPQUFpQixFQUFFO0lBRW5CLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0lBRS9CLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtRQUM3RSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUEsMkJB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QUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUV4Ryx5Q0FBeUM7UUFDekMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEVBQUU7WUFDM0UsYUFBYTtZQUNiLG1CQUFtQjtZQUNuQixHQUFHLFdBQVc7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxRQUFRLENBQUMsMEJBQTBCLEVBQUU7SUFDbkMsNEJBQTRCO0lBQzVCLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUU3QiwwQkFBMEI7SUFDMUIsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUUzQywyQkFBMkI7SUFDM0Isa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUM3QyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgeyBUcmlwbGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQklQMzIsIEVDUGFpciwgZml4ZWRTY3JpcHRXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcblxuaW1wb3J0IHsgQWJzdHJhY3RVdHhvQ29pbiwgYmFja3VwS2V5UmVjb3ZlcnlXaXRoV2FsbGV0VW5zcGVudHMgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHR5cGUgeyBXYWxsZXRVbnNwZW50IH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Vuc3BlbnQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV2FzbVdhbGxldEtleXMsXG4gIGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cyxcbiAgZ2V0Rml4dHVyZSxcbiAgZ2V0Tm9ybWFsVGVzdG5ldENvaW4sXG4gIGdldFdhbGxldEFkZHJlc3MsXG4gIHRvVW5zcGVudCxcbiAgdXR4b0NvaW5zLFxufSBmcm9tICcuLi91dGlsJztcbnR5cGUgU2NyaXB0VHlwZTJPZjMgPSAncDJzaCcgfCAncDJzaFAyd3NoJyB8ICdwMndzaCcgfCAncDJ0cicgfCAncDJ0ck11c2lnMic7XG5cbm5vY2suZGlzYWJsZU5ldENvbm5lY3QoKTtcblxuY29uc3QgZGVmYXVsdERlcml2YXRpb25QcmVmaXggPSAnbS8wLzAnO1xuY29uc3QgZXhvdGljVXNlcktleVBhdGggPSAnOTkvOTknO1xuXG4vLyBDcmVhdGUgd2FsbGV0IGtleXMgdXNpbmcgd2FzbS11dHhvIHByaW1pdGl2ZXMgZnJvbSBkZWZhdWx0IGtleWNoYWluc1xuY29uc3QgeyB3YWxsZXRLZXlzOiB3YXNtV2FsbGV0S2V5cywgeHByaXZzIH0gPSBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMoKTtcbmNvbnN0IHsgd2FsbGV0S2V5czogd2FzbUV4b3RpY1dhbGxldEtleXMgfSA9IGdldERlZmF1bHRXYXNtV2FsbGV0S2V5cyhbXG4gIGV4b3RpY1VzZXJLZXlQYXRoLFxuICBkZWZhdWx0RGVyaXZhdGlvblByZWZpeCxcbiAgZGVmYXVsdERlcml2YXRpb25QcmVmaXgsXG5dKTtcblxuLy8gUHJpdmF0ZSBrZXlzIGZvciBzaWduaW5nXG5jb25zdCB1c2VyUHJpdmtleSA9IHhwcml2c1swXTtcbmNvbnN0IGJhY2t1cFByaXZrZXkgPSB4cHJpdnNbMV07XG5cbmZ1bmN0aW9uIHJ1bihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgc2NyaXB0VHlwZXM6IFNjcmlwdFR5cGUyT2YzW10sXG4gIHdhc21XYWxsZXRLZXlzOiBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cyxcbiAgcGFyYW1zOiB7XG4gICAgdXNlclByaXZrZXk/OiBCSVAzMjtcbiAgICBiYWNrdXBQcml2a2V5PzogQklQMzI7XG4gIH0sXG4gIHRhZ3M6IHN0cmluZ1tdID0gW11cbikge1xuICBjb25zdCBkZWZhdWx0RmVlUmF0ZVNhdEIgPSAxMDA7XG5cbiAgZGVzY3JpYmUoYEJhY2t1cCBLZXkgUmVjb3ZlcnkgUFNCVCBbJHtbY29pbi5nZXRDaGFpbigpLCAuLi50YWdzXS5qb2luKCcsJyl9XWAsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7IHdhbGxldEtleXM6IGV4dGVybmFsV2FsbGV0IH0gPSBjcmVhdGVXYXNtV2FsbGV0S2V5cygnZXh0ZXJuYWwnKTtcbiAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gZ2V0V2FsbGV0QWRkcmVzcyhjb2luLm5hbWUsIGV4dGVybmFsV2FsbGV0KTtcbiAgICBjb25zdCBmaXh0dXJlQ29pbiA9IGdldE5vcm1hbFRlc3RuZXRDb2luKGNvaW4pO1xuICAgIC8vIEdldCB4cHVicyBmcm9tIHdhbGxldCBrZXlzXG4gICAgY29uc3QgdXNlcktleSA9IHdhc21XYWxsZXRLZXlzLnVzZXJLZXkoKTtcbiAgICBjb25zdCBiYWNrdXBLZXkgPSB3YXNtV2FsbGV0S2V5cy5iYWNrdXBLZXkoKTtcbiAgICBjb25zdCBiaXRnb0tleSA9IHdhc21XYWxsZXRLZXlzLmJpdGdvS2V5KCk7XG4gICAgY29uc3QgcmVwbGF5UHJvdGVjdGlvbiA9IFtFQ1BhaXIuZnJvbVB1YmxpY0tleShCdWZmZXIuZnJvbSh1c2VyS2V5LnB1YmxpY0tleSkpXTtcblxuICAgIC8vIDFlOCAqIDllNyA8IDkuMDA3ZTE1IGJ1dCAyZTggKiA5ZTcgPiA5LjAwN2UxNSB0byB0ZXN0IGJvdGggY29kZSBwYXRocyBpbiBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGhcbiAgICBjb25zdCB2YWx1ZU11bCA9IGNvaW4uYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcgPyBCaWdJbnQoOWU3KSA6IEJpZ0ludCgxKTtcblxuICAgIGxldCBwc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQ7XG4gICAgbGV0IHJlY292ZXJVbnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W107XG4gICAgbGV0IHBhcnNlZDogZml4ZWRTY3JpcHRXYWxsZXQuUGFyc2VkVHJhbnNhY3Rpb247XG4gICAgbGV0IGZpeHR1cmVQYXJzZWQ6IGZpeGVkU2NyaXB0V2FsbGV0LlBhcnNlZFRyYW5zYWN0aW9uO1xuXG4gICAgYmVmb3JlKCdjcmVhdGUgcmVjb3ZlcnkgZGF0YSBhbmQgbG9hZCBmaXh0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy50aW1lb3V0KDEwXzAwMCk7XG5cbiAgICAgIHJlY292ZXJVbnNwZW50cyA9IHNjcmlwdFR5cGVzLmZsYXRNYXAoKHNjcmlwdFR5cGUsIGluZGV4KSA9PiBbXG4gICAgICAgIHRvVW5zcGVudCh7IHNjcmlwdFR5cGUsIHZhbHVlOiBCaWdJbnQoMWU4KSAqIHZhbHVlTXVsIH0sIGluZGV4LCBjb2luLm5hbWUsIHdhc21XYWxsZXRLZXlzKSxcbiAgICAgICAgdG9VbnNwZW50KHsgc2NyaXB0VHlwZSwgdmFsdWU6IEJpZ0ludCgyZTgpICogdmFsdWVNdWwgfSwgaW5kZXgsIGNvaW4ubmFtZSwgd2FzbVdhbGxldEtleXMpLFxuICAgICAgICB0b1Vuc3BlbnQoeyBzY3JpcHRUeXBlLCB2YWx1ZTogQmlnSW50KDNlOCkgKiB2YWx1ZU11bCB9LCBpbmRleCwgY29pbi5uYW1lLCB3YXNtV2FsbGV0S2V5cyksXG4gICAgICBdKTtcblxuICAgICAgLy8gQnVpbGQgc2lnbmluZyBrZXlzIHRyaXBsZTogcHJpdmtleSBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIHhwdWIgZnJvbSB3YWxsZXQga2V5c1xuICAgICAgY29uc3Qgc2lnbmluZ0tleXM6IFRyaXBsZTxCSVAzMj4gPSBbXG4gICAgICAgIHBhcmFtcy51c2VyUHJpdmtleSB8fCB1c2VyS2V5LFxuICAgICAgICBwYXJhbXMuYmFja3VwUHJpdmtleSB8fCBiYWNrdXBLZXksXG4gICAgICAgIGJpdGdvS2V5LCAvLyBiaXRnbyBpcyBhbHdheXMgeHB1YlxuICAgICAgXTtcblxuICAgICAgcHNidCA9IGJhY2t1cEtleVJlY292ZXJ5V2l0aFdhbGxldFVuc3BlbnRzKFxuICAgICAgICBjb2luLm5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRLZXlzOiB3YXNtV2FsbGV0S2V5cyxcbiAgICAgICAgICBrZXlzOiBzaWduaW5nS2V5cyxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgIGZlZVJhdGVTYXRWQjogZGVmYXVsdEZlZVJhdGVTYXRCLFxuICAgICAgICB9LFxuICAgICAgICByZWNvdmVyVW5zcGVudHNcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhcnNlIGdlbmVyYXRlZCBQU0JUXG4gICAgICBwYXJzZWQgPSBwc2J0LnBhcnNlVHJhbnNhY3Rpb25XaXRoV2FsbGV0S2V5cyh3YXNtV2FsbGV0S2V5cywgeyBwdWJsaWNLZXlzOiByZXBsYXlQcm90ZWN0aW9uIH0pO1xuXG4gICAgICAvLyBMb2FkIGFuZCBwYXJzZSBmaXh0dXJlIFBTQlRcbiAgICAgIGNvbnN0IHBzYnRIZXggPSBCdWZmZXIuZnJvbShwc2J0LnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBzdG9yZWRGaXh0dXJlID0gYXdhaXQgZ2V0Rml4dHVyZShmaXh0dXJlQ29pbiwgYHJlY292ZXJ5L2JhY2t1cEtleVJlY292ZXJ5UHNidC0ke3RhZ3Muam9pbignLScpfWAsIHtcbiAgICAgICAgcHNidEhleCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZml4dHVyZVBzYnQgPSBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQuZnJvbUJ5dGVzKFxuICAgICAgICBCdWZmZXIuZnJvbShzdG9yZWRGaXh0dXJlLnBzYnRIZXgsICdoZXgnKSxcbiAgICAgICAgZml4dHVyZUNvaW4ubmFtZVxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVQYXJzZWQgPSBmaXh0dXJlUHNidC5wYXJzZVRyYW5zYWN0aW9uV2l0aFdhbGxldEtleXMod2FzbVdhbGxldEtleXMsIHsgcHVibGljS2V5czogcmVwbGF5UHJvdGVjdGlvbiB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXMgZXhwZWN0ZWQgaW5wdXQgY291bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwYXJzZWQuaW5wdXRzLmxlbmd0aC5zaG91bGQuZXFsKHJlY292ZXJVbnNwZW50cy5sZW5ndGgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyByZWNvdmVyeSBkZXN0aW5hdGlvbiBvdXRwdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwYXJzZWQub3V0cHV0cy5sZW5ndGguc2hvdWxkLmJlLmdyZWF0ZXJUaGFuT3JFcXVhbCgxKTtcbiAgICAgIGNvbnN0IG91dHB1dEFkZHJlc3NlcyA9IHBhcnNlZC5vdXRwdXRzLm1hcCgobykgPT4gby5hZGRyZXNzKTtcbiAgICAgIG91dHB1dEFkZHJlc3Nlcy5pbmNsdWRlcyhyZWNvdmVyeURlc3RpbmF0aW9uKS5zaG91bGQuZXFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhcyBleHBlY3RlZCBmZWUgcmF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlucHV0U3VtID0gcmVjb3ZlclVuc3BlbnRzLnJlZHVjZSgoc3VtLCB1KSA9PiBzdW0gKyB1LnZhbHVlLCBCaWdJbnQoMCkpO1xuICAgICAgY29uc3Qgb3V0cHV0U3VtID0gcGFyc2VkLm91dHB1dHMucmVkdWNlKChzdW0sIG8pID0+IHN1bSArIG8udmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgICBjb25zdCBmZWUgPSBpbnB1dFN1bSAtIG91dHB1dFN1bTtcbiAgICAgIGNvbnN0IHZzaXplID0gZml4ZWRTY3JpcHRXYWxsZXQuRGltZW5zaW9ucy5mcm9tUHNidChwc2J0KS5nZXRWU2l6ZSgpO1xuICAgICAgY29uc3QgZmVlUmF0ZVNhdEIgPSBOdW1iZXIoZmVlKSAvIHZzaXplO1xuICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGZlZVJhdGVTYXRCIC0gZGVmYXVsdEZlZVJhdGVTYXRCKSAvIGRlZmF1bHRGZWVSYXRlU2F0QjtcbiAgICAgIC8vIHdpdGhpbiAxJVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRpZmYgPCAwLjAxLCB0cnVlLCBgZXhwZWN0ZWQgZmVlIHJhdGUgJHtkZWZhdWx0RmVlUmF0ZVNhdEJ9IGJ1dCBnb3QgJHtmZWVSYXRlU2F0Qn1gKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNoZWNrSW5wdXRzU2lnbmVkQnkoc2lnbmVySW5kZXg6IDAgfCAxIHwgMiwgZXhwZWN0U2lnbmVkOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBzaWduZXJLZXkgPSB4cHJpdnNbc2lnbmVySW5kZXhdO1xuICAgICAgZm9yIChsZXQgaW5wdXRJbmRleCA9IDA7IGlucHV0SW5kZXggPCByZWNvdmVyVW5zcGVudHMubGVuZ3RoOyBpbnB1dEluZGV4KyspIHtcbiAgICAgICAgY29uc3QgaGFzU2lnID0gcHNidC52ZXJpZnlTaWduYXR1cmUoaW5wdXRJbmRleCwgc2lnbmVyS2V5KTtcbiAgICAgICAgaGFzU2lnLnNob3VsZC5lcWwoZXhwZWN0U2lnbmVkLCBgaW5wdXQgJHtpbnB1dEluZGV4fSBzaWduZXIgJHtzaWduZXJJbmRleH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpdCgocGFyYW1zLnVzZXJQcml2a2V5ID8gJ2hhcycgOiAnaGFzIG5vJykgKyAnIHVzZXIgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY2hlY2tJbnB1dHNTaWduZWRCeSgwLCAhIXBhcmFtcy51c2VyUHJpdmtleSk7XG4gICAgfSk7XG5cbiAgICBpdCgocGFyYW1zLmJhY2t1cFByaXZrZXkgPyAnaGFzJyA6ICdoYXMgbm8nKSArICcgYmFja3VwIHNpZ25hdHVyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoZWNrSW5wdXRzU2lnbmVkQnkoMSwgISFwYXJhbXMuYmFja3VwUHJpdmtleSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWF0Y2hlcyBQU0JUIGZpeHR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZCwgZml4dHVyZVBhcnNlZCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5XaXRoU2NyaXB0VHlwZXMoc2NyaXB0VHlwZXM6IFNjcmlwdFR5cGUyT2YzW10pIHtcbiAgdXR4b0NvaW5zXG4gICAgLmZpbHRlcigoY29pbikgPT4gc2NyaXB0VHlwZXMuZXZlcnkoKHR5cGUpID0+IGNvaW4uc3VwcG9ydHNBZGRyZXNzVHlwZSh0eXBlKSkpXG4gICAgLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICAgIC8vIFVuc2lnbmVkIHN3ZWVwIC0gbm8gc2lnbmF0dXJlc1xuICAgICAgcnVuKGNvaW4sIHNjcmlwdFR5cGVzLCB3YXNtV2FsbGV0S2V5cywge30sIFsndW5zaWduZWQnLCAuLi5zY3JpcHRUeXBlc10pO1xuXG4gICAgICAvLyBVc2VyIHNpZ25lZCBvbmx5IChLUlMgc2NlbmFyaW8pXG4gICAgICBydW4oY29pbiwgc2NyaXB0VHlwZXMsIHdhc21XYWxsZXRLZXlzLCB7IHVzZXJQcml2a2V5IH0sIFsndXNlclNpZ25lZCcsIC4uLnNjcmlwdFR5cGVzXSk7XG5cbiAgICAgIC8vIEZ1bGx5IHNpZ25lZCByZWNvdmVyeVxuICAgICAgcnVuKGNvaW4sIHNjcmlwdFR5cGVzLCB3YXNtV2FsbGV0S2V5cywgeyB1c2VyUHJpdmtleSwgYmFja3VwUHJpdmtleSB9LCBbJ2Z1bGx5U2lnbmVkJywgLi4uc2NyaXB0VHlwZXNdKTtcblxuICAgICAgLy8gRnVsbHkgc2lnbmVkIHdpdGggY3VzdG9tIHVzZXIga2V5IHBhdGhcbiAgICAgIHJ1bihjb2luLCBzY3JpcHRUeXBlcywgd2FzbUV4b3RpY1dhbGxldEtleXMsIHsgdXNlclByaXZrZXksIGJhY2t1cFByaXZrZXkgfSwgW1xuICAgICAgICAnZnVsbHlTaWduZWQnLFxuICAgICAgICAnY3VzdG9tVXNlcktleVBhdGgnLFxuICAgICAgICAuLi5zY3JpcHRUeXBlcyxcbiAgICAgIF0pO1xuICAgIH0pO1xufVxuXG5kZXNjcmliZSgnQmFja3VwIEtleSBSZWNvdmVyeSBQU0JUJywgZnVuY3Rpb24gKCkge1xuICAvLyBjb21wYXRpYmxlIHdpdGggYWxsIGNvaW5zXG4gIHJ1bldpdGhTY3JpcHRUeXBlcyhbJ3Ayc2gnXSk7XG5cbiAgLy8gc2Vnd2l0IGNvbXBhdGlibGUgY29pbnNcbiAgcnVuV2l0aFNjcmlwdFR5cGVzKFsncDJzaFAyd3NoJywgJ3Ayd3NoJ10pO1xuXG4gIC8vIHRhcHJvb3QgY29tcGF0aWJsZSBjb2luc1xuICBydW5XaXRoU2NyaXB0VHlwZXMoWydwMnRyJywgJ3AydHJNdXNpZzInXSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backupKeyRecoveryUnspentGathering.d.ts","sourceRoot":"","sources":["../../../../../test/unit/recovery/backupKeyRecoveryUnspentGathering.ts"],"names":[],"mappings":""}
|