@bitgo-beta/utxo-lib 8.0.3-beta.23 → 8.0.3-beta.231
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/bitgo/PsbtUtil.d.ts +8 -7
- package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -1
- package/dist/src/bitgo/PsbtUtil.js +17 -2
- package/dist/src/bitgo/UtxoPsbt.d.ts +19 -4
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoPsbt.js +120 -56
- package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransaction.js +6 -6
- package/dist/src/bitgo/index.d.ts +9 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +4 -2
- package/dist/src/bitgo/legacysafe/index.d.ts +15 -0
- package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
- package/dist/src/bitgo/legacysafe/index.js +61 -0
- package/dist/src/bitgo/outputScripts.d.ts +1 -0
- package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
- package/dist/src/bitgo/outputScripts.js +24 -9
- package/dist/src/bitgo/parseInput.js +2 -2
- package/dist/src/bitgo/signature.d.ts +2 -2
- package/dist/src/bitgo/signature.d.ts.map +1 -1
- package/dist/src/bitgo/signature.js +17 -2
- package/dist/src/bitgo/transaction.d.ts +18 -3
- package/dist/src/bitgo/transaction.d.ts.map +1 -1
- package/dist/src/bitgo/transaction.js +9 -7
- 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 +33 -0
- package/dist/src/bitgo/wallet/Psbt.d.ts +20 -7
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Psbt.js +71 -3
- package/dist/src/bitgo/wallet/Unspent.d.ts +43 -7
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Unspent.js +156 -65
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +17 -1
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +64 -23
- package/dist/src/bitgo/wallet/chains.d.ts +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +3 -12
- package/dist/src/testutil/keys.d.ts +3 -0
- package/dist/src/testutil/keys.d.ts.map +1 -1
- package/dist/src/testutil/keys.js +17 -2
- package/dist/src/testutil/mock.d.ts +1 -1
- package/dist/src/testutil/mock.d.ts.map +1 -1
- package/dist/src/testutil/mock.js +12 -4
- package/dist/src/testutil/psbt.d.ts +27 -6
- package/dist/src/testutil/psbt.d.ts.map +1 -1
- package/dist/src/testutil/psbt.js +30 -18
- package/dist/src/testutil/transaction.d.ts +14 -5
- package/dist/src/testutil/transaction.d.ts.map +1 -1
- package/dist/src/testutil/transaction.js +9 -9
- package/package.json +8 -8
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { Network } from '../..';
|
|
3
2
|
import { UtxoTransactionBuilder } from '../UtxoTransactionBuilder';
|
|
4
3
|
import { WalletUnspentSigner } from './WalletUnspentSigner';
|
|
5
4
|
import { KeyName, RootWalletKeys } from './WalletKeys';
|
|
@@ -8,6 +7,12 @@ import { Triple } from '../types';
|
|
|
8
7
|
import { UnspentWithPrevTx, Unspent } from '../Unspent';
|
|
9
8
|
import { ChainCode } from './chains';
|
|
10
9
|
import { UtxoPsbt } from '../UtxoPsbt';
|
|
10
|
+
/** Final (non-replaceable) */
|
|
11
|
+
export declare const TX_INPUT_SEQUENCE_NUMBER_FINAL = 4294967295;
|
|
12
|
+
/** Non-Final (Replaceable)
|
|
13
|
+
* Reference: https://github.com/bitcoin/bitcoin/blob/v25.1/src/rpc/rawtransaction_util.cpp#L49
|
|
14
|
+
* */
|
|
15
|
+
export declare const MAX_BIP125_RBF_SEQUENCE: number;
|
|
11
16
|
export interface WalletUnspent<TNumber extends number | bigint = number> extends Unspent<TNumber> {
|
|
12
17
|
chain: ChainCode;
|
|
13
18
|
index: number;
|
|
@@ -36,14 +41,45 @@ export interface WalletUnspentLegacy<TNumber extends number | bigint = number> e
|
|
|
36
41
|
/** @deprecated - obviated by verifyWithUnspent */
|
|
37
42
|
witnessScript?: string;
|
|
38
43
|
}
|
|
39
|
-
export declare function addReplayProtectionUnspentToPsbt(psbt: UtxoPsbt, u: Unspent<bigint>, redeemScript: Buffer,
|
|
40
44
|
/**
|
|
41
|
-
* @
|
|
45
|
+
* @param psbt
|
|
46
|
+
* @param inputIndex
|
|
47
|
+
* @param id Unspent ID
|
|
48
|
+
* @returns true iff the unspent ID on the unspent and psbt input match
|
|
42
49
|
*/
|
|
43
|
-
|
|
44
|
-
export declare function addWalletUnspentToPsbt(psbt: UtxoPsbt, u: WalletUnspent<bigint>, rootWalletKeys: RootWalletKeys, signer: KeyName, cosigner: KeyName,
|
|
50
|
+
export declare function psbtIncludesUnspentAtIndex(psbt: UtxoPsbt, inputIndex: number, id: string): boolean;
|
|
45
51
|
/**
|
|
46
|
-
*
|
|
52
|
+
* Update the psbt input at the given index
|
|
53
|
+
* @param psbt
|
|
54
|
+
* @param inputIndex
|
|
55
|
+
* @param u
|
|
56
|
+
* @param redeemScript Only overrides if there is no redeemScript in the input currently
|
|
57
|
+
*/
|
|
58
|
+
export declare function updateReplayProtectionUnspentToPsbt(psbt: UtxoPsbt, inputIndex: number, u: Unspent<bigint>, redeemScript?: Buffer, customParams?: {
|
|
59
|
+
skipNonWitnessUtxo?: boolean;
|
|
60
|
+
}): void;
|
|
61
|
+
export declare function addReplayProtectionUnspentToPsbt(psbt: UtxoPsbt, u: Unspent<bigint>, redeemScript: Buffer, customParams?: {
|
|
62
|
+
skipNonWitnessUtxo?: boolean;
|
|
63
|
+
}): void;
|
|
64
|
+
/**
|
|
65
|
+
* Update the PSBT with the unspent data for the input at the given index if the data is not there already.
|
|
66
|
+
*
|
|
67
|
+
* If skipNonWitnessUtxo is true, then the nonWitnessUtxo will not be added for an input that requires it (e.g. non-segwit)
|
|
68
|
+
* and instead the witnessUtxo will be added
|
|
69
|
+
*
|
|
70
|
+
* @param psbt
|
|
71
|
+
* @param inputIndex
|
|
72
|
+
* @param u
|
|
73
|
+
* @param rootWalletKeys
|
|
74
|
+
* @param signer
|
|
75
|
+
* @param cosigner
|
|
76
|
+
* @param customParams
|
|
47
77
|
*/
|
|
48
|
-
|
|
78
|
+
export declare function updateWalletUnspentForPsbt(psbt: UtxoPsbt, inputIndex: number, u: WalletUnspent<bigint>, rootWalletKeys: RootWalletKeys, signer: KeyName, cosigner: KeyName, customParams?: {
|
|
79
|
+
skipNonWitnessUtxo?: boolean;
|
|
80
|
+
}): void;
|
|
81
|
+
export declare function addWalletUnspentToPsbt(psbt: UtxoPsbt, u: WalletUnspent<bigint>, rootWalletKeys: RootWalletKeys, signer: KeyName, cosigner: KeyName, customParams?: {
|
|
82
|
+
isReplaceableByFee?: boolean;
|
|
83
|
+
skipNonWitnessUtxo?: boolean;
|
|
84
|
+
}): void;
|
|
49
85
|
//# sourceMappingURL=Unspent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Unspent.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/Unspent.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"Unspent.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/Unspent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.addWalletUnspentToPsbt = exports.addReplayProtectionUnspentToPsbt = exports.verifySignatureWithUnspent = exports.signInputWithUnspent = exports.isWalletUnspent = void 0;
|
|
3
|
+
exports.addWalletUnspentToPsbt = exports.updateWalletUnspentForPsbt = exports.addReplayProtectionUnspentToPsbt = exports.updateReplayProtectionUnspentToPsbt = exports.psbtIncludesUnspentAtIndex = exports.verifySignatureWithUnspent = exports.signInputWithUnspent = exports.isWalletUnspent = exports.MAX_BIP125_RBF_SEQUENCE = exports.TX_INPUT_SEQUENCE_NUMBER_FINAL = void 0;
|
|
4
4
|
const __1 = require("../..");
|
|
5
5
|
const outputScripts_1 = require("../outputScripts");
|
|
6
6
|
const address_1 = require("../../address");
|
|
@@ -10,6 +10,14 @@ const chains_1 = require("./chains");
|
|
|
10
10
|
const Musig2_1 = require("../Musig2");
|
|
11
11
|
const transaction_1 = require("../transaction");
|
|
12
12
|
const parseInput_1 = require("../parseInput");
|
|
13
|
+
const utils_1 = require("bip174/src/lib/utils");
|
|
14
|
+
const PsbtUtil_1 = require("../PsbtUtil");
|
|
15
|
+
/** Final (non-replaceable) */
|
|
16
|
+
exports.TX_INPUT_SEQUENCE_NUMBER_FINAL = 0xffffffff;
|
|
17
|
+
/** Non-Final (Replaceable)
|
|
18
|
+
* Reference: https://github.com/bitcoin/bitcoin/blob/v25.1/src/rpc/rawtransaction_util.cpp#L49
|
|
19
|
+
* */
|
|
20
|
+
exports.MAX_BIP125_RBF_SEQUENCE = 0xffffffff - 2;
|
|
13
21
|
function isWalletUnspent(u) {
|
|
14
22
|
return u.chain !== undefined;
|
|
15
23
|
}
|
|
@@ -58,116 +66,199 @@ function verifySignatureWithUnspent(tx, inputIndex, unspents, walletKeys) {
|
|
|
58
66
|
return signature_1.verifySignatureWithPublicKeys(tx, inputIndex, prevOutputs, walletKeys.deriveForChainAndIndex(unspent.chain, unspent.index).publicKeys);
|
|
59
67
|
}
|
|
60
68
|
exports.verifySignatureWithUnspent = verifySignatureWithUnspent;
|
|
61
|
-
function addReplayProtectionUnspentToPsbt(psbt, u, redeemScript,
|
|
62
69
|
/**
|
|
63
|
-
* @
|
|
70
|
+
* @param psbt
|
|
71
|
+
* @param inputIndex
|
|
72
|
+
* @param id Unspent ID
|
|
73
|
+
* @returns true iff the unspent ID on the unspent and psbt input match
|
|
74
|
+
*/
|
|
75
|
+
function psbtIncludesUnspentAtIndex(psbt, inputIndex, id) {
|
|
76
|
+
utils_1.checkForInput(psbt.data.inputs, inputIndex);
|
|
77
|
+
const { txid, vout } = Unspent_1.parseOutputId(id);
|
|
78
|
+
const psbtOutPoint = Unspent_1.getOutputIdForInput(psbt.txInputs[inputIndex]);
|
|
79
|
+
return psbtOutPoint.txid === txid && psbtOutPoint.vout === vout;
|
|
80
|
+
}
|
|
81
|
+
exports.psbtIncludesUnspentAtIndex = psbtIncludesUnspentAtIndex;
|
|
82
|
+
/**
|
|
83
|
+
* Update the psbt input at the given index
|
|
84
|
+
* @param psbt
|
|
85
|
+
* @param inputIndex
|
|
86
|
+
* @param u
|
|
87
|
+
* @param redeemScript Only overrides if there is no redeemScript in the input currently
|
|
64
88
|
*/
|
|
65
|
-
|
|
66
|
-
if (
|
|
67
|
-
throw new Error(`
|
|
89
|
+
function updateReplayProtectionUnspentToPsbt(psbt, inputIndex, u, redeemScript, customParams) {
|
|
90
|
+
if (!psbtIncludesUnspentAtIndex(psbt, inputIndex, u.id)) {
|
|
91
|
+
throw new Error(`unspent does not correspond to psbt input`);
|
|
92
|
+
}
|
|
93
|
+
const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
|
|
94
|
+
if (redeemScript && !input.redeemScript) {
|
|
95
|
+
psbt.updateInput(inputIndex, { redeemScript });
|
|
68
96
|
}
|
|
69
|
-
const { txid, vout, script, value } = Unspent_1.toPrevOutput(u, psbt.network);
|
|
70
|
-
const isZcash = __1.getMainnet(psbt.network) === __1.networks.zcash;
|
|
71
97
|
// Because Zcash directly hashes the value for non-segwit transactions, we do not need to check indirectly
|
|
72
98
|
// with the previous transaction. Therefore, we can treat Zcash non-segwit transactions as Bitcoin
|
|
73
99
|
// segwit transactions
|
|
74
|
-
|
|
100
|
+
const isZcash = __1.getMainnet(psbt.network) === __1.networks.zcash;
|
|
101
|
+
if (!Unspent_1.isUnspentWithPrevTx(u) && !isZcash && !(customParams === null || customParams === void 0 ? void 0 : customParams.skipNonWitnessUtxo)) {
|
|
75
102
|
throw new Error('Error, require previous tx to add to PSBT');
|
|
76
103
|
}
|
|
104
|
+
if ((isZcash && !input.witnessUtxo) || (customParams === null || customParams === void 0 ? void 0 : customParams.skipNonWitnessUtxo)) {
|
|
105
|
+
const { script, value } = Unspent_1.toPrevOutput(u, psbt.network);
|
|
106
|
+
psbt.updateInput(inputIndex, { witnessUtxo: { script, value } });
|
|
107
|
+
}
|
|
108
|
+
else if (!isZcash && !input.nonWitnessUtxo) {
|
|
109
|
+
psbt.updateInput(inputIndex, { nonWitnessUtxo: u.prevTx });
|
|
110
|
+
}
|
|
111
|
+
const sighashType = signature_1.getDefaultSigHash(psbt.network);
|
|
112
|
+
if (psbt.data.inputs[inputIndex].sighashType === undefined) {
|
|
113
|
+
psbt.updateInput(inputIndex, { sighashType });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.updateReplayProtectionUnspentToPsbt = updateReplayProtectionUnspentToPsbt;
|
|
117
|
+
function addUnspentToPsbt(psbt, id, { sequenceNumber = exports.TX_INPUT_SEQUENCE_NUMBER_FINAL } = {}) {
|
|
118
|
+
const { txid, vout } = Unspent_1.parseOutputId(id);
|
|
77
119
|
psbt.addInput({
|
|
78
120
|
hash: txid,
|
|
79
121
|
index: vout,
|
|
80
|
-
|
|
122
|
+
sequence: sequenceNumber,
|
|
81
123
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
psbt.updateInput(psbt.inputCount - 1, { nonWitnessUtxo: u.prevTx });
|
|
87
|
-
}
|
|
124
|
+
}
|
|
125
|
+
function addReplayProtectionUnspentToPsbt(psbt, u, redeemScript, customParams) {
|
|
126
|
+
addUnspentToPsbt(psbt, u.id);
|
|
127
|
+
updateReplayProtectionUnspentToPsbt(psbt, psbt.inputCount - 1, u, redeemScript, customParams);
|
|
88
128
|
}
|
|
89
129
|
exports.addReplayProtectionUnspentToPsbt = addReplayProtectionUnspentToPsbt;
|
|
90
|
-
function addWalletUnspentToPsbt(psbt, u, rootWalletKeys, signer, cosigner,
|
|
91
130
|
/**
|
|
92
|
-
*
|
|
131
|
+
* Update the PSBT with the unspent data for the input at the given index if the data is not there already.
|
|
132
|
+
*
|
|
133
|
+
* If skipNonWitnessUtxo is true, then the nonWitnessUtxo will not be added for an input that requires it (e.g. non-segwit)
|
|
134
|
+
* and instead the witnessUtxo will be added
|
|
135
|
+
*
|
|
136
|
+
* @param psbt
|
|
137
|
+
* @param inputIndex
|
|
138
|
+
* @param u
|
|
139
|
+
* @param rootWalletKeys
|
|
140
|
+
* @param signer
|
|
141
|
+
* @param cosigner
|
|
142
|
+
* @param customParams
|
|
93
143
|
*/
|
|
94
|
-
|
|
95
|
-
if (
|
|
96
|
-
throw new Error(`
|
|
144
|
+
function updateWalletUnspentForPsbt(psbt, inputIndex, u, rootWalletKeys, signer, cosigner, customParams) {
|
|
145
|
+
if (!psbtIncludesUnspentAtIndex(psbt, inputIndex, u.id)) {
|
|
146
|
+
throw new Error(`unspent does not correspond to psbt input`);
|
|
97
147
|
}
|
|
98
|
-
const
|
|
99
|
-
psbt.addInput({ hash: txid, index: vout });
|
|
100
|
-
const inputIndex = psbt.inputCount - 1;
|
|
148
|
+
const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
|
|
101
149
|
// Because Zcash directly hashes the value for non-segwit transactions, we do not need to check indirectly
|
|
102
150
|
// with the previous transaction. Therefore, we can treat Zcash non-segwit transactions as Bitcoin
|
|
103
151
|
// segwit transactions
|
|
104
|
-
|
|
152
|
+
const isZcashOrSegwit = chains_1.isSegwit(u.chain) || __1.getMainnet(psbt.network) === __1.networks.zcash;
|
|
153
|
+
if ((isZcashOrSegwit && !input.witnessUtxo) || (customParams === null || customParams === void 0 ? void 0 : customParams.skipNonWitnessUtxo)) {
|
|
154
|
+
const { script, value } = Unspent_1.toPrevOutput(u, psbt.network);
|
|
105
155
|
psbt.updateInput(inputIndex, { witnessUtxo: { script, value } });
|
|
106
156
|
}
|
|
107
|
-
else {
|
|
157
|
+
else if (!isZcashOrSegwit) {
|
|
108
158
|
if (!Unspent_1.isUnspentWithPrevTx(u)) {
|
|
109
159
|
throw new Error('Error, require previous tx to add to PSBT');
|
|
110
160
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
161
|
+
if (!input.witnessUtxo && !input.nonWitnessUtxo) {
|
|
162
|
+
// Force the litecoin transaction to have no MWEB advanced transaction flag
|
|
163
|
+
if (__1.getMainnet(psbt.network) === __1.networks.litecoin) {
|
|
164
|
+
u.prevTx = transaction_1.createTransactionFromBuffer(u.prevTx, psbt.network, { amountType: 'bigint' }).toBuffer();
|
|
165
|
+
}
|
|
166
|
+
psbt.updateInput(inputIndex, { nonWitnessUtxo: u.prevTx });
|
|
114
167
|
}
|
|
115
|
-
psbt.updateInput(inputIndex, { nonWitnessUtxo: u.prevTx });
|
|
116
168
|
}
|
|
117
169
|
const walletKeys = rootWalletKeys.deriveForChainAndIndex(u.chain, u.index);
|
|
118
170
|
const scriptType = outputScripts_1.scriptTypeForChain(u.chain);
|
|
171
|
+
const sighashType = signature_1.getDefaultSigHash(psbt.network, scriptType);
|
|
172
|
+
if (psbt.data.inputs[inputIndex].sighashType === undefined) {
|
|
173
|
+
psbt.updateInput(inputIndex, { sighashType });
|
|
174
|
+
}
|
|
119
175
|
const isBackupFlow = signer === 'backup' || cosigner === 'backup';
|
|
120
176
|
if (scriptType === 'p2tr' || (scriptType === 'p2trMusig2' && isBackupFlow)) {
|
|
177
|
+
if (input.tapLeafScript && input.tapBip32Derivation) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
121
180
|
const createSpendScriptP2trFn = scriptType === 'p2tr' ? outputScripts_1.createSpendScriptP2tr : outputScripts_1.createSpendScriptP2trMusig2;
|
|
122
181
|
const { controlBlock, witnessScript, leafVersion, leafHash } = createSpendScriptP2trFn(walletKeys.publicKeys, [
|
|
123
182
|
walletKeys[signer].publicKey,
|
|
124
183
|
walletKeys[cosigner].publicKey,
|
|
125
184
|
]);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
185
|
+
if (!input.tapLeafScript) {
|
|
186
|
+
psbt.updateInput(inputIndex, {
|
|
187
|
+
tapLeafScript: [{ controlBlock, script: witnessScript, leafVersion }],
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
if (!input.tapBip32Derivation) {
|
|
191
|
+
psbt.updateInput(inputIndex, {
|
|
192
|
+
tapBip32Derivation: [signer, cosigner].map((key) => ({
|
|
193
|
+
leafHashes: [leafHash],
|
|
194
|
+
pubkey: outputScripts_1.toXOnlyPublicKey(walletKeys[key].publicKey),
|
|
195
|
+
path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], u.chain, u.index),
|
|
196
|
+
masterFingerprint: rootWalletKeys[key].fingerprint,
|
|
197
|
+
})),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
135
200
|
}
|
|
136
201
|
else if (scriptType === 'p2trMusig2') {
|
|
137
202
|
const { internalPubkey: tapInternalKey, outputPubkey: tapOutputKey, taptreeRoot, } = outputScripts_1.createKeyPathP2trMusig2(walletKeys.publicKeys);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
})
|
|
153
|
-
}
|
|
203
|
+
if (psbt.getProprietaryKeyVals(inputIndex, {
|
|
204
|
+
identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
205
|
+
subtype: PsbtUtil_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
|
|
206
|
+
}).length === 0) {
|
|
207
|
+
const participantsKeyValData = Musig2_1.encodePsbtMusig2Participants({
|
|
208
|
+
tapOutputKey,
|
|
209
|
+
tapInternalKey,
|
|
210
|
+
participantPubKeys: [walletKeys.user.publicKey, walletKeys.bitgo.publicKey],
|
|
211
|
+
});
|
|
212
|
+
psbt.addProprietaryKeyValToInput(inputIndex, participantsKeyValData);
|
|
213
|
+
}
|
|
214
|
+
if (!input.tapInternalKey) {
|
|
215
|
+
psbt.updateInput(inputIndex, {
|
|
216
|
+
tapInternalKey: tapInternalKey,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
if (!input.tapMerkleRoot) {
|
|
220
|
+
psbt.updateInput(inputIndex, {
|
|
221
|
+
tapMerkleRoot: taptreeRoot,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
if (!input.tapBip32Derivation) {
|
|
225
|
+
psbt.updateInput(inputIndex, {
|
|
226
|
+
tapBip32Derivation: [signer, cosigner].map((key) => ({
|
|
227
|
+
leafHashes: [],
|
|
228
|
+
pubkey: outputScripts_1.toXOnlyPublicKey(walletKeys[key].publicKey),
|
|
229
|
+
path: rootWalletKeys.getDerivationPath(rootWalletKeys[key], u.chain, u.index),
|
|
230
|
+
masterFingerprint: rootWalletKeys[key].fingerprint,
|
|
231
|
+
})),
|
|
232
|
+
});
|
|
233
|
+
}
|
|
154
234
|
}
|
|
155
235
|
else {
|
|
236
|
+
if (!input.bip32Derivation) {
|
|
237
|
+
psbt.updateInput(inputIndex, {
|
|
238
|
+
bip32Derivation: [0, 1, 2].map((idx) => ({
|
|
239
|
+
pubkey: walletKeys.triple[idx].publicKey,
|
|
240
|
+
path: walletKeys.paths[idx],
|
|
241
|
+
masterFingerprint: rootWalletKeys.triple[idx].fingerprint,
|
|
242
|
+
})),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
156
245
|
const { witnessScript, redeemScript } = outputScripts_1.createOutputScript2of3(walletKeys.publicKeys, scriptType);
|
|
157
|
-
|
|
158
|
-
bip32Derivation: [0, 1, 2].map((idx) => ({
|
|
159
|
-
pubkey: walletKeys.triple[idx].publicKey,
|
|
160
|
-
path: walletKeys.paths[idx],
|
|
161
|
-
masterFingerprint: rootWalletKeys.triple[idx].fingerprint,
|
|
162
|
-
})),
|
|
163
|
-
});
|
|
164
|
-
if (witnessScript) {
|
|
246
|
+
if (witnessScript && !input.witnessScript) {
|
|
165
247
|
psbt.updateInput(inputIndex, { witnessScript });
|
|
166
248
|
}
|
|
167
|
-
if (redeemScript) {
|
|
249
|
+
if (redeemScript && !input.redeemScript) {
|
|
168
250
|
psbt.updateInput(inputIndex, { redeemScript });
|
|
169
251
|
}
|
|
170
252
|
}
|
|
171
253
|
}
|
|
254
|
+
exports.updateWalletUnspentForPsbt = updateWalletUnspentForPsbt;
|
|
255
|
+
function addWalletUnspentToPsbt(psbt, u, rootWalletKeys, signer, cosigner, customParams) {
|
|
256
|
+
let sequenceNumber = exports.TX_INPUT_SEQUENCE_NUMBER_FINAL;
|
|
257
|
+
if (customParams && customParams.isReplaceableByFee) {
|
|
258
|
+
sequenceNumber = exports.MAX_BIP125_RBF_SEQUENCE;
|
|
259
|
+
}
|
|
260
|
+
addUnspentToPsbt(psbt, u.id, { sequenceNumber });
|
|
261
|
+
updateWalletUnspentForPsbt(psbt, psbt.inputCount - 1, u, rootWalletKeys, signer, cosigner, customParams ? { skipNonWitnessUtxo: customParams.skipNonWitnessUtxo } : {});
|
|
262
|
+
}
|
|
172
263
|
exports.addWalletUnspentToPsbt = addWalletUnspentToPsbt;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zcGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvVW5zcGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBc0Q7QUFFdEQsb0RBTzBCO0FBQzFCLDJDQUErQztBQUMvQyw0Q0FBdUc7QUFLdkcsd0NBQXFHO0FBQ3JHLHFDQUErQztBQUUvQyxzQ0FBeUQ7QUFDekQsZ0RBQTZEO0FBQzdELDhDQUFxRDtBQWFyRCxTQUFnQixlQUFlLENBQWtDLENBQW1CO0lBQ2xGLE9BQVEsQ0FBNEIsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQzNELENBQUM7QUFGRCwwQ0FFQztBQUVELFNBQWdCLG9CQUFvQixDQUNsQyxTQUEwQyxFQUMxQyxVQUFrQixFQUNsQixPQUErQixFQUMvQixhQUFrRDtJQUVsRCxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUcsTUFBTSxVQUFVLEdBQUcsa0NBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELE1BQU0sU0FBUyxHQUFHLHNDQUFzQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQ3pGLE1BQU0saUJBQWlCLEdBQUcsd0JBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFrQixDQUFDLENBQUM7SUFDeEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUN4QyxNQUFNLElBQUksS0FBSyxDQUNiLGdDQUFnQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNy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RUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUztnQkFDeEMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUMzQixpQkFBaUIsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVc7YUFDMUQsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsSUFBSSxZQUFZLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQ2hEO0tBQ0Y7QUFDSCxDQUFDO0FBNUZELHdEQTRGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldE1haW5uZXQsIE5ldHdvcmssIG5ldHdvcmtzIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uL1V0eG9UcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHtcbiAgY3JlYXRlS2V5UGF0aFAydHJNdXNpZzIsXG4gIGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMsXG4gIGNyZWF0ZVNwZW5kU2NyaXB0UDJ0cixcbiAgY3JlYXRlU3BlbmRTY3JpcHRQMnRyTXVzaWcyLFxuICBzY3JpcHRUeXBlRm9yQ2hhaW4sXG4gIHRvWE9ubHlQdWJsaWNLZXksXG59IGZyb20gJy4uL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgdG9PdXRwdXRTY3JpcHQgfSBmcm9tICcuLi8uLi9hZGRyZXNzJztcbmltcG9ydCB7IGdldFNpZ25hdHVyZVZlcmlmaWNhdGlvbnMsIHNpZ25JbnB1dDJPZjMsIHZlcmlmeVNpZ25hdHVyZVdpdGhQdWJsaWNLZXlzIH0gZnJvbSAnLi4vc2lnbmF0dXJlJztcbmltcG9ydCB7IFdhbGxldFVuc3BlbnRTaWduZXIgfSBmcm9tICcuL1dhbGxldFVuc3BlbnRTaWduZXInO1xuaW1wb3J0IHsgS2V5TmFtZSwgUm9vdFdhbGxldEtleXMgfSBmcm9tICcuL1dhbGxldEtleXMnO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyaXBsZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHRvT3V0cHV0LCBVbnNwZW50V2l0aFByZXZUeCwgVW5zcGVudCwgaXNVbnNwZW50V2l0aFByZXZUeCwgdG9QcmV2T3V0cHV0IH0gZnJvbSAnLi4vVW5zcGVudCc7XG5pbXBvcnQgeyBDaGFpbkNvZGUsIGlzU2Vnd2l0IH0gZnJvbSAnLi9jaGFpbnMnO1xuaW1wb3J0IHsgVXR4b1BzYnQgfSBmcm9tICcuLi9VdHhvUHNidCc7XG5pbXBvcnQgeyBlbmNvZGVQc2J0TXVzaWcyUGFydGljaXBhbnRzIH0gZnJvbSAnLi4vTXVzaWcyJztcbmltcG9ydCB7IGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlciB9IGZyb20gJy4uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IHBhcnNlU2lnbmF0dXJlU2NyaXB0IH0gZnJvbSAnLi4vcGFyc2VJbnB1dCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIFVuc3BlbnQ8VE51bWJlcj4ge1xuICBjaGFpbjogQ2hhaW5Db2RlO1xuICBpbmRleDogbnVtYmVyO1xuICB3aXRuZXNzU2NyaXB0Pzogc3RyaW5nO1xuICB2YWx1ZVN0cmluZz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb25XaXRuZXNzV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIFVuc3BlbnRXaXRoUHJldlR4PFROdW1iZXI+LFxuICAgIFdhbGxldFVuc3BlbnQ8VE51bWJlcj4ge31cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50Pih1OiBVbnNwZW50PFROdW1iZXI+KTogdSBpcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+IHtcbiAgcmV0dXJuICh1IGFzIFdhbGxldFVuc3BlbnQ8VE51bWJlcj4pLmNoYWluICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduSW5wdXRXaXRoVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHhCdWlsZGVyOiBVdHhvVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHVuc3BlbnQ6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj4sXG4gIHVuc3BlbnRTaWduZXI6IFdhbGxldFVuc3BlbnRTaWduZXI8Um9vdFdhbGxldEtleXM+XG4pOiB2b2lkIHtcbiAgY29uc3QgeyB3YWxsZXRLZXlzLCBzaWduZXIsIGNvc2lnbmVyIH0gPSB1bnNwZW50U2lnbmVyLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCk7XG4gIGNvbnN0IHNjcmlwdFR5cGUgPSBzY3JpcHRUeXBlRm9yQ2hhaW4odW5zcGVudC5jaGFpbik7XG4gIGNvbnN0IHB1YlNjcmlwdCA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMod2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlKS5zY3JpcHRQdWJLZXk7XG4gIGNvbnN0IHB1YlNjcmlwdEV4cGVjdGVkID0gdG9PdXRwdXRTY3JpcHQodW5zcGVudC5hZGRyZXNzLCB0eEJ1aWxkZXIubmV0d29yayBhcyBOZXR3b3JrKTtcbiAgaWYgKCFwdWJTY3JpcHQuZXF1YWxzKHB1YlNjcmlwdEV4cGVjdGVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBwdWJzY3JpcHQgbWlzbWF0Y2g6IGV4cGVjdGVkICR7cHViU2NyaXB0RXhwZWN0ZWQudG9TdHJpbmcoJ2hleCcpfSBnb3QgJHtwdWJTY3JpcHQudG9TdHJpbmcoJ2hleCcpfWBcbiAgICApO1xuICB9XG4gIHNpZ25JbnB1dDJPZjM8VE51bWJlcj4oXG4gICAgdHhCdWlsZGVyLFxuICAgIGlucHV0SW5kZXgsXG4gICAgc2NyaXB0VHlwZSxcbiAgICB3YWxsZXRLZXlzLnB1YmxpY0tleXMsXG4gICAgc2lnbmVyLFxuICAgIGNvc2lnbmVyLnB1YmxpY0tleSxcbiAgICB1bnNwZW50LnZhbHVlXG4gICk7XG59XG5cbi8qKlxuICogQHBhcmFtIHR4XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gd2FsbGV0S2V5c1xuICogQHJldHVybiB0cmlwbGUgb2YgYm9vbGVhbnMgaW5kaWNhdGluZyBhIHZhbGlkIHNpZ25hdHVyZSBmb3IgZWFjaCBwdWJrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZVdpdGhVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eDogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHVuc3BlbnRzOiBVbnNwZW50PFROdW1iZXI+W10sXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzXG4pOiBUcmlwbGU8Ym9vbGVhbj4ge1xuICBpZiAodHguaW5zLmxlbmd0aCAhPT0gdW5zcGVudHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnB1dCBsZW5ndGggbXVzdCBtYXRjaCB1bnNwZW50cyBsZW5ndGhgKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0ID0gdHguaW5zW2lucHV0SW5kZXhdO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWlucHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBpbnB1dCBhdCBpbmRleCAke2lucHV0SW5kZXh9YCk7XG4gIH1cblxuICBjb25zdCB1bnNwZW50ID0gdW5zcGVudHNbaW5wdXRJbmRleF07XG4gIGlmICghaXNXYWxsZXRVbnNwZW50KHVuc3BlbnQpIHx8ICghaW5wdXQuc2NyaXB0Py5sZW5ndGggJiYgIWlucHV0LndpdG5lc3M/Lmxlbmd0aCkpIHtcbiAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZSwgZmFsc2VdO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCk7XG4gIGNvbnN0IHByZXZPdXRwdXRzID0gdW5zcGVudHMubWFwKCh1KSA9PiB0b091dHB1dCh1LCB0eC5uZXR3b3JrKSk7XG5cbiAgLy8gSWYgaXQgaXMgYSB0YXByb290IGtleVBhdGhTcGVuZCBpbnB1dCwgdGhlIG9ubHkgdmFsaWQgc2lnbmF0dXJlIGNvbWJpbmF0aW9ucyBpcyB1c2VyLWJpdGdvLiBXZSBjYW5cbiAgLy8gb25seSB2ZXJpZnkgdGhhdCB0aGUgYWdncmVnYXRlZCBzaWduYXR1cmUgaXMgdmFsaWQsIG5vdCB0aGF0IHRoZSBpbmRpdmlkdWFsIHBhcnRpYWwtc2lnbmF0dXJlIGlzIHZhbGlkLlxuICAvLyBUaGVyZWZvcmUsIHdlIGNhbiBvbmx5IHNheSB0aGF0IGVpdGhlciBhbGwgcGFydGlhbCBzaWduYXR1cmVzIGFyZSB2YWxpZCwgb3Igbm9uZSBhcmUuXG4gIGlmIChwYXJzZWRJbnB1dC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBnZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKHR4LCBpbnB1dEluZGV4LCB1bnNwZW50LnZhbHVlLCB1bmRlZmluZWQsIHByZXZPdXRwdXRzKTtcbiAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gMSAmJiByZXN1bHRbMF0uc2lnbmF0dXJlID8gW3RydWUsIGZhbHNlLCB0cnVlXSA6IFtmYWxzZSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIHJldHVybiB2ZXJpZnlTaWduYXR1cmVXaXRoUHVibGljS2V5cyhcbiAgICB0eCxcbiAgICBpbnB1dEluZGV4LFxuICAgIHByZXZPdXRwdXRzLFxuICAgIHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KS5wdWJsaWNLZXlzXG4gICkgYXMgVHJpcGxlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIGluIGNlcnRhaW4gbGVnYWN5IHNpZ25pbmcgbWV0aG9kcyB0aGF0IGRvIG5vdCBkZXJpdmUgc2lnbmluZyBkYXRhIGZyb20gaW5kZXgvY2hhaW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRVbnNwZW50TGVnYWN5PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgV2FsbGV0VW5zcGVudDxUTnVtYmVyPiB7XG4gIC8qKiBAZGVwcmVjYXRlZCAtIG9idmlhdGVkIGJ5IHNpZ25XaXRoVW5zcGVudCAqL1xuICByZWRlZW1TY3JpcHQ/OiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCAtIG9idmlhdGVkIGJ5IHZlcmlmeVdpdGhVbnNwZW50ICovXG4gIHdpdG5lc3NTY3JpcHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRSZXBsYXlQcm90ZWN0aW9uVW5zcGVudFRvUHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIHU6IFVuc3BlbnQ8YmlnaW50PixcbiAgcmVkZWVtU2NyaXB0OiBCdWZmZXIsXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgbmV0d29yazogTmV0d29yayA9IHBzYnQubmV0d29ya1xuKTogdm9pZCB7XG4gIGlmIChuZXR3b3JrICE9PSBwc2J0Lm5ldHdvcmspIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5ldHdvcmsgcGFyYW1ldGVyIGRvZXMgbm90IG1hdGNoIHBzYnQubmV0d29ya2ApO1xuICB9XG4gIGNvbnN0IHsgdHhpZCwgdm91dCwgc2NyaXB0LCB2YWx1ZSB9ID0gdG9QcmV2T3V0cHV0KHUsIHBzYnQubmV0d29yayk7XG4gIGNvbnN0IGlzWmNhc2ggPSBnZXRNYWlubmV0KHBzYnQubmV0d29yaykgPT09IG5ldHdvcmtzLnpjYXNoO1xuXG4gIC8vIEJlY2F1c2UgWmNhc2ggZGlyZWN0bHkgaGFzaGVzIHRoZSB2YWx1ZSBmb3Igbm9uLXNlZ3dpdCB0cmFuc2FjdGlvbnMsIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIGluZGlyZWN0bHlcbiAgLy8gd2l0aCB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24uIFRoZXJlZm9yZSwgd2UgY2FuIHRyZWF0IFpjYXNoIG5vbi1zZWd3aXQgdHJhbnNhY3Rpb25zIGFzIEJpdGNvaW5cbiAgLy8gc2Vnd2l0IHRyYW5zYWN0aW9uc1xuICBpZiAoIWlzVW5zcGVudFdpdGhQcmV2VHgodSkgJiYgIWlzWmNhc2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCByZXF1aXJlIHByZXZpb3VzIHR4IHRvIGFkZCB0byBQU0JUJyk7XG4gIH1cbiAgcHNidC5hZGRJbnB1dCh7XG4gICAgaGFzaDogdHhpZCxcbiAgICBpbmRleDogdm91dCxcbiAgICByZWRlZW1TY3JpcHQsXG4gIH0pO1xuICBpZiAoaXNaY2FzaCkge1xuICAgIHBzYnQudXBkYXRlSW5wdXQocHNidC5pbnB1dENvdW50IC0gMSwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQsIHZhbHVlIH0gfSk7XG4gIH0gZWxzZSB7XG4gICAgcHNidC51cGRhdGVJbnB1dChwc2J0LmlucHV0Q291bnQgLSAxLCB7IG5vbldpdG5lc3NVdHhvOiAodSBhcyBVbnNwZW50V2l0aFByZXZUeDxiaWdpbnQ+KS5wcmV2VHggfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdhbGxldFVuc3BlbnRUb1BzYnQoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICB1OiBXYWxsZXRVbnNwZW50PGJpZ2ludD4sXG4gIHJvb3RXYWxsZXRLZXlzOiBSb290V2FsbGV0S2V5cyxcbiAgc2lnbmVyOiBLZXlOYW1lLFxuICBjb3NpZ25lcjogS2V5TmFtZSxcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBuZXR3b3JrOiBOZXR3b3JrID0gcHNidC5uZXR3b3JrXG4pOiB2b2lkIHtcbiAgaWYgKG5ldHdvcmsgIT09IHBzYnQubmV0d29yaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgbmV0d29yayBwYXJhbWV0ZXIgZG9lcyBub3QgbWF0Y2ggcHNidC5uZXR3b3JrYCk7XG4gIH1cbiAgY29uc3QgeyB0eGlkLCB2b3V0LCBzY3JpcHQsIHZhbHVlIH0gPSB0b1ByZXZPdXRwdXQodSwgcHNidC5uZXR3b3JrKTtcblxuICBwc2J0LmFkZElucHV0KHsgaGFzaDogdHhpZCwgaW5kZXg6IHZvdXQgfSk7XG4gIGNvbnN0IGlucHV0SW5kZXggPSBwc2J0LmlucHV0Q291bnQgLSAxO1xuXG4gIC8vIEJlY2F1c2UgWmNhc2ggZGlyZWN0bHkgaGFzaGVzIHRoZSB2YWx1ZSBmb3Igbm9uLXNlZ3dpdCB0cmFuc2FjdGlvbnMsIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIGluZGlyZWN0bHlcbiAgLy8gd2l0aCB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24uIFRoZXJlZm9yZSwgd2UgY2FuIHRyZWF0IFpjYXNoIG5vbi1zZWd3aXQgdHJhbnNhY3Rpb25zIGFzIEJpdGNvaW5cbiAgLy8gc2Vnd2l0IHRyYW5zYWN0aW9uc1xuICBpZiAoaXNTZWd3aXQodS5jaGFpbikgfHwgZ2V0TWFpbm5ldChwc2J0Lm5ldHdvcmspID09PSBuZXR3b3Jrcy56Y2FzaCkge1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQsIHZhbHVlIH0gfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpc1Vuc3BlbnRXaXRoUHJldlR4KHUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCByZXF1aXJlIHByZXZpb3VzIHR4IHRvIGFkZCB0byBQU0JUJyk7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRoZSBsaXRlY29pbiB0cmFuc2FjdGlvbiB0byBoYXZlIG5vIE1XRUIgYWR2YW5jZWQgdHJhbnNhY3Rpb24gZmxhZ1xuICAgIGlmIChnZXRNYWlubmV0KHBzYnQubmV0d29yaykgPT09IG5ldHdvcmtzLmxpdGVjb2luKSB7XG4gICAgICB1LnByZXZUeCA9IGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcih1LnByZXZUeCwgcHNidC5uZXR3b3JrLCB7IGFtb3VudFR5cGU6ICdiaWdpbnQnIH0pLnRvQnVmZmVyKCk7XG4gICAgfVxuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBub25XaXRuZXNzVXR4bzogdS5wcmV2VHggfSk7XG4gIH1cblxuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1LmNoYWluLCB1LmluZGV4KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1LmNoYWluKTtcbiAgY29uc3QgaXNCYWNrdXBGbG93ID0gc2lnbmVyID09PSAnYmFja3VwJyB8fCBjb3NpZ25lciA9PT0gJ2JhY2t1cCc7XG5cbiAgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyJyB8fCAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInICYmIGlzQmFja3VwRmxvdykpIHtcbiAgICBjb25zdCBjcmVhdGVTcGVuZFNjcmlwdFAydHJGbiA9IHNjcmlwdFR5cGUgPT09ICdwMnRyJyA/IGNyZWF0ZVNwZW5kU2NyaXB0UDJ0ciA6IGNyZWF0ZVNwZW5kU2NyaXB0UDJ0ck11c2lnMjtcbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgd2l0bmVzc1NjcmlwdCwgbGVhZlZlcnNpb24sIGxlYWZIYXNoIH0gPSBjcmVhdGVTcGVuZFNjcmlwdFAydHJGbih3YWxsZXRLZXlzLnB1YmxpY0tleXMsIFtcbiAgICAgIHdhbGxldEtleXNbc2lnbmVyXS5wdWJsaWNLZXksXG4gICAgICB3YWxsZXRLZXlzW2Nvc2lnbmVyXS5wdWJsaWNLZXksXG4gICAgXSk7XG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICB0YXBMZWFmU2NyaXB0OiBbeyBjb250cm9sQmxvY2ssIHNjcmlwdDogd2l0bmVzc1NjcmlwdCwgbGVhZlZlcnNpb24gfV0sXG4gICAgICB0YXBCaXAzMkRlcml2YXRpb246IFtzaWduZXIsIGNvc2lnbmVyXS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgbGVhZkhhc2hlczogW2xlYWZIYXNoXSxcbiAgICAgICAgcHVia2V5OiB0b1hPbmx5UHVibGljS2V5KHdhbGxldEtleXNba2V5XS5wdWJsaWNLZXkpLFxuICAgICAgICBwYXRoOiByb290V2FsbGV0S2V5cy5nZXREZXJpdmF0aW9uUGF0aChyb290V2FsbGV0S2V5c1trZXldLCB1LmNoYWluLCB1LmluZGV4KSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHJvb3RXYWxsZXRLZXlzW2tleV0uZmluZ2VycHJpbnQsXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJuYWxQdWJrZXk6IHRhcEludGVybmFsS2V5LFxuICAgICAgb3V0cHV0UHVia2V5OiB0YXBPdXRwdXRLZXksXG4gICAgICB0YXB0cmVlUm9vdCxcbiAgICB9ID0gY3JlYXRlS2V5UGF0aFAydHJNdXNpZzIod2FsbGV0S2V5cy5wdWJsaWNLZXlzKTtcbiAgICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhID0gZW5jb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyh7XG4gICAgICB0YXBPdXRwdXRLZXksXG4gICAgICB0YXBJbnRlcm5hbEtleSxcbiAgICAgIHBhcnRpY2lwYW50UHViS2V5czogW3dhbGxldEtleXMudXNlci5wdWJsaWNLZXksIHdhbGxldEtleXMuYml0Z28ucHVibGljS2V5XSxcbiAgICB9KTtcbiAgICBwc2J0LmFkZFByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhKTtcbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcEludGVybmFsS2V5OiB0YXBJbnRlcm5hbEtleSxcbiAgICAgIHRhcE1lcmtsZVJvb3Q6IHRhcHRyZWVSb290LFxuICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbc2lnbmVyLCBjb3NpZ25lcl0ubWFwKChrZXkpID0+ICh7XG4gICAgICAgIGxlYWZIYXNoZXM6IFtdLFxuICAgICAgICBwdWJrZXk6IHRvWE9ubHlQdWJsaWNLZXkod2FsbGV0S2V5c1trZXldLnB1YmxpY0tleSksXG4gICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHJvb3RXYWxsZXRLZXlzW2tleV0sIHUuY2hhaW4sIHUuaW5kZXgpLFxuICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXNba2V5XS5maW5nZXJwcmludCxcbiAgICAgIH0pKSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHdpdG5lc3NTY3JpcHQsIHJlZGVlbVNjcmlwdCB9ID0gY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyh3YWxsZXRLZXlzLnB1YmxpY0tleXMsIHNjcmlwdFR5cGUpO1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgYmlwMzJEZXJpdmF0aW9uOiBbMCwgMSwgMl0ubWFwKChpZHgpID0+ICh7XG4gICAgICAgIHB1YmtleTogd2FsbGV0S2V5cy50cmlwbGVbaWR4XS5wdWJsaWNLZXksXG4gICAgICAgIHBhdGg6IHdhbGxldEtleXMucGF0aHNbaWR4XSxcbiAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHJvb3RXYWxsZXRLZXlzLnRyaXBsZVtpZHhdLmZpbmdlcnByaW50LFxuICAgICAgfSkpLFxuICAgIH0pO1xuICAgIGlmICh3aXRuZXNzU2NyaXB0KSB7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgd2l0bmVzc1NjcmlwdCB9KTtcbiAgICB9XG4gICAgaWYgKHJlZGVlbVNjcmlwdCkge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHJlZGVlbVNjcmlwdCB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zcGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvVW5zcGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBc0Q7QUFFdEQsb0RBTzBCO0FBQzFCLDJDQUErQztBQUMvQyw0Q0FLc0I7QUFLdEIsd0NBUW9CO0FBQ3BCLHFDQUErQztBQUUvQyxzQ0FBeUQ7QUFDekQsZ0RBQTZEO0FBQzdELDhDQUFxRDtBQUNyRCxnREFBcUQ7QUFDckQsMENBQWlGO0FBRWpGLDhCQUE4QjtBQUNqQixRQUFBLDhCQUE4QixHQUFHLFVBQVUsQ0FBQztBQUV6RDs7S0FFSztBQUNRLFFBQUEsdUJBQXVCLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztBQWF0RCxTQUFnQixlQUFlLENBQWtDLENBQW1CO0lBQ2xGLE9BQVEsQ0FBNEIsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQzNELENBQUM7QUFGRCwwQ0FFQztBQUVELFNBQWdCLG9CQUFvQixDQUNsQyxTQUEwQyxFQUMxQyxVQUFrQixFQUNsQixPQUErQixFQUMvQixhQUFrRDtJQUVsRCxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUcsTUFBTSxVQUFVLEdBQUcsa0NBQWtCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JELE1BQU0sU0FBUyxHQUFHLHNDQUFzQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQ3pGLE1BQU0saUJBQWlCLEdBQUcsd0JBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFrQixDQUFDLENBQUM7SUFDeEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMs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SSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsSUFBSSxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztTQUNoRDtLQUNGO0FBQ0gsQ0FBQztBQWxJRCxnRUFrSUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FDcEMsSUFBYyxFQUNkLENBQXdCLEVBQ3hCLGNBQThCLEVBQzlCLE1BQWUsRUFDZixRQUFpQixFQUNqQixZQUE2RTtJQUU3RSxJQUFJLGNBQWMsR0FBRyxzQ0FBOEIsQ0FBQztJQUNwRCxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsa0JBQWtCLEVBQUU7UUFDbkQsY0FBYyxHQUFHLCtCQUF1QixDQUFDO0tBQzFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELDBCQUEwQixDQUN4QixJQUFJLEVBQ0osSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQ25CLENBQUMsRUFDRCxjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDNUUsQ0FBQztBQUNKLENBQUM7QUF2QkQsd0RBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TWFpbm5ldCwgTmV0d29yaywgbmV0d29ya3MgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi4vVXR4b1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQge1xuICBjcmVhdGVLZXlQYXRoUDJ0ck11c2lnMixcbiAgY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyxcbiAgY3JlYXRlU3BlbmRTY3JpcHRQMnRyLFxuICBjcmVhdGVTcGVuZFNjcmlwdFAydHJNdXNpZzIsXG4gIHNjcmlwdFR5cGVGb3JDaGFpbixcbiAgdG9YT25seVB1YmxpY0tleSxcbn0gZnJvbSAnLi4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyB0b091dHB1dFNjcmlwdCB9IGZyb20gJy4uLy4uL2FkZHJlc3MnO1xuaW1wb3J0IHtcbiAgZ2V0RGVmYXVsdFNpZ0hhc2gsXG4gIGdldFNpZ25hdHVyZVZlcmlmaWNhdGlvbnMsXG4gIHNpZ25JbnB1dDJPZjMsXG4gIHZlcmlmeVNpZ25hdHVyZVdpdGhQdWJsaWNLZXlzLFxufSBmcm9tICcuLi9zaWduYXR1cmUnO1xuaW1wb3J0IHsgV2FsbGV0VW5zcGVudFNpZ25lciB9IGZyb20gJy4vV2FsbGV0VW5zcGVudFNpZ25lcic7XG5pbXBvcnQgeyBLZXlOYW1lLCBSb290V2FsbGV0S2V5cyB9IGZyb20gJy4vV2FsbGV0S2V5cyc7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJpcGxlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgdG9PdXRwdXQsXG4gIFVuc3BlbnRXaXRoUHJldlR4LFxuICBVbnNwZW50LFxuICBpc1Vuc3BlbnRXaXRoUHJldlR4LFxuICB0b1ByZXZPdXRwdXQsXG4gIHBhcnNlT3V0cHV0SWQsXG4gIGdldE91dHB1dElkRm9ySW5wdXQsXG59IGZyb20gJy4uL1Vuc3BlbnQnO1xuaW1wb3J0IHsgQ2hhaW5Db2RlLCBpc1NlZ3dpdCB9IGZyb20gJy4vY2hhaW5zJztcbmltcG9ydCB7IFV0eG9Qc2J0IH0gZnJvbSAnLi4vVXR4b1BzYnQnO1xuaW1wb3J0IHsgZW5jb2RlUHNidE11c2lnMlBhcnRpY2lwYW50cyB9IGZyb20gJy4uL011c2lnMic7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXIgfSBmcm9tICcuLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBwYXJzZVNpZ25hdHVyZVNjcmlwdCB9IGZyb20gJy4uL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHsgY2hlY2tGb3JJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IFByb3ByaWV0YXJ5S2V5U3VidHlwZSwgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSIH0gZnJvbSAnLi4vUHNidFV0aWwnO1xuXG4vKiogRmluYWwgKG5vbi1yZXBsYWNlYWJsZSkgKi9cbmV4cG9ydCBjb25zdCBUWF9JTlBVVF9TRVFVRU5DRV9OVU1CRVJfRklOQUwgPSAweGZmZmZmZmZmO1xuXG4vKiogTm9uLUZpbmFsIChSZXBsYWNlYWJsZSlcbiAqIFJlZmVyZW5jZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL3YyNS4xL3NyYy9ycGMvcmF3dHJhbnNhY3Rpb25fdXRpbC5jcHAjTDQ5XG4gKiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CSVAxMjVfUkJGX1NFUVVFTkNFID0gMHhmZmZmZmZmZiAtIDI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIFVuc3BlbnQ8VE51bWJlcj4ge1xuICBjaGFpbjogQ2hhaW5Db2RlO1xuICBpbmRleDogbnVtYmVyO1xuICB3aXRuZXNzU2NyaXB0Pzogc3RyaW5nO1xuICB2YWx1ZVN0cmluZz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb25XaXRuZXNzV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIFVuc3BlbnRXaXRoUHJldlR4PFROdW1iZXI+LFxuICAgIFdhbGxldFVuc3BlbnQ8VE51bWJlcj4ge31cblxuZXhwb3J0IGZ1bmN0aW9uIGlzV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50Pih1OiBVbnNwZW50PFROdW1iZXI+KTogdSBpcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+IHtcbiAgcmV0dXJuICh1IGFzIFdhbGxldFVuc3BlbnQ8VE51bWJlcj4pLmNoYWluICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduSW5wdXRXaXRoVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHhCdWlsZGVyOiBVdHhvVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHVuc3BlbnQ6IFdhbGxldFVuc3BlbnQ8VE51bWJlcj4sXG4gIHVuc3BlbnRTaWduZXI6IFdhbGxldFVuc3BlbnRTaWduZXI8Um9vdFdhbGxldEtleXM+XG4pOiB2b2lkIHtcbiAgY29uc3QgeyB3YWxsZXRLZXlzLCBzaWduZXIsIGNvc2lnbmVyIH0gPSB1bnNwZW50U2lnbmVyLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCk7XG4gIGNvbnN0IHNjcmlwdFR5cGUgPSBzY3JpcHRUeXBlRm9yQ2hhaW4odW5zcGVudC5jaGFpbik7XG4gIGNvbnN0IHB1YlNjcmlwdCA9IGNyZWF0ZU91dHB1dFNjcmlwdDJvZjMod2FsbGV0S2V5cy5wdWJsaWNLZXlzLCBzY3JpcHRUeXBlKS5zY3JpcHRQdWJLZXk7XG4gIGNvbnN0IHB1YlNjcmlwdEV4cGVjdGVkID0gdG9PdXRwdXRTY3JpcHQodW5zcGVudC5hZGRyZXNzLCB0eEJ1aWxkZXIubmV0d29yayBhcyBOZXR3b3JrKTtcbiAgaWYgKCFwdWJTY3JpcHQuZXF1YWxzKHB1YlNjcmlwdEV4cGVjdGVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBwdWJzY3JpcHQgbWlzbWF0Y2g6IGV4cGVjdGVkICR7cHViU2NyaXB0RXhwZWN0ZWQudG9TdHJpbmcoJ2hleCcpfSBnb3QgJHtwdWJTY3JpcHQudG9TdHJpbmcoJ2hleCcpfWBcbiAgICApO1xuICB9XG4gIHNpZ25JbnB1dDJPZjM8VE51bWJlcj4oXG4gICAgdHhCdWlsZGVyLFxuICAgIGlucHV0SW5kZXgsXG4gICAgc2NyaXB0VHlwZSxcbiAgICB3YWxsZXRLZXlzLnB1YmxpY0tleXMsXG4gICAgc2lnbmVyLFxuICAgIGNvc2lnbmVyLnB1YmxpY0tleSxcbiAgICB1bnNwZW50LnZhbHVlXG4gICk7XG59XG5cbi8qKlxuICogQHBhcmFtIHR4XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHVuc3BlbnRzXG4gKiBAcGFyYW0gd2FsbGV0S2V5c1xuICogQHJldHVybiB0cmlwbGUgb2YgYm9vbGVhbnMgaW5kaWNhdGluZyBhIHZhbGlkIHNpZ25hdHVyZSBmb3IgZWFjaCBwdWJrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZVdpdGhVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eDogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHVuc3BlbnRzOiBVbnNwZW50PFROdW1iZXI+W10sXG4gIHdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzXG4pOiBUcmlwbGU8Ym9vbGVhbj4ge1xuICBpZiAodHguaW5zLmxlbmd0aCAhPT0gdW5zcGVudHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnB1dCBsZW5ndGggbXVzdCBtYXRjaCB1bnNwZW50cyBsZW5ndGhgKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0ID0gdHguaW5zW2lucHV0SW5kZXhdO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWlucHV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBpbnB1dCBhdCBpbmRleCAke2lucHV0SW5kZXh9YCk7XG4gIH1cblxuICBjb25zdCB1bnNwZW50ID0gdW5zcGVudHNbaW5wdXRJbmRleF07XG4gIGlmICghaXNXYWxsZXRVbnNwZW50KHVuc3BlbnQpIHx8ICghaW5wdXQuc2NyaXB0Py5sZW5ndGggJiYgIWlucHV0LndpdG5lc3M/Lmxlbmd0aCkpIHtcbiAgICByZXR1cm4gW2ZhbHNlLCBmYWxzZSwgZmFsc2VdO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCk7XG4gIGNvbnN0IHByZXZPdXRwdXRzID0gdW5zcGVudHMubWFwKCh1KSA9PiB0b091dHB1dCh1LCB0eC5uZXR3b3JrKSk7XG5cbiAgLy8gSWYgaXQgaXMgYSB0YXByb290IGtleVBhdGhTcGVuZCBpbnB1dCwgdGhlIG9ubHkgdmFsaWQgc2lnbmF0dXJlIGNvbWJpbmF0aW9ucyBpcyB1c2VyLWJpdGdvLiBXZSBjYW5cbiAgLy8gb25seSB2ZXJpZnkgdGhhdCB0aGUgYWdncmVnYXRlZCBzaWduYXR1cmUgaXMgdmFsaWQsIG5vdCB0aGF0IHRoZSBpbmRpdmlkdWFsIHBhcnRpYWwtc2lnbmF0dXJlIGlzIHZhbGlkLlxuICAvLyBUaGVyZWZvcmUsIHdlIGNhbiBvbmx5IHNheSB0aGF0IGVpdGhlciBhbGwgcGFydGlhbCBzaWduYXR1cmVzIGFyZSB2YWxpZCwgb3Igbm9uZSBhcmUuXG4gIGlmIChwYXJzZWRJbnB1dC5zY3JpcHRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBnZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKHR4LCBpbnB1dEluZGV4LCB1bnNwZW50LnZhbHVlLCB1bmRlZmluZWQsIHByZXZPdXRwdXRzKTtcbiAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gMSAmJiByZXN1bHRbMF0uc2lnbmF0dXJlID8gW3RydWUsIGZhbHNlLCB0cnVlXSA6IFtmYWxzZSwgZmFsc2UsIGZhbHNlXTtcbiAgfVxuXG4gIHJldHVybiB2ZXJpZnlTaWduYXR1cmVXaXRoUHVibGljS2V5cyhcbiAgICB0eCxcbiAgICBpbnB1dEluZGV4LFxuICAgIHByZXZPdXRwdXRzLFxuICAgIHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KS5wdWJsaWNLZXlzXG4gICkgYXMgVHJpcGxlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIGluIGNlcnRhaW4gbGVnYWN5IHNpZ25pbmcgbWV0aG9kcyB0aGF0IGRvIG5vdCBkZXJpdmUgc2lnbmluZyBkYXRhIGZyb20gaW5kZXgvY2hhaW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRVbnNwZW50TGVnYWN5PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgV2FsbGV0VW5zcGVudDxUTnVtYmVyPiB7XG4gIC8qKiBAZGVwcmVjYXRlZCAtIG9idmlhdGVkIGJ5IHNpZ25XaXRoVW5zcGVudCAqL1xuICByZWRlZW1TY3JpcHQ/OiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCAtIG9idmlhdGVkIGJ5IHZlcmlmeVdpdGhVbnNwZW50ICovXG4gIHdpdG5lc3NTY3JpcHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQHBhcmFtIHBzYnRcbiAqIEBwYXJhbSBpbnB1dEluZGV4XG4gKiBAcGFyYW0gaWQgVW5zcGVudCBJRFxuICogQHJldHVybnMgdHJ1ZSBpZmYgdGhlIHVuc3BlbnQgSUQgb24gdGhlIHVuc3BlbnQgYW5kIHBzYnQgaW5wdXQgbWF0Y2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBzYnRJbmNsdWRlc1Vuc3BlbnRBdEluZGV4KHBzYnQ6IFV0eG9Qc2J0LCBpbnB1dEluZGV4OiBudW1iZXIsIGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY2hlY2tGb3JJbnB1dChwc2J0LmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcblxuICBjb25zdCB7IHR4aWQsIHZvdXQgfSA9IHBhcnNlT3V0cHV0SWQoaWQpO1xuICBjb25zdCBwc2J0T3V0UG9pbnQgPSBnZXRPdXRwdXRJZEZvcklucHV0KHBzYnQudHhJbnB1dHNbaW5wdXRJbmRleF0pO1xuICByZXR1cm4gcHNidE91dFBvaW50LnR4aWQgPT09IHR4aWQgJiYgcHNidE91dFBvaW50LnZvdXQgPT09IHZvdXQ7XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSBwc2J0IGlucHV0IGF0IHRoZSBnaXZlbiBpbmRleFxuICogQHBhcmFtIHBzYnRcbiAqIEBwYXJhbSBpbnB1dEluZGV4XG4gKiBAcGFyYW0gdVxuICogQHBhcmFtIHJlZGVlbVNjcmlwdCBPbmx5IG92ZXJyaWRlcyBpZiB0aGVyZSBpcyBubyByZWRlZW1TY3JpcHQgaW4gdGhlIGlucHV0IGN1cnJlbnRseVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUmVwbGF5UHJvdGVjdGlvblVuc3BlbnRUb1BzYnQoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHU6IFVuc3BlbnQ8YmlnaW50PixcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyLFxuICBjdXN0b21QYXJhbXM/OiB7IHNraXBOb25XaXRuZXNzVXR4bz86IGJvb2xlYW4gfVxuKTogdm9pZCB7XG4gIGlmICghcHNidEluY2x1ZGVzVW5zcGVudEF0SW5kZXgocHNidCwgaW5wdXRJbmRleCwgdS5pZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3BlbnQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBwc2J0IGlucHV0YCk7XG4gIH1cbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuXG4gIGlmIChyZWRlZW1TY3JpcHQgJiYgIWlucHV0LnJlZGVlbVNjcmlwdCkge1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyByZWRlZW1TY3JpcHQgfSk7XG4gIH1cblxuICAvLyBCZWNhdXNlIFpjYXNoIGRpcmVjdGx5IGhhc2hlcyB0aGUgdmFsdWUgZm9yIG5vbi1zZWd3aXQgdHJhbnNhY3Rpb25zLCB3ZSBkbyBub3QgbmVlZCB0byBjaGVjayBpbmRpcmVjdGx5XG4gIC8vIHdpdGggdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9uLiBUaGVyZWZvcmUsIHdlIGNhbiB0cmVhdCBaY2FzaCBub24tc2Vnd2l0IHRyYW5zYWN0aW9ucyBhcyBCaXRjb2luXG4gIC8vIHNlZ3dpdCB0cmFuc2FjdGlvbnNcbiAgY29uc3QgaXNaY2FzaCA9IGdldE1haW5uZXQocHNidC5uZXR3b3JrKSA9PT0gbmV0d29ya3MuemNhc2g7XG4gIGlmICghaXNVbnNwZW50V2l0aFByZXZUeCh1KSAmJiAhaXNaY2FzaCAmJiAhY3VzdG9tUGFyYW1zPy5za2lwTm9uV2l0bmVzc1V0eG8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yLCByZXF1aXJlIHByZXZpb3VzIHR4IHRvIGFkZCB0byBQU0JUJyk7XG4gIH1cbiAgaWYgKChpc1pjYXNoICYmICFpbnB1dC53aXRuZXNzVXR4bykgfHwgY3VzdG9tUGFyYW1zPy5za2lwTm9uV2l0bmVzc1V0eG8pIHtcbiAgICBjb25zdCB7IHNjcmlwdCwgdmFsdWUgfSA9IHRvUHJldk91dHB1dCh1LCBwc2J0Lm5ldHdvcmspO1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQsIHZhbHVlIH0gfSk7XG4gIH0gZWxzZSBpZiAoIWlzWmNhc2ggJiYgIWlucHV0Lm5vbldpdG5lc3NVdHhvKSB7XG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IG5vbldpdG5lc3NVdHhvOiAodSBhcyBVbnNwZW50V2l0aFByZXZUeDxiaWdpbnQ+KS5wcmV2VHggfSk7XG4gIH1cblxuICBjb25zdCBzaWdoYXNoVHlwZSA9IGdldERlZmF1bHRTaWdIYXNoKHBzYnQubmV0d29yayk7XG4gIGlmIChwc2J0LmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnNpZ2hhc2hUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgc2lnaGFzaFR5cGUgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVW5zcGVudFRvUHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIGlkOiBzdHJpbmcsXG4gIHsgc2VxdWVuY2VOdW1iZXIgPSBUWF9JTlBVVF9TRVFVRU5DRV9OVU1CRVJfRklOQUwgfTogeyBzZXF1ZW5jZU51bWJlcj86IG51bWJlciB9ID0ge31cbik6IHZvaWQge1xuICBjb25zdCB7IHR4aWQsIHZvdXQgfSA9IHBhcnNlT3V0cHV0SWQoaWQpO1xuICBwc2J0LmFkZElucHV0KHtcbiAgICBoYXNoOiB0eGlkLFxuICAgIGluZGV4OiB2b3V0LFxuICAgIHNlcXVlbmNlOiBzZXF1ZW5jZU51bWJlcixcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRSZXBsYXlQcm90ZWN0aW9uVW5zcGVudFRvUHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIHU6IFVuc3BlbnQ8YmlnaW50PixcbiAgcmVkZWVtU2NyaXB0OiBCdWZmZXIsXG4gIGN1c3RvbVBhcmFtcz86IHsgc2tpcE5vbldpdG5lc3NVdHhvPzogYm9vbGVhbiB9XG4pOiB2b2lkIHtcbiAgYWRkVW5zcGVudFRvUHNidChwc2J0LCB1LmlkKTtcbiAgdXBkYXRlUmVwbGF5UHJvdGVjdGlvblVuc3BlbnRUb1BzYnQocHNidCwgcHNidC5pbnB1dENvdW50IC0gMSwgdSwgcmVkZWVtU2NyaXB0LCBjdXN0b21QYXJhbXMpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgUFNCVCB3aXRoIHRoZSB1bnNwZW50IGRhdGEgZm9yIHRoZSBpbnB1dCBhdCB0aGUgZ2l2ZW4gaW5kZXggaWYgdGhlIGRhdGEgaXMgbm90IHRoZXJlIGFscmVhZHkuXG4gKlxuICogSWYgc2tpcE5vbldpdG5lc3NVdHhvIGlzIHRydWUsIHRoZW4gdGhlIG5vbldpdG5lc3NVdHhvIHdpbGwgbm90IGJlIGFkZGVkIGZvciBhbiBpbnB1dCB0aGF0IHJlcXVpcmVzIGl0IChlLmcuIG5vbi1zZWd3aXQpXG4gKiBhbmQgaW5zdGVhZCB0aGUgd2l0bmVzc1V0eG8gd2lsbCBiZSBhZGRlZFxuICpcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gaW5wdXRJbmRleFxuICogQHBhcmFtIHVcbiAqIEBwYXJhbSByb290V2FsbGV0S2V5c1xuICogQHBhcmFtIHNpZ25lclxuICogQHBhcmFtIGNvc2lnbmVyXG4gKiBAcGFyYW0gY3VzdG9tUGFyYW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVXYWxsZXRVbnNwZW50Rm9yUHNidChcbiAgcHNidDogVXR4b1BzYnQsXG4gIGlucHV0SW5kZXg6IG51bWJlcixcbiAgdTogV2FsbGV0VW5zcGVudDxiaWdpbnQ+LFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHNpZ25lcjogS2V5TmFtZSxcbiAgY29zaWduZXI6IEtleU5hbWUsXG4gIGN1c3RvbVBhcmFtcz86IHsgc2tpcE5vbldpdG5lc3NVdHhvPzogYm9vbGVhbiB9XG4pOiB2b2lkIHtcbiAgaWYgKCFwc2J0SW5jbHVkZXNVbnNwZW50QXRJbmRleChwc2J0LCBpbnB1dEluZGV4LCB1LmlkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5zcGVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHBzYnQgaW5wdXRgKTtcbiAgfVxuICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQocHNidC5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG5cbiAgLy8gQmVjYXVzZSBaY2FzaCBkaXJlY3RseSBoYXNoZXMgdGhlIHZhbHVlIGZvciBub24tc2Vnd2l0IHRyYW5zYWN0aW9ucywgd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgaW5kaXJlY3RseVxuICAvLyB3aXRoIHRoZSBwcmV2aW91cyB0cmFuc2FjdGlvbi4gVGhlcmVmb3JlLCB3ZSBjYW4gdHJlYXQgWmNhc2ggbm9uLXNlZ3dpdCB0cmFuc2FjdGlvbnMgYXMgQml0Y29pblxuICAvLyBzZWd3aXQgdHJhbnNhY3Rpb25zXG4gIGNvbnN0IGlzWmNhc2hPclNlZ3dpdCA9IGlzU2Vnd2l0KHUuY2hhaW4pIHx8IGdldE1haW5uZXQocHNidC5uZXR3b3JrKSA9PT0gbmV0d29ya3MuemNhc2g7XG4gIGlmICgoaXNaY2FzaE9yU2Vnd2l0ICYmICFpbnB1dC53aXRuZXNzVXR4bykgfHwgY3VzdG9tUGFyYW1zPy5za2lwTm9uV2l0bmVzc1V0eG8pIHtcbiAgICBjb25zdCB7IHNjcmlwdCwgdmFsdWUgfSA9IHRvUHJldk91dHB1dCh1LCBwc2J0Lm5ldHdvcmspO1xuICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzVXR4bzogeyBzY3JpcHQsIHZhbHVlIH0gfSk7XG4gIH0gZWxzZSBpZiAoIWlzWmNhc2hPclNlZ3dpdCkge1xuICAgIGlmICghaXNVbnNwZW50V2l0aFByZXZUeCh1KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgcmVxdWlyZSBwcmV2aW91cyB0eCB0byBhZGQgdG8gUFNCVCcpO1xuICAgIH1cblxuICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8gJiYgIWlucHV0Lm5vbldpdG5lc3NVdHhvKSB7XG4gICAgICAvLyBGb3JjZSB0aGUgbGl0ZWNvaW4gdHJhbnNhY3Rpb24gdG8gaGF2ZSBubyBNV0VCIGFkdmFuY2VkIHRyYW5zYWN0aW9uIGZsYWdcbiAgICAgIGlmIChnZXRNYWlubmV0KHBzYnQubmV0d29yaykgPT09IG5ldHdvcmtzLmxpdGVjb2luKSB7XG4gICAgICAgIHUucHJldlR4ID0gY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyKHUucHJldlR4LCBwc2J0Lm5ldHdvcmssIHsgYW1vdW50VHlwZTogJ2JpZ2ludCcgfSkudG9CdWZmZXIoKTtcbiAgICAgIH1cblxuICAgICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IG5vbldpdG5lc3NVdHhvOiB1LnByZXZUeCB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB3YWxsZXRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1LmNoYWluLCB1LmluZGV4KTtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbih1LmNoYWluKTtcbiAgY29uc3Qgc2lnaGFzaFR5cGUgPSBnZXREZWZhdWx0U2lnSGFzaChwc2J0Lm5ldHdvcmssIHNjcmlwdFR5cGUpO1xuICBpZiAocHNidC5kYXRhLmlucHV0c1tpbnB1dEluZGV4XS5zaWdoYXNoVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcHNidC51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IHNpZ2hhc2hUeXBlIH0pO1xuICB9XG4gIGNvbnN0IGlzQmFja3VwRmxvdyA9IHNpZ25lciA9PT0gJ2JhY2t1cCcgfHwgY29zaWduZXIgPT09ICdiYWNrdXAnO1xuXG4gIGlmIChzY3JpcHRUeXBlID09PSAncDJ0cicgfHwgKHNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyJyAmJiBpc0JhY2t1cEZsb3cpKSB7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQgJiYgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNyZWF0ZVNwZW5kU2NyaXB0UDJ0ckZuID0gc2NyaXB0VHlwZSA9PT0gJ3AydHInID8gY3JlYXRlU3BlbmRTY3JpcHRQMnRyIDogY3JlYXRlU3BlbmRTY3JpcHRQMnRyTXVzaWcyO1xuICAgIGNvbnN0IHsgY29udHJvbEJsb2NrLCB3aXRuZXNzU2NyaXB0LCBsZWFmVmVyc2lvbiwgbGVhZkhhc2ggfSA9IGNyZWF0ZVNwZW5kU2NyaXB0UDJ0ckZuKHdhbGxldEtleXMucHVibGljS2V5cywgW1xuICAgICAgd2FsbGV0S2V5c1tzaWduZXJdLnB1YmxpY0tleSxcbiAgICAgIHdhbGxldEtleXNbY29zaWduZXJdLnB1YmxpY0tleSxcbiAgICBdKTtcbiAgICBpZiAoIWlucHV0LnRhcExlYWZTY3JpcHQpIHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgICB0YXBMZWFmU2NyaXB0OiBbeyBjb250cm9sQmxvY2ssIHNjcmlwdDogd2l0bmVzc1NjcmlwdCwgbGVhZlZlcnNpb24gfV0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFpbnB1dC50YXBCaXAzMkRlcml2YXRpb24pIHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgICB0YXBCaXAzMkRlcml2YXRpb246IFtzaWduZXIsIGNvc2lnbmVyXS5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICBsZWFmSGFzaGVzOiBbbGVhZkhhc2hdLFxuICAgICAgICAgIHB1YmtleTogdG9YT25seVB1YmxpY0tleSh3YWxsZXRLZXlzW2tleV0ucHVibGljS2V5KSxcbiAgICAgICAgICBwYXRoOiByb290V2FsbGV0S2V5cy5nZXREZXJpdmF0aW9uUGF0aChyb290V2FsbGV0S2V5c1trZXldLCB1LmNoYWluLCB1LmluZGV4KSxcbiAgICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXNba2V5XS5maW5nZXJwcmludCxcbiAgICAgICAgfSkpLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyJykge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVybmFsUHVia2V5OiB0YXBJbnRlcm5hbEtleSxcbiAgICAgIG91dHB1dFB1YmtleTogdGFwT3V0cHV0S2V5LFxuICAgICAgdGFwdHJlZVJvb3QsXG4gICAgfSA9IGNyZWF0ZUtleVBhdGhQMnRyTXVzaWcyKHdhbGxldEtleXMucHVibGljS2V5cyk7XG5cbiAgICBpZiAoXG4gICAgICBwc2J0LmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgICAgIH0pLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRzS2V5VmFsRGF0YSA9IGVuY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoe1xuICAgICAgICB0YXBPdXRwdXRLZXksXG4gICAgICAgIHRhcEludGVybmFsS2V5LFxuICAgICAgICBwYXJ0aWNpcGFudFB1YktleXM6IFt3YWxsZXRLZXlzLnVzZXIucHVibGljS2V5LCB3YWxsZXRLZXlzLmJpdGdvLnB1YmxpY0tleV0sXG4gICAgICB9KTtcbiAgICAgIHBzYnQuYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHBhcnRpY2lwYW50c0tleVZhbERhdGEpO1xuICAgIH1cblxuICAgIGlmICghaW5wdXQudGFwSW50ZXJuYWxLZXkpIHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgICB0YXBJbnRlcm5hbEtleTogdGFwSW50ZXJuYWxLZXksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgICB0YXBNZXJrbGVSb290OiB0YXB0cmVlUm9vdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uKSB7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgICAgdGFwQmlwMzJEZXJpdmF0aW9uOiBbc2lnbmVyLCBjb3NpZ25lcl0ubWFwKChrZXkpID0+ICh7XG4gICAgICAgICAgbGVhZkhhc2hlczogW10sXG4gICAgICAgICAgcHVia2V5OiB0b1hPbmx5UHVibGljS2V5KHdhbGxldEtleXNba2V5XS5wdWJsaWNLZXkpLFxuICAgICAgICAgIHBhdGg6IHJvb3RXYWxsZXRLZXlzLmdldERlcml2YXRpb25QYXRoKHJvb3RXYWxsZXRLZXlzW2tleV0sIHUuY2hhaW4sIHUuaW5kZXgpLFxuICAgICAgICAgIG1hc3RlckZpbmdlcnByaW50OiByb290V2FsbGV0S2V5c1trZXldLmZpbmdlcnByaW50LFxuICAgICAgICB9KSksXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnB1dC5iaXAzMkRlcml2YXRpb24pIHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgICBiaXAzMkRlcml2YXRpb246IFswLCAxLCAyXS5tYXAoKGlkeCkgPT4gKHtcbiAgICAgICAgICBwdWJrZXk6IHdhbGxldEtleXMudHJpcGxlW2lkeF0ucHVibGljS2V5LFxuICAgICAgICAgIHBhdGg6IHdhbGxldEtleXMucGF0aHNbaWR4XSxcbiAgICAgICAgICBtYXN0ZXJGaW5nZXJwcmludDogcm9vdFdhbGxldEtleXMudHJpcGxlW2lkeF0uZmluZ2VycHJpbnQsXG4gICAgICAgIH0pKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHsgd2l0bmVzc1NjcmlwdCwgcmVkZWVtU2NyaXB0IH0gPSBjcmVhdGVPdXRwdXRTY3JpcHQyb2YzKHdhbGxldEtleXMucHVibGljS2V5cywgc2NyaXB0VHlwZSk7XG4gICAgaWYgKHdpdG5lc3NTY3JpcHQgJiYgIWlucHV0LndpdG5lc3NTY3JpcHQpIHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyB3aXRuZXNzU2NyaXB0IH0pO1xuICAgIH1cbiAgICBpZiAocmVkZWVtU2NyaXB0ICYmICFpbnB1dC5yZWRlZW1TY3JpcHQpIHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyByZWRlZW1TY3JpcHQgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRXYWxsZXRVbnNwZW50VG9Qc2J0KFxuICBwc2J0OiBVdHhvUHNidCxcbiAgdTogV2FsbGV0VW5zcGVudDxiaWdpbnQ+LFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHNpZ25lcjogS2V5TmFtZSxcbiAgY29zaWduZXI6IEtleU5hbWUsXG4gIGN1c3RvbVBhcmFtcz86IHsgaXNSZXBsYWNlYWJsZUJ5RmVlPzogYm9vbGVhbjsgc2tpcE5vbldpdG5lc3NVdHhvPzogYm9vbGVhbiB9XG4pOiB2b2lkIHtcbiAgbGV0IHNlcXVlbmNlTnVtYmVyID0gVFhfSU5QVVRfU0VRVUVOQ0VfTlVNQkVSX0ZJTkFMO1xuICBpZiAoY3VzdG9tUGFyYW1zICYmIGN1c3RvbVBhcmFtcy5pc1JlcGxhY2VhYmxlQnlGZWUpIHtcbiAgICBzZXF1ZW5jZU51bWJlciA9IE1BWF9CSVAxMjVfUkJGX1NFUVVFTkNFO1xuICB9XG5cbiAgYWRkVW5zcGVudFRvUHNidChwc2J0LCB1LmlkLCB7IHNlcXVlbmNlTnVtYmVyIH0pO1xuICB1cGRhdGVXYWxsZXRVbnNwZW50Rm9yUHNidChcbiAgICBwc2J0LFxuICAgIHBzYnQuaW5wdXRDb3VudCAtIDEsXG4gICAgdSxcbiAgICByb290V2FsbGV0S2V5cyxcbiAgICBzaWduZXIsXG4gICAgY29zaWduZXIsXG4gICAgY3VzdG9tUGFyYW1zID8geyBza2lwTm9uV2l0bmVzc1V0eG86IGN1c3RvbVBhcmFtcy5za2lwTm9uV2l0bmVzc1V0eG8gfSA6IHt9XG4gICk7XG59XG4iXX0=
|
|
@@ -4,7 +4,7 @@ import { ChainCode } from './chains';
|
|
|
4
4
|
/**
|
|
5
5
|
* Add a verifiable wallet output to the PSBT. The output and all data
|
|
6
6
|
* needed to verify it from public keys only are added to the PSBT.
|
|
7
|
-
* Typically these are change outputs
|
|
7
|
+
* Typically these are change outputs.
|
|
8
8
|
*
|
|
9
9
|
* @param psbt the PSBT to add change output to
|
|
10
10
|
* @param rootWalletKeys keys that will be able to spend the output
|
|
@@ -15,4 +15,20 @@ import { ChainCode } from './chains';
|
|
|
15
15
|
* @param value value of the change output
|
|
16
16
|
*/
|
|
17
17
|
export declare function addWalletOutputToPsbt(psbt: UtxoPsbt, rootWalletKeys: RootWalletKeys, chain: ChainCode, index: number, value: bigint): void;
|
|
18
|
+
/**
|
|
19
|
+
* Update the wallet output with the required information when necessary. If the
|
|
20
|
+
* information is there already, it will skip over it.
|
|
21
|
+
*
|
|
22
|
+
* This function assumes that the output script and value have already been set.
|
|
23
|
+
*
|
|
24
|
+
* @param psbt the PSBT to update change output at
|
|
25
|
+
* @param rootWalletKeys keys that will be able to spend the output
|
|
26
|
+
* @param outputIndex output index where to update the output
|
|
27
|
+
* @param chain chain code to use for deriving scripts (and to determine script
|
|
28
|
+
* type) chain is an API parameter in the BitGo API, and may be
|
|
29
|
+
* any valid ChainCode
|
|
30
|
+
* @param index derivation index for the change address
|
|
31
|
+
* @param value value of the change output
|
|
32
|
+
*/
|
|
33
|
+
export declare function updateWalletOutputForPsbt(psbt: UtxoPsbt, rootWalletKeys: RootWalletKeys, outputIndex: number, chain: ChainCode, index: number): void;
|
|
18
34
|
//# sourceMappingURL=WalletOutput.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WalletOutput.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/WalletOutput.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WalletOutput.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/wallet/WalletOutput.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAsB,MAAM,UAAU,CAAC;AAGzD;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,IAAI,CAYN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,QAAQ,EACd,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,GACZ,IAAI,CAgEN"}
|