@bitgo/abstract-utxo 10.16.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 +9 -13
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/cjs/src/abstractUtxoCoin.js +28 -14
- package/dist/cjs/src/address/fixedScript.d.ts +4 -9
- package/dist/cjs/src/address/fixedScript.d.ts.map +1 -1
- package/dist/cjs/src/address/fixedScript.js +18 -50
- 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/btc/inscriptionBuilder.d.ts +15 -5
- package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -1
- package/dist/cjs/src/impl/btc/inscriptionBuilder.js +43 -55
- 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/keychains.d.ts +5 -0
- package/dist/cjs/src/keychains.d.ts.map +1 -1
- package/dist/cjs/src/keychains.js +10 -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 +5 -3
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/SigningError.js +10 -2
- 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 +8 -12
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts +2 -2
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +36 -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 +3 -2
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +15 -25
- 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/outputDifference.d.ts +5 -1
- package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -1
- package/dist/cjs/src/transaction/outputDifference.js +6 -2
- package/dist/cjs/src/transaction/recipient.d.ts +5 -0
- package/dist/cjs/src/transaction/recipient.d.ts.map +1 -1
- package/dist/cjs/src/transaction/recipient.js +14 -1
- 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/coins.js +7 -2
- 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 +2 -2
- package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -1
- package/dist/cjs/test/unit/descriptorAddress.js +10 -9
- 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 -31
- package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +82 -258
- 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 +41 -37
- 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 +50 -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/fixedScript/parsePsbt.js +2 -2
- package/dist/cjs/test/unit/transaction/outputDifference.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction/outputDifference.js +117 -0
- package/dist/cjs/test/unit/transaction.js +8 -226
- package/dist/cjs/test/unit/txFormat.d.ts.map +1 -1
- package/dist/cjs/test/unit/txFormat.js +9 -9
- 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/nockIndexerAPI.d.ts.map +1 -1
- package/dist/cjs/test/unit/util/nockIndexerAPI.js +4 -37
- 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 +22 -2
- 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 +9 -13
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/esm/abstractUtxoCoin.js +30 -16
- package/dist/esm/address/fixedScript.d.ts +4 -9
- package/dist/esm/address/fixedScript.d.ts.map +1 -1
- package/dist/esm/address/fixedScript.js +18 -17
- 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/btc/inscriptionBuilder.d.ts +15 -5
- package/dist/esm/impl/btc/inscriptionBuilder.d.ts.map +1 -1
- package/dist/esm/impl/btc/inscriptionBuilder.js +44 -23
- 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/keychains.d.ts +5 -0
- package/dist/esm/keychains.d.ts.map +1 -1
- package/dist/esm/keychains.js +9 -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 +5 -3
- package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/SigningError.js +8 -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 +8 -12
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +2 -2
- package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/parseTransaction.js +36 -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 +3 -2
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtWasm.js +14 -24
- 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/outputDifference.d.ts +5 -1
- package/dist/esm/transaction/outputDifference.d.ts.map +1 -1
- package/dist/esm/transaction/outputDifference.js +5 -2
- package/dist/esm/transaction/recipient.d.ts +5 -0
- package/dist/esm/transaction/recipient.d.ts.map +1 -1
- package/dist/esm/transaction/recipient.js +13 -1
- 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 +13 -14
- 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
- package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts.map +0 -1
- package/dist/cjs/test/unit/transaction/descriptor/outputDifference.js +0 -76
- /package/dist/cjs/test/unit/transaction/{descriptor/outputDifference.d.ts → outputDifference.d.ts} +0 -0
|
@@ -1,56 +1,20 @@
|
|
|
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
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
exports.getWallet = getWallet;
|
|
37
4
|
exports.getWalletKeys = getWalletKeys;
|
|
38
5
|
exports.isWalletAddress = isWalletAddress;
|
|
39
6
|
exports.convertLtcAddressToLegacyFormat = convertLtcAddressToLegacyFormat;
|
|
40
7
|
exports.recoverCrossChain = recoverCrossChain;
|
|
41
|
-
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
42
8
|
const secp256k1_1 = require("@bitgo/secp256k1");
|
|
43
|
-
const unspents_1 = require("@bitgo/unspents");
|
|
44
9
|
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
45
10
|
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
46
11
|
const sdk_api_1 = require("@bitgo/sdk-api");
|
|
47
12
|
const signTransaction_1 = require("../transaction/fixedScript/signTransaction");
|
|
48
|
-
const names_1 = require("../names");
|
|
49
13
|
const decode_1 = require("../transaction/decode");
|
|
50
14
|
const replayProtection_1 = require("../transaction/fixedScript/replayProtection");
|
|
51
15
|
const tnumber_1 = require("../tnumber");
|
|
16
|
+
const unspent_1 = require("../unspent");
|
|
52
17
|
const psbt_1 = require("./psbt");
|
|
53
|
-
const { unspentSum } = utxolib.bitgo;
|
|
54
18
|
async function getWallet(bitgo, coin, walletId) {
|
|
55
19
|
try {
|
|
56
20
|
return await coin.wallets().get({ id: walletId });
|
|
@@ -86,7 +50,7 @@ async function getWalletKeys(recoveryCoin, wallet) {
|
|
|
86
50
|
else {
|
|
87
51
|
xpubs = wallet.keychains.map((k) => k.xpub);
|
|
88
52
|
}
|
|
89
|
-
return
|
|
53
|
+
return wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from(xpubs);
|
|
90
54
|
}
|
|
91
55
|
async function isWalletAddress(wallet, address) {
|
|
92
56
|
try {
|
|
@@ -104,8 +68,9 @@ async function isWalletAddress(wallet, address) {
|
|
|
104
68
|
}
|
|
105
69
|
}
|
|
106
70
|
/**
|
|
107
|
-
* Convert a Litecoin P2SH address from M... format (scriptHash 0x32) to the legacy 3... format (scriptHash 0x05)
|
|
108
|
-
*
|
|
71
|
+
* Convert a Litecoin P2SH address from M... format (scriptHash 0x32) to the legacy 3... format (scriptHash 0x05)
|
|
72
|
+
* and Q... format (scriptHash 0x32) to the legacy 2... format (scriptHash 0x05).
|
|
73
|
+
* This is needed for cross-chain recovery when (T)LTC was sent to a (T)BTC address, because the (T)BTC wallet
|
|
109
74
|
* stores addresses in the 3... format while the LTC blockchain returns addresses in M... format.
|
|
110
75
|
*
|
|
111
76
|
* @param address - LTC address to convert
|
|
@@ -113,30 +78,17 @@ async function isWalletAddress(wallet, address) {
|
|
|
113
78
|
* @returns The address in legacy 3... format, or the original address if it's not a P2SH address
|
|
114
79
|
*/
|
|
115
80
|
function convertLtcAddressToLegacyFormat(address, coinName) {
|
|
116
|
-
|
|
117
|
-
try {
|
|
118
|
-
// Try to decode as bech32 - these don't need conversion
|
|
119
|
-
utxolib.address.fromBech32(address);
|
|
120
|
-
return address;
|
|
121
|
-
}
|
|
122
|
-
catch (e) {
|
|
123
|
-
// Not bech32, continue to base58
|
|
124
|
-
}
|
|
125
|
-
try {
|
|
126
|
-
const decoded = utxolib.address.fromBase58Check(address, network);
|
|
127
|
-
// Only convert P2SH addresses (scriptHash), not P2PKH (pubKeyHash)
|
|
128
|
-
if (decoded.version === network.scriptHash) {
|
|
129
|
-
// Convert to legacy format using Bitcoin's scriptHash (0x05)
|
|
130
|
-
const legacyScriptHash = utxolib.networks.bitcoin.scriptHash;
|
|
131
|
-
return utxolib.address.toBase58Check(decoded.hash, legacyScriptHash, network);
|
|
132
|
-
}
|
|
133
|
-
// P2PKH or other - return unchanged
|
|
81
|
+
if (coinName !== 'ltc' && coinName !== 'tltc') {
|
|
134
82
|
return address;
|
|
135
83
|
}
|
|
136
|
-
|
|
137
|
-
|
|
84
|
+
// only consider addresses that start with M or Q (modern ltc p2sh prefixes)
|
|
85
|
+
if (!address.startsWith('M') && !address.startsWith('Q')) {
|
|
138
86
|
return address;
|
|
139
87
|
}
|
|
88
|
+
const scriptPubKey = wasm_utxo_1.address.toOutputScriptWithCoin(address, coinName);
|
|
89
|
+
const dstCoin = coinName === 'ltc' ? 'btc' : 'tbtc';
|
|
90
|
+
const dstAddress = wasm_utxo_1.address.fromOutputScriptWithCoin(scriptPubKey, dstCoin);
|
|
91
|
+
return dstAddress;
|
|
140
92
|
}
|
|
141
93
|
/**
|
|
142
94
|
* @param coin
|
|
@@ -176,12 +128,12 @@ async function getAllRecoveryOutputs(coin, txid, amountType = 'number', wallet,
|
|
|
176
128
|
return {
|
|
177
129
|
...recoveryOutput,
|
|
178
130
|
address: coin.canonicalAddress(recoveryOutput.address),
|
|
179
|
-
value:
|
|
131
|
+
value: (0, tnumber_1.toTNumber)(BigInt(recoveryOutput.value), amountType),
|
|
180
132
|
};
|
|
181
133
|
});
|
|
182
134
|
}
|
|
183
135
|
async function getScriptId(coin, wallet, script) {
|
|
184
|
-
const address =
|
|
136
|
+
const address = wasm_utxo_1.address.fromOutputScriptWithCoin(script, coin.name);
|
|
185
137
|
let addressData;
|
|
186
138
|
if (wallet instanceof sdk_core_1.Wallet) {
|
|
187
139
|
addressData = await wallet.getAddress({ address });
|
|
@@ -210,7 +162,7 @@ async function toWalletUnspents(sourceCoin, recoveryCoin, unspents, wallet) {
|
|
|
210
162
|
for (const address of addresses) {
|
|
211
163
|
let scriptId;
|
|
212
164
|
try {
|
|
213
|
-
scriptId = await getScriptId(recoveryCoin, wallet,
|
|
165
|
+
scriptId = await getScriptId(recoveryCoin, wallet, wasm_utxo_1.address.toOutputScriptWithCoin(address, sourceCoin.name));
|
|
214
166
|
}
|
|
215
167
|
catch (e) {
|
|
216
168
|
console.error(`error getting scriptId for ${address}:`, e);
|
|
@@ -280,46 +232,17 @@ async function getPrv(xprv, passphrase, wallet) {
|
|
|
280
232
|
}
|
|
281
233
|
return getPrv((0, sdk_api_1.decrypt)(passphrase, encryptedPrv));
|
|
282
234
|
}
|
|
283
|
-
/**
|
|
284
|
-
* Create a sweep transaction for cross-chain recovery using PSBT (utxolib implementation)
|
|
285
|
-
* @param network
|
|
286
|
-
* @param walletKeys
|
|
287
|
-
* @param unspents
|
|
288
|
-
* @param targetAddress
|
|
289
|
-
* @param feeRateSatVB
|
|
290
|
-
* @return unsigned PSBT
|
|
291
|
-
*/
|
|
292
|
-
function createSweepTransactionUtxolib(coinName, walletKeys, unspents, targetAddress, feeRateSatVB) {
|
|
293
|
-
const network = (0, names_1.getNetworkFromCoinName)(coinName);
|
|
294
|
-
const inputValue = unspentSum(unspents.map((u) => ({ ...u, value: BigInt(u.value) })), 'bigint');
|
|
295
|
-
const vsize = unspents_1.Dimensions.fromUnspents(unspents, {
|
|
296
|
-
p2tr: { scriptPathLevel: 1 },
|
|
297
|
-
p2trMusig2: { scriptPathLevel: undefined },
|
|
298
|
-
})
|
|
299
|
-
.plus(unspents_1.Dimensions.fromOutput({ script: utxolib.address.toOutputScript(targetAddress, network) }))
|
|
300
|
-
.getVSize();
|
|
301
|
-
const fee = BigInt(Math.round(vsize * feeRateSatVB));
|
|
302
|
-
const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
|
|
303
|
-
utxolib.bitgo.addXpubsToPsbt(psbt, walletKeys);
|
|
304
|
-
unspents.forEach((unspent) => {
|
|
305
|
-
utxolib.bitgo.addWalletUnspentToPsbt(psbt, { ...unspent, value: BigInt(unspent.value) }, walletKeys, 'user', 'backup', { skipNonWitnessUtxo: true });
|
|
306
|
-
});
|
|
307
|
-
const recoveryOutputScript = utxolib.address.toOutputScript(targetAddress, network);
|
|
308
|
-
psbt.addOutput({ script: recoveryOutputScript, value: inputValue - fee });
|
|
309
|
-
return psbt;
|
|
310
|
-
}
|
|
311
235
|
/**
|
|
312
236
|
* Create a sweep transaction for cross-chain recovery using wasm-utxo
|
|
313
|
-
* @param
|
|
237
|
+
* @param coinName - BitGo coin name (e.g. 'btc', 'tbtc', 'ltc')
|
|
314
238
|
* @param walletKeys
|
|
315
239
|
* @param unspents
|
|
316
240
|
* @param targetAddress
|
|
317
241
|
* @param feeRateSatVB
|
|
318
|
-
* @param coinName - BitGo coin name (e.g. 'btc', 'tbtc', 'ltc')
|
|
319
242
|
* @return unsigned PSBT
|
|
320
243
|
*/
|
|
321
|
-
function
|
|
322
|
-
const inputValue =
|
|
244
|
+
function createSweepTransaction(coinName, walletKeys, unspents, targetAddress, feeRateSatVB) {
|
|
245
|
+
const inputValue = (0, unspent_1.unspentSum)(unspents);
|
|
323
246
|
// Create PSBT with wasm-utxo and add wallet inputs using shared utilities
|
|
324
247
|
const unspentsBigint = unspents.map((u) => ({ ...u, value: BigInt(u.value) }));
|
|
325
248
|
const wasmPsbt = (0, psbt_1.createEmptyWasmPsbt)(coinName, walletKeys);
|
|
@@ -331,28 +254,8 @@ function createSweepTransactionWasm(coinName, walletKeys, unspents, targetAddres
|
|
|
331
254
|
const fee = BigInt(Math.round(vsize * feeRateSatVB));
|
|
332
255
|
// Add output to wasm PSBT
|
|
333
256
|
(0, psbt_1.addOutputToWasmPsbt)(wasmPsbt, targetAddress, inputValue - fee, coinName);
|
|
334
|
-
// Convert to utxolib PSBT for signing and return
|
|
335
257
|
return wasmPsbt;
|
|
336
258
|
}
|
|
337
|
-
/**
|
|
338
|
-
* Create a sweep transaction for cross-chain recovery using PSBT
|
|
339
|
-
* @param network
|
|
340
|
-
* @param walletKeys
|
|
341
|
-
* @param unspents
|
|
342
|
-
* @param targetAddress
|
|
343
|
-
* @param feeRateSatVB
|
|
344
|
-
* @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
|
|
345
|
-
* @param coinName - BitGo coin name (required for wasm-utxo backend)
|
|
346
|
-
* @return unsigned PSBT
|
|
347
|
-
*/
|
|
348
|
-
function createSweepTransaction(coinName, walletKeys, unspents, targetAddress, feeRateSatVB, backend = 'wasm-utxo') {
|
|
349
|
-
if (backend === 'wasm-utxo') {
|
|
350
|
-
return createSweepTransactionWasm(coinName, walletKeys, unspents, targetAddress, feeRateSatVB);
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
return createSweepTransactionUtxolib(coinName, walletKeys, unspents, targetAddress, feeRateSatVB);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
259
|
/**
|
|
357
260
|
* Recover wallet deposits that were received on the wrong blockchain
|
|
358
261
|
* (for instance bitcoin deposits that were received for a litecoin wallet).
|
|
@@ -367,13 +270,11 @@ async function recoverCrossChain(bitgo, params) {
|
|
|
367
270
|
const wallet = await getWallet(bitgo, params.recoveryCoin, params.walletId);
|
|
368
271
|
const unspents = await getAllRecoveryOutputs(params.sourceCoin, params.txid, params.sourceCoin.amountType, wallet, params.apiKey);
|
|
369
272
|
const walletUnspents = await toWalletUnspents(params.sourceCoin, params.recoveryCoin, unspents, wallet);
|
|
370
|
-
const walletKeys = await getWalletKeys(params.recoveryCoin, wallet);
|
|
273
|
+
const walletKeys = wasm_utxo_1.fixedScriptWallet.RootWalletKeys.from(await getWalletKeys(params.recoveryCoin, wallet));
|
|
371
274
|
const prv = params.xprv || params.walletPassphrase ? await getPrv(params.xprv, params.walletPassphrase, wallet) : undefined;
|
|
372
275
|
const feeRateSatVB = await getFeeRateSatVB(params.sourceCoin);
|
|
373
276
|
// Create PSBT for both signed and unsigned recovery
|
|
374
|
-
|
|
375
|
-
const backend = (0, names_1.isTestnetCoin)(params.sourceCoin.name) ? 'wasm-utxo' : 'utxolib';
|
|
376
|
-
let psbt = createSweepTransaction(params.sourceCoin.getChain(), walletKeys, walletUnspents, params.recoveryAddress, feeRateSatVB, backend);
|
|
277
|
+
let psbt = createSweepTransaction(params.sourceCoin.getChain(), walletKeys, walletUnspents, params.recoveryAddress, feeRateSatVB);
|
|
377
278
|
// For unsigned recovery, return unsigned PSBT hex
|
|
378
279
|
if (!prv) {
|
|
379
280
|
return {
|
|
@@ -384,7 +285,7 @@ async function recoverCrossChain(bitgo, params) {
|
|
|
384
285
|
};
|
|
385
286
|
}
|
|
386
287
|
// For signed recovery, sign the PSBT with user key and return half-signed PSBT
|
|
387
|
-
psbt = (0, signTransaction_1.signAndVerifyPsbt)(psbt, prv,
|
|
288
|
+
psbt = (0, signTransaction_1.signAndVerifyPsbt)(psbt, prv, walletKeys, {
|
|
388
289
|
publicKeys: (0, replayProtection_1.getReplayProtectionPubkeys)(params.sourceCoin.name),
|
|
389
290
|
});
|
|
390
291
|
return {
|
|
@@ -396,4 +297,4 @@ async function recoverCrossChain(bitgo, params) {
|
|
|
396
297
|
recoveryAmount: (0, tnumber_1.toTNumber)((0, psbt_1.getRecoveryAmount)(psbt, walletKeys, params.recoveryAddress), params.sourceCoin.amountType),
|
|
397
298
|
};
|
|
398
299
|
}
|
|
399
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NDaGFpblJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtFQSw4QkFvQkM7QUFPRCxzQ0FpQkM7QUFFRCwwQ0FhQztBQVdELDBFQXdCQztBQW9VRCw4Q0F3REM7QUE1aEJELHlEQUEyQztBQUMzQyxnREFBeUQ7QUFDekQsOENBQTZDO0FBQzdDLGdEQUErRDtBQUMvRCw4Q0FBK0U7QUFDL0UsNENBQXlDO0FBR3pDLGdGQUErRTtBQUMvRSxvQ0FBK0U7QUFDL0Usa0RBQTBEO0FBQzFELGtGQUF5RjtBQUN6Rix3Q0FBdUM7QUFFdkMsaUNBTWdCO0FBRWhCLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBNEM5QixLQUFLLFVBQVUsU0FBUyxDQUM3QixLQUFnQixFQUNoQixJQUFzQixFQUN0QixRQUFnQjtJQUVoQixJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsK0NBQStDO1FBQy9DLGtKQUFrSjtRQUNsSixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7WUFDcEIsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFN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QyxVQUFVLENBQUMsRUFBRTtRQUNyRixVQUFVLEVBQUUsSUFBQSw2Q0FBMEIsRUFBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztLQUMvRCxDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsT0FBTyxFQUFFLE1BQU0sWUFBWSxpQkFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1FBQ3pCLEtBQUssRUFBRSxJQUFBLDBCQUFpQixFQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDOUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1FBQ3hDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtRQUM1QyxjQUFjLEVBQUUsSUFBQSxtQkFBUyxFQUN2QixJQUFBLHdCQUFpQixFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUMzRCxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FDbEI7S0FDYixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBiaXAzMiB9IGZyb20gJ0BiaXRnby9zZWNwMjU2azEnO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQgeyBDb2luTmFtZSwgZml4ZWRTY3JpcHRXYWxsZXQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IEJpdEdvQmFzZSwgSVdhbGxldCwgS2V5Y2hhaW4sIFRyaXBsZSwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGRlY3J5cHQgfSBmcm9tICdAYml0Z28vc2RrLWFwaSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIFRyYW5zYWN0aW9uSW5mbyB9IGZyb20gJy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgc2lnbkFuZFZlcmlmeVBzYnQgfSBmcm9tICcuLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9zaWduVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0TmV0d29ya0Zyb21Db2luTmFtZSwgaXNUZXN0bmV0Q29pbiwgVXR4b0NvaW5OYW1lIH0gZnJvbSAnLi4vbmFtZXMnO1xuaW1wb3J0IHsgZW5jb2RlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbi9kZWNvZGUnO1xuaW1wb3J0IHsgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMgfSBmcm9tICcuLi90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9yZXBsYXlQcm90ZWN0aW9uJztcbmltcG9ydCB7IHRvVE51bWJlciB9IGZyb20gJy4uL3RudW1iZXInO1xuXG5pbXBvcnQge1xuICBQc2J0QmFja2VuZCxcbiAgY3JlYXRlRW1wdHlXYXNtUHNidCxcbiAgYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidCxcbiAgYWRkT3V0cHV0VG9XYXNtUHNidCxcbiAgZ2V0UmVjb3ZlcnlBbW91bnQsXG59IGZyb20gJy4vcHNidCc7XG5cbmNvbnN0IHsgdW5zcGVudFN1bSB9ID0gdXR4b2xpYi5iaXRnbztcbnR5cGUgUm9vdFdhbGxldEtleXMgPSB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzO1xudHlwZSBVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gdXR4b2xpYi5iaXRnby5VbnNwZW50PFROdW1iZXI+O1xudHlwZSBXYWxsZXRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50PFROdW1iZXI+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkUmVjb3ZlcnlUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB3YWxsZXQ6IHN0cmluZztcbiAgZmF1bHR5VHhJZDogc3RyaW5nO1xuICByZWNvdmVyeUFkZHJlc3M6IHN0cmluZztcbn1cblxudHlwZSBGZWVJbmZvID0ge1xuICBzaXplOiBudW1iZXI7XG4gIGZlZVJhdGU6IG51bWJlcjtcbiAgZmVlOiBudW1iZXI7XG4gIHBheUdvRmVlOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB3YWxsZXRJZDogc3RyaW5nO1xuICBmZWVJbmZvPzogRmVlSW5mbztcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdmVyc2lvbjogMSB8IDI7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgd2FsbGV0SWQ6IHN0cmluZztcbiAgc291cmNlQ29pbjogc3RyaW5nO1xuICByZWNvdmVyeUNvaW46IHN0cmluZztcbiAgcmVjb3ZlcnlBZGRyZXNzPzogc3RyaW5nO1xuICByZWNvdmVyeUFtb3VudD86IFROdW1iZXI7XG59XG5cbnR5cGUgV2FsbGV0VjEgPSB7XG4gIGtleWNoYWluczogeyB4cHViOiBzdHJpbmcgfVtdO1xuICBhZGRyZXNzKHsgYWRkcmVzcyB9OiB7IGFkZHJlc3M6IHN0cmluZyB9KTogUHJvbWlzZTx7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfT47XG4gIGdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpOiBQcm9taXNlPHsgZW5jcnlwdGVkWHBydjogc3RyaW5nIH0+O1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdhbGxldChcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgd2FsbGV0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxJV2FsbGV0IHwgV2FsbGV0VjE+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY29pbi53YWxsZXRzKCkuZ2V0KHsgaWQ6IHdhbGxldElkIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVE9ETzogQkctNDYzNjQgaGFuZGxlIGVycm9ycyBtb3JlIGdyYWNlZnVsbHlcbiAgICAvLyBUaGUgdjIgZW5kcG9pbnQgY29pbi53YWxsZXRzKCkuZ2V0KCkgbWF5IHRocm93IDQwNCBvciA0MDAgZXJyb3JzLCBidXQgdGhpcyBzaG91bGQgbm90IHByZXZlbnQgdXMgZnJvbSBzZWFyY2hpbmcgZm9yIHRoZSB3YWxsZXRJZCBpbiB2MSB3YWxsZXRzLlxuICAgIGlmIChlLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgYml0Z28ud2FsbGV0cygpLmdldCh7IGlkOiB3YWxsZXRJZCB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgY291bGQgbm90IGdldCB3YWxsZXQgJHt3YWxsZXRJZH0gZnJvbSB2MSBvciB2MjogJHtlLnRvU3RyaW5nKCl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gcmVjb3ZlcnlDb2luXG4gKiBAcGFyYW0gd2FsbGV0XG4gKiBAcmV0dXJuIHdhbGxldCBwdWJrZXlzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXYWxsZXRLZXlzKFxuICByZWNvdmVyeUNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxXG4pOiBQcm9taXNlPFJvb3RXYWxsZXRLZXlzPiB7XG4gIGxldCB4cHViczogVHJpcGxlPHN0cmluZz47XG5cbiAgaWYgKHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IChhd2FpdCByZWNvdmVyeUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQgfSkpIGFzIHVua25vd24gYXMgS2V5Y2hhaW5bXTtcbiAgICBpZiAoa2V5Y2hhaW5zLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCB0cmlwbGUgZ290ICR7a2V5Y2hhaW5zLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgeHB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiBrLnB1YikgYXMgVHJpcGxlPHN0cmluZz47XG4gIH0gZWxzZSB7XG4gICAgeHB1YnMgPSAod2FsbGV0IGFzIFdhbGxldFYxKS5rZXljaGFpbnMubWFwKChrKSA9PiBrLnhwdWIpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICB9XG5cbiAgcmV0dXJuIG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKHhwdWJzLm1hcCgoaykgPT4gYmlwMzIuZnJvbUJhc2U1OChrKSkgYXMgVHJpcGxlPEJJUDMySW50ZXJmYWNlPik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1dhbGxldEFkZHJlc3Mod2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjEsIGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGxldCBhZGRyZXNzRGF0YTtcbiAgICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgICBhZGRyZXNzRGF0YSA9IGF3YWl0IHdhbGxldC5nZXRBZGRyZXNzKHsgYWRkcmVzcyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkcmVzc0RhdGEgPSBhd2FpdCAod2FsbGV0IGFzIFdhbGxldFYxKS5hZGRyZXNzKHsgYWRkcmVzcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkcmVzc0RhdGEgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBMaXRlY29pbiBQMlNIIGFkZHJlc3MgZnJvbSBNLi4uIGZvcm1hdCAoc2NyaXB0SGFzaCAweDMyKSB0byB0aGUgbGVnYWN5IDMuLi4gZm9ybWF0IChzY3JpcHRIYXNoIDB4MDUpLlxuICogVGhpcyBpcyBuZWVkZWQgZm9yIGNyb3NzLWNoYWluIHJlY292ZXJ5IHdoZW4gTFRDIHdhcyBzZW50IHRvIGEgQlRDIGFkZHJlc3MsIGJlY2F1c2UgdGhlIEJUQyB3YWxsZXRcbiAqIHN0b3JlcyBhZGRyZXNzZXMgaW4gdGhlIDMuLi4gZm9ybWF0IHdoaWxlIHRoZSBMVEMgYmxvY2tjaGFpbiByZXR1cm5zIGFkZHJlc3NlcyBpbiBNLi4uIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gYWRkcmVzcyAtIExUQyBhZGRyZXNzIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSBjb2luTmFtZSAtIFRoZSBjb2luIG5hbWUgKGUuZy4gJ2x0YycsICd0bHRjJylcbiAqIEByZXR1cm5zIFRoZSBhZGRyZXNzIGluIGxlZ2FjeSAzLi4uIGZvcm1hdCwgb3IgdGhlIG9yaWdpbmFsIGFkZHJlc3MgaWYgaXQncyBub3QgYSBQMlNIIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMdGNBZGRyZXNzVG9MZWdhY3lGb3JtYXQoYWRkcmVzczogc3RyaW5nLCBjb2luTmFtZTogVXR4b0NvaW5OYW1lKTogc3RyaW5nIHtcbiAgY29uc3QgbmV0d29yayA9IGdldE5ldHdvcmtGcm9tQ29pbk5hbWUoY29pbk5hbWUpO1xuICB0cnkge1xuICAgIC8vIFRyeSB0byBkZWNvZGUgYXMgYmVjaDMyIC0gdGhlc2UgZG9uJ3QgbmVlZCBjb252ZXJzaW9uXG4gICAgdXR4b2xpYi5hZGRyZXNzLmZyb21CZWNoMzIoYWRkcmVzcyk7XG4gICAgcmV0dXJuIGFkZHJlc3M7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBOb3QgYmVjaDMyLCBjb250aW51ZSB0byBiYXNlNThcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZGVjb2RlZCA9IHV0eG9saWIuYWRkcmVzcy5mcm9tQmFzZTU4Q2hlY2soYWRkcmVzcywgbmV0d29yayk7XG4gICAgLy8gT25seSBjb252ZXJ0IFAyU0ggYWRkcmVzc2VzIChzY3JpcHRIYXNoKSwgbm90IFAyUEtIIChwdWJLZXlIYXNoKVxuICAgIGlmIChkZWNvZGVkLnZlcnNpb24gPT09IG5ldHdvcmsuc2NyaXB0SGFzaCkge1xuICAgICAgLy8gQ29udmVydCB0byBsZWdhY3kgZm9ybWF0IHVzaW5nIEJpdGNvaW4ncyBzY3JpcHRIYXNoICgweDA1KVxuICAgICAgY29uc3QgbGVnYWN5U2NyaXB0SGFzaCA9IHV0eG9saWIubmV0d29ya3MuYml0Y29pbi5zY3JpcHRIYXNoO1xuICAgICAgcmV0dXJuIHV0eG9saWIuYWRkcmVzcy50b0Jhc2U1OENoZWNrKGRlY29kZWQuaGFzaCwgbGVnYWN5U2NyaXB0SGFzaCwgbmV0d29yayk7XG4gICAgfVxuICAgIC8vIFAyUEtIIG9yIG90aGVyIC0gcmV0dXJuIHVuY2hhbmdlZFxuICAgIHJldHVybiBhZGRyZXNzO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWYgZGVjb2RpbmcgZmFpbHMsIHJldHVybiB0aGUgb3JpZ2luYWwgYWRkcmVzc1xuICAgIHJldHVybiBhZGRyZXNzO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIGNvaW5cbiAqIEBwYXJhbSB0eGlkXG4gKiBAcGFyYW0gYW1vdW50VHlwZVxuICogQHBhcmFtIHdhbGxldFxuICogQHBhcmFtIGFwaUtleSAtIGEgYmxvY2tjaGFpciBhcGkga2V5XG4gKiBAcmV0dXJuIGFsbCB1bnNwZW50cyBmb3IgdHJhbnNhY3Rpb24gb3V0cHV0cywgaW5jbHVkaW5nIG91dHB1dHMgZnJvbSBvdGhlciB0cmFuc2FjdGlvbnNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsUmVjb3ZlcnlPdXRwdXRzPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB0eGlkOiBzdHJpbmcsXG4gIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJyxcbiAgd2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjEsXG4gIGFwaUtleT86IHN0cmluZ1xuKTogUHJvbWlzZTxVbnNwZW50PFROdW1iZXI+W10+IHtcbiAgY29uc3QgYXBpID0gY29pbi5nZXRSZWNvdmVyeVByb3ZpZGVyKGFwaUtleSk7XG4gIGNvbnN0IHR4ID0gYXdhaXQgYXBpLmdldFRyYW5zYWN0aW9uSU8odHhpZCk7XG4gIGNvbnN0IHdhbGxldEFkZHJlc3NlcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHR4Lm91dHB1dHMubWFwKGFzeW5jIChvdXRwdXQpID0+IHtcbiAgICAgICAgLy8gRm9yIHNvbWUgY29pbnMgKGJjaCkgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBhZGRyZXNzIHRvIGxlZ2FjeSBmb3JtYXQgc2luY2UgdGhlIGFwaSByZXR1cm5zIHRoZSBhZGRyZXNzXG4gICAgICAgIC8vIGluIG5vbiBsZWdhY3kgZm9ybWF0LiBIb3dldmVyLCB3ZSB3YW50IHRvIGtlZXAgdGhlIGFkZHJlc3MgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSByZXNwb25zZSBzaW5jZSB3ZVxuICAgICAgICAvLyBhcmUgZ29pbmcgdG8gaGl0IHRoZSBBUEkgYWdhaW4gdG8gZmV0Y2ggYWRkcmVzcyB1bnNwZW50cy5cbiAgICAgICAgY29uc3QgY2Fub25pY2FsQWRkcmVzcyA9IGNvaW4uY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcyk7XG4gICAgICAgIGxldCBpc1dhbGxldE93bmVkID0gYXdhaXQgaXNXYWxsZXRBZGRyZXNzKHdhbGxldCwgY2Fub25pY2FsQWRkcmVzcyk7XG5cbiAgICAgICAgLy8gRm9yIExUQyBjcm9zcy1jaGFpbiByZWNvdmVyeTogaWYgdGhlIGFkZHJlc3MgaXNuJ3QgZm91bmQsIHRyeSB0aGUgbGVnYWN5IGZvcm1hdC5cbiAgICAgICAgLy8gV2hlbiBMVEMgaXMgc2VudCB0byBhIEJUQyBhZGRyZXNzLCB0aGUgTFRDIGJsb2NrY2hhaW4gcmV0dXJucyBNLi4uIGFkZHJlc3Nlc1xuICAgICAgICAvLyBidXQgdGhlIEJUQyB3YWxsZXQgc3RvcmVzIGFkZHJlc3NlcyBpbiAzLi4uIGZvcm1hdC5cbiAgICAgICAgaWYgKCFpc1dhbGxldE93bmVkICYmIGNvaW4uZ2V0RmFtaWx5KCkgPT09ICdsdGMnKSB7XG4gICAgICAgICAgY29uc3QgbGVnYWN5QWRkcmVzcyA9IGNvbnZlcnRMdGNBZGRyZXNzVG9MZWdhY3lGb3JtYXQob3V0cHV0LmFkZHJlc3MsIGNvaW4ubmFtZSk7XG4gICAgICAgICAgaWYgKGxlZ2FjeUFkZHJlc3MgIT09IG91dHB1dC5hZGRyZXNzKSB7XG4gICAgICAgICAgICBpc1dhbGxldE93bmVkID0gYXdhaXQgaXNXYWxsZXRBZGRyZXNzKHdhbGxldCwgbGVnYWN5QWRkcmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlzV2FsbGV0T3duZWQgPyBvdXRwdXQuYWRkcmVzcyA6IG51bGw7XG4gICAgICB9KVxuICAgIClcbiAgKS5maWx0ZXIoKGFkZHJlc3MpID0+IGFkZHJlc3MgIT09IG51bGwpO1xuXG4gIGNvbnN0IHVuc3BlbnRzID0gYXdhaXQgYXBpLmdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKHdhbGxldEFkZHJlc3NlcyBhcyBzdHJpbmdbXSk7XG4gIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlY292ZXJ5IHVuc3BlbnRzIGZvdW5kLmApO1xuICB9XG4gIC8vIHRoZSBhcGkgbWF5IHJldHVybiBjYXNoYWRkcidzIGluc3RlYWQgb2YgbGVnYWN5IGZvciBCQ0ggYW5kIEJDSEFcbiAgLy8gZG93bnN0cmVhbSBwcm9jZXNzZXMncyBvbmx5IGV4cGVjdCBsZWdhY3kgYWRkcmVzc2VzXG4gIHJldHVybiB1bnNwZW50cy5tYXAoKHJlY292ZXJ5T3V0cHV0KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlY292ZXJ5T3V0cHV0LFxuICAgICAgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKHJlY292ZXJ5T3V0cHV0LmFkZHJlc3MpLFxuICAgICAgdmFsdWU6IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KEJpZ0ludChyZWNvdmVyeU91dHB1dC52YWx1ZSksIGFtb3VudFR5cGUpLFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIERhdGEgcmVxdWlyZWQgZm9yIGFkZHJlc3MgYW5kIHNpZ25hdHVyZSBkZXJpdmF0aW9uXG4gKi9cbnR5cGUgU2NyaXB0SWQgPSB7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBnZXRTY3JpcHRJZChjb2luOiBBYnN0cmFjdFV0eG9Db2luLCB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMSwgc2NyaXB0OiBCdWZmZXIpOiBQcm9taXNlPFNjcmlwdElkPiB7XG4gIGNvbnN0IGFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChzY3JpcHQsIGNvaW4ubmV0d29yayk7XG4gIGxldCBhZGRyZXNzRGF0YTogeyBjaGFpbjogbnVtYmVyOyBpbmRleDogbnVtYmVyIH07XG4gIGlmICh3YWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQpIHtcbiAgICBhZGRyZXNzRGF0YSA9IGF3YWl0IHdhbGxldC5nZXRBZGRyZXNzKHsgYWRkcmVzcyB9KTtcbiAgfSBlbHNlIHtcbiAgICBhZGRyZXNzRGF0YSA9IGF3YWl0ICh3YWxsZXQgYXMgV2FsbGV0VjEpLmFkZHJlc3MoeyBhZGRyZXNzIH0pO1xuICB9XG4gIGlmICh0eXBlb2YgYWRkcmVzc0RhdGEuY2hhaW4gPT09ICdudW1iZXInICYmIHR5cGVvZiBhZGRyZXNzRGF0YS5pbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyBjaGFpbjogYWRkcmVzc0RhdGEuY2hhaW4sIGluZGV4OiBhZGRyZXNzRGF0YS5pbmRleCB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFkZHJlc3MgZGF0YTogJHtKU09OLnN0cmluZ2lmeShhZGRyZXNzRGF0YSl9YCk7XG59XG5cbi8qKlxuICogTG9va3VwIGFkZHJlc3MgZGF0YSBmcm9tIHVuc3BlbnRzIG9uIHNvdXJjZUNvaW4gaW4gYWRkcmVzcyBkYXRhYmFzZSBvZiByZWNvdmVyeUNvaW4uXG4gKiBSZXR1cm4gZnVsbCB3YWxsZXRVbnNwZW50cyBpbmNsdWRpbmcgc2NyaXB0SWQgaW4gc291cmNlQ29pbiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIHNvdXJjZUNvaW5cbiAqIEBwYXJhbSByZWNvdmVyeUNvaW5cbiAqIEBwYXJhbSB1bnNwZW50c1xuICogQHBhcmFtIHdhbGxldFxuICogQHJldHVybiB3YWxsZXRVbnNwZW50c1xuICovXG5hc3luYyBmdW5jdGlvbiB0b1dhbGxldFVuc3BlbnRzPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBzb3VyY2VDb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICByZWNvdmVyeUNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHVuc3BlbnRzOiBVbnNwZW50PFROdW1iZXI+W10sXG4gIHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxXG4pOiBQcm9taXNlPFdhbGxldFVuc3BlbnQ8VE51bWJlcj5bXT4ge1xuICBjb25zdCBhZGRyZXNzZXMgPSBuZXcgU2V0KHVuc3BlbnRzLm1hcCgodSkgPT4gdS5hZGRyZXNzKSk7XG4gIGNvbnN0IHdhbGxldFVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgYWRkcmVzc2VzKSB7XG4gICAgbGV0IHNjcmlwdElkO1xuICAgIHRyeSB7XG4gICAgICBzY3JpcHRJZCA9IGF3YWl0IGdldFNjcmlwdElkKHJlY292ZXJ5Q29pbiwgd2FsbGV0LCB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgc291cmNlQ29pbi5uZXR3b3JrKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgZXJyb3IgZ2V0dGluZyBzY3JpcHRJZCBmb3IgJHthZGRyZXNzfTpgLCBlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZFVuc3BlbnRzID0gdW5zcGVudHNcbiAgICAgIC5maWx0ZXIoKHUpID0+IHUuYWRkcmVzcyA9PT0gYWRkcmVzcylcbiAgICAgIC5tYXAoKHUpID0+ICh7XG4gICAgICAgIC4uLnUsXG4gICAgICAgIC4uLnNjcmlwdElkLFxuICAgICAgfSkpO1xuICAgIHdhbGxldFVuc3BlbnRzLnB1c2goLi4uZmlsdGVyZWRVbnNwZW50cyk7XG4gIH1cblxuICByZXR1cm4gd2FsbGV0VW5zcGVudHM7XG59XG5cbi8qKlxuICogQHBhcmFtIGNvaW5cbiAqIEByZXR1cm4gZmVlUmF0ZSBmb3IgdHJhbnNhY3Rpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RmVlUmF0ZVNhdFZCKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAvLyBUT0RPOiB1c2UgZmVlUmF0ZSBBUElcbiAgY29uc3QgZmVlUmF0ZSA9IHtcbiAgICBiY2g6IDIwLFxuICAgIHRiY2g6IDIwLFxuICAgIGJjaGE6IDIwLFxuICAgIHRiY2hhOiAyMCxcbiAgICBic3Y6IDIwLFxuICAgIHRic3Y6IDIwLFxuICAgIGJ0YzogODAsXG4gICAgdGJ0YzogODAsXG4gICAgdGJ0Y3NpZzogODAsXG4gICAgdGJ0YzQ6IDgwLFxuICAgIHRidGNiZ3NpZzogODAsXG4gICAgbHRjOiAxMDAsXG4gICAgdGx0YzogMTAwLFxuICAgIGRvZ2U6IDEwMDAsXG4gICAgdGRvZ2U6IDEwMDAsXG4gIH1bY29pbi5nZXRDaGFpbigpXTtcblxuICBpZiAoIWZlZVJhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGZlZVJhdGUgZm9yICR7Y29pbi5nZXRDaGFpbigpfWApO1xuICB9XG5cbiAgcmV0dXJuIGZlZVJhdGU7XG59XG5cbi8qKlxuICogQHBhcmFtIHhwcnZcbiAqIEBwYXJhbSBwYXNzcGhyYXNlXG4gKiBAcGFyYW0gd2FsbGV0XG4gKiBAcmV0dXJuIHNpZ25pbmcga2V5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFBydih4cHJ2Pzogc3RyaW5nLCBwYXNzcGhyYXNlPzogc3RyaW5nLCB3YWxsZXQ/OiBJV2FsbGV0IHwgV2FsbGV0VjEpOiBQcm9taXNlPEJJUDMySW50ZXJmYWNlPiB7XG4gIGlmICh4cHJ2KSB7XG4gICAgY29uc3Qga2V5ID0gYmlwMzIuZnJvbUJhc2U1OCh4cHJ2KTtcbiAgICBpZiAoa2V5LmlzTmV1dGVyZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBub3QgYSBwcml2YXRlIGtleWApO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgaWYgKCF3YWxsZXQgfHwgIXBhc3NwaHJhc2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIHhwcnYgZ2l2ZW46IG5lZWQgd2FsbGV0IGFuZCBwYXNzcGhyYXNlIHRvIGNvbnRpbnVlYCk7XG4gIH1cblxuICBsZXQgZW5jcnlwdGVkUHJ2OiBzdHJpbmc7XG4gIGlmICh3YWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQpIHtcbiAgICBlbmNyeXB0ZWRQcnYgPSAoYXdhaXQgd2FsbGV0LmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpKS5lbmNyeXB0ZWRQcnY7XG4gIH0gZWxzZSB7XG4gICAgZW5jcnlwdGVkUHJ2ID0gKGF3YWl0ICh3YWxsZXQgYXMgV2FsbGV0VjEpLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpKS5lbmNyeXB0ZWRYcHJ2O1xuICB9XG5cbiAgcmV0dXJuIGdldFBydihkZWNyeXB0KHBhc3NwaHJhc2UsIGVuY3J5cHRlZFBydikpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN3ZWVwIHRyYW5zYWN0aW9uIGZvciBjcm9zcy1jaGFpbiByZWNvdmVyeSB1c2luZyBQU0JUICh1dHhvbGliIGltcGxlbWVudGF0aW9uKVxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEBwYXJhbSB3YWxsZXRLZXlzXG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSB0YXJnZXRBZGRyZXNzXG4gKiBAcGFyYW0gZmVlUmF0ZVNhdFZCXG4gKiBAcmV0dXJuIHVuc2lnbmVkIFBTQlRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3dlZXBUcmFuc2FjdGlvblV0eG9saWI8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGNvaW5OYW1lOiBDb2luTmFtZSxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10sXG4gIHRhcmdldEFkZHJlc3M6IHN0cmluZyxcbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXJcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCBuZXR3b3JrID0gZ2V0TmV0d29ya0Zyb21Db2luTmFtZShjb2luTmFtZSk7XG4gIGNvbnN0IGlucHV0VmFsdWUgPSB1bnNwZW50U3VtPGJpZ2ludD4oXG4gICAgdW5zcGVudHMubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogQmlnSW50KHUudmFsdWUpIH0pKSxcbiAgICAnYmlnaW50J1xuICApO1xuICBjb25zdCB2c2l6ZSA9IERpbWVuc2lvbnMuZnJvbVVuc3BlbnRzKHVuc3BlbnRzLCB7XG4gICAgcDJ0cjogeyBzY3JpcHRQYXRoTGV2ZWw6IDEgfSxcbiAgICBwMnRyTXVzaWcyOiB7IHNjcmlwdFBhdGhMZXZlbDogdW5kZWZpbmVkIH0sXG4gIH0pXG4gICAgLnBsdXMoRGltZW5zaW9ucy5mcm9tT3V0cHV0KHsgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQodGFyZ2V0QWRkcmVzcywgbmV0d29yaykgfSkpXG4gICAgLmdldFZTaXplKCk7XG4gIGNvbnN0IGZlZSA9IEJpZ0ludChNYXRoLnJvdW5kKHZzaXplICogZmVlUmF0ZVNhdFZCKSk7XG5cbiAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrIH0pO1xuICB1dHhvbGliLmJpdGdvLmFkZFhwdWJzVG9Qc2J0KHBzYnQsIHdhbGxldEtleXMpO1xuXG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+IHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQoXG4gICAgICBwc2J0LFxuICAgICAgeyAuLi51bnNwZW50LCB2YWx1ZTogQmlnSW50KHVuc3BlbnQudmFsdWUpIH0sXG4gICAgICB3YWxsZXRLZXlzLFxuICAgICAgJ3VzZXInLFxuICAgICAgJ2JhY2t1cCcsXG4gICAgICB7IHNraXBOb25XaXRuZXNzVXR4bzogdHJ1ZSB9XG4gICAgKTtcbiAgfSk7XG5cbiAgY29uc3QgcmVjb3ZlcnlPdXRwdXRTY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQodGFyZ2V0QWRkcmVzcywgbmV0d29yayk7XG4gIHBzYnQuYWRkT3V0cHV0KHsgc2NyaXB0OiByZWNvdmVyeU91dHB1dFNjcmlwdCwgdmFsdWU6IGlucHV0VmFsdWUgLSBmZWUgfSk7XG5cbiAgcmV0dXJuIHBzYnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc3dlZXAgdHJhbnNhY3Rpb24gZm9yIGNyb3NzLWNoYWluIHJlY292ZXJ5IHVzaW5nIHdhc20tdXR4b1xuICogQHBhcmFtIG5ldHdvcmtcbiAqIEBwYXJhbSB3YWxsZXRLZXlzXG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSB0YXJnZXRBZGRyZXNzXG4gKiBAcGFyYW0gZmVlUmF0ZVNhdFZCXG4gKiBAcGFyYW0gY29pbk5hbWUgLSBCaXRHbyBjb2luIG5hbWUgKGUuZy4gJ2J0YycsICd0YnRjJywgJ2x0YycpXG4gKiBAcmV0dXJuIHVuc2lnbmVkIFBTQlRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3dlZXBUcmFuc2FjdGlvbldhc208VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGNvaW5OYW1lOiBDb2luTmFtZSxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10sXG4gIHRhcmdldEFkZHJlc3M6IHN0cmluZyxcbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXJcbik6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gIGNvbnN0IGlucHV0VmFsdWUgPSB1bnNwZW50U3VtPGJpZ2ludD4oXG4gICAgdW5zcGVudHMubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogQmlnSW50KHUudmFsdWUpIH0pKSxcbiAgICAnYmlnaW50J1xuICApO1xuXG4gIC8vIENyZWF0ZSBQU0JUIHdpdGggd2FzbS11dHhvIGFuZCBhZGQgd2FsbGV0IGlucHV0cyB1c2luZyBzaGFyZWQgdXRpbGl0aWVzXG4gIGNvbnN0IHVuc3BlbnRzQmlnaW50ID0gdW5zcGVudHMubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogQmlnSW50KHUudmFsdWUpIH0pKTtcbiAgY29uc3Qgd2FzbVBzYnQgPSBjcmVhdGVFbXB0eVdhc21Qc2J0KGNvaW5OYW1lLCB3YWxsZXRLZXlzKTtcbiAgYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidCh3YXNtUHNidCwgdW5zcGVudHNCaWdpbnQsIHdhbGxldEtleXMpO1xuXG4gIC8vIENhbGN1bGF0ZSBkaW1lbnNpb25zIHVzaW5nIHdhc20tdXR4byBEaW1lbnNpb25zXG4gIGNvbnN0IHZzaXplID0gZml4ZWRTY3JpcHRXYWxsZXQuRGltZW5zaW9ucy5mcm9tUHNidCh3YXNtUHNidClcbiAgICAucGx1cyhmaXhlZFNjcmlwdFdhbGxldC5EaW1lbnNpb25zLmZyb21PdXRwdXQodGFyZ2V0QWRkcmVzcywgY29pbk5hbWUpKVxuICAgIC5nZXRWU2l6ZSgpO1xuICBjb25zdCBmZWUgPSBCaWdJbnQoTWF0aC5yb3VuZCh2c2l6ZSAqIGZlZVJhdGVTYXRWQikpO1xuXG4gIC8vIEFkZCBvdXRwdXQgdG8gd2FzbSBQU0JUXG4gIGFkZE91dHB1dFRvV2FzbVBzYnQod2FzbVBzYnQsIHRhcmdldEFkZHJlc3MsIGlucHV0VmFsdWUgLSBmZWUsIGNvaW5OYW1lKTtcblxuICAvLyBDb252ZXJ0IHRvIHV0eG9saWIgUFNCVCBmb3Igc2lnbmluZyBhbmQgcmV0dXJuXG4gIHJldHVybiB3YXNtUHNidDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzd2VlcCB0cmFuc2FjdGlvbiBmb3IgY3Jvc3MtY2hhaW4gcmVjb3ZlcnkgdXNpbmcgUFNCVFxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEBwYXJhbSB3YWxsZXRLZXlzXG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSB0YXJnZXRBZGRyZXNzXG4gKiBAcGFyYW0gZmVlUmF0ZVNhdFZCXG4gKiBAcGFyYW0gYmFja2VuZCAtIFdoaWNoIGJhY2tlbmQgdG8gdXNlIGZvciBQU0JUIGNyZWF0aW9uIChkZWZhdWx0OiAnd2FzbS11dHhvJylcbiAqIEBwYXJhbSBjb2luTmFtZSAtIEJpdEdvIGNvaW4gbmFtZSAocmVxdWlyZWQgZm9yIHdhc20tdXR4byBiYWNrZW5kKVxuICogQHJldHVybiB1bnNpZ25lZCBQU0JUXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN3ZWVwVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGNvaW5OYW1lOiBDb2luTmFtZSxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PFROdW1iZXI+W10sXG4gIHRhcmdldEFkZHJlc3M6IHN0cmluZyxcbiAgZmVlUmF0ZVNhdFZCOiBudW1iZXIsXG4gIGJhY2tlbmQ6IFBzYnRCYWNrZW5kID0gJ3dhc20tdXR4bydcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQgfCBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQge1xuICBpZiAoYmFja2VuZCA9PT0gJ3dhc20tdXR4bycpIHtcbiAgICByZXR1cm4gY3JlYXRlU3dlZXBUcmFuc2FjdGlvbldhc20oY29pbk5hbWUsIHdhbGxldEtleXMsIHVuc3BlbnRzLCB0YXJnZXRBZGRyZXNzLCBmZWVSYXRlU2F0VkIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcmVhdGVTd2VlcFRyYW5zYWN0aW9uVXR4b2xpYihjb2luTmFtZSwgd2FsbGV0S2V5cywgdW5zcGVudHMsIHRhcmdldEFkZHJlc3MsIGZlZVJhdGVTYXRWQik7XG4gIH1cbn1cblxudHlwZSBSZWNvdmVyUGFyYW1zID0ge1xuICAvKiogV2FsbGV0IElEIChjYW4gYmUgdjEgd2FsbGV0IG9yIHYyIHdhbGxldCkgKi9cbiAgd2FsbGV0SWQ6IHN0cmluZztcbiAgLyoqIENvaW4gdG8gY3JlYXRlIHRoZSB0cmFuc2FjdGlvbiBmb3IgKi9cbiAgc291cmNlQ29pbjogQWJzdHJhY3RVdHhvQ29pbjtcbiAgLyoqIENvaW4gdGhhdCB3YWxsZXQga2V5cyB3ZXJlIHNldCB1cCBmb3IgKi9cbiAgcmVjb3ZlcnlDb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICAvKiogU291cmNlIGNvaW4gdHJhbnNhY3Rpb24gdG8gcmVjb3ZlciBvdXRwdXRzIGZyb20gKHNvdXJjZUNvaW4pICovXG4gIHR4aWQ6IHN0cmluZztcbiAgLyoqIFNvdXJjZSBjb2luIGFkZHJlc3MgdG8gc2VuZCB0aGUgZnVuZHMgdG8gKi9cbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBJZiBzZXQsIGRlY3J5cHRzIHByaXZhdGUga2V5IGFuZCBzaWducyB0cmFuc2FjdGlvbiAqL1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICAvKiogSWYgc2V0LCBzaWducyB0cmFuc2FjdGlvbiAqL1xuICB4cHJ2Pzogc3RyaW5nO1xuICAvKiogZm9yIHV0eG8gY29pbnMgb3RoZXIgdGhhbiBbQlRDLFRCVENdIHRoaXMgaXMgYSBCbG9jayBDaGFpciBhcGkga2V5ICoqL1xuICBhcGlLZXk/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFJlY292ZXIgd2FsbGV0IGRlcG9zaXRzIHRoYXQgd2VyZSByZWNlaXZlZCBvbiB0aGUgd3JvbmcgYmxvY2tjaGFpblxuICogKGZvciBpbnN0YW5jZSBiaXRjb2luIGRlcG9zaXRzIHRoYXQgd2VyZSByZWNlaXZlZCBmb3IgYSBsaXRlY29pbiB3YWxsZXQpLlxuICpcbiAqIEZldGNoZXMgdGhlIHVuc3BlbnQgZGF0YSBmcm9tIEJpdEdvJ3MgcHVibGljIGJsb2NrY2hhaW4gQVBJIGFuZCB0aGUgc2NyaXB0IGRhdGEgZnJvbSB0aGUgdXNlcidzXG4gKiB3YWxsZXQuXG4gKlxuICogQHBhcmFtIHtCaXRHb0Jhc2V9IGJpdGdvXG4gKiBAcGFyYW0ge1JlY292ZXJQYXJhbXN9IHBhcmFtc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlckNyb3NzQ2hhaW48VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogUmVjb3ZlclBhcmFtc1xuKTogUHJvbWlzZTxDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlcj4gfCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPj4ge1xuICBjb25zdCB3YWxsZXQgPSBhd2FpdCBnZXRXYWxsZXQoYml0Z28sIHBhcmFtcy5yZWNvdmVyeUNvaW4sIHBhcmFtcy53YWxsZXRJZCk7XG4gIGNvbnN0IHVuc3BlbnRzID0gYXdhaXQgZ2V0QWxsUmVjb3ZlcnlPdXRwdXRzPFROdW1iZXI+KFxuICAgIHBhcmFtcy5zb3VyY2VDb2luLFxuICAgIHBhcmFtcy50eGlkLFxuICAgIHBhcmFtcy5zb3VyY2VDb2luLmFtb3VudFR5cGUsXG4gICAgd2FsbGV0LFxuICAgIHBhcmFtcy5hcGlLZXlcbiAgKTtcbiAgY29uc3Qgd2FsbGV0VW5zcGVudHMgPSBhd2FpdCB0b1dhbGxldFVuc3BlbnRzPFROdW1iZXI+KHBhcmFtcy5zb3VyY2VDb2luLCBwYXJhbXMucmVjb3ZlcnlDb2luLCB1bnNwZW50cywgd2FsbGV0KTtcbiAgY29uc3Qgd2FsbGV0S2V5cyA9IGF3YWl0IGdldFdhbGxldEtleXMocGFyYW1zLnJlY292ZXJ5Q29pbiwgd2FsbGV0KTtcbiAgY29uc3QgcHJ2ID1cbiAgICBwYXJhbXMueHBydiB8fCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSA/IGF3YWl0IGdldFBydihwYXJhbXMueHBydiwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIHdhbGxldCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZlZVJhdGVTYXRWQiA9IGF3YWl0IGdldEZlZVJhdGVTYXRWQihwYXJhbXMuc291cmNlQ29pbik7XG5cbiAgLy8gQ3JlYXRlIFBTQlQgZm9yIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCByZWNvdmVyeVxuICAvLyBVc2Ugd2FzbS11dHhvIGZvciB0ZXN0bmV0IGNvaW5zIG9ubHksIHV0eG9saWIgZm9yIG1haW5uZXRcbiAgY29uc3QgYmFja2VuZDogUHNidEJhY2tlbmQgPSBpc1Rlc3RuZXRDb2luKHBhcmFtcy5zb3VyY2VDb2luLm5hbWUpID8gJ3dhc20tdXR4bycgOiAndXR4b2xpYic7XG4gIGxldCBwc2J0ID0gY3JlYXRlU3dlZXBUcmFuc2FjdGlvbjxUTnVtYmVyPihcbiAgICBwYXJhbXMuc291cmNlQ29pbi5nZXRDaGFpbigpLFxuICAgIHdhbGxldEtleXMsXG4gICAgd2FsbGV0VW5zcGVudHMsXG4gICAgcGFyYW1zLnJlY292ZXJ5QWRkcmVzcyxcbiAgICBmZWVSYXRlU2F0VkIsXG4gICAgYmFja2VuZFxuICApO1xuXG4gIC8vIEZvciB1bnNpZ25lZCByZWNvdmVyeSwgcmV0dXJuIHVuc2lnbmVkIFBTQlQgaGV4XG4gIGlmICghcHJ2KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4SGV4OiBlbmNvZGVUcmFuc2FjdGlvbihwc2J0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB3YWxsZXRJZDogcGFyYW1zLndhbGxldElkLFxuICAgICAgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5QWRkcmVzcyxcbiAgICAgIGNvaW46IHBhcmFtcy5zb3VyY2VDb2luLmdldENoYWluKCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZvciBzaWduZWQgcmVjb3ZlcnksIHNpZ24gdGhlIFBTQlQgd2l0aCB1c2VyIGtleSBhbmQgcmV0dXJuIGhhbGYtc2lnbmVkIFBTQlRcbiAgcHNidCA9IHNpZ25BbmRWZXJpZnlQc2J0KHBzYnQsIHBydiwgZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbSh3YWxsZXRLZXlzKSwge1xuICAgIHB1YmxpY0tleXM6IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzKHBhcmFtcy5zb3VyY2VDb2luLm5hbWUpLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246IHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCA/IDIgOiAxLFxuICAgIHdhbGxldElkOiBwYXJhbXMud2FsbGV0SWQsXG4gICAgdHhIZXg6IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBzb3VyY2VDb2luOiBwYXJhbXMuc291cmNlQ29pbi5nZXRDaGFpbigpLFxuICAgIHJlY292ZXJ5Q29pbjogcGFyYW1zLnJlY292ZXJ5Q29pbi5nZXRDaGFpbigpLFxuICAgIHJlY292ZXJ5QW1vdW50OiB0b1ROdW1iZXIoXG4gICAgICBnZXRSZWNvdmVyeUFtb3VudChwc2J0LCB3YWxsZXRLZXlzLCBwYXJhbXMucmVjb3ZlcnlBZGRyZXNzKSxcbiAgICAgIHBhcmFtcy5zb3VyY2VDb2luLmFtb3VudFR5cGVcbiAgICApIGFzIFROdW1iZXIsXG4gIH07XG59XG4iXX0=
|
|
300
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3NDaGFpblJlY292ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JlY292ZXJ5L2Nyb3NzQ2hhaW5SZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXNEQSw4QkFvQkM7QUFPRCxzQ0FpQkM7QUFFRCwwQ0FhQztBQVlELDBFQWNDO0FBb1BELDhDQXFEQztBQXBiRCxnREFBeUQ7QUFDekQsZ0RBQXVGO0FBQ3ZGLDhDQUErRTtBQUMvRSw0Q0FBeUM7QUFHekMsZ0ZBQStFO0FBRS9FLGtEQUEwRDtBQUMxRCxrRkFBeUY7QUFDekYsd0NBQXVDO0FBQ3ZDLHdDQUEwRTtBQUUxRSxpQ0FBZ0g7QUF5Q3pHLEtBQUssVUFBVSxTQUFTLENBQzdCLEtBQWdCLEVBQ2hCLElBQXNCLEVBQ3RCLFFBQWdCO0lBRWhCLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCwrQ0FBK0M7UUFDL0Msa0pBQWtKO1FBQ2xKLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFFBQVEsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGFBQWEsQ0FDakMsWUFBOEIsRUFDOUIsTUFBMEI7SUFFMUIsSUFBSSxLQUFxQixDQUFDO0lBRTFCLElBQUksTUFBTSxZQUFZLGlCQUFNLEVBQUUsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBMEIsQ0FBQztRQUMxRyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFtQixDQUFDO0lBQ3hELENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxHQUFJLE1BQW1CLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBbUIsQ0FBQztJQUM5RSxDQUFDO0lBRUQsT0FBTyw2QkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFTSxLQUFLLFVBQVUsZUFBZSxDQUFDLE1BQTBCLEVBQUUsT0FBZTtJQUMvRSxJQUFJLENBQUM7UUFDSCxJQUFJLFdBQVcsQ0FBQztRQUNoQixJQUFJLE1BQU0sWUFBWSxpQkFBTSxFQUFFLENBQUM7WUFDN0IsV0FBVyxHQUFHLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLEdBQUcsTUFBTyxNQUFtQixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sV0FBVyxLQUFLLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQiwrQkFBK0IsQ0FBQyxPQUFlLEVBQUUsUUFBc0I7SUFDckYsSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUM5QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxtQkFBVyxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzRSxNQUFNLE9BQU8sR0FBRyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLFVBQVUsR0FBRyxtQkFBVyxDQUFDLHdCQUF3QixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRSxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsSUFBc0IsRUFDdEIsSUFBWSxFQUNaLGFBQWtDLFFBQVEsRUFDMUMsTUFBMEIsRUFDMUIsTUFBZTtJQUVmLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxNQUFNLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxNQUFNLGVBQWUsR0FBRyxDQUN0QixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzlCLHlHQUF5RztRQUN6Ryx5R0FBeUc7UUFDekcsNERBQTREO1FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvRCxJQUFJLGFBQWEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVwRSxtRkFBbUY7UUFDbkYsK0VBQStFO1FBQy9FLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNqRCxNQUFNLGFBQWEsR0FBRywrQkFBK0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRixJQUFJLGFBQWEsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JDLGFBQWEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDL0QsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztJQUV4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxlQUEyQixDQUFDLENBQUM7SUFDaEYsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsbUVBQW1FO0lBQ25FLHNEQUFzRDtJQUN0RCxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtRQUNyQyxPQUFPO1lBQ0wsR0FBRyxjQUFjO1lBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUN0RCxLQUFLLEVBQUUsSUFBQSxtQkFBUyxFQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFZO1NBQ3RFLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFVRCxLQUFLLFVBQVUsV0FBVyxDQUFDLElBQXNCLEVBQUUsTUFBMEIsRUFBRSxNQUFrQjtJQUMvRixNQUFNLE9BQU8sR0FBRyxtQkFBVyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsSUFBSSxXQUE2QyxDQUFDO0lBQ2xELElBQUksTUFBTSxZQUFZLGlCQUFNLEVBQUUsQ0FBQztRQUM3QixXQUFXLEdBQUcsTUFBTSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO1NBQU0sQ0FBQztRQUNOLFdBQVcsR0FBRyxNQUFPLE1BQW1CLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsSUFBSSxPQUFPLFdBQVcsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sV0FBVyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILEtBQUssVUFBVSxnQkFBZ0IsQ0FDN0IsVUFBNEIsRUFDNUIsWUFBOEIsRUFDOUIsUUFBNEIsRUFDNUIsTUFBMEI7SUFFMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxjQUFjLEdBQTZCLEVBQUUsQ0FBQztJQUVwRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLElBQUksUUFBUSxDQUFDO1FBQ2IsSUFBSSxDQUFDO1lBQ0gsUUFBUSxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsbUJBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRCxTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUTthQUM5QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDO2FBQ3BDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNYLEdBQUcsQ0FBQztZQUNKLEdBQUcsUUFBUTtTQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ04sY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsZUFBZSxDQUFDLElBQXNCO0lBQ25ELHdCQUF3QjtJQUN4QixNQUFNLE9BQU8sR0FBRztRQUNkLEdBQUcsRUFBRSxFQUFFO1FBQ1AsSUFBSSxFQUFFLEVBQUU7UUFDUixJQUFJLEVBQUUsRUFBRTtRQUNSLEtBQUssRUFBRSxFQUFFO1FBQ1QsR0FBRyxFQUFFLEVBQUU7UUFDUCxJQUFJLEVBQUUsRUFBRTtRQUNSLEdBQUcsRUFBRSxFQUFFO1FBQ1AsSUFBSSxFQUFFLEVBQUU7UUFDUixPQUFPLEVBQUUsRUFBRTtRQUNYLEtBQUssRUFBRSxFQUFFO1FBQ1QsU0FBUyxFQUFFLEVBQUU7UUFDYixHQUFHLEVBQUUsR0FBRztRQUNSLElBQUksRUFBRSxHQUFHO1FBQ1QsSUFBSSxFQUFFLElBQUk7UUFDVixLQUFLLEVBQUUsSUFBSTtLQUNaLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFFbkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsS0FBSyxVQUFVLE1BQU0sQ0FBQyxJQUFhLEVBQUUsVUFBbUIsRUFBRSxNQUEyQjtJQUNuRixJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsTUFBTSxHQUFHLEdBQUcsaUJBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQUksWUFBb0IsQ0FBQztJQUN6QixJQUFJLE1BQU0sWUFBWSxpQkFBTSxFQUFFLENBQUM7UUFDN0IsWUFBWSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUN4RSxDQUFDO1NBQU0sQ0FBQztRQUNOLFlBQVksR0FBRyxDQUFDLE1BQU8sTUFBbUIsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFBLGlCQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FDN0IsUUFBa0IsRUFDbEIsVUFBNEMsRUFDNUMsUUFBa0MsRUFDbEMsYUFBcUIsRUFDckIsWUFBb0I7SUFFcEIsTUFBTSxVQUFVLEdBQUcsSUFBQSxvQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXhDLDBFQUEwRTtJQUMxRSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0UsTUFBTSxRQUFRLEdBQUcsSUFBQSwwQkFBbUIsRUFBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDM0QsSUFBQSxnQ0FBeUIsRUFBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRWhFLGtEQUFrRDtJQUNsRCxNQUFNLEtBQUssR0FBRyw2QkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUMxRCxJQUFJLENBQUMsNkJBQWlCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDdEUsUUFBUSxFQUFFLENBQUM7SUFDZCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUVyRCwwQkFBMEI7SUFDMUIsSUFBQSwwQkFBbUIsRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLFVBQVUsR0FBRyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFekUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQXFCRDs7Ozs7Ozs7O0dBU0c7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLEtBQWdCLEVBQ2hCLE1BQXFCO0lBRXJCLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLHFCQUFxQixDQUMxQyxNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsSUFBSSxFQUNYLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUM1QixNQUFNLEVBQ04sTUFBTSxDQUFDLE1BQU0sQ0FDZCxDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBVSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pILE1BQU0sVUFBVSxHQUFHLDZCQUFpQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzNHLE1BQU0sR0FBRyxHQUNQLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2xILE1BQU0sWUFBWSxHQUFHLE1BQU0sZUFBZSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUU5RCxvREFBb0Q7SUFDcEQsSUFBSSxJQUFJLEdBQUcsc0JBQXNCLENBQy9CLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQzVCLFVBQVUsRUFDVixjQUFjLEVBQ2QsTUFBTSxDQUFDLGVBQWUsRUFDdEIsWUFBWSxDQUNiLENBQUM7SUFFRixrREFBa0Q7SUFDbEQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFBLDBCQUFpQixFQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDOUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3pCLE9BQU8sRUFBRSxNQUFNLENBQUMsZUFBZTtZQUMvQixJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsSUFBSSxHQUFHLElBQUEsbUNBQWlCLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUU7UUFDOUMsVUFBVSxFQUFFLElBQUEsNkNBQTBCLEVBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7S0FDL0QsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLE9BQU8sRUFBRSxNQUFNLFlBQVksaUJBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixLQUFLLEVBQUUsSUFBQSwwQkFBaUIsRUFBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzlDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtRQUN4QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7UUFDNUMsY0FBYyxFQUFFLElBQUEsbUJBQVMsRUFDdkIsSUFBQSx3QkFBaUIsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFDM0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQ2xCO0tBQ2IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCSVAzMkludGVyZmFjZSwgYmlwMzIgfSBmcm9tICdAYml0Z28vc2VjcDI1NmsxJztcbmltcG9ydCB7IENvaW5OYW1lLCBmaXhlZFNjcmlwdFdhbGxldCwgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcyB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgQml0R29CYXNlLCBJV2FsbGV0LCBLZXljaGFpbiwgVHJpcGxlLCBXYWxsZXQgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZGVjcnlwdCB9IGZyb20gJ0BiaXRnby9zZGstYXBpJztcblxuaW1wb3J0IHsgQWJzdHJhY3RVdHhvQ29pbiwgVHJhbnNhY3Rpb25JbmZvIH0gZnJvbSAnLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5pbXBvcnQgeyBzaWduQW5kVmVyaWZ5UHNidCB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBVdHhvQ29pbk5hbWUgfSBmcm9tICcuLi9uYW1lcyc7XG5pbXBvcnQgeyBlbmNvZGVUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2RlY29kZSc7XG5pbXBvcnQgeyBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3JlcGxheVByb3RlY3Rpb24nO1xuaW1wb3J0IHsgdG9UTnVtYmVyIH0gZnJvbSAnLi4vdG51bWJlcic7XG5pbXBvcnQgeyB1bnNwZW50U3VtLCB0eXBlIFVuc3BlbnQsIHR5cGUgV2FsbGV0VW5zcGVudCB9IGZyb20gJy4uL3Vuc3BlbnQnO1xuXG5pbXBvcnQgeyBjcmVhdGVFbXB0eVdhc21Qc2J0LCBhZGRXYWxsZXRJbnB1dHNUb1dhc21Qc2J0LCBhZGRPdXRwdXRUb1dhc21Qc2J0LCBnZXRSZWNvdmVyeUFtb3VudCB9IGZyb20gJy4vcHNidCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRSZWNvdmVyeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHdhbGxldDogc3RyaW5nO1xuICBmYXVsdHlUeElkOiBzdHJpbmc7XG4gIHJlY292ZXJ5QWRkcmVzczogc3RyaW5nO1xufVxuXG50eXBlIEZlZUluZm8gPSB7XG4gIHNpemU6IG51bWJlcjtcbiAgZmVlUmF0ZTogbnVtYmVyO1xuICBmZWU6IG51bWJlcjtcbiAgcGF5R29GZWU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm8/OiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIHdhbGxldElkOiBzdHJpbmc7XG4gIGZlZUluZm8/OiBGZWVJbmZvO1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNvaW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB2ZXJzaW9uOiAxIHwgMjtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB3YWxsZXRJZDogc3RyaW5nO1xuICBzb3VyY2VDb2luOiBzdHJpbmc7XG4gIHJlY292ZXJ5Q29pbjogc3RyaW5nO1xuICByZWNvdmVyeUFkZHJlc3M/OiBzdHJpbmc7XG4gIHJlY292ZXJ5QW1vdW50PzogVE51bWJlcjtcbn1cblxudHlwZSBXYWxsZXRWMSA9IHtcbiAga2V5Y2hhaW5zOiB7IHhwdWI6IHN0cmluZyB9W107XG4gIGFkZHJlc3MoeyBhZGRyZXNzIH06IHsgYWRkcmVzczogc3RyaW5nIH0pOiBQcm9taXNlPHsgY2hhaW46IG51bWJlcjsgaW5kZXg6IG51bWJlciB9PjtcbiAgZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk6IFByb21pc2U8eyBlbmNyeXB0ZWRYcHJ2OiBzdHJpbmcgfT47XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V2FsbGV0KFxuICBiaXRnbzogQml0R29CYXNlLFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB3YWxsZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPElXYWxsZXQgfCBXYWxsZXRWMT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjb2luLndhbGxldHMoKS5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBCRy00NjM2NCBoYW5kbGUgZXJyb3JzIG1vcmUgZ3JhY2VmdWxseVxuICAgIC8vIFRoZSB2MiBlbmRwb2ludCBjb2luLndhbGxldHMoKS5nZXQoKSBtYXkgdGhyb3cgNDA0IG9yIDQwMCBlcnJvcnMsIGJ1dCB0aGlzIHNob3VsZCBub3QgcHJldmVudCB1cyBmcm9tIHNlYXJjaGluZyBmb3IgdGhlIHdhbGxldElkIGluIHYxIHdhbGxldHMuXG4gICAgaWYgKGUuc3RhdHVzID49IDUwMCkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBiaXRnby53YWxsZXRzKCkuZ2V0KHsgaWQ6IHdhbGxldElkIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBjb3VsZCBub3QgZ2V0IHdhbGxldCAke3dhbGxldElkfSBmcm9tIHYxIG9yIHYyOiAke2UudG9TdHJpbmcoKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSByZWNvdmVyeUNvaW5cbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gd2FsbGV0IHB1YmtleXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdhbGxldEtleXMoXG4gIHJlY292ZXJ5Q29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgd2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjFcbik6IFByb21pc2U8Zml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXM+IHtcbiAgbGV0IHhwdWJzOiBUcmlwbGU8c3RyaW5nPjtcblxuICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHJlY292ZXJ5Q29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldCB9KSkgYXMgdW5rbm93biBhcyBLZXljaGFpbltdO1xuICAgIGlmIChrZXljaGFpbnMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIHRyaXBsZSBnb3QgJHtrZXljaGFpbnMubGVuZ3RofWApO1xuICAgIH1cbiAgICB4cHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPjtcbiAgfSBlbHNlIHtcbiAgICB4cHVicyA9ICh3YWxsZXQgYXMgV2FsbGV0VjEpLmtleWNoYWlucy5tYXAoKGspID0+IGsueHB1YikgYXMgVHJpcGxlPHN0cmluZz47XG4gIH1cblxuICByZXR1cm4gZml4ZWRTY3JpcHRXYWxsZXQuUm9vdFdhbGxldEtleXMuZnJvbSh4cHVicyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1dhbGxldEFkZHJlc3Mod2FsbGV0OiBJV2FsbGV0IHwgV2FsbGV0VjEsIGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGxldCBhZGRyZXNzRGF0YTtcbiAgICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgICBhZGRyZXNzRGF0YSA9IGF3YWl0IHdhbGxldC5nZXRBZGRyZXNzKHsgYWRkcmVzcyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkcmVzc0RhdGEgPSBhd2FpdCAod2FsbGV0IGFzIFdhbGxldFYxKS5hZGRyZXNzKHsgYWRkcmVzcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkcmVzc0RhdGEgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBMaXRlY29pbiBQMlNIIGFkZHJlc3MgZnJvbSBNLi4uIGZvcm1hdCAoc2NyaXB0SGFzaCAweDMyKSB0byB0aGUgbGVnYWN5IDMuLi4gZm9ybWF0IChzY3JpcHRIYXNoIDB4MDUpXG4gKiBhbmQgUS4uLiBmb3JtYXQgKHNjcmlwdEhhc2ggMHgzMikgdG8gdGhlIGxlZ2FjeSAyLi4uIGZvcm1hdCAoc2NyaXB0SGFzaCAweDA1KS5cbiAqIFRoaXMgaXMgbmVlZGVkIGZvciBjcm9zcy1jaGFpbiByZWNvdmVyeSB3aGVuIChUKUxUQyB3YXMgc2VudCB0byBhIChUKUJUQyBhZGRyZXNzLCBiZWNhdXNlIHRoZSAoVClCVEMgd2FsbGV0XG4gKiBzdG9yZXMgYWRkcmVzc2VzIGluIHRoZSAzLi4uIGZvcm1hdCB3aGlsZSB0aGUgTFRDIGJsb2NrY2hhaW4gcmV0dXJucyBhZGRyZXNzZXMgaW4gTS4uLiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGFkZHJlc3MgLSBMVEMgYWRkcmVzcyB0byBjb252ZXJ0XG4gKiBAcGFyYW0gY29pbk5hbWUgLSBUaGUgY29pbiBuYW1lIChlLmcuICdsdGMnLCAndGx0YycpXG4gKiBAcmV0dXJucyBUaGUgYWRkcmVzcyBpbiBsZWdhY3kgMy4uLiBmb3JtYXQsIG9yIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGlmIGl0J3Mgbm90IGEgUDJTSCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0THRjQWRkcmVzc1RvTGVnYWN5Rm9ybWF0KGFkZHJlc3M6IHN0cmluZywgY29pbk5hbWU6IFV0eG9Db2luTmFtZSk6IHN0cmluZyB7XG4gIGlmIChjb2luTmFtZSAhPT0gJ2x0YycgJiYgY29pbk5hbWUgIT09ICd0bHRjJykge1xuICAgIHJldHVybiBhZGRyZXNzO1xuICB9XG5cbiAgLy8gb25seSBjb25zaWRlciBhZGRyZXNzZXMgdGhhdCBzdGFydCB3aXRoIE0gb3IgUSAobW9kZXJuIGx0YyBwMnNoIHByZWZpeGVzKVxuICBpZiAoIWFkZHJlc3Muc3RhcnRzV2l0aCgnTScpICYmICFhZGRyZXNzLnN0YXJ0c1dpdGgoJ1EnKSkge1xuICAgIHJldHVybiBhZGRyZXNzO1xuICB9XG5cbiAgY29uc3Qgc2NyaXB0UHViS2V5ID0gd2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbihhZGRyZXNzLCBjb2luTmFtZSk7XG4gIGNvbnN0IGRzdENvaW4gPSBjb2luTmFtZSA9PT0gJ2x0YycgPyAnYnRjJyA6ICd0YnRjJztcbiAgY29uc3QgZHN0QWRkcmVzcyA9IHdhc21BZGRyZXNzLmZyb21PdXRwdXRTY3JpcHRXaXRoQ29pbihzY3JpcHRQdWJLZXksIGRzdENvaW4pO1xuICByZXR1cm4gZHN0QWRkcmVzcztcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29pblxuICogQHBhcmFtIHR4aWRcbiAqIEBwYXJhbSBhbW91bnRUeXBlXG4gKiBAcGFyYW0gd2FsbGV0XG4gKiBAcGFyYW0gYXBpS2V5IC0gYSBibG9ja2NoYWlyIGFwaSBrZXlcbiAqIEByZXR1cm4gYWxsIHVuc3BlbnRzIGZvciB0cmFuc2FjdGlvbiBvdXRwdXRzLCBpbmNsdWRpbmcgb3V0cHV0cyBmcm9tIG90aGVyIHRyYW5zYWN0aW9uc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxSZWNvdmVyeU91dHB1dHM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHR4aWQ6IHN0cmluZyxcbiAgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInLFxuICB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMSxcbiAgYXBpS2V5Pzogc3RyaW5nXG4pOiBQcm9taXNlPFVuc3BlbnQ8VE51bWJlcj5bXT4ge1xuICBjb25zdCBhcGkgPSBjb2luLmdldFJlY292ZXJ5UHJvdmlkZXIoYXBpS2V5KTtcbiAgY29uc3QgdHggPSBhd2FpdCBhcGkuZ2V0VHJhbnNhY3Rpb25JTyh0eGlkKTtcbiAgY29uc3Qgd2FsbGV0QWRkcmVzc2VzID0gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHgub3V0cHV0cy5tYXAoYXN5bmMgKG91dHB1dCkgPT4ge1xuICAgICAgICAvLyBGb3Igc29tZSBjb2lucyAoYmNoKSB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGFkZHJlc3MgdG8gbGVnYWN5IGZvcm1hdCBzaW5jZSB0aGUgYXBpIHJldHVybnMgdGhlIGFkZHJlc3NcbiAgICAgICAgLy8gaW4gbm9uIGxlZ2FjeSBmb3JtYXQuIEhvd2V2ZXIsIHdlIHdhbnQgdG8ga2VlcCB0aGUgYWRkcmVzcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHJlc3BvbnNlIHNpbmNlIHdlXG4gICAgICAgIC8vIGFyZSBnb2luZyB0byBoaXQgdGhlIEFQSSBhZ2FpbiB0byBmZXRjaCBhZGRyZXNzIHVuc3BlbnRzLlxuICAgICAgICBjb25zdCBjYW5vbmljYWxBZGRyZXNzID0gY29pbi5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKTtcbiAgICAgICAgbGV0IGlzV2FsbGV0T3duZWQgPSBhd2FpdCBpc1dhbGxldEFkZHJlc3Mod2FsbGV0LCBjYW5vbmljYWxBZGRyZXNzKTtcblxuICAgICAgICAvLyBGb3IgTFRDIGNyb3NzLWNoYWluIHJlY292ZXJ5OiBpZiB0aGUgYWRkcmVzcyBpc24ndCBmb3VuZCwgdHJ5IHRoZSBsZWdhY3kgZm9ybWF0LlxuICAgICAgICAvLyBXaGVuIExUQyBpcyBzZW50IHRvIGEgQlRDIGFkZHJlc3MsIHRoZSBMVEMgYmxvY2tjaGFpbiByZXR1cm5zIE0uLi4gYWRkcmVzc2VzXG4gICAgICAgIC8vIGJ1dCB0aGUgQlRDIHdhbGxldCBzdG9yZXMgYWRkcmVzc2VzIGluIDMuLi4gZm9ybWF0LlxuICAgICAgICBpZiAoIWlzV2FsbGV0T3duZWQgJiYgY29pbi5nZXRGYW1pbHkoKSA9PT0gJ2x0YycpIHtcbiAgICAgICAgICBjb25zdCBsZWdhY3lBZGRyZXNzID0gY29udmVydEx0Y0FkZHJlc3NUb0xlZ2FjeUZvcm1hdChvdXRwdXQuYWRkcmVzcywgY29pbi5uYW1lKTtcbiAgICAgICAgICBpZiAobGVnYWN5QWRkcmVzcyAhPT0gb3V0cHV0LmFkZHJlc3MpIHtcbiAgICAgICAgICAgIGlzV2FsbGV0T3duZWQgPSBhd2FpdCBpc1dhbGxldEFkZHJlc3Mod2FsbGV0LCBsZWdhY3lBZGRyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNXYWxsZXRPd25lZCA/IG91dHB1dC5hZGRyZXNzIDogbnVsbDtcbiAgICAgIH0pXG4gICAgKVxuICApLmZpbHRlcigoYWRkcmVzcykgPT4gYWRkcmVzcyAhPT0gbnVsbCk7XG5cbiAgY29uc3QgdW5zcGVudHMgPSBhd2FpdCBhcGkuZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMod2FsbGV0QWRkcmVzc2VzIGFzIHN0cmluZ1tdKTtcbiAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVjb3ZlcnkgdW5zcGVudHMgZm91bmQuYCk7XG4gIH1cbiAgLy8gdGhlIGFwaSBtYXkgcmV0dXJuIGNhc2hhZGRyJ3MgaW5zdGVhZCBvZiBsZWdhY3kgZm9yIEJDSCBhbmQgQkNIQVxuICAvLyBkb3duc3RyZWFtIHByb2Nlc3NlcydzIG9ubHkgZXhwZWN0IGxlZ2FjeSBhZGRyZXNzZXNcbiAgcmV0dXJuIHVuc3BlbnRzLm1hcCgocmVjb3ZlcnlPdXRwdXQpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVjb3ZlcnlPdXRwdXQsXG4gICAgICBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3MocmVjb3ZlcnlPdXRwdXQuYWRkcmVzcyksXG4gICAgICB2YWx1ZTogdG9UTnVtYmVyKEJpZ0ludChyZWNvdmVyeU91dHB1dC52YWx1ZSksIGFtb3VudFR5cGUpIGFzIFROdW1iZXIsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGF0YSByZXF1aXJlZCBmb3IgYWRkcmVzcyBhbmQgc2lnbmF0dXJlIGRlcml2YXRpb25cbiAqL1xudHlwZSBTY3JpcHRJZCA9IHtcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNjcmlwdElkKGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHdhbGxldDogSVdhbGxldCB8IFdhbGxldFYxLCBzY3JpcHQ6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPFNjcmlwdElkPiB7XG4gIGNvbnN0IGFkZHJlc3MgPSB3YXNtQWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0V2l0aENvaW4oc2NyaXB0LCBjb2luLm5hbWUpO1xuICBsZXQgYWRkcmVzc0RhdGE6IHsgY2hhaW46IG51bWJlcjsgaW5kZXg6IG51bWJlciB9O1xuICBpZiAod2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0KSB7XG4gICAgYWRkcmVzc0RhdGEgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3MgfSk7XG4gIH0gZWxzZSB7XG4gICAgYWRkcmVzc0RhdGEgPSBhd2FpdCAod2FsbGV0IGFzIFdhbGxldFYxKS5hZGRyZXNzKHsgYWRkcmVzcyB9KTtcbiAgfVxuICBpZiAodHlwZW9mIGFkZHJlc3NEYXRhLmNoYWluID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYWRkcmVzc0RhdGEuaW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHsgY2hhaW46IGFkZHJlc3NEYXRhLmNoYWluLCBpbmRleDogYWRkcmVzc0RhdGEuaW5kZXggfTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhZGRyZXNzIGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoYWRkcmVzc0RhdGEpfWApO1xufVxuXG4vKipcbiAqIExvb2t1cCBhZGRyZXNzIGRhdGEgZnJvbSB1bnNwZW50cyBvbiBzb3VyY2VDb2luIGluIGFkZHJlc3MgZGF0YWJhc2Ugb2YgcmVjb3ZlcnlDb2luLlxuICogUmV0dXJuIGZ1bGwgd2FsbGV0VW5zcGVudHMgaW5jbHVkaW5nIHNjcmlwdElkIGluIHNvdXJjZUNvaW4gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBzb3VyY2VDb2luXG4gKiBAcGFyYW0gcmVjb3ZlcnlDb2luXG4gKiBAcGFyYW0gdW5zcGVudHNcbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gd2FsbGV0VW5zcGVudHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9XYWxsZXRVbnNwZW50czxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgc291cmNlQ29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcmVjb3ZlcnlDb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB1bnNwZW50czogVW5zcGVudDxUTnVtYmVyPltdLFxuICB3YWxsZXQ6IElXYWxsZXQgfCBXYWxsZXRWMVxuKTogUHJvbWlzZTxXYWxsZXRVbnNwZW50PFROdW1iZXI+W10+IHtcbiAgY29uc3QgYWRkcmVzc2VzID0gbmV3IFNldCh1bnNwZW50cy5tYXAoKHUpID0+IHUuYWRkcmVzcykpO1xuICBjb25zdCB3YWxsZXRVbnNwZW50czogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdID0gW107XG5cbiAgZm9yIChjb25zdCBhZGRyZXNzIG9mIGFkZHJlc3Nlcykge1xuICAgIGxldCBzY3JpcHRJZDtcbiAgICB0cnkge1xuICAgICAgc2NyaXB0SWQgPSBhd2FpdCBnZXRTY3JpcHRJZChyZWNvdmVyeUNvaW4sIHdhbGxldCwgd2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbihhZGRyZXNzLCBzb3VyY2VDb2luLm5hbWUpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBlcnJvciBnZXR0aW5nIHNjcmlwdElkIGZvciAke2FkZHJlc3N9OmAsIGUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcmVkVW5zcGVudHMgPSB1bnNwZW50c1xuICAgICAgLmZpbHRlcigodSkgPT4gdS5hZGRyZXNzID09PSBhZGRyZXNzKVxuICAgICAgLm1hcCgodSkgPT4gKHtcbiAgICAgICAgLi4udSxcbiAgICAgICAgLi4uc2NyaXB0SWQsXG4gICAgICB9KSk7XG4gICAgd2FsbGV0VW5zcGVudHMucHVzaCguLi5maWx0ZXJlZFVuc3BlbnRzKTtcbiAgfVxuXG4gIHJldHVybiB3YWxsZXRVbnNwZW50cztcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29pblxuICogQHJldHVybiBmZWVSYXRlIGZvciB0cmFuc2FjdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRGZWVSYXRlU2F0VkIoY29pbjogQWJzdHJhY3RVdHhvQ29pbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIC8vIFRPRE86IHVzZSBmZWVSYXRlIEFQSVxuICBjb25zdCBmZWVSYXRlID0ge1xuICAgIGJjaDogMjAsXG4gICAgdGJjaDogMjAsXG4gICAgYmNoYTogMjAsXG4gICAgdGJjaGE6IDIwLFxuICAgIGJzdjogMjAsXG4gICAgdGJzdjogMjAsXG4gICAgYnRjOiA4MCxcbiAgICB0YnRjOiA4MCxcbiAgICB0YnRjc2lnOiA4MCxcbiAgICB0YnRjNDogODAsXG4gICAgdGJ0Y2Jnc2lnOiA4MCxcbiAgICBsdGM6IDEwMCxcbiAgICB0bHRjOiAxMDAsXG4gICAgZG9nZTogMTAwMCxcbiAgICB0ZG9nZTogMTAwMCxcbiAgfVtjb2luLmdldENoYWluKCldO1xuXG4gIGlmICghZmVlUmF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gZmVlUmF0ZSBmb3IgJHtjb2luLmdldENoYWluKCl9YCk7XG4gIH1cblxuICByZXR1cm4gZmVlUmF0ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0geHBydlxuICogQHBhcmFtIHBhc3NwaHJhc2VcbiAqIEBwYXJhbSB3YWxsZXRcbiAqIEByZXR1cm4gc2lnbmluZyBrZXlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UHJ2KHhwcnY/OiBzdHJpbmcsIHBhc3NwaHJhc2U/OiBzdHJpbmcsIHdhbGxldD86IElXYWxsZXQgfCBXYWxsZXRWMSk6IFByb21pc2U8QklQMzJJbnRlcmZhY2U+IHtcbiAgaWYgKHhwcnYpIHtcbiAgICBjb25zdCBrZXkgPSBiaXAzMi5mcm9tQmFzZTU4KHhwcnYpO1xuICAgIGlmIChrZXkuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBpZiAoIXdhbGxldCB8fCAhcGFzc3BocmFzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8geHBydiBnaXZlbjogbmVlZCB3YWxsZXQgYW5kIHBhc3NwaHJhc2UgdG8gY29udGludWVgKTtcbiAgfVxuXG4gIGxldCBlbmNyeXB0ZWRQcnY6IHN0cmluZztcbiAgaWYgKHdhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkge1xuICAgIGVuY3J5cHRlZFBydiA9IChhd2FpdCB3YWxsZXQuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpLmVuY3J5cHRlZFBydjtcbiAgfSBlbHNlIHtcbiAgICBlbmNyeXB0ZWRQcnYgPSAoYXdhaXQgKHdhbGxldCBhcyBXYWxsZXRWMSkuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpLmVuY3J5cHRlZFhwcnY7XG4gIH1cblxuICByZXR1cm4gZ2V0UHJ2KGRlY3J5cHQocGFzc3BocmFzZSwgZW5jcnlwdGVkUHJ2KSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc3dlZXAgdHJhbnNhY3Rpb24gZm9yIGNyb3NzLWNoYWluIHJlY292ZXJ5IHVzaW5nIHdhc20tdXR4b1xuICogQHBhcmFtIGNvaW5OYW1lIC0gQml0R28gY29pbiBuYW1lIChlLmcuICdidGMnLCAndGJ0YycsICdsdGMnKVxuICogQHBhcmFtIHdhbGxldEtleXNcbiAqIEBwYXJhbSB1bnNwZW50c1xuICogQHBhcmFtIHRhcmdldEFkZHJlc3NcbiAqIEBwYXJhbSBmZWVSYXRlU2F0VkJcbiAqIEByZXR1cm4gdW5zaWduZWQgUFNCVFxuICovXG5mdW5jdGlvbiBjcmVhdGVTd2VlcFRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBjb2luTmFtZTogQ29pbk5hbWUsXG4gIHdhbGxldEtleXM6IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxUTnVtYmVyPltdLFxuICB0YXJnZXRBZGRyZXNzOiBzdHJpbmcsXG4gIGZlZVJhdGVTYXRWQjogbnVtYmVyXG4pOiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQge1xuICBjb25zdCBpbnB1dFZhbHVlID0gdW5zcGVudFN1bSh1bnNwZW50cyk7XG5cbiAgLy8gQ3JlYXRlIFBTQlQgd2l0aCB3YXNtLXV0eG8gYW5kIGFkZCB3YWxsZXQgaW5wdXRzIHVzaW5nIHNoYXJlZCB1dGlsaXRpZXNcbiAgY29uc3QgdW5zcGVudHNCaWdpbnQgPSB1bnNwZW50cy5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBCaWdJbnQodS52YWx1ZSkgfSkpO1xuICBjb25zdCB3YXNtUHNidCA9IGNyZWF0ZUVtcHR5V2FzbVBzYnQoY29pbk5hbWUsIHdhbGxldEtleXMpO1xuICBhZGRXYWxsZXRJbnB1dHNUb1dhc21Qc2J0KHdhc21Qc2J0LCB1bnNwZW50c0JpZ2ludCwgd2FsbGV0S2V5cyk7XG5cbiAgLy8gQ2FsY3VsYXRlIGRpbWVuc2lvbnMgdXNpbmcgd2FzbS11dHhvIERpbWVuc2lvbnNcbiAgY29uc3QgdnNpemUgPSBmaXhlZFNjcmlwdFdhbGxldC5EaW1lbnNpb25zLmZyb21Qc2J0KHdhc21Qc2J0KVxuICAgIC5wbHVzKGZpeGVkU2NyaXB0V2FsbGV0LkRpbWVuc2lvbnMuZnJvbU91dHB1dCh0YXJnZXRBZGRyZXNzLCBjb2luTmFtZSkpXG4gICAgLmdldFZTaXplKCk7XG4gIGNvbnN0IGZlZSA9IEJpZ0ludChNYXRoLnJvdW5kKHZzaXplICogZmVlUmF0ZVNhdFZCKSk7XG5cbiAgLy8gQWRkIG91dHB1dCB0byB3YXNtIFBTQlRcbiAgYWRkT3V0cHV0VG9XYXNtUHNidCh3YXNtUHNidCwgdGFyZ2V0QWRkcmVzcywgaW5wdXRWYWx1ZSAtIGZlZSwgY29pbk5hbWUpO1xuXG4gIHJldHVybiB3YXNtUHNidDtcbn1cblxudHlwZSBSZWNvdmVyUGFyYW1zID0ge1xuICAvKiogV2FsbGV0IElEIChjYW4gYmUgdjEgd2FsbGV0IG9yIHYyIHdhbGxldCkgKi9cbiAgd2FsbGV0SWQ6IHN0cmluZztcbiAgLyoqIENvaW4gdG8gY3JlYXRlIHRoZSB0cmFuc2FjdGlvbiBmb3IgKi9cbiAgc291cmNlQ29pbjogQWJzdHJhY3RVdHhvQ29pbjtcbiAgLyoqIENvaW4gdGhhdCB3YWxsZXQga2V5cyB3ZXJlIHNldCB1cCBmb3IgKi9cbiAgcmVjb3ZlcnlDb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICAvKiogU291cmNlIGNvaW4gdHJhbnNhY3Rpb24gdG8gcmVjb3ZlciBvdXRwdXRzIGZyb20gKHNvdXJjZUNvaW4pICovXG4gIHR4aWQ6IHN0cmluZztcbiAgLyoqIFNvdXJjZSBjb2luIGFkZHJlc3MgdG8gc2VuZCB0aGUgZnVuZHMgdG8gKi9cbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG4gIC8qKiBJZiBzZXQsIGRlY3J5cHRzIHByaXZhdGUga2V5IGFuZCBzaWducyB0cmFuc2FjdGlvbiAqL1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICAvKiogSWYgc2V0LCBzaWducyB0cmFuc2FjdGlvbiAqL1xuICB4cHJ2Pzogc3RyaW5nO1xuICAvKiogZm9yIHV0eG8gY29pbnMgb3RoZXIgdGhhbiBbQlRDLFRCVENdIHRoaXMgaXMgYSBCbG9jayBDaGFpciBhcGkga2V5ICoqL1xuICBhcGlLZXk/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFJlY292ZXIgd2FsbGV0IGRlcG9zaXRzIHRoYXQgd2VyZSByZWNlaXZlZCBvbiB0aGUgd3JvbmcgYmxvY2tjaGFpblxuICogKGZvciBpbnN0YW5jZSBiaXRjb2luIGRlcG9zaXRzIHRoYXQgd2VyZSByZWNlaXZlZCBmb3IgYSBsaXRlY29pbiB3YWxsZXQpLlxuICpcbiAqIEZldGNoZXMgdGhlIHVuc3BlbnQgZGF0YSBmcm9tIEJpdEdvJ3MgcHVibGljIGJsb2NrY2hhaW4gQVBJIGFuZCB0aGUgc2NyaXB0IGRhdGEgZnJvbSB0aGUgdXNlcidzXG4gKiB3YWxsZXQuXG4gKlxuICogQHBhcmFtIHtCaXRHb0Jhc2V9IGJpdGdvXG4gKiBAcGFyYW0ge1JlY292ZXJQYXJhbXN9IHBhcmFtc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3ZlckNyb3NzQ2hhaW48VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogUmVjb3ZlclBhcmFtc1xuKTogUHJvbWlzZTxDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlcj4gfCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPj4ge1xuICBjb25zdCB3YWxsZXQgPSBhd2FpdCBnZXRXYWxsZXQoYml0Z28sIHBhcmFtcy5yZWNvdmVyeUNvaW4sIHBhcmFtcy53YWxsZXRJZCk7XG4gIGNvbnN0IHVuc3BlbnRzID0gYXdhaXQgZ2V0QWxsUmVjb3ZlcnlPdXRwdXRzPFROdW1iZXI+KFxuICAgIHBhcmFtcy5zb3VyY2VDb2luLFxuICAgIHBhcmFtcy50eGlkLFxuICAgIHBhcmFtcy5zb3VyY2VDb2luLmFtb3VudFR5cGUsXG4gICAgd2FsbGV0LFxuICAgIHBhcmFtcy5hcGlLZXlcbiAgKTtcbiAgY29uc3Qgd2FsbGV0VW5zcGVudHMgPSBhd2FpdCB0b1dhbGxldFVuc3BlbnRzPFROdW1iZXI+KHBhcmFtcy5zb3VyY2VDb2luLCBwYXJhbXMucmVjb3ZlcnlDb2luLCB1bnNwZW50cywgd2FsbGV0KTtcbiAgY29uc3Qgd2FsbGV0S2V5cyA9IGZpeGVkU2NyaXB0V2FsbGV0LlJvb3RXYWxsZXRLZXlzLmZyb20oYXdhaXQgZ2V0V2FsbGV0S2V5cyhwYXJhbXMucmVjb3ZlcnlDb2luLCB3YWxsZXQpKTtcbiAgY29uc3QgcHJ2ID1cbiAgICBwYXJhbXMueHBydiB8fCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSA/IGF3YWl0IGdldFBydihwYXJhbXMueHBydiwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIHdhbGxldCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZlZVJhdGVTYXRWQiA9IGF3YWl0IGdldEZlZVJhdGVTYXRWQihwYXJhbXMuc291cmNlQ29pbik7XG5cbiAgLy8gQ3JlYXRlIFBTQlQgZm9yIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCByZWNvdmVyeVxuICBsZXQgcHNidCA9IGNyZWF0ZVN3ZWVwVHJhbnNhY3Rpb248VE51bWJlcj4oXG4gICAgcGFyYW1zLnNvdXJjZUNvaW4uZ2V0Q2hhaW4oKSxcbiAgICB3YWxsZXRLZXlzLFxuICAgIHdhbGxldFVuc3BlbnRzLFxuICAgIHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MsXG4gICAgZmVlUmF0ZVNhdFZCXG4gICk7XG5cbiAgLy8gRm9yIHVuc2lnbmVkIHJlY292ZXJ5LCByZXR1cm4gdW5zaWduZWQgUFNCVCBoZXhcbiAgaWYgKCFwcnYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHhIZXg6IGVuY29kZVRyYW5zYWN0aW9uKHBzYnQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHdhbGxldElkOiBwYXJhbXMud2FsbGV0SWQsXG4gICAgICBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlBZGRyZXNzLFxuICAgICAgY29pbjogcGFyYW1zLnNvdXJjZUNvaW4uZ2V0Q2hhaW4oKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gRm9yIHNpZ25lZCByZWNvdmVyeSwgc2lnbiB0aGUgUFNCVCB3aXRoIHVzZXIga2V5IGFuZCByZXR1cm4gaGFsZi1zaWduZWQgUFNCVFxuICBwc2J0ID0gc2lnbkFuZFZlcmlmeVBzYnQocHNidCwgcHJ2LCB3YWxsZXRLZXlzLCB7XG4gICAgcHVibGljS2V5czogZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMocGFyYW1zLnNvdXJjZUNvaW4ubmFtZSksXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbjogd2FsbGV0IGluc3RhbmNlb2YgV2FsbGV0ID8gMiA6IDEsXG4gICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXRJZCxcbiAgICB0eEhleDogZW5jb2RlVHJhbnNhY3Rpb24ocHNidCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIHNvdXJjZUNvaW46IHBhcmFtcy5zb3VyY2VDb2luLmdldENoYWluKCksXG4gICAgcmVjb3ZlcnlDb2luOiBwYXJhbXMucmVjb3ZlcnlDb2luLmdldENoYWluKCksXG4gICAgcmVjb3ZlcnlBbW91bnQ6IHRvVE51bWJlcihcbiAgICAgIGdldFJlY292ZXJ5QW1vdW50KHBzYnQsIHdhbGxldEtleXMsIHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MpLFxuICAgICAgcGFyYW1zLnNvdXJjZUNvaW4uYW1vdW50VHlwZVxuICAgICkgYXMgVE51bWJlcixcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,23 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { UtxoCoinName } from '../names';
|
|
4
|
-
type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
|
|
5
|
-
type WalletUnspent<TNumber extends number | bigint> = utxolib.bitgo.WalletUnspent<TNumber>;
|
|
6
|
-
type ChainCode = utxolib.bitgo.ChainCode;
|
|
7
|
-
/**
|
|
8
|
-
* Backend to use for PSBT creation.
|
|
9
|
-
* - 'wasm-utxo': Use wasm-utxo for PSBT creation (default)
|
|
10
|
-
* - 'utxolib': Use utxolib for PSBT creation (legacy)
|
|
11
|
-
*/
|
|
12
|
-
export type PsbtBackend = 'wasm-utxo' | 'utxolib';
|
|
1
|
+
import { CoinName, fixedScriptWallet } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { type WalletUnspent } from '../unspent';
|
|
13
3
|
/**
|
|
14
4
|
* Check if a chain code is for a taproot script type
|
|
15
5
|
*/
|
|
16
|
-
export declare function isTaprootChain(chain: ChainCode): boolean;
|
|
17
|
-
/**
|
|
18
|
-
* Convert coin name to wasm-utxo network name
|
|
19
|
-
*/
|
|
20
|
-
export declare function toNetworkName(coinName: UtxoCoinName): utxolibCompat.UtxolibName;
|
|
6
|
+
export declare function isTaprootChain(chain: fixedScriptWallet.ChainCode): boolean;
|
|
21
7
|
interface CreateBackupKeyRecoveryPsbtOptions {
|
|
22
8
|
feeRateSatVB: number;
|
|
23
9
|
recoveryDestination: string;
|
|
@@ -42,7 +28,7 @@ export interface CreateEmptyWasmPsbtOptions {
|
|
|
42
28
|
* @param options - Optional settings (e.g., blockHeight for Zcash)
|
|
43
29
|
* @returns A wasm-utxo BitGoPsbt instance
|
|
44
30
|
*/
|
|
45
|
-
export declare function createEmptyWasmPsbt(coinName: CoinName, rootWalletKeys: RootWalletKeys, options?: CreateEmptyWasmPsbtOptions): fixedScriptWallet.BitGoPsbt;
|
|
31
|
+
export declare function createEmptyWasmPsbt(coinName: CoinName, rootWalletKeys: fixedScriptWallet.RootWalletKeys, options?: CreateEmptyWasmPsbtOptions): fixedScriptWallet.BitGoPsbt;
|
|
46
32
|
/**
|
|
47
33
|
* Add wallet inputs from unspents to a wasm-utxo BitGoPsbt.
|
|
48
34
|
* Handles taproot inputs by setting the appropriate signPath.
|
|
@@ -51,7 +37,7 @@ export declare function createEmptyWasmPsbt(coinName: CoinName, rootWalletKeys:
|
|
|
51
37
|
* @param unspents - The wallet unspents to add as inputs
|
|
52
38
|
* @param rootWalletKeys - The wallet keys
|
|
53
39
|
*/
|
|
54
|
-
export declare function addWalletInputsToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, unspents: WalletUnspent<bigint>[], rootWalletKeys: RootWalletKeys): void;
|
|
40
|
+
export declare function addWalletInputsToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, unspents: WalletUnspent<bigint>[], rootWalletKeys: fixedScriptWallet.RootWalletKeys): void;
|
|
55
41
|
/**
|
|
56
42
|
* Add an output to a wasm-utxo BitGoPsbt.
|
|
57
43
|
*
|
|
@@ -62,24 +48,15 @@ export declare function addWalletInputsToWasmPsbt(wasmPsbt: fixedScriptWallet.Bi
|
|
|
62
48
|
* @returns The output index
|
|
63
49
|
*/
|
|
64
50
|
export declare function addOutputToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, address: string, value: bigint, coinName: CoinName): number;
|
|
65
|
-
/**
|
|
66
|
-
* Convert a wasm-utxo BitGoPsbt to a utxolib UtxoPsbt.
|
|
67
|
-
*
|
|
68
|
-
* @param wasmPsbt - The wasm-utxo BitGoPsbt to convert
|
|
69
|
-
* @param network - The network
|
|
70
|
-
* @returns A utxolib UtxoPsbt
|
|
71
|
-
*/
|
|
72
|
-
export declare function toPsbtToUtxolibPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt | utxolib.bitgo.UtxoPsbt, coinName: CoinName): utxolib.bitgo.UtxoPsbt;
|
|
73
51
|
/**
|
|
74
52
|
* Create a backup key recovery PSBT.
|
|
75
53
|
*
|
|
76
|
-
* @param
|
|
54
|
+
* @param coinName - The coin name for the PSBT
|
|
77
55
|
* @param rootWalletKeys - The wallet keys
|
|
78
56
|
* @param unspents - The unspents to include in the PSBT
|
|
79
57
|
* @param options - Options for creating the PSBT
|
|
80
|
-
* @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
|
|
81
58
|
*/
|
|
82
|
-
export declare function createBackupKeyRecoveryPsbt(coinName: CoinName, rootWalletKeys: RootWalletKeys, unspents: WalletUnspent<bigint>[], options: CreateBackupKeyRecoveryPsbtOptions
|
|
83
|
-
export declare function getRecoveryAmount(psbt:
|
|
59
|
+
export declare function createBackupKeyRecoveryPsbt(coinName: CoinName, rootWalletKeys: fixedScriptWallet.RootWalletKeys, unspents: WalletUnspent<bigint>[], options: CreateBackupKeyRecoveryPsbtOptions): fixedScriptWallet.BitGoPsbt;
|
|
60
|
+
export declare function getRecoveryAmount(psbt: fixedScriptWallet.BitGoPsbt, walletKeys: fixedScriptWallet.RootWalletKeys, address: string): bigint;
|
|
84
61
|
export {};
|
|
85
62
|
//# sourceMappingURL=psbt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../../../src/recovery/psbt.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../../../src/recovery/psbt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAA0B,MAAM,kBAAkB,CAAC;AAEvF,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3E;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,CAAC,SAAS,GAAG,OAAO,CAG1E;AAmBD,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;AAmBD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,iBAAiB,CAAC,cAAc,EAChD,OAAO,CAAC,EAAE,0BAA0B,GACnC,iBAAiB,CAAC,SAAS,CAU7B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,cAAc,EAAE,iBAAiB,CAAC,cAAc,GAC/C,IAAI,CAwBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAGR;AA4CD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,iBAAiB,CAAC,cAAc,EAChD,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,OAAO,EAAE,kCAAkC,GAC1C,iBAAiB,CAAC,SAAS,CAM7B;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,CAAC,SAAS,EACjC,UAAU,EAAE,iBAAiB,CAAC,cAAc,EAC5C,OAAO,EAAE,MAAM,GACd,MAAM,CAOR"}
|