@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
|
@@ -39,212 +39,10 @@ const _ = __importStar(require("lodash"));
|
|
|
39
39
|
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
40
40
|
const nock = require("nock");
|
|
41
41
|
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
42
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
42
43
|
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
43
44
|
const src_1 = require("../../src");
|
|
44
45
|
const util_1 = require("./util");
|
|
45
|
-
function getScriptTypes2Of3() {
|
|
46
|
-
return [...utxo_lib_1.bitgo.outputScripts.scriptTypes2Of3, 'taprootKeyPathSpend'];
|
|
47
|
-
}
|
|
48
|
-
describe(`UTXO coin signTransaction`, async function () {
|
|
49
|
-
const bgUrl = sdk_core_1.common.Environments[util_1.defaultBitGo.getEnv()].uri;
|
|
50
|
-
const coin = (0, util_1.getUtxoCoin)('btc');
|
|
51
|
-
const wallet = (0, util_1.getUtxoWallet)(coin, { id: '5b34252f1bf349930e34020a00000000', coin: coin.getChain() });
|
|
52
|
-
const rootWalletKeys = (0, util_1.getDefaultWalletKeys)();
|
|
53
|
-
const userPrv = rootWalletKeys.user.toBase58();
|
|
54
|
-
const pubs = util_1.keychainsBase58.map((v) => v.pub);
|
|
55
|
-
function validatePsbt(txHex, targetSigCount, targetNonceCount) {
|
|
56
|
-
const psbt = utxolib.bitgo.createPsbtFromHex(txHex, coin.network);
|
|
57
|
-
psbt.data.inputs.forEach((input, index) => {
|
|
58
|
-
const parsed = utxolib.bitgo.parsePsbtInput(input);
|
|
59
|
-
if (parsed.scriptType === 'taprootKeyPathSpend') {
|
|
60
|
-
assert.ok(targetNonceCount);
|
|
61
|
-
const nonce = psbt.getProprietaryKeyVals(index, {
|
|
62
|
-
identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
|
|
63
|
-
subtype: utxolib.bitgo.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
|
|
64
|
-
});
|
|
65
|
-
assert.strictEqual(nonce.length, targetNonceCount);
|
|
66
|
-
}
|
|
67
|
-
const expectedSigCount = parsed.scriptType === 'p2shP2pk' || targetSigCount === 0 ? undefined : 1;
|
|
68
|
-
assert.strictEqual(parsed.signatures?.length, expectedSigCount);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
function validateTx(txHex, unspents, targetSigCount) {
|
|
72
|
-
const tx = utxolib.bitgo.createTransactionFromHex(txHex, coin.network);
|
|
73
|
-
unspents.forEach((u, i) => {
|
|
74
|
-
const sigCount = utxolib.bitgo.getStrictSignatureCount(tx.ins[i]);
|
|
75
|
-
const expectedSigCount = utxolib.bitgo.isWalletUnspent(u) && !!targetSigCount ? 1 : 0;
|
|
76
|
-
assert.strictEqual(sigCount, expectedSigCount);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
async function signTransaction(tx, useSigningSteps, unspents) {
|
|
80
|
-
const isPsbt = tx instanceof utxolib.bitgo.UtxoPsbt;
|
|
81
|
-
const isTxWithTaprootKeyPathSpend = isPsbt && utxolib.bitgo.isTransactionWithKeyPathSpendInput(tx);
|
|
82
|
-
const txHex = tx.toHex();
|
|
83
|
-
function nockSignPsbt(psbtHex) {
|
|
84
|
-
const psbt = utxolib.bitgo.createPsbtFromHex(psbtHex, coin.network);
|
|
85
|
-
return nock(bgUrl)
|
|
86
|
-
.post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/signpsbt`, (body) => body.psbt)
|
|
87
|
-
.reply(200, { psbt: psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo).toHex() });
|
|
88
|
-
}
|
|
89
|
-
if (!useSigningSteps) {
|
|
90
|
-
let scope;
|
|
91
|
-
if (tx instanceof utxolib.bitgo.UtxoPsbt && isTxWithTaprootKeyPathSpend) {
|
|
92
|
-
scope = nockSignPsbt(tx.clone().setAllInputsMusig2NonceHD(rootWalletKeys.bitgo).toHex());
|
|
93
|
-
}
|
|
94
|
-
const psbt = await coin.signTransaction({
|
|
95
|
-
txPrebuild: {
|
|
96
|
-
txHex,
|
|
97
|
-
txInfo: isPsbt ? undefined : { unspents },
|
|
98
|
-
walletId: isTxWithTaprootKeyPathSpend ? wallet.id() : undefined,
|
|
99
|
-
},
|
|
100
|
-
prv: userPrv,
|
|
101
|
-
pubs: isPsbt ? undefined : pubs,
|
|
102
|
-
});
|
|
103
|
-
assert.ok('txHex' in psbt);
|
|
104
|
-
if (isPsbt) {
|
|
105
|
-
validatePsbt(psbt.txHex, 1, 2);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
assert.ok(unspents);
|
|
109
|
-
validateTx(psbt.txHex, unspents, 1);
|
|
110
|
-
}
|
|
111
|
-
if (scope) {
|
|
112
|
-
assert.strictEqual(scope.isDone(), true);
|
|
113
|
-
}
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
const signerNoncePsbt = await coin.signTransaction({
|
|
117
|
-
txPrebuild: { txHex },
|
|
118
|
-
prv: userPrv,
|
|
119
|
-
signingStep: 'signerNonce',
|
|
120
|
-
});
|
|
121
|
-
assert.ok('txHex' in signerNoncePsbt);
|
|
122
|
-
if (isPsbt) {
|
|
123
|
-
validatePsbt(signerNoncePsbt.txHex, 0, isTxWithTaprootKeyPathSpend ? 1 : undefined);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
assert.ok(unspents);
|
|
127
|
-
validateTx(signerNoncePsbt.txHex, unspents, 0);
|
|
128
|
-
}
|
|
129
|
-
let scope;
|
|
130
|
-
if (isTxWithTaprootKeyPathSpend) {
|
|
131
|
-
scope = nockSignPsbt(signerNoncePsbt.txHex);
|
|
132
|
-
}
|
|
133
|
-
const cosignerNoncePsbt = await coin.signTransaction({
|
|
134
|
-
txPrebuild: { ...signerNoncePsbt, walletId: wallet.id() },
|
|
135
|
-
signingStep: 'cosignerNonce',
|
|
136
|
-
});
|
|
137
|
-
assert.ok('txHex' in cosignerNoncePsbt);
|
|
138
|
-
if (isPsbt) {
|
|
139
|
-
validatePsbt(cosignerNoncePsbt.txHex, 0, isTxWithTaprootKeyPathSpend ? 2 : undefined);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
assert.ok(unspents);
|
|
143
|
-
validateTx(cosignerNoncePsbt.txHex, unspents, 0);
|
|
144
|
-
}
|
|
145
|
-
if (scope) {
|
|
146
|
-
assert.strictEqual(scope.isDone(), true);
|
|
147
|
-
}
|
|
148
|
-
const signerSigPsbt = await coin.signTransaction({
|
|
149
|
-
txPrebuild: { ...cosignerNoncePsbt, txInfo: isPsbt ? undefined : { unspents } },
|
|
150
|
-
prv: userPrv,
|
|
151
|
-
pubs: isPsbt ? undefined : pubs,
|
|
152
|
-
signingStep: 'signerSignature',
|
|
153
|
-
});
|
|
154
|
-
assert.ok('txHex' in signerSigPsbt);
|
|
155
|
-
if (isPsbt) {
|
|
156
|
-
validatePsbt(signerSigPsbt.txHex, 1, isTxWithTaprootKeyPathSpend ? 2 : undefined);
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
assert.ok(unspents);
|
|
160
|
-
validateTx(signerSigPsbt.txHex, unspents, 1);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
it('success when called like customSigningFunction flow - PSBT with taprootKeyPathSpend inputs', async function () {
|
|
164
|
-
const inputs = utxo_lib_1.testutil.inputScriptTypes.map((scriptType) => ({
|
|
165
|
-
scriptType,
|
|
166
|
-
value: BigInt(1000),
|
|
167
|
-
}));
|
|
168
|
-
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
169
|
-
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
|
|
170
|
-
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned', {
|
|
171
|
-
p2shP2pkKey: (0, src_1.getReplayProtectionPubkeys)(coin.name)[0],
|
|
172
|
-
});
|
|
173
|
-
for (const v of [false, true]) {
|
|
174
|
-
await signTransaction(psbt, v);
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
it('success when called like customSigningFunction flow - PSBT without taprootKeyPathSpend inputs', async function () {
|
|
178
|
-
const inputs = utxo_lib_1.testutil.inputScriptTypes
|
|
179
|
-
.filter((v) => v !== 'taprootKeyPathSpend')
|
|
180
|
-
.map((scriptType) => ({
|
|
181
|
-
scriptType,
|
|
182
|
-
value: BigInt(1000),
|
|
183
|
-
}));
|
|
184
|
-
const unspentSum = inputs.reduce((prev, cur) => prev + cur.value, BigInt(0));
|
|
185
|
-
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
|
|
186
|
-
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
187
|
-
for (const v of [false, true]) {
|
|
188
|
-
await signTransaction(psbt, v);
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
it('success when called like customSigningFunction flow - Network Tx', async function () {
|
|
192
|
-
const inputs = utxo_lib_1.testutil.txnInputScriptTypes
|
|
193
|
-
.filter((v) => v !== 'p2shP2pk')
|
|
194
|
-
.map((scriptType) => ({
|
|
195
|
-
scriptType,
|
|
196
|
-
value: BigInt(1000),
|
|
197
|
-
}));
|
|
198
|
-
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
199
|
-
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
|
|
200
|
-
const txBuilder = utxo_lib_1.testutil.constructTxnBuilder(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
201
|
-
const unspents = inputs.map((v, i) => utxo_lib_1.testutil.toTxnUnspent(v, i, coin.network, rootWalletKeys));
|
|
202
|
-
for (const v of [false, true]) {
|
|
203
|
-
await signTransaction(txBuilder.buildIncomplete(), v, unspents);
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
it('fails when called like customSigningFunction flow - PSBT cache miss', async function () {
|
|
207
|
-
const inputs = [{ scriptType: 'taprootKeyPathSpend', value: BigInt(1000) }];
|
|
208
|
-
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
209
|
-
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
|
|
210
|
-
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
211
|
-
await assert.rejects(async () => {
|
|
212
|
-
await coin.signTransaction({
|
|
213
|
-
txPrebuild: { txHex: psbt.toHex() },
|
|
214
|
-
prv: userPrv,
|
|
215
|
-
signingStep: 'signerSignature',
|
|
216
|
-
});
|
|
217
|
-
}, {
|
|
218
|
-
message: `Psbt is missing from txCache (cache size 0).
|
|
219
|
-
This may be due to the request being routed to a different BitGo-Express instance that for signing step 'signerNonce'.`,
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
it('fails when unsupported locking script is used', async function () {
|
|
223
|
-
const inputs = [
|
|
224
|
-
{ scriptType: 'p2wsh', value: BigInt(1000) },
|
|
225
|
-
{ scriptType: 'p2trMusig2', value: BigInt(1000) },
|
|
226
|
-
];
|
|
227
|
-
const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
|
|
228
|
-
const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(500) }];
|
|
229
|
-
const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
|
|
230
|
-
// override the 1st PSBT input with unsupported 2 of 2 multi-sig locking script.
|
|
231
|
-
const unspent = utxo_lib_1.testutil.toUnspent(inputs[0], 0, coin.network, rootWalletKeys);
|
|
232
|
-
if (!utxolib.bitgo.isWalletUnspent(unspent)) {
|
|
233
|
-
throw new Error('invalid unspent');
|
|
234
|
-
}
|
|
235
|
-
const { publicKeys } = rootWalletKeys.deriveForChainAndIndex(unspent.chain, unspent.index);
|
|
236
|
-
const script2Of2 = utxolib.payments.p2ms({ m: 2, pubkeys: [publicKeys[0], publicKeys[1]] });
|
|
237
|
-
psbt.data.inputs[0].witnessScript = script2Of2.output;
|
|
238
|
-
await assert.rejects(async () => {
|
|
239
|
-
await coin.signTransaction({
|
|
240
|
-
txPrebuild: { txHex: psbt.toHex() },
|
|
241
|
-
prv: userPrv,
|
|
242
|
-
});
|
|
243
|
-
}, {
|
|
244
|
-
message: `length mismatch`,
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
46
|
function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
|
|
249
47
|
const amountType = coin.amountType;
|
|
250
48
|
const title = [
|
|
@@ -382,7 +180,8 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
|
|
|
382
180
|
assert.ok(utxolib.bitgo.getPsbtInputScriptType(input), 'p2shP2pk');
|
|
383
181
|
return;
|
|
384
182
|
}
|
|
385
|
-
const
|
|
183
|
+
const walletUnspent = unspent;
|
|
184
|
+
const pubkeys = walletKeys.deriveForChainAndIndex(walletUnspent.chain, walletUnspent.index).publicKeys;
|
|
386
185
|
pubkeys.forEach((pk, pkIndex) => {
|
|
387
186
|
psbt.validateSignaturesOfInputCommon(index, pk).should.eql(signedBy.includes(walletKeys.triple[pkIndex]));
|
|
388
187
|
});
|
|
@@ -397,7 +196,7 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
|
|
|
397
196
|
? getUnspentsForPsbt().map((u) => ({ ...u, value: utxo_lib_1.bitgo.toTNumber(u.value, amountType) }))
|
|
398
197
|
: getUnspents();
|
|
399
198
|
const prevOutputs = unspents.map((u) => ({
|
|
400
|
-
script:
|
|
199
|
+
script: Buffer.from(wasm_utxo_1.address.toOutputScriptWithCoin(u.address, coin.name)),
|
|
401
200
|
value: u.value,
|
|
402
201
|
}));
|
|
403
202
|
const transaction = utxolib.bitgo.createTransactionFromBuffer(Buffer.from(tx.txHex, 'hex'), coin.network, { amountType });
|
|
@@ -496,32 +295,15 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
|
|
|
496
295
|
});
|
|
497
296
|
}
|
|
498
297
|
function runTestForCoin(coin) {
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
if (!coin.supportsAddressType(type === 'taprootKeyPathSpend' ? 'p2trMusig2' : type)) {
|
|
502
|
-
return;
|
|
503
|
-
}
|
|
504
|
-
if ((type === 'taprootKeyPathSpend' || type === 'p2trMusig2') && txFormat !== 'psbt') {
|
|
505
|
-
return;
|
|
506
|
-
}
|
|
507
|
-
run(coin, [type, type], txFormat);
|
|
508
|
-
if ((0, src_1.getReplayProtectionAddresses)(coin.name).length) {
|
|
509
|
-
run(coin, ['p2shP2pk', type], txFormat);
|
|
510
|
-
}
|
|
511
|
-
if (txFormat === 'psbt') {
|
|
512
|
-
run(coin, [type, type], txFormat, { decodeWith: 'wasm-utxo' });
|
|
513
|
-
if ((0, src_1.getReplayProtectionAddresses)(coin.name).length) {
|
|
514
|
-
run(coin, ['p2shP2pk', type], txFormat, { decodeWith: 'wasm-utxo' });
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
});
|
|
298
|
+
['legacy', 'psbt'].forEach((txFormat) => {
|
|
299
|
+
run(coin, (0, util_1.getScriptTypes)(coin, txFormat), txFormat, { decodeWith: 'wasm-utxo' });
|
|
518
300
|
});
|
|
519
301
|
}
|
|
520
302
|
describe('Transaction Suite', function () {
|
|
521
|
-
util_1.
|
|
303
|
+
(0, util_1.getMinUtxoCoins)().forEach((coin) => {
|
|
522
304
|
describe(`${coin.getChain()}`, function () {
|
|
523
305
|
runTestForCoin(coin);
|
|
524
306
|
});
|
|
525
307
|
});
|
|
526
308
|
});
|
|
527
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQkFBZTtBQUNmLCtDQUFpQztBQUVqQywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLDZCQUE4QjtBQUM5Qiw4Q0FBa0U7QUFDbEUsOENBTXlCO0FBRXpCLG1DQUF3SDtBQUd4SCxpQ0FnQmdCO0FBS2hCLFNBQVMsa0JBQWtCO0lBQ3pCLE9BQU8sQ0FBQyxHQUFHLGdCQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxxQkFBcUIsQ0FBVSxDQUFDO0FBQ2xGLENBQUM7QUFFRCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsS0FBSztJQUN6QyxNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRTdELE1BQU0sSUFBSSxHQUFHLElBQUEsa0JBQVcsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtDQUFrQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sY0FBYyxHQUFHLElBQUEsMkJBQW9CLEdBQUUsQ0FBQztJQUM5QyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLHNCQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFtQixDQUFDO0lBRWpFLFNBQVMsWUFBWSxDQUFDLEtBQWEsRUFBRSxjQUFxQixFQUFFLGdCQUF3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QUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxJQUFBLGtDQUE0QixFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbkQsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixnQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3pCLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQzdCLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBiaXRnbywgdGVzdHV0aWwgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHtcbiAgY29tbW9uLFxuICBGdWxseVNpZ25lZFRyYW5zYWN0aW9uLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBUcmlwbGUsXG4gIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIGdldFJlcGxheVByb3RlY3Rpb25BZGRyZXNzZXMsIGdlbmVyYXRlQWRkcmVzcywgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgU2RrQmFja2VuZCB9IGZyb20gJy4uLy4uL3NyYy90cmFuc2FjdGlvbi90eXBlcyc7XG5cbmltcG9ydCB7XG4gIHV0eG9Db2lucyxcbiAgc2hvdWxkRXF1YWxKU09OLFxuICBnZXRGaXh0dXJlLFxuICBnZXRVdHhvV2FsbGV0LFxuICBtb2NrVW5zcGVudCxcbiAgSW5wdXRTY3JpcHRUeXBlLFxuICBUcmFuc2FjdGlvbk9iaixcbiAgdHJhbnNhY3Rpb25Ub09iaixcbiAgdHJhbnNhY3Rpb25IZXhUb09iaixcbiAgY3JlYXRlUHJlYnVpbGRUcmFuc2FjdGlvbixcbiAgZ2V0RGVmYXVsdFdhbGxldEtleXMsXG4gIGdldFV0eG9Db2luLFxuICBrZXljaGFpbnNCYXNlNTgsXG4gIGdldFdhbGxldEtleXMsXG4gIGRlZmF1bHRCaXRHbyxcbn0gZnJvbSAnLi91dGlsJztcblxudHlwZSBVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gYml0Z28uVW5zcGVudDxUTnVtYmVyPjtcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IGJpdGdvLldhbGxldFVuc3BlbnQ8VE51bWJlcj47XG5cbmZ1bmN0aW9uIGdldFNjcmlwdFR5cGVzMk9mMygpIHtcbiAgcmV0dXJuIFsuLi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMywgJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXSBhcyBjb25zdDtcbn1cblxuZGVzY3JpYmUoYFVUWE8gY29pbiBzaWduVHJhbnNhY3Rpb25gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJnVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tkZWZhdWx0Qml0R28uZ2V0RW52KCldLnVyaTtcblxuICBjb25zdCBjb2luID0gZ2V0VXR4b0NvaW4oJ2J0YycpO1xuICBjb25zdCB3YWxsZXQgPSBnZXRVdHhvV2FsbGV0KGNvaW4sIHsgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSB9KTtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICBjb25zdCB1c2VyUHJ2ID0gcm9vdFdhbGxldEtleXMudXNlci50b0Jhc2U1OCgpO1xuICBjb25zdCBwdWJzID0ga2V5Y2hhaW5zQmFzZTU4Lm1hcCgodikgPT4gdi5wdWIpIGFzIFRyaXBsZTxzdHJpbmc+O1xuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlUHNidCh0eEhleDogc3RyaW5nLCB0YXJnZXRTaWdDb3VudDogMCB8IDEsIHRhcmdldE5vbmNlQ291bnQ/OiAxIHwgMikge1xuICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4SGV4LCBjb2luLm5ldHdvcmspO1xuICAgIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB1dHhvbGliLmJpdGdvLnBhcnNlUHNidElucHV0KGlucHV0KTtcbiAgICAgIGlmIChwYXJzZWQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKSB7XG4gICAgICAgIGFzc2VydC5vayh0YXJnZXROb25jZUNvdW50KTtcbiAgICAgICAgY29uc3Qgbm9uY2UgPSBwc2J0LmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IHV0eG9saWIuYml0Z28uUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICAgIHN1YnR5cGU6IHV0eG9saWIuYml0Z28uUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobm9uY2UubGVuZ3RoLCB0YXJnZXROb25jZUNvdW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cGVjdGVkU2lnQ291bnQgPSBwYXJzZWQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMnBrJyB8fCB0YXJnZXRTaWdDb3VudCA9PT0gMCA/IHVuZGVmaW5lZCA6IDE7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLnNpZ25hdHVyZXM/Lmxlbmd0aCwgZXhwZWN0ZWRTaWdDb3VudCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZVR4KHR4SGV4OiBzdHJpbmcsIHVuc3BlbnRzOiBVbnNwZW50PGJpZ2ludD5bXSwgdGFyZ2V0U2lnQ291bnQ6IDAgfCAxKSB7XG4gICAgY29uc3QgdHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleCh0eEhleCwgY29pbi5uZXR3b3JrKTtcbiAgICB1bnNwZW50cy5mb3JFYWNoKCh1LCBpKSA9PiB7XG4gICAgICBjb25zdCBzaWdDb3VudCA9IHV0eG9saWIuYml0Z28uZ2V0U3RyaWN0U2lnbmF0dXJlQ291bnQodHguaW5zW2ldKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2lnQ291bnQgPSB1dHhvbGliLmJpdGdvLmlzV2FsbGV0VW5zcGVudCh1KSAmJiAhIXRhcmdldFNpZ0NvdW50ID8gMSA6IDA7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2lnQ291bnQsIGV4cGVjdGVkU2lnQ291bnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2lnblRyYW5zYWN0aW9uKFxuICAgIHR4OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHwgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248YmlnaW50PixcbiAgICB1c2VTaWduaW5nU3RlcHM6IGJvb2xlYW4sXG4gICAgdW5zcGVudHM/OiBVbnNwZW50PGJpZ2ludD5bXVxuICApIHtcbiAgICBjb25zdCBpc1BzYnQgPSB0eCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQ7XG4gICAgY29uc3QgaXNUeFdpdGhUYXByb290S2V5UGF0aFNwZW5kID0gaXNQc2J0ICYmIHV0eG9saWIuYml0Z28uaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dCh0eCk7XG4gICAgY29uc3QgdHhIZXggPSB0eC50b0hleCgpO1xuXG4gICAgZnVuY3Rpb24gbm9ja1NpZ25Qc2J0KHBzYnRIZXg6IHN0cmluZyk6IG5vY2suU2NvcGUge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21IZXgocHNidEhleCwgY29pbi5uZXR3b3JrKTtcbiAgICAgIHJldHVybiBub2NrKGJnVXJsKVxuICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zaWducHNidGAsIChib2R5KSA9PiBib2R5LnBzYnQpXG4gICAgICAgIC5yZXBseSgyMDAsIHsgcHNidDogcHNidC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHJvb3RXYWxsZXRLZXlzLmJpdGdvKS50b0hleCgpIH0pO1xuICAgIH1cblxuICAgIGlmICghdXNlU2lnbmluZ1N0ZXBzKSB7XG4gICAgICBsZXQgc2NvcGU6IG5vY2suU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0ICYmIGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCkge1xuICAgICAgICBzY29wZSA9IG5vY2tTaWduUHNidCh0eC5jbG9uZSgpLnNldEFsbElucHV0c011c2lnMk5vbmNlSEQocm9vdFdhbGxldEtleXMuYml0Z28pLnRvSGV4KCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgcHNidCA9IGF3YWl0IGNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHR4SGV4LFxuICAgICAgICAgIHR4SW5mbzogaXNQc2J0ID8gdW5kZWZpbmVkIDogeyB1bnNwZW50cyB9LFxuICAgICAgICAgIHdhbGxldElkOiBpc1R4V2l0aFRhcHJvb3RLZXlQYXRoU3BlbmQgPyB3YWxsZXQuaWQoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgICBwdWJzOiBpc1BzYnQgPyB1bmRlZmluZWQgOiBwdWJzLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQub2soJ3R4SGV4JyBpbiBwc2J0KTtcbiAgICAgIGlmIChpc1BzYnQpIHtcbiAgICAgICAgdmFsaWRhdGVQc2J0KHBzYnQudHhIZXgsIDEsIDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0Lm9rKHVuc3BlbnRzKTtcbiAgICAgICAgdmFsaWRhdGVUeChwc2J0LnR4SGV4LCB1bnNwZW50cywgMSk7XG4gICAgICB9XG4gICAgICBpZiAoc2NvcGUpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjb3BlLmlzRG9uZSgpLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZXJOb25jZVBzYnQgPSBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0sXG4gICAgICBwcnY6IHVzZXJQcnYsXG4gICAgICBzaWduaW5nU3RlcDogJ3NpZ25lck5vbmNlJyxcbiAgICB9KTtcbiAgICBhc3NlcnQub2soJ3R4SGV4JyBpbiBzaWduZXJOb25jZVBzYnQpO1xuICAgIGlmIChpc1BzYnQpIHtcbiAgICAgIHZhbGlkYXRlUHNidChzaWduZXJOb25jZVBzYnQudHhIZXgsIDAsIGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCA/IDEgOiB1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQub2sodW5zcGVudHMpO1xuICAgICAgdmFsaWRhdGVUeChzaWduZXJOb25jZVBzYnQudHhIZXgsIHVuc3BlbnRzLCAwKTtcbiAgICB9XG5cbiAgICBsZXQgc2NvcGU6IG5vY2suU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCkge1xuICAgICAgc2NvcGUgPSBub2NrU2lnblBzYnQoc2lnbmVyTm9uY2VQc2J0LnR4SGV4KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3NpZ25lck5vbmNlUHNidCA9IGF3YWl0IGNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4uc2lnbmVyTm9uY2VQc2J0LCB3YWxsZXRJZDogd2FsbGV0LmlkKCkgfSxcbiAgICAgIHNpZ25pbmdTdGVwOiAnY29zaWduZXJOb25jZScsXG4gICAgfSk7XG4gICAgYXNzZXJ0Lm9rKCd0eEhleCcgaW4gY29zaWduZXJOb25jZVBzYnQpO1xuICAgIGlmIChpc1BzYnQpIHtcbiAgICAgIHZhbGlkYXRlUHNidChjb3NpZ25lck5vbmNlUHNidC50eEhleCwgMCwgaXNUeFdpdGhUYXByb290S2V5UGF0aFNwZW5kID8gMiA6IHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydC5vayh1bnNwZW50cyk7XG4gICAgICB2YWxpZGF0ZVR4KGNvc2lnbmVyTm9uY2VQc2J0LnR4SGV4LCB1bnNwZW50cywgMCk7XG4gICAgfVxuXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NvcGUuaXNEb25lKCksIHRydWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lclNpZ1BzYnQgPSBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLmNvc2lnbmVyTm9uY2VQc2J0LCB0eEluZm86IGlzUHNidCA/IHVuZGVmaW5lZCA6IHsgdW5zcGVudHMgfSB9LFxuICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgcHViczogaXNQc2J0ID8gdW5kZWZpbmVkIDogcHVicyxcbiAgICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyU2lnbmF0dXJlJyxcbiAgICB9KTtcbiAgICBhc3NlcnQub2soJ3R4SGV4JyBpbiBzaWduZXJTaWdQc2J0KTtcbiAgICBpZiAoaXNQc2J0KSB7XG4gICAgICB2YWxpZGF0ZVBzYnQoc2lnbmVyU2lnUHNidC50eEhleCwgMSwgaXNUeFdpdGhUYXByb290S2V5UGF0aFNwZW5kID8gMiA6IHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydC5vayh1bnNwZW50cyk7XG4gICAgICB2YWxpZGF0ZVR4KHNpZ25lclNpZ1BzYnQudHhIZXgsIHVuc3BlbnRzLCAxKTtcbiAgICB9XG4gIH1cblxuICBpdCgnc3VjY2VzcyB3aGVuIGNhbGxlZCBsaWtlIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBmbG93IC0gUFNCVCB3aXRoIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0czogdGVzdHV0aWwuSW5wdXRbXSA9IHRlc3R1dGlsLmlucHV0U2NyaXB0VHlwZXMubWFwKChzY3JpcHRUeXBlKSA9PiAoe1xuICAgICAgc2NyaXB0VHlwZSxcbiAgICAgIHZhbHVlOiBCaWdJbnQoMTAwMCksXG4gICAgfSkpO1xuICAgIGNvbnN0IHVuc3BlbnRTdW0gPSBpbnB1dHMucmVkdWNlKChwcmV2OiBiaWdpbnQsIGN1cnIpID0+IHByZXYgKyBjdXJyLnZhbHVlLCBCaWdJbnQoMCkpO1xuICAgIGNvbnN0IG91dHB1dHM6IHRlc3R1dGlsLk91dHB1dFtdID0gW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogdW5zcGVudFN1bSAtIEJpZ0ludCgxMDAwKSB9XTtcbiAgICBjb25zdCBwc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChpbnB1dHMsIG91dHB1dHMsIGNvaW4ubmV0d29yaywgcm9vdFdhbGxldEtleXMsICd1bnNpZ25lZCcsIHtcbiAgICAgIHAyc2hQMnBrS2V5OiBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyhjb2luLm5hbWUpWzBdLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCB2IG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgICAgIGF3YWl0IHNpZ25UcmFuc2FjdGlvbihwc2J0LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzdWNjZXNzIHdoZW4gY2FsbGVkIGxpa2UgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIGZsb3cgLSBQU0JUIHdpdGhvdXQgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5wdXRzOiB0ZXN0dXRpbC5JbnB1dFtdID0gdGVzdHV0aWwuaW5wdXRTY3JpcHRUeXBlc1xuICAgICAgLmZpbHRlcigodikgPT4gdiAhPT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKVxuICAgICAgLm1hcCgoc2NyaXB0VHlwZSkgPT4gKHtcbiAgICAgICAgc2NyaXB0VHlwZSxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgxMDAwKSxcbiAgICAgIH0pKTtcbiAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXIpID0+IHByZXYgKyBjdXIudmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuT3V0cHV0W10gPSBbeyBzY3JpcHRUeXBlOiAncDJzaCcsIHZhbHVlOiB1bnNwZW50U3VtIC0gQmlnSW50KDEwMDApIH1dO1xuICAgIGNvbnN0IHBzYnQgPSB0ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KGlucHV0cywgb3V0cHV0cywgY29pbi5uZXR3b3JrLCByb290V2FsbGV0S2V5cywgJ3Vuc2lnbmVkJyk7XG5cbiAgICBmb3IgKGNvbnN0IHYgb2YgW2ZhbHNlLCB0cnVlXSkge1xuICAgICAgYXdhaXQgc2lnblRyYW5zYWN0aW9uKHBzYnQsIHYpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3N1Y2Nlc3Mgd2hlbiBjYWxsZWQgbGlrZSBjdXN0b21TaWduaW5nRnVuY3Rpb24gZmxvdyAtIE5ldHdvcmsgVHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5wdXRzOiB0ZXN0dXRpbC5UeG5JbnB1dDxiaWdpbnQ+W10gPSB0ZXN0dXRpbC50eG5JbnB1dFNjcmlwdFR5cGVzXG4gICAgICAuZmlsdGVyKCh2KSA9PiB2ICE9PSAncDJzaFAycGsnKVxuICAgICAgLm1hcCgoc2NyaXB0VHlwZSkgPT4gKHtcbiAgICAgICAgc2NyaXB0VHlwZSxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgxMDAwKSxcbiAgICAgIH0pKTtcbiAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci52YWx1ZSwgQmlnSW50KDApKTtcbiAgICBjb25zdCBvdXRwdXRzOiB0ZXN0dXRpbC5UeG5PdXRwdXQ8YmlnaW50PltdID0gW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogdW5zcGVudFN1bSAtIEJpZ0ludCgxMDAwKSB9XTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0ZXN0dXRpbC5jb25zdHJ1Y3RUeG5CdWlsZGVyKGlucHV0cywgb3V0cHV0cywgY29pbi5uZXR3b3JrLCByb290V2FsbGV0S2V5cywgJ3Vuc2lnbmVkJyk7XG4gICAgY29uc3QgdW5zcGVudHMgPSBpbnB1dHMubWFwKCh2LCBpKSA9PiB0ZXN0dXRpbC50b1R4blVuc3BlbnQodiwgaSwgY29pbi5uZXR3b3JrLCByb290V2FsbGV0S2V5cykpO1xuXG4gICAgZm9yIChjb25zdCB2IG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgICAgIGF3YWl0IHNpZ25UcmFuc2FjdGlvbih0eEJ1aWxkZXIuYnVpbGRJbmNvbXBsZXRlKCksIHYsIHVuc3BlbnRzKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdmYWlscyB3aGVuIGNhbGxlZCBsaWtlIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBmbG93IC0gUFNCVCBjYWNoZSBtaXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0czogdGVzdHV0aWwuSW5wdXRbXSA9IFt7IHNjcmlwdFR5cGU6ICd0YXByb290S2V5UGF0aFNwZW5kJywgdmFsdWU6IEJpZ0ludCgxMDAwKSB9XTtcbiAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci52YWx1ZSwgQmlnSW50KDApKTtcbiAgICBjb25zdCBvdXRwdXRzOiB0ZXN0dXRpbC5PdXRwdXRbXSA9IFt7IHNjcmlwdFR5cGU6ICdwMnNoJywgdmFsdWU6IHVuc3BlbnRTdW0gLSBCaWdJbnQoMTAwMCkgfV07XG4gICAgY29uc3QgcHNidCA9IHRlc3R1dGlsLmNvbnN0cnVjdFBzYnQoaW5wdXRzLCBvdXRwdXRzLCBjb2luLm5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCAndW5zaWduZWQnKTtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogcHNidC50b0hleCgpIH0sXG4gICAgICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgICAgIHNpZ25pbmdTdGVwOiAnc2lnbmVyU2lnbmF0dXJlJyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZXNzYWdlOiBgUHNidCBpcyBtaXNzaW5nIGZyb20gdHhDYWNoZSAoY2FjaGUgc2l6ZSAwKS5cbiAgICAgICAgICAgIFRoaXMgbWF5IGJlIGR1ZSB0byB0aGUgcmVxdWVzdCBiZWluZyByb3V0ZWQgdG8gYSBkaWZmZXJlbnQgQml0R28tRXhwcmVzcyBpbnN0YW5jZSB0aGF0IGZvciBzaWduaW5nIHN0ZXAgJ3NpZ25lck5vbmNlJy5gLFxuICAgICAgfVxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdmYWlscyB3aGVuIHVuc3VwcG9ydGVkIGxvY2tpbmcgc2NyaXB0IGlzIHVzZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgaW5wdXRzOiB0ZXN0dXRpbC5JbnB1dFtdID0gW1xuICAgICAgeyBzY3JpcHRUeXBlOiAncDJ3c2gnLCB2YWx1ZTogQmlnSW50KDEwMDApIH0sXG4gICAgICB7IHNjcmlwdFR5cGU6ICdwMnRyTXVzaWcyJywgdmFsdWU6IEJpZ0ludCgxMDAwKSB9LFxuICAgIF07XG4gICAgY29uc3QgdW5zcGVudFN1bSA9IGlucHV0cy5yZWR1Y2UoKHByZXY6IGJpZ2ludCwgY3VycikgPT4gcHJldiArIGN1cnIudmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuT3V0cHV0W10gPSBbeyBzY3JpcHRUeXBlOiAncDJzaCcsIHZhbHVlOiB1bnNwZW50U3VtIC0gQmlnSW50KDUwMCkgfV07XG4gICAgY29uc3QgcHNidCA9IHRlc3R1dGlsLmNvbnN0cnVjdFBzYnQoaW5wdXRzLCBvdXRwdXRzLCBjb2luLm5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCAndW5zaWduZWQnKTtcblxuICAgIC8vIG92ZXJyaWRlIHRoZSAxc3QgUFNCVCBpbnB1dCB3aXRoIHVuc3VwcG9ydGVkIDIgb2YgMiBtdWx0aS1zaWcgbG9ja2luZyBzY3JpcHQuXG4gICAgY29uc3QgdW5zcGVudCA9IHRlc3R1dGlsLnRvVW5zcGVudChpbnB1dHNbMF0sIDAsIGNvaW4ubmV0d29yaywgcm9vdFdhbGxldEtleXMpO1xuICAgIGlmICghdXR4b2xpYi5iaXRnby5pc1dhbGxldFVuc3BlbnQodW5zcGVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1bnNwZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHVibGljS2V5cyB9ID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KTtcbiAgICBjb25zdCBzY3JpcHQyT2YyID0gdXR4b2xpYi5wYXltZW50cy5wMm1zKHsgbTogMiwgcHVia2V5czogW3B1YmxpY0tleXNbMF0sIHB1YmxpY0tleXNbMV1dIH0pO1xuICAgIHBzYnQuZGF0YS5pbnB1dHNbMF0ud2l0bmVzc1NjcmlwdCA9IHNjcmlwdDJPZjIub3V0cHV0O1xuXG4gICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBwc2J0LnRvSGV4KCkgfSxcbiAgICAgICAgICBwcnY6IHVzZXJQcnYsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTogYGxlbmd0aCBtaXNtYXRjaGAsXG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59KTtcblxuZnVuY3Rpb24gcnVuPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBpbnB1dFNjcmlwdHM6IHRlc3R1dGlsLklucHV0U2NyaXB0VHlwZVtdLFxuICB0eEZvcm1hdDogJ2xlZ2FjeScgfCAncHNidCcsXG4gIHsgZGVjb2RlV2l0aCB9OiB7IGRlY29kZVdpdGg/OiBTZGtCYWNrZW5kIH0gPSB7fVxuKSB7XG4gIGNvbnN0IGFtb3VudFR5cGUgPSBjb2luLmFtb3VudFR5cGU7XG4gIGNvbnN0IHRpdGxlID0gW1xuICAgIGlucHV0U2NyaXB0cy5qb2luKCcsJyksXG4gICAgYHR4Rm9ybWF0PSR7dHhGb3JtYXR9YCxcbiAgICBgYW1vdW50VHlwZT0ke2Ftb3VudFR5cGV9YCxcbiAgICBkZWNvZGVXaXRoID8gYGRlY29kZVdpdGg9JHtkZWNvZGVXaXRofWAgOiAnJyxcbiAgXTtcbiAgZGVzY3JpYmUoYCR7dGl0bGUuam9pbignICcpfWAsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZGVmYXVsdEJpdEdvLmdldEVudigpXS51cmk7XG5cbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCA9IGlucHV0U2NyaXB0cy5zb21lKChzKSA9PiBzID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpO1xuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25XaXRoUmVwbGF5UHJvdGVjdGlvbiA9IGlucHV0U2NyaXB0cy5zb21lKChzKSA9PiBzID09PSAncDJzaFAycGsnKTtcbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aFAydHIgPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3AydHInKTtcbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aFAydHJNdXNpZzIgPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3AydHJNdXNpZzInKTtcblxuICAgIGNvbnN0IHZhbHVlID0gKGFtb3VudFR5cGUgPT09ICdiaWdpbnQnID8gQmlnSW50KCcxMDk5OTk5OTgwMDAwMDAwMScpIDogMWU4KSBhcyBUTnVtYmVyO1xuICAgIGNvbnN0IHdhbGxldCA9IGdldFV0eG9XYWxsZXQoY29pbiwgeyBpZDogJzViMzQyNTJmMWJmMzQ5OTMwZTM0MDIwYTAwMDAwMDAwJywgY29pbjogY29pbi5nZXRDaGFpbigpIH0pO1xuICAgIGNvbnN0IHdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuXG4gICAgY29uc3QgZnVsbFNpZ24gPSAhKGlzVHJhbnNhY3Rpb25XaXRoUmVwbGF5UHJvdGVjdGlvbiB8fCBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCk7XG5cbiAgICBmdW5jdGlvbiBnZXRVbnNwZW50c0ZvclBzYnQoKTogVW5zcGVudDxiaWdpbnQ+W10ge1xuICAgICAgcmV0dXJuIGlucHV0U2NyaXB0cy5tYXAoKHQsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB0ZXN0dXRpbC50b1Vuc3BlbnQoXG4gICAgICAgICAgeyBzY3JpcHRUeXBlOiB0LCB2YWx1ZTogdCA9PT0gJ3Ayc2hQMnBrJyA/IEJpZ0ludCgxMDAwKSA6IEJpZ0ludCh2YWx1ZSkgfSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBjb2luLm5ldHdvcmssXG4gICAgICAgICAgd2FsbGV0S2V5c1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9UeG5JbnB1dFNjcmlwdFR5cGUodHlwZTogdGVzdHV0aWwuSW5wdXRTY3JpcHRUeXBlKTogSW5wdXRTY3JpcHRUeXBlIHtcbiAgICAgIHJldHVybiB0eXBlID09PSAncDJzaFAycGsnID8gJ3JlcGxheVByb3RlY3Rpb24nIDogdHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnID8gJ3AydHJNdXNpZzInIDogdHlwZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRVbnNwZW50cygpOiBVbnNwZW50PFROdW1iZXI+W10ge1xuICAgICAgcmV0dXJuIGlucHV0U2NyaXB0cy5tYXAoKHR5cGUsIGkpID0+XG4gICAgICAgIG1vY2tVbnNwZW50PFROdW1iZXI+KGNvaW4ubmV0d29yaywgd2FsbGV0S2V5cywgdG9UeG5JbnB1dFNjcmlwdFR5cGUodHlwZSksIGksIHZhbHVlKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRPdXRwdXRBZGRyZXNzKHJvb3RXYWxsZXRLZXlzOiB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBnZW5lcmF0ZUFkZHJlc3MoY29pbi5uYW1lLCB7XG4gICAgICAgIGtleWNoYWluczogcm9vdFdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gKHsgcHViOiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSB9KSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTaWduUGFyYW1zKFxuICAgICAgcHJlYnVpbGRIZXg6IHN0cmluZyxcbiAgICAgIHNpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBjb3NpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBkZWNvZGVXaXRoOiBTZGtCYWNrZW5kIHwgdW5kZWZpbmVkXG4gICAgKTogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gICAgICBjb25zdCB0eEluZm8gPSB7XG4gICAgICAgIHVuc3BlbnRzOiB0eEZvcm1hdCA9PT0gJ3BzYnQnID8gdW5kZWZpbmVkIDogZ2V0VW5zcGVudHMoKSxcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eFByZWJ1aWxkOiB7XG4gICAgICAgICAgd2FsbGV0SWQ6IGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kID8gd2FsbGV0LmlkKCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgdHhIZXg6IHByZWJ1aWxkSGV4LFxuICAgICAgICAgIHR4SW5mbyxcbiAgICAgICAgICBkZWNvZGVXaXRoLFxuICAgICAgICB9LFxuICAgICAgICBwcnY6IHNpZ25lci50b0Jhc2U1OCgpLFxuICAgICAgICBwdWJzOiB3YWxsZXRLZXlzLnRyaXBsZS5tYXAoKGspID0+IGsubmV1dGVyZWQoKS50b0Jhc2U1OCgpKSxcbiAgICAgICAgY29zaWduZXJQdWI6IGNvc2lnbmVyLm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgIH0gYXMgV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucztcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVIYWxmU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICBwcmVidWlsZDogdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj4gfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LFxuICAgICAgc2lnbmVyOiBCSVAzMkludGVyZmFjZSxcbiAgICAgIGNvc2lnbmVyOiBCSVAzMkludGVyZmFjZVxuICAgICk6IFByb21pc2U8SGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj4ge1xuICAgICAgbGV0IHNjb3BlOiBub2NrLlNjb3BlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHByZWJ1aWxkIGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCAmJiBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCkge1xuICAgICAgICBjb25zdCBwc2J0ID0gcHJlYnVpbGQuY2xvbmUoKS5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKGNvc2lnbmVyKTtcbiAgICAgICAgc2NvcGUgPSBub2NrKGJnVXJsKVxuICAgICAgICAgIC5wb3N0KGAvYXBpL3YyLyR7d2FsbGV0LmNvaW4oKX0vd2FsbGV0LyR7d2FsbGV0LmlkKCl9L3R4L3NpZ25wc2J0YCwgKGJvZHkpID0+IGJvZHkucHNidClcbiAgICAgICAgICAucmVwbHkoMjAwLCB7IHBzYnQ6IHBzYnQudG9IZXgoKSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gaGFsZi1zaWduIHdpdGggdGhlIHVzZXIga2V5XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgd2FsbGV0LnNpZ25UcmFuc2FjdGlvbihcbiAgICAgICAgZ2V0U2lnblBhcmFtcyhwcmVidWlsZC50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKSwgc2lnbmVyLCBjb3NpZ25lciwgZGVjb2RlV2l0aClcbiAgICAgICkpIGFzIFByb21pc2U8SGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj47XG5cbiAgICAgIGlmIChzY29wZSkge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2NvcGUuaXNEb25lKCksIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUZ1bGxTaWduZWRUcmFuc2FjdGlvbihcbiAgICAgIGhhbGZTaWduZWQ6IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24sXG4gICAgICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgY29zaWduZXI6IEJJUDMySW50ZXJmYWNlXG4gICAgKTogUHJvbWlzZTxGdWxseVNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgICByZXR1cm4gKGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5nZXRTaWduUGFyYW1zKGhhbGZTaWduZWQudHhIZXgsIHNpZ25lciwgY29zaWduZXIsIGRlY29kZVdpdGgpLFxuICAgICAgICBpc0xhc3RTaWduYXR1cmU6IHRydWUsXG4gICAgICB9KSkgYXMgRnVsbHlTaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9XG5cbiAgICB0eXBlIFRyYW5zYWN0aW9uU3RhZ2VzID0ge1xuICAgICAgcHJlYnVpbGQ6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidDtcbiAgICAgIGhhbGZTaWduZWRVc2VyQmFja3VwPzogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbjtcbiAgICAgIGhhbGZTaWduZWRVc2VyQml0R286IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb247XG4gICAgICBmdWxsU2lnbmVkVXNlckJhY2t1cD86IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb247XG4gICAgICBmdWxsU2lnbmVkVXNlckJpdEdvPzogRnVsbHlTaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9O1xuXG4gICAgdHlwZSBUcmFuc2FjdGlvbk9ialN0YWdlcyA9IFJlY29yZDxrZXlvZiBUcmFuc2FjdGlvblN0YWdlcywgVHJhbnNhY3Rpb25PYmo+O1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlUHJlYnVpbGRQc2J0KCkge1xuICAgICAgY29uc3QgaW5wdXRzID0gaW5wdXRTY3JpcHRzLm1hcChcbiAgICAgICAgKHQpOiB0ZXN0dXRpbC5JbnB1dCA9PiAoe1xuICAgICAgICAgIHNjcmlwdFR5cGU6IHQsXG4gICAgICAgICAgdmFsdWU6IHQgPT09ICdwMnNoUDJwaycgPyBCaWdJbnQoMTAwMCkgOiBCaWdJbnQodmFsdWUpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHVuc3BlbnRTdW0gPSBpbnB1dHMucmVkdWNlKChwcmV2OiBiaWdpbnQsIGN1cnIpID0+IHByZXYgKyBjdXJyLnZhbHVlLCBCaWdJbnQoMCkpO1xuICAgICAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuT3V0cHV0W10gPSBbXG4gICAgICAgIHsgYWRkcmVzczogZ2V0T3V0cHV0QWRkcmVzcyhnZXRXYWxsZXRLZXlzKCd0ZXN0JykpLCB2YWx1ZTogdW5zcGVudFN1bSAtIEJpZ0ludCgxMDAwKSB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHBzYnQgPSB0ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KGlucHV0cywgb3V0cHV0cywgY29pbi5uZXR3b3JrLCB3YWxsZXRLZXlzLCAndW5zaWduZWQnLCB7XG4gICAgICAgIHAyc2hQMnBrS2V5OiBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyhjb2luLm5hbWUpWzBdLFxuICAgICAgfSk7XG4gICAgICB1dHhvbGliLmJpdGdvLmFkZFhwdWJzVG9Qc2J0KHBzYnQsIHdhbGxldEtleXMpO1xuICAgICAgcmV0dXJuIHBzYnQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25TdGFnZXMoKTogUHJvbWlzZTxUcmFuc2FjdGlvblN0YWdlcz4ge1xuICAgICAgY29uc3QgcHJlYnVpbGQgPVxuICAgICAgICB0eEZvcm1hdCA9PT0gJ3BzYnQnXG4gICAgICAgICAgPyBjcmVhdGVQcmVidWlsZFBzYnQoKVxuICAgICAgICAgIDogY3JlYXRlUHJlYnVpbGRUcmFuc2FjdGlvbjxUTnVtYmVyPihjb2luLm5ldHdvcmssIGdldFVuc3BlbnRzKCksIGdldE91dHB1dEFkZHJlc3Mod2FsbGV0S2V5cykpO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkVXNlckJpdEdvID0gYXdhaXQgY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKHByZWJ1aWxkLCB3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYml0Z28pO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFVzZXJCaXRHbyA9XG4gICAgICAgIGZ1bGxTaWduICYmICFpc1RyYW5zYWN0aW9uV2l0aFAydHJNdXNpZzJcbiAgICAgICAgICA/IGF3YWl0IGNyZWF0ZUZ1bGxTaWduZWRUcmFuc2FjdGlvbihoYWxmU2lnbmVkVXNlckJpdEdvLCB3YWxsZXRLZXlzLmJpdGdvLCB3YWxsZXRLZXlzLnVzZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGhhbGZTaWduZWRVc2VyQmFja3VwID1cbiAgICAgICAgIWlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kICYmICEodHhGb3JtYXQgPT09ICdwc2J0JyAmJiBpc1RyYW5zYWN0aW9uV2l0aFAydHIpXG4gICAgICAgICAgPyBhd2FpdCBjcmVhdGVIYWxmU2lnbmVkVHJhbnNhY3Rpb24ocHJlYnVpbGQsIHdhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iYWNrdXApXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBmdWxsU2lnbmVkVXNlckJhY2t1cCA9XG4gICAgICAgIGZ1bGxTaWduICYmIGhhbGZTaWduZWRVc2VyQmFja3VwXG4gICAgICAgICAgPyBhd2FpdCBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oaGFsZlNpZ25lZFVzZXJCYWNrdXAsIHdhbGxldEtleXMuYmFja3VwLCB3YWxsZXRLZXlzLnVzZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZWJ1aWxkLFxuICAgICAgICBoYWxmU2lnbmVkVXNlckJhY2t1cCxcbiAgICAgICAgaGFsZlNpZ25lZFVzZXJCaXRHbyxcbiAgICAgICAgZnVsbFNpZ25lZFVzZXJCYWNrdXAsXG4gICAgICAgIGZ1bGxTaWduZWRVc2VyQml0R28sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCB0cmFuc2FjdGlvblN0YWdlczogVHJhbnNhY3Rpb25TdGFnZXM7XG5cbiAgICBiZWZvcmUoJ3ByZXBhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICB0cmFuc2FjdGlvblN0YWdlcyA9IGF3YWl0IGdldFRyYW5zYWN0aW9uU3RhZ2VzKCk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2gobm9jay5jbGVhbkFsbCk7XG5cbiAgICBpdCgnbWF0Y2ggZml4dHVyZXMnLCBhc3luYyBmdW5jdGlvbiAodGhpczogTW9jaGEuQ29udGV4dCkge1xuICAgICAgaWYgKHR4Rm9ybWF0ID09PSAncHNidCcpIHtcbiAgICAgICAgLy8gVE9ETyAobWF5YmUpIC0gb25jZSBmdWxsIFBTQlQgc3VwcG9ydCBpcyBhZGRlZCB0byBhYnN0cmFjdC11dHhvIG1vZHVsZSwgY3VzdG9tIEpTT04gcmVwcmVzZW50YXRpb24gb2YgUFNCVCBjYW4gYmUgY3JlYXRlZCBhbmQgdGVzdGVkIGhlcmUuXG4gICAgICAgIC8vIHNpZ25hdHVyZXMgb2YgdGFwcm9vdEtleVBhdGhTcGVuZHMgYXJlIHJhbmRvbSBzaW5jZSByYW5kb20gbmF0dXJlIG9mIE11U2lnMiBub25jZSwgc28gcHNidCBoZXggY29tcGFyaXNvbiBhbHNvIHdvbnQgd29yay5cblxuICAgICAgICByZXR1cm4gdGhpcy5za2lwKCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRvVHJhbnNhY3Rpb25TdGFnZXNPYmooc3RhZ2VzOiBUcmFuc2FjdGlvblN0YWdlcyk6IFRyYW5zYWN0aW9uT2JqU3RhZ2VzIHtcbiAgICAgICAgcmV0dXJuIF8ubWFwVmFsdWVzKHN0YWdlcywgKHYpID0+XG4gICAgICAgICAgdiA9PT0gdW5kZWZpbmVkIHx8IHYgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0XG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiB2IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb25cbiAgICAgICAgICAgID8gdHJhbnNhY3Rpb25Ub09iajxUTnVtYmVyPih2KVxuICAgICAgICAgICAgOiB0cmFuc2FjdGlvbkhleFRvT2JqKHYudHhIZXgsIGNvaW4ubmV0d29yaywgYW1vdW50VHlwZSlcbiAgICAgICAgKSBhcyBUcmFuc2FjdGlvbk9ialN0YWdlcztcbiAgICAgIH1cblxuICAgICAgc2hvdWxkRXF1YWxKU09OKFxuICAgICAgICB0b1RyYW5zYWN0aW9uU3RhZ2VzT2JqKHRyYW5zYWN0aW9uU3RhZ2VzKSxcbiAgICAgICAgYXdhaXQgZ2V0Rml4dHVyZShcbiAgICAgICAgICBjb2luLFxuICAgICAgICAgIGB0cmFuc2FjdGlvbnMtJHtpbnB1dFNjcmlwdHMubWFwKCh0KSA9PiB0b1R4bklucHV0U2NyaXB0VHlwZSh0KSkuam9pbignLScpfWAsXG4gICAgICAgICAgdG9UcmFuc2FjdGlvblN0YWdlc09iaih0cmFuc2FjdGlvblN0YWdlcylcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHRlc3RQc2J0VmFsaWRTaWduYXR1cmVzKHR4OiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLCBzaWduZWRCeTogQklQMzJJbnRlcmZhY2VbXSkge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21IZXgodHgudHhIZXgsIGNvaW4ubmV0d29yayk7XG4gICAgICBjb25zdCB1bnNwZW50cyA9IGdldFVuc3BlbnRzRm9yUHNidCgpO1xuICAgICAgcHNidC5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHVuc3BlbnRzW2luZGV4XTtcbiAgICAgICAgaWYgKCF1dHhvbGliLmJpdGdvLmlzV2FsbGV0VW5zcGVudCh1bnNwZW50KSkge1xuICAgICAgICAgIGFzc2VydC5vayh1dHhvbGliLmJpdGdvLmdldFBzYnRJbnB1dFNjcmlwdFR5cGUoaW5wdXQpLCAncDJzaFAycGsnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHVia2V5cyA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KS5wdWJsaWNLZXlzO1xuICAgICAgICBwdWJrZXlzLmZvckVhY2goKHBrLCBwa0luZGV4KSA9PiB7XG4gICAgICAgICAgcHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGluZGV4LCBwaykuc2hvdWxkLmVxbChzaWduZWRCeS5pbmNsdWRlcyh3YWxsZXRLZXlzLnRyaXBsZVtwa0luZGV4XSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRlc3RWYWxpZFNpZ25hdHVyZXMoXG4gICAgICB0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiB8IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICBzaWduZWRCeTogQklQMzJJbnRlcmZhY2VbXSxcbiAgICAgIHNpZ246ICdoYWxmc2lnbmVkJyB8ICdmdWxsc2lnbmVkJ1xuICAgICkge1xuICAgICAgaWYgKHR4Rm9ybWF0ID09PSAncHNidCcgJiYgc2lnbiA9PT0gJ2hhbGZzaWduZWQnKSB7XG4gICAgICAgIHRlc3RQc2J0VmFsaWRTaWduYXR1cmVzKHR4LCBzaWduZWRCeSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc3BlbnRzID1cbiAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgID8gZ2V0VW5zcGVudHNGb3JQc2J0KCkubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogYml0Z28udG9UTnVtYmVyKHUudmFsdWUsIGFtb3VudFR5cGUpIGFzIFROdW1iZXIgfSkpXG4gICAgICAgICAgOiBnZXRVbnNwZW50cygpO1xuICAgICAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoXG4gICAgICAgICh1KTogdXR4b2xpYi5UeE91dHB1dDxUTnVtYmVyPiA9PiAoe1xuICAgICAgICAgIHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHUuYWRkcmVzcywgY29pbi5uZXR3b3JrKSxcbiAgICAgICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXI8VE51bWJlcj4oXG4gICAgICAgIEJ1ZmZlci5mcm9tKHR4LnR4SGV4LCAnaGV4JyksXG4gICAgICAgIGNvaW4ubmV0d29yayxcbiAgICAgICAgeyBhbW91bnRUeXBlIH1cbiAgICAgICk7XG4gICAgICB0cmFuc2FjdGlvbi5pbnMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbnB1dFNjcmlwdHNbaW5kZXhdID09PSAncDJzaFAycGsnKSB7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGNvaW4uaXNCaXRHb1RhaW50ZWRVbnNwZW50KHVuc3BlbnRzW2luZGV4XSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbmRleF0gYXMgV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcbiAgICAgICAgY29uc3QgcHVia2V5cyA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KS5wdWJsaWNLZXlzO1xuXG4gICAgICAgIHB1YmtleXMuZm9yRWFjaCgocGssIHBrSW5kZXgpID0+IHtcbiAgICAgICAgICB1dHhvbGliLmJpdGdvXG4gICAgICAgICAgICAudmVyaWZ5U2lnbmF0dXJlPFROdW1iZXI+KFxuICAgICAgICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHByZXZPdXRwdXRzW2luZGV4XS52YWx1ZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHB1YmxpY0tleTogcGssXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByZXZPdXRwdXRzXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc2hvdWxkLmVxbChzaWduZWRCeS5pbmNsdWRlcyh3YWxsZXRLZXlzLnRyaXBsZVtwa0luZGV4XSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RFeHBsYWluVHgoXG4gICAgICBzdGFnZU5hbWU6IHN0cmluZyxcbiAgICAgIHR4SGV4OiBzdHJpbmcsXG4gICAgICB1bnNwZW50czogdXR4b2xpYi5iaXRnby5VbnNwZW50PFROdW1iZXI+W10sXG4gICAgICBwdWJzOiBUcmlwbGU8c3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICB1bnNwZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAgcHVicyxcbiAgICAgICAgZGVjb2RlV2l0aCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFByb3BlcnRpZXMgPSBbJ2lkJywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0QW1vdW50J107XG5cbiAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICBleHBlY3RlZFByb3BlcnRpZXMucHVzaCgnZGlzcGxheU9yZGVyJywgJ2lucHV0U2lnbmF0dXJlcycsICdzaWduYXR1cmVzJyk7XG4gICAgICB9XG5cbiAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoLi4uZXhwZWN0ZWRQcm9wZXJ0aWVzKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRTaWduYXR1cmVDb3VudCA9XG4gICAgICAgIHN0YWdlTmFtZSA9PT0gJ3ByZWJ1aWxkJyB8fCBwdWJzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdoYWxmU2lnbmVkJylcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdmdWxsU2lnbmVkJylcbiAgICAgICAgICA/IDJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCdpbnB1dFNpZ25hdHVyZXMnIGluIGV4cGxhbmF0aW9uKSB7XG4gICAgICAgIGV4cGxhbmF0aW9uLmlucHV0U2lnbmF0dXJlcy5zaG91bGQuZXFsKFxuICAgICAgICAgIC8vIEZJWE1FKEJHLTM1MTU0KTogaW1wbGVtZW50IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHJlcGxheSBwcm90ZWN0aW9uIGlucHV0c1xuICAgICAgICAgIGlucHV0U2NyaXB0cy5tYXAoKHR5cGUpID0+ICh0eXBlID09PSAncDJzaFAycGsnID8gMCA6IGV4cGVjdGVkU2lnbmF0dXJlQ291bnQpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCdzaWduYXR1cmVzJyBpbiBleHBsYW5hdGlvbikge1xuICAgICAgICBleHBsYW5hdGlvbi5zaWduYXR1cmVzLnNob3VsZC5lcWwoZXhwZWN0ZWRTaWduYXR1cmVDb3VudCk7XG4gICAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXFsKCcwJyk7IC8vIG5vIGNoYW5nZSBhZGRyZXNzZXMgZ2l2ZW5cbiAgICAgIH1cbiAgICAgIGxldCBleHBlY3RlZE91dHB1dEFtb3VudCA9XG4gICAgICAgIEJpZ0ludCgodHhGb3JtYXQgPT09ICdwc2J0JyA/IGdldFVuc3BlbnRzRm9yUHNidCgpIDogZ2V0VW5zcGVudHMoKSkubGVuZ3RoKSAqIEJpZ0ludCh2YWx1ZSk7XG4gICAgICBpbnB1dFNjcmlwdHMuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICAgIC8vIHJlcGxheVByb3RlY3Rpb24gdW5zcGVudHMgaGF2ZSB2YWx1ZSAxMDAwXG4gICAgICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICBleHBlY3RlZE91dHB1dEFtb3VudCArPSBCaWdJbnQoMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KDEwMDApOyAvLyBmZWUgb2YgMTAwMFxuICAgICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LnNob3VsZC5lcWwoZXhwZWN0ZWRPdXRwdXRBbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaXQoJ2hhdmUgdmFsaWQgc2lnbmF0dXJlIGZvciBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5oYWxmU2lnbmVkVXNlckJhY2t1cCkge1xuICAgICAgICB0ZXN0VmFsaWRTaWduYXR1cmVzKHRyYW5zYWN0aW9uU3RhZ2VzLmhhbGZTaWduZWRVc2VyQmFja3VwLCBbd2FsbGV0S2V5cy51c2VyXSwgJ2hhbGZzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuaGFsZlNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlcl0sICdoYWxmc2lnbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSB2YWxpZCBzaWduYXR1cmVzIGZvciBmdWxsLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghZnVsbFNpZ24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhZ2VzLmZ1bGxTaWduZWRVc2VyQmFja3VwKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCYWNrdXAsIFt3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwXSwgJ2Z1bGxzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5mdWxsU2lnbmVkVXNlckJpdEdvKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iaXRnb10sICdmdWxsc2lnbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yIGV4cGxhaW5UcmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgc3RhZ2VUeF0gb2YgT2JqZWN0LmVudHJpZXModHJhbnNhY3Rpb25TdGFnZXMpKSB7XG4gICAgICAgIGlmICghc3RhZ2VUeCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAgIHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHx8IHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvblxuICAgICAgICAgICAgPyBzdGFnZVR4LnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICA6IHN0YWdlVHgudHhIZXg7XG5cbiAgICAgICAgY29uc3QgcHVicyA9IHdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9XG4gICAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgICAgPyBnZXRVbnNwZW50c0ZvclBzYnQoKS5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBiaXRnby50b1ROdW1iZXIodS52YWx1ZSwgYW1vdW50VHlwZSkgYXMgVE51bWJlciB9KSlcbiAgICAgICAgICAgIDogZ2V0VW5zcGVudHMoKTtcbiAgICAgICAgYXdhaXQgdGVzdEV4cGxhaW5UeChzdGFnZU5hbWUsIHR4SGV4LCB1bnNwZW50cywgcHVicyk7XG4gICAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICAgIGF3YWl0IHRlc3RFeHBsYWluVHgoc3RhZ2VOYW1lLCB0eEhleCwgdW5zcGVudHMsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RGb3JDb2luKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pIHtcbiAgZ2V0U2NyaXB0VHlwZXMyT2YzKCkuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgIChbJ2xlZ2FjeScsICdwc2J0J10gYXMgY29uc3QpLmZvckVhY2goKHR4Rm9ybWF0KSA9PiB7XG4gICAgICBpZiAoIWNvaW4uc3VwcG9ydHNBZGRyZXNzVHlwZSh0eXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiB0eXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICgodHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnIHx8IHR5cGUgPT09ICdwMnRyTXVzaWcyJykgJiYgdHhGb3JtYXQgIT09ICdwc2J0Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJ1bihjb2luLCBbdHlwZSwgdHlwZV0sIHR4Rm9ybWF0KTtcbiAgICAgIGlmIChnZXRSZXBsYXlQcm90ZWN0aW9uQWRkcmVzc2VzKGNvaW4ubmFtZSkubGVuZ3RoKSB7XG4gICAgICAgIHJ1bihjb2luLCBbJ3Ayc2hQMnBrJywgdHlwZV0sIHR4Rm9ybWF0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR4Rm9ybWF0ID09PSAncHNidCcpIHtcbiAgICAgICAgcnVuKGNvaW4sIFt0eXBlLCB0eXBlXSwgdHhGb3JtYXQsIHsgZGVjb2RlV2l0aDogJ3dhc20tdXR4bycgfSk7XG4gICAgICAgIGlmIChnZXRSZXBsYXlQcm90ZWN0aW9uQWRkcmVzc2VzKGNvaW4ubmFtZSkubGVuZ3RoKSB7XG4gICAgICAgICAgcnVuKGNvaW4sIFsncDJzaFAycGsnLCB0eXBlXSwgdHhGb3JtYXQsIHsgZGVjb2RlV2l0aDogJ3dhc20tdXR4bycgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdWl0ZScsIGZ1bmN0aW9uICgpIHtcbiAgdXR4b0NvaW5zLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICBkZXNjcmliZShgJHtjb2luLmdldENoYWluKCl9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgcnVuVGVzdEZvckNvaW4oY29pbik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
309
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQkFBZTtBQUNmLCtDQUFpQztBQUVqQywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLDZCQUE4QjtBQUM5Qiw4Q0FBa0U7QUFDbEUsZ0RBQTBEO0FBQzFELDhDQU15QjtBQUV6QixtQ0FBMEY7QUFJMUYsaUNBZWdCO0FBRWhCLFNBQVMsR0FBRyxDQUNWLElBQXNCLEVBQ3RCLFlBQXdDLEVBQ3hDLFFBQTJCLEVBQzNCLEVBQUUsVUFBVSxLQUFrQyxFQUFFO0lBRWhELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQUc7UUFDWixZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN0QixZQUFZLFFBQVEsRUFBRTtRQUN0QixjQUFjLFVBQVUsRUFBRTtRQUMxQixVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7S0FDN0MsQ0FBQztJQUNGLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtRQUM3QixNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRTdELE1BQU0sNkJBQTZCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLHFCQUFxQixDQUFDLENBQUM7UUFDNUYsTUFBTSxpQ0FBaUMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssVUFBVSxD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LENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBiaXRnbywgdGVzdHV0aWwgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcyB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHtcbiAgY29tbW9uLFxuICBGdWxseVNpZ25lZFRyYW5zYWN0aW9uLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBUcmlwbGUsXG4gIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIGdlbmVyYXRlQWRkcmVzcywgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgU2RrQmFja2VuZCB9IGZyb20gJy4uLy4uL3NyYy90cmFuc2FjdGlvbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFVuc3BlbnQsIFdhbGxldFVuc3BlbnQgfSBmcm9tICcuLi8uLi9zcmMvdW5zcGVudCc7XG5cbmltcG9ydCB7XG4gIHNob3VsZEVxdWFsSlNPTixcbiAgZ2V0Rml4dHVyZSxcbiAgZ2V0VXR4b1dhbGxldCxcbiAgbW9ja1Vuc3BlbnQsXG4gIElucHV0U2NyaXB0VHlwZSxcbiAgVHJhbnNhY3Rpb25PYmosXG4gIHRyYW5zYWN0aW9uVG9PYmosXG4gIHRyYW5zYWN0aW9uSGV4VG9PYmosXG4gIGNyZWF0ZVByZWJ1aWxkVHJhbnNhY3Rpb24sXG4gIGdldERlZmF1bHRXYWxsZXRLZXlzLFxuICBnZXRXYWxsZXRLZXlzLFxuICBkZWZhdWx0Qml0R28sXG4gIGdldE1pblV0eG9Db2lucyxcbiAgZ2V0U2NyaXB0VHlwZXMsXG59IGZyb20gJy4vdXRpbCc7XG5cbmZ1bmN0aW9uIHJ1bjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgaW5wdXRTY3JpcHRzOiB0ZXN0dXRpbC5JbnB1dFNjcmlwdFR5cGVbXSxcbiAgdHhGb3JtYXQ6ICdsZWdhY3knIHwgJ3BzYnQnLFxuICB7IGRlY29kZVdpdGggfTogeyBkZWNvZGVXaXRoPzogU2RrQmFja2VuZCB9ID0ge31cbikge1xuICBjb25zdCBhbW91bnRUeXBlID0gY29pbi5hbW91bnRUeXBlO1xuICBjb25zdCB0aXRsZSA9IFtcbiAgICBpbnB1dFNjcmlwdHMuam9pbignLCcpLFxuICAgIGB0eEZvcm1hdD0ke3R4Rm9ybWF0fWAsXG4gICAgYGFtb3VudFR5cGU9JHthbW91bnRUeXBlfWAsXG4gICAgZGVjb2RlV2l0aCA/IGBkZWNvZGVXaXRoPSR7ZGVjb2RlV2l0aH1gIDogJycsXG4gIF07XG4gIGRlc2NyaWJlKGAke3RpdGxlLmpvaW4oJyAnKX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2RlZmF1bHRCaXRHby5nZXRFbnYoKV0udXJpO1xuXG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQgPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKTtcbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aFJlcGxheVByb3RlY3Rpb24gPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3Ayc2hQMnBrJyk7XG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhQMnRyID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICdwMnRyJyk7XG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhQMnRyTXVzaWcyID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICdwMnRyTXVzaWcyJyk7XG5cbiAgICBjb25zdCB2YWx1ZSA9IChhbW91bnRUeXBlID09PSAnYmlnaW50JyA/IEJpZ0ludCgnMTA5OTk5OTk4MDAwMDAwMDEnKSA6IDFlOCkgYXMgVE51bWJlcjtcbiAgICBjb25zdCB3YWxsZXQgPSBnZXRVdHhvV2FsbGV0KGNvaW4sIHsgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSB9KTtcbiAgICBjb25zdCB3YWxsZXRLZXlzID0gZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcblxuICAgIGNvbnN0IGZ1bGxTaWduID0gIShpc1RyYW5zYWN0aW9uV2l0aFJlcGxheVByb3RlY3Rpb24gfHwgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQpO1xuXG4gICAgZnVuY3Rpb24gZ2V0VW5zcGVudHNGb3JQc2J0KCk6IFVuc3BlbnQ8YmlnaW50PltdIHtcbiAgICAgIHJldHVybiBpbnB1dFNjcmlwdHMubWFwKCh0LCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gdGVzdHV0aWwudG9VbnNwZW50KFxuICAgICAgICAgIHsgc2NyaXB0VHlwZTogdCwgdmFsdWU6IHQgPT09ICdwMnNoUDJwaycgPyBCaWdJbnQoMTAwMCkgOiBCaWdJbnQodmFsdWUpIH0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgY29pbi5uZXR3b3JrLFxuICAgICAgICAgIHdhbGxldEtleXNcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvVHhuSW5wdXRTY3JpcHRUeXBlKHR5cGU6IHRlc3R1dGlsLklucHV0U2NyaXB0VHlwZSk6IElucHV0U2NyaXB0VHlwZSB7XG4gICAgICByZXR1cm4gdHlwZSA9PT0gJ3Ayc2hQMnBrJyA/ICdyZXBsYXlQcm90ZWN0aW9uJyA6IHR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyA/ICdwMnRyTXVzaWcyJyA6IHR5cGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VW5zcGVudHMoKTogVW5zcGVudDxUTnVtYmVyPltdIHtcbiAgICAgIHJldHVybiBpbnB1dFNjcmlwdHMubWFwKCh0eXBlLCBpKSA9PlxuICAgICAgICBtb2NrVW5zcGVudDxUTnVtYmVyPihjb2luLm5ldHdvcmssIHdhbGxldEtleXMsIHRvVHhuSW5wdXRTY3JpcHRUeXBlKHR5cGUpLCBpLCB2YWx1ZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0T3V0cHV0QWRkcmVzcyhyb290V2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVBZGRyZXNzKGNvaW4ubmFtZSwge1xuICAgICAgICBrZXljaGFpbnM6IHJvb3RXYWxsZXRLZXlzLnRyaXBsZS5tYXAoKGspID0+ICh7IHB1Yjogay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSkpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2lnblBhcmFtcyhcbiAgICAgIHByZWJ1aWxkSGV4OiBzdHJpbmcsXG4gICAgICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgY29zaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgZGVjb2RlV2l0aDogU2RrQmFja2VuZCB8IHVuZGVmaW5lZFxuICAgICk6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICAgICAgY29uc3QgdHhJbmZvID0ge1xuICAgICAgICB1bnNwZW50czogdHhGb3JtYXQgPT09ICdwc2J0JyA/IHVuZGVmaW5lZCA6IGdldFVuc3BlbnRzKCksXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHdhbGxldElkOiBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCA/IHdhbGxldC5pZCgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR4SGV4OiBwcmVidWlsZEhleCxcbiAgICAgICAgICB0eEluZm8sXG4gICAgICAgICAgZGVjb2RlV2l0aCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJ2OiBzaWduZXIudG9CYXNlNTgoKSxcbiAgICAgICAgcHViczogd2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSksXG4gICAgICAgIGNvc2lnbmVyUHViOiBjb3NpZ25lci5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICB9IGFzIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKFxuICAgICAgcHJlYnVpbGQ6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgICAgIHNpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBjb3NpZ25lcjogQklQMzJJbnRlcmZhY2VcbiAgICApOiBQcm9taXNlPEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+IHtcbiAgICAgIGxldCBzY29wZTogbm9jay5TY29wZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwcmVidWlsZCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgJiYgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQpIHtcbiAgICAgICAgY29uc3QgcHNidCA9IHByZWJ1aWxkLmNsb25lKCkuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChjb3NpZ25lcik7XG4gICAgICAgIHNjb3BlID0gbm9jayhiZ1VybClcbiAgICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zaWducHNidGAsIChib2R5KSA9PiBib2R5LnBzYnQpXG4gICAgICAgICAgLnJlcGx5KDIwMCwgeyBwc2J0OiBwc2J0LnRvSGV4KCkgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGhhbGYtc2lnbiB3aXRoIHRoZSB1c2VyIGtleVxuICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oXG4gICAgICAgIGdldFNpZ25QYXJhbXMocHJlYnVpbGQudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JyksIHNpZ25lciwgY29zaWduZXIsIGRlY29kZVdpdGgpXG4gICAgICApKSBhcyBQcm9taXNlPEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+O1xuXG4gICAgICBpZiAoc2NvcGUpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjb3BlLmlzRG9uZSgpLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICBoYWxmU2lnbmVkOiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICAgICAgc2lnbmVyOiBCSVAzMkludGVyZmFjZSxcbiAgICAgIGNvc2lnbmVyOiBCSVAzMkludGVyZmFjZVxuICAgICk6IFByb21pc2U8RnVsbHlTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgICAgcmV0dXJuIChhd2FpdCB3YWxsZXQuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgLi4uZ2V0U2lnblBhcmFtcyhoYWxmU2lnbmVkLnR4SGV4LCBzaWduZXIsIGNvc2lnbmVyLCBkZWNvZGVXaXRoKSxcbiAgICAgICAgaXNMYXN0U2lnbmF0dXJlOiB0cnVlLFxuICAgICAgfSkpIGFzIEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgdHlwZSBUcmFuc2FjdGlvblN0YWdlcyA9IHtcbiAgICAgIHByZWJ1aWxkOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQ7XG4gICAgICBoYWxmU2lnbmVkVXNlckJhY2t1cD86IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb247XG4gICAgICBoYWxmU2lnbmVkVXNlckJpdEdvOiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uO1xuICAgICAgZnVsbFNpZ25lZFVzZXJCYWNrdXA/OiBGdWxseVNpZ25lZFRyYW5zYWN0aW9uO1xuICAgICAgZnVsbFNpZ25lZFVzZXJCaXRHbz86IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfTtcblxuICAgIHR5cGUgVHJhbnNhY3Rpb25PYmpTdGFnZXMgPSBSZWNvcmQ8a2V5b2YgVHJhbnNhY3Rpb25TdGFnZXMsIFRyYW5zYWN0aW9uT2JqPjtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVByZWJ1aWxkUHNidCgpIHtcbiAgICAgIGNvbnN0IGlucHV0cyA9IGlucHV0U2NyaXB0cy5tYXAoXG4gICAgICAgICh0KTogdGVzdHV0aWwuSW5wdXQgPT4gKHtcbiAgICAgICAgICBzY3JpcHRUeXBlOiB0LFxuICAgICAgICAgIHZhbHVlOiB0ID09PSAncDJzaFAycGsnID8gQmlnSW50KDEwMDApIDogQmlnSW50KHZhbHVlKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci52YWx1ZSwgQmlnSW50KDApKTtcbiAgICAgIGNvbnN0IG91dHB1dHM6IHRlc3R1dGlsLk91dHB1dFtdID0gW1xuICAgICAgICB7IGFkZHJlc3M6IGdldE91dHB1dEFkZHJlc3MoZ2V0V2FsbGV0S2V5cygndGVzdCcpKSwgdmFsdWU6IHVuc3BlbnRTdW0gLSBCaWdJbnQoMTAwMCkgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBwc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChpbnB1dHMsIG91dHB1dHMsIGNvaW4ubmV0d29yaywgd2FsbGV0S2V5cywgJ3Vuc2lnbmVkJywge1xuICAgICAgICBwMnNoUDJwa0tleTogZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMoY29pbi5uYW1lKVswXSxcbiAgICAgIH0pO1xuICAgICAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCB3YWxsZXRLZXlzKTtcbiAgICAgIHJldHVybiBwc2J0O1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uU3RhZ2VzKCk6IFByb21pc2U8VHJhbnNhY3Rpb25TdGFnZXM+IHtcbiAgICAgIGNvbnN0IHByZWJ1aWxkID1cbiAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgID8gY3JlYXRlUHJlYnVpbGRQc2J0KClcbiAgICAgICAgICA6IGNyZWF0ZVByZWJ1aWxkVHJhbnNhY3Rpb248VE51bWJlcj4oY29pbi5uZXR3b3JrLCBnZXRVbnNwZW50cygpLCBnZXRPdXRwdXRBZGRyZXNzKHdhbGxldEtleXMpKTtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFVzZXJCaXRHbyA9IGF3YWl0IGNyZWF0ZUhhbGZTaWduZWRUcmFuc2FjdGlvbihwcmVidWlsZCwgd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJpdGdvKTtcbiAgICAgIGNvbnN0IGZ1bGxTaWduZWRVc2VyQml0R28gPVxuICAgICAgICBmdWxsU2lnbiAmJiAhaXNUcmFuc2FjdGlvbldpdGhQMnRyTXVzaWcyXG4gICAgICAgICAgPyBhd2FpdCBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oaGFsZlNpZ25lZFVzZXJCaXRHbywgd2FsbGV0S2V5cy5iaXRnbywgd2FsbGV0S2V5cy51c2VyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkVXNlckJhY2t1cCA9XG4gICAgICAgICFpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCAmJiAhKHR4Rm9ybWF0ID09PSAncHNidCcgJiYgaXNUcmFuc2FjdGlvbldpdGhQMnRyKVxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKHByZWJ1aWxkLCB3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFVzZXJCYWNrdXAgPVxuICAgICAgICBmdWxsU2lnbiAmJiBoYWxmU2lnbmVkVXNlckJhY2t1cFxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlRnVsbFNpZ25lZFRyYW5zYWN0aW9uKGhhbGZTaWduZWRVc2VyQmFja3VwLCB3YWxsZXRLZXlzLmJhY2t1cCwgd2FsbGV0S2V5cy51c2VyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmVidWlsZCxcbiAgICAgICAgaGFsZlNpZ25lZFVzZXJCYWNrdXAsXG4gICAgICAgIGhhbGZTaWduZWRVc2VyQml0R28sXG4gICAgICAgIGZ1bGxTaWduZWRVc2VyQmFja3VwLFxuICAgICAgICBmdWxsU2lnbmVkVXNlckJpdEdvLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNhY3Rpb25TdGFnZXM6IFRyYW5zYWN0aW9uU3RhZ2VzO1xuXG4gICAgYmVmb3JlKCdwcmVwYXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb25TdGFnZXMgPSBhd2FpdCBnZXRUcmFuc2FjdGlvblN0YWdlcygpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKG5vY2suY2xlYW5BbGwpO1xuXG4gICAgaXQoJ21hdGNoIGZpeHR1cmVzJywgYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1vY2hhLkNvbnRleHQpIHtcbiAgICAgIGlmICh0eEZvcm1hdCA9PT0gJ3BzYnQnKSB7XG4gICAgICAgIC8vIFRPRE8gKG1heWJlKSAtIG9uY2UgZnVsbCBQU0JUIHN1cHBvcnQgaXMgYWRkZWQgdG8gYWJzdHJhY3QtdXR4byBtb2R1bGUsIGN1c3RvbSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIFBTQlQgY2FuIGJlIGNyZWF0ZWQgYW5kIHRlc3RlZCBoZXJlLlxuICAgICAgICAvLyBzaWduYXR1cmVzIG9mIHRhcHJvb3RLZXlQYXRoU3BlbmRzIGFyZSByYW5kb20gc2luY2UgcmFuZG9tIG5hdHVyZSBvZiBNdVNpZzIgbm9uY2UsIHNvIHBzYnQgaGV4IGNvbXBhcmlzb24gYWxzbyB3b250IHdvcmsuXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0b1RyYW5zYWN0aW9uU3RhZ2VzT2JqKHN0YWdlczogVHJhbnNhY3Rpb25TdGFnZXMpOiBUcmFuc2FjdGlvbk9ialN0YWdlcyB7XG4gICAgICAgIHJldHVybiBfLm1hcFZhbHVlcyhzdGFnZXMsICh2KSA9PlxuICAgICAgICAgIHYgPT09IHVuZGVmaW5lZCB8fCB2IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogdiBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uXG4gICAgICAgICAgICA/IHRyYW5zYWN0aW9uVG9PYmo8VE51bWJlcj4odilcbiAgICAgICAgICAgIDogdHJhbnNhY3Rpb25IZXhUb09iaih2LnR4SGV4LCBjb2luLm5ldHdvcmssIGFtb3VudFR5cGUpXG4gICAgICAgICkgYXMgVHJhbnNhY3Rpb25PYmpTdGFnZXM7XG4gICAgICB9XG5cbiAgICAgIHNob3VsZEVxdWFsSlNPTihcbiAgICAgICAgdG9UcmFuc2FjdGlvblN0YWdlc09iaih0cmFuc2FjdGlvblN0YWdlcyksXG4gICAgICAgIGF3YWl0IGdldEZpeHR1cmUoXG4gICAgICAgICAgY29pbixcbiAgICAgICAgICBgdHJhbnNhY3Rpb25zLSR7aW5wdXRTY3JpcHRzLm1hcCgodCkgPT4gdG9UeG5JbnB1dFNjcmlwdFR5cGUodCkpLmpvaW4oJy0nKX1gLFxuICAgICAgICAgIHRvVHJhbnNhY3Rpb25TdGFnZXNPYmoodHJhbnNhY3Rpb25TdGFnZXMpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHNidFZhbGlkU2lnbmF0dXJlcyh0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiwgc2lnbmVkQnk6IEJJUDMySW50ZXJmYWNlW10pIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4LnR4SGV4LCBjb2luLm5ldHdvcmspO1xuICAgICAgY29uc3QgdW5zcGVudHMgPSBnZXRVbnNwZW50c0ZvclBzYnQoKTtcbiAgICAgIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbmRleF07XG4gICAgICAgIGlmICghdXR4b2xpYi5iaXRnby5pc1dhbGxldFVuc3BlbnQodW5zcGVudCkpIHtcbiAgICAgICAgICBhc3NlcnQub2sodXR4b2xpYi5iaXRnby5nZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KSwgJ3Ayc2hQMnBrJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhbGxldFVuc3BlbnQgPSB1bnNwZW50IGFzIFdhbGxldFVuc3BlbnQ8YmlnaW50PjtcbiAgICAgICAgY29uc3QgcHVia2V5cyA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh3YWxsZXRVbnNwZW50LmNoYWluLCB3YWxsZXRVbnNwZW50LmluZGV4KS5wdWJsaWNLZXlzO1xuICAgICAgICBwdWJrZXlzLmZvckVhY2goKHBrLCBwa0luZGV4KSA9PiB7XG4gICAgICAgICAgcHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGluZGV4LCBwaykuc2hvdWxkLmVxbChzaWduZWRCeS5pbmNsdWRlcyh3YWxsZXRLZXlzLnRyaXBsZVtwa0luZGV4XSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRlc3RWYWxpZFNpZ25hdHVyZXMoXG4gICAgICB0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiB8IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICBzaWduZWRCeTogQklQMzJJbnRlcmZhY2VbXSxcbiAgICAgIHNpZ246ICdoYWxmc2lnbmVkJyB8ICdmdWxsc2lnbmVkJ1xuICAgICkge1xuICAgICAgaWYgKHR4Rm9ybWF0ID09PSAncHNidCcgJiYgc2lnbiA9PT0gJ2hhbGZzaWduZWQnKSB7XG4gICAgICAgIHRlc3RQc2J0VmFsaWRTaWduYXR1cmVzKHR4LCBzaWduZWRCeSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc3BlbnRzID1cbiAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgID8gZ2V0VW5zcGVudHNGb3JQc2J0KCkubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogYml0Z28udG9UTnVtYmVyKHUudmFsdWUsIGFtb3VudFR5cGUpIGFzIFROdW1iZXIgfSkpXG4gICAgICAgICAgOiBnZXRVbnNwZW50cygpO1xuICAgICAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoXG4gICAgICAgICh1KTogdXR4b2xpYi5UeE91dHB1dDxUTnVtYmVyPiA9PiAoe1xuICAgICAgICAgIHNjcmlwdDogQnVmZmVyLmZyb20od2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbih1LmFkZHJlc3MsIGNvaW4ubmFtZSkpLFxuICAgICAgICAgIHZhbHVlOiB1LnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcjxUTnVtYmVyPihcbiAgICAgICAgQnVmZmVyLmZyb20odHgudHhIZXgsICdoZXgnKSxcbiAgICAgICAgY29pbi5uZXR3b3JrLFxuICAgICAgICB7IGFtb3VudFR5cGUgfVxuICAgICAgKTtcbiAgICAgIHRyYW5zYWN0aW9uLmlucy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGlucHV0U2NyaXB0c1tpbmRleF0gPT09ICdwMnNoUDJwaycpIHtcbiAgICAgICAgICBhc3NlcnQub2soY29pbi5pc0JpdEdvVGFpbnRlZFVuc3BlbnQodW5zcGVudHNbaW5kZXhdKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHVuc3BlbnRzW2luZGV4XSBhcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+O1xuICAgICAgICBjb25zdCBwdWJrZXlzID0gd2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KHVuc3BlbnQuY2hhaW4sIHVuc3BlbnQuaW5kZXgpLnB1YmxpY0tleXM7XG5cbiAgICAgICAgcHVia2V5cy5mb3JFYWNoKChwaywgcGtJbmRleCkgPT4ge1xuICAgICAgICAgIHV0eG9saWIuYml0Z29cbiAgICAgICAgICAgIC52ZXJpZnlTaWduYXR1cmU8VE51bWJlcj4oXG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uLFxuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgcHJldk91dHB1dHNbaW5kZXhdLnZhbHVlLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHVibGljS2V5OiBwayxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcHJldk91dHB1dHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zaG91bGQuZXFsKHNpZ25lZEJ5LmluY2x1ZGVzKHdhbGxldEtleXMudHJpcGxlW3BrSW5kZXhdKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gdGVzdEV4cGxhaW5UeChcbiAgICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgICAgdHhIZXg6IHN0cmluZyxcbiAgICAgIHVuc3BlbnRzOiBVbnNwZW50PFROdW1iZXI+W10sXG4gICAgICBwdWJzOiBUcmlwbGU8c3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICB1bnNwZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAgcHVicyxcbiAgICAgICAgZGVjb2RlV2l0aCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFByb3BlcnRpZXMgPSBbJ2lkJywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0QW1vdW50J107XG5cbiAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICBleHBlY3RlZFByb3BlcnRpZXMucHVzaCgnZGlzcGxheU9yZGVyJywgJ2lucHV0U2lnbmF0dXJlcycsICdzaWduYXR1cmVzJyk7XG4gICAgICB9XG5cbiAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoLi4uZXhwZWN0ZWRQcm9wZXJ0aWVzKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRTaWduYXR1cmVDb3VudCA9XG4gICAgICAgIHN0YWdlTmFtZSA9PT0gJ3ByZWJ1aWxkJyB8fCBwdWJzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdoYWxmU2lnbmVkJylcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdmdWxsU2lnbmVkJylcbiAgICAgICAgICA/IDJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCdpbnB1dFNpZ25hdHVyZXMnIGluIGV4cGxhbmF0aW9uKSB7XG4gICAgICAgIGV4cGxhbmF0aW9uLmlucHV0U2lnbmF0dXJlcy5zaG91bGQuZXFsKFxuICAgICAgICAgIC8vIEZJWE1FKEJHLTM1MTU0KTogaW1wbGVtZW50IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHJlcGxheSBwcm90ZWN0aW9uIGlucHV0c1xuICAgICAgICAgIGlucHV0U2NyaXB0cy5tYXAoKHR5cGUpID0+ICh0eXBlID09PSAncDJzaFAycGsnID8gMCA6IGV4cGVjdGVkU2lnbmF0dXJlQ291bnQpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCdzaWduYXR1cmVzJyBpbiBleHBsYW5hdGlvbikge1xuICAgICAgICBleHBsYW5hdGlvbi5zaWduYXR1cmVzLnNob3VsZC5lcWwoZXhwZWN0ZWRTaWduYXR1cmVDb3VudCk7XG4gICAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXFsKCcwJyk7IC8vIG5vIGNoYW5nZSBhZGRyZXNzZXMgZ2l2ZW5cbiAgICAgIH1cbiAgICAgIGxldCBleHBlY3RlZE91dHB1dEFtb3VudCA9XG4gICAgICAgIEJpZ0ludCgodHhGb3JtYXQgPT09ICdwc2J0JyA/IGdldFVuc3BlbnRzRm9yUHNidCgpIDogZ2V0VW5zcGVudHMoKSkubGVuZ3RoKSAqIEJpZ0ludCh2YWx1ZSk7XG4gICAgICBpbnB1dFNjcmlwdHMuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICAgIC8vIHJlcGxheVByb3RlY3Rpb24gdW5zcGVudHMgaGF2ZSB2YWx1ZSAxMDAwXG4gICAgICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICBleHBlY3RlZE91dHB1dEFtb3VudCArPSBCaWdJbnQoMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KDEwMDApOyAvLyBmZWUgb2YgMTAwMFxuICAgICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LnNob3VsZC5lcWwoZXhwZWN0ZWRPdXRwdXRBbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaXQoJ2hhdmUgdmFsaWQgc2lnbmF0dXJlIGZvciBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5oYWxmU2lnbmVkVXNlckJhY2t1cCkge1xuICAgICAgICB0ZXN0VmFsaWRTaWduYXR1cmVzKHRyYW5zYWN0aW9uU3RhZ2VzLmhhbGZTaWduZWRVc2VyQmFja3VwLCBbd2FsbGV0S2V5cy51c2VyXSwgJ2hhbGZzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuaGFsZlNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlcl0sICdoYWxmc2lnbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSB2YWxpZCBzaWduYXR1cmVzIGZvciBmdWxsLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghZnVsbFNpZ24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhZ2VzLmZ1bGxTaWduZWRVc2VyQmFja3VwKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCYWNrdXAsIFt3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwXSwgJ2Z1bGxzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5mdWxsU2lnbmVkVXNlckJpdEdvKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iaXRnb10sICdmdWxsc2lnbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yIGV4cGxhaW5UcmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgc3RhZ2VUeF0gb2YgT2JqZWN0LmVudHJpZXModHJhbnNhY3Rpb25TdGFnZXMpKSB7XG4gICAgICAgIGlmICghc3RhZ2VUeCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAgIHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHx8IHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvblxuICAgICAgICAgICAgPyBzdGFnZVR4LnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICA6IHN0YWdlVHgudHhIZXg7XG5cbiAgICAgICAgY29uc3QgcHVicyA9IHdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9XG4gICAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgICAgPyBnZXRVbnNwZW50c0ZvclBzYnQoKS5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBiaXRnby50b1ROdW1iZXIodS52YWx1ZSwgYW1vdW50VHlwZSkgYXMgVE51bWJlciB9KSlcbiAgICAgICAgICAgIDogZ2V0VW5zcGVudHMoKTtcbiAgICAgICAgYXdhaXQgdGVzdEV4cGxhaW5UeChzdGFnZU5hbWUsIHR4SGV4LCB1bnNwZW50cywgcHVicyk7XG4gICAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICAgIGF3YWl0IHRlc3RFeHBsYWluVHgoc3RhZ2VOYW1lLCB0eEhleCwgdW5zcGVudHMsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RGb3JDb2luKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pIHtcbiAgKFsnbGVnYWN5JywgJ3BzYnQnXSBhcyBjb25zdCkuZm9yRWFjaCgodHhGb3JtYXQpID0+IHtcbiAgICBydW4oY29pbiwgZ2V0U2NyaXB0VHlwZXMoY29pbiwgdHhGb3JtYXQpLCB0eEZvcm1hdCwgeyBkZWNvZGVXaXRoOiAnd2FzbS11dHhvJyB9KTtcbiAgfSk7XG59XG5cbmRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdWl0ZScsIGZ1bmN0aW9uICgpIHtcbiAgZ2V0TWluVXR4b0NvaW5zKCkuZm9yRWFjaCgoY29pbikgPT4ge1xuICAgIGRlc2NyaWJlKGAke2NvaW4uZ2V0Q2hhaW4oKX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBydW5UZXN0Rm9yQ29pbihjb2luKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txFormat.d.ts","sourceRoot":"","sources":["../../../../test/unit/txFormat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"txFormat.d.ts","sourceRoot":"","sources":["../../../../test/unit/txFormat.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAA2B,QAAQ,EAAE,MAAM,WAAW,CAAC;AAKhF,KAAK,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAC/E,KAAK,aAAa,GAAG,oBAAoB,CAAC;AAC1C,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC,CASzF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAS5F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAEpH"}
|