@bitgo-beta/utxo-lib 8.0.3-beta.12 → 8.0.3-beta.1200
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/README.md +19 -16
- package/dist/src/address.d.ts +0 -1
- package/dist/src/address.d.ts.map +1 -1
- package/dist/src/address.js +10 -10
- package/dist/src/addressFormat.d.ts +1 -2
- package/dist/src/addressFormat.d.ts.map +1 -1
- package/dist/src/addressFormat.js +21 -26
- package/dist/src/bitgo/Musig2.d.ts +5 -11
- package/dist/src/bitgo/Musig2.d.ts.map +1 -1
- package/dist/src/bitgo/Musig2.js +63 -88
- package/dist/src/bitgo/ProprietaryKeyValUtils.d.ts +27 -0
- package/dist/src/bitgo/ProprietaryKeyValUtils.d.ts.map +1 -0
- package/dist/src/bitgo/ProprietaryKeyValUtils.js +74 -0
- package/dist/src/bitgo/PsbtUtil.d.ts +54 -0
- package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -0
- package/dist/src/bitgo/PsbtUtil.js +131 -0
- package/dist/src/bitgo/Unspent.d.ts +2 -3
- package/dist/src/bitgo/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/Unspent.js +14 -15
- package/dist/src/bitgo/UtxoPsbt.d.ts +39 -42
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoPsbt.js +234 -208
- package/dist/src/bitgo/UtxoTransaction.d.ts +0 -1
- package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransaction.js +14 -14
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.js +1 -1
- package/dist/src/bitgo/bitcoincash/address.d.ts +0 -1
- package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoincash/address.js +11 -12
- package/dist/src/bitgo/bitcoincash/index.js +6 -2
- package/dist/src/bitgo/dash/DashPsbt.d.ts +1 -1
- package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashPsbt.js +4 -1
- package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -1
- package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashTransaction.js +3 -3
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.js +1 -1
- package/dist/src/bitgo/dash/index.js +6 -2
- package/dist/src/bitgo/index.d.ts +11 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +11 -3
- package/dist/src/bitgo/keyutil.d.ts +9 -1
- package/dist/src/bitgo/keyutil.d.ts.map +1 -1
- package/dist/src/bitgo/keyutil.js +25 -4
- package/dist/src/bitgo/legacysafe/index.d.ts +14 -0
- package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
- package/dist/src/bitgo/legacysafe/index.js +60 -0
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +1 -1
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/litecoin/LitecoinPsbt.js +4 -1
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +1 -2
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
- package/dist/src/bitgo/litecoin/index.js +6 -2
- package/dist/src/bitgo/nonStandardHalfSigned.js +4 -5
- package/dist/src/bitgo/outputScripts.d.ts +8 -8
- package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
- package/dist/src/bitgo/outputScripts.js +64 -47
- package/dist/src/bitgo/parseInput.d.ts +7 -8
- package/dist/src/bitgo/parseInput.d.ts.map +1 -1
- package/dist/src/bitgo/parseInput.js +15 -16
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.js +7 -8
- package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -1
- package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/scriptTypes.js +7 -8
- package/dist/src/bitgo/signature.d.ts +4 -5
- package/dist/src/bitgo/signature.d.ts.map +1 -1
- package/dist/src/bitgo/signature.js +32 -18
- package/dist/src/bitgo/tnumber.js +2 -3
- package/dist/src/bitgo/transaction.d.ts +31 -4
- package/dist/src/bitgo/transaction.d.ts.map +1 -1
- package/dist/src/bitgo/transaction.js +57 -27
- package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
- package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
- package/dist/src/bitgo/transactionAmounts.js +32 -0
- package/dist/src/bitgo/types.d.ts +8 -2
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/types.js +12 -4
- package/dist/src/bitgo/wallet/Psbt.d.ts +91 -27
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Psbt.js +246 -108
- package/dist/src/bitgo/wallet/ScriptId.d.ts +14 -0
- package/dist/src/bitgo/wallet/ScriptId.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/ScriptId.js +28 -0
- package/dist/src/bitgo/wallet/Unspent.d.ts +43 -10
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Unspent.js +174 -81
- package/dist/src/bitgo/wallet/WalletKeys.d.ts +1 -2
- package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletKeys.js +3 -3
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +70 -2
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +179 -43
- package/dist/src/bitgo/wallet/WalletScripts.js +4 -5
- package/dist/src/bitgo/wallet/WalletUnspentSigner.js +7 -7
- package/dist/src/bitgo/wallet/chains.d.ts +2 -2
- package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/chains.js +10 -10
- package/dist/src/bitgo/wallet/index.d.ts +3 -0
- package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/index.js +9 -2
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +85 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +32 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.js +123 -0
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +1 -2
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashBufferutils.js +15 -15
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +2 -6
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +15 -26
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +5 -2
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashTransaction.js +48 -21
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +8 -4
- package/dist/src/bitgo/zcash/address.d.ts +0 -1
- package/dist/src/bitgo/zcash/address.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/address.js +7 -8
- package/dist/src/bitgo/zcash/hashZip0244.d.ts +1 -2
- package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/hashZip0244.js +9 -10
- package/dist/src/bitgo/zcash/index.js +6 -2
- package/dist/src/classify.d.ts +0 -1
- package/dist/src/classify.d.ts.map +1 -1
- package/dist/src/classify.js +5 -5
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -3
- package/dist/src/networks.d.ts +2 -2
- package/dist/src/networks.d.ts.map +1 -1
- package/dist/src/networks.js +67 -21
- package/dist/src/noble_ecc.d.ts +7 -7
- package/dist/src/noble_ecc.d.ts.map +1 -1
- package/dist/src/noble_ecc.js +7 -7
- package/dist/src/payments/p2tr.js +13 -18
- package/dist/src/payments/p2tr_ns.js +3 -5
- package/dist/src/taproot.d.ts +1 -2
- package/dist/src/taproot.d.ts.map +1 -1
- package/dist/src/taproot.js +21 -22
- package/dist/src/templates/multisig/input.d.ts +0 -1
- package/dist/src/templates/multisig/input.d.ts.map +1 -1
- package/dist/src/templates/multisig/input.js +2 -3
- package/dist/src/templates/multisig/output.d.ts +0 -1
- package/dist/src/templates/multisig/output.d.ts.map +1 -1
- package/dist/src/templates/multisig/output.js +2 -3
- package/dist/src/templates/nulldata.d.ts +0 -1
- package/dist/src/templates/nulldata.d.ts.map +1 -1
- package/dist/src/templates/nulldata.js +3 -3
- package/dist/src/templates/pubkey/input.d.ts +0 -1
- package/dist/src/templates/pubkey/input.d.ts.map +1 -1
- package/dist/src/templates/pubkey/input.js +2 -3
- package/dist/src/templates/pubkey/output.d.ts +0 -1
- package/dist/src/templates/pubkey/output.d.ts.map +1 -1
- package/dist/src/templates/pubkey/output.js +2 -3
- package/dist/src/templates/pubkeyhash/input.d.ts +0 -1
- package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -1
- package/dist/src/templates/pubkeyhash/input.js +2 -3
- package/dist/src/templates/pubkeyhash/output.d.ts +0 -1
- package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -1
- package/dist/src/templates/pubkeyhash/output.js +2 -3
- package/dist/src/templates/scripthash/input.d.ts +0 -1
- package/dist/src/templates/scripthash/input.d.ts.map +1 -1
- package/dist/src/templates/scripthash/input.js +2 -3
- package/dist/src/templates/scripthash/output.d.ts +0 -1
- package/dist/src/templates/scripthash/output.d.ts.map +1 -1
- package/dist/src/templates/scripthash/output.js +2 -3
- package/dist/src/templates/taproot/input.d.ts +0 -1
- package/dist/src/templates/taproot/input.d.ts.map +1 -1
- package/dist/src/templates/taproot/input.js +2 -3
- package/dist/src/templates/taproot/output.d.ts +0 -1
- package/dist/src/templates/taproot/output.d.ts.map +1 -1
- package/dist/src/templates/taproot/output.js +2 -3
- package/dist/src/templates/taprootnofn/input.d.ts +0 -1
- package/dist/src/templates/taprootnofn/input.d.ts.map +1 -1
- package/dist/src/templates/taprootnofn/input.js +2 -3
- package/dist/src/templates/taprootnofn/output.d.ts +0 -1
- package/dist/src/templates/taprootnofn/output.d.ts.map +1 -1
- package/dist/src/templates/taprootnofn/output.js +2 -3
- package/dist/src/templates/witnesscommitment/output.d.ts +0 -1
- package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -1
- package/dist/src/templates/witnesscommitment/output.js +4 -5
- package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -1
- package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -1
- package/dist/src/templates/witnesspubkeyhash/input.js +2 -3
- package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -1
- package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -1
- package/dist/src/templates/witnesspubkeyhash/output.js +2 -3
- package/dist/src/templates/witnessscripthash/input.d.ts +0 -1
- package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -1
- package/dist/src/templates/witnessscripthash/input.js +2 -3
- package/dist/src/templates/witnessscripthash/output.d.ts +0 -1
- package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -1
- package/dist/src/templates/witnessscripthash/output.js +2 -3
- package/dist/src/testutil/index.d.ts +1 -0
- package/dist/src/testutil/index.d.ts.map +1 -1
- package/dist/src/testutil/index.js +7 -2
- package/dist/src/testutil/keys.d.ts +6 -3
- package/dist/src/testutil/keys.d.ts.map +1 -1
- package/dist/src/testutil/keys.js +24 -10
- package/dist/src/testutil/mock.d.ts +2 -3
- package/dist/src/testutil/mock.d.ts.map +1 -1
- package/dist/src/testutil/mock.js +39 -28
- package/dist/src/testutil/psbt.d.ts +41 -16
- package/dist/src/testutil/psbt.d.ts.map +1 -1
- package/dist/src/testutil/psbt.js +50 -40
- package/dist/src/testutil/transaction.d.ts +18 -7
- package/dist/src/testutil/transaction.d.ts.map +1 -1
- package/dist/src/testutil/transaction.js +35 -28
- package/dist/src/transaction_builder.d.ts +0 -1
- package/dist/src/transaction_builder.d.ts.map +1 -1
- package/dist/src/transaction_builder.js +13 -18
- package/package.json +10 -12
|
@@ -1,24 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.toWalletPsbt = toWalletPsbt;
|
|
4
|
+
exports.signWalletPsbt = signWalletPsbt;
|
|
5
|
+
exports.getPsbtInputScriptType = getPsbtInputScriptType;
|
|
6
|
+
exports.parsePsbtInput = parsePsbtInput;
|
|
7
|
+
exports.toScriptType2Of3s = toScriptType2Of3s;
|
|
8
|
+
exports.getStrictSignatureCount = getStrictSignatureCount;
|
|
9
|
+
exports.getStrictSignatureCounts = getStrictSignatureCounts;
|
|
10
|
+
exports.isPsbtInputArray = isPsbtInputArray;
|
|
11
|
+
exports.isTxInputArray = isTxInputArray;
|
|
12
|
+
exports.isTransactionWithKeyPathSpendInput = isTransactionWithKeyPathSpendInput;
|
|
13
|
+
exports.addXpubsToPsbt = addXpubsToPsbt;
|
|
14
|
+
exports.getSignatureValidationArrayPsbt = getSignatureValidationArrayPsbt;
|
|
15
|
+
exports.extractP2msOnlyHalfSignedTx = extractP2msOnlyHalfSignedTx;
|
|
16
|
+
exports.clonePsbtWithoutNonWitnessUtxo = clonePsbtWithoutNonWitnessUtxo;
|
|
17
|
+
exports.isPsbtLite = isPsbtLite;
|
|
18
|
+
exports.deleteWitnessUtxoForNonSegwitInputs = deleteWitnessUtxoForNonSegwitInputs;
|
|
4
19
|
const assert = require("assert");
|
|
20
|
+
const utils_1 = require("bip174/src/lib/utils");
|
|
21
|
+
const bs58check = require("bs58check");
|
|
5
22
|
const UtxoPsbt_1 = require("../UtxoPsbt");
|
|
6
23
|
const UtxoTransaction_1 = require("../UtxoTransaction");
|
|
7
24
|
const outputScripts_1 = require("../outputScripts");
|
|
25
|
+
const WalletKeys_1 = require("./WalletKeys");
|
|
8
26
|
const Unspent_1 = require("../Unspent");
|
|
9
27
|
const transaction_1 = require("../transaction");
|
|
10
28
|
const Unspent_2 = require("./Unspent");
|
|
11
|
-
const utils_1 = require("bip174/src/lib/utils");
|
|
12
29
|
const parseInput_1 = require("../parseInput");
|
|
13
30
|
const Musig2_1 = require("../Musig2");
|
|
14
31
|
const types_1 = require("../types");
|
|
15
32
|
const taproot_1 = require("../../taproot");
|
|
16
33
|
const bitcoinjs_lib_1 = require("bitcoinjs-lib");
|
|
17
34
|
const index_1 = require("../../index");
|
|
35
|
+
const PsbtUtil_1 = require("../PsbtUtil");
|
|
18
36
|
function getTaprootSigners(script, walletKeys) {
|
|
19
|
-
const parsedPublicKeys = parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend').publicKeys;
|
|
37
|
+
const parsedPublicKeys = (0, parseInput_1.parsePubScript2Of3)(script, 'taprootScriptPathSpend').publicKeys;
|
|
20
38
|
const walletSigners = parsedPublicKeys.map((publicKey) => {
|
|
21
|
-
const index = walletKeys.publicKeys.findIndex((walletPublicKey) => outputScripts_1.toXOnlyPublicKey(walletPublicKey).equals(publicKey));
|
|
39
|
+
const index = walletKeys.publicKeys.findIndex((walletPublicKey) => (0, outputScripts_1.toXOnlyPublicKey)(walletPublicKey).equals(publicKey));
|
|
22
40
|
if (index >= 0) {
|
|
23
41
|
return { walletKey: walletKeys.triple[index], rootKey: walletKeys.parent.triple[index] };
|
|
24
42
|
}
|
|
@@ -27,14 +45,14 @@ function getTaprootSigners(script, walletKeys) {
|
|
|
27
45
|
return [walletSigners[0], walletSigners[1]];
|
|
28
46
|
}
|
|
29
47
|
function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
30
|
-
const
|
|
31
|
-
const
|
|
48
|
+
const input = (0, utils_1.checkForInput)(psbt.data.inputs, inputIndex);
|
|
49
|
+
const signatureCount = (0, PsbtUtil_1.getPsbtInputSignatureCount)(input);
|
|
50
|
+
const scriptType = (0, outputScripts_1.scriptTypeForChain)(unspent.chain);
|
|
32
51
|
if (signatureCount === 0 && scriptType === 'p2tr') {
|
|
33
52
|
return;
|
|
34
53
|
}
|
|
35
54
|
const walletKeys = rootWalletKeys.deriveForChainAndIndex(unspent.chain, unspent.index);
|
|
36
55
|
if (scriptType === 'p2tr') {
|
|
37
|
-
const input = psbt.data.inputs[inputIndex];
|
|
38
56
|
if (!Array.isArray(input.tapLeafScript) || input.tapLeafScript.length === 0) {
|
|
39
57
|
throw new Error('Invalid PSBT state. Missing required fields.');
|
|
40
58
|
}
|
|
@@ -42,7 +60,7 @@ function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
|
42
60
|
throw new Error('Bitgo only supports a single tap leaf script per input');
|
|
43
61
|
}
|
|
44
62
|
const [signer, cosigner] = getTaprootSigners(input.tapLeafScript[0].script, walletKeys);
|
|
45
|
-
const leafHash = outputScripts_1.getLeafHash({
|
|
63
|
+
const leafHash = (0, outputScripts_1.getLeafHash)({
|
|
46
64
|
publicKeys: walletKeys.publicKeys,
|
|
47
65
|
signer: signer.walletKey.publicKey,
|
|
48
66
|
cosigner: cosigner.walletKey.publicKey,
|
|
@@ -50,7 +68,7 @@ function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
|
50
68
|
psbt.updateInput(inputIndex, {
|
|
51
69
|
tapBip32Derivation: [signer, cosigner].map((walletSigner) => ({
|
|
52
70
|
leafHashes: [leafHash],
|
|
53
|
-
pubkey: outputScripts_1.toXOnlyPublicKey(walletSigner.walletKey.publicKey),
|
|
71
|
+
pubkey: (0, outputScripts_1.toXOnlyPublicKey)(walletSigner.walletKey.publicKey),
|
|
54
72
|
path: rootWalletKeys.getDerivationPath(walletSigner.rootKey, unspent.chain, unspent.index),
|
|
55
73
|
masterFingerprint: walletSigner.rootKey.fingerprint,
|
|
56
74
|
})),
|
|
@@ -58,7 +76,7 @@ function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
|
58
76
|
}
|
|
59
77
|
else {
|
|
60
78
|
if (signatureCount === 0) {
|
|
61
|
-
const { witnessScript, redeemScript } = outputScripts_1.createOutputScript2of3(walletKeys.publicKeys, scriptType);
|
|
79
|
+
const { witnessScript, redeemScript } = (0, outputScripts_1.createOutputScript2of3)(walletKeys.publicKeys, scriptType);
|
|
62
80
|
if (witnessScript && psbt.data.inputs[inputIndex].witnessScript === undefined) {
|
|
63
81
|
psbt.updateInput(inputIndex, { witnessScript });
|
|
64
82
|
}
|
|
@@ -84,18 +102,17 @@ function updatePsbtInput(psbt, inputIndex, unspent, rootWalletKeys) {
|
|
|
84
102
|
*/
|
|
85
103
|
function toWalletPsbt(tx, unspents, rootWalletKeys) {
|
|
86
104
|
const prevOutputs = unspents.map((u) => {
|
|
87
|
-
assert.notStrictEqual(outputScripts_1.scriptTypeForChain(u.chain), 'p2trMusig2');
|
|
88
|
-
return Unspent_1.toPrevOutputWithPrevTx(u, tx.network);
|
|
105
|
+
assert.notStrictEqual((0, outputScripts_1.scriptTypeForChain)(u.chain), 'p2trMusig2');
|
|
106
|
+
return (0, Unspent_1.toPrevOutputWithPrevTx)(u, tx.network);
|
|
89
107
|
});
|
|
90
|
-
const psbt = transaction_1.createPsbtFromTransaction(tx, prevOutputs);
|
|
108
|
+
const psbt = (0, transaction_1.createPsbtFromTransaction)(tx, prevOutputs);
|
|
91
109
|
unspents.forEach((u, i) => {
|
|
92
|
-
if (Unspent_2.isWalletUnspent(u) && u.index !== undefined) {
|
|
110
|
+
if ((0, Unspent_2.isWalletUnspent)(u) && u.index !== undefined) {
|
|
93
111
|
updatePsbtInput(psbt, i, u, rootWalletKeys);
|
|
94
112
|
}
|
|
95
113
|
});
|
|
96
114
|
return psbt;
|
|
97
115
|
}
|
|
98
|
-
exports.toWalletPsbt = toWalletPsbt;
|
|
99
116
|
/**
|
|
100
117
|
* @param psbt
|
|
101
118
|
* @param inputIndex
|
|
@@ -104,7 +121,7 @@ exports.toWalletPsbt = toWalletPsbt;
|
|
|
104
121
|
* @return signed PSBT with signer's key for unspent
|
|
105
122
|
*/
|
|
106
123
|
function signWalletPsbt(psbt, inputIndex, signer, unspent) {
|
|
107
|
-
const scriptType = outputScripts_1.scriptTypeForChain(unspent.chain);
|
|
124
|
+
const scriptType = (0, outputScripts_1.scriptTypeForChain)(unspent.chain);
|
|
108
125
|
if (scriptType === 'p2tr' || scriptType === 'p2trMusig2') {
|
|
109
126
|
psbt.signTaprootInputHD(inputIndex, signer);
|
|
110
127
|
}
|
|
@@ -112,12 +129,14 @@ function signWalletPsbt(psbt, inputIndex, signer, unspent) {
|
|
|
112
129
|
psbt.signInputHD(inputIndex, signer);
|
|
113
130
|
}
|
|
114
131
|
}
|
|
115
|
-
|
|
116
|
-
|
|
132
|
+
/**
|
|
133
|
+
* @returns script type of the input
|
|
134
|
+
*/
|
|
135
|
+
function getPsbtInputScriptType(input) {
|
|
117
136
|
const isP2pk = (script) => {
|
|
118
137
|
try {
|
|
119
138
|
const chunks = bitcoinjs_lib_1.script.decompile(script);
|
|
120
|
-
return (
|
|
139
|
+
return (chunks?.length === 2 &&
|
|
121
140
|
Buffer.isBuffer(chunks[0]) &&
|
|
122
141
|
bitcoinjs_lib_1.script.isCanonicalPubKey(chunks[0]) &&
|
|
123
142
|
chunks[1] === index_1.opcodes.OP_CHECKSIG);
|
|
@@ -151,39 +170,40 @@ function getScriptType(input) {
|
|
|
151
170
|
}
|
|
152
171
|
scriptType = 'taprootKeyPathSpend';
|
|
153
172
|
}
|
|
154
|
-
|
|
173
|
+
if (scriptType) {
|
|
174
|
+
return scriptType;
|
|
175
|
+
}
|
|
176
|
+
throw new Error('could not parse input');
|
|
155
177
|
}
|
|
156
|
-
function parseTaprootKeyPathSignatures(
|
|
157
|
-
const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(
|
|
178
|
+
function parseTaprootKeyPathSignatures(input) {
|
|
179
|
+
const partialSigs = (0, Musig2_1.parsePsbtMusig2PartialSigs)(input);
|
|
158
180
|
if (!partialSigs) {
|
|
159
181
|
return { signatures: undefined, participantPublicKeys: undefined };
|
|
160
182
|
}
|
|
161
183
|
const signatures = partialSigs.map((pSig) => pSig.partialSig);
|
|
162
184
|
const participantPublicKeys = partialSigs.map((pSig) => pSig.participantPubKey);
|
|
163
|
-
return types_1.isTuple(signatures) && types_1.isTuple(participantPublicKeys)
|
|
185
|
+
return (0, types_1.isTuple)(signatures) && (0, types_1.isTuple)(participantPublicKeys)
|
|
164
186
|
? { signatures, participantPublicKeys }
|
|
165
187
|
: { signatures: [signatures[0]], participantPublicKeys: [participantPublicKeys[0]] };
|
|
166
188
|
}
|
|
167
189
|
function parsePartialOrTapScriptSignatures(sig) {
|
|
168
|
-
if (!
|
|
190
|
+
if (!sig?.length) {
|
|
169
191
|
return { signatures: undefined };
|
|
170
192
|
}
|
|
171
193
|
if (sig.length > 2) {
|
|
172
194
|
throw new Error('unexpected signature count');
|
|
173
195
|
}
|
|
174
196
|
const signatures = sig.map((tSig) => tSig.signature);
|
|
175
|
-
return types_1.isTuple(signatures) ? { signatures } : { signatures: [signatures[0]] };
|
|
197
|
+
return (0, types_1.isTuple)(signatures) ? { signatures } : { signatures: [signatures[0]] };
|
|
176
198
|
}
|
|
177
|
-
function parseSignatures(
|
|
178
|
-
const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
|
|
199
|
+
function parseSignatures(input, scriptType) {
|
|
179
200
|
return scriptType === 'taprootKeyPathSpend'
|
|
180
|
-
? parseTaprootKeyPathSignatures(
|
|
201
|
+
? parseTaprootKeyPathSignatures(input)
|
|
181
202
|
: scriptType === 'taprootScriptPathSpend'
|
|
182
203
|
? parsePartialOrTapScriptSignatures(input.tapScriptSig)
|
|
183
204
|
: parsePartialOrTapScriptSignatures(input.partialSig);
|
|
184
205
|
}
|
|
185
206
|
function parseScript(input, scriptType) {
|
|
186
|
-
var _a;
|
|
187
207
|
let pubScript;
|
|
188
208
|
if (scriptType === 'p2sh' || scriptType === 'p2shP2pk') {
|
|
189
209
|
pubScript = input.redeemScript;
|
|
@@ -195,26 +215,43 @@ function parseScript(input, scriptType) {
|
|
|
195
215
|
pubScript = input.tapLeafScript ? input.tapLeafScript[0].script : undefined;
|
|
196
216
|
}
|
|
197
217
|
else if (scriptType === 'taprootKeyPathSpend') {
|
|
198
|
-
if (
|
|
218
|
+
if (input.witnessUtxo?.script) {
|
|
199
219
|
pubScript = input.witnessUtxo.script;
|
|
200
220
|
}
|
|
201
221
|
else if (input.tapInternalKey && input.tapMerkleRoot) {
|
|
202
|
-
pubScript = taproot_1.createTaprootOutputScript({ internalPubKey: input.tapInternalKey, taptreeRoot: input.tapMerkleRoot });
|
|
222
|
+
pubScript = (0, taproot_1.createTaprootOutputScript)({ internalPubKey: input.tapInternalKey, taptreeRoot: input.tapMerkleRoot });
|
|
203
223
|
}
|
|
204
224
|
}
|
|
205
225
|
if (!pubScript) {
|
|
206
226
|
throw new Error(`Invalid PSBT state for ${scriptType}. Missing required fields.`);
|
|
207
227
|
}
|
|
208
|
-
return parseInput_1.parsePubScript(pubScript, scriptType);
|
|
228
|
+
return (0, parseInput_1.parsePubScript)(pubScript, scriptType);
|
|
209
229
|
}
|
|
210
|
-
|
|
211
|
-
|
|
230
|
+
/**
|
|
231
|
+
* @return psbt metadata are parsed as per below conditions.
|
|
232
|
+
* redeemScript/witnessScript/tapLeafScript matches BitGo.
|
|
233
|
+
* signature and public key count matches BitGo.
|
|
234
|
+
* P2SH-P2PK => scriptType, redeemScript, public key, signature.
|
|
235
|
+
* P2SH => scriptType, redeemScript, public keys, signatures.
|
|
236
|
+
* PW2SH => scriptType, witnessScript, public keys, signatures.
|
|
237
|
+
* P2SH-PW2SH => scriptType, redeemScript, witnessScript, public keys, signatures.
|
|
238
|
+
* P2TR and P2TR MUSIG2 script path => scriptType (taprootScriptPathSpend), pubScript (leaf script), controlBlock,
|
|
239
|
+
* scriptPathLevel, leafVersion, public keys, signatures.
|
|
240
|
+
* P2TR MUSIG2 kep path => scriptType (taprootKeyPathSpend), pubScript (scriptPubKey), participant pub keys (signer),
|
|
241
|
+
* public key (tapOutputkey), signatures (partial signer sigs).
|
|
242
|
+
*/
|
|
243
|
+
function parsePsbtInput(input) {
|
|
244
|
+
if ((0, PsbtUtil_1.isPsbtInputFinalized)(input)) {
|
|
245
|
+
throw new Error('Finalized PSBT parsing is not supported');
|
|
246
|
+
}
|
|
247
|
+
const scriptType = getPsbtInputScriptType(input);
|
|
212
248
|
const parsedPubScript = parseScript(input, scriptType);
|
|
213
|
-
const signatures = parseSignatures(
|
|
249
|
+
const signatures = parseSignatures(input, scriptType);
|
|
214
250
|
if (parsedPubScript.scriptType === 'taprootKeyPathSpend' && 'participantPublicKeys' in signatures) {
|
|
215
251
|
return {
|
|
216
252
|
...parsedPubScript,
|
|
217
253
|
...signatures,
|
|
254
|
+
scriptType: parsedPubScript.scriptType,
|
|
218
255
|
};
|
|
219
256
|
}
|
|
220
257
|
if (parsedPubScript.scriptType === 'taprootScriptPathSpend') {
|
|
@@ -222,14 +259,15 @@ function parseInputMetadata(psbt, inputIndex, scriptType) {
|
|
|
222
259
|
throw new Error('Invalid PSBT state for taprootScriptPathSpend. Missing required fields.');
|
|
223
260
|
}
|
|
224
261
|
const controlBlock = input.tapLeafScript[0].controlBlock;
|
|
225
|
-
if (!parseInput_1.isValidControlBock(controlBlock)) {
|
|
262
|
+
if (!(0, parseInput_1.isValidControlBock)(controlBlock)) {
|
|
226
263
|
throw new Error('Invalid PSBT taprootScriptPathSpend controlBlock.');
|
|
227
264
|
}
|
|
228
|
-
const scriptPathLevel = parseInput_1.calculateScriptPathLevel(controlBlock);
|
|
229
|
-
const leafVersion = parseInput_1.getLeafVersion(controlBlock);
|
|
265
|
+
const scriptPathLevel = (0, parseInput_1.calculateScriptPathLevel)(controlBlock);
|
|
266
|
+
const leafVersion = (0, parseInput_1.getLeafVersion)(controlBlock);
|
|
230
267
|
return {
|
|
231
268
|
...parsedPubScript,
|
|
232
269
|
...signatures,
|
|
270
|
+
scriptType: parsedPubScript.scriptType,
|
|
233
271
|
controlBlock,
|
|
234
272
|
scriptPathLevel,
|
|
235
273
|
leafVersion,
|
|
@@ -246,7 +284,7 @@ function parseInputMetadata(psbt, inputIndex, scriptType) {
|
|
|
246
284
|
...signatures,
|
|
247
285
|
};
|
|
248
286
|
}
|
|
249
|
-
if (parsedPubScript.scriptType === 'p2shP2pk' && (!signatures.signatures || !types_1.isTuple(signatures.signatures))) {
|
|
287
|
+
if (parsedPubScript.scriptType === 'p2shP2pk' && (!signatures.signatures || !(0, types_1.isTuple)(signatures.signatures))) {
|
|
250
288
|
return {
|
|
251
289
|
...parsedPubScript,
|
|
252
290
|
signatures: signatures.signatures,
|
|
@@ -255,88 +293,188 @@ function parseInputMetadata(psbt, inputIndex, scriptType) {
|
|
|
255
293
|
throw new Error('invalid pub script');
|
|
256
294
|
}
|
|
257
295
|
/**
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
* P2SH-P2PK => scriptType, redeemScript, public key, signature.
|
|
262
|
-
* P2SH => scriptType, redeemScript, public keys, signatures.
|
|
263
|
-
* PW2SH => scriptType, witnessScript, public keys, signatures.
|
|
264
|
-
* P2SH-PW2SH => scriptType, redeemScript, witnessScript, public keys, signatures.
|
|
265
|
-
* P2TR and P2TR MUSIG2 script path => scriptType (taprootScriptPathSpend), pubScript (leaf script), controlBlock,
|
|
266
|
-
* scriptPathLevel, leafVersion, public keys, signatures.
|
|
267
|
-
* P2TR MUSIG2 kep path => scriptType (taprootKeyPathSpend), pubScript (scriptPubKey), participant pub keys (signer),
|
|
268
|
-
* public key (tapOutputkey), signatures (partial signer sigs).
|
|
269
|
-
* Any unsigned PSBT and without required metadata is returned with undefined.
|
|
296
|
+
* Converts a parsed script type into an array of script types.
|
|
297
|
+
* @param parsedScriptType - The parsed script type.
|
|
298
|
+
* @returns An array of ScriptType2Of3 values corresponding to the parsed script type.
|
|
270
299
|
*/
|
|
271
|
-
function
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
if (!scriptType) {
|
|
278
|
-
if (psbt.getSignatureCount(inputIndex) > 0) {
|
|
279
|
-
throw new Error('Invalid PSBT state. Signatures found without scripts.');
|
|
280
|
-
}
|
|
281
|
-
return undefined;
|
|
282
|
-
}
|
|
283
|
-
return parseInputMetadata(psbt, inputIndex, scriptType);
|
|
300
|
+
function toScriptType2Of3s(parsedScriptType) {
|
|
301
|
+
return parsedScriptType === 'taprootScriptPathSpend'
|
|
302
|
+
? ['p2trMusig2', 'p2tr']
|
|
303
|
+
: parsedScriptType === 'taprootKeyPathSpend'
|
|
304
|
+
? ['p2trMusig2']
|
|
305
|
+
: [parsedScriptType];
|
|
284
306
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
if (((_a = param.script) === null || _a === void 0 ? void 0 : _a.length) || ((_b = param.witness) === null || _b === void 0 ? void 0 : _b.length)) {
|
|
302
|
-
const parsedInput = parseInput_1.parseSignatureScript(param);
|
|
303
|
-
return parsedInput.scriptType === 'taprootKeyPathSpend' ? 2 : parseSignatureCount(parsedInput.signatures);
|
|
307
|
+
/**
|
|
308
|
+
* @returns strictly parse the input and get signature count.
|
|
309
|
+
* unsigned(0), half-signed(1) or fully-signed(2)
|
|
310
|
+
*/
|
|
311
|
+
function getStrictSignatureCount(input) {
|
|
312
|
+
const calculateSignatureCount = (signatures) => {
|
|
313
|
+
const count = signatures ? signatures.filter((s) => !(0, parseInput_1.isPlaceholderSignature)(s)).length : 0;
|
|
314
|
+
if (count === 0 || count === 1 || count === 2) {
|
|
315
|
+
return count;
|
|
316
|
+
}
|
|
317
|
+
throw new Error('invalid signature count');
|
|
318
|
+
};
|
|
319
|
+
if ('hash' in input) {
|
|
320
|
+
if (input.script?.length || input.witness?.length) {
|
|
321
|
+
const parsedInput = (0, parseInput_1.parseSignatureScript)(input);
|
|
322
|
+
return parsedInput.scriptType === 'taprootKeyPathSpend' ? 2 : calculateSignatureCount(parsedInput.signatures);
|
|
304
323
|
}
|
|
305
324
|
return 0;
|
|
306
325
|
}
|
|
326
|
+
else {
|
|
327
|
+
return calculateSignatureCount(parsePsbtInput(input).signatures);
|
|
328
|
+
}
|
|
307
329
|
}
|
|
308
330
|
/**
|
|
309
|
-
* @returns
|
|
310
|
-
*
|
|
331
|
+
* @returns strictly parse input and get signature count for all inputs.
|
|
332
|
+
* 0=unsigned, 1=half-signed or 2=fully-signed
|
|
311
333
|
*/
|
|
312
|
-
function
|
|
313
|
-
const constructParam = (tx, inputIndex) => {
|
|
314
|
-
return tx instanceof UtxoPsbt_1.UtxoPsbt
|
|
315
|
-
? { psbt: tx, inputIndex }
|
|
316
|
-
: (tx instanceof UtxoTransaction_1.UtxoTransaction ? tx.ins : tx)[inputIndex];
|
|
317
|
-
};
|
|
334
|
+
function getStrictSignatureCounts(tx) {
|
|
318
335
|
const inputs = tx instanceof UtxoPsbt_1.UtxoPsbt ? tx.data.inputs : tx instanceof UtxoTransaction_1.UtxoTransaction ? tx.ins : tx;
|
|
319
|
-
|
|
320
|
-
const indices = inputIndex === undefined ? inputs.map((_, index) => index) : [inputIndex];
|
|
321
|
-
return indices
|
|
322
|
-
.map((index, _) => getInputSignatureCount(constructParam(tx, index)))
|
|
323
|
-
.reduce((prev, curr) => (curr > prev ? curr : prev), 0);
|
|
336
|
+
return inputs.map((input, _) => getStrictSignatureCount(input));
|
|
324
337
|
}
|
|
325
|
-
exports.getSignatureCount = getSignatureCount;
|
|
326
338
|
/**
|
|
327
|
-
* @return true iff
|
|
328
|
-
* @param data byte array or hex string
|
|
339
|
+
* @return true iff inputs array is of PsbtInputType type
|
|
329
340
|
* */
|
|
330
|
-
function
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
341
|
+
function isPsbtInputArray(inputs) {
|
|
342
|
+
return !isTxInputArray(inputs);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* @return true iff inputs array is of TxInput type
|
|
346
|
+
* */
|
|
347
|
+
function isTxInputArray(inputs) {
|
|
348
|
+
assert.ok(!!inputs.length, 'empty inputs array');
|
|
349
|
+
return 'hash' in inputs[0];
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* @returns true iff given psbt/transaction/tx-input-array/psbt-input-array contains at least one taproot key path spend input
|
|
353
|
+
*/
|
|
354
|
+
function isTransactionWithKeyPathSpendInput(data) {
|
|
355
|
+
const inputs = data instanceof UtxoPsbt_1.UtxoPsbt ? data.data.inputs : data instanceof UtxoTransaction_1.UtxoTransaction ? data.ins : data;
|
|
356
|
+
if (!inputs.length) {
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
if (isPsbtInputArray(inputs)) {
|
|
360
|
+
return inputs.some((input, _) => getPsbtInputScriptType(input) === 'taprootKeyPathSpend');
|
|
361
|
+
}
|
|
362
|
+
return inputs.some((input, _) => {
|
|
363
|
+
// If the input is not signed, it cannot be a taprootKeyPathSpend input because you can only
|
|
364
|
+
// extract a fully signed psbt into a transaction with taprootKeyPathSpend inputs.
|
|
365
|
+
if (getStrictSignatureCount(input) === 0) {
|
|
335
366
|
return false;
|
|
336
367
|
}
|
|
337
|
-
|
|
368
|
+
return (0, parseInput_1.parseSignatureScript)(input).scriptType === 'taprootKeyPathSpend';
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Set the RootWalletKeys as the globalXpubs on the psbt
|
|
373
|
+
*
|
|
374
|
+
* We do all the matching of the (tap)bip32Derivations masterFingerprint to the fingerprint of the
|
|
375
|
+
* extendedPubkey.
|
|
376
|
+
*/
|
|
377
|
+
function addXpubsToPsbt(psbt, rootWalletKeys) {
|
|
378
|
+
const safeRootWalletKeys = new WalletKeys_1.RootWalletKeys(rootWalletKeys.triple.map((bip32) => bip32.neutered()), rootWalletKeys.derivationPrefixes);
|
|
379
|
+
const xPubs = safeRootWalletKeys.triple.map((bip32) => ({
|
|
380
|
+
extendedPubkey: bs58check.decode(bip32.toBase58()),
|
|
381
|
+
masterFingerprint: bip32.fingerprint,
|
|
382
|
+
// TODO: BG-73797 - bip174 currently requires m prefix for this to be a valid globalXpub
|
|
383
|
+
path: 'm',
|
|
384
|
+
}));
|
|
385
|
+
psbt.updateGlobal({ globalXpub: xPubs });
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* validates signatures for each 2 of 3 input against user, backup, bitgo keys derived from rootWalletKeys.
|
|
389
|
+
* @returns array of input index and its [is valid user sig exist, is valid backup sig exist, is valid user bitgo exist]
|
|
390
|
+
* For p2shP2pk input, [false, false, false] is returned since it is not a 2 of 3 sig input.
|
|
391
|
+
*/
|
|
392
|
+
function getSignatureValidationArrayPsbt(psbt, rootWalletKeys) {
|
|
393
|
+
return psbt.data.inputs.map((input, i) => {
|
|
394
|
+
const sigValArrayForInput = getPsbtInputScriptType(input) === 'p2shP2pk'
|
|
395
|
+
? [false, false, false]
|
|
396
|
+
: psbt.getSignatureValidationArray(i, { rootNodes: rootWalletKeys.triple });
|
|
397
|
+
return [i, sigValArrayForInput];
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Extracts the half signed transaction from the psbt for p2ms based script types - p2sh, p2wsh, and p2shP2wsh.
|
|
402
|
+
* The purpose is to provide backward compatibility to keyternal (KRS) that only supports network transaction and p2ms script types.
|
|
403
|
+
*/
|
|
404
|
+
function extractP2msOnlyHalfSignedTx(psbt) {
|
|
405
|
+
assert.ok(!!(psbt.data.inputs.length && psbt.data.outputs.length), 'empty inputs or outputs');
|
|
406
|
+
const tx = psbt.getUnsignedTx();
|
|
407
|
+
function isP2msParsedPsbtInput(parsed) {
|
|
408
|
+
return ['p2sh', 'p2shP2wsh', 'p2wsh'].includes(parsed.scriptType);
|
|
338
409
|
}
|
|
339
|
-
|
|
410
|
+
psbt.data.inputs.forEach((input, i) => {
|
|
411
|
+
const parsed = parsePsbtInput(input);
|
|
412
|
+
assert.ok(isP2msParsedPsbtInput(parsed), `unsupported script type ${parsed.scriptType}`);
|
|
413
|
+
assert.ok(input.partialSig?.length === 1, `unexpected signature count ${input.partialSig?.length}`);
|
|
414
|
+
const [partialSig] = input.partialSig;
|
|
415
|
+
assert.ok(input.sighashType !== undefined && input.sighashType === bitcoinjs_lib_1.script.signature.decode(partialSig.signature).hashType, 'signature sighash does not match input sighash type');
|
|
416
|
+
// type casting is to address the invalid type checking in payments.p2ms
|
|
417
|
+
const signatures = parsed.publicKeys.map((pk) => partialSig.pubkey.equals(pk) ? partialSig.signature : bitcoinjs_lib_1.opcodes.OP_0);
|
|
418
|
+
const isP2SH = !!parsed.redeemScript;
|
|
419
|
+
const isP2WSH = !!parsed.witnessScript;
|
|
420
|
+
const payment = index_1.payments.p2ms({ output: parsed.pubScript, signatures }, { validate: false, allowIncomplete: true });
|
|
421
|
+
const p2wsh = isP2WSH ? index_1.payments.p2wsh({ redeem: payment }) : undefined;
|
|
422
|
+
const p2sh = isP2SH ? index_1.payments.p2sh({ redeem: p2wsh || payment }) : undefined;
|
|
423
|
+
if (p2sh?.input) {
|
|
424
|
+
tx.setInputScript(i, p2sh.input);
|
|
425
|
+
}
|
|
426
|
+
if (p2wsh?.witness) {
|
|
427
|
+
tx.setWitness(i, p2wsh.witness);
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
return tx;
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Clones the psbt without nonWitnessUtxo for non-segwit inputs and witnessUtxo is added instead.
|
|
434
|
+
* It is not BIP-174 compliant, so use it carefully.
|
|
435
|
+
*/
|
|
436
|
+
function clonePsbtWithoutNonWitnessUtxo(psbt) {
|
|
437
|
+
const newPsbt = (0, transaction_1.createPsbtFromHex)(psbt.toHex(), psbt.network);
|
|
438
|
+
const txInputs = psbt.txInputs;
|
|
439
|
+
psbt.data.inputs.forEach((input, i) => {
|
|
440
|
+
if (input.nonWitnessUtxo && !input.witnessUtxo) {
|
|
441
|
+
const tx = (0, transaction_1.createTransactionFromBuffer)(input.nonWitnessUtxo, psbt.network, { amountType: 'bigint' });
|
|
442
|
+
if (!txInputs[i].hash.equals(tx.getHash())) {
|
|
443
|
+
throw new Error(`Non-witness UTXO hash for input #${i} doesn't match the hash specified in the prevout`);
|
|
444
|
+
}
|
|
445
|
+
newPsbt.data.inputs[i].witnessUtxo = tx.outs[txInputs[i].index];
|
|
446
|
+
}
|
|
447
|
+
delete newPsbt.data.inputs[i].nonWitnessUtxo;
|
|
448
|
+
});
|
|
449
|
+
return newPsbt;
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Returns true if there are non-segwit inputs in the PSBT that do not contain the
|
|
453
|
+
* nonWitnessUtxo.
|
|
454
|
+
*
|
|
455
|
+
* isPsbtLite(clonePsbtWithoutNonWitnessUtxo(psbt)) === true
|
|
456
|
+
*
|
|
457
|
+
* @param psbt
|
|
458
|
+
*/
|
|
459
|
+
function isPsbtLite(psbt) {
|
|
460
|
+
let isFull = true;
|
|
461
|
+
const nonSegwitInputTypes = ['p2shP2pk', 'p2sh'];
|
|
462
|
+
psbt.data.inputs.forEach((input) => {
|
|
463
|
+
if (isFull && nonSegwitInputTypes.includes(getPsbtInputScriptType(input))) {
|
|
464
|
+
isFull = !!input.nonWitnessUtxo;
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
return !isFull;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Deletes witnessUtxo for non-segwit inputs to make the PSBT BIP-174 compliant.
|
|
471
|
+
*/
|
|
472
|
+
function deleteWitnessUtxoForNonSegwitInputs(psbt) {
|
|
473
|
+
psbt.data.inputs.forEach((input, i) => {
|
|
474
|
+
const scriptType = getPsbtInputScriptType(input);
|
|
475
|
+
if (scriptType === 'p2sh' || scriptType === 'p2shP2pk') {
|
|
476
|
+
delete input.witnessUtxo;
|
|
477
|
+
}
|
|
478
|
+
});
|
|
340
479
|
}
|
|
341
|
-
exports.isPsbt = isPsbt;
|
|
342
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFDakMsMENBQXVDO0FBQ3ZDLHdEQUFxRDtBQUNyRCxvREFBNkc7QUFFN0csd0NBQW9EO0FBQ3BELGdEQUEyRDtBQUUzRCx1Q0FBMkQ7QUFDM0QsZ0RBQXFEO0FBRXJELDhDQWN1QjtBQUN2QixzQ0FBdUQ7QUFDdkQsb0NBQW1DO0FBQ25DLDJDQUEwRDtBQUMxRCxpREFBMkQ7QUFDM0QsdUNBQXNDO0FBZ0V0QyxTQUFTLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxVQUE2QjtJQUN0RSxNQUFNLGdCQUFnQixHQUFHLCtCQUFrQixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUN6RixNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUN2RCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQ2hFLGdDQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FDcEQsQ0FBQztRQUNGLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUMxRjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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c3NlcnQnO1xuaW1wb3J0IHsgVXR4b1BzYnQgfSBmcm9tICcuLi9VdHhvUHNidCc7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMywgZ2V0TGVhZkhhc2gsIHNjcmlwdFR5cGVGb3JDaGFpbiwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4uL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgRGVyaXZlZFdhbGxldEtleXMsIFJvb3RXYWxsZXRLZXlzIH0gZnJvbSAnLi9XYWxsZXRLZXlzJztcbmltcG9ydCB7IHRvUHJldk91dHB1dFdpdGhQcmV2VHggfSBmcm9tICcuLi9VbnNwZW50JztcbmltcG9ydCB7IGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24gfSBmcm9tICcuLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCB7IGlzV2FsbGV0VW5zcGVudCwgV2FsbGV0VW5zcGVudCB9IGZyb20gJy4vVW5zcGVudCc7XG5pbXBvcnQgeyBjaGVja0ZvcklucHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgUGFydGlhbFNpZywgUHNidElucHV0LCBUYXBTY3JpcHRTaWcgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIGdldExlYWZWZXJzaW9uLFxuICBjYWxjdWxhdGVTY3JpcHRQYXRoTGV2ZWwsXG4gIGlzVmFsaWRDb250cm9sQm9jayxcbiAgUGFyc2VkUHViU2NyaXB0UDJtcyxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdFNjcmlwdFBhdGgsXG4gIHBhcnNlUHViU2NyaXB0Mk9mMyxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdCxcbiAgUGFyc2VkUHViU2NyaXB0VGFwcm9vdEtleVBhdGgsXG4gIHBhcnNlUHViU2NyaXB0LFxuICBQYXJzZWRQdWJTY3JpcHRQMnNoUDJwayxcbiAgUGFyc2VkU2NyaXB0VHlwZSxcbiAgaXNQbGFjZWhvbGRlclNpZ25hdHVyZSxcbiAgcGFyc2VTaWduYXR1cmVTY3JpcHQsXG59IGZyb20gJy4uL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHsgcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MgfSBmcm9tICcuLi9NdXNpZzInO1xuaW1wb3J0IHsgaXNUdXBsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQgfSBmcm9tICcuLi8uLi90YXByb290JztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0LCBUeElucHV0IH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBvcGNvZGVzIH0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuXG4vLyBvbmx5IHVzZWQgZm9yIGJ1aWxkaW5nIGBTaWduYXR1cmVDb250YWluZXJgXG50eXBlIEJhc2VTaWduYXR1cmVDb250YWluZXI8VD4gPSB7XG4gIHNpZ25hdHVyZXM6IFQ7XG59O1xuXG50eXBlIFVuc2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjx1bmRlZmluZWQ+O1xudHlwZSBIYWxmU2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjxbQnVmZmVyXT47XG50eXBlIEZ1bGxTaWduZWRTaWduYXR1cmVDb250YWluZXIgPSBCYXNlU2lnbmF0dXJlQ29udGFpbmVyPFtCdWZmZXIsIEJ1ZmZlcl0+O1xuXG50eXBlIFNpZ25hdHVyZUNvbnRhaW5lciA9IFVuc2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyIHwgSGFsZlNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciB8IEZ1bGxTaWduZWRTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogQ29udGVudHMgb2YgYSBwcmUtZmluYWxpemVkIFBTQlQgSW5wdXQgZm9yIHAydHJNdXNpZzIga2V5IHBhdGggaW4gdGhlIG5vbi1maW5hbGl6ZWQgc3RhdGUuXG4gKiBUIGlzIFtCdWZmZXJdIGZvciBmaXJzdCBzaWduYXR1cmUsIFtCdWZmZXIsIEJ1ZmZlcl0gZm9yIGJvdGggc2lnbmF0dXJlcyBhbmQgYHVuZGVmaW5lZGAgZm9yIG5vIHNpZ25hdHVyZXMuXG4gKi9cbnR5cGUgQmFzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyPFQ+ID0ge1xuICBzaWduYXR1cmVzOiBUO1xuICAvKiogT25seSBjb250YWlucyBwYXJ0aWNpcGFudHMgdGhhdCBoYXZlIGFkZGVkIGEgc2lnbmF0dXJlICovXG4gIHBhcnRpY2lwYW50UHVibGljS2V5czogVDtcbn07XG5cbnR5cGUgVW5zaWduZWRUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjx1bmRlZmluZWQ+O1xudHlwZSBIYWxmU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlcl0+O1xudHlwZSBGdWxsU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlciwgQnVmZmVyXT47XG5cbnR5cGUgVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPVxuICB8IFVuc2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXJcbiAgfCBIYWxmU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXJcbiAgfCBGdWxsU2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogVG8gaG9sZCBwYXJzZWQgcHNidCBkYXRhIGZvciBwMm1zIGJhc2VkIHNjcmlwdCB0eXBlcyAtIHAyc2gsIHAyd3NoLCBhbmQgcDJzaFAyd3NoXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRQMm1zID0gUGFyc2VkUHViU2NyaXB0UDJtcyAmIFNpZ25hdHVyZUNvbnRhaW5lcjtcblxuLyoqXG4gKiBUbyBob2xkIHBhcnNlZCBwc2J0IGRhdGEgZm9yIFRhcHJvb3RLZXlQYXRoU3BlbmQgc2NyaXB0IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRUYXByb290S2V5UGF0aCA9IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3RLZXlQYXRoICYgVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogVG8gaG9sZCBwYXJzZWQgcHNidCBkYXRhIGZvciBUYXByb290U2NyaXB0UGF0aFNwZW5kIHNjcmlwdCBwYXRoIHNjcmlwdCB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBQYXJzZWRQc2J0VGFwcm9vdFNjcmlwdFBhdGggPSBQYXJzZWRQdWJTY3JpcHRUYXByb290U2NyaXB0UGF0aCAmXG4gIFNpZ25hdHVyZUNvbnRhaW5lciAmIHtcbiAgICBjb250cm9sQmxvY2s6IEJ1ZmZlcjtcbiAgICBsZWFmVmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKiBJbmRpY2F0ZXMgdGhlIGxldmVsIGluc2lkZSB0aGUgdGFwdHJlZS4gKi9cbiAgICBzY3JpcHRQYXRoTGV2ZWw6IG51bWJlcjtcbiAgfTtcblxuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFRhcHJvb3QgPSBQYXJzZWRQc2J0VGFwcm9vdEtleVBhdGggfCBQYXJzZWRQc2J0VGFwcm9vdFNjcmlwdFBhdGg7XG5cbnR5cGUgUDJzaFAycGtTaWduYXR1cmVDb250YWluZXIgPSBVbnNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciB8IEhhbGZTaWduZWRTaWduYXR1cmVDb250YWluZXI7XG5cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRQMnNoUDJwayA9IFBhcnNlZFB1YlNjcmlwdFAyc2hQMnBrICYgUDJzaFAycGtTaWduYXR1cmVDb250YWluZXI7XG5cbmludGVyZmFjZSBXYWxsZXRTaWduZXIge1xuICB3YWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlO1xuICByb290S2V5OiBCSVAzMkludGVyZmFjZTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFwcm9vdFNpZ25lcnMoc2NyaXB0OiBCdWZmZXIsIHdhbGxldEtleXM6IERlcml2ZWRXYWxsZXRLZXlzKTogW1dhbGxldFNpZ25lciwgV2FsbGV0U2lnbmVyXSB7XG4gIGNvbnN0IHBhcnNlZFB1YmxpY0tleXMgPSBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXM7XG4gIGNvbnN0IHdhbGxldFNpZ25lcnMgPSBwYXJzZWRQdWJsaWNLZXlzLm1hcCgocHVibGljS2V5KSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSB3YWxsZXRLZXlzLnB1YmxpY0tleXMuZmluZEluZGV4KCh3YWxsZXRQdWJsaWNLZXkpID0+XG4gICAgICB0b1hPbmx5UHVibGljS2V5KHdhbGxldFB1YmxpY0tleSkuZXF1YWxzKHB1YmxpY0tleSlcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4geyB3YWxsZXRLZXk6IHdhbGxldEtleXMudHJpcGxlW2luZGV4XSwgcm9vdEtleTogd2FsbGV0S2V5cy5wYXJlbnQudHJpcGxlW2luZGV4XSB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcHJvb3QgcHVibGljIGtleSBpcyBub3QgYSB3YWxsZXQgcHVibGljIGtleScpO1xuICB9KTtcbiAgcmV0dXJuIFt3YWxsZXRTaWduZXJzWzBdLCB3YWxsZXRTaWduZXJzWzFdXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHNidElucHV0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICB1bnNwZW50OiBXYWxsZXRVbnNwZW50PGJpZ2ludD4sXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5c1xuKTogdm9pZCB7XG4gIGNvbnN0IHNpZ25hdHVyZUNvdW50ID0gcHNidC5nZXRTaWduYXR1cmVDb3VudChpbnB1dEluZGV4KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1bnNwZW50LmNoYWluKTtcbiAgaWYgKHNpZ25hdHVyZUNvdW50ID09PSAwICYmIHNjcmlwdFR5cGUgPT09ICdwMnRyJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KTtcblxuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInKSB7XG4gICAgY29uc3QgaW5wdXQgPSBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0LnRhcExlYWZTY3JpcHQpIHx8IGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCBzdGF0ZS4gTWlzc2luZyByZXF1aXJlZCBmaWVsZHMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIHRhcCBsZWFmIHNjcmlwdCBwZXIgaW5wdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBbc2lnbmVyLCBjb3NpZ25lcl0gPSBnZXRUYXByb290U2lnbmVycyhpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCwgd2FsbGV0S2V5cyk7XG5cbiAgICBjb25zdCBsZWFmSGFzaCA9IGdldExlYWZIYXNoKHtcbiAgICAgIHB1YmxpY0tleXM6IHdhbGxldEtleXMucHVibGljS2V5cyxcbiAgICAgIHNpZ25lcjogc2lnbmVyLndhbGxldEtleS5wdWJsaWNLZXksXG4gICAgICBjb3NpZ25lcjogY29zaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSxcbiAgICB9KTtcblxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbc2lnbmVyLCBjb3NpZ25lcl0ubWFwKCh3YWxsZXRTaWduZXIpID0+ICh7XG4gICAgICAgIGxlYWZIYXNoZXM6IFtsZWFmSGFzaF0sXG4gICAgICAgIHB1YmtleTogdG9YT25seVB1YmxpY0tleSh3YWxsZXRTaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSksXG4gICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHdhbGxldFNpZ25lci5yb290S2V5LCB1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHdhbGxldFNpZ25lci5yb290S2V5LmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChzaWduYXR1cmVDb3VudCA9PT0gMCkge1xuICAgICAgY29uc3QgeyB3aXRuZXNzU2NyaXB0LCByZWRlZW1TY3JpcHQgfSA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMod2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlKTtcbiAgICAgIGlmICh3aXRuZXNzU2NyaXB0ICYmIHBzYnQuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0ud2l0bmVzc1NjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzU2NyaXB0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZGVlbVNjcmlwdCAmJiBwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnJlZGVlbVNjcmlwdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyByZWRlZW1TY3JpcHQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBiaXAzMkRlcml2YXRpb246IFswLCAxLCAyXS5tYXAoKGlkeCkgPT4gKHtcbiAgICAgICAgcHVia2V5OiB3YWxsZXRLZXlzLnRyaXBsZVtpZHhdLnB1YmxpY0tleSxcbiAgICAgICAgcGF0aDogd2FsbGV0S2V5cy5wYXRoc1tpZHhdLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXMudHJpcGxlW2lkeF0uZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJuIFBTQlQgZmlsbGVkIHdpdGggbWV0YXRkYXRhIGFzIHBlciBpbnB1dCBwYXJhbXMgdHgsIHVuc3BlbnRzIGFuZCByb290V2FsbGV0S2V5cy5cbiAqIFVuc2lnbmVkIFBTQlQgZm9yIHRhcHJvb3QgaW5wdXQgd2l0aCB3aXRuZXNzVXR4b1xuICogVW5zaWduZWQgUFNCVCBmb3Igb3RoZXIgaW5wdXQgd2l0aCB3aXRuZXNzVXR4by9ub25XaXRuZXNzVXR4bywgcmVkZWVtU2NyaXB0L3dpdG5lc3NTY3JpcHQsIGJpcDMyRGVyaXZhdGlvblxuICogU2lnbmVkIFBTQlQgZm9yIHRhcHJvb3QgaW5wdXQgd2l0aCB3aXRuZXNzVXR4bywgdGFwTGVhZlNjcmlwdCwgdGFwQmlwMzJEZXJpdmF0aW9uLCB0YXBTY3JpcHRTaWdcbiAqIFNpZ25lZCBQU0JUIGZvciBvdGhlciBpbnB1dCB3aXRoIHdpdG5lc3NVdHhvL25vbldpdG5lc3NVdHhvLCByZWRlZW1TY3JpcHQvd2l0bmVzc1NjcmlwdCwgYmlwMzJEZXJpdmF0aW9uLCBwYXJ0aWFsU2lnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dhbGxldFBzYnQoXG4gIHR4OiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PixcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IFV0eG9Qc2J0IHtcbiAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoKHUpID0+IHtcbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoc2NyaXB0VHlwZUZvckNoYWluKHUuY2hhaW4pLCAncDJ0ck11c2lnMicpO1xuICAgIHJldHVybiB0b1ByZXZPdXRwdXRXaXRoUHJldlR4KHUsIHR4Lm5ldHdvcmspO1xuICB9KTtcbiAgY29uc3QgcHNidCA9IGNyZWF0ZVBzYnRGcm9tVHJhbnNhY3Rpb24odHgsIHByZXZPdXRwdXRzKTtcbiAgdW5zcGVudHMuZm9yRWFjaCgodSwgaSkgPT4ge1xuICAgIGlmIChpc1dhbGxldFVuc3BlbnQodSkgJiYgdS5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVQc2J0SW5wdXQocHNidCwgaSwgdSwgcm9vdFdhbGxldEtleXMpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHNpZ25lclxuICogQHBhcmFtIHVuc3BlbnRcbiAqIEByZXR1cm4gc2lnbmVkIFBTQlQgd2l0aCBzaWduZXIncyBrZXkgZm9yIHVuc3BlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25XYWxsZXRQc2J0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyLFxuICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICB1bnNwZW50OiBXYWxsZXRVbnNwZW50PGJpZ2ludD5cbik6IHZvaWQge1xuICBjb25zdCBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnQuY2hhaW4pO1xuICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHInIHx8IHNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyJykge1xuICAgIHBzYnQuc2lnblRhcHJvb3RJbnB1dEhEKGlucHV0SW5kZXgsIHNpZ25lcik7XG4gIH0gZWxzZSB7XG4gICAgcHNidC5zaWduSW5wdXRIRChpbnB1dEluZGV4LCBzaWduZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNjcmlwdFR5cGUoaW5wdXQ6IFBzYnRJbnB1dCk6IFBhcnNlZFNjcmlwdFR5cGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBpc1AycGsgPSAoc2NyaXB0OiBCdWZmZXIpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2h1bmtzID0gYnNjcmlwdC5kZWNvbXBpbGUoc2NyaXB0KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNodW5rcz8ubGVuZ3RoID09PSAyICYmXG4gICAgICAgIEJ1ZmZlci5pc0J1ZmZlcihjaHVua3NbMF0pICYmXG4gICAgICAgIGJzY3JpcHQuaXNDYW5vbmljYWxQdWJLZXkoY2h1bmtzWzBdKSAmJlxuICAgICAgICBjaHVua3NbMV0gPT09IG9wY29kZXMuT1BfQ0hFQ0tTSUdcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgbGV0IHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGUgfCB1bmRlZmluZWQ7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQucmVkZWVtU2NyaXB0KSAmJiBCdWZmZXIuaXNCdWZmZXIoaW5wdXQud2l0bmVzc1NjcmlwdCkpIHtcbiAgICBzY3JpcHRUeXBlID0gJ3Ayc2hQMndzaCc7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGlucHV0LnJlZGVlbVNjcmlwdCkpIHtcbiAgICBzY3JpcHRUeXBlID0gaXNQMnBrKGlucHV0LnJlZGVlbVNjcmlwdCkgPyAncDJzaFAycGsnIDogJ3Ayc2gnO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC53aXRuZXNzU2NyaXB0KSkge1xuICAgIHNjcmlwdFR5cGUgPSAncDJ3c2gnO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0LnRhcExlYWZTY3JpcHQpICYmIGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMCkge1xuICAgIGlmIChzY3JpcHRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIGJvdGggJHtzY3JpcHRUeXBlfSBhbmQgdGFwcm9vdFNjcmlwdFBhdGggUFNCVCBtZXRhZGF0YS5gKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIHRhcCBsZWFmIHNjcmlwdCBwZXIgaW5wdXQuJyk7XG4gICAgfVxuICAgIHNjcmlwdFR5cGUgPSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCc7XG4gIH1cbiAgaWYgKGlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgaWYgKHNjcmlwdFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgYm90aCAke3NjcmlwdFR5cGV9IGFuZCB0YXByb290S2V5UGF0aCBQU0JUIG1ldGFkYXRhLmApO1xuICAgIH1cbiAgICBzY3JpcHRUeXBlID0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnO1xuICB9XG4gIHJldHVybiBzY3JpcHRUeXBlO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlcyhwc2J0OiBVdHhvUHNidCwgaW5wdXRJbmRleDogbnVtYmVyKTogVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIge1xuICBjb25zdCBwYXJ0aWFsU2lncyA9IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKHBzYnQsIGlucHV0SW5kZXgpO1xuICBpZiAoIXBhcnRpYWxTaWdzKSB7XG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlczogdW5kZWZpbmVkLCBwYXJ0aWNpcGFudFB1YmxpY0tleXM6IHVuZGVmaW5lZCB9O1xuICB9XG4gIGNvbnN0IHNpZ25hdHVyZXMgPSBwYXJ0aWFsU2lncy5tYXAoKHBTaWcpID0+IHBTaWcucGFydGlhbFNpZyk7XG4gIGNvbnN0IHBhcnRpY2lwYW50UHVibGljS2V5cyA9IHBhcnRpYWxTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWNpcGFudFB1YktleSk7XG4gIHJldHVybiBpc1R1cGxlPEJ1ZmZlcj4oc2lnbmF0dXJlcykgJiYgaXNUdXBsZTxCdWZmZXI+KHBhcnRpY2lwYW50UHVibGljS2V5cylcbiAgICA/IHsgc2lnbmF0dXJlcywgcGFydGljaXBhbnRQdWJsaWNLZXlzIH1cbiAgICA6IHsgc2lnbmF0dXJlczogW3NpZ25hdHVyZXNbMF1dLCBwYXJ0aWNpcGFudFB1YmxpY0tleXM6IFtwYXJ0aWNpcGFudFB1YmxpY0tleXNbMF1dIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFydGlhbE9yVGFwU2NyaXB0U2lnbmF0dXJlcyhzaWc6IFBhcnRpYWxTaWdbXSB8IFRhcFNjcmlwdFNpZ1tdIHwgdW5kZWZpbmVkKTogU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgaWYgKCFzaWc/Lmxlbmd0aCkge1xuICAgIHJldHVybiB7IHNpZ25hdHVyZXM6IHVuZGVmaW5lZCB9O1xuICB9XG4gIGlmIChzaWcubGVuZ3RoID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBzaWduYXR1cmUgY291bnQnKTtcbiAgfVxuICBjb25zdCBzaWduYXR1cmVzID0gc2lnLm1hcCgodFNpZykgPT4gdFNpZy5zaWduYXR1cmUpO1xuICByZXR1cm4gaXNUdXBsZTxCdWZmZXI+KHNpZ25hdHVyZXMpID8geyBzaWduYXR1cmVzIH0gOiB7IHNpZ25hdHVyZXM6IFtzaWduYXR1cmVzWzBdXSB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVNpZ25hdHVyZXMoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGVcbik6IFNpZ25hdHVyZUNvbnRhaW5lciB8IFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICByZXR1cm4gc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXG4gICAgPyBwYXJzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlcyhwc2J0LCBpbnB1dEluZGV4KVxuICAgIDogc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnXG4gICAgPyBwYXJzZVBhcnRpYWxPclRhcFNjcmlwdFNpZ25hdHVyZXMoaW5wdXQudGFwU2NyaXB0U2lnKVxuICAgIDogcGFyc2VQYXJ0aWFsT3JUYXBTY3JpcHRTaWduYXR1cmVzKGlucHV0LnBhcnRpYWxTaWcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNjcmlwdChcbiAgaW5wdXQ6IFBzYnRJbnB1dCxcbiAgc2NyaXB0VHlwZTogUGFyc2VkU2NyaXB0VHlwZVxuKTogUGFyc2VkUHViU2NyaXB0UDJtcyB8IFBhcnNlZFB1YlNjcmlwdFRhcHJvb3QgfCBQYXJzZWRQdWJTY3JpcHRQMnNoUDJwayB7XG4gIGxldCBwdWJTY3JpcHQ6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnNoJyB8fCBzY3JpcHRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgcHViU2NyaXB0ID0gaW5wdXQucmVkZWVtU2NyaXB0O1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICdwMndzaCcgfHwgc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICBwdWJTY3JpcHQgPSBpbnB1dC53aXRuZXNzU2NyaXB0O1xuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykge1xuICAgIHB1YlNjcmlwdCA9IGlucHV0LnRhcExlYWZTY3JpcHQgPyBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChzY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpIHtcbiAgICBpZiAoaW5wdXQud2l0bmVzc1V0eG8/LnNjcmlwdCkge1xuICAgICAgcHViU2NyaXB0ID0gaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0O1xuICAgIH0gZWxzZSBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXkgJiYgaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgcHViU2NyaXB0ID0gY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7IGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSwgdGFwdHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QgfSk7XG4gICAgfVxuICB9XG4gIGlmICghcHViU2NyaXB0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFBTQlQgc3RhdGUgZm9yICR7c2NyaXB0VHlwZX0uIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLmApO1xuICB9XG4gIHJldHVybiBwYXJzZVB1YlNjcmlwdChwdWJTY3JpcHQsIHNjcmlwdFR5cGUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUlucHV0TWV0YWRhdGEoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGVcbik6IFBhcnNlZFBzYnRQMm1zIHwgUGFyc2VkUHNidFRhcHJvb3QgfCBQYXJzZWRQc2J0UDJzaFAycGsge1xuICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQocHNidC5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gIGNvbnN0IHBhcnNlZFB1YlNjcmlwdCA9IHBhcnNlU2NyaXB0KGlucHV0LCBzY3JpcHRUeXBlKTtcbiAgY29uc3Qgc2lnbmF0dXJlcyA9IHBhcnNlU2lnbmF0dXJlcyhwc2J0LCBpbnB1dEluZGV4LCBzY3JpcHRUeXBlKTtcblxuICBpZiAocGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyAmJiAncGFydGljaXBhbnRQdWJsaWNLZXlzJyBpbiBzaWduYXR1cmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIC4uLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuICBpZiAocGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykge1xuICAgIGlmICghaW5wdXQudGFwTGVhZlNjcmlwdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgc3RhdGUgZm9yIHRhcHJvb3RTY3JpcHRQYXRoU3BlbmQuIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLicpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sQmxvY2sgPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLmNvbnRyb2xCbG9jaztcbiAgICBpZiAoIWlzVmFsaWRDb250cm9sQm9jayhjb250cm9sQmxvY2spKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCB0YXByb290U2NyaXB0UGF0aFNwZW5kIGNvbnRyb2xCbG9jay4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2NyaXB0UGF0aExldmVsID0gY2FsY3VsYXRlU2NyaXB0UGF0aExldmVsKGNvbnRyb2xCbG9jayk7XG4gICAgY29uc3QgbGVhZlZlcnNpb24gPSBnZXRMZWFmVmVyc2lvbihjb250cm9sQmxvY2spO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICAuLi5zaWduYXR1cmVzLFxuICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgc2NyaXB0UGF0aExldmVsLFxuICAgICAgbGVhZlZlcnNpb24sXG4gICAgfTtcbiAgfVxuICBpZiAoXG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoJyB8fFxuICAgIHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJ3c2gnIHx8XG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoUDJ3c2gnXG4gICkge1xuICAgIGlmIChwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgIHBhcnNlZFB1YlNjcmlwdC5yZWRlZW1TY3JpcHQgPSBpbnB1dC5yZWRlZW1TY3JpcHQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICAuLi5zaWduYXR1cmVzLFxuICAgIH07XG4gIH1cbiAgaWYgKHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJzaFAycGsnICYmICghc2lnbmF0dXJlcy5zaWduYXR1cmVzIHx8ICFpc1R1cGxlKHNpZ25hdHVyZXMuc2lnbmF0dXJlcykpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIHNpZ25hdHVyZXM6IHNpZ25hdHVyZXMuc2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwdWIgc2NyaXB0Jyk7XG59XG5cbi8qKlxuICogQHJldHVybiBwc2J0IG1ldGFkYXRhIGFyZSBwYXJzZWQgYXMgcGVyIGJlbG93IGNvbmRpdGlvbnMuXG4gKiByZWRlZW1TY3JpcHQvd2l0bmVzc1NjcmlwdC90YXBMZWFmU2NyaXB0IG1hdGNoZXMgQml0R28uXG4gKiBzaWduYXR1cmUgYW5kIHB1YmxpYyBrZXkgY291bnQgbWF0Y2hlcyBCaXRHby5cbiAqIFAyU0gtUDJQSyA9PiBzY3JpcHRUeXBlLCByZWRlZW1TY3JpcHQsIHB1YmxpYyBrZXksIHNpZ25hdHVyZS5cbiAqIFAyU0ggPT4gc2NyaXB0VHlwZSwgcmVkZWVtU2NyaXB0LCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFBXMlNIID0+IHNjcmlwdFR5cGUsIHdpdG5lc3NTY3JpcHQsIHB1YmxpYyBrZXlzLCBzaWduYXR1cmVzLlxuICogUDJTSC1QVzJTSCA9PiBzY3JpcHRUeXBlLCByZWRlZW1TY3JpcHQsIHdpdG5lc3NTY3JpcHQsIHB1YmxpYyBrZXlzLCBzaWduYXR1cmVzLlxuICogUDJUUiBhbmQgUDJUUiBNVVNJRzIgc2NyaXB0IHBhdGggPT4gc2NyaXB0VHlwZSAodGFwcm9vdFNjcmlwdFBhdGhTcGVuZCksIHB1YlNjcmlwdCAobGVhZiBzY3JpcHQpLCBjb250cm9sQmxvY2ssXG4gKiBzY3JpcHRQYXRoTGV2ZWwsIGxlYWZWZXJzaW9uLCBwdWJsaWMga2V5cywgc2lnbmF0dXJlcy5cbiAqIFAyVFIgTVVTSUcyIGtlcCBwYXRoID0+IHNjcmlwdFR5cGUgKHRhcHJvb3RLZXlQYXRoU3BlbmQpLCBwdWJTY3JpcHQgKHNjcmlwdFB1YktleSksIHBhcnRpY2lwYW50IHB1YiBrZXlzIChzaWduZXIpLFxuICogcHVibGljIGtleSAodGFwT3V0cHV0a2V5KSwgc2lnbmF0dXJlcyAocGFydGlhbCBzaWduZXIgc2lncykuXG4gKiBBbnkgdW5zaWduZWQgUFNCVCBhbmQgd2l0aG91dCByZXF1aXJlZCBtZXRhZGF0YSBpcyByZXR1cm5lZCB3aXRoIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHNidElucHV0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgaW5wdXRJbmRleDogbnVtYmVyXG4pOiBQYXJzZWRQc2J0UDJtcyB8IFBhcnNlZFBzYnRUYXByb290IHwgUGFyc2VkUHNidFAyc2hQMnBrIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICBpZiAocHNidC5pc0lucHV0RmluYWxpemVkKGlucHV0SW5kZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaW5hbGl6ZWQgUFNCVCBwYXJzaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuICBjb25zdCBzY3JpcHRUeXBlID0gZ2V0U2NyaXB0VHlwZShpbnB1dCk7XG4gIGlmICghc2NyaXB0VHlwZSkge1xuICAgIGlmIChwc2J0LmdldFNpZ25hdHVyZUNvdW50KGlucHV0SW5kZXgpID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgc3RhdGUuIFNpZ25hdHVyZXMgZm91bmQgd2l0aG91dCBzY3JpcHRzLicpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBwYXJzZUlucHV0TWV0YWRhdGEocHNidCwgaW5wdXRJbmRleCwgc2NyaXB0VHlwZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2lnbmF0dXJlQ291bnQoXG4gIHNpZ25hdHVyZXM6IFtCdWZmZXIgfCAwLCBCdWZmZXIgfCAwLCBCdWZmZXIgfCAwXSB8IFtCdWZmZXIsIEJ1ZmZlcl0gfCBbQnVmZmVyXSB8IHVuZGVmaW5lZFxuKTogMCB8IDEgfCAyIHtcbiAgY29uc3QgY291bnQgPSBzaWduYXR1cmVzID8gc2lnbmF0dXJlcy5maWx0ZXIoKHMpID0+ICFpc1BsYWNlaG9sZGVyU2lnbmF0dXJlKHMpKS5sZW5ndGggOiAwO1xuICBpZiAoY291bnQgPT09IDAgfHwgY291bnQgPT09IDEgfHwgY291bnQgPT09IDIpIHtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZSBjb3VudCcpO1xufVxuXG5mdW5jdGlvbiBnZXRJbnB1dFNpZ25hdHVyZUNvdW50KHBhcmFtOiBUeElucHV0IHwgeyBwc2J0OiBVdHhvUHNidDsgaW5wdXRJbmRleDogbnVtYmVyIH0pOiAwIHwgMSB8IDIge1xuICBpZiAoJ3BzYnQnIGluIHBhcmFtKSB7XG4gICAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZVBzYnRJbnB1dChwYXJhbS5wc2J0LCBwYXJhbS5pbnB1dEluZGV4KTtcbiAgICBhc3NlcnQocGFyc2VkSW5wdXQsICdpbnZhbGlkIHBzYnQgaW5wdXQnKTtcbiAgICByZXR1cm4gcGFyc2VTaWduYXR1cmVDb3VudChwYXJzZWRJbnB1dC5zaWduYXR1cmVzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyYW0uc2NyaXB0Py5sZW5ndGggfHwgcGFyYW0ud2l0bmVzcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlU2lnbmF0dXJlU2NyaXB0KHBhcmFtKTtcbiAgICAgIHJldHVybiBwYXJzZWRJbnB1dC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAyIDogcGFyc2VTaWduYXR1cmVDb3VudChwYXJzZWRJbnB1dC5zaWduYXR1cmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJucyBtYXhpbXVtIG51bWJlciBvZiBzaWduYXR1cmVzIGFjcm9zcyBhbGwgaW5wdXRzIC0gMCwgMSBhbmQgMi5cbiAqIEl0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGdpdmVuIHBzYnQvdHJhbnNhY3Rpb24vYXJyYXkgb2YgVHhJbnB1dHMgaXMgdW5zaWduZWQoMCksIGhhbGYtc2lnbmVkKDEpIG9yIGZ1bGx5LXNpZ25lZCgyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpZ25hdHVyZUNvdW50KFxuICB0eDogVXR4b1BzYnQgfCBVdHhvVHJhbnNhY3Rpb248bnVtYmVyIHwgYmlnaW50PiB8IFR4SW5wdXRbXSxcbiAgaW5wdXRJbmRleD86IG51bWJlclxuKTogMCB8IDEgfCAyIHtcbiAgY29uc3QgY29uc3RydWN0UGFyYW0gPSAodHg6IFV0eG9Qc2J0IHwgVXR4b1RyYW5zYWN0aW9uPG51bWJlciB8IGJpZ2ludD4gfCBUeElucHV0W10sIGlucHV0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiB0eCBpbnN0YW5jZW9mIFV0eG9Qc2J0XG4gICAgICA/IHsgcHNidDogdHgsIGlucHV0SW5kZXggfVxuICAgICAgOiAodHggaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24gPyB0eC5pbnMgOiB0eClbaW5wdXRJbmRleF07XG4gIH07XG5cbiAgY29uc3QgaW5wdXRzID0gdHggaW5zdGFuY2VvZiBVdHhvUHNidCA/IHR4LmRhdGEuaW5wdXRzIDogdHggaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24gPyB0eC5pbnMgOiB0eDtcbiAgYXNzZXJ0KGlucHV0SW5kZXggPT09IHVuZGVmaW5lZCB8fCAoaW5wdXRJbmRleCA+PSAwICYmIGlucHV0SW5kZXggPCBpbnB1dHMubGVuZ3RoKSwgJ2ludmFsaWQgaW5wdXRJbmRleCByYW5nZScpO1xuICBjb25zdCBpbmRpY2VzID0gaW5wdXRJbmRleCA9PT0gdW5kZWZpbmVkID8gaW5wdXRzLm1hcCgoXywgaW5kZXgpID0+IGluZGV4KSA6IFtpbnB1dEluZGV4XTtcbiAgcmV0dXJuIGluZGljZXNcbiAgICAubWFwKChpbmRleCwgXykgPT4gZ2V0SW5wdXRTaWduYXR1cmVDb3VudChjb25zdHJ1Y3RQYXJhbSh0eCwgaW5kZXgpKSlcbiAgICAucmVkdWNlKChwcmV2LCBjdXJyKSA9PiAoY3VyciA+IHByZXYgPyBjdXJyIDogcHJldiksIDApO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgZGF0YSBzdGFydHMgd2l0aCBtYWdpYyBQU0JUIGJ5dGUgc2VxdWVuY2VcbiAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgb3IgaGV4IHN0cmluZ1xuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnQoZGF0YTogQnVmZmVyIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAxNzQubWVkaWF3aWtpI3NwZWNpZmljYXRpb25cbiAgLy8gMHg3MDczNjI3NCAtIEFTQ0lJIGZvciAncHNidCcuIDB4ZmYgLSBzZXBhcmF0b3JcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IDEwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLnNsaWNlKDAsIDEwKSwgJ2hleCcpO1xuICB9XG4gIHJldHVybiA1IDw9IGRhdGEubGVuZ3RoICYmIGRhdGEucmVhZFVJbnQzMkJFKDApID09PSAweDcwNzM2Mjc0ICYmIGRhdGEucmVhZFVJbnQ4KDQpID09PSAweGZmO1xufVxuIl19
|
|
480
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvUHNidC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdNQSxvQ0FnQkM7QUFTRCx3Q0FZQztBQUtELHdEQXlDQztBQXlFRCx3Q0FzREM7QUFPRCw4Q0FNQztBQU1ELDBEQW9CQztBQU1ELDREQUtDO0FBS0QsNENBRUM7QUFLRCx3Q0FHQztBQUtELGdGQWtCQztBQVFELHdDQWNDO0FBT0QsMEVBUUM7QUFNRCxrRUF5Q0M7QUFNRCx3RUFnQkM7QUFVRCxnQ0FTQztBQUtELGtGQU9DO0FBbm5CRCxpQ0FBaUM7QUFHakMsZ0RBQXFEO0FBRXJELHVDQUF1QztBQUN2QywwQ0FBdUM7QUFFdkMsd0RBQXFEO0FBQ3JELG9EQU0wQjtBQUMxQiw2Q0FBaUU7QUFDakUsd0NBQW9EO0FBQ3BELGdEQUEyRztBQUMzRyx1Q0FBMkQ7QUFFM0QsOENBZXVCO0FBQ3ZCLHNDQUF1RDtBQUN2RCxvQ0FBMkM7QUFDM0MsMkNBQTBEO0FBQzFELGlEQUEyRTtBQUMzRSx1Q0FBZ0Q7QUFDaEQsMENBQStFO0FBcUUvRSxTQUFTLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxVQUE2QjtJQUN0RSxNQUFNLGdCQUFnQixHQUFHLElBQUEsK0JBQWtCLEVBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ3pGLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FDaEUsSUFBQSxnQ0FBZ0IsRUFBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQ3BELENBQUM7UUFDRixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxT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IGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgeyBHbG9iYWxYcHViLCBQYXJ0aWFsU2lnLCBQc2J0SW5wdXQsIFRhcFNjcmlwdFNpZyB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY2hlY2tGb3JJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlIH0gZnJvbSAnYmlwMzInO1xuaW1wb3J0ICogYXMgYnM1OGNoZWNrIGZyb20gJ2JzNThjaGVjayc7XG5pbXBvcnQgeyBVdHhvUHNidCB9IGZyb20gJy4uL1V0eG9Qc2J0JztcbmltcG9ydCB7IFBzYnQgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMsXG4gIGdldExlYWZIYXNoLFxuICBTY3JpcHRUeXBlMk9mMyxcbiAgc2NyaXB0VHlwZUZvckNoYWluLFxuICB0b1hPbmx5UHVibGljS2V5LFxufSBmcm9tICcuLi9vdXRwdXRTY3JpcHRzJztcbmltcG9ydCB7IERlcml2ZWRXYWxsZXRLZXlzLCBSb290V2FsbGV0S2V5cyB9IGZyb20gJy4vV2FsbGV0S2V5cyc7XG5pbXBvcnQgeyB0b1ByZXZPdXRwdXRXaXRoUHJldlR4IH0gZnJvbSAnLi4vVW5zcGVudCc7XG5pbXBvcnQgeyBjcmVhdGVQc2J0RnJvbUhleCwgY3JlYXRlUHNidEZyb21UcmFuc2FjdGlvbiwgY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgaXNXYWxsZXRVbnNwZW50LCBXYWxsZXRVbnNwZW50IH0gZnJvbSAnLi9VbnNwZW50JztcblxuaW1wb3J0IHtcbiAgZ2V0TGVhZlZlcnNpb24sXG4gIGNhbGN1bGF0ZVNjcmlwdFBhdGhMZXZlbCxcbiAgaXNWYWxpZENvbnRyb2xCb2NrLFxuICBQYXJzZWRQdWJTY3JpcHRQMm1zLFxuICBQYXJzZWRQdWJTY3JpcHRUYXByb290U2NyaXB0UGF0aCxcbiAgcGFyc2VQdWJTY3JpcHQyT2YzLFxuICBQYXJzZWRQdWJTY3JpcHRUYXByb290LFxuICBQYXJzZWRQdWJTY3JpcHRUYXByb290S2V5UGF0aCxcbiAgcGFyc2VQdWJTY3JpcHQsXG4gIFBhcnNlZFB1YlNjcmlwdFAyc2hQMnBrLFxuICBQYXJzZWRTY3JpcHRUeXBlLFxuICBpc1BsYWNlaG9sZGVyU2lnbmF0dXJlLFxuICBwYXJzZVNpZ25hdHVyZVNjcmlwdCxcbiAgUGFyc2VkU2NyaXB0VHlwZTJPZjMsXG59IGZyb20gJy4uL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHsgcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MgfSBmcm9tICcuLi9NdXNpZzInO1xuaW1wb3J0IHsgaXNUdXBsZSwgVHJpcGxlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCB9IGZyb20gJy4uLy4uL3RhcHJvb3QnO1xuaW1wb3J0IHsgb3Bjb2RlcyBhcyBvcHMsIHNjcmlwdCBhcyBic2NyaXB0LCBUeElucHV0IH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgeyBvcGNvZGVzLCBwYXltZW50cyB9IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IGdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50LCBpc1BzYnRJbnB1dEZpbmFsaXplZCB9IGZyb20gJy4uL1BzYnRVdGlsJztcblxuLy8gb25seSB1c2VkIGZvciBidWlsZGluZyBgU2lnbmF0dXJlQ29udGFpbmVyYFxudHlwZSBCYXNlU2lnbmF0dXJlQ29udGFpbmVyPFQ+ID0ge1xuICBzaWduYXR1cmVzOiBUO1xufTtcblxudHlwZSBVbnNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VTaWduYXR1cmVDb250YWluZXI8dW5kZWZpbmVkPjtcbnR5cGUgSGFsZlNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciA9IEJhc2VTaWduYXR1cmVDb250YWluZXI8W0J1ZmZlcl0+O1xudHlwZSBGdWxsU2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVNpZ25hdHVyZUNvbnRhaW5lcjxbQnVmZmVyLCBCdWZmZXJdPjtcblxudHlwZSBTaWduYXR1cmVDb250YWluZXIgPSBVbnNpZ25lZFNpZ25hdHVyZUNvbnRhaW5lciB8IEhhbGZTaWduZWRTaWduYXR1cmVDb250YWluZXIgfCBGdWxsU2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyO1xuXG4vKipcbiAqIENvbnRlbnRzIG9mIGEgcHJlLWZpbmFsaXplZCBQU0JUIElucHV0IGZvciBwMnRyTXVzaWcyIGtleSBwYXRoIGluIHRoZSBub24tZmluYWxpemVkIHN0YXRlLlxuICogVCBpcyBbQnVmZmVyXSBmb3IgZmlyc3Qgc2lnbmF0dXJlLCBbQnVmZmVyLCBCdWZmZXJdIGZvciBib3RoIHNpZ25hdHVyZXMgYW5kIGB1bmRlZmluZWRgIGZvciBubyBzaWduYXR1cmVzLlxuICovXG50eXBlIEJhc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZUNvbnRhaW5lcjxUPiA9IHtcbiAgc2lnbmF0dXJlczogVDtcbiAgLyoqIE9ubHkgY29udGFpbnMgcGFydGljaXBhbnRzIHRoYXQgaGF2ZSBhZGRlZCBhIHNpZ25hdHVyZSAqL1xuICBwYXJ0aWNpcGFudFB1YmxpY0tleXM6IFQ7XG59O1xuXG50eXBlIFVuc2lnbmVkVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIgPSBCYXNlVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXI8dW5kZWZpbmVkPjtcbnR5cGUgSGFsZlNpZ25lZFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyPFtCdWZmZXJdPjtcbnR5cGUgRnVsbFNpZ25lZFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyID0gQmFzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyPFtCdWZmZXIsIEJ1ZmZlcl0+O1xuXG50eXBlIFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyID1cbiAgfCBVbnNpZ25lZFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyXG4gIHwgSGFsZlNpZ25lZFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyXG4gIHwgRnVsbFNpZ25lZFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyO1xuXG4vKipcbiAqIFRvIGhvbGQgcGFyc2VkIHBzYnQgZGF0YSBmb3IgcDJtcyBiYXNlZCBzY3JpcHQgdHlwZXMgLSBwMnNoLCBwMndzaCwgYW5kIHAyc2hQMndzaFxuICovXG5leHBvcnQgdHlwZSBQYXJzZWRQc2J0UDJtcyA9IFBhcnNlZFB1YlNjcmlwdFAybXMgJiBTaWduYXR1cmVDb250YWluZXI7XG5cbi8qKlxuICogVG8gaG9sZCBwYXJzZWQgcHNidCBkYXRhIGZvciBUYXByb290S2V5UGF0aFNwZW5kIHNjcmlwdCB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBQYXJzZWRQc2J0VGFwcm9vdEtleVBhdGggPSBQYXJzZWRQdWJTY3JpcHRUYXByb290S2V5UGF0aCAmIFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyO1xuXG4vKipcbiAqIFRvIGhvbGQgcGFyc2VkIHBzYnQgZGF0YSBmb3IgVGFwcm9vdFNjcmlwdFBhdGhTcGVuZCBzY3JpcHQgcGF0aCBzY3JpcHQgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFyc2VkUHNidFRhcHJvb3RTY3JpcHRQYXRoID0gUGFyc2VkUHViU2NyaXB0VGFwcm9vdFNjcmlwdFBhdGggJlxuICBTaWduYXR1cmVDb250YWluZXIgJiB7XG4gICAgY29udHJvbEJsb2NrOiBCdWZmZXI7XG4gICAgbGVhZlZlcnNpb246IG51bWJlcjtcbiAgICAvKiogSW5kaWNhdGVzIHRoZSBsZXZlbCBpbnNpZGUgdGhlIHRhcHRyZWUuICovXG4gICAgc2NyaXB0UGF0aExldmVsOiBudW1iZXI7XG4gIH07XG5cbmV4cG9ydCB0eXBlIFBhcnNlZFBzYnRUYXByb290ID0gUGFyc2VkUHNidFRhcHJvb3RLZXlQYXRoIHwgUGFyc2VkUHNidFRhcHJvb3RTY3JpcHRQYXRoO1xuXG50eXBlIFAyc2hQMnBrU2lnbmF0dXJlQ29udGFpbmVyID0gVW5zaWduZWRTaWduYXR1cmVDb250YWluZXIgfCBIYWxmU2lnbmVkU2lnbmF0dXJlQ29udGFpbmVyO1xuXG5leHBvcnQgdHlwZSBQYXJzZWRQc2J0UDJzaFAycGsgPSBQYXJzZWRQdWJTY3JpcHRQMnNoUDJwayAmIFAyc2hQMnBrU2lnbmF0dXJlQ29udGFpbmVyO1xuXG5pbnRlcmZhY2UgV2FsbGV0U2lnbmVyIHtcbiAgd2FsbGV0S2V5OiBCSVAzMkludGVyZmFjZTtcbiAgcm9vdEtleTogQklQMzJJbnRlcmZhY2U7XG59XG5cbi8qKlxuICogcHNidCBpbnB1dCBpbmRleCBhbmQgaXRzIHVzZXIsIGJhY2t1cCwgYml0Z28gc2lnbmF0dXJlcyBzdGF0dXNcbiAqL1xuZXhwb3J0IHR5cGUgU2lnbmF0dXJlVmFsaWRhdGlvbiA9IFtpbmRleDogbnVtYmVyLCBzaWdUcmlwbGU6IFRyaXBsZTxib29sZWFuPl07XG5cbmZ1bmN0aW9uIGdldFRhcHJvb3RTaWduZXJzKHNjcmlwdDogQnVmZmVyLCB3YWxsZXRLZXlzOiBEZXJpdmVkV2FsbGV0S2V5cyk6IFtXYWxsZXRTaWduZXIsIFdhbGxldFNpZ25lcl0ge1xuICBjb25zdCBwYXJzZWRQdWJsaWNLZXlzID0gcGFyc2VQdWJTY3JpcHQyT2YzKHNjcmlwdCwgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnKS5wdWJsaWNLZXlzO1xuICBjb25zdCB3YWxsZXRTaWduZXJzID0gcGFyc2VkUHVibGljS2V5cy5tYXAoKHB1YmxpY0tleSkgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gd2FsbGV0S2V5cy5wdWJsaWNLZXlzLmZpbmRJbmRleCgod2FsbGV0UHVibGljS2V5KSA9PlxuICAgICAgdG9YT25seVB1YmxpY0tleSh3YWxsZXRQdWJsaWNLZXkpLmVxdWFscyhwdWJsaWNLZXkpXG4gICAgKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHsgd2FsbGV0S2V5OiB3YWxsZXRLZXlzLnRyaXBsZVtpbmRleF0sIHJvb3RLZXk6IHdhbGxldEtleXMucGFyZW50LnRyaXBsZVtpbmRleF0gfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXByb290IHB1YmxpYyBrZXkgaXMgbm90IGEgd2FsbGV0IHB1YmxpYyBrZXknKTtcbiAgfSk7XG4gIHJldHVybiBbd2FsbGV0U2lnbmVyc1swXSwgd2FsbGV0U2lnbmVyc1sxXV07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBzYnRJbnB1dChcbiAgcHNidDogVXR4b1BzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgdW5zcGVudDogV2FsbGV0VW5zcGVudDxiaWdpbnQ+LFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IHZvaWQge1xuICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQocHNidC5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gIGNvbnN0IHNpZ25hdHVyZUNvdW50ID0gZ2V0UHNidElucHV0U2lnbmF0dXJlQ291bnQoaW5wdXQpO1xuICBjb25zdCBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnQuY2hhaW4pO1xuICBpZiAoc2lnbmF0dXJlQ291bnQgPT09IDAgJiYgc2NyaXB0VHlwZSA9PT0gJ3AydHInKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHdhbGxldEtleXMgPSByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KHVuc3BlbnQuY2hhaW4sIHVuc3BlbnQuaW5kZXgpO1xuXG4gIGlmIChzY3JpcHRUeXBlID09PSAncDJ0cicpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQudGFwTGVhZlNjcmlwdCkgfHwgaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBQU0JUIHN0YXRlLiBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4nKTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdC5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdGdvIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgdGFwIGxlYWYgc2NyaXB0IHBlciBpbnB1dCcpO1xuICAgIH1cblxuICAgIGNvbnN0IFtzaWduZXIsIGNvc2lnbmVyXSA9IGdldFRhcHJvb3RTaWduZXJzKGlucHV0LnRhcExlYWZTY3JpcHRbMF0uc2NyaXB0LCB3YWxsZXRLZXlzKTtcblxuICAgIGNvbnN0IGxlYWZIYXNoID0gZ2V0TGVhZkhhc2goe1xuICAgICAgcHVibGljS2V5czogd2FsbGV0S2V5cy5wdWJsaWNLZXlzLFxuICAgICAgc2lnbmVyOiBzaWduZXIud2FsbGV0S2V5LnB1YmxpY0tleSxcbiAgICAgIGNvc2lnbmVyOiBjb3NpZ25lci53YWxsZXRLZXkucHVibGljS2V5LFxuICAgIH0pO1xuXG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBCaXAzMkRlcml2YXRpb246IFtzaWduZXIsIGNvc2lnbmVyXS5tYXAoKHdhbGxldFNpZ25lcikgPT4gKHtcbiAgICAgICAgbGVhZkhhc2hlczogW2xlYWZIYXNoXSxcbiAgICAgICAgcHVia2V5OiB0b1hPbmx5UHVibGljS2V5KHdhbGxldFNpZ25lci53YWxsZXRLZXkucHVibGljS2V5KSxcbiAgICAgICAgcGF0aDogcm9vdFdhbGxldEtleXMuZ2V0RGVyaXZhdGlvblBhdGgod2FsbGV0U2lnbmVyLnJvb3RLZXksIHVuc3BlbnQuY2hhaW4sIHVuc3BlbnQuaW5kZXgpLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogd2FsbGV0U2lnbmVyLnJvb3RLZXkuZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHNpZ25hdHVyZUNvdW50ID09PSAwKSB7XG4gICAgICBjb25zdCB7IHdpdG5lc3NTY3JpcHQsIHJlZGVlbVNjcmlwdCB9ID0gY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyh3YWxsZXRLZXlzLnB1YmxpY0tleXMsIHNjcmlwdFR5cGUpO1xuICAgICAgaWYgKHdpdG5lc3NTY3JpcHQgJiYgcHNidC5kYXRhLmlucHV0c1tpbnB1dEluZGV4XS53aXRuZXNzU2NyaXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHdpdG5lc3NTY3JpcHQgfSk7XG4gICAgICB9XG4gICAgICBpZiAocmVkZWVtU2NyaXB0ICYmIHBzYnQuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0ucmVkZWVtU2NyaXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHJlZGVlbVNjcmlwdCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIGJpcDMyRGVyaXZhdGlvbjogWzAsIDEsIDJdLm1hcCgoaWR4KSA9PiAoe1xuICAgICAgICBwdWJrZXk6IHdhbGxldEtleXMudHJpcGxlW2lkeF0ucHVibGljS2V5LFxuICAgICAgICBwYXRoOiB3YWxsZXRLZXlzLnBhdGhzW2lkeF0sXG4gICAgICAgIG1hc3RlckZpbmdlcnByaW50OiByb290V2FsbGV0S2V5cy50cmlwbGVbaWR4XS5maW5nZXJwcmludCxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEByZXR1cm4gUFNCVCBmaWxsZWQgd2l0aCBtZXRhdGRhdGEgYXMgcGVyIGlucHV0IHBhcmFtcyB0eCwgdW5zcGVudHMgYW5kIHJvb3RXYWxsZXRLZXlzLlxuICogVW5zaWduZWQgUFNCVCBmb3IgdGFwcm9vdCBpbnB1dCB3aXRoIHdpdG5lc3NVdHhvXG4gKiBVbnNpZ25lZCBQU0JUIGZvciBvdGhlciBpbnB1dCB3aXRoIHdpdG5lc3NVdHhvL25vbldpdG5lc3NVdHhvLCByZWRlZW1TY3JpcHQvd2l0bmVzc1NjcmlwdCwgYmlwMzJEZXJpdmF0aW9uXG4gKiBTaWduZWQgUFNCVCBmb3IgdGFwcm9vdCBpbnB1dCB3aXRoIHdpdG5lc3NVdHhvLCB0YXBMZWFmU2NyaXB0LCB0YXBCaXAzMkRlcml2YXRpb24sIHRhcFNjcmlwdFNpZ1xuICogU2lnbmVkIFBTQlQgZm9yIG90aGVyIGlucHV0IHdpdGggd2l0bmVzc1V0eG8vbm9uV2l0bmVzc1V0eG8sIHJlZGVlbVNjcmlwdC93aXRuZXNzU2NyaXB0LCBiaXAzMkRlcml2YXRpb24sIHBhcnRpYWxTaWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvV2FsbGV0UHNidChcbiAgdHg6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+LFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5c1xuKTogVXR4b1BzYnQge1xuICBjb25zdCBwcmV2T3V0cHV0cyA9IHVuc3BlbnRzLm1hcCgodSkgPT4ge1xuICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChzY3JpcHRUeXBlRm9yQ2hhaW4odS5jaGFpbiksICdwMnRyTXVzaWcyJyk7XG4gICAgcmV0dXJuIHRvUHJldk91dHB1dFdpdGhQcmV2VHgodSwgdHgubmV0d29yayk7XG4gIH0pO1xuICBjb25zdCBwc2J0ID0gY3JlYXRlUHNidEZyb21UcmFuc2FjdGlvbih0eCwgcHJldk91dHB1dHMpO1xuICB1bnNwZW50cy5mb3JFYWNoKCh1LCBpKSA9PiB7XG4gICAgaWYgKGlzV2FsbGV0VW5zcGVudCh1KSAmJiB1LmluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZVBzYnRJbnB1dChwc2J0LCBpLCB1LCByb290V2FsbGV0S2V5cyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBzYnQ7XG59XG5cbi8qKlxuICogQHBhcmFtIHBzYnRcbiAqIEBwYXJhbSBpbnB1dEluZGV4XG4gKiBAcGFyYW0gc2lnbmVyXG4gKiBAcGFyYW0gdW5zcGVudFxuICogQHJldHVybiBzaWduZWQgUFNCVCB3aXRoIHNpZ25lcidzIGtleSBmb3IgdW5zcGVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbldhbGxldFBzYnQoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHNpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gIHVuc3BlbnQ6IFdhbGxldFVuc3BlbnQ8YmlnaW50PlxuKTogdm9pZCB7XG4gIGNvbnN0IHNjcmlwdFR5cGUgPSBzY3JpcHRUeXBlRm9yQ2hhaW4odW5zcGVudC5jaGFpbik7XG4gIGlmIChzY3JpcHRUeXBlID09PSAncDJ0cicgfHwgc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInKSB7XG4gICAgcHNidC5zaWduVGFwcm9vdElucHV0SEQoaW5wdXRJbmRleCwgc2lnbmVyKTtcbiAgfSBlbHNlIHtcbiAgICBwc2J0LnNpZ25JbnB1dEhEKGlucHV0SW5kZXgsIHNpZ25lcik7XG4gIH1cbn1cblxuLyoqXG4gKiBAcmV0dXJucyBzY3JpcHQgdHlwZSBvZiB0aGUgaW5wdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBzYnRJbnB1dFNjcmlwdFR5cGUoaW5wdXQ6IFBzYnRJbnB1dCk6IFBhcnNlZFNjcmlwdFR5cGUge1xuICBjb25zdCBpc1AycGsgPSAoc2NyaXB0OiBCdWZmZXIpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2h1bmtzID0gYnNjcmlwdC5kZWNvbXBpbGUoc2NyaXB0KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNodW5rcz8ubGVuZ3RoID09PSAyICYmXG4gICAgICAgIEJ1ZmZlci5pc0J1ZmZlcihjaHVua3NbMF0pICYmXG4gICAgICAgIGJzY3JpcHQuaXNDYW5vbmljYWxQdWJLZXkoY2h1bmtzWzBdKSAmJlxuICAgICAgICBjaHVua3NbMV0gPT09IG9wY29kZXMuT1BfQ0hFQ0tTSUdcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgbGV0IHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGUgfCB1bmRlZmluZWQ7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQucmVkZWVtU2NyaXB0KSAmJiBCdWZmZXIuaXNCdWZmZXIoaW5wdXQud2l0bmVzc1NjcmlwdCkpIHtcbiAgICBzY3JpcHRUeXBlID0gJ3Ayc2hQMndzaCc7XG4gIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGlucHV0LnJlZGVlbVNjcmlwdCkpIHtcbiAgICBzY3JpcHRUeXBlID0gaXNQMnBrKGlucHV0LnJlZGVlbVNjcmlwdCkgPyAncDJzaFAycGsnIDogJ3Ayc2gnO1xuICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC53aXRuZXNzU2NyaXB0KSkge1xuICAgIHNjcmlwdFR5cGUgPSAncDJ3c2gnO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0LnRhcExlYWZTY3JpcHQpICYmIGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMCkge1xuICAgIGlmIChzY3JpcHRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIGJvdGggJHtzY3JpcHRUeXBlfSBhbmQgdGFwcm9vdFNjcmlwdFBhdGggUFNCVCBtZXRhZGF0YS5gKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIHRhcCBsZWFmIHNjcmlwdCBwZXIgaW5wdXQuJyk7XG4gICAgfVxuICAgIHNjcmlwdFR5cGUgPSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCc7XG4gIH1cbiAgaWYgKGlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgaWYgKHNjcmlwdFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgYm90aCAke3NjcmlwdFR5cGV9IGFuZCB0YXByb290S2V5UGF0aCBQU0JUIG1ldGFkYXRhLmApO1xuICAgIH1cbiAgICBzY3JpcHRUeXBlID0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnO1xuICB9XG4gIGlmIChzY3JpcHRUeXBlKSB7XG4gICAgcmV0dXJuIHNjcmlwdFR5cGU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcGFyc2UgaW5wdXQnKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUYXByb290S2V5UGF0aFNpZ25hdHVyZXMoaW5wdXQ6IFBzYnRJbnB1dCk6IFRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlQ29udGFpbmVyIHtcbiAgY29uc3QgcGFydGlhbFNpZ3MgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dCk7XG4gIGlmICghcGFydGlhbFNpZ3MpIHtcbiAgICByZXR1cm4geyBzaWduYXR1cmVzOiB1bmRlZmluZWQsIHBhcnRpY2lwYW50UHVibGljS2V5czogdW5kZWZpbmVkIH07XG4gIH1cbiAgY29uc3Qgc2lnbmF0dXJlcyA9IHBhcnRpYWxTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWFsU2lnKTtcbiAgY29uc3QgcGFydGljaXBhbnRQdWJsaWNLZXlzID0gcGFydGlhbFNpZ3MubWFwKChwU2lnKSA9PiBwU2lnLnBhcnRpY2lwYW50UHViS2V5KTtcbiAgcmV0dXJuIGlzVHVwbGU8QnVmZmVyPihzaWduYXR1cmVzKSAmJiBpc1R1cGxlPEJ1ZmZlcj4ocGFydGljaXBhbnRQdWJsaWNLZXlzKVxuICAgID8geyBzaWduYXR1cmVzLCBwYXJ0aWNpcGFudFB1YmxpY0tleXMgfVxuICAgIDogeyBzaWduYXR1cmVzOiBbc2lnbmF0dXJlc1swXV0sIHBhcnRpY2lwYW50UHVibGljS2V5czogW3BhcnRpY2lwYW50UHVibGljS2V5c1swXV0gfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJ0aWFsT3JUYXBTY3JpcHRTaWduYXR1cmVzKHNpZzogUGFydGlhbFNpZ1tdIHwgVGFwU2NyaXB0U2lnW10gfCB1bmRlZmluZWQpOiBTaWduYXR1cmVDb250YWluZXIge1xuICBpZiAoIXNpZz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlczogdW5kZWZpbmVkIH07XG4gIH1cbiAgaWYgKHNpZy5sZW5ndGggPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIHNpZ25hdHVyZSBjb3VudCcpO1xuICB9XG4gIGNvbnN0IHNpZ25hdHVyZXMgPSBzaWcubWFwKCh0U2lnKSA9PiB0U2lnLnNpZ25hdHVyZSk7XG4gIHJldHVybiBpc1R1cGxlPEJ1ZmZlcj4oc2lnbmF0dXJlcykgPyB7IHNpZ25hdHVyZXMgfSA6IHsgc2lnbmF0dXJlczogW3NpZ25hdHVyZXNbMF1dIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2lnbmF0dXJlcyhcbiAgaW5wdXQ6IFBzYnRJbnB1dCxcbiAgc2NyaXB0VHlwZTogUGFyc2VkU2NyaXB0VHlwZVxuKTogU2lnbmF0dXJlQ29udGFpbmVyIHwgVGFwcm9vdEtleVBhdGhTaWduYXR1cmVDb250YWluZXIge1xuICByZXR1cm4gc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXG4gICAgPyBwYXJzZVRhcHJvb3RLZXlQYXRoU2lnbmF0dXJlcyhpbnB1dClcbiAgICA6IHNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJ1xuICAgID8gcGFyc2VQYXJ0aWFsT3JUYXBTY3JpcHRTaWduYXR1cmVzKGlucHV0LnRhcFNjcmlwdFNpZylcbiAgICA6IHBhcnNlUGFydGlhbE9yVGFwU2NyaXB0U2lnbmF0dXJlcyhpbnB1dC5wYXJ0aWFsU2lnKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTY3JpcHQoXG4gIGlucHV0OiBQc2J0SW5wdXQsXG4gIHNjcmlwdFR5cGU6IFBhcnNlZFNjcmlwdFR5cGVcbik6IFBhcnNlZFB1YlNjcmlwdFAybXMgfCBQYXJzZWRQdWJTY3JpcHRUYXByb290IHwgUGFyc2VkUHViU2NyaXB0UDJzaFAycGsge1xuICBsZXQgcHViU2NyaXB0OiBCdWZmZXIgfCB1bmRlZmluZWQ7XG4gIGlmIChzY3JpcHRUeXBlID09PSAncDJzaCcgfHwgc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgIHB1YlNjcmlwdCA9IGlucHV0LnJlZGVlbVNjcmlwdDtcbiAgfSBlbHNlIGlmIChzY3JpcHRUeXBlID09PSAncDJ3c2gnIHx8IHNjcmlwdFR5cGUgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgcHViU2NyaXB0ID0gaW5wdXQud2l0bmVzc1NjcmlwdDtcbiAgfSBlbHNlIGlmIChzY3JpcHRUeXBlID09PSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpIHtcbiAgICBwdWJTY3JpcHQgPSBpbnB1dC50YXBMZWFmU2NyaXB0ID8gaW5wdXQudGFwTGVhZlNjcmlwdFswXS5zY3JpcHQgOiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAoc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKSB7XG4gICAgaWYgKGlucHV0LndpdG5lc3NVdHhvPy5zY3JpcHQpIHtcbiAgICAgIHB1YlNjcmlwdCA9IGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdDtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnRhcEludGVybmFsS2V5ICYmIGlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHB1YlNjcmlwdCA9IGNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQoeyBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksIHRhcHRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290IH0pO1xuICAgIH1cbiAgfVxuICBpZiAoIXB1YlNjcmlwdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBQU0JUIHN0YXRlIGZvciAke3NjcmlwdFR5cGV9LiBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy5gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VQdWJTY3JpcHQocHViU2NyaXB0LCBzY3JpcHRUeXBlKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHBzYnQgbWV0YWRhdGEgYXJlIHBhcnNlZCBhcyBwZXIgYmVsb3cgY29uZGl0aW9ucy5cbiAqIHJlZGVlbVNjcmlwdC93aXRuZXNzU2NyaXB0L3RhcExlYWZTY3JpcHQgbWF0Y2hlcyBCaXRHby5cbiAqIHNpZ25hdHVyZSBhbmQgcHVibGljIGtleSBjb3VudCBtYXRjaGVzIEJpdEdvLlxuICogUDJTSC1QMlBLID0+IHNjcmlwdFR5cGUsIHJlZGVlbVNjcmlwdCwgcHVibGljIGtleSwgc2lnbmF0dXJlLlxuICogUDJTSCA9PiBzY3JpcHRUeXBlLCByZWRlZW1TY3JpcHQsIHB1YmxpYyBrZXlzLCBzaWduYXR1cmVzLlxuICogUFcyU0ggPT4gc2NyaXB0VHlwZSwgd2l0bmVzc1NjcmlwdCwgcHVibGljIGtleXMsIHNpZ25hdHVyZXMuXG4gKiBQMlNILVBXMlNIID0+IHNjcmlwdFR5cGUsIHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCwgcHVibGljIGtleXMsIHNpZ25hdHVyZXMuXG4gKiBQMlRSIGFuZCBQMlRSIE1VU0lHMiBzY3JpcHQgcGF0aCA9PiBzY3JpcHRUeXBlICh0YXByb290U2NyaXB0UGF0aFNwZW5kKSwgcHViU2NyaXB0IChsZWFmIHNjcmlwdCksIGNvbnRyb2xCbG9jayxcbiAqIHNjcmlwdFBhdGhMZXZlbCwgbGVhZlZlcnNpb24sIHB1YmxpYyBrZXlzLCBzaWduYXR1cmVzLlxuICogUDJUUiBNVVNJRzIga2VwIHBhdGggPT4gc2NyaXB0VHlwZSAodGFwcm9vdEtleVBhdGhTcGVuZCksIHB1YlNjcmlwdCAoc2NyaXB0UHViS2V5KSwgcGFydGljaXBhbnQgcHViIGtleXMgKHNpZ25lciksXG4gKiBwdWJsaWMga2V5ICh0YXBPdXRwdXRrZXkpLCBzaWduYXR1cmVzIChwYXJ0aWFsIHNpZ25lciBzaWdzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHNidElucHV0KGlucHV0OiBQc2J0SW5wdXQpOiBQYXJzZWRQc2J0UDJtcyB8IFBhcnNlZFBzYnRUYXByb290IHwgUGFyc2VkUHNidFAyc2hQMnBrIHtcbiAgaWYgKGlzUHNidElucHV0RmluYWxpemVkKGlucHV0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluYWxpemVkIFBTQlQgcGFyc2luZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgY29uc3Qgc2NyaXB0VHlwZSA9IGdldFBzYnRJbnB1dFNjcmlwdFR5cGUoaW5wdXQpO1xuICBjb25zdCBwYXJzZWRQdWJTY3JpcHQgPSBwYXJzZVNjcmlwdChpbnB1dCwgc2NyaXB0VHlwZSk7XG4gIGNvbnN0IHNpZ25hdHVyZXMgPSBwYXJzZVNpZ25hdHVyZXMoaW5wdXQsIHNjcmlwdFR5cGUpO1xuXG4gIGlmIChwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnICYmICdwYXJ0aWNpcGFudFB1YmxpY0tleXMnIGluIHNpZ25hdHVyZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucGFyc2VkUHViU2NyaXB0LFxuICAgICAgLi4uc2lnbmF0dXJlcyxcbiAgICAgIHNjcmlwdFR5cGU6IHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlLFxuICAgIH07XG4gIH1cbiAgaWYgKHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpIHtcbiAgICBpZiAoIWlucHV0LnRhcExlYWZTY3JpcHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBQU0JUIHN0YXRlIGZvciB0YXByb290U2NyaXB0UGF0aFNwZW5kLiBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4nKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEJsb2NrID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXS5jb250cm9sQmxvY2s7XG4gICAgaWYgKCFpc1ZhbGlkQ29udHJvbEJvY2soY29udHJvbEJsb2NrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBTQlQgdGFwcm9vdFNjcmlwdFBhdGhTcGVuZCBjb250cm9sQmxvY2suJyk7XG4gICAgfVxuICAgIGNvbnN0IHNjcmlwdFBhdGhMZXZlbCA9IGNhbGN1bGF0ZVNjcmlwdFBhdGhMZXZlbChjb250cm9sQmxvY2spO1xuICAgIGNvbnN0IGxlYWZWZXJzaW9uID0gZ2V0TGVhZlZlcnNpb24oY29udHJvbEJsb2NrKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucGFyc2VkUHViU2NyaXB0LFxuICAgICAgLi4uc2lnbmF0dXJlcyxcbiAgICAgIHNjcmlwdFR5cGU6IHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlLFxuICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgc2NyaXB0UGF0aExldmVsLFxuICAgICAgbGVhZlZlcnNpb24sXG4gICAgfTtcbiAgfVxuICBpZiAoXG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoJyB8fFxuICAgIHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJ3c2gnIHx8XG4gICAgcGFyc2VkUHViU2NyaXB0LnNjcmlwdFR5cGUgPT09ICdwMnNoUDJ3c2gnXG4gICkge1xuICAgIGlmIChwYXJzZWRQdWJTY3JpcHQuc2NyaXB0VHlwZSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgIHBhcnNlZFB1YlNjcmlwdC5yZWRlZW1TY3JpcHQgPSBpbnB1dC5yZWRlZW1TY3JpcHQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5wYXJzZWRQdWJTY3JpcHQsXG4gICAgICAuLi5zaWduYXR1cmVzLFxuICAgIH07XG4gIH1cbiAgaWYgKHBhcnNlZFB1YlNjcmlwdC5zY3JpcHRUeXBlID09PSAncDJzaFAycGsnICYmICghc2lnbmF0dXJlcy5zaWduYXR1cmVzIHx8ICFpc1R1cGxlKHNpZ25hdHVyZXMuc2lnbmF0dXJlcykpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcnNlZFB1YlNjcmlwdCxcbiAgICAgIHNpZ25hdHVyZXM6IHNpZ25hdHVyZXMuc2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwdWIgc2NyaXB0Jyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBwYXJzZWQgc2NyaXB0IHR5cGUgaW50byBhbiBhcnJheSBvZiBzY3JpcHQgdHlwZXMuXG4gKiBAcGFyYW0gcGFyc2VkU2NyaXB0VHlwZSAtIFRoZSBwYXJzZWQgc2NyaXB0IHR5cGUuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBTY3JpcHRUeXBlMk9mMyB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcGFyc2VkIHNjcmlwdCB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TY3JpcHRUeXBlMk9mM3MocGFyc2VkU2NyaXB0VHlwZTogUGFyc2VkU2NyaXB0VHlwZTJPZjMpOiBTY3JpcHRUeXBlMk9mM1tdIHtcbiAgcmV0dXJuIHBhcnNlZFNjcmlwdFR5cGUgPT09ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJ1xuICAgID8gWydwMnRyTXVzaWcyJywgJ3AydHInXVxuICAgIDogcGFyc2VkU2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnXG4gICAgPyBbJ3AydHJNdXNpZzInXVxuICAgIDogW3BhcnNlZFNjcmlwdFR5cGVdO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHN0cmljdGx5IHBhcnNlIHRoZSBpbnB1dCBhbmQgZ2V0IHNpZ25hdHVyZSBjb3VudC5cbiAqIHVuc2lnbmVkKDApLCBoYWxmLXNpZ25lZCgxKSBvciBmdWxseS1zaWduZWQoMilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmljdFNpZ25hdHVyZUNvdW50KGlucHV0OiBUeElucHV0IHwgUHNidElucHV0KTogMCB8IDEgfCAyIHtcbiAgY29uc3QgY2FsY3VsYXRlU2lnbmF0dXJlQ291bnQgPSAoXG4gICAgc2lnbmF0dXJlczogW0J1ZmZlciB8IDAsIEJ1ZmZlciB8IDAsIEJ1ZmZlciB8IDBdIHwgW0J1ZmZlciwgQnVmZmVyXSB8IFtCdWZmZXJdIHwgdW5kZWZpbmVkXG4gICk6IDAgfCAxIHwgMiA9PiB7XG4gICAgY29uc3QgY291bnQgPSBzaWduYXR1cmVzID8gc2lnbmF0dXJlcy5maWx0ZXIoKHMpID0+ICFpc1BsYWNlaG9sZGVyU2lnbmF0dXJlKHMpKS5sZW5ndGggOiAwO1xuICAgIGlmIChjb3VudCA9PT0gMCB8fCBjb3VudCA9PT0gMSB8fCBjb3VudCA9PT0gMikge1xuICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2lnbmF0dXJlIGNvdW50Jyk7XG4gIH07XG5cbiAgaWYgKCdoYXNoJyBpbiBpbnB1dCkge1xuICAgIGlmIChpbnB1dC5zY3JpcHQ/Lmxlbmd0aCB8fCBpbnB1dC53aXRuZXNzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBhcnNlZElucHV0ID0gcGFyc2VTaWduYXR1cmVTY3JpcHQoaW5wdXQpO1xuICAgICAgcmV0dXJuIHBhcnNlZElucHV0LnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyA/IDIgOiBjYWxjdWxhdGVTaWduYXR1cmVDb3VudChwYXJzZWRJbnB1dC5zaWduYXR1cmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZVNpZ25hdHVyZUNvdW50KHBhcnNlUHNidElucHV0KGlucHV0KS5zaWduYXR1cmVzKTtcbiAgfVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHN0cmljdGx5IHBhcnNlIGlucHV0IGFuZCBnZXQgc2lnbmF0dXJlIGNvdW50IGZvciBhbGwgaW5wdXRzLlxuICogMD11bnNpZ25lZCwgMT1oYWxmLXNpZ25lZCBvciAyPWZ1bGx5LXNpZ25lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaWN0U2lnbmF0dXJlQ291bnRzKFxuICB0eDogVXR4b1BzYnQgfCBVdHhvVHJhbnNhY3Rpb248bnVtYmVyIHwgYmlnaW50PiB8IFBzYnRJbnB1dFtdIHwgVHhJbnB1dFtdXG4pOiAoMCB8IDEgfCAyKVtdIHtcbiAgY29uc3QgaW5wdXRzID0gdHggaW5zdGFuY2VvZiBVdHhvUHNidCA/IHR4LmRhdGEuaW5wdXRzIDogdHggaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24gPyB0eC5pbnMgOiB0eDtcbiAgcmV0dXJuIGlucHV0cy5tYXAoKGlucHV0LCBfKSA9PiBnZXRTdHJpY3RTaWduYXR1cmVDb3VudChpbnB1dCkpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgaW5wdXRzIGFycmF5IGlzIG9mIFBzYnRJbnB1dFR5cGUgdHlwZVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnRJbnB1dEFycmF5KGlucHV0czogUHNidElucHV0W10gfCBUeElucHV0W10pOiBpbnB1dHMgaXMgUHNidElucHV0W10ge1xuICByZXR1cm4gIWlzVHhJbnB1dEFycmF5KGlucHV0cyk7XG59XG5cbi8qKlxuICogQHJldHVybiB0cnVlIGlmZiBpbnB1dHMgYXJyYXkgaXMgb2YgVHhJbnB1dCB0eXBlXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHhJbnB1dEFycmF5KGlucHV0czogUHNidElucHV0W10gfCBUeElucHV0W10pOiBpbnB1dHMgaXMgVHhJbnB1dFtdIHtcbiAgYXNzZXJ0Lm9rKCEhaW5wdXRzLmxlbmd0aCwgJ2VtcHR5IGlucHV0cyBhcnJheScpO1xuICByZXR1cm4gJ2hhc2gnIGluIGlucHV0c1swXTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB0cnVlIGlmZiBnaXZlbiBwc2J0L3RyYW5zYWN0aW9uL3R4LWlucHV0LWFycmF5L3BzYnQtaW5wdXQtYXJyYXkgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRhcHJvb3Qga2V5IHBhdGggc3BlbmQgaW5wdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kSW5wdXQoXG4gIGRhdGE6IFV0eG9Qc2J0IHwgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludCB8IG51bWJlcj4gfCBQc2J0SW5wdXRbXSB8IFR4SW5wdXRbXVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlucHV0cyA9IGRhdGEgaW5zdGFuY2VvZiBVdHhvUHNidCA/IGRhdGEuZGF0YS5pbnB1dHMgOiBkYXRhIGluc3RhbmNlb2YgVXR4b1RyYW5zYWN0aW9uID8gZGF0YS5pbnMgOiBkYXRhO1xuICBpZiAoIWlucHV0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGlzUHNidElucHV0QXJyYXkoaW5wdXRzKSkge1xuICAgIHJldHVybiBpbnB1dHMuc29tZSgoaW5wdXQsIF8pID0+IGdldFBzYnRJbnB1dFNjcmlwdFR5cGUoaW5wdXQpID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpO1xuICB9XG4gIHJldHVybiBpbnB1dHMuc29tZSgoaW5wdXQsIF8pID0+IHtcbiAgICAvLyBJZiB0aGUgaW5wdXQgaXMgbm90IHNpZ25lZCwgaXQgY2Fubm90IGJlIGEgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dCBiZWNhdXNlIHlvdSBjYW4gb25seVxuICAgIC8vIGV4dHJhY3QgYSBmdWxseSBzaWduZWQgcHNidCBpbnRvIGEgdHJhbnNhY3Rpb24gd2l0aCB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0cy5cbiAgICBpZiAoZ2V0U3RyaWN0U2lnbmF0dXJlQ291bnQoaW5wdXQpID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCkuc2NyaXB0VHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIFJvb3RXYWxsZXRLZXlzIGFzIHRoZSBnbG9iYWxYcHVicyBvbiB0aGUgcHNidFxuICpcbiAqIFdlIGRvIGFsbCB0aGUgbWF0Y2hpbmcgb2YgdGhlICh0YXApYmlwMzJEZXJpdmF0aW9ucyBtYXN0ZXJGaW5nZXJwcmludCB0byB0aGUgZmluZ2VycHJpbnQgb2YgdGhlXG4gKiBleHRlbmRlZFB1YmtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFhwdWJzVG9Qc2J0KHBzYnQ6IFBzYnQsIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyk6IHZvaWQge1xuICBjb25zdCBzYWZlUm9vdFdhbGxldEtleXMgPSBuZXcgUm9vdFdhbGxldEtleXMoXG4gICAgcm9vdFdhbGxldEtleXMudHJpcGxlLm1hcCgoYmlwMzIpID0+IGJpcDMyLm5ldXRlcmVkKCkpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT4sXG4gICAgcm9vdFdhbGxldEtleXMuZGVyaXZhdGlvblByZWZpeGVzXG4gICk7XG4gIGNvbnN0IHhQdWJzID0gc2FmZVJvb3RXYWxsZXRLZXlzLnRyaXBsZS5tYXAoXG4gICAgKGJpcDMyKTogR2xvYmFsWHB1YiA9PiAoe1xuICAgICAgZXh0ZW5kZWRQdWJrZXk6IGJzNThjaGVjay5kZWNvZGUoYmlwMzIudG9CYXNlNTgoKSksXG4gICAgICBtYXN0ZXJGaW5nZXJwcmludDogYmlwMzIuZmluZ2VycHJpbnQsXG4gICAgICAvLyBUT0RPOiBCRy03Mzc5NyAtIGJpcDE3NCBjdXJyZW50bHkgcmVxdWlyZXMgbSBwcmVmaXggZm9yIHRoaXMgdG8gYmUgYSB2YWxpZCBnbG9iYWxYcHViXG4gICAgICBwYXRoOiAnbScsXG4gICAgfSlcbiAgKTtcbiAgcHNidC51cGRhdGVHbG9iYWwoeyBnbG9iYWxYcHViOiB4UHVicyB9KTtcbn1cblxuLyoqXG4gKiB2YWxpZGF0ZXMgc2lnbmF0dXJlcyBmb3IgZWFjaCAyIG9mIDMgaW5wdXQgYWdhaW5zdCB1c2VyLCBiYWNrdXAsIGJpdGdvIGtleXMgZGVyaXZlZCBmcm9tIHJvb3RXYWxsZXRLZXlzLlxuICogQHJldHVybnMgYXJyYXkgb2YgaW5wdXQgaW5kZXggYW5kIGl0cyBbaXMgdmFsaWQgdXNlciBzaWcgZXhpc3QsIGlzIHZhbGlkIGJhY2t1cCBzaWcgZXhpc3QsIGlzIHZhbGlkIHVzZXIgYml0Z28gZXhpc3RdXG4gKiBGb3IgcDJzaFAycGsgaW5wdXQsIFtmYWxzZSwgZmFsc2UsIGZhbHNlXSBpcyByZXR1cm5lZCBzaW5jZSBpdCBpcyBub3QgYSAyIG9mIDMgc2lnIGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5UHNidChwc2J0OiBVdHhvUHNidCwgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzKTogU2lnbmF0dXJlVmFsaWRhdGlvbltdIHtcbiAgcmV0dXJuIHBzYnQuZGF0YS5pbnB1dHMubWFwKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHNpZ1ZhbEFycmF5Rm9ySW5wdXQ6IFRyaXBsZTxib29sZWFuPiA9XG4gICAgICBnZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KSA9PT0gJ3Ayc2hQMnBrJ1xuICAgICAgICA/IFtmYWxzZSwgZmFsc2UsIGZhbHNlXVxuICAgICAgICA6IHBzYnQuZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KGksIHsgcm9vdE5vZGVzOiByb290V2FsbGV0S2V5cy50cmlwbGUgfSk7XG4gICAgcmV0dXJuIFtpLCBzaWdWYWxBcnJheUZvcklucHV0XTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGhhbGYgc2lnbmVkIHRyYW5zYWN0aW9uIGZyb20gdGhlIHBzYnQgZm9yIHAybXMgYmFzZWQgc2NyaXB0IHR5cGVzIC0gcDJzaCwgcDJ3c2gsIGFuZCBwMnNoUDJ3c2guXG4gKiBUaGUgcHVycG9zZSBpcyB0byBwcm92aWRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8ga2V5dGVybmFsIChLUlMpIHRoYXQgb25seSBzdXBwb3J0cyBuZXR3b3JrIHRyYW5zYWN0aW9uIGFuZCBwMm1zIHNjcmlwdCB0eXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQMm1zT25seUhhbGZTaWduZWRUeChwc2J0OiBVdHhvUHNidCk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgYXNzZXJ0Lm9rKCEhKHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoICYmIHBzYnQuZGF0YS5vdXRwdXRzLmxlbmd0aCksICdlbXB0eSBpbnB1dHMgb3Igb3V0cHV0cycpO1xuICBjb25zdCB0eCA9IHBzYnQuZ2V0VW5zaWduZWRUeCgpO1xuXG4gIGZ1bmN0aW9uIGlzUDJtc1BhcnNlZFBzYnRJbnB1dChcbiAgICBwYXJzZWQ6IFBhcnNlZFBzYnRQMm1zIHwgUGFyc2VkUHNidFRhcHJvb3QgfCBQYXJzZWRQc2J0UDJzaFAycGtcbiAgKTogcGFyc2VkIGlzIFBhcnNlZFBzYnRQMm1zIHtcbiAgICByZXR1cm4gWydwMnNoJywgJ3Ayc2hQMndzaCcsICdwMndzaCddLmluY2x1ZGVzKHBhcnNlZC5zY3JpcHRUeXBlKTtcbiAgfVxuXG4gIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVBzYnRJbnB1dChpbnB1dCk7XG4gICAgYXNzZXJ0Lm9rKGlzUDJtc1BhcnNlZFBzYnRJbnB1dChwYXJzZWQpLCBgdW5zdXBwb3J0ZWQgc2NyaXB0IHR5cGUgJHtwYXJzZWQuc2NyaXB0VHlwZX1gKTtcbiAgICBhc3NlcnQub2soaW5wdXQucGFydGlhbFNpZz8ubGVuZ3RoID09PSAxLCBgdW5leHBlY3RlZCBzaWduYXR1cmUgY291bnQgJHtpbnB1dC5wYXJ0aWFsU2lnPy5sZW5ndGh9YCk7XG4gICAgY29uc3QgW3BhcnRpYWxTaWddID0gaW5wdXQucGFydGlhbFNpZztcbiAgICBhc3NlcnQub2soXG4gICAgICBpbnB1dC5zaWdoYXNoVHlwZSAhPT0gdW5kZWZpbmVkICYmIGlucHV0LnNpZ2hhc2hUeXBlID09PSBic2NyaXB0LnNpZ25hdHVyZS5kZWNvZGUocGFydGlhbFNpZy5zaWduYXR1cmUpLmhhc2hUeXBlLFxuICAgICAgJ3NpZ25hdHVyZSBzaWdoYXNoIGRvZXMgbm90IG1hdGNoIGlucHV0IHNpZ2hhc2ggdHlwZSdcbiAgICApO1xuXG4gICAgLy8gdHlwZSBjYXN0aW5nIGlzIHRvIGFkZHJlc3MgdGhlIGludmFsaWQgdHlwZSBjaGVja2luZyBpbiBwYXltZW50cy5wMm1zXG4gICAgY29uc3Qgc2lnbmF0dXJlcyA9IHBhcnNlZC5wdWJsaWNLZXlzLm1hcCgocGspID0+XG4gICAgICBwYXJ0aWFsU2lnLnB1YmtleS5lcXVhbHMocGspID8gcGFydGlhbFNpZy5zaWduYXR1cmUgOiAob3BzLk9QXzAgYXMgdW5rbm93biBhcyBCdWZmZXIpXG4gICAgKTtcblxuICAgIGNvbnN0IGlzUDJTSCA9ICEhcGFyc2VkLnJlZGVlbVNjcmlwdDtcbiAgICBjb25zdCBpc1AyV1NIID0gISFwYXJzZWQud2l0bmVzc1NjcmlwdDtcblxuICAgIGNvbnN0IHBheW1lbnQgPSBwYXltZW50cy5wMm1zKHsgb3V0cHV0OiBwYXJzZWQucHViU2NyaXB0LCBzaWduYXR1cmVzIH0sIHsgdmFsaWRhdGU6IGZhbHNlLCBhbGxvd0luY29tcGxldGU6IHRydWUgfSk7XG4gICAgY29uc3QgcDJ3c2ggPSBpc1AyV1NIID8gcGF5bWVudHMucDJ3c2goeyByZWRlZW06IHBheW1lbnQgfSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcDJzaCA9IGlzUDJTSCA/IHBheW1lbnRzLnAyc2goeyByZWRlZW06IHAyd3NoIHx8IHBheW1lbnQgfSkgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAocDJzaD8uaW5wdXQpIHtcbiAgICAgIHR4LnNldElucHV0U2NyaXB0KGksIHAyc2guaW5wdXQpO1xuICAgIH1cbiAgICBpZiAocDJ3c2g/LndpdG5lc3MpIHtcbiAgICAgIHR4LnNldFdpdG5lc3MoaSwgcDJ3c2gud2l0bmVzcyk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdHg7XG59XG5cbi8qKlxuICogQ2xvbmVzIHRoZSBwc2J0IHdpdGhvdXQgbm9uV2l0bmVzc1V0eG8gZm9yIG5vbi1zZWd3aXQgaW5wdXRzIGFuZCB3aXRuZXNzVXR4byBpcyBhZGRlZCBpbnN0ZWFkLlxuICogSXQgaXMgbm90IEJJUC0xNzQgY29tcGxpYW50LCBzbyB1c2UgaXQgY2FyZWZ1bGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVQc2J0V2l0aG91dE5vbldpdG5lc3NVdHhvKHBzYnQ6IFV0eG9Qc2J0KTogVXR4b1BzYnQge1xuICBjb25zdCBuZXdQc2J0ID0gY3JlYXRlUHNidEZyb21IZXgocHNidC50b0hleCgpLCBwc2J0Lm5ldHdvcmspO1xuICBjb25zdCB0eElucHV0cyA9IHBzYnQudHhJbnB1dHM7XG5cbiAgcHNidC5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgIGlmIChpbnB1dC5ub25XaXRuZXNzVXR4byAmJiAhaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgIGNvbnN0IHR4ID0gY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGlucHV0Lm5vbldpdG5lc3NVdHhvLCBwc2J0Lm5ldHdvcmssIHsgYW1vdW50VHlwZTogJ2JpZ2ludCcgfSk7XG4gICAgICBpZiAoIXR4SW5wdXRzW2ldLmhhc2guZXF1YWxzKHR4LmdldEhhc2goKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb24td2l0bmVzcyBVVFhPIGhhc2ggZm9yIGlucHV0ICMke2l9IGRvZXNuJ3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0YCk7XG4gICAgICB9XG4gICAgICBuZXdQc2J0LmRhdGEuaW5wdXRzW2ldLndpdG5lc3NVdHhvID0gdHgub3V0c1t0eElucHV0c1tpXS5pbmRleF07XG4gICAgfVxuICAgIGRlbGV0ZSBuZXdQc2J0LmRhdGEuaW5wdXRzW2ldLm5vbldpdG5lc3NVdHhvO1xuICB9KTtcblxuICByZXR1cm4gbmV3UHNidDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vbi1zZWd3aXQgaW5wdXRzIGluIHRoZSBQU0JUIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlXG4gKiBub25XaXRuZXNzVXR4by5cbiAqXG4gKiBpc1BzYnRMaXRlKGNsb25lUHNidFdpdGhvdXROb25XaXRuZXNzVXR4byhwc2J0KSkgPT09IHRydWVcbiAqXG4gKiBAcGFyYW0gcHNidFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQc2J0TGl0ZShwc2J0OiBVdHhvUHNidCk6IGJvb2xlYW4ge1xuICBsZXQgaXNGdWxsID0gdHJ1ZTtcbiAgY29uc3Qgbm9uU2Vnd2l0SW5wdXRUeXBlcyA9IFsncDJzaFAycGsnLCAncDJzaCddO1xuICBwc2J0LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgaWYgKGlzRnVsbCAmJiBub25TZWd3aXRJbnB1dFR5cGVzLmluY2x1ZGVzKGdldFBzYnRJbnB1dFNjcmlwdFR5cGUoaW5wdXQpKSkge1xuICAgICAgaXNGdWxsID0gISFpbnB1dC5ub25XaXRuZXNzVXR4bztcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gIWlzRnVsbDtcbn1cblxuLyoqXG4gKiBEZWxldGVzIHdpdG5lc3NVdHhvIGZvciBub24tc2Vnd2l0IGlucHV0cyB0byBtYWtlIHRoZSBQU0JUIEJJUC0xNzQgY29tcGxpYW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlV2l0bmVzc1V0eG9Gb3JOb25TZWd3aXRJbnB1dHMocHNidDogVXR4b1BzYnQpOiB2b2lkIHtcbiAgcHNidC5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHNjcmlwdFR5cGUgPSBnZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KTtcbiAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3Ayc2gnIHx8IHNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycpIHtcbiAgICAgIGRlbGV0ZSBpbnB1dC53aXRuZXNzVXR4bztcbiAgICB9XG4gIH0pO1xufVxuIl19
|