@bitgo-beta/sdk-core 8.2.1-beta.174 → 8.2.1-beta.1740
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/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +41 -29
- package/dist/src/account-lib/baseCoin/enum.d.ts +39 -5
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +68 -10
- package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/errors.js +8 -2
- package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
- package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/iface.js +26 -18
- package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
- package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/index.js +8 -5
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
- package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
- package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
- package/dist/src/account-lib/index.js +23 -9
- package/dist/src/account-lib/mpc/index.d.ts +1 -1
- package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/index.js +6 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
- package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
- package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/index.js +23 -9
- package/dist/src/account-lib/mpc/util.d.ts +7 -1
- package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/util.js +24 -1
- package/dist/src/account-lib/staking/index.js +6 -2
- package/dist/src/account-lib/staking/utils.js +3 -3
- package/dist/src/account-lib/util/crypto.d.ts +8 -2
- package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
- package/dist/src/account-lib/util/crypto.js +69 -38
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
- package/dist/src/api/bip32path.js +2 -3
- package/dist/src/api/index.js +6 -2
- package/dist/src/api/types.d.ts +20 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +1 -1
- package/dist/src/bitgo/address-book/address-book.d.ts +61 -0
- package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/address-book.js +139 -0
- package/dist/src/bitgo/address-book/index.d.ts +3 -0
- package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/index.js +19 -0
- package/dist/src/bitgo/address-book/types.d.ts +170 -0
- package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
- package/dist/src/bitgo/address-book/types.js +3 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +97 -11
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +152 -16
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +181 -28
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
- package/dist/src/bitgo/baseCoin/index.js +6 -2
- package/dist/src/bitgo/bip32util.d.ts +3 -16
- package/dist/src/bitgo/bip32util.d.ts.map +1 -1
- package/dist/src/bitgo/bip32util.js +4 -56
- package/dist/src/bitgo/bitcoin.d.ts +0 -1
- package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoin.js +26 -13
- package/dist/src/bitgo/bitgoBase.d.ts +7 -1
- package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
- package/dist/src/bitgo/bitgoBase.js +1 -1
- package/dist/src/bitgo/coinFactory.d.ts +17 -3
- package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
- package/dist/src/bitgo/coinFactory.js +26 -3
- package/dist/src/bitgo/config.d.ts +3 -95
- package/dist/src/bitgo/config.d.ts.map +1 -1
- package/dist/src/bitgo/config.js +26 -15
- package/dist/src/bitgo/ecdh.d.ts +0 -1
- package/dist/src/bitgo/ecdh.d.ts.map +1 -1
- package/dist/src/bitgo/ecdh.js +26 -13
- package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -13
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +39 -34
- package/dist/src/bitgo/enterprise/enterprises.js +27 -13
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -6
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/enterprise/index.js +6 -2
- package/dist/src/bitgo/environments.d.ts +68 -5
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +389 -40
- package/dist/src/bitgo/errors.d.ts +175 -0
- package/dist/src/bitgo/errors.d.ts.map +1 -1
- package/dist/src/bitgo/errors.js +166 -2
- package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
- package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
- package/dist/src/bitgo/evm/evmUtils.js +50 -0
- package/dist/src/bitgo/index.d.ts +3 -1
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +29 -11
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
- package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
- package/dist/src/bitgo/internal/index.js +6 -2
- package/dist/src/bitgo/internal/internal.js +5 -6
- package/dist/src/bitgo/internal/keycard.js +6 -7
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts +24 -0
- package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
- package/dist/src/bitgo/keychain/decryptKeychain.js +67 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts +84 -8
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +2 -2
- package/dist/src/bitgo/keychain/index.d.ts +1 -0
- package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/index.js +7 -2
- package/dist/src/bitgo/keychain/keychains.d.ts +29 -4
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +181 -43
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
- package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
- package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
- package/dist/src/bitgo/legacyBitcoin.js +27 -13
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
- package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
- package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
- package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
- package/dist/src/bitgo/market/index.js +6 -2
- package/dist/src/bitgo/market/markets.js +23 -9
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
- package/dist/src/bitgo/pendingApproval/index.js +6 -2
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +228 -110
- package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
- package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
- package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
- package/dist/src/bitgo/proofs/index.d.ts +2 -0
- package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/index.js +6 -0
- package/dist/src/bitgo/proofs/types.d.ts +80 -0
- package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
- package/dist/src/bitgo/proofs/types.js +80 -0
- package/dist/src/bitgo/recovery/index.js +6 -2
- package/dist/src/bitgo/recovery/initiate.d.ts +8 -1
- package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
- package/dist/src/bitgo/recovery/initiate.js +14 -8
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +132 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
- package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
- package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +173 -7
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
- package/dist/src/bitgo/staking/index.d.ts +3 -0
- package/dist/src/bitgo/staking/index.d.ts.map +1 -1
- package/dist/src/bitgo/staking/index.js +9 -2
- package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +140 -7
- package/dist/src/bitgo/trading/iTradingAccount.d.ts +14 -33
- package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
- package/dist/src/bitgo/trading/index.d.ts +1 -15
- package/dist/src/bitgo/trading/index.d.ts.map +1 -1
- package/dist/src/bitgo/trading/index.js +7 -17
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
- package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/decrypt.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
- package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/encrypt.js +58 -0
- package/dist/src/bitgo/trading/network/index.d.ts +5 -0
- package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/index.js +21 -0
- package/dist/src/bitgo/trading/network/network.d.ts +36 -0
- package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/network.js +99 -0
- package/dist/src/bitgo/trading/network/types.d.ts +277 -0
- package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/types.js +3 -0
- package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
- package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
- package/dist/src/bitgo/trading/network/utils.js +54 -0
- package/dist/src/bitgo/trading/tradingAccount.d.ts +22 -33
- package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
- package/dist/src/bitgo/trading/tradingAccount.js +56 -97
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
- package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
- package/dist/src/bitgo/tss/common.d.ts +39 -6
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +112 -17
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
- package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
- package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
- package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +35 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +100 -0
- package/dist/src/bitgo/tss/eddsa/index.js +23 -9
- package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
- package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.d.ts +3 -2
- package/dist/src/bitgo/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/tss/index.js +26 -10
- package/dist/src/bitgo/tss/types.d.ts +3 -3
- package/dist/src/bitgo/tss/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/types.js +2 -2
- package/dist/src/bitgo/types.d.ts +3 -3
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
- package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
- package/dist/src/bitgo/utils/codecProps.js +24 -11
- package/dist/src/bitgo/utils/codecs.d.ts +11 -0
- package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
- package/dist/src/bitgo/utils/codecs.js +59 -0
- package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
- package/dist/src/bitgo/utils/decode.js +30 -16
- package/dist/src/bitgo/utils/index.d.ts +4 -2
- package/dist/src/bitgo/utils/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/index.js +27 -11
- package/dist/src/bitgo/utils/messageTypes.d.ts +38 -0
- package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/src/bitgo/utils/messageTypes.js +15 -0
- package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -3
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +82 -14
- package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/src/bitgo/utils/notEmpty.js +7 -0
- package/dist/src/bitgo/utils/opengpgUtils.d.ts +12 -9
- package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/opengpgUtils.js +77 -64
- package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
- package/dist/src/bitgo/utils/postWithCodec.js +4 -38
- package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
- package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/promise-utils.js +2 -3
- package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
- package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/transactionUtils.js +29 -0
- package/dist/src/bitgo/utils/triple.d.ts +1 -1
- package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
- package/dist/src/bitgo/utils/triple.js +2 -3
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts +37 -0
- package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/addressVerification.js +75 -0
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +56 -16
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +213 -45
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +299 -43
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +44 -22
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +19 -50
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +134 -238
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +212 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1034 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
- package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +26 -10
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +195 -103
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +51 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +338 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +13 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +3 -0
- package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/index.js +28 -8
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +7 -7
- package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
- package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/index.js +24 -9
- package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
- package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/src/bitgo/utils/txRequest.js +47 -0
- package/dist/src/bitgo/utils/util.js +24 -10
- package/dist/src/bitgo/utils/wallet.d.ts +7 -0
- package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
- package/dist/src/bitgo/utils/wallet.js +48 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts +47 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +55 -11
- package/dist/src/bitgo/wallet/iWallet.d.ts +443 -21
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +150 -19
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +63 -3
- package/dist/src/bitgo/wallet/index.js +6 -2
- package/dist/src/bitgo/wallet/wallet.d.ts +336 -23
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +1678 -347
- package/dist/src/bitgo/wallet/wallets.d.ts +100 -9
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +1038 -203
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
- package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/index.js +19 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
- package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
- package/dist/src/bitgo/webhook/index.js +6 -2
- package/dist/src/bitgo/webhook/webhooks.js +23 -9
- package/dist/src/coins/fiat.d.ts +45 -0
- package/dist/src/coins/fiat.d.ts.map +1 -0
- package/dist/src/coins/fiat.js +94 -0
- package/dist/src/coins/index.d.ts +1 -6
- package/dist/src/coins/index.d.ts.map +1 -1
- package/dist/src/coins/index.js +7 -8
- package/dist/src/coins/ofc.d.ts +3 -2
- package/dist/src/coins/ofc.d.ts.map +1 -1
- package/dist/src/coins/ofc.js +6 -2
- package/dist/src/coins/ofcToken.d.ts +2 -1
- package/dist/src/coins/ofcToken.d.ts.map +1 -1
- package/dist/src/coins/ofcToken.js +27 -2
- package/dist/src/coins/susd.d.ts +3 -2
- package/dist/src/coins/susd.d.ts.map +1 -1
- package/dist/src/coins/susd.js +5 -1
- package/dist/src/common.js +27 -13
- package/dist/src/index.d.ts +6 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +32 -11
- package/dist/src/lightning.d.ts +2 -0
- package/dist/src/lightning.d.ts.map +1 -0
- package/dist/src/lightning.js +13 -0
- package/dist/src/units.js +5 -6
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
- package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
- package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
- package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
- package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
- package/dist/test/unit/account-lib/mpc/util.js +53 -0
- package/dist/test/unit/bitgo/environment.d.ts +2 -0
- package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
- package/dist/test/unit/bitgo/environment.js +38 -0
- package/dist/test/unit/bitgo/errors.d.ts +2 -0
- package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
- package/dist/test/unit/bitgo/errors.js +262 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
- package/dist/test/unit/bitgo/trading/tradingAccount.js +183 -0
- package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
- package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/addressVerification.js +85 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +465 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +239 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
- package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
- package/dist/test/unit/bitgo/utils/txRequest.js +105 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/BuildParams.js +68 -0
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +23 -9
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +62 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/resourceManagement.js +326 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/tokenApproval.js +135 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +276 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
- package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +200 -0
- package/dist/test/unit/lightning.d.ts +2 -0
- package/dist/test/unit/lightning.d.ts.map +1 -0
- package/dist/test/unit/lightning.js +23 -0
- package/dist/test/unit/units.d.ts.map +1 -1
- package/dist/test/unit/units.js +64 -64
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -21
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -1367
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
- package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
- package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
- package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/iLightning.js +0 -106
- package/dist/src/bitgo/lightning/index.d.ts +0 -5
- package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/index.js +0 -17
- package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
- package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightning.js +0 -111
- package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
- package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
- package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
- package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
- package/dist/src/bitgo/trading/affirmation.d.ts +0 -35
- package/dist/src/bitgo/trading/affirmation.d.ts.map +0 -1
- package/dist/src/bitgo/trading/affirmation.js +0 -53
- package/dist/src/bitgo/trading/affirmations.d.ts +0 -23
- package/dist/src/bitgo/trading/affirmations.d.ts.map +0 -1
- package/dist/src/bitgo/trading/affirmations.js +0 -45
- package/dist/src/bitgo/trading/iAffirmation.d.ts +0 -15
- package/dist/src/bitgo/trading/iAffirmation.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iAffirmation.js +0 -13
- package/dist/src/bitgo/trading/iAffirmations.d.ts +0 -10
- package/dist/src/bitgo/trading/iAffirmations.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iAffirmations.js +0 -3
- package/dist/src/bitgo/trading/iSettlement.d.ts +0 -25
- package/dist/src/bitgo/trading/iSettlement.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iSettlement.js +0 -17
- package/dist/src/bitgo/trading/iSettlements.d.ts +0 -19
- package/dist/src/bitgo/trading/iSettlements.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iSettlements.js +0 -3
- package/dist/src/bitgo/trading/iTradingPartner.d.ts +0 -14
- package/dist/src/bitgo/trading/iTradingPartner.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iTradingPartner.js +0 -17
- package/dist/src/bitgo/trading/iTradingPartners.d.ts +0 -15
- package/dist/src/bitgo/trading/iTradingPartners.d.ts.map +0 -1
- package/dist/src/bitgo/trading/iTradingPartners.js +0 -9
- package/dist/src/bitgo/trading/lock.d.ts +0 -16
- package/dist/src/bitgo/trading/lock.d.ts.map +0 -1
- package/dist/src/bitgo/trading/lock.js +0 -12
- package/dist/src/bitgo/trading/payload.d.ts +0 -22
- package/dist/src/bitgo/trading/payload.d.ts.map +0 -1
- package/dist/src/bitgo/trading/payload.js +0 -3
- package/dist/src/bitgo/trading/settlement.d.ts +0 -16
- package/dist/src/bitgo/trading/settlement.d.ts.map +0 -1
- package/dist/src/bitgo/trading/settlement.js +0 -21
- package/dist/src/bitgo/trading/settlements.d.ts +0 -32
- package/dist/src/bitgo/trading/settlements.d.ts.map +0 -1
- package/dist/src/bitgo/trading/settlements.js +0 -61
- package/dist/src/bitgo/trading/trade.d.ts +0 -29
- package/dist/src/bitgo/trading/trade.d.ts.map +0 -1
- package/dist/src/bitgo/trading/trade.js +0 -11
- package/dist/src/bitgo/trading/tradingPartner.d.ts +0 -26
- package/dist/src/bitgo/trading/tradingPartner.d.ts.map +0 -1
- package/dist/src/bitgo/trading/tradingPartner.js +0 -31
- package/dist/src/bitgo/trading/tradingPartners.d.ts +0 -24
- package/dist/src/bitgo/trading/tradingPartners.d.ts.map +0 -1
- package/dist/src/bitgo/trading/tradingPartners.js +0 -32
- package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
- package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/blsUtils.js +0 -237
- package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
- package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
- package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
- package/dist/src/coins/fiateur.d.ts +0 -31
- package/dist/src/coins/fiateur.d.ts.map +0 -1
- package/dist/src/coins/fiateur.js +0 -57
- package/dist/src/coins/fiatgbp.d.ts +0 -31
- package/dist/src/coins/fiatgbp.d.ts.map +0 -1
- package/dist/src/coins/fiatgbp.js +0 -57
- package/dist/src/coins/fiatusd.d.ts +0 -31
- package/dist/src/coins/fiatusd.d.ts.map +0 -1
- package/dist/src/coins/fiatusd.js +0 -57
- package/dist/src/coins/tfiateur.d.ts +0 -11
- package/dist/src/coins/tfiateur.d.ts.map +0 -1
- package/dist/src/coins/tfiateur.js +0 -17
- package/dist/src/coins/tfiatgbp.d.ts +0 -11
- package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
- package/dist/src/coins/tfiatgbp.js +0 -17
- package/dist/src/coins/tfiatusd.d.ts +0 -11
- package/dist/src/coins/tfiatusd.d.ts.map +0 -1
- package/dist/src/coins/tfiatusd.js +0 -17
- package/dist/src/openssl/index.d.ts +0 -5
- package/dist/src/openssl/index.d.ts.map +0 -1
- package/dist/src/openssl/index.js +0 -9
- package/dist/test/unit/openssl.d.ts +0 -2
- package/dist/test/unit/openssl.d.ts.map +0 -1
- package/dist/test/unit/openssl.js +0 -39
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -11,18 +15,29 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
11
15
|
}) : function(o, v) {
|
|
12
16
|
o["default"] = v;
|
|
13
17
|
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
21
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
37
|
};
|
|
24
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
39
|
exports.Wallets = void 0;
|
|
40
|
+
exports.isWalletWithKeychains = isWalletWithKeychains;
|
|
26
41
|
/**
|
|
27
42
|
* @prettier
|
|
28
43
|
*/
|
|
@@ -30,11 +45,21 @@ const assert_1 = __importDefault(require("assert"));
|
|
|
30
45
|
const bignumber_js_1 = require("bignumber.js");
|
|
31
46
|
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
32
47
|
const _ = __importStar(require("lodash"));
|
|
48
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
33
49
|
const api_1 = require("../../api");
|
|
34
50
|
const common = __importStar(require("../../common"));
|
|
35
51
|
const ecdh_1 = require("../ecdh");
|
|
52
|
+
const keychain_1 = require("../keychain");
|
|
36
53
|
const utils_1 = require("../utils");
|
|
54
|
+
const iWallets_1 = require("./iWallets");
|
|
37
55
|
const wallet_1 = require("./wallet");
|
|
56
|
+
const evmUtils_1 = require("../evm/evmUtils");
|
|
57
|
+
/**
|
|
58
|
+
* Check if a wallet is a WalletWithKeychains
|
|
59
|
+
*/
|
|
60
|
+
function isWalletWithKeychains(wallet) {
|
|
61
|
+
return wallet.responseType === 'WalletWithKeychains';
|
|
62
|
+
}
|
|
38
63
|
class Wallets {
|
|
39
64
|
constructor(bitgo, baseCoin) {
|
|
40
65
|
this.bitgo = bitgo;
|
|
@@ -53,35 +78,10 @@ class Wallets {
|
|
|
53
78
|
* @returns {*}
|
|
54
79
|
*/
|
|
55
80
|
async list(params = {}) {
|
|
56
|
-
const queryObject = {};
|
|
57
81
|
if (params.skip && params.prevId) {
|
|
58
82
|
throw new Error('cannot specify both skip and prevId');
|
|
59
83
|
}
|
|
60
|
-
|
|
61
|
-
if (!_.isBoolean(params.getbalances)) {
|
|
62
|
-
throw new Error('invalid getbalances argument, expecting boolean');
|
|
63
|
-
}
|
|
64
|
-
queryObject.getbalances = params.getbalances;
|
|
65
|
-
}
|
|
66
|
-
if (params.prevId) {
|
|
67
|
-
if (!_.isString(params.prevId)) {
|
|
68
|
-
throw new Error('invalid prevId argument, expecting string');
|
|
69
|
-
}
|
|
70
|
-
queryObject.prevId = params.prevId;
|
|
71
|
-
}
|
|
72
|
-
if (params.limit) {
|
|
73
|
-
if (!_.isNumber(params.limit)) {
|
|
74
|
-
throw new Error('invalid limit argument, expecting number');
|
|
75
|
-
}
|
|
76
|
-
queryObject.limit = params.limit;
|
|
77
|
-
}
|
|
78
|
-
if (params.allTokens) {
|
|
79
|
-
if (!_.isBoolean(params.allTokens)) {
|
|
80
|
-
throw new Error('invalid allTokens argument, expecting boolean');
|
|
81
|
-
}
|
|
82
|
-
queryObject.allTokens = params.allTokens;
|
|
83
|
-
}
|
|
84
|
-
const body = (await this.bitgo.get(this.baseCoin.url('/wallet')).query(queryObject).result());
|
|
84
|
+
const body = (await this.bitgo.get(this.baseCoin.url('/wallet')).query(params).result());
|
|
85
85
|
body.wallets = body.wallets.map((w) => new wallet_1.Wallet(this.bitgo, this.baseCoin, w));
|
|
86
86
|
return body;
|
|
87
87
|
}
|
|
@@ -101,8 +101,9 @@ class Wallets {
|
|
|
101
101
|
if (typeof params.label !== 'string') {
|
|
102
102
|
throw new Error('missing required string parameter label');
|
|
103
103
|
}
|
|
104
|
-
|
|
105
|
-
if (params.type !== 'custodial') {
|
|
104
|
+
(0, evmUtils_1.validateEvmKeyRingWalletParams)(params, this.baseCoin);
|
|
105
|
+
if (!params.evmKeyRingReferenceWalletId && params.type !== 'custodial') {
|
|
106
|
+
// no need to pass keys for (single) custodial wallets
|
|
106
107
|
if (Array.isArray(params.keys) === false || !_.isNumber(params.m) || !_.isNumber(params.n)) {
|
|
107
108
|
throw new Error('invalid argument');
|
|
108
109
|
}
|
|
@@ -114,8 +115,19 @@ class Wallets {
|
|
|
114
115
|
if (params.gasPrice && !_.isNumber(params.gasPrice)) {
|
|
115
116
|
throw new Error('invalid argument for gasPrice - number expected');
|
|
116
117
|
}
|
|
117
|
-
if (params.walletVersion
|
|
118
|
-
|
|
118
|
+
if (params.walletVersion) {
|
|
119
|
+
if (!_.isNumber(params.walletVersion)) {
|
|
120
|
+
throw new Error('invalid argument for walletVersion - number expected');
|
|
121
|
+
}
|
|
122
|
+
if (params.multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa' && params.walletVersion === 3) {
|
|
123
|
+
const tssSettings = await this.bitgo
|
|
124
|
+
.get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
|
|
125
|
+
.result();
|
|
126
|
+
const multisigTypeVersion = tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.multiSigTypeVersion;
|
|
127
|
+
if (multisigTypeVersion === 'MPCv2') {
|
|
128
|
+
params.walletVersion = 5;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
119
131
|
}
|
|
120
132
|
if (params.tags && Array.isArray(params.tags) === false) {
|
|
121
133
|
throw new Error('invalid argument for tags - array expected');
|
|
@@ -132,11 +144,104 @@ class Wallets {
|
|
|
132
144
|
if (params.address && (!_.isString(params.address) || !this.baseCoin.isValidAddress(params.address))) {
|
|
133
145
|
throw new Error('invalid argument for address - valid address string expected');
|
|
134
146
|
}
|
|
135
|
-
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet')).send(params).result();
|
|
147
|
+
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(params).result();
|
|
136
148
|
return {
|
|
137
149
|
wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
|
|
138
150
|
};
|
|
139
151
|
}
|
|
152
|
+
async generateLightningWallet(params) {
|
|
153
|
+
const reqId = new utils_1.RequestTracer();
|
|
154
|
+
this.bitgo.setRequestTracer(reqId);
|
|
155
|
+
const { label, passphrase, enterprise, passcodeEncryptionCode, subType, lightningProvider, encryptionVersion } = params;
|
|
156
|
+
// TODO BTC-1899: only userAuth key is required for custodial lightning wallet. all 3 keys are required for self custodial lightning.
|
|
157
|
+
// to avoid changing the platform for custodial flow, let us all 3 keys both wallet types.
|
|
158
|
+
const keychainPromises = [undefined, 'userAuth', 'nodeAuth'].map((purpose) => {
|
|
159
|
+
return async () => {
|
|
160
|
+
const keychain = this.baseCoin.keychains().create();
|
|
161
|
+
const keychainParams = {
|
|
162
|
+
pub: keychain.pub,
|
|
163
|
+
encryptedPrv: await this.bitgo.encryptAsync({
|
|
164
|
+
password: passphrase,
|
|
165
|
+
input: keychain.prv,
|
|
166
|
+
encryptionVersion,
|
|
167
|
+
}),
|
|
168
|
+
originalPasscodeEncryptionCode: purpose === undefined ? passcodeEncryptionCode : undefined,
|
|
169
|
+
coinSpecific: purpose === undefined ? undefined : { [this.baseCoin.getChain()]: { purpose } },
|
|
170
|
+
keyType: 'independent',
|
|
171
|
+
source: 'user',
|
|
172
|
+
};
|
|
173
|
+
return await this.baseCoin.keychains().add(keychainParams);
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
const { userKeychain, userAuthKeychain, nodeAuthKeychain } = await (0, utils_1.promiseProps)({
|
|
177
|
+
userKeychain: keychainPromises[0](),
|
|
178
|
+
userAuthKeychain: keychainPromises[1](),
|
|
179
|
+
nodeAuthKeychain: keychainPromises[2](),
|
|
180
|
+
});
|
|
181
|
+
const walletParams = {
|
|
182
|
+
label,
|
|
183
|
+
m: 1,
|
|
184
|
+
n: 1,
|
|
185
|
+
type: 'hot',
|
|
186
|
+
subType,
|
|
187
|
+
enterprise,
|
|
188
|
+
keys: [userKeychain.id],
|
|
189
|
+
coinSpecific: { [this.baseCoin.getChain()]: { keys: [userAuthKeychain.id, nodeAuthKeychain.id] } },
|
|
190
|
+
lightningProvider,
|
|
191
|
+
};
|
|
192
|
+
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(walletParams).result();
|
|
193
|
+
const wallet = new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet);
|
|
194
|
+
return {
|
|
195
|
+
wallet,
|
|
196
|
+
userKeychain,
|
|
197
|
+
userAuthKeychain,
|
|
198
|
+
nodeAuthKeychain,
|
|
199
|
+
responseType: 'LightningWalletWithKeychains',
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Generate a Go Account wallet
|
|
204
|
+
* @param params GenerateGoAccountWalletOptions
|
|
205
|
+
* @returns Promise<GoAccountWalletWithUserKeychain>
|
|
206
|
+
*/
|
|
207
|
+
async generateGoAccountWallet(params) {
|
|
208
|
+
const reqId = new utils_1.RequestTracer();
|
|
209
|
+
this.bitgo.setRequestTracer(reqId);
|
|
210
|
+
const { label, passphrase, enterprise, passcodeEncryptionCode, encryptionVersion } = params;
|
|
211
|
+
const keychain = this.baseCoin.keychains().create();
|
|
212
|
+
const keychainParams = {
|
|
213
|
+
pub: keychain.pub,
|
|
214
|
+
encryptedPrv: await this.bitgo.encryptAsync({
|
|
215
|
+
password: passphrase,
|
|
216
|
+
input: keychain.prv,
|
|
217
|
+
encryptionVersion,
|
|
218
|
+
}),
|
|
219
|
+
originalPasscodeEncryptionCode: passcodeEncryptionCode,
|
|
220
|
+
keyType: 'independent',
|
|
221
|
+
source: 'user',
|
|
222
|
+
};
|
|
223
|
+
const userKeychain = await this.baseCoin.keychains().add(keychainParams);
|
|
224
|
+
const walletParams = {
|
|
225
|
+
label,
|
|
226
|
+
m: 1,
|
|
227
|
+
n: 1,
|
|
228
|
+
type: 'trading',
|
|
229
|
+
enterprise,
|
|
230
|
+
keys: [userKeychain.id],
|
|
231
|
+
};
|
|
232
|
+
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(walletParams).result();
|
|
233
|
+
const wallet = new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet);
|
|
234
|
+
const result = {
|
|
235
|
+
wallet,
|
|
236
|
+
userKeychain,
|
|
237
|
+
responseType: 'GoAccountWalletWithUserKeychain',
|
|
238
|
+
};
|
|
239
|
+
// Add warning if the user keychain has an encrypted private key
|
|
240
|
+
if (!_.isUndefined(userKeychain.encryptedPrv)) {
|
|
241
|
+
result.warning = 'Be sure to backup the user keychain -- it is not stored anywhere else!';
|
|
242
|
+
}
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
140
245
|
/**
|
|
141
246
|
* Generate a new wallet
|
|
142
247
|
* 1. Creates the user keychain locally on the client, and encrypts it with the provided passphrase
|
|
@@ -145,16 +250,16 @@ class Wallets {
|
|
|
145
250
|
* 4. Creates the BitGo key on the service
|
|
146
251
|
* 5. Creates the wallet on BitGo with the 3 public keys above
|
|
147
252
|
* @param params
|
|
148
|
-
* @param params.label
|
|
149
|
-
* @param params.passphrase
|
|
253
|
+
* @param params.label Label for the wallet
|
|
254
|
+
* @param params.passphrase Passphrase to be used to encrypt the user and backup keychains
|
|
150
255
|
* @param params.userKey User xpub
|
|
151
256
|
* @param params.backupXpub Backup xpub
|
|
152
257
|
* @param params.backupXpubProvider
|
|
153
|
-
* @param params.
|
|
154
|
-
* @param params.enterprise
|
|
258
|
+
* @param params.enterprise the enterpriseId
|
|
155
259
|
* @param params.disableTransactionNotifications
|
|
156
|
-
* @param params.passcodeEncryptionCode
|
|
157
|
-
*
|
|
260
|
+
* @param params.passcodeEncryptionCode optional this is a recovery code that can be used to decrypt the original passphrase in a recovery case.
|
|
261
|
+
* The user must generate and keep the encrypted original passphrase safe while this code is stored on BitGo
|
|
262
|
+
* @param params.coldDerivationSeed optional seed for SMC wallets
|
|
158
263
|
* @param params.gasPrice
|
|
159
264
|
* @param params.disableKRSEmail
|
|
160
265
|
* @param params.walletVersion
|
|
@@ -162,83 +267,139 @@ class Wallets {
|
|
|
162
267
|
* @param params.isDistributedCustody optional parameter for creating bitgo key. This is only necessary if you want to create
|
|
163
268
|
* a distributed custody wallet. If provided, you must have the enterprise license and pass in
|
|
164
269
|
* `params.enterprise` into `generateWallet` as well.
|
|
270
|
+
* @param params.type optional wallet type, 'hot' or 'cold' or 'custodial'; if absent, we will defer to 'hot'
|
|
271
|
+
* @param params.bitgoKeyId optional bitgo key id for SMC TSS wallets
|
|
272
|
+
* @param params.commonKeychain optional common keychain for SMC TSS wallets
|
|
273
|
+
*
|
|
165
274
|
* @returns {*}
|
|
166
275
|
*/
|
|
167
276
|
async generateWallet(params = {}) {
|
|
277
|
+
// Assign the default multiSig type value based on the coin
|
|
278
|
+
if (!params.multisigType) {
|
|
279
|
+
params.multisigType = this.baseCoin.getDefaultMultisigType();
|
|
280
|
+
}
|
|
281
|
+
if (this.baseCoin.getFamily() === 'lnbtc') {
|
|
282
|
+
const options = (0, utils_1.decodeOrElse)(iWallets_1.GenerateLightningWalletOptionsCodec.name, iWallets_1.GenerateLightningWalletOptionsCodec, params, (errors) => {
|
|
283
|
+
throw new Error(`error(s) parsing generate lightning wallet request params: ${errors}`);
|
|
284
|
+
});
|
|
285
|
+
const walletData = await this.generateLightningWallet(options);
|
|
286
|
+
walletData.encryptedWalletPassphrase = await this.bitgo.encryptAsync({
|
|
287
|
+
input: options.passphrase,
|
|
288
|
+
password: options.passcodeEncryptionCode,
|
|
289
|
+
encryptionVersion: options.encryptionVersion,
|
|
290
|
+
});
|
|
291
|
+
return walletData;
|
|
292
|
+
}
|
|
293
|
+
// Go Account wallet generation
|
|
294
|
+
if (this.baseCoin.getFamily() === 'ofc' && params.type === 'trading') {
|
|
295
|
+
const options = (0, utils_1.decodeOrElse)(iWallets_1.GenerateGoAccountWalletOptionsCodec.name, iWallets_1.GenerateGoAccountWalletOptionsCodec, params, (errors) => {
|
|
296
|
+
throw new Error(`error(s) parsing generate go account request params: ${errors}`);
|
|
297
|
+
});
|
|
298
|
+
const walletData = await this.generateGoAccountWallet(options);
|
|
299
|
+
walletData.encryptedWalletPassphrase = await this.bitgo.encryptAsync({
|
|
300
|
+
input: options.passphrase,
|
|
301
|
+
password: options.passcodeEncryptionCode,
|
|
302
|
+
encryptionVersion: options.encryptionVersion,
|
|
303
|
+
});
|
|
304
|
+
return walletData;
|
|
305
|
+
}
|
|
168
306
|
common.validateParams(params, ['label'], ['passphrase', 'userKey', 'backupXpub']);
|
|
169
307
|
if (typeof params.label !== 'string') {
|
|
170
308
|
throw new Error('missing required string parameter label');
|
|
171
309
|
}
|
|
310
|
+
const { type = 'hot', label, passphrase, enterprise, isDistributedCustody, evmKeyRingReferenceWalletId } = params;
|
|
172
311
|
const isTss = params.multisigType === 'tss' && this.baseCoin.supportsTss();
|
|
173
|
-
const label = params.label;
|
|
174
|
-
const passphrase = params.passphrase;
|
|
175
312
|
const canEncrypt = !!passphrase && typeof passphrase === 'string';
|
|
176
|
-
|
|
313
|
+
if ((0, evmUtils_1.validateEvmKeyRingWalletParams)(params, this.baseCoin)) {
|
|
314
|
+
return await (0, evmUtils_1.createEvmKeyRingWallet)({
|
|
315
|
+
label,
|
|
316
|
+
evmKeyRingReferenceWalletId: evmKeyRingReferenceWalletId,
|
|
317
|
+
bitgo: this.bitgo,
|
|
318
|
+
baseCoin: this.baseCoin,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
177
321
|
const walletParams = {
|
|
178
322
|
label: label,
|
|
179
323
|
m: 2,
|
|
180
324
|
n: 3,
|
|
181
325
|
keys: [],
|
|
182
|
-
|
|
326
|
+
type: !!params.userKey && params.multisigType !== 'onchain' ? 'cold' : type,
|
|
183
327
|
};
|
|
184
328
|
if (!_.isUndefined(params.passcodeEncryptionCode)) {
|
|
185
329
|
if (!_.isString(params.passcodeEncryptionCode)) {
|
|
186
330
|
throw new Error('passcodeEncryptionCode must be a string');
|
|
187
331
|
}
|
|
188
332
|
}
|
|
189
|
-
if (!_.isUndefined(
|
|
190
|
-
if (!_.isString(
|
|
333
|
+
if (!_.isUndefined(enterprise)) {
|
|
334
|
+
if (!_.isString(enterprise)) {
|
|
191
335
|
throw new Error('invalid enterprise argument, expecting string');
|
|
192
336
|
}
|
|
193
|
-
walletParams.enterprise =
|
|
337
|
+
walletParams.enterprise = enterprise;
|
|
194
338
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
// EVM TSS wallets must use wallet version 3
|
|
202
|
-
if ((isTss && this.baseCoin.isEVM()) !== (params.walletVersion === 3)) {
|
|
203
|
-
throw new Error('EVM TSS wallets are only supported for wallet version 3');
|
|
339
|
+
// EVM TSS wallets must use wallet version 3, 5 and 6
|
|
340
|
+
if (isTss &&
|
|
341
|
+
this.baseCoin.isEVM() &&
|
|
342
|
+
!evmKeyRingReferenceWalletId &&
|
|
343
|
+
!(params.walletVersion === 3 || params.walletVersion === 5 || params.walletVersion === 6)) {
|
|
344
|
+
throw new Error('EVM TSS wallets are only supported for wallet version 3, 5 and 6');
|
|
204
345
|
}
|
|
205
346
|
if (isTss) {
|
|
206
|
-
if (isCold) {
|
|
207
|
-
throw new Error('TSS cold wallets are not supported at this time');
|
|
208
|
-
}
|
|
209
347
|
if (!this.baseCoin.supportsTss()) {
|
|
210
348
|
throw new Error(`coin ${this.baseCoin.getFamily()} does not support TSS at this time`);
|
|
211
349
|
}
|
|
212
|
-
|
|
350
|
+
if ((params.walletVersion === 5 || params.walletVersion === 6) &&
|
|
351
|
+
!this.baseCoin.getConfig().features.includes(statics_1.CoinFeature.MPCV2)) {
|
|
352
|
+
throw new Error(`coin ${this.baseCoin.getFamily()} does not support TSS MPCv2 at this time`);
|
|
353
|
+
}
|
|
354
|
+
(0, assert_1.default)(enterprise, 'enterprise is required for TSS wallet');
|
|
355
|
+
if (type === 'cold') {
|
|
356
|
+
// validate
|
|
357
|
+
(0, assert_1.default)(params.bitgoKeyId, 'bitgoKeyId is required for SMC TSS wallet');
|
|
358
|
+
(0, assert_1.default)(params.commonKeychain, 'commonKeychain is required for SMC TSS wallet');
|
|
359
|
+
return this.generateSMCMpcWallet({
|
|
360
|
+
multisigType: 'tss',
|
|
361
|
+
label,
|
|
362
|
+
enterprise,
|
|
363
|
+
walletVersion: params.walletVersion,
|
|
364
|
+
bitgoKeyId: params.bitgoKeyId,
|
|
365
|
+
commonKeychain: params.commonKeychain,
|
|
366
|
+
coldDerivationSeed: params.coldDerivationSeed,
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
if (type === 'custodial') {
|
|
370
|
+
return this.generateCustodialMpcWallet({
|
|
371
|
+
multisigType: 'tss',
|
|
372
|
+
label,
|
|
373
|
+
enterprise,
|
|
374
|
+
walletVersion: params.walletVersion,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
(0, assert_1.default)(passphrase, 'cannot generate TSS keys without passphrase');
|
|
378
|
+
const walletData = await this.generateMpcWallet({
|
|
213
379
|
multisigType: 'tss',
|
|
214
380
|
label,
|
|
215
381
|
passphrase,
|
|
216
382
|
originalPasscodeEncryptionCode: params.passcodeEncryptionCode,
|
|
217
|
-
enterprise
|
|
383
|
+
enterprise,
|
|
218
384
|
walletVersion: params.walletVersion,
|
|
219
|
-
|
|
385
|
+
encryptionVersion: params.encryptionVersion,
|
|
220
386
|
});
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
if (isCold) {
|
|
228
|
-
throw new Error('BLS-DKG cold wallets are not supported at this time');
|
|
229
|
-
}
|
|
230
|
-
if (!this.baseCoin.supportsBlsDkg()) {
|
|
231
|
-
throw new Error(`coin ${this.baseCoin.getFamily()} does not support BLS-DKG at this time`);
|
|
387
|
+
if (params.passcodeEncryptionCode) {
|
|
388
|
+
walletData.encryptedWalletPassphrase = await this.bitgo.encryptAsync({
|
|
389
|
+
input: passphrase,
|
|
390
|
+
password: params.passcodeEncryptionCode,
|
|
391
|
+
encryptionVersion: params.encryptionVersion,
|
|
392
|
+
});
|
|
232
393
|
}
|
|
233
|
-
return
|
|
394
|
+
return walletData;
|
|
234
395
|
}
|
|
235
396
|
// Handle distributed custody
|
|
236
|
-
if (
|
|
237
|
-
if (!
|
|
397
|
+
if (isDistributedCustody) {
|
|
398
|
+
if (!enterprise) {
|
|
238
399
|
throw new Error('must provide enterprise when creating distributed custody wallet');
|
|
239
400
|
}
|
|
240
|
-
if (!
|
|
241
|
-
throw new Error('distributed custody wallets must be cold');
|
|
401
|
+
if (!type || type !== 'cold') {
|
|
402
|
+
throw new Error('distributed custody wallets must be type: cold');
|
|
242
403
|
}
|
|
243
404
|
}
|
|
244
405
|
const hasBackupXpub = !!params.backupXpub;
|
|
@@ -300,112 +461,165 @@ class Wallets {
|
|
|
300
461
|
}
|
|
301
462
|
let derivationPath = undefined;
|
|
302
463
|
const reqId = new utils_1.RequestTracer();
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
464
|
+
if (params.type === 'custodial' && (params.multisigType ?? 'onchain') === 'onchain') {
|
|
465
|
+
// for custodial multisig, when the wallet is created on the platfor side, the keys are not needed
|
|
466
|
+
walletParams.n = undefined;
|
|
467
|
+
walletParams.m = undefined;
|
|
468
|
+
walletParams.keys = undefined;
|
|
469
|
+
walletParams.keySignatures = undefined;
|
|
470
|
+
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(walletParams).result(); // returns the ids
|
|
471
|
+
const userKeychain = this.baseCoin.keychains().get({ id: newWallet.keys[keychain_1.KeyIndices.USER], reqId });
|
|
472
|
+
const backupKeychain = this.baseCoin.keychains().get({ id: newWallet.keys[keychain_1.KeyIndices.BACKUP], reqId });
|
|
473
|
+
const bitgoKeychain = this.baseCoin.keychains().get({ id: newWallet.keys[keychain_1.KeyIndices.BITGO], reqId });
|
|
474
|
+
const [userKey, bitgoKey, backupKey] = await Promise.all([userKeychain, bitgoKeychain, backupKeychain]);
|
|
475
|
+
const result = {
|
|
476
|
+
wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
|
|
477
|
+
userKeychain: userKey,
|
|
478
|
+
backupKeychain: bitgoKey,
|
|
479
|
+
bitgoKeychain: backupKey,
|
|
480
|
+
responseType: 'WalletWithKeychains',
|
|
481
|
+
};
|
|
482
|
+
return result;
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
const userKeychainPromise = async () => {
|
|
486
|
+
let userKeychainParams;
|
|
487
|
+
let userKeychain;
|
|
488
|
+
// User provided user key
|
|
489
|
+
if (params.userKey) {
|
|
490
|
+
userKeychain = { pub: params.userKey };
|
|
491
|
+
userKeychainParams = userKeychain;
|
|
492
|
+
if (params.coldDerivationSeed) {
|
|
493
|
+
// the derivation only makes sense when a key already exists
|
|
494
|
+
const derivation = this.baseCoin.deriveKeyWithSeed({
|
|
495
|
+
key: params.userKey,
|
|
496
|
+
seed: params.coldDerivationSeed,
|
|
497
|
+
});
|
|
498
|
+
derivationPath = derivation.derivationPath;
|
|
499
|
+
userKeychain.pub = derivation.key;
|
|
500
|
+
userKeychain.derivedFromParentWithSeed = params.coldDerivationSeed;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
if (!canEncrypt) {
|
|
505
|
+
throw new Error('cannot generate user keypair without passphrase');
|
|
506
|
+
}
|
|
507
|
+
// Create the user key.
|
|
508
|
+
userKeychain = this.baseCoin.keychains().create();
|
|
509
|
+
userKeychain.encryptedPrv = await this.bitgo.encryptAsync({
|
|
510
|
+
password: passphrase,
|
|
511
|
+
input: userKeychain.prv,
|
|
512
|
+
encryptionVersion: params.encryptionVersion,
|
|
316
513
|
});
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
514
|
+
userKeychainParams = {
|
|
515
|
+
pub: userKeychain.pub,
|
|
516
|
+
encryptedPrv: userKeychain.encryptedPrv,
|
|
517
|
+
originalPasscodeEncryptionCode: params.passcodeEncryptionCode,
|
|
518
|
+
};
|
|
519
|
+
// If WebAuthn info is provided, store an additional copy of the private key encrypted
|
|
520
|
+
// with the PRF-derived passphrase so the authenticator can later decrypt it.
|
|
521
|
+
if (params.webauthnInfo && userKeychain.prv) {
|
|
522
|
+
userKeychainParams.webauthnDevices = [
|
|
523
|
+
{
|
|
524
|
+
otpDeviceId: params.webauthnInfo.otpDeviceId,
|
|
525
|
+
prfSalt: params.webauthnInfo.prfSalt,
|
|
526
|
+
encryptedPrv: await this.bitgo.encryptAsync({
|
|
527
|
+
password: params.webauthnInfo.passphrase,
|
|
528
|
+
input: userKeychain.prv,
|
|
529
|
+
encryptionVersion: params.encryptionVersion,
|
|
530
|
+
}),
|
|
531
|
+
},
|
|
532
|
+
];
|
|
533
|
+
}
|
|
320
534
|
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
535
|
+
userKeychainParams.reqId = reqId;
|
|
536
|
+
const newUserKeychain = await this.baseCoin.keychains().add(userKeychainParams);
|
|
537
|
+
return _.extend({}, newUserKeychain, userKeychain);
|
|
538
|
+
};
|
|
539
|
+
const backupKeychainPromise = async () => {
|
|
540
|
+
if (params.backupXpubProvider) {
|
|
541
|
+
// If requested, use a KRS or backup key provider
|
|
542
|
+
return this.baseCoin.keychains().createBackup({
|
|
543
|
+
provider: params.backupXpubProvider || 'defaultRMGBackupProvider',
|
|
544
|
+
disableKRSEmail: params.disableKRSEmail,
|
|
545
|
+
krsSpecific: params.krsSpecific,
|
|
546
|
+
type: this.baseCoin.getChain(),
|
|
547
|
+
passphrase: params.passphrase,
|
|
548
|
+
encryptionVersion: params.encryptionVersion,
|
|
549
|
+
reqId,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
// User provided backup xpub
|
|
553
|
+
if (params.backupXpub) {
|
|
554
|
+
// user provided backup ethereum address
|
|
555
|
+
return this.baseCoin.keychains().add({
|
|
556
|
+
pub: params.backupXpub,
|
|
557
|
+
source: 'backup',
|
|
558
|
+
reqId,
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
if (!canEncrypt) {
|
|
563
|
+
throw new Error('cannot generate backup keypair without passphrase');
|
|
564
|
+
}
|
|
565
|
+
// No provided backup xpub or address, so default to creating one here
|
|
566
|
+
return this.baseCoin.keychains().createBackup({
|
|
567
|
+
reqId,
|
|
568
|
+
passphrase: params.passphrase,
|
|
569
|
+
encryptionVersion: params.encryptionVersion,
|
|
570
|
+
});
|
|
325
571
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
userKeychain
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
572
|
+
};
|
|
573
|
+
const { userKeychain, backupKeychain, bitgoKeychain } = await (0, utils_1.promiseProps)({
|
|
574
|
+
userKeychain: userKeychainPromise(),
|
|
575
|
+
backupKeychain: backupKeychainPromise(),
|
|
576
|
+
bitgoKeychain: this.baseCoin
|
|
577
|
+
.keychains()
|
|
578
|
+
.createBitGo({ enterprise: params.enterprise, reqId, isDistributedCustody: params.isDistributedCustody }),
|
|
579
|
+
});
|
|
580
|
+
walletParams.keys = [userKeychain.id, backupKeychain.id, bitgoKeychain.id];
|
|
581
|
+
const { prv } = userKeychain;
|
|
582
|
+
if (_.isString(prv)) {
|
|
583
|
+
(0, assert_1.default)(backupKeychain.pub);
|
|
584
|
+
(0, assert_1.default)(bitgoKeychain.pub);
|
|
585
|
+
walletParams.keySignatures = {
|
|
586
|
+
backup: (await this.baseCoin.signMessage({ prv }, backupKeychain.pub)).toString('hex'),
|
|
587
|
+
bitgo: (await this.baseCoin.signMessage({ prv }, bitgoKeychain.pub)).toString('hex'),
|
|
333
588
|
};
|
|
334
589
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
provider: params.backupXpubProvider || 'defaultRMGBackupProvider',
|
|
344
|
-
disableKRSEmail: params.disableKRSEmail,
|
|
345
|
-
krsSpecific: params.krsSpecific,
|
|
346
|
-
type: this.baseCoin.getChain(),
|
|
347
|
-
reqId,
|
|
348
|
-
});
|
|
590
|
+
const keychains = {
|
|
591
|
+
userKeychain,
|
|
592
|
+
backupKeychain,
|
|
593
|
+
bitgoKeychain,
|
|
594
|
+
};
|
|
595
|
+
const finalWalletParams = await this.baseCoin.supplementGenerateWallet(walletParams, keychains);
|
|
596
|
+
if (_.includes(['xrp', 'xlm', 'cspr'], this.baseCoin.getFamily()) && !_.isUndefined(params.rootPrivateKey)) {
|
|
597
|
+
walletParams.rootPrivateKey = params.rootPrivateKey;
|
|
349
598
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
599
|
+
this.bitgo.setRequestTracer(reqId);
|
|
600
|
+
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(finalWalletParams).result();
|
|
601
|
+
const result = {
|
|
602
|
+
wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
|
|
603
|
+
userKeychain: userKeychain,
|
|
604
|
+
backupKeychain: backupKeychain,
|
|
605
|
+
bitgoKeychain: bitgoKeychain,
|
|
606
|
+
responseType: 'WalletWithKeychains',
|
|
607
|
+
};
|
|
608
|
+
if (!_.isUndefined(backupKeychain.prv)) {
|
|
609
|
+
result.warning = 'Be sure to backup the backup keychain -- it is not stored anywhere else!';
|
|
358
610
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
throw new Error('cannot generate backup keypair without passphrase');
|
|
362
|
-
}
|
|
363
|
-
// No provided backup xpub or address, so default to creating one here
|
|
364
|
-
return this.baseCoin.keychains().createBackup({ reqId });
|
|
611
|
+
if (!_.isUndefined(derivationPath)) {
|
|
612
|
+
userKeychain.derivationPath = derivationPath;
|
|
365
613
|
}
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
walletParams.keys = [userKeychain.id, backupKeychain.id, bitgoKeychain.id];
|
|
375
|
-
walletParams.isCold = isCold;
|
|
376
|
-
const { prv } = userKeychain;
|
|
377
|
-
if (_.isString(prv)) {
|
|
378
|
-
assert_1.default(backupKeychain.pub);
|
|
379
|
-
assert_1.default(bitgoKeychain.pub);
|
|
380
|
-
walletParams.keySignatures = {
|
|
381
|
-
backup: (await this.baseCoin.signMessage({ prv }, backupKeychain.pub)).toString('hex'),
|
|
382
|
-
bitgo: (await this.baseCoin.signMessage({ prv }, bitgoKeychain.pub)).toString('hex'),
|
|
383
|
-
};
|
|
384
|
-
}
|
|
385
|
-
if (_.includes(['xrp', 'xlm', 'cspr'], this.baseCoin.getFamily()) && !_.isUndefined(params.rootPrivateKey)) {
|
|
386
|
-
walletParams.rootPrivateKey = params.rootPrivateKey;
|
|
387
|
-
}
|
|
388
|
-
const keychains = {
|
|
389
|
-
userKeychain,
|
|
390
|
-
backupKeychain,
|
|
391
|
-
bitgoKeychain,
|
|
392
|
-
};
|
|
393
|
-
const finalWalletParams = await this.baseCoin.supplementGenerateWallet(walletParams, keychains);
|
|
394
|
-
this.bitgo.setRequestTracer(reqId);
|
|
395
|
-
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet')).send(finalWalletParams).result();
|
|
396
|
-
const result = {
|
|
397
|
-
wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
|
|
398
|
-
userKeychain: userKeychain,
|
|
399
|
-
backupKeychain: backupKeychain,
|
|
400
|
-
bitgoKeychain: bitgoKeychain,
|
|
401
|
-
};
|
|
402
|
-
if (!_.isUndefined(backupKeychain.prv)) {
|
|
403
|
-
result.warning = 'Be sure to backup the backup keychain -- it is not stored anywhere else!';
|
|
404
|
-
}
|
|
405
|
-
if (!_.isUndefined(derivationPath)) {
|
|
406
|
-
userKeychain.derivationPath = derivationPath;
|
|
614
|
+
if (canEncrypt && params.passcodeEncryptionCode) {
|
|
615
|
+
result.encryptedWalletPassphrase = await this.bitgo.encryptAsync({
|
|
616
|
+
input: passphrase,
|
|
617
|
+
password: params.passcodeEncryptionCode,
|
|
618
|
+
encryptionVersion: params.encryptionVersion,
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
return result;
|
|
407
622
|
}
|
|
408
|
-
return result;
|
|
409
623
|
}
|
|
410
624
|
/**
|
|
411
625
|
* List the user's wallet shares
|
|
@@ -414,6 +628,13 @@ class Wallets {
|
|
|
414
628
|
async listShares(params = {}) {
|
|
415
629
|
return await this.bitgo.get(this.baseCoin.url('/walletshare')).result();
|
|
416
630
|
}
|
|
631
|
+
/**
|
|
632
|
+
* List the user's wallet shares v2
|
|
633
|
+
* @returns {Promise<WalletShares>}
|
|
634
|
+
*/
|
|
635
|
+
async listSharesV2() {
|
|
636
|
+
return await this.bitgo.get(this.bitgo.url('/walletshares', 2)).result();
|
|
637
|
+
}
|
|
417
638
|
/**
|
|
418
639
|
* Gets a wallet share information, including the encrypted sharing keychain. requires unlock if keychain is present.
|
|
419
640
|
* @param params
|
|
@@ -436,6 +657,73 @@ class Wallets {
|
|
|
436
657
|
.send(params)
|
|
437
658
|
.result();
|
|
438
659
|
}
|
|
660
|
+
/**
|
|
661
|
+
* Bulk accept wallet shares
|
|
662
|
+
* @param params AcceptShareOptionsRequest[]
|
|
663
|
+
* @returns {Promise<BulkAcceptShareResponse>}
|
|
664
|
+
*/
|
|
665
|
+
async bulkAcceptShareRequest(params) {
|
|
666
|
+
return await this.bulkAcceptShareRequestWithRetry(params);
|
|
667
|
+
}
|
|
668
|
+
async bulkAcceptShareRequestWithRetry(params) {
|
|
669
|
+
// Server has a limit of approximately 1MB for payload size
|
|
670
|
+
let MAX_PAYLOAD_SIZE = 950000; // ~950KB to leave some buffer
|
|
671
|
+
// Function to calculate the size of a payload
|
|
672
|
+
const calculatePayloadSize = (items) => {
|
|
673
|
+
return Buffer.byteLength(JSON.stringify({ keysForWalletShares: items }), 'utf8');
|
|
674
|
+
};
|
|
675
|
+
const results = [];
|
|
676
|
+
const remainingParams = [...params];
|
|
677
|
+
while (remainingParams.length > 0) {
|
|
678
|
+
// Build optimal batch by adding items until we reach size limit
|
|
679
|
+
const batch = [];
|
|
680
|
+
// Start with empty batch
|
|
681
|
+
// Add items one by one while monitoring payload size
|
|
682
|
+
while (remainingParams.length > 0) {
|
|
683
|
+
// Test adding the next item
|
|
684
|
+
const testBatch = [...batch, remainingParams[0]];
|
|
685
|
+
const testSize = calculatePayloadSize(testBatch);
|
|
686
|
+
// If adding this item would exceed the size limit, stop adding
|
|
687
|
+
if (testSize > MAX_PAYLOAD_SIZE && batch.length > 0) {
|
|
688
|
+
break;
|
|
689
|
+
}
|
|
690
|
+
// Otherwise, add the item to the batch
|
|
691
|
+
batch.push(remainingParams.shift());
|
|
692
|
+
}
|
|
693
|
+
// Handle case where even a single item is too large
|
|
694
|
+
if (batch.length === 0 && remainingParams.length > 0) {
|
|
695
|
+
// Send just the first item even if it's oversized
|
|
696
|
+
batch.push(remainingParams.shift());
|
|
697
|
+
}
|
|
698
|
+
const payloadObj = { keysForWalletShares: batch };
|
|
699
|
+
try {
|
|
700
|
+
const result = await this.bitgo.put(this.bitgo.url('/walletshares/accept', 2)).send(payloadObj).result();
|
|
701
|
+
if (result.acceptedWalletShares && Array.isArray(result.acceptedWalletShares)) {
|
|
702
|
+
results.push(...result.acceptedWalletShares);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
catch (error) {
|
|
706
|
+
if (error.status === 413 && batch.length > 1) {
|
|
707
|
+
// If we still get 413 with multiple items, put them back and try with half the batch size
|
|
708
|
+
remainingParams.unshift(...batch);
|
|
709
|
+
MAX_PAYLOAD_SIZE = Math.floor(MAX_PAYLOAD_SIZE / 2); // Reduce size limit for next attempt
|
|
710
|
+
continue;
|
|
711
|
+
}
|
|
712
|
+
throw error;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
return {
|
|
716
|
+
acceptedWalletShares: results,
|
|
717
|
+
};
|
|
718
|
+
}
|
|
719
|
+
async bulkUpdateWalletShareRequest(params) {
|
|
720
|
+
return await this.bitgo
|
|
721
|
+
.put(this.bitgo.url('/walletshares/update', 2))
|
|
722
|
+
.send({
|
|
723
|
+
shares: params,
|
|
724
|
+
})
|
|
725
|
+
.result();
|
|
726
|
+
}
|
|
439
727
|
/**
|
|
440
728
|
* Resend a wallet share invitation email
|
|
441
729
|
* @param params
|
|
@@ -458,6 +746,39 @@ class Wallets {
|
|
|
458
746
|
.send()
|
|
459
747
|
.result();
|
|
460
748
|
}
|
|
749
|
+
/**
|
|
750
|
+
* Re-share wallet with existing spenders of the wallet
|
|
751
|
+
* @param walletId
|
|
752
|
+
* @param userPassword
|
|
753
|
+
*/
|
|
754
|
+
async reshareWalletWithSpenders(walletId, userPassword) {
|
|
755
|
+
const wallet = await this.get({ id: walletId });
|
|
756
|
+
if (!wallet?._wallet?.enterprise) {
|
|
757
|
+
throw new Error('Enterprise not found for the wallet');
|
|
758
|
+
}
|
|
759
|
+
const enterpriseUsersResponse = await this.bitgo
|
|
760
|
+
.get(this.bitgo.url(`/enterprise/${wallet?._wallet?.enterprise}/user`))
|
|
761
|
+
.result();
|
|
762
|
+
// create a map of users for easy lookup - we need the user email id to share the wallet
|
|
763
|
+
const usersMap = new Map([...enterpriseUsersResponse?.adminUsers, ...enterpriseUsersResponse?.nonAdminUsers].map((obj) => [obj.id, obj]));
|
|
764
|
+
if (wallet._wallet.users) {
|
|
765
|
+
for (const user of wallet._wallet.users) {
|
|
766
|
+
const userObject = usersMap.get(user.user);
|
|
767
|
+
if (user.permissions.includes('spend') && !user.permissions.includes('admin') && userObject) {
|
|
768
|
+
const shareParams = {
|
|
769
|
+
walletId: walletId,
|
|
770
|
+
user: user.user,
|
|
771
|
+
permissions: user.permissions.join(','),
|
|
772
|
+
walletPassphrase: userPassword,
|
|
773
|
+
email: userObject.email.email,
|
|
774
|
+
reshare: true,
|
|
775
|
+
skipKeychain: false,
|
|
776
|
+
};
|
|
777
|
+
await wallet.shareWallet(shareParams);
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
461
782
|
/**
|
|
462
783
|
* Accepts a wallet share, adding the wallet to the user's list
|
|
463
784
|
* Needs a user's password to decrypt the shared key
|
|
@@ -473,7 +794,68 @@ class Wallets {
|
|
|
473
794
|
async acceptShare(params = {}) {
|
|
474
795
|
common.validateParams(params, ['walletShareId'], ['overrideEncryptedPrv', 'userPassword', 'newWalletPassphrase']);
|
|
475
796
|
let encryptedPrv = params.overrideEncryptedPrv;
|
|
476
|
-
const walletShare =
|
|
797
|
+
const walletShare = await this.getShare({ walletShareId: params.walletShareId });
|
|
798
|
+
// Multi-user-key case: requires user to provide their own public key in addition to the encrypted private key
|
|
799
|
+
if (walletShare.userMultiKeyRotationRequired) {
|
|
800
|
+
if (_.isUndefined(params.userPassword)) {
|
|
801
|
+
throw new Error('userPassword param must be provided to generate user keychain');
|
|
802
|
+
}
|
|
803
|
+
const walletKeychain = this.baseCoin.keychains().create();
|
|
804
|
+
const encryptedPrv = this.bitgo.encrypt({
|
|
805
|
+
password: params.newWalletPassphrase || params.userPassword,
|
|
806
|
+
input: walletKeychain.prv,
|
|
807
|
+
});
|
|
808
|
+
const updateParams = {
|
|
809
|
+
walletShareId: params.walletShareId,
|
|
810
|
+
state: 'accepted',
|
|
811
|
+
encryptedPrv: encryptedPrv,
|
|
812
|
+
pub: walletKeychain.pub,
|
|
813
|
+
};
|
|
814
|
+
// Note: Unlike keychainOverrideRequired, we do NOT reshare the wallet with spenders
|
|
815
|
+
// This is a key difference - multi-key-user-key wallets don't require reshare
|
|
816
|
+
return this.updateShare(updateParams);
|
|
817
|
+
}
|
|
818
|
+
// Keychain override case: requires user keychain creation and signing
|
|
819
|
+
if (walletShare.keychainOverrideRequired &&
|
|
820
|
+
walletShare.permissions.indexOf('admin') !== -1 &&
|
|
821
|
+
walletShare.permissions.indexOf('spend') !== -1) {
|
|
822
|
+
if (_.isUndefined(params.userPassword)) {
|
|
823
|
+
throw new Error('userPassword param must be provided to decrypt shared key');
|
|
824
|
+
}
|
|
825
|
+
const walletKeychain = await this.baseCoin.keychains().createUserKeychain(params.userPassword);
|
|
826
|
+
if (_.isUndefined(walletKeychain.encryptedPrv)) {
|
|
827
|
+
throw new Error('encryptedPrv was not found on wallet keychain');
|
|
828
|
+
}
|
|
829
|
+
const payload = {
|
|
830
|
+
tradingAccountId: walletShare.wallet,
|
|
831
|
+
pubkey: walletKeychain.pub,
|
|
832
|
+
timestamp: new Date().toISOString(),
|
|
833
|
+
};
|
|
834
|
+
const payloadString = JSON.stringify(payload);
|
|
835
|
+
const privateKey = this.bitgo.decrypt({
|
|
836
|
+
password: params.userPassword,
|
|
837
|
+
input: walletKeychain.encryptedPrv,
|
|
838
|
+
});
|
|
839
|
+
const signature = await this.baseCoin.signMessage({ prv: privateKey }, payloadString);
|
|
840
|
+
const response = await this.updateShare({
|
|
841
|
+
walletShareId: params.walletShareId,
|
|
842
|
+
state: 'accepted',
|
|
843
|
+
keyId: walletKeychain.id,
|
|
844
|
+
signature: signature.toString('hex'),
|
|
845
|
+
payload: payloadString,
|
|
846
|
+
});
|
|
847
|
+
// If the wallet share was accepted successfully (changed=true), reshare the wallet with the spenders
|
|
848
|
+
if (response.changed && response.state === 'accepted') {
|
|
849
|
+
try {
|
|
850
|
+
await this.reshareWalletWithSpenders(walletShare.wallet, params.userPassword);
|
|
851
|
+
}
|
|
852
|
+
catch (e) {
|
|
853
|
+
// TODO: PX-3826
|
|
854
|
+
// Do nothing
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
return response;
|
|
858
|
+
}
|
|
477
859
|
// Return right away if there is no keychain to decrypt, or if explicit encryptedPrv was provided
|
|
478
860
|
if (!walletShare.keychain || !walletShare.keychain.encryptedPrv || encryptedPrv) {
|
|
479
861
|
return this.updateShare({
|
|
@@ -494,9 +876,9 @@ class Wallets {
|
|
|
494
876
|
password: params.userPassword,
|
|
495
877
|
input: sharingKeychain.encryptedXprv,
|
|
496
878
|
});
|
|
497
|
-
const secret = ecdh_1.getSharedSecret(
|
|
879
|
+
const secret = (0, ecdh_1.getSharedSecret)(
|
|
498
880
|
// Derive key by path (which is used between these 2 users only)
|
|
499
|
-
utxo_lib_1.bip32.fromBase58(sharingKeychain.prv).derivePath(api_1.sanitizeLegacyPath(walletShare.keychain.path)), Buffer.from(walletShare.keychain.fromPubKey, 'hex')).toString('hex');
|
|
881
|
+
utxo_lib_1.bip32.fromBase58(sharingKeychain.prv).derivePath((0, api_1.sanitizeLegacyPath)(walletShare.keychain.path)), Buffer.from(walletShare.keychain.fromPubKey, 'hex')).toString('hex');
|
|
500
882
|
// Yes! We got the secret successfully here, now decrypt the shared wallet prv
|
|
501
883
|
const decryptedSharedWalletPrv = this.bitgo.decrypt({
|
|
502
884
|
password: secret,
|
|
@@ -517,6 +899,336 @@ class Wallets {
|
|
|
517
899
|
}
|
|
518
900
|
return this.updateShare(updateParams);
|
|
519
901
|
}
|
|
902
|
+
/**
|
|
903
|
+
* Bulk Accept wallet shares, adding the wallets to the user's list
|
|
904
|
+
* Needs a user's password to decrypt the shared key
|
|
905
|
+
*
|
|
906
|
+
* @param params BulkAcceptShareOptions
|
|
907
|
+
* @param params.walletShareId - array of the wallet shares to accept
|
|
908
|
+
* @param params.userPassword - user's password to decrypt the shared wallet key
|
|
909
|
+
* @param params.newWalletPassphrase - new wallet passphrase for saving the shared wallet prv.
|
|
910
|
+
* If left blank then the user's login password is used.
|
|
911
|
+
*
|
|
912
|
+
*@returns {Promise<BulkAcceptShareResponse>}
|
|
913
|
+
*/
|
|
914
|
+
async bulkAcceptShare(params) {
|
|
915
|
+
try {
|
|
916
|
+
common.validateParams(params, ['userLoginPassword'], ['newWalletPassphrase']);
|
|
917
|
+
}
|
|
918
|
+
catch (e) {
|
|
919
|
+
if ('newWalletPassphrase' in params) {
|
|
920
|
+
throw new Error('Please provide a valid wallet passphrase');
|
|
921
|
+
}
|
|
922
|
+
throw new Error('Please provide a valid user login password');
|
|
923
|
+
}
|
|
924
|
+
(0, assert_1.default)(params.walletShareIds.length > 0, 'Please provide at least one wallet share to accept');
|
|
925
|
+
const allWalletShares = await this.listSharesV2();
|
|
926
|
+
const walletShareMap = allWalletShares.incoming.reduce((map, share) => ({ ...map, [share.id]: share }), {});
|
|
927
|
+
const walletShares = params.walletShareIds
|
|
928
|
+
.map((walletShareId) => walletShareMap[walletShareId])
|
|
929
|
+
.filter((walletShare) => walletShare && (walletShare.keychain || walletShare.userMultiKeyRotationRequired));
|
|
930
|
+
if (!walletShares.length) {
|
|
931
|
+
throw new Error('No valid wallet shares found to accept');
|
|
932
|
+
}
|
|
933
|
+
const sharingKeychain = await this.bitgo.getECDHKeychain();
|
|
934
|
+
if (_.isUndefined(sharingKeychain.encryptedXprv)) {
|
|
935
|
+
throw new Error('encryptedXprv was not found on sharing keychain');
|
|
936
|
+
}
|
|
937
|
+
sharingKeychain.prv = this.bitgo.decrypt({
|
|
938
|
+
password: params.userLoginPassword,
|
|
939
|
+
input: sharingKeychain.encryptedXprv,
|
|
940
|
+
});
|
|
941
|
+
const newWalletPassphrase = params.newWalletPassphrase || params.userLoginPassword;
|
|
942
|
+
const webauthnInfo = params.webauthnInfo;
|
|
943
|
+
const keysForWalletShares = walletShares.flatMap((walletShare) => {
|
|
944
|
+
// Handle userMultiKeyRotationRequired case - these shares don't have keychains
|
|
945
|
+
if (walletShare.userMultiKeyRotationRequired) {
|
|
946
|
+
if (!params.userLoginPassword) {
|
|
947
|
+
throw new Error('userLoginPassword param must be provided to generate user keychain');
|
|
948
|
+
}
|
|
949
|
+
const walletKeychain = this.baseCoin.keychains().create();
|
|
950
|
+
const encryptedPrv = this.bitgo.encrypt({
|
|
951
|
+
password: newWalletPassphrase,
|
|
952
|
+
input: walletKeychain.prv,
|
|
953
|
+
});
|
|
954
|
+
return [
|
|
955
|
+
{
|
|
956
|
+
walletShareId: walletShare.id,
|
|
957
|
+
encryptedPrv: encryptedPrv,
|
|
958
|
+
pub: walletKeychain.pub,
|
|
959
|
+
},
|
|
960
|
+
];
|
|
961
|
+
}
|
|
962
|
+
// Standard case: shares with keychains
|
|
963
|
+
if (!walletShare.keychain) {
|
|
964
|
+
return [];
|
|
965
|
+
}
|
|
966
|
+
const secret = (0, ecdh_1.getSharedSecret)(utxo_lib_1.bip32.fromBase58(sharingKeychain.prv).derivePath((0, api_1.sanitizeLegacyPath)(walletShare.keychain.path)), Buffer.from(walletShare.keychain.fromPubKey, 'hex')).toString('hex');
|
|
967
|
+
const decryptedSharedWalletPrv = this.bitgo.decrypt({
|
|
968
|
+
password: secret,
|
|
969
|
+
input: walletShare.keychain.encryptedPrv,
|
|
970
|
+
});
|
|
971
|
+
const newEncryptedPrv = this.bitgo.encrypt({
|
|
972
|
+
password: newWalletPassphrase,
|
|
973
|
+
input: decryptedSharedWalletPrv,
|
|
974
|
+
});
|
|
975
|
+
const entry = {
|
|
976
|
+
walletShareId: walletShare.id,
|
|
977
|
+
encryptedPrv: newEncryptedPrv,
|
|
978
|
+
};
|
|
979
|
+
if (webauthnInfo) {
|
|
980
|
+
entry.webauthnInfo = {
|
|
981
|
+
otpDeviceId: webauthnInfo.otpDeviceId,
|
|
982
|
+
prfSalt: webauthnInfo.prfSalt,
|
|
983
|
+
encryptedPrv: this.bitgo.encrypt({
|
|
984
|
+
password: webauthnInfo.passphrase,
|
|
985
|
+
input: decryptedSharedWalletPrv,
|
|
986
|
+
}),
|
|
987
|
+
};
|
|
988
|
+
}
|
|
989
|
+
return [entry];
|
|
990
|
+
});
|
|
991
|
+
return this.bulkAcceptShareRequest(keysForWalletShares);
|
|
992
|
+
}
|
|
993
|
+
/**
|
|
994
|
+
* Updates multiple wallet shares in bulk
|
|
995
|
+
* This method allows users to accept or reject multiple wallet shares in a single operation.
|
|
996
|
+
* It handles different types of wallet shares including those requiring special keychain overrides
|
|
997
|
+
* and those with encrypted private keys that need to be decrypted and re-encrypted.
|
|
998
|
+
* After processing, it also reshares accepted wallets with spenders for special override cases.
|
|
999
|
+
*
|
|
1000
|
+
* @param params - Options for bulk updating wallet shares
|
|
1001
|
+
* @param params.shares - Array of wallet shares to update with their status (accept/reject)
|
|
1002
|
+
* @param params.userLoginPassword - User's login password for decryption operations
|
|
1003
|
+
* @param params.newWalletPassphrase - New wallet passphrase for re-encryption
|
|
1004
|
+
* @returns Array of responses for each wallet share update
|
|
1005
|
+
*/
|
|
1006
|
+
async bulkUpdateWalletShare(params) {
|
|
1007
|
+
if (!params.shares) {
|
|
1008
|
+
throw new Error('Missing parameter: shares');
|
|
1009
|
+
}
|
|
1010
|
+
if (!Array.isArray(params.shares)) {
|
|
1011
|
+
throw new Error('Expecting parameter array: shares but found ' + typeof params.shares);
|
|
1012
|
+
}
|
|
1013
|
+
// Validate each share in the array
|
|
1014
|
+
for (const share of params.shares) {
|
|
1015
|
+
if (!share.walletShareId) {
|
|
1016
|
+
throw new Error('Missing walletShareId in share');
|
|
1017
|
+
}
|
|
1018
|
+
if (!share.status) {
|
|
1019
|
+
throw new Error('Missing status in share');
|
|
1020
|
+
}
|
|
1021
|
+
if (share.status !== 'accept' && share.status !== 'reject') {
|
|
1022
|
+
throw new Error('Invalid status in share: ' + share.status + '. Must be either "accept" or "reject"');
|
|
1023
|
+
}
|
|
1024
|
+
if (typeof share.walletShareId !== 'string') {
|
|
1025
|
+
throw new Error('Expecting walletShareId to be a string but found ' + typeof share.walletShareId);
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
// Validate optional parameters if provided
|
|
1029
|
+
if (params.userLoginPassword !== undefined && typeof params.userLoginPassword !== 'string') {
|
|
1030
|
+
throw new Error('Expecting parameter string: userLoginPassword but found ' + typeof params.userLoginPassword);
|
|
1031
|
+
}
|
|
1032
|
+
if (params.newWalletPassphrase !== undefined && typeof params.newWalletPassphrase !== 'string') {
|
|
1033
|
+
throw new Error('Expecting parameter string: newWalletPassphrase but found ' + typeof params.newWalletPassphrase);
|
|
1034
|
+
}
|
|
1035
|
+
(0, assert_1.default)(params.shares.length > 0, 'no shares are passed');
|
|
1036
|
+
const { shares: inputShares, userLoginPassword, newWalletPassphrase } = params;
|
|
1037
|
+
const allWalletShares = await this.listSharesV2();
|
|
1038
|
+
// Only include shares that are in the input array for efficiency
|
|
1039
|
+
const shareIds = new Set(inputShares.map((share) => share.walletShareId));
|
|
1040
|
+
const walletShareMap = new Map();
|
|
1041
|
+
allWalletShares.incoming
|
|
1042
|
+
.filter((share) => shareIds.has(share.id))
|
|
1043
|
+
.forEach((share) => walletShareMap.set(share.id, share));
|
|
1044
|
+
allWalletShares.outgoing
|
|
1045
|
+
.filter((share) => shareIds.has(share.id))
|
|
1046
|
+
.forEach((share) => walletShareMap.set(share.id, share));
|
|
1047
|
+
const resolvedShares = inputShares.map((share) => {
|
|
1048
|
+
const walletShare = walletShareMap.get(share.walletShareId);
|
|
1049
|
+
if (!walletShare) {
|
|
1050
|
+
throw new Error(`invalid wallet share provided: ${share.walletShareId}`);
|
|
1051
|
+
}
|
|
1052
|
+
return { ...share, walletShare };
|
|
1053
|
+
});
|
|
1054
|
+
// Identify special override cases that need resharing after acceptance
|
|
1055
|
+
const specialOverrideCases = new Map();
|
|
1056
|
+
resolvedShares.forEach((share) => {
|
|
1057
|
+
if (share.status === 'accept' &&
|
|
1058
|
+
share.walletShare.keychainOverrideRequired &&
|
|
1059
|
+
share.walletShare.permissions.includes('admin') &&
|
|
1060
|
+
share.walletShare.permissions.includes('spend')) {
|
|
1061
|
+
specialOverrideCases.set(share.walletShareId, share.walletShare.wallet);
|
|
1062
|
+
}
|
|
1063
|
+
});
|
|
1064
|
+
// Decrypt sharing keychain if needed (only once)
|
|
1065
|
+
let sharingKeychainPrv;
|
|
1066
|
+
// Only decrypt if there are shares to accept that might need it
|
|
1067
|
+
const hasSharesRequiringDecryption = specialOverrideCases.size > 0 ||
|
|
1068
|
+
resolvedShares.some((share) => share.status === 'accept' && share.walletShare.keychain?.encryptedPrv);
|
|
1069
|
+
if (userLoginPassword && hasSharesRequiringDecryption) {
|
|
1070
|
+
const sharingKeychain = await this.bitgo.getECDHKeychain();
|
|
1071
|
+
if (!sharingKeychain.encryptedXprv) {
|
|
1072
|
+
throw new Error('encryptedXprv was not found on sharing keychain');
|
|
1073
|
+
}
|
|
1074
|
+
sharingKeychainPrv = this.bitgo.decrypt({
|
|
1075
|
+
password: userLoginPassword,
|
|
1076
|
+
input: sharingKeychain.encryptedXprv,
|
|
1077
|
+
});
|
|
1078
|
+
}
|
|
1079
|
+
const settledUpdates = await Promise.allSettled(resolvedShares.map(async (share) => {
|
|
1080
|
+
const { walletShareId, status, walletShare } = share;
|
|
1081
|
+
// Handle accept case
|
|
1082
|
+
if (status === 'accept') {
|
|
1083
|
+
return this.processAcceptShare(walletShareId, walletShare, userLoginPassword, newWalletPassphrase, sharingKeychainPrv);
|
|
1084
|
+
}
|
|
1085
|
+
// Handle reject case
|
|
1086
|
+
return [
|
|
1087
|
+
{
|
|
1088
|
+
walletShareId,
|
|
1089
|
+
status: 'reject',
|
|
1090
|
+
},
|
|
1091
|
+
];
|
|
1092
|
+
}));
|
|
1093
|
+
// Extract successful updates
|
|
1094
|
+
const successfulUpdates = settledUpdates.flatMap((result) => (result.status === 'fulfilled' ? result.value : []));
|
|
1095
|
+
// Extract failed updates - only from rejected promises
|
|
1096
|
+
const failedUpdates = settledUpdates.reduce((acc, result, index) => {
|
|
1097
|
+
if (result.status === 'rejected') {
|
|
1098
|
+
const rejectedResult = result;
|
|
1099
|
+
acc.push({
|
|
1100
|
+
walletShareId: resolvedShares[index].walletShareId,
|
|
1101
|
+
reason: rejectedResult.reason?.message || String(rejectedResult.reason),
|
|
1102
|
+
});
|
|
1103
|
+
}
|
|
1104
|
+
return acc;
|
|
1105
|
+
}, []);
|
|
1106
|
+
// Send successful updates to the server
|
|
1107
|
+
const response = await this.bulkUpdateWalletShareRequest(successfulUpdates);
|
|
1108
|
+
// Process accepted special override cases - reshare with spenders
|
|
1109
|
+
if (response.acceptedWalletShares && response.acceptedWalletShares.length > 0 && userLoginPassword) {
|
|
1110
|
+
// For each accepted wallet share that is a special override case, reshare with spenders
|
|
1111
|
+
for (const walletShareId of response.acceptedWalletShares) {
|
|
1112
|
+
if (specialOverrideCases.has(walletShareId)) {
|
|
1113
|
+
const walletId = specialOverrideCases.get(walletShareId);
|
|
1114
|
+
try {
|
|
1115
|
+
await this.reshareWalletWithSpenders(walletId, userLoginPassword);
|
|
1116
|
+
}
|
|
1117
|
+
catch (e) {
|
|
1118
|
+
// Log error but continue processing other shares
|
|
1119
|
+
console.error(`Error resharing wallet ${walletId} with spenders: ${e?.message}`);
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
// Add information about failed updates to the response
|
|
1125
|
+
if (failedUpdates.length > 0) {
|
|
1126
|
+
response.walletShareUpdateErrors.push(...failedUpdates);
|
|
1127
|
+
}
|
|
1128
|
+
return response;
|
|
1129
|
+
}
|
|
1130
|
+
/**
|
|
1131
|
+
* Process a wallet share that is being accepted
|
|
1132
|
+
* This method handles the different cases for accepting a wallet share:
|
|
1133
|
+
* 1. Special override case requiring user keychain and signing
|
|
1134
|
+
* 2. Simple case with no keychain to decrypt
|
|
1135
|
+
* 3. Standard case requiring decryption and re-encryption
|
|
1136
|
+
*
|
|
1137
|
+
* @param walletShareId - ID of the wallet share
|
|
1138
|
+
* @param walletShare - Wallet share object
|
|
1139
|
+
* @param userLoginPassword - User's login password
|
|
1140
|
+
* @param newWalletPassphrase - New wallet passphrase
|
|
1141
|
+
* @param sharingKeychainPrv - Decrypted sharing keychain private key
|
|
1142
|
+
* @returns Array of wallet share update requests
|
|
1143
|
+
*/
|
|
1144
|
+
async processAcceptShare(walletShareId, walletShare, userLoginPassword, newWalletPassphrase, sharingKeychainPrv) {
|
|
1145
|
+
// Special override case: requires user keychain and signing
|
|
1146
|
+
if (walletShare.keychainOverrideRequired &&
|
|
1147
|
+
walletShare.permissions.includes('admin') &&
|
|
1148
|
+
walletShare.permissions.includes('spend')) {
|
|
1149
|
+
if (!userLoginPassword) {
|
|
1150
|
+
throw new Error('userLoginPassword param must be provided to decrypt shared key');
|
|
1151
|
+
}
|
|
1152
|
+
const walletKeychain = await this.baseCoin
|
|
1153
|
+
.keychains()
|
|
1154
|
+
.createUserKeychain(newWalletPassphrase || userLoginPassword);
|
|
1155
|
+
if (!walletKeychain.encryptedPrv) {
|
|
1156
|
+
throw new Error('encryptedPrv was not found on wallet keychain');
|
|
1157
|
+
}
|
|
1158
|
+
const payload = JSON.stringify({
|
|
1159
|
+
tradingAccountId: walletShare.wallet,
|
|
1160
|
+
pubkey: walletKeychain.pub,
|
|
1161
|
+
timestamp: new Date().toISOString(),
|
|
1162
|
+
});
|
|
1163
|
+
const prv = this.bitgo.decrypt({
|
|
1164
|
+
password: userLoginPassword,
|
|
1165
|
+
input: walletKeychain.encryptedPrv,
|
|
1166
|
+
});
|
|
1167
|
+
const signature = await this.baseCoin.signMessage({ prv }, payload);
|
|
1168
|
+
return [
|
|
1169
|
+
{
|
|
1170
|
+
walletShareId,
|
|
1171
|
+
status: 'accept',
|
|
1172
|
+
keyId: walletKeychain.id,
|
|
1173
|
+
signature: signature.toString('hex'),
|
|
1174
|
+
payload,
|
|
1175
|
+
},
|
|
1176
|
+
];
|
|
1177
|
+
}
|
|
1178
|
+
// Multi-user-key case: requires user to provide their own public key
|
|
1179
|
+
if (walletShare.userMultiKeyRotationRequired) {
|
|
1180
|
+
if (!(newWalletPassphrase || userLoginPassword)) {
|
|
1181
|
+
throw new Error('userLoginPassword param must be provided to generate user keychain');
|
|
1182
|
+
}
|
|
1183
|
+
const walletKeychain = this.baseCoin.keychains().create();
|
|
1184
|
+
const encryptedPrv = this.bitgo.encrypt({
|
|
1185
|
+
password: newWalletPassphrase || userLoginPassword,
|
|
1186
|
+
input: walletKeychain.prv,
|
|
1187
|
+
});
|
|
1188
|
+
return [
|
|
1189
|
+
{
|
|
1190
|
+
walletShareId,
|
|
1191
|
+
status: 'accept',
|
|
1192
|
+
encryptedPrv: encryptedPrv,
|
|
1193
|
+
pub: walletKeychain.pub,
|
|
1194
|
+
},
|
|
1195
|
+
];
|
|
1196
|
+
}
|
|
1197
|
+
// Return right away if there is no keychain to decrypt
|
|
1198
|
+
if (!walletShare.keychain || !walletShare.keychain.encryptedPrv) {
|
|
1199
|
+
return [
|
|
1200
|
+
{
|
|
1201
|
+
walletShareId,
|
|
1202
|
+
status: 'accept',
|
|
1203
|
+
},
|
|
1204
|
+
];
|
|
1205
|
+
}
|
|
1206
|
+
// More than viewing was requested, so we need to process the wallet keys using the shared ecdh scheme
|
|
1207
|
+
if (!userLoginPassword) {
|
|
1208
|
+
throw new Error('userLoginPassword param must be provided to decrypt shared key');
|
|
1209
|
+
}
|
|
1210
|
+
if (!sharingKeychainPrv) {
|
|
1211
|
+
throw new Error('failed to retrieve and decrypt sharing keychain');
|
|
1212
|
+
}
|
|
1213
|
+
const derivedKey = utxo_lib_1.bip32.fromBase58(sharingKeychainPrv).derivePath((0, api_1.sanitizeLegacyPath)(walletShare.keychain.path));
|
|
1214
|
+
const sharedSecret = (0, ecdh_1.getSharedSecret)(derivedKey, Buffer.from(walletShare.keychain.fromPubKey, 'hex')).toString('hex');
|
|
1215
|
+
const decryptedPrv = this.bitgo.decrypt({
|
|
1216
|
+
password: sharedSecret,
|
|
1217
|
+
input: walletShare.keychain.encryptedPrv,
|
|
1218
|
+
});
|
|
1219
|
+
// We will now re-encrypt the wallet with our own password
|
|
1220
|
+
const encryptedPrv = this.bitgo.encrypt({
|
|
1221
|
+
password: newWalletPassphrase || userLoginPassword,
|
|
1222
|
+
input: decryptedPrv,
|
|
1223
|
+
});
|
|
1224
|
+
return [
|
|
1225
|
+
{
|
|
1226
|
+
walletShareId,
|
|
1227
|
+
status: 'accept',
|
|
1228
|
+
encryptedPrv,
|
|
1229
|
+
},
|
|
1230
|
+
];
|
|
1231
|
+
}
|
|
520
1232
|
/**
|
|
521
1233
|
* Get a wallet by its ID
|
|
522
1234
|
* @param params
|
|
@@ -532,6 +1244,9 @@ class Wallets {
|
|
|
532
1244
|
}
|
|
533
1245
|
query.allTokens = params.allTokens;
|
|
534
1246
|
}
|
|
1247
|
+
if (params.includeBalance !== undefined) {
|
|
1248
|
+
query.includeBalance = params.includeBalance;
|
|
1249
|
+
}
|
|
535
1250
|
this.bitgo.setRequestTracer(params.reqId || new utils_1.RequestTracer());
|
|
536
1251
|
const wallet = await this.bitgo
|
|
537
1252
|
.get(this.baseCoin.url('/wallet/' + params.id))
|
|
@@ -565,43 +1280,163 @@ class Wallets {
|
|
|
565
1280
|
* @param params
|
|
566
1281
|
* @private
|
|
567
1282
|
*/
|
|
568
|
-
async generateMpcWallet(
|
|
1283
|
+
async generateMpcWallet({ passphrase, label, multisigType, enterprise, walletVersion, originalPasscodeEncryptionCode, encryptionVersion, }) {
|
|
1284
|
+
if (multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
|
|
1285
|
+
const tssSettings = await this.bitgo
|
|
1286
|
+
.get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
|
|
1287
|
+
.result();
|
|
1288
|
+
const multisigTypeVersion = tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.multiSigTypeVersion;
|
|
1289
|
+
walletVersion = this.determineEcdsaMpcWalletVersion(walletVersion, multisigTypeVersion);
|
|
1290
|
+
}
|
|
569
1291
|
const reqId = new utils_1.RequestTracer();
|
|
570
1292
|
this.bitgo.setRequestTracer(reqId);
|
|
1293
|
+
// Create MPC Keychains
|
|
1294
|
+
const keychains = await this.baseCoin.keychains().createMpc({
|
|
1295
|
+
multisigType,
|
|
1296
|
+
passphrase,
|
|
1297
|
+
enterprise,
|
|
1298
|
+
originalPasscodeEncryptionCode,
|
|
1299
|
+
encryptionVersion,
|
|
1300
|
+
});
|
|
1301
|
+
// Create Wallet
|
|
1302
|
+
const { userKeychain, backupKeychain, bitgoKeychain } = keychains;
|
|
571
1303
|
const walletParams = {
|
|
572
|
-
label
|
|
1304
|
+
label,
|
|
573
1305
|
m: 2,
|
|
574
1306
|
n: 3,
|
|
575
|
-
keys: [],
|
|
576
|
-
|
|
577
|
-
multisigType
|
|
578
|
-
enterprise
|
|
579
|
-
walletVersion
|
|
1307
|
+
keys: [userKeychain.id, backupKeychain.id, bitgoKeychain.id],
|
|
1308
|
+
type: 'hot',
|
|
1309
|
+
multisigType,
|
|
1310
|
+
enterprise,
|
|
1311
|
+
walletVersion,
|
|
1312
|
+
};
|
|
1313
|
+
const finalWalletParams = await this.baseCoin.supplementGenerateWallet(walletParams, keychains);
|
|
1314
|
+
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(finalWalletParams).result();
|
|
1315
|
+
const result = {
|
|
1316
|
+
wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
|
|
1317
|
+
userKeychain,
|
|
1318
|
+
backupKeychain,
|
|
1319
|
+
bitgoKeychain,
|
|
1320
|
+
responseType: 'WalletWithKeychains',
|
|
580
1321
|
};
|
|
1322
|
+
if (!_.isUndefined(backupKeychain.prv)) {
|
|
1323
|
+
result.warning = 'Be sure to backup the backup keychain -- it is not stored anywhere else!';
|
|
1324
|
+
}
|
|
1325
|
+
return result;
|
|
1326
|
+
}
|
|
1327
|
+
/**
|
|
1328
|
+
* Generates a Self-Managed Cold TSS Wallet.
|
|
1329
|
+
* @param params
|
|
1330
|
+
* @private
|
|
1331
|
+
*/
|
|
1332
|
+
async generateSMCMpcWallet({ label, multisigType, enterprise, walletVersion, bitgoKeyId, commonKeychain, coldDerivationSeed, }) {
|
|
1333
|
+
const reqId = new utils_1.RequestTracer();
|
|
1334
|
+
this.bitgo.setRequestTracer(reqId);
|
|
1335
|
+
let multisigTypeVersion;
|
|
1336
|
+
if (multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
|
|
1337
|
+
const tssSettings = await this.bitgo
|
|
1338
|
+
.get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
|
|
1339
|
+
.result();
|
|
1340
|
+
multisigTypeVersion =
|
|
1341
|
+
tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.coldMultiSigTypeVersion;
|
|
1342
|
+
walletVersion = this.determineEcdsaMpcWalletVersion(walletVersion, multisigTypeVersion);
|
|
1343
|
+
}
|
|
581
1344
|
// Create MPC Keychains
|
|
582
|
-
const
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
|
|
1345
|
+
const bitgoKeychain = await this.baseCoin.keychains().get({ id: bitgoKeyId });
|
|
1346
|
+
if (!bitgoKeychain || !bitgoKeychain.commonKeychain) {
|
|
1347
|
+
throw new Error('BitGo keychain not found');
|
|
1348
|
+
}
|
|
1349
|
+
if (bitgoKeychain.source !== 'bitgo') {
|
|
1350
|
+
throw new Error('The provided bitgoKeyId is not a BitGo keychain');
|
|
1351
|
+
}
|
|
1352
|
+
if (bitgoKeychain.commonKeychain !== commonKeychain) {
|
|
1353
|
+
throw new Error('The provided Common keychain mismatch with the provided Bitgo key');
|
|
1354
|
+
}
|
|
1355
|
+
if (!coldDerivationSeed) {
|
|
1356
|
+
throw new Error('derivedFromParentWithSeed is required');
|
|
1357
|
+
}
|
|
1358
|
+
const userKeychainParams = {
|
|
1359
|
+
source: 'user',
|
|
1360
|
+
keyType: 'tss',
|
|
1361
|
+
commonKeychain: commonKeychain,
|
|
1362
|
+
derivedFromParentWithSeed: coldDerivationSeed,
|
|
1363
|
+
isMPCv2: multisigTypeVersion === 'MPCv2' ? true : undefined,
|
|
1364
|
+
};
|
|
1365
|
+
const userKeychain = await this.baseCoin.keychains().add(userKeychainParams);
|
|
1366
|
+
const backupKeyChainParams = {
|
|
1367
|
+
source: 'backup',
|
|
1368
|
+
keyType: 'tss',
|
|
1369
|
+
commonKeychain: commonKeychain,
|
|
1370
|
+
derivedFromParentWithSeed: coldDerivationSeed,
|
|
1371
|
+
isMPCv2: multisigTypeVersion === 'MPCv2' ? true : undefined,
|
|
1372
|
+
};
|
|
1373
|
+
const backupKeychain = await this.baseCoin.keychains().add(backupKeyChainParams);
|
|
591
1374
|
// Create Wallet
|
|
1375
|
+
const keychains = { userKeychain, backupKeychain, bitgoKeychain };
|
|
1376
|
+
const walletParams = {
|
|
1377
|
+
label,
|
|
1378
|
+
m: 2,
|
|
1379
|
+
n: 3,
|
|
1380
|
+
keys: [userKeychain.id, backupKeychain.id, bitgoKeychain.id],
|
|
1381
|
+
type: 'cold',
|
|
1382
|
+
multisigType,
|
|
1383
|
+
enterprise,
|
|
1384
|
+
walletVersion,
|
|
1385
|
+
};
|
|
592
1386
|
const finalWalletParams = await this.baseCoin.supplementGenerateWallet(walletParams, keychains);
|
|
593
|
-
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet')).send(finalWalletParams).result();
|
|
1387
|
+
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(finalWalletParams).result();
|
|
594
1388
|
const result = {
|
|
595
1389
|
wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
|
|
596
1390
|
userKeychain,
|
|
597
1391
|
backupKeychain,
|
|
598
1392
|
bitgoKeychain,
|
|
1393
|
+
responseType: 'WalletWithKeychains',
|
|
599
1394
|
};
|
|
600
|
-
|
|
601
|
-
|
|
1395
|
+
return result;
|
|
1396
|
+
}
|
|
1397
|
+
/**
|
|
1398
|
+
* Generates a Custodial TSS Wallet.
|
|
1399
|
+
* @param params
|
|
1400
|
+
* @private
|
|
1401
|
+
*/
|
|
1402
|
+
async generateCustodialMpcWallet({ label, multisigType, enterprise, walletVersion, }) {
|
|
1403
|
+
const reqId = new utils_1.RequestTracer();
|
|
1404
|
+
this.bitgo.setRequestTracer(reqId);
|
|
1405
|
+
if (multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
|
|
1406
|
+
const tssSettings = await this.bitgo
|
|
1407
|
+
.get(this.bitgo.microservicesUrl('/api/v2/tss/settings'))
|
|
1408
|
+
.result();
|
|
1409
|
+
const multisigTypeVersion = tssSettings.coinSettings[this.baseCoin.getFamily()]?.walletCreationSettings?.custodialMultiSigTypeVersion;
|
|
1410
|
+
walletVersion = this.determineEcdsaMpcWalletVersion(walletVersion, multisigTypeVersion);
|
|
602
1411
|
}
|
|
1412
|
+
const finalWalletParams = {
|
|
1413
|
+
label,
|
|
1414
|
+
multisigType,
|
|
1415
|
+
enterprise,
|
|
1416
|
+
walletVersion,
|
|
1417
|
+
type: 'custodial',
|
|
1418
|
+
};
|
|
1419
|
+
// Create Wallet
|
|
1420
|
+
const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet/add')).send(finalWalletParams).result();
|
|
1421
|
+
const wallet = new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet);
|
|
1422
|
+
const keychains = wallet.keyIds();
|
|
1423
|
+
const result = {
|
|
1424
|
+
wallet,
|
|
1425
|
+
userKeychain: { id: keychains[0], type: multisigType, source: 'user' },
|
|
1426
|
+
backupKeychain: { id: keychains[1], type: multisigType, source: 'backup' },
|
|
1427
|
+
bitgoKeychain: { id: keychains[2], type: multisigType, source: 'bitgo' },
|
|
1428
|
+
responseType: 'WalletWithKeychains',
|
|
1429
|
+
};
|
|
603
1430
|
return result;
|
|
604
1431
|
}
|
|
1432
|
+
determineEcdsaMpcWalletVersion(walletVersion, multisigTypeVersion) {
|
|
1433
|
+
if (this.baseCoin.isEVM() && multisigTypeVersion === 'MPCv2') {
|
|
1434
|
+
if (!walletVersion || (walletVersion !== 5 && walletVersion !== 6)) {
|
|
1435
|
+
return 5;
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
return walletVersion;
|
|
1439
|
+
}
|
|
605
1440
|
}
|
|
606
1441
|
exports.Wallets = Wallets;
|
|
607
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxvREFBNEI7QUFDNUIsK0NBQXlDO0FBQ3pDLG1EQUE2QztBQUM3QywwQ0FBNEI7QUFDNUIsbUNBQStDO0FBQy9DLHFEQUF1QztBQUd2QyxrQ0FBMEM7QUFFMUMsb0NBQXVEO0FBYXZELHFDQUFrQztBQUVsQyxNQUFhLE9BQU87SUFJbEIsWUFBWSxLQUFnQixFQUFFLFFBQW1CO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQTJCLEVBQUU7UUFDckMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUE0QixFQUFFO1FBQ3ZDLE1BQU0sV0FBVyxHQUFzQixFQUFFLENBQUM7UUFFMUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQ3hEO1FBRUQsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO2FBQ3BFO1lBQ0QsV0FBVyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxNQUFNLENB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TyxHQUFHLDBFQUEwRSxDQUFDO1NBQzdGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBcnBCRCwwQkFxcEJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgSUJhc2VDb2luLCBLZXljaGFpbnNUcmlwbGV0LCBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGdldFNoYXJlZFNlY3JldCB9IGZyb20gJy4uL2VjZGgnO1xuaW1wb3J0IHsgS2V5Y2hhaW4gfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBwcm9taXNlUHJvcHMsIFJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBBY2NlcHRTaGFyZU9wdGlvbnMsXG4gIEFkZFdhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlTXBjV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICBHZXRXYWxsZXRCeUFkZHJlc3NPcHRpb25zLFxuICBHZXRXYWxsZXRPcHRpb25zLFxuICBJV2FsbGV0cyxcbiAgTGlzdFdhbGxldE9wdGlvbnMsXG4gIFVwZGF0ZVNoYXJlT3B0aW9ucyxcbiAgV2FsbGV0V2l0aEtleWNoYWlucyxcbn0gZnJvbSAnLi9pV2FsbGV0cyc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuL3dhbGxldCc7XG5cbmV4cG9ydCBjbGFzcyBXYWxsZXRzIGltcGxlbWVudHMgSVdhbGxldHMge1xuICBwcml2YXRlIHJlYWRvbmx5IGJpdGdvOiBCaXRHb0Jhc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luKSB7XG4gICAgdGhpcy5iaXRnbyA9IGJpdGdvO1xuICAgIHRoaXMuYmFzZUNvaW4gPSBiYXNlQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3YWxsZXQgYnkgSUQgKHByb3h5IGZvciBnZXRXYWxsZXQpXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldChwYXJhbXM6IEdldFdhbGxldE9wdGlvbnMgPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2FsbGV0KHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhIHVzZXIncyB3YWxsZXRzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBsaXN0KHBhcmFtczogTGlzdFdhbGxldE9wdGlvbnMgPSB7fSk6IFByb21pc2U8eyB3YWxsZXRzOiBXYWxsZXRbXSB9PiB7XG4gICAgY29uc3QgcXVlcnlPYmplY3Q6IExpc3RXYWxsZXRPcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLnNraXAgJiYgcGFyYW1zLnByZXZJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3Qgc3BlY2lmeSBib3RoIHNraXAgYW5kIHByZXZJZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ2V0YmFsYW5jZXMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmdldGJhbGFuY2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZ2V0YmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeU9iamVjdC5nZXRiYWxhbmNlcyA9IHBhcmFtcy5nZXRiYWxhbmNlcztcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeU9iamVjdC5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5T2JqZWN0LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeU9iamVjdC5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQnKSkucXVlcnkocXVlcnlPYmplY3QpLnJlc3VsdCgpKSBhcyBhbnk7XG4gICAgYm9keS53YWxsZXRzID0gYm9keS53YWxsZXRzLm1hcCgodykgPT4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3KSk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogYWRkXG4gICAqIEFkZCBhIG5ldyB3YWxsZXQgKGFkdmFuY2VkIG1vZGUpLlxuICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gbWFudWFsbHkgc3VibWl0IHRoZSBrZXlzLCB0eXBlLCBtIGFuZCBuIG9mIHRoZSB3YWxsZXRcbiAgICogUGFyYW1ldGVycyBpbmNsdWRlOlxuICAgKiAgICBcImxhYmVsXCI6IGxhYmVsIG9mIHRoZSB3YWxsZXQgdG8gYmUgc2hvd24gaW4gVUlcbiAgICogICAgXCJtXCI6IG51bWJlciBvZiBrZXlzIHJlcXVpcmVkIHRvIHVubG9jayB3YWxsZXQgKDIpXG4gICAqICAgIFwiblwiOiBudW1iZXIgb2Yga2V5cyBhdmFpbGFibGUgb24gdGhlIHdhbGxldCAoMylcbiAgICogICAgXCJrZXlzXCI6IGFycmF5IG9mIGtleWNoYWluIGlkc1xuICAgKi9cbiAgYXN5bmMgYWRkKHBhcmFtczogQWRkV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbGFiZWwnLCAnZW50ZXJwcmlzZScsICd0eXBlJ10pO1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMubGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBsYWJlbCcpO1xuICAgIH1cblxuICAgIC8vIG5vIG5lZWQgdG8gcGFzcyBrZXlzIGZvciAoc2luZ2xlKSBjdXN0b2RpYWwgd2FsbGV0c1xuICAgIGlmIChwYXJhbXMudHlwZSAhPT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5rZXlzKSA9PT0gZmFsc2UgfHwgIV8uaXNOdW1iZXIocGFyYW1zLm0pIHx8ICFfLmlzTnVtYmVyKHBhcmFtcy5uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIHR5cGVzIG9mIG11bHRpc2lnXG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uaXNWYWxpZE1vZk5TZXR1cChwYXJhbXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgbXVsdGktc2lnIHR5cGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdhc1ByaWNlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5nYXNQcmljZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZ2FzUHJpY2UgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLndhbGxldFZlcnNpb24gJiYgIV8uaXNOdW1iZXIocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIHdhbGxldFZlcnNpb24gLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnRhZ3MgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMudGFncykgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIHRhZ3MgLSBhcnJheSBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY2xpZW50RmxhZ3MgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuY2xpZW50RmxhZ3MpID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBjbGllbnRGbGFncyAtIGFycmF5IGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pc0NvbGQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pc0NvbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGlzQ29sZCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmlzQ3VzdG9kaWFsICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaXNDdXN0b2RpYWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGlzQ3VzdG9kaWFsIC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWRkcmVzcyAmJiAoIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpIHx8ICF0aGlzLmJhc2VDb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5hZGRyZXNzKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYWRkcmVzcyAtIHZhbGlkIGFkZHJlc3Mgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0JykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyB3YWxsZXRcbiAgICogMS4gQ3JlYXRlcyB0aGUgdXNlciBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4gICAqIDIuIElmIG5vIHB1YiB3YXMgcHJvdmlkZWQsIGNyZWF0ZXMgdGhlIGJhY2t1cCBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4gICAqIDMuIFVwbG9hZHMgdGhlIGVuY3J5cHRlZCB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zIHRvIEJpdEdvXG4gICAqIDQuIENyZWF0ZXMgdGhlIEJpdEdvIGtleSBvbiB0aGUgc2VydmljZVxuICAgKiA1LiBDcmVhdGVzIHRoZSB3YWxsZXQgb24gQml0R28gd2l0aCB0aGUgMyBwdWJsaWMga2V5cyBhYm92ZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMubGFiZWxcbiAgICogQHBhcmFtIHBhcmFtcy5wYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcktleSBVc2VyIHhwdWJcbiAgICogQHBhcmFtIHBhcmFtcy5iYWNrdXBYcHViIEJhY2t1cCB4cHViXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwUHJvdmlkZXIgVGhpcmQgcGFydHkgYmFja3VwIHByb3ZpZGVyIGZvciBUU1NcbiAgICogQHBhcmFtIHBhcmFtcy5lbnRlcnByaXNlXG4gICAqIEBwYXJhbSBwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICogQHBhcmFtIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWRcbiAgICogQHBhcmFtIHBhcmFtcy5nYXNQcmljZVxuICAgKiBAcGFyYW0gcGFyYW1zLmRpc2FibGVLUlNFbWFpbFxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFZlcnNpb25cbiAgICogQHBhcmFtIHBhcmFtcy5tdWx0aXNpZ1R5cGUgb3B0aW9uYWwgbXVsdGlzaWcgdHlwZSwgJ29uY2hhaW4nIG9yICd0c3MnIG9yICdibHNka2cnOyBpZiBhYnNlbnQsIHdlIHdpbGwgZGVmZXIgdG8gdGhlIGNvaW4ncyBkZWZhdWx0IHR5cGVcbiAgICogQHBhcmFtIHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIGJpdGdvIGtleS4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byBjcmVhdGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0LiBJZiBwcm92aWRlZCwgeW91IG11c3QgaGF2ZSB0aGUgZW50ZXJwcmlzZSBsaWNlbnNlIGFuZCBwYXNzIGluXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHBhcmFtcy5lbnRlcnByaXNlYCBpbnRvIGBnZW5lcmF0ZVdhbGxldGAgYXMgd2VsbC5cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVdhbGxldChwYXJhbXM6IEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydsYWJlbCddLCBbJ3Bhc3NwaHJhc2UnLCAndXNlcktleScsICdiYWNrdXBYcHViJ10pO1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmxhYmVsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgbGFiZWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1RzcyA9IHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKTtcbiAgICBjb25zdCBsYWJlbCA9IHBhcmFtcy5sYWJlbDtcbiAgICBjb25zdCBwYXNzcGhyYXNlID0gcGFyYW1zLnBhc3NwaHJhc2U7XG4gICAgY29uc3QgY2FuRW5jcnlwdCA9ICEhcGFzc3BocmFzZSAmJiB0eXBlb2YgcGFzc3BocmFzZSA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgaXNDb2xkID0gISFwYXJhbXMudXNlcktleSAmJiBwYXJhbXMubXVsdGlzaWdUeXBlICE9PSAnb25jaGFpbic7XG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbXSxcbiAgICAgIGlzQ29sZCxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZW50ZXJwcmlzZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZW50ZXJwcmlzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudGVycHJpc2UgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5lbnRlcnByaXNlID0gcGFyYW1zLmVudGVycHJpc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVudGVycHJpc2Ugbm90IGRlZmluZWRcbiAgICAgIGlmIChwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiBwYXJhbXMuYmFja3VwUHJvdmlkZXIgPT09ICdCaXRHb1RydXN0QXNLcnMnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGVudGVycHJpc2UgaWQgaXMgcmVxdWlyZWQgd2hlbiBjcmVhdGluZyBUU1Mgd2FsbGV0IHdpdGggQml0R28gVHJ1c3QgYXMgS1JTLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVWTSBUU1Mgd2FsbGV0cyBtdXN0IHVzZSB3YWxsZXQgdmVyc2lvbiAzXG4gICAgaWYgKChpc1RzcyAmJiB0aGlzLmJhc2VDb2luLmlzRVZNKCkpICE9PSAocGFyYW1zLndhbGxldFZlcnNpb24gPT09IDMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VWTSBUU1Mgd2FsbGV0cyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHdhbGxldCB2ZXJzaW9uIDMnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUc3MpIHtcbiAgICAgIGlmIChpc0NvbGQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUU1MgY29sZCB3YWxsZXRzIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNcGNXYWxsZXQoe1xuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgcGFzc3BocmFzZSxcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICAgIHdhbGxldFZlcnNpb246IHBhcmFtcy53YWxsZXRWZXJzaW9uLFxuICAgICAgICBiYWNrdXBQcm92aWRlcjogcGFyYW1zLmJhY2t1cFByb3ZpZGVyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNCbHNEa2cgPSBwYXJhbXMubXVsdGlzaWdUeXBlID8gcGFyYW1zLm11bHRpc2lnVHlwZSA9PT0gJ2Jsc2RrZycgOiB0aGlzLmJhc2VDb2luLnN1cHBvcnRzQmxzRGtnKCk7XG4gICAgaWYgKGlzQmxzRGtnKSB7XG4gICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgQkxTLURLRyBrZXlzIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDb2xkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQkxTLURLRyBjb2xkIHdhbGxldHMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c0Jsc0RrZygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29pbiAke3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCl9IGRvZXMgbm90IHN1cHBvcnQgQkxTLURLRyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNcGNXYWxsZXQoeyBtdWx0aXNpZ1R5cGU6ICdibHNka2cnLCBsYWJlbCwgcGFzc3BocmFzZSB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZGlzdHJpYnV0ZWQgY3VzdG9keVxuICAgIGlmIChwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHkpIHtcbiAgICAgIGlmICghcGFyYW1zLmVudGVycHJpc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHByb3ZpZGUgZW50ZXJwcmlzZSB3aGVuIGNyZWF0aW5nIGRpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXdhbGxldFBhcmFtcy5pc0NvbGQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldHMgbXVzdCBiZSBjb2xkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQmFja3VwWHB1YiA9ICEhcGFyYW1zLmJhY2t1cFhwdWI7XG4gICAgY29uc3QgaGFzQmFja3VwWHB1YlByb3ZpZGVyID0gISFwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyO1xuICAgIGlmIChoYXNCYWNrdXBYcHViICYmIGhhc0JhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvdmlkZSBtb3JlIHRoYW4gb25lIGJhY2t1cFhwdWIgb3IgYmFja3VwWHB1YlByb3ZpZGVyIGZsYWcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdhc1ByaWNlICYmIHBhcmFtcy5laXAxNTU5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgdXNlIGJvdGggZWlwMTU1OSBhbmQgZ2FzUHJpY2UgdmFsdWVzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyA9IHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICBjb25zdCBnYXNQcmljZUJOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZ2FzUHJpY2UpO1xuICAgICAgaWYgKGdhc1ByaWNlQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZ2FzIHByaWNlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5nYXNQcmljZSA9IGdhc1ByaWNlQk4udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmVpcDE1NTkpICYmICFfLmlzRW1wdHkocGFyYW1zLmVpcDE1NTkpKSB7XG4gICAgICBjb25zdCBtYXhGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhGZWVQZXJHYXNCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXggZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heFByaW9yaXR5RmVlUGVyR2FzQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5laXAxNTU5Lm1heFByaW9yaXR5RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhQcmlvcml0eUZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByaW9yaXR5IGZlZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZWlwMTU1OSA9IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiBtYXhGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogbWF4UHJpb3JpdHlGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVLUlNFbWFpbCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlS1JTRW1haWwgPSBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldFZlcnNpb24gcHJvdmlkZWQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy53YWxsZXRWZXJzaW9uID0gcGFyYW1zLndhbGxldFZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGVhY2gga3JzU3BlY2lmaWMgcGFyYW0gaXMgZWl0aGVyIGEgc3RyaW5nLCBib29sZWFuLCBvciBudW1iZXJcbiAgICBjb25zdCB7IGtyc1NwZWNpZmljIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGtyc1NwZWNpZmljKSkge1xuICAgICAgT2JqZWN0LmtleXMoa3JzU3BlY2lmaWMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSBrcnNTcGVjaWZpY1trZXldO1xuICAgICAgICBpZiAoIV8uaXNCb29sZWFuKHZhbCkgJiYgIV8uaXNTdHJpbmcodmFsKSAmJiAhXy5pc051bWJlcih2YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrcnNTcGVjaWZpYyBvYmplY3QgY29udGFpbnMgaWxsZWdhbCB2YWx1ZXMuIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MsIGJvb2xlYW5zLCBvciBudW1iZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuXG4gICAgLy8gQWRkIHRoZSB1c2VyIGtleWNoYWluXG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICBsZXQgdXNlcktleWNoYWluUGFyYW1zO1xuICAgICAgbGV0IHVzZXJLZXljaGFpbjtcbiAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdXNlciBrZXlcbiAgICAgIGlmIChwYXJhbXMudXNlcktleSkge1xuICAgICAgICB1c2VyS2V5Y2hhaW4gPSB7IHB1YjogcGFyYW1zLnVzZXJLZXkgfTtcbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zID0gdXNlcktleWNoYWluO1xuICAgICAgICBpZiAocGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAgICAgIGtleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvbi5kZXJpdmF0aW9uUGF0aDtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW4ucHViID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgICAgICAgdXNlcktleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgPSBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBnZW5lcmF0ZSB1c2VyIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSB1c2VyIGtleS5cbiAgICAgICAgdXNlcktleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgICAgdXNlcktleWNoYWluLmVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBwYXNzcGhyYXNlLCBpbnB1dDogdXNlcktleWNoYWluLnBydiB9KTtcbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zID0ge1xuICAgICAgICAgIHB1YjogdXNlcktleWNoYWluLnB1YixcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdXNlcktleWNoYWluUGFyYW1zLnJlcUlkID0gcmVxSWQ7XG4gICAgICBjb25zdCBuZXdVc2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICAgICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBuZXdVc2VyS2V5Y2hhaW4sIHVzZXJLZXljaGFpbik7XG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICBpZiAocGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgICAvLyBJZiByZXF1ZXN0ZWQsIHVzZSBhIEtSUyBvciBiYWNrdXAga2V5IHByb3ZpZGVyXG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJhY2t1cCh7XG4gICAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIgfHwgJ2RlZmF1bHRSTUdCYWNrdXBQcm92aWRlcicsXG4gICAgICAgICAgZGlzYWJsZUtSU0VtYWlsOiBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsLFxuICAgICAgICAgIGtyc1NwZWNpZmljOiBwYXJhbXMua3JzU3BlY2lmaWMsXG4gICAgICAgICAgdHlwZTogdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpLFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlciBwcm92aWRlZCBiYWNrdXAgeHB1YlxuICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViKSB7XG4gICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgYmFja3VwIGV0aGVyZXVtIGFkZHJlc3NcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHtcbiAgICAgICAgICBwdWI6IHBhcmFtcy5iYWNrdXBYcHViLFxuICAgICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFjYW5FbmNyeXB0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgYmFja3VwIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gcHJvdmlkZWQgYmFja3VwIHhwdWIgb3IgYWRkcmVzcywgc28gZGVmYXVsdCB0byBjcmVhdGluZyBvbmUgaGVyZVxuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoeyByZXFJZCB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH06IEtleWNoYWluc1RyaXBsZXQgPSBhd2FpdCBwcm9taXNlUHJvcHMoe1xuICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICBiaXRnb0tleWNoYWluOiB0aGlzLmJhc2VDb2luXG4gICAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgICAuY3JlYXRlQml0R28oeyBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSwgcmVxSWQsIGlzRGlzdHJpYnV0ZWRDdXN0b2R5OiBwYXJhbXMuaXNEaXN0cmlidXRlZEN1c3RvZHkgfSksXG4gICAgfSk7XG5cbiAgICB3YWxsZXRQYXJhbXMua2V5cyA9IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcblxuICAgIHdhbGxldFBhcmFtcy5pc0NvbGQgPSBpc0NvbGQ7XG5cbiAgICBjb25zdCB7IHBydiB9ID0gdXNlcktleWNoYWluO1xuICAgIGlmIChfLmlzU3RyaW5nKHBydikpIHtcbiAgICAgIGFzc2VydChiYWNrdXBLZXljaGFpbi5wdWIpO1xuICAgICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4ucHViKTtcbiAgICAgIHdhbGxldFBhcmFtcy5rZXlTaWduYXR1cmVzID0ge1xuICAgICAgICBiYWNrdXA6IChhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2IH0sIGJhY2t1cEtleWNoYWluLnB1YikpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgYml0Z286IChhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2IH0sIGJpdGdvS2V5Y2hhaW4ucHViKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoXy5pbmNsdWRlcyhbJ3hycCcsICd4bG0nLCAnY3NwciddLCB0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMucm9vdFByaXZhdGVLZXkpKSB7XG4gICAgICB3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkgPSBwYXJhbXMucm9vdFByaXZhdGVLZXk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG4gICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbjogdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbjogYml0Z29LZXljaGFpbixcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJhY2t1cEtleWNoYWluLnBydikpIHtcbiAgICAgIHJlc3VsdC53YXJuaW5nID0gJ0JlIHN1cmUgdG8gYmFja3VwIHRoZSBiYWNrdXAga2V5Y2hhaW4gLS0gaXQgaXMgbm90IHN0b3JlZCBhbnl3aGVyZSBlbHNlISc7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGRlcml2YXRpb25QYXRoKSkge1xuICAgICAgdXNlcktleWNoYWluLmRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvblBhdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0IHNoYXJlc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBsaXN0U2hhcmVzKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUnKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHdhbGxldCBzaGFyZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBlbmNyeXB0ZWQgc2hhcmluZyBrZXljaGFpbi4gcmVxdWlyZXMgdW5sb2NrIGlmIGtleWNoYWluIGlzIHByZXNlbnQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBnZXQgaW5mb3JtYXRpb24gb25cbiAgICovXG4gIGFzeW5jIGdldFNoYXJlKHBhcmFtczogeyB3YWxsZXRTaGFyZUlkPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gcGFyYW1zLnN0YXRlIC0gdGhlIG5ldyBzdGF0ZSBvZiB0aGUgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVNoYXJlKHBhcmFtczogVXBkYXRlU2hhcmVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZCBhIHdhbGxldCBzaGFyZSBpbnZpdGF0aW9uIGVtYWlsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB3aG9zZSBpbnZpdGlhdGlvbiBzaG91bGQgYmUgcmVzZW50XG4gICAqL1xuICBhc3luYyByZXNlbmRTaGFyZUludml0ZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICBjb25zdCB1cmxQYXJ0cyA9IHBhcmFtcy53YWxsZXRTaGFyZUlkICsgJy9yZXNlbmRlbWFpbCc7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyB1cmxQYXJ0cykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gdXBkYXRlXG4gICAqL1xuICBhc3luYyBjYW5jZWxTaGFyZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmRlbCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlLycgKyBwYXJhbXMud2FsbGV0U2hhcmVJZCkpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhIHdhbGxldCBzaGFyZSwgYWRkaW5nIHRoZSB3YWxsZXQgdG8gdGhlIHVzZXIncyBsaXN0XG4gICAqIE5lZWRzIGEgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCBrZXlcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIGFjY2VwdFxuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJQYXNzd29yZCAtIChyZXF1aXJlZCBpZiBtb3JlIGEga2V5Y2hhaW4gd2FzIHNoYXJlZCkgdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIC0gbmV3IHdhbGxldCBwYXNzcGhyYXNlIGZvciBzYXZpbmcgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBsZWZ0IGJsYW5rIGFuZCBhIHdhbGxldCB3aXRoIG1vcmUgdGhhbiB2aWV3IHBlcm1pc3Npb25zIHdhcyBzaGFyZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHVzZXIncyBsb2dpbiBwYXNzd29yZCBpcyB1c2VkLlxuICAgKiBAcGFyYW0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkUHJ2IC0gc2V0IG9ubHkgaWYgdGhlIHBydiB3YXMgcmVjZWl2ZWQgb3V0LW9mLWJhbmQuXG4gICAqL1xuICBhc3luYyBhY2NlcHRTaGFyZShwYXJhbXM6IEFjY2VwdFNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgWydvdmVycmlkZUVuY3J5cHRlZFBydicsICd1c2VyUGFzc3dvcmQnLCAnbmV3V2FsbGV0UGFzc3BocmFzZSddKTtcblxuICAgIGxldCBlbmNyeXB0ZWRQcnYgPSBwYXJhbXMub3ZlcnJpZGVFbmNyeXB0ZWRQcnY7XG5cbiAgICBjb25zdCB3YWxsZXRTaGFyZSA9IChhd2FpdCB0aGlzLmdldFNoYXJlKHsgd2FsbGV0U2hhcmVJZDogcGFyYW1zLndhbGxldFNoYXJlSWQgfSkpIGFzIGFueTtcblxuICAgIC8vIFJldHVybiByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIGtleWNoYWluIHRvIGRlY3J5cHQsIG9yIGlmIGV4cGxpY2l0IGVuY3J5cHRlZFBydiB3YXMgcHJvdmlkZWRcbiAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluIHx8ICF3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHwgZW5jcnlwdGVkUHJ2KSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyUGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IChhd2FpdCB0aGlzLmJpdGdvLmdldEVDREhLZXljaGFpbigpKSBhcyBhbnk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgdGhlIHNoYXJpbmcga2V5Y2hhaW4sIHdlIGNhbiB3b3JrIG91dCB0aGUgc2VjcmV0IHVzZWQgZm9yIHNoYXJpbmcgdGhlIHdhbGxldCB3aXRoIHVzXG4gICAgc2hhcmluZ0tleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJQYXNzd29yZCxcbiAgICAgIGlucHV0OiBzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICB9KTtcbiAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoXG4gICAgICAvLyBEZXJpdmUga2V5IGJ5IHBhdGggKHdoaWNoIGlzIHVzZWQgYmV0d2VlbiB0aGVzZSAyIHVzZXJzIG9ubHkpXG4gICAgICBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpbi5wcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKSxcbiAgICAgIEJ1ZmZlci5mcm9tKHdhbGxldFNoYXJlLmtleWNoYWluLmZyb21QdWJLZXksICdoZXgnKVxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gWWVzISBXZSBnb3QgdGhlIHNlY3JldCBzdWNjZXNzZnVsbHkgaGVyZSwgbm93IGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2XG4gICAgY29uc3QgZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgIH0pO1xuXG4gICAgLy8gV2Ugd2lsbCBub3cgcmUtZW5jcnlwdCB0aGUgd2FsbGV0IHdpdGggb3VyIG93biBwYXNzd29yZFxuICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlclBhc3N3b3JkO1xuICAgIGVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGlucHV0OiBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsXG4gICAgfSk7XG4gICAgY29uc3QgdXBkYXRlUGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7XG4gICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgIH07XG5cbiAgICBpZiAoZW5jcnlwdGVkUHJ2KSB7XG4gICAgICB1cGRhdGVQYXJhbXMuZW5jcnlwdGVkUHJ2ID0gZW5jcnlwdGVkUHJ2O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVNoYXJlKHVwZGF0ZVBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IGl0cyBJRFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuaWQgd2FsbGV0IGlkXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FsbGV0KHBhcmFtczogR2V0V2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBHZXRXYWxsZXRPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpKTtcblxuICAgIGNvbnN0IHdhbGxldCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHBhcmFtcy5pZCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgd2FsbGV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3YWxsZXQgYnkgaXRzIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3Mgd2FsbGV0IGFkZHJlc3NcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRXYWxsZXRCeUFkZHJlc3MocGFyYW1zOiBHZXRXYWxsZXRCeUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSk7XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCkpO1xuXG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkcmVzcy8nICsgcGFyYW1zLmFkZHJlc3MpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3YWxsZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhbnkgZ2l2ZW4gc3VwcG9ydGVkIGNvaW4sIGdldCB0b3RhbCBiYWxhbmNlcyBmb3IgYWxsIHdhbGxldHMgb2YgdGhhdFxuICAgKiBjb2luIHR5cGUgb24gdGhlIGFjY291bnQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRUb3RhbEJhbGFuY2VzKHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9iYWxhbmNlcycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBUU1Mgb3IgQkxTLURLRyBXYWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVNcGNXYWxsZXQocGFyYW1zOiBHZW5lcmF0ZU1wY1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsOiBwYXJhbXMubGFiZWwsXG4gICAgICBtOiAyLFxuICAgICAgbjogMyxcbiAgICAgIGtleXM6IFtdLFxuICAgICAgaXNDb2xkOiBmYWxzZSxcbiAgICAgIG11bHRpc2lnVHlwZTogcGFyYW1zLm11bHRpc2lnVHlwZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbjogcGFyYW1zLndhbGxldFZlcnNpb24sXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBNUEMgS2V5Y2hhaW5zXG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZU1wYyh7XG4gICAgICBtdWx0aXNpZ1R5cGU6IHBhcmFtcy5tdWx0aXNpZ1R5cGUsXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgYmFja3VwUHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBQcm92aWRlcixcbiAgICB9KTtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGtleWNoYWlucztcbiAgICB3YWxsZXRQYXJhbXMua2V5cyA9IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCBmaW5hbFdhbGxldFBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KHdhbGxldFBhcmFtcywga2V5Y2hhaW5zKTtcbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJhY2t1cEtleWNoYWluLnBydikgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmJhY2t1cFByb3ZpZGVyKSkge1xuICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
|
|
1442
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtREEsc0RBSUM7QUF2REQ7O0dBRUc7QUFDSCxvREFBNEI7QUFDNUIsK0NBQXlDO0FBQ3pDLG1EQUE2QztBQUM3QywwQ0FBNEI7QUFDNUIsaURBQWtEO0FBRWxELG1DQUErQztBQUMvQyxxREFBdUM7QUFHdkMsa0NBQTBDO0FBQzFDLDBDQUF1RTtBQUN2RSxvQ0FBcUU7QUFDckUseUNBMEJvQjtBQUVwQixxQ0FBa0M7QUFFbEMsOENBQXlGO0FBRXpGOztHQUVHO0FBQ0gsU0FBZ0IscUJBQXFCLENBQ25DLE1BQTRGO0lBRTVGLE9BQU8sTUFBTSxDQUFDLFlBQVksS0FBSyxxQkFBcUIsQ0FBQztBQUN2RCxDQUFDO0FBRUQsTUFBYSxPQUFPO0lBSWxCLFlBQVksS0FBZ0IsRUFBRSxRQUFtQjtRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUEyQixFQUFFO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBc0QsRUFBRTtRQUNqRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxD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QUFJLG1CQUFtQixLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQyxJQUFJLGFBQWEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRSxPQUFPLENBQUMsQ0FBQztZQUNYLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBcG9ERCwwQkFvb0RDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQ29pbkZlYXR1cmUgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuaW1wb3J0IHsgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgSUJhc2VDb2luLCBLZXljaGFpbnNUcmlwbGV0LCBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGdldFNoYXJlZFNlY3JldCB9IGZyb20gJy4uL2VjZGgnO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBLZXljaGFpbiwgS2V5SW5kaWNlcyB9IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IGRlY29kZU9yRWxzZSwgcHJvbWlzZVByb3BzLCBSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgQWNjZXB0U2hhcmVPcHRpb25zLFxuICBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0LFxuICBBZGRXYWxsZXRPcHRpb25zLFxuICBCdWxrQWNjZXB0U2hhcmVPcHRpb25zLFxuICBCdWxrQWNjZXB0U2hhcmVSZXNwb25zZSxcbiAgQnVsa1VwZGF0ZVdhbGxldFNoYXJlT3B0aW9ucyxcbiAgQnVsa1VwZGF0ZVdhbGxldFNoYXJlT3B0aW9uc1JlcXVlc3QsXG4gIEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlLFxuICBHZW5lcmF0ZUJhc2VNcGNXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlR29BY2NvdW50V2FsbGV0T3B0aW9uc0NvZGVjLFxuICBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjLFxuICBHZW5lcmF0ZU1wY1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlU01DTXBjV2FsbGV0T3B0aW9ucyxcbiAgR2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICBHZXRXYWxsZXRCeUFkZHJlc3NPcHRpb25zLFxuICBHZXRXYWxsZXRPcHRpb25zLFxuICBHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluLFxuICBJV2FsbGV0cyxcbiAgTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucyxcbiAgTGlzdFdhbGxldE9wdGlvbnMsXG4gIFVwZGF0ZVNoYXJlT3B0aW9ucyxcbiAgV2FsbGV0U2hhcmVzLFxuICBXYWxsZXRXaXRoS2V5Y2hhaW5zLFxufSBmcm9tICcuL2lXYWxsZXRzJztcbmltcG9ydCB7IFdhbGxldFNoYXJlIH0gZnJvbSAnLi9pV2FsbGV0JztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4vd2FsbGV0JztcbmltcG9ydCB7IFRzc1NldHRpbmdzIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVFdm1LZXlSaW5nV2FsbGV0LCB2YWxpZGF0ZUV2bUtleVJpbmdXYWxsZXRQYXJhbXMgfSBmcm9tICcuLi9ldm0vZXZtVXRpbHMnO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgd2FsbGV0IGlzIGEgV2FsbGV0V2l0aEtleWNoYWluc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXYWxsZXRXaXRoS2V5Y2hhaW5zKFxuICB3YWxsZXQ6IFdhbGxldFdpdGhLZXljaGFpbnMgfCBMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpblxuKTogd2FsbGV0IGlzIFdhbGxldFdpdGhLZXljaGFpbnMge1xuICByZXR1cm4gd2FsbGV0LnJlc3BvbnNlVHlwZSA9PT0gJ1dhbGxldFdpdGhLZXljaGFpbnMnO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0cyBpbXBsZW1lbnRzIElXYWxsZXRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbikge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IElEIChwcm94eSBmb3IgZ2V0V2FsbGV0KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXQocGFyYW1zOiBHZXRXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHJldHVybiB0aGlzLmdldFdhbGxldChwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYSB1c2VyJ3Mgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RXYWxsZXRPcHRpb25zICYgeyBlbnRlcnByaXNlPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8eyB3YWxsZXRzOiBXYWxsZXRbXSB9PiB7XG4gICAgaWYgKHBhcmFtcy5za2lwICYmIHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBza2lwIGFuZCBwcmV2SWQnKTtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IChhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldCcpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpKSBhcyBhbnk7XG4gICAgYm9keS53YWxsZXRzID0gYm9keS53YWxsZXRzLm1hcCgodykgPT4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3KSk7XG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cblxuICAvKipcbiAgICogYWRkXG4gICAqIEFkZCBhIG5ldyB3YWxsZXQgKGFkdmFuY2VkIG1vZGUpLlxuICAgKiBUaGlzIGFsbG93cyB5b3UgdG8gbWFudWFsbHkgc3VibWl0IHRoZSBrZXlzLCB0eXBlLCBtIGFuZCBuIG9mIHRoZSB3YWxsZXRcbiAgICogUGFyYW1ldGVycyBpbmNsdWRlOlxuICAgKiAgICBcImxhYmVsXCI6IGxhYmVsIG9mIHRoZSB3YWxsZXQgdG8gYmUgc2hvd24gaW4gVUlcbiAgICogICAgXCJtXCI6IG51bWJlciBvZiBrZXlzIHJlcXVpcmVkIHRvIHVubG9jayB3YWxsZXQgKDIpXG4gICAqICAgIFwiblwiOiBudW1iZXIgb2Yga2V5cyBhdmFpbGFibGUgb24gdGhlIHdhbGxldCAoMylcbiAgICogICAgXCJrZXlzXCI6IGFycmF5IG9mIGtleWNoYWluIGlkc1xuICAgKi9cbiAgYXN5bmMgYWRkKHBhcmFtczogQWRkV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbGFiZWwnLCAnZW50ZXJwcmlzZScsICd0eXBlJ10pO1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMubGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBsYWJlbCcpO1xuICAgIH1cblxuICAgIHZhbGlkYXRlRXZtS2V5UmluZ1dhbGxldFBhcmFtcyhwYXJhbXMsIHRoaXMuYmFzZUNvaW4pO1xuXG4gICAgaWYgKCFwYXJhbXMuZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkICYmIHBhcmFtcy50eXBlICE9PSAnY3VzdG9kaWFsJykge1xuICAgICAgLy8gbm8gbmVlZCB0byBwYXNzIGtleXMgZm9yIChzaW5nbGUpIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMua2V5cykgPT09IGZhbHNlIHx8ICFfLmlzTnVtYmVyKHBhcmFtcy5tKSB8fCAhXy5pc051bWJlcihwYXJhbXMubikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSB0eXBlcyBvZiBtdWx0aXNpZ1xuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzVmFsaWRNb2ZOU2V0dXAocGFyYW1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIG11bHRpLXNpZyB0eXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5nYXNQcmljZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGdhc1ByaWNlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy53YWxsZXRWZXJzaW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLndhbGxldFZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3Igd2FsbGV0VmVyc2lvbiAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScgJiYgcGFyYW1zLndhbGxldFZlcnNpb24gPT09IDMpIHtcbiAgICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAgIC5yZXN1bHQoKTtcbiAgICAgICAgY29uc3QgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5tdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgICBpZiAobXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJykge1xuICAgICAgICAgIHBhcmFtcy53YWxsZXRWZXJzaW9uID0gNTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMudGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy50YWdzKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgdGFncyAtIGFycmF5IGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5jbGllbnRGbGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5jbGllbnRGbGFncykgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGNsaWVudEZsYWdzIC0gYXJyYXkgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmlzQ29sZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmlzQ29sZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDb2xkIC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaXNDdXN0b2RpYWwgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pc0N1c3RvZGlhbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDdXN0b2RpYWwgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzICYmICghXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykgfHwgIXRoaXMuYmFzZUNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLmFkZHJlc3MpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhZGRyZXNzIC0gdmFsaWQgYWRkcmVzcyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVMaWdodG5pbmdXYWxsZXQocGFyYW1zOiBHZW5lcmF0ZUxpZ2h0bmluZ1dhbGxldE9wdGlvbnMpOiBQcm9taXNlPExpZ2h0bmluZ1dhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGNvbnN0IHsgbGFiZWwsIHBhc3NwaHJhc2UsIGVudGVycHJpc2UsIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsIHN1YlR5cGUsIGxpZ2h0bmluZ1Byb3ZpZGVyLCBlbmNyeXB0aW9uVmVyc2lvbiB9ID1cbiAgICAgIHBhcmFtcztcblxuICAgIC8vIFRPRE8gQlRDLTE4OTk6IG9ubHkgdXNlckF1dGgga2V5IGlzIHJlcXVpcmVkIGZvciBjdXN0b2RpYWwgbGlnaHRuaW5nIHdhbGxldC4gYWxsIDMga2V5cyBhcmUgcmVxdWlyZWQgZm9yIHNlbGYgY3VzdG9kaWFsIGxpZ2h0bmluZy5cbiAgICAvLyB0byBhdm9pZCBjaGFuZ2luZyB0aGUgcGxhdGZvcm0gZm9yIGN1c3RvZGlhbCBmbG93LCBsZXQgdXMgYWxsIDMga2V5cyBib3RoIHdhbGxldCB0eXBlcy5cbiAgICBjb25zdCBrZXljaGFpblByb21pc2VzID0gKFt1bmRlZmluZWQsICd1c2VyQXV0aCcsICdub2RlQXV0aCddIGFzIGNvbnN0KS5tYXAoKHB1cnBvc2UpID0+IHtcbiAgICAgIHJldHVybiBhc3luYyAoKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBjb25zdCBrZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICAgIGNvbnN0IGtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICAgICAgcHViOiBrZXljaGFpbi5wdWIsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgICAgIGlucHV0OiBrZXljaGFpbi5wcnYsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHB1cnBvc2UgPT09IHVuZGVmaW5lZCA/IHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29pblNwZWNpZmljOiBwdXJwb3NlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiB7IHB1cnBvc2UgfSB9LFxuICAgICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChrZXljaGFpblBhcmFtcyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIHVzZXJBdXRoS2V5Y2hhaW4sIG5vZGVBdXRoS2V5Y2hhaW4gfSA9IGF3YWl0IHByb21pc2VQcm9wcyh7XG4gICAgICB1c2VyS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMF0oKSxcbiAgICAgIHVzZXJBdXRoS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMV0oKSxcbiAgICAgIG5vZGVBdXRoS2V5Y2hhaW46IGtleWNoYWluUHJvbWlzZXNbMl0oKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgbTogMSxcbiAgICAgIG46IDEsXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIHN1YlR5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZF0sXG4gICAgICBjb2luU3BlY2lmaWM6IHsgW3RoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKV06IHsga2V5czogW3VzZXJBdXRoS2V5Y2hhaW4uaWQsIG5vZGVBdXRoS2V5Y2hhaW4uaWRdIH0gfSxcbiAgICAgIGxpZ2h0bmluZ1Byb3ZpZGVyLFxuICAgIH07XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIHVzZXJBdXRoS2V5Y2hhaW4sXG4gICAgICBub2RlQXV0aEtleWNoYWluLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnTGlnaHRuaW5nV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIEdvIEFjY291bnQgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMgR2VuZXJhdGVHb0FjY291bnRXYWxsZXRPcHRpb25zXG4gICAqIEByZXR1cm5zIFByb21pc2U8R29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbj5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVHb0FjY291bnRXYWxsZXQoXG4gICAgcGFyYW1zOiBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNcbiAgKTogUHJvbWlzZTxHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCB7IGxhYmVsLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBwYXNzY29kZUVuY3J5cHRpb25Db2RlLCBlbmNyeXB0aW9uVmVyc2lvbiB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3Qga2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuXG4gICAgY29uc3Qga2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHB1Yjoga2V5Y2hhaW4ucHViLFxuICAgICAgZW5jcnlwdGVkUHJ2OiBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICBpbnB1dDoga2V5Y2hhaW4ucHJ2LFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIH0pLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAga2V5VHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgIH07XG5cbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZChrZXljaGFpblBhcmFtcyk7XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDEsXG4gICAgICBuOiAxLFxuICAgICAgdHlwZTogJ3RyYWRpbmcnLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIGtleXM6IFt1c2VyS2V5Y2hhaW4uaWRdLFxuICAgIH07XG5cbiAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IEdvQWNjb3VudFdhbGxldFdpdGhVc2VyS2V5Y2hhaW4gPSB7XG4gICAgICB3YWxsZXQsXG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICByZXNwb25zZVR5cGU6ICdHb0FjY291bnRXYWxsZXRXaXRoVXNlcktleWNoYWluJyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdhcm5pbmcgaWYgdGhlIHVzZXIga2V5Y2hhaW4gaGFzIGFuIGVuY3J5cHRlZCBwcml2YXRlIGtleVxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIHVzZXIga2V5Y2hhaW4gLS0gaXQgaXMgbm90IHN0b3JlZCBhbnl3aGVyZSBlbHNlISc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyB3YWxsZXRcbiAgICogMS4gQ3JlYXRlcyB0aGUgdXNlciBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4gICAqIDIuIElmIG5vIHB1YiB3YXMgcHJvdmlkZWQsIGNyZWF0ZXMgdGhlIGJhY2t1cCBrZXljaGFpbiBsb2NhbGx5IG9uIHRoZSBjbGllbnQsIGFuZCBlbmNyeXB0cyBpdCB3aXRoIHRoZSBwcm92aWRlZCBwYXNzcGhyYXNlXG4gICAqIDMuIFVwbG9hZHMgdGhlIGVuY3J5cHRlZCB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zIHRvIEJpdEdvXG4gICAqIDQuIENyZWF0ZXMgdGhlIEJpdEdvIGtleSBvbiB0aGUgc2VydmljZVxuICAgKiA1LiBDcmVhdGVzIHRoZSB3YWxsZXQgb24gQml0R28gd2l0aCB0aGUgMyBwdWJsaWMga2V5cyBhYm92ZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMubGFiZWwgTGFiZWwgZm9yIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wYXNzcGhyYXNlIFBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBlbmNyeXB0IHRoZSB1c2VyIGFuZCBiYWNrdXAga2V5Y2hhaW5zXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlcktleSBVc2VyIHhwdWJcbiAgICogQHBhcmFtIHBhcmFtcy5iYWNrdXBYcHViIEJhY2t1cCB4cHViXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyXG4gICAqIEBwYXJhbSBwYXJhbXMuZW50ZXJwcmlzZSB0aGUgZW50ZXJwcmlzZUlkXG4gICAqIEBwYXJhbSBwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgb3B0aW9uYWwgdGhpcyBpcyBhIHJlY292ZXJ5IGNvZGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSBvcmlnaW5hbCBwYXNzcGhyYXNlIGluIGEgcmVjb3ZlcnkgY2FzZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB1c2VyIG11c3QgZ2VuZXJhdGUgYW5kIGtlZXAgdGhlIGVuY3J5cHRlZCBvcmlnaW5hbCBwYXNzcGhyYXNlIHNhZmUgd2hpbGUgdGhpcyBjb2RlIGlzIHN0b3JlZCBvbiBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCBvcHRpb25hbCBzZWVkIGZvciBTTUMgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zLmdhc1ByaWNlXG4gICAqIEBwYXJhbSBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0VmVyc2lvblxuICAgKiBAcGFyYW0gcGFyYW1zLm11bHRpc2lnVHlwZSBvcHRpb25hbCBtdWx0aXNpZyB0eXBlLCAnb25jaGFpbicgb3IgJ3Rzcycgb3IgJ2Jsc2RrZyc7IGlmIGFic2VudCwgd2Ugd2lsbCBkZWZlciB0byB0aGUgY29pbidzIGRlZmF1bHQgdHlwZVxuICAgKiBAcGFyYW0gcGFyYW1zLmlzRGlzdHJpYnV0ZWRDdXN0b2R5IG9wdGlvbmFsIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgYml0Z28ga2V5LiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSB3YW50IHRvIGNyZWF0ZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZGlzdHJpYnV0ZWQgY3VzdG9keSB3YWxsZXQuIElmIHByb3ZpZGVkLCB5b3UgbXVzdCBoYXZlIHRoZSBlbnRlcnByaXNlIGxpY2Vuc2UgYW5kIHBhc3MgaW5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgcGFyYW1zLmVudGVycHJpc2VgIGludG8gYGdlbmVyYXRlV2FsbGV0YCBhcyB3ZWxsLlxuICAgKiBAcGFyYW0gcGFyYW1zLnR5cGUgb3B0aW9uYWwgd2FsbGV0IHR5cGUsICdob3QnIG9yICdjb2xkJyBvciAnY3VzdG9kaWFsJzsgaWYgYWJzZW50LCB3ZSB3aWxsIGRlZmVyIHRvICdob3QnXG4gICAqIEBwYXJhbSBwYXJhbXMuYml0Z29LZXlJZCBvcHRpb25hbCBiaXRnbyBrZXkgaWQgZm9yIFNNQyBUU1Mgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbW1vbktleWNoYWluIG9wdGlvbmFsIGNvbW1vbiBrZXljaGFpbiBmb3IgU01DIFRTUyB3YWxsZXRzXG4gICAqXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVXYWxsZXQoXG4gICAgcGFyYW1zOiBHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnMgfCBMaWdodG5pbmdXYWxsZXRXaXRoS2V5Y2hhaW5zIHwgR29BY2NvdW50V2FsbGV0V2l0aFVzZXJLZXljaGFpbj4ge1xuICAgIC8vIEFzc2lnbiB0aGUgZGVmYXVsdCBtdWx0aVNpZyB0eXBlIHZhbHVlIGJhc2VkIG9uIHRoZSBjb2luXG4gICAgaWYgKCFwYXJhbXMubXVsdGlzaWdUeXBlKSB7XG4gICAgICBwYXJhbXMubXVsdGlzaWdUeXBlID0gdGhpcy5iYXNlQ29pbi5nZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICdsbmJ0YycpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBkZWNvZGVPckVsc2UoXG4gICAgICAgIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjLm5hbWUsXG4gICAgICAgIEdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0T3B0aW9uc0NvZGVjLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIChlcnJvcnMpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVycm9yKHMpIHBhcnNpbmcgZ2VuZXJhdGUgbGlnaHRuaW5nIHdhbGxldCByZXF1ZXN0IHBhcmFtczogJHtlcnJvcnN9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHdhbGxldERhdGEgPSBhd2FpdCB0aGlzLmdlbmVyYXRlTGlnaHRuaW5nV2FsbGV0KG9wdGlvbnMpO1xuICAgICAgd2FsbGV0RGF0YS5lbmNyeXB0ZWRXYWxsZXRQYXNzcGhyYXNlID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICBpbnB1dDogb3B0aW9ucy5wYXNzcGhyYXNlLFxuICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogb3B0aW9ucy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHdhbGxldERhdGE7XG4gICAgfVxuXG4gICAgLy8gR28gQWNjb3VudCB3YWxsZXQgZ2VuZXJhdGlvblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnb2ZjJyAmJiBwYXJhbXMudHlwZSA9PT0gJ3RyYWRpbmcnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gZGVjb2RlT3JFbHNlKFxuICAgICAgICBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNDb2RlYy5uYW1lLFxuICAgICAgICBHZW5lcmF0ZUdvQWNjb3VudFdhbGxldE9wdGlvbnNDb2RlYyxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICAoZXJyb3JzKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlcnJvcihzKSBwYXJzaW5nIGdlbmVyYXRlIGdvIGFjY291bnQgcmVxdWVzdCBwYXJhbXM6ICR7ZXJyb3JzfWApO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUdvQWNjb3VudFdhbGxldChvcHRpb25zKTtcbiAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgICAgaW5wdXQ6IG9wdGlvbnMucGFzc3BocmFzZSxcbiAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IG9wdGlvbnMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB3YWxsZXREYXRhO1xuICAgIH1cblxuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnbGFiZWwnXSwgWydwYXNzcGhyYXNlJywgJ3VzZXJLZXknLCAnYmFja3VwWHB1YiddKTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5sYWJlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGxhYmVsJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlID0gJ2hvdCcsIGxhYmVsLCBwYXNzcGhyYXNlLCBlbnRlcnByaXNlLCBpc0Rpc3RyaWJ1dGVkQ3VzdG9keSwgZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgaXNUc3MgPSBwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLnN1cHBvcnRzVHNzKCk7XG4gICAgY29uc3QgY2FuRW5jcnlwdCA9ICEhcGFzc3BocmFzZSAmJiB0eXBlb2YgcGFzc3BocmFzZSA9PT0gJ3N0cmluZyc7XG5cbiAgICBpZiAodmFsaWRhdGVFdm1LZXlSaW5nV2FsbGV0UGFyYW1zKHBhcmFtcywgdGhpcy5iYXNlQ29pbikpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjcmVhdGVFdm1LZXlSaW5nV2FsbGV0KHtcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIGV2bUtleVJpbmdSZWZlcmVuY2VXYWxsZXRJZDogZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkISxcbiAgICAgICAgYml0Z286IHRoaXMuYml0Z28sXG4gICAgICAgIGJhc2VDb2luOiB0aGlzLmJhc2VDb2luLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbXSxcbiAgICAgIHR5cGU6ICEhcGFyYW1zLnVzZXJLZXkgJiYgcGFyYW1zLm11bHRpc2lnVHlwZSAhPT0gJ29uY2hhaW4nID8gJ2NvbGQnIDogdHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChlbnRlcnByaXNlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGVudGVycHJpc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRlcnByaXNlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZW50ZXJwcmlzZSA9IGVudGVycHJpc2U7XG4gICAgfVxuXG4gICAgLy8gRVZNIFRTUyB3YWxsZXRzIG11c3QgdXNlIHdhbGxldCB2ZXJzaW9uIDMsIDUgYW5kIDZcbiAgICBpZiAoXG4gICAgICBpc1RzcyAmJlxuICAgICAgdGhpcy5iYXNlQ29pbi5pc0VWTSgpICYmXG4gICAgICAhZXZtS2V5UmluZ1JlZmVyZW5jZVdhbGxldElkICYmXG4gICAgICAhKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSAzIHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFVk0gVFNTIHdhbGxldHMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB3YWxsZXQgdmVyc2lvbiAzLCA1IGFuZCA2Jyk7XG4gICAgfVxuXG4gICAgaWYgKGlzVHNzKSB7XG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA1IHx8IHBhcmFtcy53YWxsZXRWZXJzaW9uID09PSA2KSAmJlxuICAgICAgICAhdGhpcy5iYXNlQ29pbi5nZXRDb25maWcoKS5mZWF0dXJlcy5pbmNsdWRlcyhDb2luRmVhdHVyZS5NUENWMilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBNUEN2MiBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChlbnRlcnByaXNlLCAnZW50ZXJwcmlzZSBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldCcpO1xuXG4gICAgICBpZiAodHlwZSA9PT0gJ2NvbGQnKSB7XG4gICAgICAgIC8vIHZhbGlkYXRlXG4gICAgICAgIGFzc2VydChwYXJhbXMuYml0Z29LZXlJZCwgJ2JpdGdvS2V5SWQgaXMgcmVxdWlyZWQgZm9yIFNNQyBUU1Mgd2FsbGV0Jyk7XG4gICAgICAgIGFzc2VydChwYXJhbXMuY29tbW9uS2V5Y2hhaW4sICdjb21tb25LZXljaGFpbiBpcyByZXF1aXJlZCBmb3IgU01DIFRTUyB3YWxsZXQnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTTUNNcGNXYWxsZXQoe1xuICAgICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgZW50ZXJwcmlzZSxcbiAgICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgICBiaXRnb0tleUlkOiBwYXJhbXMuYml0Z29LZXlJZCxcbiAgICAgICAgICBjb21tb25LZXljaGFpbjogcGFyYW1zLmNvbW1vbktleWNoYWluLFxuICAgICAgICAgIGNvbGREZXJpdmF0aW9uU2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUN1c3RvZGlhbE1wY1dhbGxldCh7XG4gICAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICAgIHdhbGxldFZlcnNpb246IHBhcmFtcy53YWxsZXRWZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsICdjYW5ub3QgZ2VuZXJhdGUgVFNTIGtleXMgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICBjb25zdCB3YWxsZXREYXRhID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU1wY1dhbGxldCh7XG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBwYXNzcGhyYXNlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICB3YWxsZXRWZXJzaW9uOiBwYXJhbXMud2FsbGV0VmVyc2lvbixcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIH0pO1xuICAgICAgaWYgKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSB7XG4gICAgICAgIHdhbGxldERhdGEuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgICAgICBpbnB1dDogcGFzc3BocmFzZSxcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2FsbGV0RGF0YTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZGlzdHJpYnV0ZWQgY3VzdG9keVxuICAgIGlmIChpc0Rpc3RyaWJ1dGVkQ3VzdG9keSkge1xuICAgICAgaWYgKCFlbnRlcnByaXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGVudGVycHJpc2Ugd2hlbiBjcmVhdGluZyBkaXN0cmlidXRlZCBjdXN0b2R5IHdhbGxldCcpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eXBlIHx8IHR5cGUgIT09ICdjb2xkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rpc3RyaWJ1dGVkIGN1c3RvZHkgd2FsbGV0cyBtdXN0IGJlIHR5cGU6IGNvbGQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYXNCYWNrdXBYcHViID0gISFwYXJhbXMuYmFja3VwWHB1YjtcbiAgICBjb25zdCBoYXNCYWNrdXBYcHViUHJvdmlkZXIgPSAhIXBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXI7XG4gICAgaWYgKGhhc0JhY2t1cFhwdWIgJiYgaGFzQmFja3VwWHB1YlByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwcm92aWRlIG1vcmUgdGhhbiBvbmUgYmFja3VwWHB1YiBvciBiYWNrdXBYcHViUHJvdmlkZXIgZmxhZycpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ2FzUHJpY2UgJiYgcGFyYW1zLmVpcDE1NTkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCB1c2UgYm90aCBlaXAxNTU5IGFuZCBnYXNQcmljZSB2YWx1ZXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zID0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5nYXNQcmljZSkpIHtcbiAgICAgIGNvbnN0IGdhc1ByaWNlQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5nYXNQcmljZSk7XG4gICAgICBpZiAoZ2FzUHJpY2VCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBnYXMgcHJpY2UgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2VCTi50b1N0cmluZygpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZWlwMTU1OSkgJiYgIV8uaXNFbXB0eShwYXJhbXMuZWlwMTU1OSkpIHtcbiAgICAgIGNvbnN0IG1heEZlZVBlckdhc0JOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZWlwMTU1OS5tYXhGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heEZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCBmZWUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXIgb3IgbnVtYmVyIGFzIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4UHJpb3JpdHlGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4UHJpb3JpdHlGZWVQZXJHYXMpO1xuICAgICAgaWYgKG1heFByaW9yaXR5RmVlUGVyR2FzQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpb3JpdHkgZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5laXAxNTU5ID0ge1xuICAgICAgICBtYXhGZWVQZXJHYXM6IG1heEZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBtYXhQcmlvcml0eUZlZVBlckdhc0JOLnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZGlzYWJsZUtSU0VtYWlsKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUtSU0VtYWlsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGlzYWJsZUtSU0VtYWlsIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLmRpc2FibGVLUlNFbWFpbCA9IHBhcmFtcy5kaXNhYmxlS1JTRW1haWw7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy53YWxsZXRWZXJzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0VmVyc2lvbiBwcm92aWRlZCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLndhbGxldFZlcnNpb24gPSBwYXJhbXMud2FsbGV0VmVyc2lvbjtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgZWFjaCBrcnNTcGVjaWZpYyBwYXJhbSBpcyBlaXRoZXIgYSBzdHJpbmcsIGJvb2xlYW4sIG9yIG51bWJlclxuICAgIGNvbnN0IHsga3JzU3BlY2lmaWMgfSA9IHBhcmFtcztcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoa3JzU3BlY2lmaWMpKSB7XG4gICAgICBPYmplY3Qua2V5cyhrcnNTcGVjaWZpYykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IGtyc1NwZWNpZmljW2tleV07XG4gICAgICAgIGlmICghXy5pc0Jvb2xlYW4odmFsKSAmJiAhXy5pc1N0cmluZyh2YWwpICYmICFfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tyc1NwZWNpZmljIG9iamVjdCBjb250YWlucyBpbGxlZ2FsIHZhbHVlcy4gdmFsdWVzIG11c3QgYmUgc3RyaW5ncywgYm9vbGVhbnMsIG9yIG51bWJlcnMnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBpZiAocGFyYW1zLnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIChwYXJhbXMubXVsdGlzaWdUeXBlID8/ICdvbmNoYWluJykgPT09ICdvbmNoYWluJykge1xuICAgICAgLy8gZm9yIGN1c3RvZGlhbCBtdWx0aXNpZywgd2hlbiB0aGUgd2FsbGV0IGlzIGNyZWF0ZWQgb24gdGhlIHBsYXRmb3Igc2lkZSwgdGhlIGtleXMgYXJlIG5vdCBuZWVkZWRcbiAgICAgIHdhbGxldFBhcmFtcy5uID0gdW5kZWZpbmVkO1xuICAgICAgd2FsbGV0UGFyYW1zLm0gPSB1bmRlZmluZWQ7XG4gICAgICB3YWxsZXRQYXJhbXMua2V5cyA9IHVuZGVmaW5lZDtcbiAgICAgIHdhbGxldFBhcmFtcy5rZXlTaWduYXR1cmVzID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBuZXdXYWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvYWRkJykpLnNlbmQod2FsbGV0UGFyYW1zKS5yZXN1bHQoKTsgLy8gcmV0dXJucyB0aGUgaWRzXG5cbiAgICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IG5ld1dhbGxldC5rZXlzW0tleUluZGljZXMuVVNFUl0sIHJlcUlkIH0pO1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBuZXdXYWxsZXQua2V5c1tLZXlJbmRpY2VzLkJBQ0tVUF0sIHJlcUlkIH0pO1xuICAgICAgY29uc3QgYml0Z29LZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IG5ld1dhbGxldC5rZXlzW0tleUluZGljZXMuQklUR09dLCByZXFJZCB9KTtcblxuICAgICAgY29uc3QgW3VzZXJLZXksIGJpdGdvS2V5LCBiYWNrdXBLZXldID0gYXdhaXQgUHJvbWlzZS5hbGwoW3VzZXJLZXljaGFpbiwgYml0Z29LZXljaGFpbiwgYmFja3VwS2V5Y2hhaW5dKTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXljaGFpbjogYml0Z29LZXksXG4gICAgICAgIGJpdGdvS2V5Y2hhaW46IGJhY2t1cEtleSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gYXN5bmMgKCk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgbGV0IHVzZXJLZXljaGFpblBhcmFtcztcbiAgICAgICAgbGV0IHVzZXJLZXljaGFpbjtcbiAgICAgICAgLy8gVXNlciBwcm92aWRlZCB1c2VyIGtleVxuICAgICAgICBpZiAocGFyYW1zLnVzZXJLZXkpIHtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW4gPSB7IHB1YjogcGFyYW1zLnVzZXJLZXkgfTtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMgPSB1c2VyS2V5Y2hhaW47XG4gICAgICAgICAgaWYgKHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgZGVyaXZhdGlvbiA9IHRoaXMuYmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQoe1xuICAgICAgICAgICAgICBrZXk6IHBhcmFtcy51c2VyS2V5LFxuICAgICAgICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb24uZGVyaXZhdGlvblBhdGg7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW4ucHViID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCA9IHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2FuRW5jcnlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgdXNlciBrZXlwYWlyIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHVzZXIga2V5LlxuICAgICAgICAgIHVzZXJLZXljaGFpbiA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlKCk7XG4gICAgICAgICAgdXNlcktleWNoYWluLmVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgICAgaW5wdXQ6IHVzZXJLZXljaGFpbi5wcnYsXG4gICAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHVzZXJLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgICAgICAgIHB1YjogdXNlcktleWNoYWluLnB1YixcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogdXNlcktleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIElmIFdlYkF1dGhuIGluZm8gaXMgcHJvdmlkZWQsIHN0b3JlIGFuIGFkZGl0aW9uYWwgY29weSBvZiB0aGUgcHJpdmF0ZSBrZXkgZW5jcnlwdGVkXG4gICAgICAgICAgLy8gd2l0aCB0aGUgUFJGLWRlcml2ZWQgcGFzc3BocmFzZSBzbyB0aGUgYXV0aGVudGljYXRvciBjYW4gbGF0ZXIgZGVjcnlwdCBpdC5cbiAgICAgICAgICBpZiAocGFyYW1zLndlYmF1dGhuSW5mbyAmJiB1c2VyS2V5Y2hhaW4ucHJ2KSB7XG4gICAgICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMud2ViYXV0aG5EZXZpY2VzID0gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3RwRGV2aWNlSWQ6IHBhcmFtcy53ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgICAgICAgICAgcHJmU2FsdDogcGFyYW1zLndlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53ZWJhdXRobkluZm8ucGFzc3BocmFzZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiB1c2VyS2V5Y2hhaW4ucHJ2LFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zLnJlcUlkID0gcmVxSWQ7XG4gICAgICAgIGNvbnN0IG5ld1VzZXJLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHVzZXJLZXljaGFpblBhcmFtcyk7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZCh7fSwgbmV3VXNlcktleWNoYWluLCB1c2VyS2V5Y2hhaW4pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gYXN5bmMgKCk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIpIHtcbiAgICAgICAgICAvLyBJZiByZXF1ZXN0ZWQsIHVzZSBhIEtSUyBvciBiYWNrdXAga2V5IHByb3ZpZGVyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlQmFja3VwKHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyIHx8ICdkZWZhdWx0Uk1HQmFja3VwUHJvdmlkZXInLFxuICAgICAgICAgICAgZGlzYWJsZUtSU0VtYWlsOiBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsLFxuICAgICAgICAgICAga3JzU3BlY2lmaWM6IHBhcmFtcy5rcnNTcGVjaWZpYyxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKSxcbiAgICAgICAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlciBwcm92aWRlZCBiYWNrdXAgeHB1YlxuICAgICAgICBpZiAocGFyYW1zLmJhY2t1cFhwdWIpIHtcbiAgICAgICAgICAvLyB1c2VyIHByb3ZpZGVkIGJhY2t1cCBldGhlcmV1bSBhZGRyZXNzXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHtcbiAgICAgICAgICAgIHB1YjogcGFyYW1zLmJhY2t1cFhwdWIsXG4gICAgICAgICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjYW5FbmNyeXB0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBnZW5lcmF0ZSBiYWNrdXAga2V5cGFpciB3aXRob3V0IHBhc3NwaHJhc2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm8gcHJvdmlkZWQgYmFja3VwIHhwdWIgb3IgYWRkcmVzcywgc28gZGVmYXVsdCB0byBjcmVhdGluZyBvbmUgaGVyZVxuICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJhY2t1cCh7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9OiBLZXljaGFpbnNUcmlwbGV0ID0gYXdhaXQgcHJvbWlzZVByb3BzKHtcbiAgICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiBiYWNrdXBLZXljaGFpblByb21pc2UoKSxcbiAgICAgICAgYml0Z29LZXljaGFpbjogdGhpcy5iYXNlQ29pblxuICAgICAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgICAgIC5jcmVhdGVCaXRHbyh7IGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLCByZXFJZCwgaXNEaXN0cmlidXRlZEN1c3RvZHk6IHBhcmFtcy5pc0Rpc3RyaWJ1dGVkQ3VzdG9keSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICB3YWxsZXRQYXJhbXMua2V5cyA9IFt1c2VyS2V5Y2hhaW4uaWQsIGJhY2t1cEtleWNoYWluLmlkLCBiaXRnb0tleWNoYWluLmlkXTtcblxuICAgICAgY29uc3QgeyBwcnYgfSA9IHVzZXJLZXljaGFpbjtcbiAgICAgIGlmIChfLmlzU3RyaW5nKHBydikpIHtcbiAgICAgICAgYXNzZXJ0KGJhY2t1cEtleWNoYWluLnB1Yik7XG4gICAgICAgIGFzc2VydChiaXRnb0tleWNoYWluLnB1Yik7XG4gICAgICAgIHdhbGxldFBhcmFtcy5rZXlTaWduYXR1cmVzID0ge1xuICAgICAgICAgIGJhY2t1cDogKGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnYgfSwgYmFja3VwS2V5Y2hhaW4ucHViKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGJpdGdvOiAoYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydiB9LCBiaXRnb0tleWNoYWluLnB1YikpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluYWxXYWxsZXRQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldCh3YWxsZXRQYXJhbXMsIGtleWNoYWlucyk7XG5cbiAgICAgIGlmIChfLmluY2x1ZGVzKFsneHJwJywgJ3hsbScsICdjc3ByJ10sIHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5yb290UHJpdmF0ZUtleSkpIHtcbiAgICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5ID0gcGFyYW1zLnJvb3RQcml2YXRlS2V5O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5Y2hhaW4sXG4gICAgICAgIGJhY2t1cEtleWNoYWluOiBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbjogYml0Z29LZXljaGFpbixcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnV2FsbGV0V2l0aEtleWNoYWlucycsXG4gICAgICB9O1xuXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFja3VwS2V5Y2hhaW4ucHJ2KSkge1xuICAgICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgYmFja3VwIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgICAgfVxuXG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVyaXZhdGlvblBhdGgpKSB7XG4gICAgICAgIHVzZXJLZXljaGFpbi5kZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb25QYXRoO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FuRW5jcnlwdCAmJiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSkge1xuICAgICAgICByZXN1bHQuZW5jcnlwdGVkV2FsbGV0UGFzc3BocmFzZSA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgICAgICBpbnB1dDogcGFzc3BocmFzZSxcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHVzZXIncyB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZScpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB1c2VyJ3Mgd2FsbGV0IHNoYXJlcyB2MlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXYWxsZXRTaGFyZXM+fVxuICAgKi9cbiAgYXN5bmMgbGlzdFNoYXJlc1YyKCk6IFByb21pc2U8V2FsbGV0U2hhcmVzPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmVzJywgMikpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB3YWxsZXQgc2hhcmUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNoYXJpbmcga2V5Y2hhaW4uIHJlcXVpcmVzIHVubG9jayBpZiBrZXljaGFpbiBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gZ2V0IGluZm9ybWF0aW9uIG9uXG4gICAqL1xuICBhc3luYyBnZXRTaGFyZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHBhcmFtcy5zdGF0ZSAtIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyB1cGRhdGVTaGFyZShwYXJhbXM6IFVwZGF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWxrIGFjY2VwdCB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXMgQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1bGtBY2NlcHRTaGFyZVJlc3BvbnNlPn1cbiAgICovXG4gIGFzeW5jIGJ1bGtBY2NlcHRTaGFyZVJlcXVlc3QocGFyYW1zOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10pOiBQcm9taXNlPEJ1bGtBY2NlcHRTaGFyZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYnVsa0FjY2VwdFNoYXJlUmVxdWVzdFdpdGhSZXRyeShwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWxrQWNjZXB0U2hhcmVSZXF1ZXN0V2l0aFJldHJ5KHBhcmFtczogQWNjZXB0U2hhcmVPcHRpb25zUmVxdWVzdFtdKTogUHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT4ge1xuICAgIC8vIFNlcnZlciBoYXMgYSBsaW1pdCBvZiBhcHByb3hpbWF0ZWx5IDFNQiBmb3IgcGF5bG9hZCBzaXplXG4gICAgbGV0IE1BWF9QQVlMT0FEX1NJWkUgPSA5NTAwMDA7IC8vIH45NTBLQiB0byBsZWF2ZSBzb21lIGJ1ZmZlclxuXG4gICAgLy8gRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIGEgcGF5bG9hZFxuICAgIGNvbnN0IGNhbGN1bGF0ZVBheWxvYWRTaXplID0gKGl0ZW1zOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10pOiBudW1iZXIgPT4ge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KHsga2V5c0ZvcldhbGxldFNoYXJlczogaXRlbXMgfSksICd1dGY4Jyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gW107XG4gICAgY29uc3QgcmVtYWluaW5nUGFyYW1zID0gWy4uLnBhcmFtc107XG5cbiAgICB3aGlsZSAocmVtYWluaW5nUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEJ1aWxkIG9wdGltYWwgYmF0Y2ggYnkgYWRkaW5nIGl0ZW1zIHVudGlsIHdlIHJlYWNoIHNpemUgbGltaXRcbiAgICAgIGNvbnN0IGJhdGNoOiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0W10gPSBbXTtcbiAgICAgIC8vIFN0YXJ0IHdpdGggZW1wdHkgYmF0Y2hcblxuICAgICAgLy8gQWRkIGl0ZW1zIG9uZSBieSBvbmUgd2hpbGUgbW9uaXRvcmluZyBwYXlsb2FkIHNpemVcbiAgICAgIHdoaWxlIChyZW1haW5pbmdQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBUZXN0IGFkZGluZyB0aGUgbmV4dCBpdGVtXG4gICAgICAgIGNvbnN0IHRlc3RCYXRjaCA9IFsuLi5iYXRjaCwgcmVtYWluaW5nUGFyYW1zWzBdXTtcbiAgICAgICAgY29uc3QgdGVzdFNpemUgPSBjYWxjdWxhdGVQYXlsb2FkU2l6ZSh0ZXN0QmF0Y2gpO1xuXG4gICAgICAgIC8vIElmIGFkZGluZyB0aGlzIGl0ZW0gd291bGQgZXhjZWVkIHRoZSBzaXplIGxpbWl0LCBzdG9wIGFkZGluZ1xuICAgICAgICBpZiAodGVzdFNpemUgPiBNQVhfUEFZTE9BRF9TSVpFICYmIGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgYWRkIHRoZSBpdGVtIHRvIHRoZSBiYXRjaFxuICAgICAgICBiYXRjaC5wdXNoKHJlbWFpbmluZ1BhcmFtcy5zaGlmdCgpISk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIGV2ZW4gYSBzaW5nbGUgaXRlbSBpcyB0b28gbGFyZ2VcbiAgICAgIGlmIChiYXRjaC5sZW5ndGggPT09IDAgJiYgcmVtYWluaW5nUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gU2VuZCBqdXN0IHRoZSBmaXJzdCBpdGVtIGV2ZW4gaWYgaXQncyBvdmVyc2l6ZWRcbiAgICAgICAgYmF0Y2gucHVzaChyZW1haW5pbmdQYXJhbXMuc2hpZnQoKSEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXlsb2FkT2JqID0geyBrZXlzRm9yV2FsbGV0U2hhcmVzOiBiYXRjaCB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldHNoYXJlcy9hY2NlcHQnLCAyKSkuc2VuZChwYXlsb2FkT2JqKS5yZXN1bHQoKTtcblxuICAgICAgICBpZiAocmVzdWx0LmFjY2VwdGVkV2FsbGV0U2hhcmVzICYmIEFycmF5LmlzQXJyYXkocmVzdWx0LmFjY2VwdGVkV2FsbGV0U2hhcmVzKSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5yZXN1bHQuYWNjZXB0ZWRXYWxsZXRTaGFyZXMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQxMyAmJiBiYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgZ2V0IDQxMyB3aXRoIG11bHRpcGxlIGl0ZW1zLCBwdXQgdGhlbSBiYWNrIGFuZCB0cnkgd2l0aCBoYWxmIHRoZSBiYXRjaCBzaXplXG4gICAgICAgICAgcmVtYWluaW5nUGFyYW1zLnVuc2hpZnQoLi4uYmF0Y2gpO1xuICAgICAgICAgIE1BWF9QQVlMT0FEX1NJWkUgPSBNYXRoLmZsb29yKE1BWF9QQVlMT0FEX1NJWkUgLyAyKTsgLy8gUmVkdWNlIHNpemUgbGltaXQgZm9yIG5leHQgYXR0ZW1wdFxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY2NlcHRlZFdhbGxldFNoYXJlczogcmVzdWx0cyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgYnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVxdWVzdChcbiAgICBwYXJhbXM6IEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnNSZXF1ZXN0W11cbiAgKTogUHJvbWlzZTxCdWxrVXBkYXRlV2FsbGV0U2hhcmVSZXNwb25zZT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0c2hhcmVzL3VwZGF0ZScsIDIpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICBzaGFyZXM6IHBhcmFtcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZW5kIGEgd2FsbGV0IHNoYXJlIGludml0YXRpb24gZW1haWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHdob3NlIGludml0aWF0aW9uIHNob3VsZCBiZSByZXNlbnRcbiAgICovXG4gIGFzeW5jIHJlc2VuZFNoYXJlSW52aXRlKHBhcmFtczogeyB3YWxsZXRTaGFyZUlkPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIGNvbnN0IHVybFBhcnRzID0gcGFyYW1zLndhbGxldFNoYXJlSWQgKyAnL3Jlc2VuZGVtYWlsJztcbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHVybFBhcnRzKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGEgd2FsbGV0IHNoYXJlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbiAgICovXG4gIGFzeW5jIGNhbmNlbFNoYXJlKHBhcmFtczogeyB3YWxsZXRTaGFyZUlkPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFtdKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1zaGFyZSB3YWxsZXQgd2l0aCBleGlzdGluZyBzcGVuZGVycyBvZiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB3YWxsZXRJZFxuICAgKiBAcGFyYW0gdXNlclBhc3N3b3JkXG4gICAqL1xuICBhc3luYyByZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKHdhbGxldElkOiBzdHJpbmcsIHVzZXJQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gICAgaWYgKCF3YWxsZXQ/Ll93YWxsZXQ/LmVudGVycHJpc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW50ZXJwcmlzZSBub3QgZm91bmQgZm9yIHRoZSB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRlcnByaXNlVXNlcnNSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iaXRnby51cmwoYC9lbnRlcnByaXNlLyR7d2FsbGV0Py5fd2FsbGV0Py5lbnRlcnByaXNlfS91c2VyYCkpXG4gICAgICAucmVzdWx0KCk7XG4gICAgLy8gY3JlYXRlIGEgbWFwIG9mIHVzZXJzIGZvciBlYXN5IGxvb2t1cCAtIHdlIG5lZWQgdGhlIHVzZXIgZW1haWwgaWQgdG8gc2hhcmUgdGhlIHdhbGxldFxuICAgIGNvbnN0IHVzZXJzTWFwID0gbmV3IE1hcChcbiAgICAgIFsuLi5lbnRlcnByaXNlVXNlcnNSZXNwb25zZT8uYWRtaW5Vc2VycywgLi4uZW50ZXJwcmlzZVVzZXJzUmVzcG9uc2U/Lm5vbkFkbWluVXNlcnNdLm1hcCgob2JqKSA9PiBbb2JqLmlkLCBvYmpdKVxuICAgICk7XG5cbiAgICBpZiAod2FsbGV0Ll93YWxsZXQudXNlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgdXNlciBvZiB3YWxsZXQuX3dhbGxldC51c2Vycykge1xuICAgICAgICBjb25zdCB1c2VyT2JqZWN0ID0gdXNlcnNNYXAuZ2V0KHVzZXIudXNlcik7XG4gICAgICAgIGlmICh1c2VyLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpICYmICF1c2VyLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdhZG1pbicpICYmIHVzZXJPYmplY3QpIHtcbiAgICAgICAgICBjb25zdCBzaGFyZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHdhbGxldElkOiB3YWxsZXRJZCxcbiAgICAgICAgICAgIHVzZXI6IHVzZXIudXNlcixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB1c2VyLnBlcm1pc3Npb25zLmpvaW4oJywnKSxcbiAgICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHVzZXJQYXNzd29yZCxcbiAgICAgICAgICAgIGVtYWlsOiB1c2VyT2JqZWN0LmVtYWlsLmVtYWlsLFxuICAgICAgICAgICAgcmVzaGFyZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBLZXljaGFpbjogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3YWxsZXQuc2hhcmVXYWxsZXQoc2hhcmVQYXJhbXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSB3YWxsZXQgc2hhcmUsIGFkZGluZyB0aGUgd2FsbGV0IHRvIHRoZSB1c2VyJ3MgbGlzdFxuICAgKiBOZWVkcyBhIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBhY2NlcHRcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyUGFzc3dvcmQgLSAocmVxdWlyZWQgaWYgbW9yZSBhIGtleWNoYWluIHdhcyBzaGFyZWQpIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAtIG5ldyB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2F2aW5nIHRoZSBzaGFyZWQgd2FsbGV0IHBydi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbGVmdCBibGFuayBhbmQgYSB3YWxsZXQgd2l0aCBtb3JlIHRoYW4gdmlldyBwZXJtaXNzaW9ucyB3YXMgc2hhcmVkLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHBhcmFtcy5vdmVycmlkZUVuY3J5cHRlZFBydiAtIHNldCBvbmx5IGlmIHRoZSBwcnYgd2FzIHJlY2VpdmVkIG91dC1vZi1iYW5kLlxuICAgKi9cbiAgYXN5bmMgYWNjZXB0U2hhcmUocGFyYW1zOiBBY2NlcHRTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFsnb3ZlcnJpZGVFbmNyeXB0ZWRQcnYnLCAndXNlclBhc3N3b3JkJywgJ25ld1dhbGxldFBhc3NwaHJhc2UnXSk7XG5cbiAgICBsZXQgZW5jcnlwdGVkUHJ2ID0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkUHJ2O1xuICAgIGNvbnN0IHdhbGxldFNoYXJlID0gYXdhaXQgdGhpcy5nZXRTaGFyZSh7IHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkIH0pO1xuXG4gICAgLy8gTXVsdGktdXNlci1rZXkgY2FzZTogcmVxdWlyZXMgdXNlciB0byBwcm92aWRlIHRoZWlyIG93biBwdWJsaWMga2V5IGluIGFkZGl0aW9uIHRvIHRoZSBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICBpZiAod2FsbGV0U2hhcmUudXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCkge1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJQYXNzd29yZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBnZW5lcmF0ZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4ucHJ2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVBhcmFtczogVXBkYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgICAgIGVuY3J5cHRlZFBydjogZW5jcnlwdGVkUHJ2LFxuICAgICAgICBwdWI6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgIH07XG5cbiAgICAgIC8vIE5vdGU6IFVubGlrZSBrZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQsIHdlIGRvIE5PVCByZXNoYXJlIHRoZSB3YWxsZXQgd2l0aCBzcGVuZGVyc1xuICAgICAgLy8gVGhpcyBpcyBhIGtleSBkaWZmZXJlbmNlIC0gbXVsdGkta2V5LXVzZXIta2V5IHdhbGxldHMgZG9uJ3QgcmVxdWlyZSByZXNoYXJlXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh1cGRhdGVQYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIEtleWNoYWluIG92ZXJyaWRlIGNhc2U6IHJlcXVpcmVzIHVzZXIga2V5Y2hhaW4gY3JlYXRpb24gYW5kIHNpZ25pbmdcbiAgICBpZiAoXG4gICAgICB3YWxsZXRTaGFyZS5rZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluZGV4T2YoJ2FkbWluJykgIT09IC0xICYmXG4gICAgICB3YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMVxuICAgICkge1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJQYXNzd29yZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FsbGV0S2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZVVzZXJLZXljaGFpbihwYXJhbXMudXNlclBhc3N3b3JkKTtcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHdhbGxldEtleWNoYWluLmVuY3J5cHRlZFBydikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNyeXB0ZWRQcnYgd2FzIG5vdCBmb3VuZCBvbiB3YWxsZXQga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgdHJhZGluZ0FjY291bnRJZDogd2FsbGV0U2hhcmUud2FsbGV0LFxuICAgICAgICBwdWJrZXk6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgICAgY29uc3QgcGF5bG9hZFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gICAgICBjb25zdCBwcml2YXRlS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy51c2VyUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiB3YWxsZXRLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uc2lnbk1lc3NhZ2UoeyBwcnY6IHByaXZhdGVLZXkgfSwgcGF5bG9hZFN0cmluZyk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy51cGRhdGVTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgICAga2V5SWQ6IHdhbGxldEtleWNoYWluLmlkLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWRTdHJpbmcsXG4gICAgICB9KTtcbiAgICAgIC8vIElmIHRoZSB3YWxsZXQgc2hhcmUgd2FzIGFjY2VwdGVkIHN1Y2Nlc3NmdWxseSAoY2hhbmdlZD10cnVlKSwgcmVzaGFyZSB0aGUgd2FsbGV0IHdpdGggdGhlIHNwZW5kZXJzXG4gICAgICBpZiAocmVzcG9uc2UuY2hhbmdlZCAmJiByZXNwb25zZS5zdGF0ZSA9PT0gJ2FjY2VwdGVkJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVzaGFyZVdhbGxldFdpdGhTcGVuZGVycyh3YWxsZXRTaGFyZS53YWxsZXQsIHBhcmFtcy51c2VyUGFzc3dvcmQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gVE9ETzogUFgtMzgyNlxuICAgICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIGtleWNoYWluIHRvIGRlY3J5cHQsIG9yIGlmIGV4cGxpY2l0IGVuY3J5cHRlZFBydiB3YXMgcHJvdmlkZWRcbiAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluIHx8ICF3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHwgZW5jcnlwdGVkUHJ2KSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0ZTogJ2FjY2VwdGVkJyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyUGFzc3dvcmQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXNzd29yZCBwYXJhbSBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlY3J5cHQgc2hhcmVkIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IChhd2FpdCB0aGlzLmJpdGdvLmdldEVDREhLZXljaGFpbigpKSBhcyBhbnk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgdGhlIHNoYXJpbmcga2V5Y2hhaW4sIHdlIGNhbiB3b3JrIG91dCB0aGUgc2VjcmV0IHVzZWQgZm9yIHNoYXJpbmcgdGhlIHdhbGxldCB3aXRoIHVzXG4gICAgc2hhcmluZ0tleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJQYXNzd29yZCxcbiAgICAgIGlucHV0OiBzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICB9KTtcbiAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoXG4gICAgICAvLyBEZXJpdmUga2V5IGJ5IHBhdGggKHdoaWNoIGlzIHVzZWQgYmV0d2VlbiB0aGVzZSAyIHVzZXJzIG9ubHkpXG4gICAgICBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpbi5wcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKSxcbiAgICAgIEJ1ZmZlci5mcm9tKHdhbGxldFNoYXJlLmtleWNoYWluLmZyb21QdWJLZXksICdoZXgnKVxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gWWVzISBXZSBnb3QgdGhlIHNlY3JldCBzdWNjZXNzZnVsbHkgaGVyZSwgbm93IGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQgcHJ2XG4gICAgY29uc3QgZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgIH0pO1xuXG4gICAgLy8gV2Ugd2lsbCBub3cgcmUtZW5jcnlwdCB0aGUgd2FsbGV0IHdpdGggb3VyIG93biBwYXNzd29yZFxuICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlclBhc3N3b3JkO1xuICAgIGVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGlucHV0OiBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsXG4gICAgfSk7XG4gICAgY29uc3QgdXBkYXRlUGFyYW1zOiBVcGRhdGVTaGFyZU9wdGlvbnMgPSB7XG4gICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgIHN0YXRlOiAnYWNjZXB0ZWQnLFxuICAgIH07XG5cbiAgICBpZiAoZW5jcnlwdGVkUHJ2KSB7XG4gICAgICB1cGRhdGVQYXJhbXMuZW5jcnlwdGVkUHJ2ID0gZW5jcnlwdGVkUHJ2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cGRhdGVTaGFyZSh1cGRhdGVQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1bGsgQWNjZXB0IHdhbGxldCBzaGFyZXMsIGFkZGluZyB0aGUgd2FsbGV0cyB0byB0aGUgdXNlcidzIGxpc3RcbiAgICogTmVlZHMgYSB1c2VyJ3MgcGFzc3dvcmQgdG8gZGVjcnlwdCB0aGUgc2hhcmVkIGtleVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIEJ1bGtBY2NlcHRTaGFyZU9wdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gYXJyYXkgb2YgdGhlIHdhbGxldCBzaGFyZXMgdG8gYWNjZXB0XG4gICAqIEBwYXJhbSBwYXJhbXMudXNlclBhc3N3b3JkIC0gdXNlcidzIHBhc3N3b3JkIHRvIGRlY3J5cHQgdGhlIHNoYXJlZCB3YWxsZXQga2V5XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAtIG5ldyB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2F2aW5nIHRoZSBzaGFyZWQgd2FsbGV0IHBydi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbGVmdCBibGFuayB0aGVuIHRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQgaXMgdXNlZC5cbiAgICpcbiAgICpAcmV0dXJucyB7UHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT59XG4gICAqL1xuICBhc3luYyBidWxrQWNjZXB0U2hhcmUocGFyYW1zOiBCdWxrQWNjZXB0U2hhcmVPcHRpb25zKTogUHJvbWlzZTxCdWxrQWNjZXB0U2hhcmVSZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJMb2dpblBhc3N3b3JkJ10sIFsnbmV3V2FsbGV0UGFzc3BocmFzZSddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoJ25ld1dhbGxldFBhc3NwaHJhc2UnIGluIHBhcmFtcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgdmFsaWQgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB1c2VyIGxvZ2luIHBhc3N3b3JkJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRTaGFyZUlkcy5sZW5ndGggPiAwLCAnUGxlYXNlIHByb3ZpZGUgYXQgbGVhc3Qgb25lIHdhbGxldCBzaGFyZSB0byBhY2NlcHQnKTtcblxuICAgIGNvbnN0IGFsbFdhbGxldFNoYXJlcyA9IGF3YWl0IHRoaXMubGlzdFNoYXJlc1YyKCk7XG4gICAgY29uc3Qgd2FsbGV0U2hhcmVNYXAgPSBhbGxXYWxsZXRTaGFyZXMuaW5jb21pbmcucmVkdWNlKFxuICAgICAgKG1hcDogeyBba2V5OiBzdHJpbmddOiBXYWxsZXRTaGFyZSB9LCBzaGFyZSkgPT4gKHsgLi4ubWFwLCBbc2hhcmUuaWRdOiBzaGFyZSB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIGNvbnN0IHdhbGxldFNoYXJlcyA9IHBhcmFtcy53YWxsZXRTaGFyZUlkc1xuICAgICAgLm1hcCgod2FsbGV0U2hhcmVJZCkgPT4gd2FsbGV0U2hhcmVNYXBbd2FsbGV0U2hhcmVJZF0pXG4gICAgICAuZmlsdGVyKCh3YWxsZXRTaGFyZSkgPT4gd2FsbGV0U2hhcmUgJiYgKHdhbGxldFNoYXJlLmtleWNoYWluIHx8IHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpKTtcblxuICAgIGlmICghd2FsbGV0U2hhcmVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB2YWxpZCB3YWxsZXQgc2hhcmVzIGZvdW5kIHRvIGFjY2VwdCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJpbmdLZXljaGFpbiA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0RUNESEtleWNoYWluKCk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc2hhcmluZ0tleWNoYWluLmVuY3J5cHRlZFhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgc2hhcmluZ0tleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBwYXNzd29yZDogcGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgIH0pO1xuICAgIGNvbnN0IG5ld1dhbGxldFBhc3NwaHJhc2UgPSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSB8fCBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQ7XG4gICAgY29uc3Qgd2ViYXV0aG5JbmZvID0gcGFyYW1zLndlYmF1dGhuSW5mbztcbiAgICBjb25zdCBrZXlzRm9yV2FsbGV0U2hhcmVzID0gd2FsbGV0U2hhcmVzLmZsYXRNYXAoKHdhbGxldFNoYXJlKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgdXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCBjYXNlIC0gdGhlc2Ugc2hhcmVzIGRvbid0IGhhdmUga2V5Y2hhaW5zXG4gICAgICBpZiAod2FsbGV0U2hhcmUudXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZCkge1xuICAgICAgICBpZiAoIXBhcmFtcy51c2VyTG9naW5QYXNzd29yZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBnZW5lcmF0ZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2FsbGV0S2V5Y2hhaW4gPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIGlucHV0OiB3YWxsZXRLZXljaGFpbi5wcnYsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdhbGxldFNoYXJlSWQ6IHdhbGxldFNoYXJlLmlkLFxuICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgICBwdWI6IHdhbGxldEtleWNoYWluLnB1YixcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGFuZGFyZCBjYXNlOiBzaGFyZXMgd2l0aCBrZXljaGFpbnNcbiAgICAgIGlmICghd2FsbGV0U2hhcmUua2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VjcmV0ID0gZ2V0U2hhcmVkU2VjcmV0KFxuICAgICAgICBiaXAzMi5mcm9tQmFzZTU4KHNoYXJpbmdLZXljaGFpbi5wcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKSxcbiAgICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgY29uc3QgZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgICAgaW5wdXQ6IHdhbGxldFNoYXJlLmtleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgcGFzc3dvcmQ6IG5ld1dhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIGlucHV0OiBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVudHJ5OiBBY2NlcHRTaGFyZU9wdGlvbnNSZXF1ZXN0ID0ge1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiB3YWxsZXRTaGFyZS5pZCxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBuZXdFbmNyeXB0ZWRQcnYsXG4gICAgICB9O1xuICAgICAgaWYgKHdlYmF1dGhuSW5mbykge1xuICAgICAgICBlbnRyeS53ZWJhdXRobkluZm8gPSB7XG4gICAgICAgICAgb3RwRGV2aWNlSWQ6IHdlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgICBwcmZTYWx0OiB3ZWJhdXRobkluZm8ucHJmU2FsdCxcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgICBwYXNzd29yZDogd2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsXG4gICAgICAgICAgICBpbnB1dDogZGVjcnlwdGVkU2hhcmVkV2FsbGV0UHJ2LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtlbnRyeV07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5idWxrQWNjZXB0U2hhcmVSZXF1ZXN0KGtleXNGb3JXYWxsZXRTaGFyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgbXVsdGlwbGUgd2FsbGV0IHNoYXJlcyBpbiBidWxrXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB1c2VycyB0byBhY2NlcHQgb3IgcmVqZWN0IG11bHRpcGxlIHdhbGxldCBzaGFyZXMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLlxuICAgKiBJdCBoYW5kbGVzIGRpZmZlcmVudCB0eXBlcyBvZiB3YWxsZXQgc2hhcmVzIGluY2x1ZGluZyB0aG9zZSByZXF1aXJpbmcgc3BlY2lhbCBrZXljaGFpbiBvdmVycmlkZXNcbiAgICogYW5kIHRob3NlIHdpdGggZW5jcnlwdGVkIHByaXZhdGUga2V5cyB0aGF0IG5lZWQgdG8gYmUgZGVjcnlwdGVkIGFuZCByZS1lbmNyeXB0ZWQuXG4gICAqIEFmdGVyIHByb2Nlc3NpbmcsIGl0IGFsc28gcmVzaGFyZXMgYWNjZXB0ZWQgd2FsbGV0cyB3aXRoIHNwZW5kZXJzIGZvciBzcGVjaWFsIG92ZXJyaWRlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9ucyBmb3IgYnVsayB1cGRhdGluZyB3YWxsZXQgc2hhcmVzXG4gICAqIEBwYXJhbSBwYXJhbXMuc2hhcmVzIC0gQXJyYXkgb2Ygd2FsbGV0IHNoYXJlcyB0byB1cGRhdGUgd2l0aCB0aGVpciBzdGF0dXMgKGFjY2VwdC9yZWplY3QpXG4gICAqIEBwYXJhbSBwYXJhbXMudXNlckxvZ2luUGFzc3dvcmQgLSBVc2VyJ3MgbG9naW4gcGFzc3dvcmQgZm9yIGRlY3J5cHRpb24gb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zLm5ld1dhbGxldFBhc3NwaHJhc2UgLSBOZXcgd2FsbGV0IHBhc3NwaHJhc2UgZm9yIHJlLWVuY3J5cHRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgcmVzcG9uc2VzIGZvciBlYWNoIHdhbGxldCBzaGFyZSB1cGRhdGVcbiAgICovXG4gIGFzeW5jIGJ1bGtVcGRhdGVXYWxsZXRTaGFyZShwYXJhbXM6IEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnMpOiBQcm9taXNlPEJ1bGtVcGRhdGVXYWxsZXRTaGFyZVJlc3BvbnNlPiB7XG4gICAgaWYgKCFwYXJhbXMuc2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyOiBzaGFyZXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnNoYXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBhcnJheTogc2hhcmVzIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHBhcmFtcy5zaGFyZXMpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggc2hhcmUgaW4gdGhlIGFycmF5XG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBwYXJhbXMuc2hhcmVzKSB7XG4gICAgICBpZiAoIXNoYXJlLndhbGxldFNoYXJlSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFNoYXJlSWQgaW4gc2hhcmUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaGFyZS5zdGF0dXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHN0YXR1cyBpbiBzaGFyZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hhcmUuc3RhdHVzICE9PSAnYWNjZXB0JyAmJiBzaGFyZS5zdGF0dXMgIT09ICdyZWplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0dXMgaW4gc2hhcmU6ICcgKyBzaGFyZS5zdGF0dXMgKyAnLiBNdXN0IGJlIGVpdGhlciBcImFjY2VwdFwiIG9yIFwicmVqZWN0XCInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzaGFyZS53YWxsZXRTaGFyZUlkICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyB3YWxsZXRTaGFyZUlkIHRvIGJlIGEgc3RyaW5nIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHNoYXJlLndhbGxldFNoYXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmFtZXRlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAocGFyYW1zLnVzZXJMb2dpblBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBhcmFtZXRlciBzdHJpbmc6IHVzZXJMb2dpblBhc3N3b3JkIGJ1dCBmb3VuZCAnICsgdHlwZW9mIHBhcmFtcy51c2VyTG9naW5QYXNzd29yZCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgcGFyYW1ldGVyIHN0cmluZzogbmV3V2FsbGV0UGFzc3BocmFzZSBidXQgZm91bmQgJyArIHR5cGVvZiBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSk7XG4gICAgfVxuICAgIGFzc2VydChwYXJhbXMuc2hhcmVzLmxlbmd0aCA+IDAsICdubyBzaGFyZXMgYXJlIHBhc3NlZCcpO1xuXG4gICAgY29uc3QgeyBzaGFyZXM6IGlucHV0U2hhcmVzLCB1c2VyTG9naW5QYXNzd29yZCwgbmV3V2FsbGV0UGFzc3BocmFzZSB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgYWxsV2FsbGV0U2hhcmVzID0gYXdhaXQgdGhpcy5saXN0U2hhcmVzVjIoKTtcblxuICAgIC8vIE9ubHkgaW5jbHVkZSBzaGFyZXMgdGhhdCBhcmUgaW4gdGhlIGlucHV0IGFycmF5IGZvciBlZmZpY2llbmN5XG4gICAgY29uc3Qgc2hhcmVJZHMgPSBuZXcgU2V0KGlucHV0U2hhcmVzLm1hcCgoc2hhcmUpID0+IHNoYXJlLndhbGxldFNoYXJlSWQpKTtcbiAgICBjb25zdCB3YWxsZXRTaGFyZU1hcCA9IG5ldyBNYXAoKTtcblxuICAgIGFsbFdhbGxldFNoYXJlcy5pbmNvbWluZ1xuICAgICAgLmZpbHRlcigoc2hhcmUpID0+IHNoYXJlSWRzLmhhcyhzaGFyZS5pZCkpXG4gICAgICAuZm9yRWFjaCgoc2hhcmUpID0+IHdhbGxldFNoYXJlTWFwLnNldChzaGFyZS5pZCwgc2hhcmUpKTtcblxuICAgIGFsbFdhbGxldFNoYXJlcy5vdXRnb2luZ1xuICAgICAgLmZpbHRlcigoc2hhcmUpID0+IHNoYXJlSWRzLmhhcyhzaGFyZS5pZCkpXG4gICAgICAuZm9yRWFjaCgoc2hhcmUpID0+IHdhbGxldFNoYXJlTWFwLnNldChzaGFyZS5pZCwgc2hhcmUpKTtcblxuICAgIGNvbnN0IHJlc29sdmVkU2hhcmVzID0gaW5wdXRTaGFyZXMubWFwKChzaGFyZSkgPT4ge1xuICAgICAgY29uc3Qgd2FsbGV0U2hhcmUgPSB3YWxsZXRTaGFyZU1hcC5nZXQoc2hhcmUud2FsbGV0U2hhcmVJZCk7XG4gICAgICBpZiAoIXdhbGxldFNoYXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB3YWxsZXQgc2hhcmUgcHJvdmlkZWQ6ICR7c2hhcmUud2FsbGV0U2hhcmVJZH1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnNoYXJlLCB3YWxsZXRTaGFyZSB9O1xuICAgIH0pO1xuXG4gICAgLy8gSWRlbnRpZnkgc3BlY2lhbCBvdmVycmlkZSBjYXNlcyB0aGF0IG5lZWQgcmVzaGFyaW5nIGFmdGVyIGFjY2VwdGFuY2VcbiAgICBjb25zdCBzcGVjaWFsT3ZlcnJpZGVDYXNlcyA9IG5ldyBNYXAoKTtcbiAgICByZXNvbHZlZFNoYXJlcy5mb3JFYWNoKChzaGFyZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBzaGFyZS5zdGF0dXMgPT09ICdhY2NlcHQnICYmXG4gICAgICAgIHNoYXJlLndhbGxldFNoYXJlLmtleWNoYWluT3ZlcnJpZGVSZXF1aXJlZCAmJlxuICAgICAgICBzaGFyZS53YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnYWRtaW4nKSAmJlxuICAgICAgICBzaGFyZS53YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKVxuICAgICAgKSB7XG4gICAgICAgIHNwZWNpYWxPdmVycmlkZUNhc2VzLnNldChzaGFyZS53YWxsZXRTaGFyZUlkLCBzaGFyZS53YWxsZXRTaGFyZS53YWxsZXQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGVjcnlwdCBzaGFyaW5nIGtleWNoYWluIGlmIG5lZWRlZCAob25seSBvbmNlKVxuICAgIGxldCBzaGFyaW5nS2V5Y2hhaW5QcnY6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgZGVjcnlwdCBpZiB0aGVyZSBhcmUgc2hhcmVzIHRvIGFjY2VwdCB0aGF0IG1pZ2h0IG5lZWQgaXRcbiAgICBjb25zdCBoYXNTaGFyZXNSZXF1aXJpbmdEZWNyeXB0aW9uID1cbiAgICAgIHNwZWNpYWxPdmVycmlkZUNhc2VzLnNpemUgPiAwIHx8XG4gICAgICByZXNvbHZlZFNoYXJlcy5zb21lKChzaGFyZSkgPT4gc2hhcmUuc3RhdHVzID09PSAnYWNjZXB0JyAmJiBzaGFyZS53YWxsZXRTaGFyZS5rZXljaGFpbj8uZW5jcnlwdGVkUHJ2KTtcblxuICAgIGlmICh1c2VyTG9naW5QYXNzd29yZCAmJiBoYXNTaGFyZXNSZXF1aXJpbmdEZWNyeXB0aW9uKSB7XG4gICAgICBjb25zdCBzaGFyaW5nS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJpdGdvLmdldEVDREhLZXljaGFpbigpO1xuICAgICAgaWYgKCFzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VuY3J5cHRlZFhwcnYgd2FzIG5vdCBmb3VuZCBvbiBzaGFyaW5nIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgICBzaGFyaW5nS2V5Y2hhaW5QcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBwYXNzd29yZDogdXNlckxvZ2luUGFzc3dvcmQsXG4gICAgICAgIGlucHV0OiBzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRsZWRVcGRhdGVzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgcmVzb2x2ZWRTaGFyZXMubWFwKGFzeW5jIChzaGFyZSkgPT4ge1xuICAgICAgICBjb25zdCB7IHdhbGxldFNoYXJlSWQsIHN0YXR1cywgd2FsbGV0U2hhcmUgfSA9IHNoYXJlO1xuXG4gICAgICAgIC8vIEhhbmRsZSBhY2NlcHQgY2FzZVxuICAgICAgICBpZiAoc3RhdHVzID09PSAnYWNjZXB0Jykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NBY2NlcHRTaGFyZShcbiAgICAgICAgICAgIHdhbGxldFNoYXJlSWQsXG4gICAgICAgICAgICB3YWxsZXRTaGFyZSxcbiAgICAgICAgICAgIHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgICAgICAgbmV3V2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICAgIHNoYXJpbmdLZXljaGFpblBydlxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgcmVqZWN0IGNhc2VcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgICAgc3RhdHVzOiAncmVqZWN0JyBhcyBjb25zdCxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHVwZGF0ZXNcbiAgICBjb25zdCBzdWNjZXNzZnVsVXBkYXRlcyA9IHNldHRsZWRVcGRhdGVzLmZsYXRNYXAoKHJlc3VsdCkgPT4gKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnID8gcmVzdWx0LnZhbHVlIDogW10pKTtcblxuICAgIC8vIEV4dHJhY3QgZmFpbGVkIHVwZGF0ZXMgLSBvbmx5IGZyb20gcmVqZWN0ZWQgcHJvbWlzZXNcbiAgICBjb25zdCBmYWlsZWRVcGRhdGVzID0gc2V0dGxlZFVwZGF0ZXMucmVkdWNlPEFycmF5PHsgd2FsbGV0U2hhcmVJZDogc3RyaW5nOyByZWFzb246IHN0cmluZyB9Pj4oXG4gICAgICAoYWNjLCByZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgY29uc3QgcmVqZWN0ZWRSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgd2FsbGV0U2hhcmVJZDogcmVzb2x2ZWRTaGFyZXNbaW5kZXhdLndhbGxldFNoYXJlSWQsXG4gICAgICAgICAgICByZWFzb246IHJlamVjdGVkUmVzdWx0LnJlYXNvbj8ubWVzc2FnZSB8fCBTdHJpbmcocmVqZWN0ZWRSZXN1bHQucmVhc29uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIFtdXG4gICAgKTtcblxuICAgIC8vIFNlbmQgc3VjY2Vzc2Z1bCB1cGRhdGVzIHRvIHRoZSBzZXJ2ZXJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYnVsa1VwZGF0ZVdhbGxldFNoYXJlUmVxdWVzdChzdWNjZXNzZnVsVXBkYXRlcyk7XG5cbiAgICAvLyBQcm9jZXNzIGFjY2VwdGVkIHNwZWNpYWwgb3ZlcnJpZGUgY2FzZXMgLSByZXNoYXJlIHdpdGggc3BlbmRlcnNcbiAgICBpZiAocmVzcG9uc2UuYWNjZXB0ZWRXYWxsZXRTaGFyZXMgJiYgcmVzcG9uc2UuYWNjZXB0ZWRXYWxsZXRTaGFyZXMubGVuZ3RoID4gMCAmJiB1c2VyTG9naW5QYXNzd29yZCkge1xuICAgICAgLy8gRm9yIGVhY2ggYWNjZXB0ZWQgd2FsbGV0IHNoYXJlIHRoYXQgaXMgYSBzcGVjaWFsIG92ZXJyaWRlIGNhc2UsIHJlc2hhcmUgd2l0aCBzcGVuZGVyc1xuICAgICAgZm9yIChjb25zdCB3YWxsZXRTaGFyZUlkIG9mIHJlc3BvbnNlLmFjY2VwdGVkV2FsbGV0U2hhcmVzKSB7XG4gICAgICAgIGlmIChzcGVjaWFsT3ZlcnJpZGVDYXNlcy5oYXMod2FsbGV0U2hhcmVJZCkpIHtcbiAgICAgICAgICBjb25zdCB3YWxsZXRJZCA9IHNwZWNpYWxPdmVycmlkZUNhc2VzLmdldCh3YWxsZXRTaGFyZUlkKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNoYXJlV2FsbGV0V2l0aFNwZW5kZXJzKHdhbGxldElkLCB1c2VyTG9naW5QYXNzd29yZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gTG9nIGVycm9yIGJ1dCBjb250aW51ZSBwcm9jZXNzaW5nIG90aGVyIHNoYXJlc1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgcmVzaGFyaW5nIHdhbGxldCAke3dhbGxldElkfSB3aXRoIHNwZW5kZXJzOiAke2U/Lm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGluZm9ybWF0aW9uIGFib3V0IGZhaWxlZCB1cGRhdGVzIHRvIHRoZSByZXNwb25zZVxuICAgIGlmIChmYWlsZWRVcGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3BvbnNlLndhbGxldFNoYXJlVXBkYXRlRXJyb3JzLnB1c2goLi4uZmFpbGVkVXBkYXRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYSB3YWxsZXQgc2hhcmUgdGhhdCBpcyBiZWluZyBhY2NlcHRlZFxuICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBkaWZmZXJlbnQgY2FzZXMgZm9yIGFjY2VwdGluZyBhIHdhbGxldCBzaGFyZTpcbiAgICogMS4gU3BlY2lhbCBvdmVycmlkZSBjYXNlIHJlcXVpcmluZyB1c2VyIGtleWNoYWluIGFuZCBzaWduaW5nXG4gICAqIDIuIFNpbXBsZSBjYXNlIHdpdGggbm8ga2V5Y2hhaW4gdG8gZGVjcnlwdFxuICAgKiAzLiBTdGFuZGFyZCBjYXNlIHJlcXVpcmluZyBkZWNyeXB0aW9uIGFuZCByZS1lbmNyeXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB3YWxsZXRTaGFyZUlkIC0gSUQgb2YgdGhlIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gd2FsbGV0U2hhcmUgLSBXYWxsZXQgc2hhcmUgb2JqZWN0XG4gICAqIEBwYXJhbSB1c2VyTG9naW5QYXNzd29yZCAtIFVzZXIncyBsb2dpbiBwYXNzd29yZFxuICAgKiBAcGFyYW0gbmV3V2FsbGV0UGFzc3BocmFzZSAtIE5ldyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0gc2hhcmluZ0tleWNoYWluUHJ2IC0gRGVjcnlwdGVkIHNoYXJpbmcga2V5Y2hhaW4gcHJpdmF0ZSBrZXlcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygd2FsbGV0IHNoYXJlIHVwZGF0ZSByZXF1ZXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzQWNjZXB0U2hhcmUoXG4gICAgd2FsbGV0U2hhcmVJZDogc3RyaW5nLFxuICAgIHdhbGxldFNoYXJlOiBXYWxsZXRTaGFyZSxcbiAgICB1c2VyTG9naW5QYXNzd29yZD86IHN0cmluZyxcbiAgICBuZXdXYWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nLFxuICAgIHNoYXJpbmdLZXljaGFpblBydj86IHN0cmluZ1xuICApOiBQcm9taXNlPEJ1bGtVcGRhdGVXYWxsZXRTaGFyZU9wdGlvbnNSZXF1ZXN0W10+IHtcbiAgICAvLyBTcGVjaWFsIG92ZXJyaWRlIGNhc2U6IHJlcXVpcmVzIHVzZXIga2V5Y2hhaW4gYW5kIHNpZ25pbmdcbiAgICBpZiAoXG4gICAgICB3YWxsZXRTaGFyZS5rZXljaGFpbk92ZXJyaWRlUmVxdWlyZWQgJiZcbiAgICAgIHdhbGxldFNoYXJlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdhZG1pbicpICYmXG4gICAgICB3YWxsZXRTaGFyZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKVxuICAgICkge1xuICAgICAgaWYgKCF1c2VyTG9naW5QYXNzd29yZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJMb2dpblBhc3N3b3JkIHBhcmFtIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVjcnlwdCBzaGFyZWQga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgICAua2V5Y2hhaW5zKClcbiAgICAgICAgLmNyZWF0ZVVzZXJLZXljaGFpbihuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkKTtcbiAgICAgIGlmICghd2FsbGV0S2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkUHJ2IHdhcyBub3QgZm91bmQgb24gd2FsbGV0IGtleWNoYWluJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRyYWRpbmdBY2NvdW50SWQ6IHdhbGxldFNoYXJlLndhbGxldCxcbiAgICAgICAgcHVia2V5OiB3YWxsZXRLZXljaGFpbi5wdWIsXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiB1c2VyTG9naW5QYXNzd29yZCxcbiAgICAgICAgaW5wdXQ6IHdhbGxldEtleWNoYWluLmVuY3J5cHRlZFBydixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB0aGlzLmJhc2VDb2luLnNpZ25NZXNzYWdlKHsgcHJ2IH0sIHBheWxvYWQpO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgd2FsbGV0U2hhcmVJZCxcbiAgICAgICAgICBzdGF0dXM6ICdhY2NlcHQnIGFzIGNvbnN0LFxuICAgICAgICAgIGtleUlkOiB3YWxsZXRLZXljaGFpbi5pZCxcbiAgICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gTXVsdGktdXNlci1rZXkgY2FzZTogcmVxdWlyZXMgdXNlciB0byBwcm92aWRlIHRoZWlyIG93biBwdWJsaWMga2V5XG4gICAgaWYgKHdhbGxldFNoYXJlLnVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQpIHtcbiAgICAgIGlmICghKG5ld1dhbGxldFBhc3NwaHJhc2UgfHwgdXNlckxvZ2luUGFzc3dvcmQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBnZW5lcmF0ZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhbGxldEtleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHVzZXJMb2dpblBhc3N3b3JkLFxuICAgICAgICBpbnB1dDogd2FsbGV0S2V5Y2hhaW4ucHJ2LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBlbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgcHViOiB3YWxsZXRLZXljaGFpbi5wdWIsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIFJldHVybiByaWdodCBhd2F5IGlmIHRoZXJlIGlzIG5vIGtleWNoYWluIHRvIGRlY3J5cHRcbiAgICBpZiAoIXdhbGxldFNoYXJlLmtleWNoYWluIHx8ICF3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICAgIHN0YXR1czogJ2FjY2VwdCcgYXMgY29uc3QsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIE1vcmUgdGhhbiB2aWV3aW5nIHdhcyByZXF1ZXN0ZWQsIHNvIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgd2FsbGV0IGtleXMgdXNpbmcgdGhlIHNoYXJlZCBlY2RoIHNjaGVtZVxuICAgIGlmICghdXNlckxvZ2luUGFzc3dvcmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlckxvZ2luUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICB9XG4gICAgaWYgKCFzaGFyaW5nS2V5Y2hhaW5QcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHJldHJpZXZlIGFuZCBkZWNyeXB0IHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXJpdmVkS2V5ID0gYmlwMzIuZnJvbUJhc2U1OChzaGFyaW5nS2V5Y2hhaW5QcnYpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHdhbGxldFNoYXJlLmtleWNoYWluLnBhdGgpKTtcblxuICAgIGNvbnN0IHNoYXJlZFNlY3JldCA9IGdldFNoYXJlZFNlY3JldChkZXJpdmVkS2V5LCBCdWZmZXIuZnJvbSh3YWxsZXRTaGFyZS5rZXljaGFpbi5mcm9tUHViS2V5LCAnaGV4JykpLnRvU3RyaW5nKFxuICAgICAgJ2hleCdcbiAgICApO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBzaGFyZWRTZWNyZXQsXG4gICAgICBpbnB1dDogd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LFxuICAgIH0pO1xuXG4gICAgLy8gV2Ugd2lsbCBub3cgcmUtZW5jcnlwdCB0aGUgd2FsbGV0IHdpdGggb3VyIG93biBwYXNzd29yZFxuICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICBwYXNzd29yZDogbmV3V2FsbGV0UGFzc3BocmFzZSB8fCB1c2VyTG9naW5QYXNzd29yZCxcbiAgICAgIGlucHV0OiBkZWNyeXB0ZWRQcnYsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB3YWxsZXRTaGFyZUlkLFxuICAgICAgICBzdGF0dXM6ICdhY2NlcHQnIGFzIGNvbnN0LFxuICAgICAgICBlbmNyeXB0ZWRQcnYsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IGl0cyBJRFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuaWQgd2FsbGV0IGlkXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0V2FsbGV0KHBhcmFtczogR2V0V2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBHZXRXYWxsZXRPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5pbmNsdWRlQmFsYW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZSA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZTtcbiAgICB9XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCkpO1xuXG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgcGFyYW1zLmlkKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3YWxsZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBpdHMgYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyB3YWxsZXQgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFdhbGxldEJ5QWRkcmVzcyhwYXJhbXM6IEdldFdhbGxldEJ5QWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdKTtcblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSk7XG5cbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGRyZXNzLycgKyBwYXJhbXMuYWRkcmVzcykpLnJlc3VsdCgpO1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIHdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBnaXZlbiBzdXBwb3J0ZWQgY29pbiwgZ2V0IHRvdGFsIGJhbGFuY2VzIGZvciBhbGwgd2FsbGV0cyBvZiB0aGF0XG4gICAqIGNvaW4gdHlwZSBvbiB0aGUgYWNjb3VudC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFRvdGFsQmFsYW5jZXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2JhbGFuY2VzJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFRTUyBvciBCTFMtREtHIFdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1wY1dhbGxldCh7XG4gICAgcGFzc3BocmFzZSxcbiAgICBsYWJlbCxcbiAgICBtdWx0aXNpZ1R5cGUsXG4gICAgZW50ZXJwcmlzZSxcbiAgICB3YWxsZXRWZXJzaW9uLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgfTogR2VuZXJhdGVNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgY29uc3QgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgIHRzc1NldHRpbmdzLmNvaW5TZXR0aW5nc1t0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpXT8ud2FsbGV0Q3JlYXRpb25TZXR0aW5ncz8ubXVsdGlTaWdUeXBlVmVyc2lvbjtcbiAgICAgIHdhbGxldFZlcnNpb24gPSB0aGlzLmRldGVybWluZUVjZHNhTXBjV2FsbGV0VmVyc2lvbih3YWxsZXRWZXJzaW9uLCBtdWx0aXNpZ1R5cGVWZXJzaW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIC8vIENyZWF0ZSBNUEMgS2V5Y2hhaW5zXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVNcGMoe1xuICAgICAgbXVsdGlzaWdUeXBlLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfSA9IGtleWNoYWlucztcbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdLFxuICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICB9O1xuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFja3VwS2V5Y2hhaW4ucHJ2KSkge1xuICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFNlbGYtTWFuYWdlZCBDb2xkIFRTUyBXYWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVTTUNNcGNXYWxsZXQoe1xuICAgIGxhYmVsLFxuICAgIG11bHRpc2lnVHlwZSxcbiAgICBlbnRlcnByaXNlLFxuICAgIHdhbGxldFZlcnNpb24sXG4gICAgYml0Z29LZXlJZCxcbiAgICBjb21tb25LZXljaGFpbixcbiAgICBjb2xkRGVyaXZhdGlvblNlZWQsXG4gIH06IEdlbmVyYXRlU01DTXBjV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG11bHRpc2lnVHlwZSA9PT0gJ3RzcycgJiYgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgY29uc3QgdHNzU2V0dGluZ3M6IFRzc1NldHRpbmdzID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCgnL2FwaS92Mi90c3Mvc2V0dGluZ3MnKSlcbiAgICAgICAgLnJlc3VsdCgpO1xuICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbiA9XG4gICAgICAgIHRzc1NldHRpbmdzLmNvaW5TZXR0aW5nc1t0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpXT8ud2FsbGV0Q3JlYXRpb25TZXR0aW5ncz8uY29sZE11bHRpU2lnVHlwZVZlcnNpb247XG4gICAgICB3YWxsZXRWZXJzaW9uID0gdGhpcy5kZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbiwgbXVsdGlzaWdUeXBlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIE1QQyBLZXljaGFpbnNcbiAgICBjb25zdCBiaXRnb0tleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQoeyBpZDogYml0Z29LZXlJZCB9KTtcblxuICAgIGlmICghYml0Z29LZXljaGFpbiB8fCAhYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRHbyBrZXljaGFpbiBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICBpZiAoYml0Z29LZXljaGFpbi5zb3VyY2UgIT09ICdiaXRnbycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIGJpdGdvS2V5SWQgaXMgbm90IGEgQml0R28ga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICBpZiAoYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbiAhPT0gY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIENvbW1vbiBrZXljaGFpbiBtaXNtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCBCaXRnbyBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGNvbW1vbktleWNoYWluLFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgaXNNUEN2MjogbXVsdGlzaWdUeXBlVmVyc2lvbiA9PT0gJ01QQ3YyJyA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuXG4gICAgY29uc3QgYmFja3VwS2V5Q2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBjb21tb25LZXljaGFpbixcbiAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IGNvbGREZXJpdmF0aW9uU2VlZCxcbiAgICAgIGlzTVBDdjI6IG11bHRpc2lnVHlwZVZlcnNpb24gPT09ICdNUEN2MicgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBiYWNrdXBLZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKGJhY2t1cEtleUNoYWluUGFyYW1zKTtcblxuICAgIC8vIENyZWF0ZSBXYWxsZXRcbiAgICBjb25zdCBrZXljaGFpbnMgPSB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTtcbiAgICBjb25zdCB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMgPSB7XG4gICAgICBsYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdLFxuICAgICAgdHlwZTogJ2NvbGQnLFxuICAgICAgbXVsdGlzaWdUeXBlLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIHdhbGxldFZlcnNpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGQnKSkuc2VuZChmaW5hbFdhbGxldFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFdhbGxldFdpdGhLZXljaGFpbnMgPSB7XG4gICAgICB3YWxsZXQ6IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgbmV3V2FsbGV0KSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIEN1c3RvZGlhbCBUU1MgV2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlQ3VzdG9kaWFsTXBjV2FsbGV0KHtcbiAgICBsYWJlbCxcbiAgICBtdWx0aXNpZ1R5cGUsXG4gICAgZW50ZXJwcmlzZSxcbiAgICB3YWxsZXRWZXJzaW9uLFxuICB9OiBHZW5lcmF0ZUJhc2VNcGNXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRXaXRoS2V5Y2hhaW5zPiB7XG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBpZiAobXVsdGlzaWdUeXBlID09PSAndHNzJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICBjb25zdCB0c3NTZXR0aW5nczogVHNzU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKCcvYXBpL3YyL3Rzcy9zZXR0aW5ncycpKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBjb25zdCBtdWx0aXNpZ1R5cGVWZXJzaW9uID1cbiAgICAgICAgdHNzU2V0dGluZ3MuY29pblNldHRpbmdzW3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCldPy53YWxsZXRDcmVhdGlvblNldHRpbmdzPy5jdXN0b2RpYWxNdWx0aVNpZ1R5cGVWZXJzaW9uO1xuICAgICAgd2FsbGV0VmVyc2lvbiA9IHRoaXMuZGV0ZXJtaW5lRWNkc2FNcGNXYWxsZXRWZXJzaW9uKHdhbGxldFZlcnNpb24sIG11bHRpc2lnVHlwZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0ge1xuICAgICAgbGFiZWwsXG4gICAgICBtdWx0aXNpZ1R5cGUsXG4gICAgICBlbnRlcnByaXNlLFxuICAgICAgd2FsbGV0VmVyc2lvbixcbiAgICAgIHR5cGU6ICdjdXN0b2RpYWwnLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgV2FsbGV0XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2FkZCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCk7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gd2FsbGV0LmtleUlkcygpO1xuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldCxcbiAgICAgIHVzZXJLZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzBdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ3VzZXInIH0sXG4gICAgICBiYWNrdXBLZXljaGFpbjogeyBpZDoga2V5Y2hhaW5zWzFdLCB0eXBlOiBtdWx0aXNpZ1R5cGUsIHNvdXJjZTogJ2JhY2t1cCcgfSxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IHsgaWQ6IGtleWNoYWluc1syXSwgdHlwZTogbXVsdGlzaWdUeXBlLCBzb3VyY2U6ICdiaXRnbycgfSxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ1dhbGxldFdpdGhLZXljaGFpbnMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlcm1pbmVFY2RzYU1wY1dhbGxldFZlcnNpb24od2FsbGV0VmVyc2lvbj86IG51bWJlciwgbXVsdGlzaWdUeXBlVmVyc2lvbj86IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uaXNFVk0oKSAmJiBtdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICBpZiAoIXdhbGxldFZlcnNpb24gfHwgKHdhbGxldFZlcnNpb24gIT09IDUgJiYgd2FsbGV0VmVyc2lvbiAhPT0gNikpIHtcbiAgICAgICAgcmV0dXJuIDU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3YWxsZXRWZXJzaW9uO1xuICB9XG59XG4iXX0=
|