utxo-lib 1.1.5 → 8.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of utxo-lib might be problematic. Click here for more details.
- package/index.js +47 -0
- package/package.json +6 -80
- package/LICENSE +0 -21
- package/README.md +0 -59
- package/dist/src/address.d.ts +0 -11
- package/dist/src/address.d.ts.map +0 -1
- package/dist/src/address.js +0 -37
- package/dist/src/addressFormat.d.ts +0 -53
- package/dist/src/addressFormat.d.ts.map +0 -1
- package/dist/src/addressFormat.js +0 -110
- package/dist/src/bitgo/Musig2.d.ts +0 -51
- package/dist/src/bitgo/Musig2.d.ts.map +0 -1
- package/dist/src/bitgo/Musig2.js +0 -175
- package/dist/src/bitgo/Unspent.d.ts +0 -95
- package/dist/src/bitgo/Unspent.d.ts.map +0 -1
- package/dist/src/bitgo/Unspent.js +0 -138
- package/dist/src/bitgo/UtxoPsbt.d.ts +0 -132
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +0 -1
- package/dist/src/bitgo/UtxoPsbt.js +0 -469
- package/dist/src/bitgo/UtxoTransaction.d.ts +0 -22
- package/dist/src/bitgo/UtxoTransaction.d.ts.map +0 -1
- package/dist/src/bitgo/UtxoTransaction.js +0 -97
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -26
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +0 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.js +0 -67
- package/dist/src/bitgo/bbc/DashPsbt.d.ts +0 -12
- package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +0 -1
- package/dist/src/bitgo/bbc/DashPsbt.js +0 -27
- package/dist/src/bitgo/bbc/DashTransaction.d.ts +0 -39
- package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +0 -1
- package/dist/src/bitgo/bbc/DashTransaction.js +0 -109
- package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +0 -14
- package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +0 -1
- package/dist/src/bitgo/bbc/DashTransactionBuilder.js +0 -28
- package/dist/src/bitgo/bbc/index.d.ts +0 -4
- package/dist/src/bitgo/bbc/index.d.ts.map +0 -1
- package/dist/src/bitgo/bbc/index.js +0 -16
- package/dist/src/bitgo/bitcoincash/address.d.ts +0 -35
- package/dist/src/bitgo/bitcoincash/address.d.ts.map +0 -1
- package/dist/src/bitgo/bitcoincash/address.js +0 -151
- package/dist/src/bitgo/bitcoincash/index.d.ts +0 -2
- package/dist/src/bitgo/bitcoincash/index.d.ts.map +0 -1
- package/dist/src/bitgo/bitcoincash/index.js +0 -14
- package/dist/src/bitgo/dash/DashPsbt.d.ts +0 -12
- package/dist/src/bitgo/dash/DashPsbt.d.ts.map +0 -1
- package/dist/src/bitgo/dash/DashPsbt.js +0 -27
- package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -39
- package/dist/src/bitgo/dash/DashTransaction.d.ts.map +0 -1
- package/dist/src/bitgo/dash/DashTransaction.js +0 -109
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -14
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +0 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.js +0 -28
- package/dist/src/bitgo/dash/index.d.ts +0 -4
- package/dist/src/bitgo/dash/index.d.ts.map +0 -1
- package/dist/src/bitgo/dash/index.js +0 -16
- package/dist/src/bitgo/index.d.ts +0 -17
- package/dist/src/bitgo/index.d.ts.map +0 -1
- package/dist/src/bitgo/index.js +0 -30
- package/dist/src/bitgo/keyutil.d.ts +0 -17
- package/dist/src/bitgo/keyutil.d.ts.map +0 -1
- package/dist/src/bitgo/keyutil.js +0 -37
- package/dist/src/bitgo/nonStandardHalfSigned.d.ts +0 -7
- package/dist/src/bitgo/nonStandardHalfSigned.d.ts.map +0 -1
- package/dist/src/bitgo/nonStandardHalfSigned.js +0 -56
- package/dist/src/bitgo/outputScripts.d.ts +0 -84
- package/dist/src/bitgo/outputScripts.d.ts.map +0 -1
- package/dist/src/bitgo/outputScripts.js +0 -297
- package/dist/src/bitgo/parseInput.d.ts +0 -92
- package/dist/src/bitgo/parseInput.d.ts.map +0 -1
- package/dist/src/bitgo/parseInput.js +0 -344
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -24
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +0 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.js +0 -91
- package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -6
- package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +0 -1
- package/dist/src/bitgo/psbt/scriptTypes.js +0 -23
- package/dist/src/bitgo/signature.d.ts +0 -84
- package/dist/src/bitgo/signature.d.ts.map +0 -1
- package/dist/src/bitgo/signature.js +0 -222
- package/dist/src/bitgo/tnumber.d.ts +0 -9
- package/dist/src/bitgo/tnumber.d.ts.map +0 -1
- package/dist/src/bitgo/tnumber.js +0 -31
- package/dist/src/bitgo/transaction.d.ts +0 -29
- package/dist/src/bitgo/transaction.d.ts.map +0 -1
- package/dist/src/bitgo/transaction.js +0 -231
- package/dist/src/bitgo/types.d.ts +0 -5
- package/dist/src/bitgo/types.d.ts.map +0 -1
- package/dist/src/bitgo/types.js +0 -12
- package/dist/src/bitgo/wallet/Psbt.d.ts +0 -47
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +0 -1
- package/dist/src/bitgo/wallet/Psbt.js +0 -232
- package/dist/src/bitgo/wallet/Unspent.d.ts +0 -47
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +0 -1
- package/dist/src/bitgo/wallet/Unspent.js +0 -154
- package/dist/src/bitgo/wallet/WalletKeys.d.ts +0 -72
- package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +0 -1
- package/dist/src/bitgo/wallet/WalletKeys.js +0 -104
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +0 -18
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +0 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +0 -69
- package/dist/src/bitgo/wallet/WalletScripts.d.ts +0 -7
- package/dist/src/bitgo/wallet/WalletScripts.d.ts.map +0 -1
- package/dist/src/bitgo/wallet/WalletScripts.js +0 -15
- package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +0 -19
- package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +0 -1
- package/dist/src/bitgo/wallet/WalletUnspentSigner.js +0 -47
- package/dist/src/bitgo/wallet/chains.d.ts +0 -57
- package/dist/src/bitgo/wallet/chains.d.ts.map +0 -1
- package/dist/src/bitgo/wallet/chains.js +0 -106
- package/dist/src/bitgo/wallet/index.d.ts +0 -8
- package/dist/src/bitgo/wallet/index.d.ts.map +0 -1
- package/dist/src/bitgo/wallet/index.js +0 -20
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +0 -26
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +0 -1
- package/dist/src/bitgo/zcash/ZcashBufferutils.js +0 -157
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -36
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +0 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +0 -146
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +0 -61
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +0 -1
- package/dist/src/bitgo/zcash/ZcashTransaction.js +0 -341
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -21
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +0 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +0 -105
- package/dist/src/bitgo/zcash/address.d.ts +0 -8
- package/dist/src/bitgo/zcash/address.d.ts.map +0 -1
- package/dist/src/bitgo/zcash/address.js +0 -57
- package/dist/src/bitgo/zcash/hashZip0244.d.ts +0 -27
- package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +0 -1
- package/dist/src/bitgo/zcash/hashZip0244.js +0 -184
- package/dist/src/bitgo/zcash/index.d.ts +0 -4
- package/dist/src/bitgo/zcash/index.d.ts.map +0 -1
- package/dist/src/bitgo/zcash/index.js +0 -16
- package/dist/src/classify.d.ts +0 -19
- package/dist/src/classify.d.ts.map +0 -1
- package/dist/src/classify.js +0 -89
- package/dist/src/index.d.ts +0 -13
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -36
- package/dist/src/networks.d.ts +0 -115
- package/dist/src/networks.d.ts.map +0 -1
- package/dist/src/networks.js +0 -458
- package/dist/src/noble_ecc.d.ts +0 -28
- package/dist/src/noble_ecc.d.ts.map +0 -1
- package/dist/src/noble_ecc.js +0 -168
- package/dist/src/payments/index.d.ts +0 -4
- package/dist/src/payments/index.d.ts.map +0 -1
- package/dist/src/payments/index.js +0 -8
- package/dist/src/payments/p2tr.d.ts +0 -3
- package/dist/src/payments/p2tr.d.ts.map +0 -1
- package/dist/src/payments/p2tr.js +0 -348
- package/dist/src/payments/p2tr_ns.d.ts +0 -3
- package/dist/src/payments/p2tr_ns.d.ts.map +0 -1
- package/dist/src/payments/p2tr_ns.js +0 -134
- package/dist/src/taproot.d.ts +0 -141
- package/dist/src/taproot.d.ts.map +0 -1
- package/dist/src/taproot.js +0 -384
- package/dist/src/templates/multisig/index.d.ts +0 -4
- package/dist/src/templates/multisig/index.d.ts.map +0 -1
- package/dist/src/templates/multisig/index.js +0 -8
- package/dist/src/templates/multisig/input.d.ts +0 -7
- package/dist/src/templates/multisig/input.d.ts.map +0 -1
- package/dist/src/templates/multisig/input.js +0 -25
- package/dist/src/templates/multisig/output.d.ts +0 -7
- package/dist/src/templates/multisig/output.d.ts.map +0 -1
- package/dist/src/templates/multisig/output.js +0 -38
- package/dist/src/templates/nulldata.d.ts +0 -10
- package/dist/src/templates/nulldata.d.ts.map +0 -1
- package/dist/src/templates/nulldata.js +0 -17
- package/dist/src/templates/pubkey/index.d.ts +0 -4
- package/dist/src/templates/pubkey/index.d.ts.map +0 -1
- package/dist/src/templates/pubkey/index.js +0 -8
- package/dist/src/templates/pubkey/input.d.ts +0 -7
- package/dist/src/templates/pubkey/input.d.ts.map +0 -1
- package/dist/src/templates/pubkey/input.js +0 -14
- package/dist/src/templates/pubkey/output.d.ts +0 -7
- package/dist/src/templates/pubkey/output.d.ts.map +0 -1
- package/dist/src/templates/pubkey/output.js +0 -15
- package/dist/src/templates/pubkeyhash/index.d.ts +0 -4
- package/dist/src/templates/pubkeyhash/index.d.ts.map +0 -1
- package/dist/src/templates/pubkeyhash/index.js +0 -8
- package/dist/src/templates/pubkeyhash/input.d.ts +0 -7
- package/dist/src/templates/pubkeyhash/input.d.ts.map +0 -1
- package/dist/src/templates/pubkeyhash/input.js +0 -16
- package/dist/src/templates/pubkeyhash/output.d.ts +0 -6
- package/dist/src/templates/pubkeyhash/output.d.ts.map +0 -1
- package/dist/src/templates/pubkeyhash/output.js +0 -20
- package/dist/src/templates/scripthash/index.d.ts +0 -4
- package/dist/src/templates/scripthash/index.d.ts.map +0 -1
- package/dist/src/templates/scripthash/index.js +0 -8
- package/dist/src/templates/scripthash/input.d.ts +0 -6
- package/dist/src/templates/scripthash/input.d.ts.map +0 -1
- package/dist/src/templates/scripthash/input.js +0 -43
- package/dist/src/templates/scripthash/output.d.ts +0 -6
- package/dist/src/templates/scripthash/output.d.ts.map +0 -1
- package/dist/src/templates/scripthash/output.js +0 -15
- package/dist/src/templates/taproot/index.d.ts +0 -4
- package/dist/src/templates/taproot/index.d.ts.map +0 -1
- package/dist/src/templates/taproot/index.js +0 -8
- package/dist/src/templates/taproot/input.d.ts +0 -6
- package/dist/src/templates/taproot/input.d.ts.map +0 -1
- package/dist/src/templates/taproot/input.js +0 -23
- package/dist/src/templates/taproot/output.d.ts +0 -6
- package/dist/src/templates/taproot/output.d.ts.map +0 -1
- package/dist/src/templates/taproot/output.js +0 -15
- package/dist/src/templates/taprootnofn/index.d.ts +0 -4
- package/dist/src/templates/taprootnofn/index.d.ts.map +0 -1
- package/dist/src/templates/taprootnofn/index.js +0 -8
- package/dist/src/templates/taprootnofn/input.d.ts +0 -7
- package/dist/src/templates/taprootnofn/input.d.ts.map +0 -1
- package/dist/src/templates/taprootnofn/input.js +0 -24
- package/dist/src/templates/taprootnofn/output.d.ts +0 -7
- package/dist/src/templates/taprootnofn/output.d.ts.map +0 -1
- package/dist/src/templates/taprootnofn/output.js +0 -28
- package/dist/src/templates/witnesscommitment/index.d.ts +0 -3
- package/dist/src/templates/witnesscommitment/index.d.ts.map +0 -1
- package/dist/src/templates/witnesscommitment/index.js +0 -6
- package/dist/src/templates/witnesscommitment/output.d.ts +0 -8
- package/dist/src/templates/witnesscommitment/output.d.ts.map +0 -1
- package/dist/src/templates/witnesscommitment/output.js +0 -31
- package/dist/src/templates/witnesspubkeyhash/index.d.ts +0 -4
- package/dist/src/templates/witnesspubkeyhash/index.d.ts.map +0 -1
- package/dist/src/templates/witnesspubkeyhash/index.js +0 -8
- package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -7
- package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +0 -1
- package/dist/src/templates/witnesspubkeyhash/input.js +0 -19
- package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -6
- package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +0 -1
- package/dist/src/templates/witnesspubkeyhash/output.js +0 -15
- package/dist/src/templates/witnessscripthash/index.d.ts +0 -4
- package/dist/src/templates/witnessscripthash/index.d.ts.map +0 -1
- package/dist/src/templates/witnessscripthash/index.js +0 -8
- package/dist/src/templates/witnessscripthash/input.d.ts +0 -6
- package/dist/src/templates/witnessscripthash/input.d.ts.map +0 -1
- package/dist/src/templates/witnessscripthash/input.js +0 -35
- package/dist/src/templates/witnessscripthash/output.d.ts +0 -6
- package/dist/src/templates/witnessscripthash/output.d.ts.map +0 -1
- package/dist/src/templates/witnessscripthash/output.js +0 -15
- package/dist/src/testutil/index.d.ts +0 -3
- package/dist/src/testutil/index.d.ts.map +0 -1
- package/dist/src/testutil/index.js +0 -15
- package/dist/src/testutil/keys.d.ts +0 -10
- package/dist/src/testutil/keys.d.ts.map +0 -1
- package/dist/src/testutil/keys.js +0 -40
- package/dist/src/testutil/mock.d.ts +0 -21
- package/dist/src/testutil/mock.d.ts.map +0 -1
- package/dist/src/testutil/mock.js +0 -86
- package/dist/src/transaction_builder.d.ts +0 -47
- package/dist/src/transaction_builder.d.ts.map +0 -1
- package/dist/src/transaction_builder.js +0 -1084
@@ -1,1084 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.TransactionBuilder = void 0;
|
4
|
-
const types = require("bitcoinjs-lib/src/types");
|
5
|
-
const _1 = require("./");
|
6
|
-
const bufferutils = require("bitcoinjs-lib/src/bufferutils");
|
7
|
-
const classify = require("./classify");
|
8
|
-
const _2 = require("./");
|
9
|
-
const _3 = require("./");
|
10
|
-
const _4 = require("./");
|
11
|
-
const _5 = require("./");
|
12
|
-
const _6 = require("./");
|
13
|
-
const _7 = require("./");
|
14
|
-
const _8 = require("./");
|
15
|
-
const noble_ecc_1 = require("./noble_ecc");
|
16
|
-
const typeforce = require('typeforce');
|
17
|
-
const tfFullSigner = (obj) => {
|
18
|
-
return typeforce.Buffer(obj.publicKey) && typeof obj.sign === 'function' && typeof obj.signSchnorr === 'function';
|
19
|
-
};
|
20
|
-
const SCRIPT_TYPES = classify.types;
|
21
|
-
const PREVOUT_TYPES = new Set([
|
22
|
-
// Raw
|
23
|
-
'p2pkh',
|
24
|
-
'p2pk',
|
25
|
-
'p2wpkh',
|
26
|
-
'p2ms',
|
27
|
-
// P2SH wrapped
|
28
|
-
'p2sh-p2pkh',
|
29
|
-
'p2sh-p2pk',
|
30
|
-
'p2sh-p2wpkh',
|
31
|
-
'p2sh-p2ms',
|
32
|
-
// P2WSH wrapped
|
33
|
-
'p2wsh-p2pkh',
|
34
|
-
'p2wsh-p2pk',
|
35
|
-
'p2wsh-p2ms',
|
36
|
-
// P2SH-P2WSH wrapper
|
37
|
-
'p2sh-p2wsh-p2pkh',
|
38
|
-
'p2sh-p2wsh-p2pk',
|
39
|
-
'p2sh-p2wsh-p2ms',
|
40
|
-
// P2TR KeyPath
|
41
|
-
'p2tr',
|
42
|
-
// P2TR ScriptPath
|
43
|
-
'p2tr-p2ns',
|
44
|
-
]);
|
45
|
-
function tfMessage(type, value, message) {
|
46
|
-
try {
|
47
|
-
typeforce(type, value);
|
48
|
-
}
|
49
|
-
catch (err) {
|
50
|
-
throw new Error(message);
|
51
|
-
}
|
52
|
-
}
|
53
|
-
function txIsString(tx) {
|
54
|
-
return typeof tx === 'string' || tx instanceof String;
|
55
|
-
}
|
56
|
-
function txIsTransaction(tx) {
|
57
|
-
return tx instanceof _8.Transaction;
|
58
|
-
}
|
59
|
-
class TransactionBuilder {
|
60
|
-
// WARNING: maximumFeeRate is __NOT__ to be relied on,
|
61
|
-
// it's just another potential safety mechanism (safety in-depth)
|
62
|
-
constructor(network = _3.networks.bitcoin, maximumFeeRate = 2500) {
|
63
|
-
this.network = network;
|
64
|
-
this.maximumFeeRate = maximumFeeRate;
|
65
|
-
this.__PREV_TX_SET = {};
|
66
|
-
this.__INPUTS = [];
|
67
|
-
this.__TX = new _8.Transaction();
|
68
|
-
this.__TX.version = 2;
|
69
|
-
this.__USE_LOW_R = false;
|
70
|
-
console.warn('Deprecation Warning: TransactionBuilder will be removed in the future. ' +
|
71
|
-
'(v6.x.x or later) Please use the Psbt class instead. Examples of usage ' +
|
72
|
-
'are available in the transactions-psbt.js integration test file on our ' +
|
73
|
-
'Github. A high level explanation is available in the psbt.ts and psbt.js ' +
|
74
|
-
'files as well.');
|
75
|
-
}
|
76
|
-
static fromTransaction(transaction, network, prevOutputs) {
|
77
|
-
const txb = new TransactionBuilder(network);
|
78
|
-
// Copy transaction fields
|
79
|
-
txb.setVersion(transaction.version);
|
80
|
-
txb.setLockTime(transaction.locktime);
|
81
|
-
// Copy outputs (done first to avoid signature invalidation)
|
82
|
-
transaction.outs.forEach((txOut) => {
|
83
|
-
txb.addOutput(txOut.script, txOut.value);
|
84
|
-
});
|
85
|
-
// Copy inputs
|
86
|
-
transaction.ins.forEach((txIn) => {
|
87
|
-
txb.__addInputUnsafe(txIn.hash, txIn.index, {
|
88
|
-
sequence: txIn.sequence,
|
89
|
-
script: txIn.script,
|
90
|
-
witness: txIn.witness,
|
91
|
-
});
|
92
|
-
});
|
93
|
-
// fix some things not possible through the public API
|
94
|
-
txb.__INPUTS.forEach((input, i) => {
|
95
|
-
fixMultisigOrder(input, transaction, i, prevOutputs);
|
96
|
-
});
|
97
|
-
return txb;
|
98
|
-
}
|
99
|
-
setLowR(setting) {
|
100
|
-
typeforce(typeforce.maybe(typeforce.Boolean), setting);
|
101
|
-
if (setting === undefined) {
|
102
|
-
setting = true;
|
103
|
-
}
|
104
|
-
this.__USE_LOW_R = setting;
|
105
|
-
return setting;
|
106
|
-
}
|
107
|
-
setLockTime(locktime) {
|
108
|
-
typeforce(types.UInt32, locktime);
|
109
|
-
// if any signatures exist, throw
|
110
|
-
if (this.__INPUTS.some((input) => {
|
111
|
-
if (!input.signatures)
|
112
|
-
return false;
|
113
|
-
return input.signatures.some((s) => s !== undefined);
|
114
|
-
})) {
|
115
|
-
throw new Error('No, this would invalidate signatures');
|
116
|
-
}
|
117
|
-
this.__TX.locktime = locktime;
|
118
|
-
}
|
119
|
-
setVersion(version) {
|
120
|
-
typeforce(types.UInt32, version);
|
121
|
-
// XXX: this might eventually become more complex depending on what the versions represent
|
122
|
-
this.__TX.version = version;
|
123
|
-
}
|
124
|
-
addInput(txHash, vout, sequence, prevOutScript, value) {
|
125
|
-
if (!this.__canModifyInputs()) {
|
126
|
-
throw new Error('No, this would invalidate signatures');
|
127
|
-
}
|
128
|
-
// is it a hex string?
|
129
|
-
if (txIsString(txHash)) {
|
130
|
-
// transaction hashs's are displayed in reverse order, un-reverse it
|
131
|
-
txHash = bufferutils.reverseBuffer(Buffer.from(txHash, 'hex'));
|
132
|
-
// is it a Transaction object?
|
133
|
-
}
|
134
|
-
else if (txIsTransaction(txHash)) {
|
135
|
-
const txOut = txHash.outs[vout];
|
136
|
-
prevOutScript = txOut.script;
|
137
|
-
value = txOut.value;
|
138
|
-
txHash = txHash.getHash(false);
|
139
|
-
}
|
140
|
-
return this.__addInputUnsafe(txHash, vout, {
|
141
|
-
sequence,
|
142
|
-
prevOutScript,
|
143
|
-
value,
|
144
|
-
});
|
145
|
-
}
|
146
|
-
addOutput(scriptPubKey, value) {
|
147
|
-
if (!this.__canModifyOutputs()) {
|
148
|
-
throw new Error('No, this would invalidate signatures');
|
149
|
-
}
|
150
|
-
// Attempt to get a script if it's a base58 or bech32 address string
|
151
|
-
if (typeof scriptPubKey === 'string') {
|
152
|
-
scriptPubKey = _1.address.toOutputScript(scriptPubKey, this.network);
|
153
|
-
}
|
154
|
-
return this.__TX.addOutput(scriptPubKey, value);
|
155
|
-
}
|
156
|
-
build() {
|
157
|
-
return this.__build(false);
|
158
|
-
}
|
159
|
-
buildIncomplete() {
|
160
|
-
return this.__build(true);
|
161
|
-
}
|
162
|
-
sign(signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript, controlBlock, annex) {
|
163
|
-
trySign(getSigningData(this.network, this.__INPUTS, this.__needsOutputs.bind(this), this.__TX, signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript, controlBlock, annex, this.__USE_LOW_R));
|
164
|
-
}
|
165
|
-
__addInputUnsafe(txHash, vout, options) {
|
166
|
-
if (_8.Transaction.isCoinbaseHash(txHash)) {
|
167
|
-
throw new Error('coinbase inputs not supported');
|
168
|
-
}
|
169
|
-
const prevTxOut = txHash.toString('hex') + ':' + vout;
|
170
|
-
if (this.__PREV_TX_SET[prevTxOut] !== undefined)
|
171
|
-
throw new Error('Duplicate TxOut: ' + prevTxOut);
|
172
|
-
let input = {};
|
173
|
-
// derive what we can from the scriptSig
|
174
|
-
if (options.script !== undefined || options.witness !== undefined) {
|
175
|
-
input = expandInput(options.script, options.witness);
|
176
|
-
}
|
177
|
-
// if an input value was given, retain it
|
178
|
-
if (options.value !== undefined) {
|
179
|
-
input.value = options.value;
|
180
|
-
}
|
181
|
-
// derive what we can from the previous transactions output script
|
182
|
-
if (!input.prevOutScript && options.prevOutScript) {
|
183
|
-
let prevOutType;
|
184
|
-
if (!input.pubkeys && !input.signatures) {
|
185
|
-
const expanded = expandOutput(options.prevOutScript);
|
186
|
-
if (expanded.pubkeys) {
|
187
|
-
input.pubkeys = expanded.pubkeys;
|
188
|
-
input.signatures = expanded.signatures;
|
189
|
-
}
|
190
|
-
prevOutType = expanded.type;
|
191
|
-
}
|
192
|
-
input.prevOutScript = options.prevOutScript;
|
193
|
-
input.prevOutType = prevOutType || classify.output(options.prevOutScript);
|
194
|
-
}
|
195
|
-
const vin = this.__TX.addInput(txHash, vout, options.sequence, options.scriptSig);
|
196
|
-
this.__INPUTS[vin] = input;
|
197
|
-
this.__PREV_TX_SET[prevTxOut] = true;
|
198
|
-
return vin;
|
199
|
-
}
|
200
|
-
__build(allowIncomplete) {
|
201
|
-
if (!allowIncomplete) {
|
202
|
-
if (!this.__TX.ins.length)
|
203
|
-
throw new Error('Transaction has no inputs');
|
204
|
-
if (!this.__TX.outs.length)
|
205
|
-
throw new Error('Transaction has no outputs');
|
206
|
-
}
|
207
|
-
const tx = this.__TX.clone();
|
208
|
-
// create script signatures from inputs
|
209
|
-
this.__INPUTS.forEach((input, i) => {
|
210
|
-
if (!input.prevOutType && !allowIncomplete)
|
211
|
-
throw new Error('Transaction is not complete');
|
212
|
-
const result = build(input.prevOutType, input, allowIncomplete);
|
213
|
-
if (!result) {
|
214
|
-
if (!allowIncomplete && input.prevOutType === SCRIPT_TYPES.NONSTANDARD)
|
215
|
-
throw new Error('Unknown input type');
|
216
|
-
if (!allowIncomplete)
|
217
|
-
throw new Error('Not enough information');
|
218
|
-
return;
|
219
|
-
}
|
220
|
-
if (result.input) {
|
221
|
-
tx.setInputScript(i, result.input);
|
222
|
-
}
|
223
|
-
tx.setWitness(i, result.witness);
|
224
|
-
});
|
225
|
-
if (!allowIncomplete) {
|
226
|
-
// do not rely on this, its merely a last resort
|
227
|
-
if (this.__overMaximumFees(tx.virtualSize())) {
|
228
|
-
throw new Error('Transaction has absurd fees');
|
229
|
-
}
|
230
|
-
}
|
231
|
-
return tx;
|
232
|
-
}
|
233
|
-
__canModifyInputs() {
|
234
|
-
return this.__INPUTS.every((input) => {
|
235
|
-
if (!input.signatures)
|
236
|
-
return true;
|
237
|
-
return input.signatures.every((signature) => {
|
238
|
-
if (!signature)
|
239
|
-
return true;
|
240
|
-
const hashType = signatureHashType(signature);
|
241
|
-
// if SIGHASH_ANYONECANPAY is set, signatures would not
|
242
|
-
// be invalidated by more inputs
|
243
|
-
return (hashType & _8.Transaction.SIGHASH_ANYONECANPAY) !== 0;
|
244
|
-
});
|
245
|
-
});
|
246
|
-
}
|
247
|
-
__needsOutputs(signingHashType) {
|
248
|
-
if (signingHashType === _8.Transaction.SIGHASH_ALL || signingHashType === _8.Transaction.SIGHASH_DEFAULT) {
|
249
|
-
return this.__TX.outs.length === 0;
|
250
|
-
}
|
251
|
-
// if inputs are being signed with SIGHASH_NONE, we don't strictly need outputs
|
252
|
-
// .build() will fail, but .buildIncomplete() is OK
|
253
|
-
return (this.__TX.outs.length === 0 &&
|
254
|
-
this.__INPUTS.some((input) => {
|
255
|
-
if (!input.signatures)
|
256
|
-
return false;
|
257
|
-
return input.signatures.some((signature) => {
|
258
|
-
if (!signature)
|
259
|
-
return false; // no signature, no issue
|
260
|
-
const hashType = signatureHashType(signature);
|
261
|
-
if (hashType & _8.Transaction.SIGHASH_NONE)
|
262
|
-
return false; // SIGHASH_NONE doesn't care about outputs
|
263
|
-
return true; // SIGHASH_* does care
|
264
|
-
});
|
265
|
-
}));
|
266
|
-
}
|
267
|
-
__canModifyOutputs() {
|
268
|
-
const nInputs = this.__TX.ins.length;
|
269
|
-
const nOutputs = this.__TX.outs.length;
|
270
|
-
return this.__INPUTS.every((input) => {
|
271
|
-
if (input.signatures === undefined)
|
272
|
-
return true;
|
273
|
-
return input.signatures.every((signature) => {
|
274
|
-
if (!signature)
|
275
|
-
return true;
|
276
|
-
const hashType = signatureHashType(signature);
|
277
|
-
const hashTypeMod = hashType & 0x1f;
|
278
|
-
if (hashTypeMod === _8.Transaction.SIGHASH_NONE)
|
279
|
-
return true;
|
280
|
-
if (hashTypeMod === _8.Transaction.SIGHASH_SINGLE) {
|
281
|
-
// if SIGHASH_SINGLE is set, and nInputs > nOutputs
|
282
|
-
// some signatures would be invalidated by the addition
|
283
|
-
// of more outputs
|
284
|
-
return nInputs <= nOutputs;
|
285
|
-
}
|
286
|
-
return false;
|
287
|
-
});
|
288
|
-
});
|
289
|
-
}
|
290
|
-
__overMaximumFees(bytes) {
|
291
|
-
// not all inputs will have .value defined
|
292
|
-
const incoming = this.__INPUTS.reduce((a, x) => a + (typeof x.value !== 'undefined' ? BigInt(x.value) : BigInt(0)), BigInt(0));
|
293
|
-
// but all outputs do, and if we have any input value
|
294
|
-
// we can immediately determine if the outputs are too small
|
295
|
-
const outgoing = this.__TX.outs.reduce((a, x) => a + BigInt(x.value), BigInt(0));
|
296
|
-
const fee = incoming - outgoing;
|
297
|
-
const feeRate = Number(fee) / bytes; // assume fee fits within number
|
298
|
-
return feeRate > this.maximumFeeRate;
|
299
|
-
}
|
300
|
-
}
|
301
|
-
exports.TransactionBuilder = TransactionBuilder;
|
302
|
-
function expandInput(scriptSig, witnessStack = [], type, scriptPubKey) {
|
303
|
-
if (scriptSig && scriptSig.length === 0 && witnessStack.length === 0)
|
304
|
-
return {};
|
305
|
-
if (!type) {
|
306
|
-
let ssType = scriptSig ? classify.input(scriptSig, true) : undefined;
|
307
|
-
let wsType = classify.witness(witnessStack, true);
|
308
|
-
if (ssType === SCRIPT_TYPES.NONSTANDARD)
|
309
|
-
ssType = undefined;
|
310
|
-
if (wsType === SCRIPT_TYPES.NONSTANDARD)
|
311
|
-
wsType = undefined;
|
312
|
-
type = ssType || wsType;
|
313
|
-
}
|
314
|
-
switch (type) {
|
315
|
-
case SCRIPT_TYPES.P2WPKH: {
|
316
|
-
const { output, pubkey, signature } = _4.payments.p2wpkh({
|
317
|
-
witness: witnessStack,
|
318
|
-
});
|
319
|
-
return {
|
320
|
-
prevOutScript: output,
|
321
|
-
prevOutType: SCRIPT_TYPES.P2WPKH,
|
322
|
-
pubkeys: [pubkey],
|
323
|
-
signatures: [signature],
|
324
|
-
};
|
325
|
-
}
|
326
|
-
case SCRIPT_TYPES.P2PKH: {
|
327
|
-
const { output, pubkey, signature } = _4.payments.p2pkh({
|
328
|
-
input: scriptSig,
|
329
|
-
});
|
330
|
-
return {
|
331
|
-
prevOutScript: output,
|
332
|
-
prevOutType: SCRIPT_TYPES.P2PKH,
|
333
|
-
pubkeys: [pubkey],
|
334
|
-
signatures: [signature],
|
335
|
-
};
|
336
|
-
}
|
337
|
-
case SCRIPT_TYPES.P2PK: {
|
338
|
-
const { signature } = _4.payments.p2pk({ input: scriptSig });
|
339
|
-
return {
|
340
|
-
prevOutType: SCRIPT_TYPES.P2PK,
|
341
|
-
pubkeys: [undefined],
|
342
|
-
signatures: [signature],
|
343
|
-
};
|
344
|
-
}
|
345
|
-
case SCRIPT_TYPES.P2MS: {
|
346
|
-
const { m, pubkeys, signatures } = _4.payments.p2ms({
|
347
|
-
input: scriptSig,
|
348
|
-
output: scriptPubKey,
|
349
|
-
}, { allowIncomplete: true });
|
350
|
-
return {
|
351
|
-
prevOutType: SCRIPT_TYPES.P2MS,
|
352
|
-
pubkeys,
|
353
|
-
signatures,
|
354
|
-
maxSignatures: m,
|
355
|
-
};
|
356
|
-
}
|
357
|
-
case SCRIPT_TYPES.P2TR_NS: {
|
358
|
-
const { n, pubkeys, signatures } = _1.p2trPayments.p2tr_ns({
|
359
|
-
// Witness signatures are reverse of pubkeys, because it's a stack
|
360
|
-
signatures: witnessStack.length ? witnessStack.reverse() : undefined,
|
361
|
-
output: scriptPubKey,
|
362
|
-
}, { allowIncomplete: true, eccLib: noble_ecc_1.ecc });
|
363
|
-
return {
|
364
|
-
prevOutType: SCRIPT_TYPES.P2TR_NS,
|
365
|
-
pubkeys,
|
366
|
-
signatures,
|
367
|
-
maxSignatures: n,
|
368
|
-
};
|
369
|
-
}
|
370
|
-
}
|
371
|
-
if (type === SCRIPT_TYPES.P2SH) {
|
372
|
-
const { output, redeem } = _4.payments.p2sh({
|
373
|
-
input: scriptSig,
|
374
|
-
witness: witnessStack,
|
375
|
-
});
|
376
|
-
const outputType = classify.output(redeem.output);
|
377
|
-
const expanded = expandInput(redeem.input, redeem.witness, outputType, redeem.output);
|
378
|
-
if (!expanded.prevOutType)
|
379
|
-
return {};
|
380
|
-
return {
|
381
|
-
prevOutScript: output,
|
382
|
-
prevOutType: SCRIPT_TYPES.P2SH,
|
383
|
-
redeemScript: redeem.output,
|
384
|
-
redeemScriptType: expanded.prevOutType,
|
385
|
-
witnessScript: expanded.witnessScript,
|
386
|
-
witnessScriptType: expanded.witnessScriptType,
|
387
|
-
pubkeys: expanded.pubkeys,
|
388
|
-
signatures: expanded.signatures,
|
389
|
-
};
|
390
|
-
}
|
391
|
-
if (type === SCRIPT_TYPES.P2WSH) {
|
392
|
-
const { output, redeem } = _4.payments.p2wsh({
|
393
|
-
input: scriptSig,
|
394
|
-
witness: witnessStack,
|
395
|
-
});
|
396
|
-
const outputType = classify.output(redeem.output);
|
397
|
-
let expanded;
|
398
|
-
if (outputType === SCRIPT_TYPES.P2WPKH) {
|
399
|
-
expanded = expandInput(redeem.input, redeem.witness, outputType);
|
400
|
-
}
|
401
|
-
else {
|
402
|
-
expanded = expandInput(_5.script.compile(redeem.witness), [], outputType, redeem.output);
|
403
|
-
}
|
404
|
-
if (!expanded.prevOutType)
|
405
|
-
return {};
|
406
|
-
return {
|
407
|
-
prevOutScript: output,
|
408
|
-
prevOutType: SCRIPT_TYPES.P2WSH,
|
409
|
-
witnessScript: redeem.output,
|
410
|
-
witnessScriptType: expanded.prevOutType,
|
411
|
-
pubkeys: expanded.pubkeys,
|
412
|
-
signatures: expanded.signatures,
|
413
|
-
};
|
414
|
-
}
|
415
|
-
if (type === SCRIPT_TYPES.P2TR) {
|
416
|
-
const parsedWitness = _7.taproot.parseTaprootWitness(witnessStack);
|
417
|
-
if (parsedWitness.spendType === 'Key') {
|
418
|
-
// key path spend, nothing to expand
|
419
|
-
const { signature, annex } = parsedWitness;
|
420
|
-
return {
|
421
|
-
prevOutType: SCRIPT_TYPES.P2TR,
|
422
|
-
signatures: [signature],
|
423
|
-
annex,
|
424
|
-
};
|
425
|
-
}
|
426
|
-
else {
|
427
|
-
// script path spend
|
428
|
-
const { tapscript, controlBlock, annex } = parsedWitness;
|
429
|
-
const prevOutScript = _1.p2trPayments.p2tr({
|
430
|
-
redeems: [{ output: tapscript }],
|
431
|
-
redeemIndex: 0,
|
432
|
-
controlBlock,
|
433
|
-
annex,
|
434
|
-
}, { eccLib: noble_ecc_1.ecc }).output;
|
435
|
-
const witnessScriptType = classify.output(tapscript);
|
436
|
-
const { pubkeys, signatures } = expandInput(undefined, parsedWitness.scriptSig, witnessScriptType, tapscript);
|
437
|
-
return {
|
438
|
-
prevOutScript,
|
439
|
-
prevOutType: SCRIPT_TYPES.P2TR,
|
440
|
-
witnessScript: tapscript,
|
441
|
-
witnessScriptType,
|
442
|
-
controlBlock,
|
443
|
-
annex,
|
444
|
-
pubkeys,
|
445
|
-
signatures,
|
446
|
-
};
|
447
|
-
}
|
448
|
-
}
|
449
|
-
return {
|
450
|
-
prevOutType: SCRIPT_TYPES.NONSTANDARD,
|
451
|
-
prevOutScript: scriptSig,
|
452
|
-
};
|
453
|
-
}
|
454
|
-
// could be done in expandInput, but requires the original Transaction for hashForSignature
|
455
|
-
function fixMultisigOrder(input, transaction, vin, prevOutputs) {
|
456
|
-
if (input.redeemScriptType !== SCRIPT_TYPES.P2MS || !input.redeemScript)
|
457
|
-
return;
|
458
|
-
if (input.pubkeys.length === input.signatures.length)
|
459
|
-
return;
|
460
|
-
const prevOutput = prevOutputs && prevOutputs[vin];
|
461
|
-
const unmatched = input.signatures.concat();
|
462
|
-
input.signatures = input.pubkeys.map((pubKey) => {
|
463
|
-
const keyPair = noble_ecc_1.ECPair.fromPublicKey(pubKey);
|
464
|
-
let match;
|
465
|
-
// check for a signature
|
466
|
-
unmatched.some((signature, i) => {
|
467
|
-
// skip if undefined || OP_0
|
468
|
-
if (!signature)
|
469
|
-
return false;
|
470
|
-
// TODO: avoid O(n) hashForSignature
|
471
|
-
const parsed = _5.script.signature.decode(signature);
|
472
|
-
const hash = transaction.hashForSignature(vin, input.redeemScript, parsed.hashType, prevOutput === null || prevOutput === void 0 ? void 0 : prevOutput.value);
|
473
|
-
// skip if signature does not match pubKey
|
474
|
-
if (!keyPair.verify(hash, parsed.signature))
|
475
|
-
return false;
|
476
|
-
// remove matched signature from unmatched
|
477
|
-
unmatched[i] = undefined;
|
478
|
-
match = signature;
|
479
|
-
return true;
|
480
|
-
});
|
481
|
-
return match;
|
482
|
-
});
|
483
|
-
}
|
484
|
-
function expandOutput(script, ourPubKey, controlBlock) {
|
485
|
-
typeforce(types.Buffer, script);
|
486
|
-
const type = classify.output(script);
|
487
|
-
switch (type) {
|
488
|
-
case SCRIPT_TYPES.P2PKH: {
|
489
|
-
if (!ourPubKey)
|
490
|
-
return { type };
|
491
|
-
// does our hash160(pubKey) match the output scripts?
|
492
|
-
const pkh1 = _4.payments.p2pkh({ output: script }).hash;
|
493
|
-
const pkh2 = _2.crypto.hash160(ourPubKey);
|
494
|
-
if (!pkh1.equals(pkh2))
|
495
|
-
return { type };
|
496
|
-
return {
|
497
|
-
type,
|
498
|
-
pubkeys: [ourPubKey],
|
499
|
-
signatures: [undefined],
|
500
|
-
};
|
501
|
-
}
|
502
|
-
case SCRIPT_TYPES.P2WPKH: {
|
503
|
-
if (!ourPubKey)
|
504
|
-
return { type };
|
505
|
-
// does our hash160(pubKey) match the output scripts?
|
506
|
-
const wpkh1 = _4.payments.p2wpkh({ output: script }).hash;
|
507
|
-
const wpkh2 = _2.crypto.hash160(ourPubKey);
|
508
|
-
if (!wpkh1.equals(wpkh2))
|
509
|
-
return { type };
|
510
|
-
return {
|
511
|
-
type,
|
512
|
-
pubkeys: [ourPubKey],
|
513
|
-
signatures: [undefined],
|
514
|
-
};
|
515
|
-
}
|
516
|
-
case SCRIPT_TYPES.P2TR: {
|
517
|
-
if (!ourPubKey)
|
518
|
-
return { type };
|
519
|
-
// HACK ourPubKey to BIP340-style
|
520
|
-
if (ourPubKey.length === 33)
|
521
|
-
ourPubKey = ourPubKey.slice(1);
|
522
|
-
// TODO: support multiple pubkeys
|
523
|
-
const p2tr = _1.p2trPayments.p2tr({ pubkey: ourPubKey, controlBlock }, { eccLib: noble_ecc_1.ecc });
|
524
|
-
// Does tweaked output for a single pubkey match?
|
525
|
-
if (!script.equals(p2tr.output))
|
526
|
-
return { type };
|
527
|
-
// P2TR KeyPath, single key
|
528
|
-
return {
|
529
|
-
type,
|
530
|
-
pubkeys: [ourPubKey],
|
531
|
-
signatures: [undefined],
|
532
|
-
};
|
533
|
-
}
|
534
|
-
case SCRIPT_TYPES.P2TR_NS: {
|
535
|
-
const p2trNs = _1.p2trPayments.p2tr_ns({ output: script }, { eccLib: noble_ecc_1.ecc });
|
536
|
-
// P2TR ScriptPath
|
537
|
-
return {
|
538
|
-
type,
|
539
|
-
pubkeys: p2trNs.pubkeys,
|
540
|
-
signatures: p2trNs.pubkeys.map(() => undefined),
|
541
|
-
maxSignatures: p2trNs.pubkeys.length,
|
542
|
-
};
|
543
|
-
}
|
544
|
-
case SCRIPT_TYPES.P2PK: {
|
545
|
-
const p2pk = _4.payments.p2pk({ output: script });
|
546
|
-
return {
|
547
|
-
type,
|
548
|
-
pubkeys: [p2pk.pubkey],
|
549
|
-
signatures: [undefined],
|
550
|
-
};
|
551
|
-
}
|
552
|
-
case SCRIPT_TYPES.P2MS: {
|
553
|
-
const p2ms = _4.payments.p2ms({ output: script });
|
554
|
-
return {
|
555
|
-
type,
|
556
|
-
pubkeys: p2ms.pubkeys,
|
557
|
-
signatures: p2ms.pubkeys.map(() => undefined),
|
558
|
-
maxSignatures: p2ms.m,
|
559
|
-
};
|
560
|
-
}
|
561
|
-
}
|
562
|
-
return { type };
|
563
|
-
}
|
564
|
-
function prepareInput(input, ourPubKey, redeemScript, witnessScript, controlBlock, annex) {
|
565
|
-
if (redeemScript && witnessScript) {
|
566
|
-
const p2wsh = _4.payments.p2wsh({
|
567
|
-
redeem: { output: witnessScript },
|
568
|
-
});
|
569
|
-
const p2wshAlt = _4.payments.p2wsh({ output: redeemScript });
|
570
|
-
const p2sh = _4.payments.p2sh({ redeem: { output: redeemScript } });
|
571
|
-
const p2shAlt = _4.payments.p2sh({ redeem: p2wsh });
|
572
|
-
// enforces P2SH(P2WSH(...))
|
573
|
-
if (!p2wsh.hash.equals(p2wshAlt.hash))
|
574
|
-
throw new Error('Witness script inconsistent with prevOutScript');
|
575
|
-
if (!p2sh.hash.equals(p2shAlt.hash))
|
576
|
-
throw new Error('Redeem script inconsistent with prevOutScript');
|
577
|
-
const expanded = expandOutput(p2wsh.redeem.output, ourPubKey);
|
578
|
-
if (!expanded.pubkeys) {
|
579
|
-
throw new Error(expanded.type + ' not supported as witnessScript (' + _5.script.toASM(witnessScript) + ')');
|
580
|
-
}
|
581
|
-
if (input.signatures && input.signatures.some((x) => x !== undefined)) {
|
582
|
-
expanded.signatures = input.signatures;
|
583
|
-
}
|
584
|
-
const signScript = witnessScript;
|
585
|
-
if (expanded.type === SCRIPT_TYPES.P2WPKH)
|
586
|
-
throw new Error('P2SH(P2WSH(P2WPKH)) is a consensus failure');
|
587
|
-
return {
|
588
|
-
redeemScript,
|
589
|
-
redeemScriptType: SCRIPT_TYPES.P2WSH,
|
590
|
-
witnessScript,
|
591
|
-
witnessScriptType: expanded.type,
|
592
|
-
prevOutType: SCRIPT_TYPES.P2SH,
|
593
|
-
prevOutScript: p2sh.output,
|
594
|
-
witnessVersion: 0,
|
595
|
-
signScript,
|
596
|
-
signType: expanded.type,
|
597
|
-
pubkeys: expanded.pubkeys,
|
598
|
-
signatures: expanded.signatures,
|
599
|
-
maxSignatures: expanded.maxSignatures,
|
600
|
-
};
|
601
|
-
}
|
602
|
-
if (redeemScript) {
|
603
|
-
const p2sh = _4.payments.p2sh({ redeem: { output: redeemScript } });
|
604
|
-
if (input.prevOutScript) {
|
605
|
-
let p2shAlt;
|
606
|
-
try {
|
607
|
-
p2shAlt = _4.payments.p2sh({ output: input.prevOutScript });
|
608
|
-
}
|
609
|
-
catch (e) {
|
610
|
-
throw new Error('PrevOutScript must be P2SH');
|
611
|
-
}
|
612
|
-
if (!p2sh.hash.equals(p2shAlt.hash))
|
613
|
-
throw new Error('Redeem script inconsistent with prevOutScript');
|
614
|
-
}
|
615
|
-
const expanded = expandOutput(p2sh.redeem.output, ourPubKey);
|
616
|
-
if (!expanded.pubkeys) {
|
617
|
-
throw new Error(expanded.type + ' not supported as redeemScript (' + _5.script.toASM(redeemScript) + ')');
|
618
|
-
}
|
619
|
-
if (input.signatures && input.signatures.some((x) => x !== undefined)) {
|
620
|
-
expanded.signatures = input.signatures;
|
621
|
-
}
|
622
|
-
let signScript = redeemScript;
|
623
|
-
if (expanded.type === SCRIPT_TYPES.P2WPKH) {
|
624
|
-
signScript = _4.payments.p2pkh({ pubkey: expanded.pubkeys[0] }).output;
|
625
|
-
}
|
626
|
-
return {
|
627
|
-
redeemScript,
|
628
|
-
redeemScriptType: expanded.type,
|
629
|
-
prevOutType: SCRIPT_TYPES.P2SH,
|
630
|
-
prevOutScript: p2sh.output,
|
631
|
-
witnessVersion: expanded.type === SCRIPT_TYPES.P2WPKH ? 0 : undefined,
|
632
|
-
signScript,
|
633
|
-
signType: expanded.type,
|
634
|
-
pubkeys: expanded.pubkeys,
|
635
|
-
signatures: expanded.signatures,
|
636
|
-
maxSignatures: expanded.maxSignatures,
|
637
|
-
};
|
638
|
-
}
|
639
|
-
if (witnessScript && controlBlock) {
|
640
|
-
// P2TR ScriptPath
|
641
|
-
/* tslint:disable-next-line:no-shadowed-variable */
|
642
|
-
let prevOutScript = input.prevOutScript;
|
643
|
-
if (!prevOutScript) {
|
644
|
-
prevOutScript = _1.p2trPayments.p2tr({
|
645
|
-
redeems: [{ output: witnessScript }],
|
646
|
-
redeemIndex: 0,
|
647
|
-
controlBlock,
|
648
|
-
annex,
|
649
|
-
}, { eccLib: noble_ecc_1.ecc }).output;
|
650
|
-
}
|
651
|
-
const expanded = expandOutput(witnessScript, ourPubKey);
|
652
|
-
if (!expanded.pubkeys) {
|
653
|
-
throw new Error(expanded.type + ' not supported as witnessScript (' + _5.script.toASM(witnessScript) + ')');
|
654
|
-
}
|
655
|
-
if (input.signatures && input.signatures.some((x) => x !== undefined)) {
|
656
|
-
expanded.signatures = input.signatures;
|
657
|
-
}
|
658
|
-
return {
|
659
|
-
witnessScript,
|
660
|
-
witnessScriptType: expanded.type,
|
661
|
-
prevOutType: SCRIPT_TYPES.P2TR,
|
662
|
-
prevOutScript,
|
663
|
-
witnessVersion: 1,
|
664
|
-
signScript: witnessScript,
|
665
|
-
signType: expanded.type,
|
666
|
-
pubkeys: expanded.pubkeys,
|
667
|
-
signatures: expanded.signatures,
|
668
|
-
maxSignatures: expanded.maxSignatures,
|
669
|
-
controlBlock,
|
670
|
-
annex,
|
671
|
-
};
|
672
|
-
}
|
673
|
-
if (witnessScript) {
|
674
|
-
const p2wsh = _4.payments.p2wsh({ redeem: { output: witnessScript } });
|
675
|
-
if (input.prevOutScript) {
|
676
|
-
const p2wshAlt = _4.payments.p2wsh({ output: input.prevOutScript });
|
677
|
-
if (!p2wsh.hash.equals(p2wshAlt.hash))
|
678
|
-
throw new Error('Witness script inconsistent with prevOutScript');
|
679
|
-
}
|
680
|
-
const expanded = expandOutput(p2wsh.redeem.output, ourPubKey);
|
681
|
-
if (!expanded.pubkeys) {
|
682
|
-
throw new Error(expanded.type + ' not supported as witnessScript (' + _5.script.toASM(witnessScript) + ')');
|
683
|
-
}
|
684
|
-
if (input.signatures && input.signatures.some((x) => x !== undefined)) {
|
685
|
-
expanded.signatures = input.signatures;
|
686
|
-
}
|
687
|
-
const signScript = witnessScript;
|
688
|
-
if (expanded.type === SCRIPT_TYPES.P2WPKH)
|
689
|
-
throw new Error('P2WSH(P2WPKH) is a consensus failure');
|
690
|
-
return {
|
691
|
-
witnessScript,
|
692
|
-
witnessScriptType: expanded.type,
|
693
|
-
prevOutType: SCRIPT_TYPES.P2WSH,
|
694
|
-
prevOutScript: p2wsh.output,
|
695
|
-
witnessVersion: 0,
|
696
|
-
signScript,
|
697
|
-
signType: expanded.type,
|
698
|
-
pubkeys: expanded.pubkeys,
|
699
|
-
signatures: expanded.signatures,
|
700
|
-
maxSignatures: expanded.maxSignatures,
|
701
|
-
};
|
702
|
-
}
|
703
|
-
if (input.prevOutType && input.prevOutScript) {
|
704
|
-
// embedded scripts are not possible without extra information
|
705
|
-
if (input.prevOutType === SCRIPT_TYPES.P2SH) {
|
706
|
-
throw new Error('PrevOutScript is ' + input.prevOutType + ', requires redeemScript');
|
707
|
-
}
|
708
|
-
if (input.prevOutType === SCRIPT_TYPES.P2WSH) {
|
709
|
-
throw new Error('PrevOutScript is ' + input.prevOutType + ', requires witnessScript');
|
710
|
-
}
|
711
|
-
const expanded = expandOutput(input.prevOutScript, ourPubKey);
|
712
|
-
if (!expanded.pubkeys) {
|
713
|
-
throw new Error(expanded.type + ' not supported (' + _5.script.toASM(input.prevOutScript) + ')');
|
714
|
-
}
|
715
|
-
if (input.signatures && input.signatures.some((x) => x !== undefined)) {
|
716
|
-
expanded.signatures = input.signatures;
|
717
|
-
}
|
718
|
-
let signScript = input.prevOutScript;
|
719
|
-
if (expanded.type === SCRIPT_TYPES.P2WPKH) {
|
720
|
-
signScript = _4.payments.p2pkh({ pubkey: expanded.pubkeys[0] }).output;
|
721
|
-
}
|
722
|
-
let witnessVersion;
|
723
|
-
if (expanded.type === SCRIPT_TYPES.P2WPKH) {
|
724
|
-
witnessVersion = 0;
|
725
|
-
}
|
726
|
-
else if (expanded.type === SCRIPT_TYPES.P2TR) {
|
727
|
-
witnessVersion = 1;
|
728
|
-
}
|
729
|
-
return {
|
730
|
-
prevOutType: expanded.type,
|
731
|
-
prevOutScript: input.prevOutScript,
|
732
|
-
witnessVersion,
|
733
|
-
signScript,
|
734
|
-
signType: expanded.type,
|
735
|
-
pubkeys: expanded.pubkeys,
|
736
|
-
signatures: expanded.signatures,
|
737
|
-
maxSignatures: expanded.maxSignatures,
|
738
|
-
};
|
739
|
-
}
|
740
|
-
const prevOutScript = _4.payments.p2pkh({ pubkey: ourPubKey }).output;
|
741
|
-
return {
|
742
|
-
prevOutType: SCRIPT_TYPES.P2PKH,
|
743
|
-
prevOutScript,
|
744
|
-
signScript: prevOutScript,
|
745
|
-
signType: SCRIPT_TYPES.P2PKH,
|
746
|
-
pubkeys: [ourPubKey],
|
747
|
-
signatures: [undefined],
|
748
|
-
};
|
749
|
-
}
|
750
|
-
function build(type, input, allowIncomplete) {
|
751
|
-
const pubkeys = (input.pubkeys || []);
|
752
|
-
let signatures = (input.signatures || []);
|
753
|
-
switch (type) {
|
754
|
-
case SCRIPT_TYPES.P2PKH: {
|
755
|
-
if (pubkeys.length === 0)
|
756
|
-
break;
|
757
|
-
if (signatures.length === 0)
|
758
|
-
break;
|
759
|
-
return _4.payments.p2pkh({ pubkey: pubkeys[0], signature: signatures[0] });
|
760
|
-
}
|
761
|
-
case SCRIPT_TYPES.P2WPKH: {
|
762
|
-
if (pubkeys.length === 0)
|
763
|
-
break;
|
764
|
-
if (signatures.length === 0)
|
765
|
-
break;
|
766
|
-
return _4.payments.p2wpkh({ pubkey: pubkeys[0], signature: signatures[0] });
|
767
|
-
}
|
768
|
-
case SCRIPT_TYPES.P2PK: {
|
769
|
-
if (pubkeys.length === 0)
|
770
|
-
break;
|
771
|
-
if (signatures.length === 0)
|
772
|
-
break;
|
773
|
-
return _4.payments.p2pk({ signature: signatures[0] });
|
774
|
-
}
|
775
|
-
case SCRIPT_TYPES.P2MS: {
|
776
|
-
const m = input.maxSignatures;
|
777
|
-
if (allowIncomplete) {
|
778
|
-
signatures = signatures.map((x) => x || _6.opcodes.OP_0);
|
779
|
-
}
|
780
|
-
else {
|
781
|
-
signatures = signatures.filter((x) => x);
|
782
|
-
}
|
783
|
-
// if the transaction is not not complete (complete), or if signatures.length === m, validate
|
784
|
-
// otherwise, the number of OP_0's may be >= m, so don't validate (boo)
|
785
|
-
const validate = !allowIncomplete || m === signatures.length;
|
786
|
-
return _4.payments.p2ms({ m, pubkeys, signatures }, { allowIncomplete, validate });
|
787
|
-
}
|
788
|
-
case SCRIPT_TYPES.P2SH: {
|
789
|
-
const redeem = build(input.redeemScriptType, input, allowIncomplete);
|
790
|
-
if (!redeem)
|
791
|
-
return;
|
792
|
-
return _4.payments.p2sh({
|
793
|
-
redeem: {
|
794
|
-
output: redeem.output || input.redeemScript,
|
795
|
-
input: redeem.input,
|
796
|
-
witness: redeem.witness,
|
797
|
-
},
|
798
|
-
});
|
799
|
-
}
|
800
|
-
case SCRIPT_TYPES.P2WSH: {
|
801
|
-
const redeem = build(input.witnessScriptType, input, allowIncomplete);
|
802
|
-
if (!redeem)
|
803
|
-
return;
|
804
|
-
return _4.payments.p2wsh({
|
805
|
-
redeem: {
|
806
|
-
output: input.witnessScript,
|
807
|
-
input: redeem.input,
|
808
|
-
witness: redeem.witness,
|
809
|
-
},
|
810
|
-
});
|
811
|
-
}
|
812
|
-
case SCRIPT_TYPES.P2TR: {
|
813
|
-
if (input.witnessScriptType === SCRIPT_TYPES.P2TR_NS) {
|
814
|
-
// ScriptPath
|
815
|
-
const redeem = build(input.witnessScriptType, input, allowIncomplete);
|
816
|
-
return _1.p2trPayments.p2tr({
|
817
|
-
output: input.prevOutScript,
|
818
|
-
controlBlock: input.controlBlock,
|
819
|
-
annex: input.annex,
|
820
|
-
redeems: [redeem],
|
821
|
-
redeemIndex: 0,
|
822
|
-
}, { eccLib: noble_ecc_1.ecc });
|
823
|
-
}
|
824
|
-
// KeyPath
|
825
|
-
if (signatures.length === 0)
|
826
|
-
break;
|
827
|
-
return _1.p2trPayments.p2tr({ pubkeys, signature: signatures[0] }, { eccLib: noble_ecc_1.ecc });
|
828
|
-
}
|
829
|
-
case SCRIPT_TYPES.P2TR_NS: {
|
830
|
-
const m = input.maxSignatures;
|
831
|
-
if (allowIncomplete) {
|
832
|
-
signatures = signatures.map((x) => x || _6.opcodes.OP_0);
|
833
|
-
}
|
834
|
-
else {
|
835
|
-
signatures = signatures.filter((x) => x);
|
836
|
-
}
|
837
|
-
// if the transaction is not not complete (complete), or if signatures.length === m, validate
|
838
|
-
// otherwise, the number of OP_0's may be >= m, so don't validate (boo)
|
839
|
-
const validate = !allowIncomplete || m === signatures.length;
|
840
|
-
return _1.p2trPayments.p2tr_ns({ pubkeys, signatures }, { allowIncomplete, validate, eccLib: noble_ecc_1.ecc });
|
841
|
-
}
|
842
|
-
}
|
843
|
-
}
|
844
|
-
function canSign(input) {
|
845
|
-
return (input.signScript !== undefined &&
|
846
|
-
input.signType !== undefined &&
|
847
|
-
input.pubkeys !== undefined &&
|
848
|
-
input.signatures !== undefined &&
|
849
|
-
input.signatures.length === input.pubkeys.length &&
|
850
|
-
input.pubkeys.length > 0 &&
|
851
|
-
(input.witnessVersion === undefined || input.value !== undefined));
|
852
|
-
}
|
853
|
-
function signatureHashType(buffer) {
|
854
|
-
if (_5.script.isCanonicalSchnorrSignature(buffer) && buffer.length === 64) {
|
855
|
-
return _8.Transaction.SIGHASH_DEFAULT;
|
856
|
-
}
|
857
|
-
return buffer.readUInt8(buffer.length - 1);
|
858
|
-
}
|
859
|
-
function checkSignArgs(inputs, signParams) {
|
860
|
-
if (!PREVOUT_TYPES.has(signParams.prevOutScriptType)) {
|
861
|
-
throw new TypeError(`Unknown prevOutScriptType "${signParams.prevOutScriptType}"`);
|
862
|
-
}
|
863
|
-
tfMessage(typeforce.Number, signParams.vin, `sign must include vin parameter as Number (input index)`);
|
864
|
-
tfMessage(tfFullSigner, signParams.keyPair, `sign must include keyPair parameter as Signer interface`);
|
865
|
-
tfMessage(typeforce.maybe(typeforce.Number), signParams.hashType, `sign hashType parameter must be a number`);
|
866
|
-
const prevOutType = (inputs[signParams.vin] || []).prevOutType;
|
867
|
-
const posType = signParams.prevOutScriptType;
|
868
|
-
switch (posType) {
|
869
|
-
case 'p2pkh':
|
870
|
-
if (prevOutType && prevOutType !== 'pubkeyhash') {
|
871
|
-
throw new TypeError(`input #${signParams.vin} is not of type p2pkh: ${prevOutType}`);
|
872
|
-
}
|
873
|
-
tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
|
874
|
-
tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
|
875
|
-
tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
|
876
|
-
break;
|
877
|
-
case 'p2pk':
|
878
|
-
if (prevOutType && prevOutType !== 'pubkey') {
|
879
|
-
throw new TypeError(`input #${signParams.vin} is not of type p2pk: ${prevOutType}`);
|
880
|
-
}
|
881
|
-
tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
|
882
|
-
tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
|
883
|
-
tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
|
884
|
-
break;
|
885
|
-
case 'p2wpkh':
|
886
|
-
if (prevOutType && prevOutType !== 'witnesspubkeyhash') {
|
887
|
-
throw new TypeError(`input #${signParams.vin} is not of type p2wpkh: ${prevOutType}`);
|
888
|
-
}
|
889
|
-
tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
|
890
|
-
tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
|
891
|
-
tfMessage(types.Satoshi, signParams.witnessValue, `${posType} requires witnessValue`);
|
892
|
-
break;
|
893
|
-
case 'p2ms':
|
894
|
-
if (prevOutType && prevOutType !== 'multisig') {
|
895
|
-
throw new TypeError(`input #${signParams.vin} is not of type p2ms: ${prevOutType}`);
|
896
|
-
}
|
897
|
-
tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
|
898
|
-
tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
|
899
|
-
tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
|
900
|
-
break;
|
901
|
-
case 'p2sh-p2wpkh':
|
902
|
-
if (prevOutType && prevOutType !== 'scripthash') {
|
903
|
-
throw new TypeError(`input #${signParams.vin} is not of type p2sh-p2wpkh: ${prevOutType}`);
|
904
|
-
}
|
905
|
-
tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
|
906
|
-
tfMessage(typeforce.Buffer, signParams.redeemScript, `${posType} requires redeemScript`);
|
907
|
-
tfMessage(types.Satoshi, signParams.witnessValue, `${posType} requires witnessValue`);
|
908
|
-
break;
|
909
|
-
case 'p2sh-p2ms':
|
910
|
-
case 'p2sh-p2pk':
|
911
|
-
case 'p2sh-p2pkh':
|
912
|
-
if (prevOutType && prevOutType !== 'scripthash') {
|
913
|
-
throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
|
914
|
-
}
|
915
|
-
tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
|
916
|
-
tfMessage(typeforce.Buffer, signParams.redeemScript, `${posType} requires redeemScript`);
|
917
|
-
tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
|
918
|
-
break;
|
919
|
-
case 'p2wsh-p2ms':
|
920
|
-
case 'p2wsh-p2pk':
|
921
|
-
case 'p2wsh-p2pkh':
|
922
|
-
if (prevOutType && prevOutType !== 'witnessscripthash') {
|
923
|
-
throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
|
924
|
-
}
|
925
|
-
tfMessage(typeforce.Buffer, signParams.witnessScript, `${posType} requires witnessScript`);
|
926
|
-
tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
|
927
|
-
tfMessage(types.Satoshi, signParams.witnessValue, `${posType} requires witnessValue`);
|
928
|
-
break;
|
929
|
-
case 'p2sh-p2wsh-p2ms':
|
930
|
-
case 'p2sh-p2wsh-p2pk':
|
931
|
-
case 'p2sh-p2wsh-p2pkh':
|
932
|
-
if (prevOutType && prevOutType !== 'scripthash') {
|
933
|
-
throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
|
934
|
-
}
|
935
|
-
tfMessage(typeforce.Buffer, signParams.witnessScript, `${posType} requires witnessScript`);
|
936
|
-
tfMessage(typeforce.Buffer, signParams.redeemScript, `${posType} requires witnessScript`);
|
937
|
-
tfMessage(types.Satoshi, signParams.witnessValue, `${posType} requires witnessScript`);
|
938
|
-
break;
|
939
|
-
case 'p2tr':
|
940
|
-
if (prevOutType && prevOutType !== 'taproot') {
|
941
|
-
throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
|
942
|
-
}
|
943
|
-
tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
|
944
|
-
tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
|
945
|
-
tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
|
946
|
-
break;
|
947
|
-
case 'p2tr-p2ns':
|
948
|
-
if (prevOutType && prevOutType !== 'taproot') {
|
949
|
-
throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
|
950
|
-
}
|
951
|
-
inputs[signParams.vin].prevOutType = inputs[signParams.vin].prevOutType || 'taproot';
|
952
|
-
tfMessage(typeforce.Buffer, signParams.witnessScript, `${posType} requires witnessScript`);
|
953
|
-
tfMessage(typeforce.Buffer, signParams.controlBlock, `${posType} requires controlBlock`);
|
954
|
-
tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
|
955
|
-
break;
|
956
|
-
}
|
957
|
-
}
|
958
|
-
function trySign({ input, ourPubKey, keyPair, signatureHash, hashType, useLowR, taptreeRoot, }) {
|
959
|
-
if (input.witnessVersion === 1 && ourPubKey.length === 33)
|
960
|
-
ourPubKey = ourPubKey.slice(1);
|
961
|
-
// enforce in order signing of public keys
|
962
|
-
let signed = false;
|
963
|
-
for (const [i, pubKey] of input.pubkeys.entries()) {
|
964
|
-
if (!ourPubKey.equals(pubKey))
|
965
|
-
continue;
|
966
|
-
if (input.signatures[i] && input.signatures[i].length > 0)
|
967
|
-
throw new Error('Signature already exists');
|
968
|
-
// TODO: add tests
|
969
|
-
if (ourPubKey.length !== 33 && input.witnessVersion === 0) {
|
970
|
-
throw new Error('BIP143 (Witness v0) inputs require compressed pubkeys');
|
971
|
-
}
|
972
|
-
else if (ourPubKey.length !== 32 && input.witnessVersion === 1) {
|
973
|
-
throw new Error('BIP341 (Witness v1) inputs require x-only pubkeys');
|
974
|
-
}
|
975
|
-
if (input.witnessVersion === 1) {
|
976
|
-
if (!input.witnessScript) {
|
977
|
-
// FIXME: Workaround for not having proper tweaking support for key path
|
978
|
-
if (!keyPair.privateKey) {
|
979
|
-
throw new Error(`unexpected keypair`);
|
980
|
-
}
|
981
|
-
const privateKey = _7.taproot.tapTweakPrivkey(noble_ecc_1.ecc, ourPubKey, keyPair.privateKey, taptreeRoot);
|
982
|
-
keyPair = noble_ecc_1.ECPair.fromPrivateKey(Buffer.from(privateKey));
|
983
|
-
}
|
984
|
-
// https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#common-signature-message
|
985
|
-
const signature = keyPair.signSchnorr(signatureHash);
|
986
|
-
// SIGHASH_DEFAULT is omitted from the signature
|
987
|
-
if (hashType === _8.Transaction.SIGHASH_DEFAULT) {
|
988
|
-
input.signatures[i] = Buffer.from(signature);
|
989
|
-
}
|
990
|
-
else {
|
991
|
-
input.signatures[i] = Buffer.concat([signature, Buffer.of(hashType)]);
|
992
|
-
}
|
993
|
-
}
|
994
|
-
else {
|
995
|
-
const signature = keyPair.sign(signatureHash, useLowR);
|
996
|
-
input.signatures[i] = _5.script.signature.encode(signature, hashType);
|
997
|
-
}
|
998
|
-
signed = true;
|
999
|
-
}
|
1000
|
-
if (!signed)
|
1001
|
-
throw new Error('Key pair cannot sign for this input');
|
1002
|
-
}
|
1003
|
-
function getSigningData(network, inputs, needsOutputs, tx, signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript, controlBlock, annex, useLowR) {
|
1004
|
-
let vin;
|
1005
|
-
if (typeof signParams === 'number') {
|
1006
|
-
console.warn('DEPRECATED: TransactionBuilder sign method arguments ' + 'will change in v6, please use the TxbSignArg interface');
|
1007
|
-
vin = signParams;
|
1008
|
-
}
|
1009
|
-
else if (typeof signParams === 'object') {
|
1010
|
-
checkSignArgs(inputs, signParams);
|
1011
|
-
({ vin, keyPair, redeemScript, hashType, witnessValue, witnessScript, controlBlock, annex } = signParams);
|
1012
|
-
}
|
1013
|
-
else {
|
1014
|
-
throw new TypeError('TransactionBuilder sign first arg must be TxbSignArg or number');
|
1015
|
-
}
|
1016
|
-
if (keyPair === undefined) {
|
1017
|
-
throw new Error('sign requires keypair');
|
1018
|
-
}
|
1019
|
-
if (!inputs[vin])
|
1020
|
-
throw new Error('No input at index: ' + vin);
|
1021
|
-
const input = inputs[vin];
|
1022
|
-
// if redeemScript was previously provided, enforce consistency
|
1023
|
-
if (input.redeemScript !== undefined && redeemScript && !input.redeemScript.equals(redeemScript)) {
|
1024
|
-
throw new Error('Inconsistent redeemScript');
|
1025
|
-
}
|
1026
|
-
const ourPubKey = keyPair.publicKey || (keyPair.getPublicKey && keyPair.getPublicKey());
|
1027
|
-
if (!canSign(input)) {
|
1028
|
-
if (witnessValue !== undefined) {
|
1029
|
-
if (input.value !== undefined && input.value !== witnessValue) {
|
1030
|
-
throw new Error('Input did not match witnessValue');
|
1031
|
-
}
|
1032
|
-
typeforce(types.Satoshi, witnessValue);
|
1033
|
-
input.value = witnessValue;
|
1034
|
-
}
|
1035
|
-
if (!canSign(input)) {
|
1036
|
-
const prepared = prepareInput(input, ourPubKey, redeemScript, witnessScript, controlBlock, annex);
|
1037
|
-
// updates inline
|
1038
|
-
Object.assign(input, prepared);
|
1039
|
-
}
|
1040
|
-
if (!canSign(input))
|
1041
|
-
throw Error(input.prevOutType + ' not supported');
|
1042
|
-
}
|
1043
|
-
// hashType can be 0 in Taproot, so can't use hashType || SIGHASH_ALL
|
1044
|
-
if (input.witnessVersion === 1) {
|
1045
|
-
hashType = hashType === undefined ? _8.Transaction.SIGHASH_DEFAULT : hashType;
|
1046
|
-
}
|
1047
|
-
else {
|
1048
|
-
hashType = hashType || _8.Transaction.SIGHASH_ALL;
|
1049
|
-
}
|
1050
|
-
if (needsOutputs(hashType))
|
1051
|
-
throw new Error('Transaction needs outputs');
|
1052
|
-
// TODO: This is not the best place to do this, but might stick with it until PSBT
|
1053
|
-
let leafHash;
|
1054
|
-
let taptreeRoot;
|
1055
|
-
if (controlBlock && witnessScript) {
|
1056
|
-
leafHash = _7.taproot.getTapleafHash(noble_ecc_1.ecc, controlBlock, witnessScript);
|
1057
|
-
taptreeRoot = _7.taproot.getTaptreeRoot(noble_ecc_1.ecc, controlBlock, witnessScript, leafHash);
|
1058
|
-
}
|
1059
|
-
// ready to sign
|
1060
|
-
let signatureHash;
|
1061
|
-
switch (input.witnessVersion) {
|
1062
|
-
case undefined:
|
1063
|
-
signatureHash = tx.hashForSignature(vin, input.signScript, hashType, input.value);
|
1064
|
-
break;
|
1065
|
-
case 0:
|
1066
|
-
signatureHash = tx.hashForWitnessV0(vin, input.signScript, input.value, hashType);
|
1067
|
-
break;
|
1068
|
-
case 1:
|
1069
|
-
signatureHash = tx.hashForWitnessV1(vin, inputs.map(({ prevOutScript }) => prevOutScript), inputs.map(({ value }) => value), hashType, leafHash);
|
1070
|
-
break;
|
1071
|
-
default:
|
1072
|
-
throw new TypeError('Unsupported witness version');
|
1073
|
-
}
|
1074
|
-
return {
|
1075
|
-
input,
|
1076
|
-
ourPubKey,
|
1077
|
-
keyPair,
|
1078
|
-
signatureHash,
|
1079
|
-
hashType,
|
1080
|
-
useLowR: !!useLowR,
|
1081
|
-
taptreeRoot,
|
1082
|
-
};
|
1083
|
-
}
|
1084
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25fYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFuc2FjdGlvbl9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRDtBQUNqRCx5QkFBdUQ7QUFDdkQsNkRBQTZEO0FBQzdELHVDQUF1QztBQUN2Qyx5QkFBdUM7QUFDdkMseUJBQThCO0FBRTlCLHlCQUE4QjtBQUU5Qix5QkFBdUM7QUFDdkMseUJBQW9DO0FBQ3BDLHlCQUE2QjtBQUM3Qix5QkFBMkM7QUFDM0MsMkNBQW9EO0FBVXBELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV2QyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVEsRUFBVyxFQUFFO0lBQ3pDLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxXQUFXLEtBQUssVUFBVSxDQUFDO0FBQ3BILENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFFcEMsTUFBTSxhQUFhLEdBQWdCLElBQUksR0FBRyxDQUFDO0lBQ3pDLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sZUFBZTtJQUNmLFlBQVk7SUFDWixXQUFXO0lBQ1gsYUFBYTtJQUNiLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLFlBQVk7SUFDWixZQUFZO0lBQ1oscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixNQUFNO0lBQ04sa0JBQWtCO0lBQ2xCLFdBQVc7Q0FDWixDQUFDLENBQUM7QUFrREgsU0FBUyxTQUFTLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxPQUFlO0lBQ3ZE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cnQgKiBhcyB0eXBlcyBmcm9tICdiaXRjb2luanMtbGliL3NyYy90eXBlcyc7XG5pbXBvcnQgeyBhZGRyZXNzIGFzIGJhZGRyZXNzLCBwMnRyUGF5bWVudHMgfSBmcm9tICcuLyc7XG5pbXBvcnQgKiBhcyBidWZmZXJ1dGlscyBmcm9tICdiaXRjb2luanMtbGliL3NyYy9idWZmZXJ1dGlscyc7XG5pbXBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tICcuL2NsYXNzaWZ5JztcbmltcG9ydCB7IGNyeXB0byBhcyBiY3J5cHRvIH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgbmV0d29ya3MgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgcGF5bWVudHMgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBQYXltZW50IH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBvcGNvZGVzIGFzIG9wcyB9IGZyb20gJy4vJztcbmltcG9ydCB7IHRhcHJvb3QgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBUeE91dHB1dCwgVHJhbnNhY3Rpb24gfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBFQ1BhaXIsIGVjYyBhcyBlY2NMaWIgfSBmcm9tICcuL25vYmxlX2VjYyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmVyIHtcbiAgcHJpdmF0ZUtleT86IEJ1ZmZlcjtcbiAgcHVibGljS2V5OiBCdWZmZXI7XG4gIGdldFB1YmxpY0tleT8oKTogQnVmZmVyO1xuICBzaWduKGhhc2g6IEJ1ZmZlciwgbG93Uj86IGJvb2xlYW4pOiBCdWZmZXI7XG4gIHNpZ25TY2hub3JyKGhhc2g6IEJ1ZmZlcik6IEJ1ZmZlcjtcbn1cblxuY29uc3QgdHlwZWZvcmNlID0gcmVxdWlyZSgndHlwZWZvcmNlJyk7XG5cbmNvbnN0IHRmRnVsbFNpZ25lciA9IChvYmo6IGFueSk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gdHlwZWZvcmNlLkJ1ZmZlcihvYmoucHVibGljS2V5KSAmJiB0eXBlb2Ygb2JqLnNpZ24gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zaWduU2Nobm9yciA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmNvbnN0IFNDUklQVF9UWVBFUyA9IGNsYXNzaWZ5LnR5cGVzO1xuXG5jb25zdCBQUkVWT1VUX1RZUEVTOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAvLyBSYXdcbiAgJ3AycGtoJyxcbiAgJ3AycGsnLFxuICAncDJ3cGtoJyxcbiAgJ3AybXMnLFxuICAvLyBQMlNIIHdyYXBwZWRcbiAgJ3Ayc2gtcDJwa2gnLFxuICAncDJzaC1wMnBrJyxcbiAgJ3Ayc2gtcDJ3cGtoJyxcbiAgJ3Ayc2gtcDJtcycsXG4gIC8vIFAyV1NIIHdyYXBwZWRcbiAgJ3Ayd3NoLXAycGtoJyxcbiAgJ3Ayd3NoLXAycGsnLFxuICAncDJ3c2gtcDJtcycsXG4gIC8vIFAyU0gtUDJXU0ggd3JhcHBlclxuICAncDJzaC1wMndzaC1wMnBraCcsXG4gICdwMnNoLXAyd3NoLXAycGsnLFxuICAncDJzaC1wMndzaC1wMm1zJyxcbiAgLy8gUDJUUiBLZXlQYXRoXG4gICdwMnRyJyxcbiAgLy8gUDJUUiBTY3JpcHRQYXRoXG4gICdwMnRyLXAybnMnLFxuXSk7XG5cbnR5cGUgTWF5YmVCdWZmZXIgPSBCdWZmZXIgfCB1bmRlZmluZWQ7XG50eXBlIFR4YlNpZ25hdHVyZXMgPSBCdWZmZXJbXSB8IE1heWJlQnVmZmVyW107XG50eXBlIFR4YlB1YmtleXMgPSBNYXliZUJ1ZmZlcltdO1xudHlwZSBUeGJXaXRuZXNzID0gQnVmZmVyW107XG50eXBlIFR4YlNjcmlwdFR5cGUgPSBzdHJpbmc7XG50eXBlIFR4YlNjcmlwdCA9IEJ1ZmZlcjtcblxuaW50ZXJmYWNlIFR4YklucHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdmFsdWU/OiBUTnVtYmVyO1xuICB3aXRuZXNzVmVyc2lvbj86IG51bWJlcjtcbiAgc2lnblNjcmlwdD86IFR4YlNjcmlwdDtcbiAgc2lnblR5cGU/OiBUeGJTY3JpcHRUeXBlO1xuICBwcmV2T3V0U2NyaXB0PzogVHhiU2NyaXB0O1xuICByZWRlZW1TY3JpcHQ/OiBUeGJTY3JpcHQ7XG4gIHJlZGVlbVNjcmlwdFR5cGU/OiBUeGJTY3JpcHRUeXBlO1xuICBwcmV2T3V0VHlwZT86IFR4YlNjcmlwdFR5cGU7XG4gIHB1YmtleXM/OiBUeGJQdWJrZXlzO1xuICBzaWduYXR1cmVzPzogVHhiU2lnbmF0dXJlcztcbiAgd2l0bmVzcz86IFR4YldpdG5lc3M7XG4gIHdpdG5lc3NTY3JpcHQ/OiBUeGJTY3JpcHQ7XG4gIHdpdG5lc3NTY3JpcHRUeXBlPzogVHhiU2NyaXB0VHlwZTtcbiAgY29udHJvbEJsb2NrPzogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbiAgc2NyaXB0PzogVHhiU2NyaXB0O1xuICBzZXF1ZW5jZT86IG51bWJlcjtcbiAgc2NyaXB0U2lnPzogVHhiU2NyaXB0O1xuICBtYXhTaWduYXR1cmVzPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVHhiT3V0cHV0IHtcbiAgdHlwZTogc3RyaW5nO1xuICBwdWJrZXlzPzogVHhiUHVia2V5cztcbiAgc2lnbmF0dXJlcz86IFR4YlNpZ25hdHVyZXM7XG4gIG1heFNpZ25hdHVyZXM/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBUeGJTaWduQXJnPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgcHJldk91dFNjcmlwdFR5cGU6IHN0cmluZztcbiAgdmluOiBudW1iZXI7XG4gIGtleVBhaXI6IFNpZ25lcjtcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyO1xuICBoYXNoVHlwZT86IG51bWJlcjtcbiAgd2l0bmVzc1ZhbHVlPzogVE51bWJlcjtcbiAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcjtcbiAgY29udHJvbEJsb2NrPzogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdGZNZXNzYWdlKHR5cGU6IGFueSwgdmFsdWU6IGFueSwgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgdHlwZWZvcmNlKHR5cGUsIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHR4SXNTdHJpbmc8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIHR4OiBCdWZmZXIgfCBzdHJpbmcgfCBUcmFuc2FjdGlvbjxUTnVtYmVyPlxuKTogdHggaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB0eCA9PT0gJ3N0cmluZycgfHwgdHggaW5zdGFuY2VvZiBTdHJpbmc7XG59XG5cbmZ1bmN0aW9uIHR4SXNUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgdHg6IEJ1ZmZlciB8IHN0cmluZyB8IFRyYW5zYWN0aW9uPFROdW1iZXI+XG4pOiB0eCBpcyBUcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gIHJldHVybiB0eCBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgc3RhdGljIGZyb21UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gICAgbmV0d29yaz86IE5ldHdvcmssXG4gICAgcHJldk91dHB1dHM/OiBUeE91dHB1dDxUTnVtYmVyPltdXG4gICk6IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPiB7XG4gICAgY29uc3QgdHhiID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPihuZXR3b3JrKTtcblxuICAgIC8vIENvcHkgdHJhbnNhY3Rpb24gZmllbGRzXG4gICAgdHhiLnNldFZlcnNpb24odHJhbnNhY3Rpb24udmVyc2lvbik7XG4gICAgdHhiLnNldExvY2tUaW1lKHRyYW5zYWN0aW9uLmxvY2t0aW1lKTtcblxuICAgIC8vIENvcHkgb3V0cHV0cyAoZG9uZSBmaXJzdCB0byBhdm9pZCBzaWduYXR1cmUgaW52YWxpZGF0aW9uKVxuICAgIHRyYW5zYWN0aW9uLm91dHMuZm9yRWFjaCgodHhPdXQpID0+IHtcbiAgICAgIHR4Yi5hZGRPdXRwdXQodHhPdXQuc2NyaXB0LCAodHhPdXQgYXMgVHhPdXRwdXQ8VE51bWJlcj4pLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIENvcHkgaW5wdXRzXG4gICAgdHJhbnNhY3Rpb24uaW5zLmZvckVhY2goKHR4SW4pID0+IHtcbiAgICAgIHR4Yi5fX2FkZElucHV0VW5zYWZlKHR4SW4uaGFzaCwgdHhJbi5pbmRleCwge1xuICAgICAgICBzZXF1ZW5jZTogdHhJbi5zZXF1ZW5jZSxcbiAgICAgICAgc2NyaXB0OiB0eEluLnNjcmlwdCxcbiAgICAgICAgd2l0bmVzczogdHhJbi53aXRuZXNzLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBmaXggc29tZSB0aGluZ3Mgbm90IHBvc3NpYmxlIHRocm91Z2ggdGhlIHB1YmxpYyBBUElcbiAgICB0eGIuX19JTlBVVFMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICAgIGZpeE11bHRpc2lnT3JkZXI8VE51bWJlcj4oaW5wdXQsIHRyYW5zYWN0aW9uLCBpLCBwcmV2T3V0cHV0cyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHhiO1xuICB9XG5cbiAgcHJpdmF0ZSBfX1BSRVZfVFhfU0VUOiB7IFtpbmRleDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICBwcml2YXRlIF9fSU5QVVRTOiBBcnJheTxUeGJJbnB1dDxUTnVtYmVyPj47XG4gIHByaXZhdGUgX19UWDogVHJhbnNhY3Rpb248VE51bWJlcj47XG4gIHByaXZhdGUgX19VU0VfTE9XX1I6IGJvb2xlYW47XG5cbiAgLy8gV0FSTklORzogbWF4aW11bUZlZVJhdGUgaXMgX19OT1RfXyB0byBiZSByZWxpZWQgb24sXG4gIC8vICAgICAgICAgIGl0J3MganVzdCBhbm90aGVyIHBvdGVudGlhbCBzYWZldHkgbWVjaGFuaXNtIChzYWZldHkgaW4tZGVwdGgpXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuZXR3b3JrOiBOZXR3b3JrID0gbmV0d29ya3MuYml0Y29pbiwgcHVibGljIG1heGltdW1GZWVSYXRlOiBudW1iZXIgPSAyNTAwKSB7XG4gICAgdGhpcy5fX1BSRVZfVFhfU0VUID0ge307XG4gICAgdGhpcy5fX0lOUFVUUyA9IFtdO1xuICAgIHRoaXMuX19UWCA9IG5ldyBUcmFuc2FjdGlvbjxUTnVtYmVyPigpO1xuICAgIHRoaXMuX19UWC52ZXJzaW9uID0gMjtcbiAgICB0aGlzLl9fVVNFX0xPV19SID0gZmFsc2U7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RlcHJlY2F0aW9uIFdhcm5pbmc6IFRyYW5zYWN0aW9uQnVpbGRlciB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gJyArXG4gICAgICAgICcodjYueC54IG9yIGxhdGVyKSBQbGVhc2UgdXNlIHRoZSBQc2J0IGNsYXNzIGluc3RlYWQuIEV4YW1wbGVzIG9mIHVzYWdlICcgK1xuICAgICAgICAnYXJlIGF2YWlsYWJsZSBpbiB0aGUgdHJhbnNhY3Rpb25zLXBzYnQuanMgaW50ZWdyYXRpb24gdGVzdCBmaWxlIG9uIG91ciAnICtcbiAgICAgICAgJ0dpdGh1Yi4gQSBoaWdoIGxldmVsIGV4cGxhbmF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHNidC50cyBhbmQgcHNidC5qcyAnICtcbiAgICAgICAgJ2ZpbGVzIGFzIHdlbGwuJ1xuICAgICk7XG4gIH1cblxuICBzZXRMb3dSKHNldHRpbmc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdHlwZWZvcmNlKHR5cGVmb3JjZS5tYXliZSh0eXBlZm9yY2UuQm9vbGVhbiksIHNldHRpbmcpO1xuICAgIGlmIChzZXR0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNldHRpbmcgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9fVVNFX0xPV19SID0gc2V0dGluZztcbiAgICByZXR1cm4gc2V0dGluZztcbiAgfVxuXG4gIHNldExvY2tUaW1lKGxvY2t0aW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0eXBlZm9yY2UodHlwZXMuVUludDMyLCBsb2NrdGltZSk7XG5cbiAgICAvLyBpZiBhbnkgc2lnbmF0dXJlcyBleGlzdCwgdGhyb3dcbiAgICBpZiAoXG4gICAgICB0aGlzLl9fSU5QVVRTLnNvbWUoKGlucHV0KSA9PiB7XG4gICAgICAgIGlmICghaW5wdXQuc2lnbmF0dXJlcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHMpID0+IHMgIT09IHVuZGVmaW5lZCk7XG4gICAgICB9KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObywgdGhpcyB3b3VsZCBpbnZhbGlkYXRlIHNpZ25hdHVyZXMnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9fVFgubG9ja3RpbWUgPSBsb2NrdGltZTtcbiAgfVxuXG4gIHNldFZlcnNpb24odmVyc2lvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgdHlwZWZvcmNlKHR5cGVzLlVJbnQzMiwgdmVyc2lvbik7XG5cbiAgICAvLyBYWFg6IHRoaXMgbWlnaHQgZXZlbnR1YWxseSBiZWNvbWUgbW9yZSBjb21wbGV4IGRlcGVuZGluZyBvbiB3aGF0IHRoZSB2ZXJzaW9ucyByZXByZXNlbnRcbiAgICB0aGlzLl9fVFgudmVyc2lvbiA9IHZlcnNpb247XG4gIH1cblxuICBhZGRJbnB1dChcbiAgICB0eEhhc2g6IEJ1ZmZlciB8IHN0cmluZyB8IFRyYW5zYWN0aW9uPFROdW1iZXI+LFxuICAgIHZvdXQ6IG51bWJlcixcbiAgICBzZXF1ZW5jZT86IG51bWJlcixcbiAgICBwcmV2T3V0U2NyaXB0PzogQnVmZmVyLFxuICAgIHZhbHVlPzogVE51bWJlclxuICApOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fX2Nhbk1vZGlmeUlucHV0cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vLCB0aGlzIHdvdWxkIGludmFsaWRhdGUgc2lnbmF0dXJlcycpO1xuICAgIH1cblxuICAgIC8vIGlzIGl0IGEgaGV4IHN0cmluZz9cbiAgICBpZiAodHhJc1N0cmluZyh0eEhhc2gpKSB7XG4gICAgICAvLyB0cmFuc2FjdGlvbiBoYXNocydzIGFyZSBkaXNwbGF5ZWQgaW4gcmV2ZXJzZSBvcmRlciwgdW4tcmV2ZXJzZSBpdFxuICAgICAgdHhIYXNoID0gYnVmZmVydXRpbHMucmV2ZXJzZUJ1ZmZlcihCdWZmZXIuZnJvbSh0eEhhc2gsICdoZXgnKSk7XG5cbiAgICAgIC8vIGlzIGl0IGEgVHJhbnNhY3Rpb24gb2JqZWN0P1xuICAgIH0gZWxzZSBpZiAodHhJc1RyYW5zYWN0aW9uKHR4SGFzaCkpIHtcbiAgICAgIGNvbnN0IHR4T3V0ID0gdHhIYXNoLm91dHNbdm91dF07XG4gICAgICBwcmV2T3V0U2NyaXB0ID0gdHhPdXQuc2NyaXB0O1xuICAgICAgdmFsdWUgPSAodHhPdXQgYXMgVHhPdXRwdXQ8VE51bWJlcj4pLnZhbHVlO1xuXG4gICAgICB0eEhhc2ggPSB0eEhhc2guZ2V0SGFzaChmYWxzZSkgYXMgQnVmZmVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fYWRkSW5wdXRVbnNhZmUodHhIYXNoLCB2b3V0LCB7XG4gICAgICBzZXF1ZW5jZSxcbiAgICAgIHByZXZPdXRTY3JpcHQsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFkZE91dHB1dChzY3JpcHRQdWJLZXk6IHN0cmluZyB8IEJ1ZmZlciwgdmFsdWU6IFROdW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fX2Nhbk1vZGlmeU91dHB1dHMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObywgdGhpcyB3b3VsZCBpbnZhbGlkYXRlIHNpZ25hdHVyZXMnKTtcbiAgICB9XG5cbiAgICAvLyBBdHRlbXB0IHRvIGdldCBhIHNjcmlwdCBpZiBpdCdzIGEgYmFzZTU4IG9yIGJlY2gzMiBhZGRyZXNzIHN0cmluZ1xuICAgIGlmICh0eXBlb2Ygc2NyaXB0UHViS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgc2NyaXB0UHViS2V5ID0gYmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoc2NyaXB0UHViS2V5LCB0aGlzLm5ldHdvcmspO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fVFguYWRkT3V0cHV0KHNjcmlwdFB1YktleSwgdmFsdWUpO1xuICB9XG5cbiAgYnVpbGQoKTogVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9fYnVpbGQoZmFsc2UpO1xuICB9XG5cbiAgYnVpbGRJbmNvbXBsZXRlKCk6IFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fX2J1aWxkKHRydWUpO1xuICB9XG5cbiAgc2lnbihcbiAgICBzaWduUGFyYW1zOiBudW1iZXIgfCBUeGJTaWduQXJnPFROdW1iZXI+LFxuICAgIGtleVBhaXI/OiBTaWduZXIsXG4gICAgcmVkZWVtU2NyaXB0PzogQnVmZmVyLFxuICAgIGhhc2hUeXBlPzogbnVtYmVyLFxuICAgIHdpdG5lc3NWYWx1ZT86IFROdW1iZXIsXG4gICAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcixcbiAgICBjb250cm9sQmxvY2s/OiBCdWZmZXIsXG4gICAgYW5uZXg/OiBCdWZmZXJcbiAgKTogdm9pZCB7XG4gICAgdHJ5U2lnbjxUTnVtYmVyPihcbiAgICAgIGdldFNpZ25pbmdEYXRhPFROdW1iZXI+KFxuICAgICAgICB0aGlzLm5ldHdvcmssXG4gICAgICAgIHRoaXMuX19JTlBVVFMsXG4gICAgICAgIHRoaXMuX19uZWVkc091dHB1dHMuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5fX1RYLFxuICAgICAgICBzaWduUGFyYW1zLFxuICAgICAgICBrZXlQYWlyLFxuICAgICAgICByZWRlZW1TY3JpcHQsXG4gICAgICAgIGhhc2hUeXBlLFxuICAgICAgICB3aXRuZXNzVmFsdWUsXG4gICAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICAgIGNvbnRyb2xCbG9jayxcbiAgICAgICAgYW5uZXgsXG4gICAgICAgIHRoaXMuX19VU0VfTE9XX1JcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2FkZElucHV0VW5zYWZlKHR4SGFzaDogQnVmZmVyLCB2b3V0OiBudW1iZXIsIG9wdGlvbnM6IFR4YklucHV0PFROdW1iZXI+KTogbnVtYmVyIHtcbiAgICBpZiAoVHJhbnNhY3Rpb24uaXNDb2luYmFzZUhhc2godHhIYXNoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb2luYmFzZSBpbnB1dHMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUeE91dCA9IHR4SGFzaC50b1N0cmluZygnaGV4JykgKyAnOicgKyB2b3V0O1xuICAgIGlmICh0aGlzLl9fUFJFVl9UWF9TRVRbcHJldlR4T3V0XSAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSBUeE91dDogJyArIHByZXZUeE91dCk7XG5cbiAgICBsZXQgaW5wdXQ6IFR4YklucHV0PFROdW1iZXI+ID0ge307XG5cbiAgICAvLyBkZXJpdmUgd2hhdCB3ZSBjYW4gZnJvbSB0aGUgc2NyaXB0U2lnXG4gICAgaWYgKG9wdGlvbnMuc2NyaXB0ICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy53aXRuZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlucHV0ID0gZXhwYW5kSW5wdXQ8VE51bWJlcj4ob3B0aW9ucy5zY3JpcHQsIG9wdGlvbnMud2l0bmVzcyk7XG4gICAgfVxuXG4gICAgLy8gaWYgYW4gaW5wdXQgdmFsdWUgd2FzIGdpdmVuLCByZXRhaW4gaXRcbiAgICBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbnB1dC52YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gZGVyaXZlIHdoYXQgd2UgY2FuIGZyb20gdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9ucyBvdXRwdXQgc2NyaXB0XG4gICAgaWYgKCFpbnB1dC5wcmV2T3V0U2NyaXB0ICYmIG9wdGlvbnMucHJldk91dFNjcmlwdCkge1xuICAgICAgbGV0IHByZXZPdXRUeXBlO1xuXG4gICAgICBpZiAoIWlucHV0LnB1YmtleXMgJiYgIWlucHV0LnNpZ25hdHVyZXMpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQob3B0aW9ucy5wcmV2T3V0U2NyaXB0KTtcbiAgICAgICAgaWYgKGV4cGFuZGVkLnB1YmtleXMpIHtcbiAgICAgICAgICBpbnB1dC5wdWJrZXlzID0gZXhwYW5kZWQucHVia2V5cztcbiAgICAgICAgICBpbnB1dC5zaWduYXR1cmVzID0gZXhwYW5kZWQuc2lnbmF0dXJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZPdXRUeXBlID0gZXhwYW5kZWQudHlwZTtcbiAgICAgIH1cblxuICAgICAgaW5wdXQucHJldk91dFNjcmlwdCA9IG9wdGlvbnMucHJldk91dFNjcmlwdDtcbiAgICAgIGlucHV0LnByZXZPdXRUeXBlID0gcHJldk91dFR5cGUgfHwgY2xhc3NpZnkub3V0cHV0KG9wdGlvbnMucHJldk91dFNjcmlwdCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmluID0gdGhpcy5fX1RYLmFkZElucHV0KHR4SGFzaCwgdm91dCwgb3B0aW9ucy5zZXF1ZW5jZSwgb3B0aW9ucy5zY3JpcHRTaWcpO1xuICAgIHRoaXMuX19JTlBVVFNbdmluXSA9IGlucHV0O1xuICAgIHRoaXMuX19QUkVWX1RYX1NFVFtwcmV2VHhPdXRdID0gdHJ1ZTtcbiAgICByZXR1cm4gdmluO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2J1aWxkKGFsbG93SW5jb21wbGV0ZT86IGJvb2xlYW4pOiBUcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgaWYgKCFhbGxvd0luY29tcGxldGUpIHtcbiAgICAgIGlmICghdGhpcy5fX1RYLmlucy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vIGlucHV0cycpO1xuICAgICAgaWYgKCF0aGlzLl9fVFgub3V0cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vIG91dHB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eCA9IHRoaXMuX19UWC5jbG9uZSgpO1xuXG4gICAgLy8gY3JlYXRlIHNjcmlwdCBzaWduYXR1cmVzIGZyb20gaW5wdXRzXG4gICAgdGhpcy5fX0lOUFVUUy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgICAgaWYgKCFpbnB1dC5wcmV2T3V0VHlwZSAmJiAhYWxsb3dJbmNvbXBsZXRlKSB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGlzIG5vdCBjb21wbGV0ZScpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZDxUTnVtYmVyPihpbnB1dC5wcmV2T3V0VHlwZSEsIGlucHV0LCBhbGxvd0luY29tcGxldGUpO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgaWYgKCFhbGxvd0luY29tcGxldGUgJiYgaW5wdXQucHJldk91dFR5cGUgPT09IFNDUklQVF9UWVBFUy5OT05TVEFOREFSRCkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGlucHV0IHR5cGUnKTtcbiAgICAgICAgaWYgKCFhbGxvd0luY29tcGxldGUpIHRocm93IG5ldyBFcnJvcignTm90IGVub3VnaCBpbmZvcm1hdGlvbicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQuaW5wdXQpIHtcbiAgICAgICAgdHguc2V0SW5wdXRTY3JpcHQoaSwgcmVzdWx0LmlucHV0KTtcbiAgICAgIH1cbiAgICAgIHR4LnNldFdpdG5lc3MoaSwgcmVzdWx0LndpdG5lc3MhKTtcbiAgICB9KTtcblxuICAgIGlmICghYWxsb3dJbmNvbXBsZXRlKSB7XG4gICAgICAvLyBkbyBub3QgcmVseSBvbiB0aGlzLCBpdHMgbWVyZWx5IGEgbGFzdCByZXNvcnRcbiAgICAgIGlmICh0aGlzLl9fb3Zlck1heGltdW1GZWVzKHR4LnZpcnR1YWxTaXplKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaGFzIGFic3VyZCBmZWVzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgcHJpdmF0ZSBfX2Nhbk1vZGlmeUlucHV0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fX0lOUFVUUy5ldmVyeSgoaW5wdXQpID0+IHtcbiAgICAgIGlmICghaW5wdXQuc2lnbmF0dXJlcykgcmV0dXJuIHRydWU7XG5cbiAgICAgIHJldHVybiBpbnB1dC5zaWduYXR1cmVzLmV2ZXJ5KChzaWduYXR1cmUpID0+IHtcbiAgICAgICAgaWYgKCFzaWduYXR1cmUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBoYXNoVHlwZSA9IHNpZ25hdHVyZUhhc2hUeXBlKHNpZ25hdHVyZSk7XG5cbiAgICAgICAgLy8gaWYgU0lHSEFTSF9BTllPTkVDQU5QQVkgaXMgc2V0LCBzaWduYXR1cmVzIHdvdWxkIG5vdFxuICAgICAgICAvLyBiZSBpbnZhbGlkYXRlZCBieSBtb3JlIGlucHV0c1xuICAgICAgICByZXR1cm4gKGhhc2hUeXBlICYgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTllPTkVDQU5QQVkpICE9PSAwO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9fbmVlZHNPdXRwdXRzKHNpZ25pbmdIYXNoVHlwZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHNpZ25pbmdIYXNoVHlwZSA9PT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9BTEwgfHwgc2lnbmluZ0hhc2hUeXBlID09PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fVFgub3V0cy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLy8gaWYgaW5wdXRzIGFyZSBiZWluZyBzaWduZWQgd2l0aCBTSUdIQVNIX05PTkUsIHdlIGRvbid0IHN0cmljdGx5IG5lZWQgb3V0cHV0c1xuICAgIC8vIC5idWlsZCgpIHdpbGwgZmFpbCwgYnV0IC5idWlsZEluY29tcGxldGUoKSBpcyBPS1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9fVFgub3V0cy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHRoaXMuX19JTlBVVFMuc29tZSgoaW5wdXQpID0+IHtcbiAgICAgICAgaWYgKCFpbnB1dC5zaWduYXR1cmVzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIGlucHV0LnNpZ25hdHVyZXMuc29tZSgoc2lnbmF0dXJlKSA9PiB7XG4gICAgICAgICAgaWYgKCFzaWduYXR1cmUpIHJldHVybiBmYWxzZTsgLy8gbm8gc2lnbmF0dXJlLCBubyBpc3N1ZVxuICAgICAgICAgIGNvbnN0IGhhc2hUeXBlID0gc2lnbmF0dXJlSGFzaFR5cGUoc2lnbmF0dXJlKTtcbiAgICAgICAgICBpZiAoaGFzaFR5cGUgJiBUcmFuc2FjdGlvbi5TSUdIQVNIX05PTkUpIHJldHVybiBmYWxzZTsgLy8gU0lHSEFTSF9OT05FIGRvZXNuJ3QgY2FyZSBhYm91dCBvdXRwdXRzXG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFNJR0hBU0hfKiBkb2VzIGNhcmVcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9fY2FuTW9kaWZ5T3V0cHV0cygpOiBib29sZWFuIHtcbiAgICBjb25zdCBuSW5wdXRzID0gdGhpcy5fX1RYLmlucy5sZW5ndGg7XG4gICAgY29uc3Qgbk91dHB1dHMgPSB0aGlzLl9fVFgub3V0cy5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5fX0lOUFVUUy5ldmVyeSgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC5zaWduYXR1cmVzID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gICAgICByZXR1cm4gaW5wdXQuc2lnbmF0dXJlcy5ldmVyeSgoc2lnbmF0dXJlKSA9PiB7XG4gICAgICAgIGlmICghc2lnbmF0dXJlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgaGFzaFR5cGUgPSBzaWduYXR1cmVIYXNoVHlwZShzaWduYXR1cmUpO1xuXG4gICAgICAgIGNvbnN0IGhhc2hUeXBlTW9kID0gaGFzaFR5cGUgJiAweDFmO1xuICAgICAgICBpZiAoaGFzaFR5cGVNb2QgPT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfTk9ORSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChoYXNoVHlwZU1vZCA9PT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9TSU5HTEUpIHtcbiAgICAgICAgICAvLyBpZiBTSUdIQVNIX1NJTkdMRSBpcyBzZXQsIGFuZCBuSW5wdXRzID4gbk91dHB1dHNcbiAgICAgICAgICAvLyBzb21lIHNpZ25hdHVyZXMgd291bGQgYmUgaW52YWxpZGF0ZWQgYnkgdGhlIGFkZGl0aW9uXG4gICAgICAgICAgLy8gb2YgbW9yZSBvdXRwdXRzXG4gICAgICAgICAgcmV0dXJuIG5JbnB1dHMgPD0gbk91dHB1dHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9fb3Zlck1heGltdW1GZWVzKGJ5dGVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBub3QgYWxsIGlucHV0cyB3aWxsIGhhdmUgLnZhbHVlIGRlZmluZWRcbiAgICBjb25zdCBpbmNvbWluZyA9IHRoaXMuX19JTlBVVFMucmVkdWNlKFxuICAgICAgKGEsIHgpID0+IGEgKyAodHlwZW9mIHgudmFsdWUgIT09ICd1bmRlZmluZWQnID8gQmlnSW50KHgudmFsdWUpIDogQmlnSW50KDApKSxcbiAgICAgIEJpZ0ludCgwKVxuICAgICk7XG5cbiAgICAvLyBidXQgYWxsIG91dHB1dHMgZG8sIGFuZCBpZiB3ZSBoYXZlIGFueSBpbnB1dCB2YWx1ZVxuICAgIC8vIHdlIGNhbiBpbW1lZGlhdGVseSBkZXRlcm1pbmUgaWYgdGhlIG91dHB1dHMgYXJlIHRvbyBzbWFsbFxuICAgIGNvbnN0IG91dGdvaW5nID0gdGhpcy5fX1RYLm91dHMucmVkdWNlKChhLCB4KSA9PiBhICsgQmlnSW50KCh4IGFzIFR4T3V0cHV0PFROdW1iZXI+KS52YWx1ZSksIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgZmVlID0gaW5jb21pbmcgLSBvdXRnb2luZztcbiAgICBjb25zdCBmZWVSYXRlID0gTnVtYmVyKGZlZSkgLyBieXRlczsgLy8gYXNzdW1lIGZlZSBmaXRzIHdpdGhpbiBudW1iZXJcblxuICAgIHJldHVybiBmZWVSYXRlID4gdGhpcy5tYXhpbXVtRmVlUmF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHBhbmRJbnB1dDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgc2NyaXB0U2lnPzogQnVmZmVyLFxuICB3aXRuZXNzU3RhY2s6IEJ1ZmZlcltdID0gW10sXG4gIHR5cGU/OiBzdHJpbmcsXG4gIHNjcmlwdFB1YktleT86IEJ1ZmZlclxuKTogVHhiSW5wdXQ8VE51bWJlcj4ge1xuICBpZiAoc2NyaXB0U2lnICYmIHNjcmlwdFNpZy5sZW5ndGggPT09IDAgJiYgd2l0bmVzc1N0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuICBpZiAoIXR5cGUpIHtcbiAgICBsZXQgc3NUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBzY3JpcHRTaWcgPyBjbGFzc2lmeS5pbnB1dChzY3JpcHRTaWcsIHRydWUpIDogdW5kZWZpbmVkO1xuICAgIGxldCB3c1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGNsYXNzaWZ5LndpdG5lc3Mod2l0bmVzc1N0YWNrLCB0cnVlKTtcbiAgICBpZiAoc3NUeXBlID09PSBTQ1JJUFRfVFlQRVMuTk9OU1RBTkRBUkQpIHNzVHlwZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAod3NUeXBlID09PSBTQ1JJUFRfVFlQRVMuTk9OU1RBTkRBUkQpIHdzVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB0eXBlID0gc3NUeXBlIHx8IHdzVHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyV1BLSDoge1xuICAgICAgY29uc3QgeyBvdXRwdXQsIHB1YmtleSwgc2lnbmF0dXJlIH0gPSBwYXltZW50cy5wMndwa2goe1xuICAgICAgICB3aXRuZXNzOiB3aXRuZXNzU3RhY2ssXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJldk91dFNjcmlwdDogb3V0cHV0LFxuICAgICAgICBwcmV2T3V0VHlwZTogU0NSSVBUX1RZUEVTLlAyV1BLSCxcbiAgICAgICAgcHVia2V5czogW3B1YmtleV0sXG4gICAgICAgIHNpZ25hdHVyZXM6IFtzaWduYXR1cmVdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlBLSDoge1xuICAgICAgY29uc3QgeyBvdXRwdXQsIHB1YmtleSwgc2lnbmF0dXJlIH0gPSBwYXltZW50cy5wMnBraCh7XG4gICAgICAgIGlucHV0OiBzY3JpcHRTaWcsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJldk91dFNjcmlwdDogb3V0cHV0LFxuICAgICAgICBwcmV2T3V0VHlwZTogU0NSSVBUX1RZUEVTLlAyUEtILFxuICAgICAgICBwdWJrZXlzOiBbcHVia2V5XSxcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyUEs6IHtcbiAgICAgIGNvbnN0IHsgc2lnbmF0dXJlIH0gPSBwYXltZW50cy5wMnBrKHsgaW5wdXQ6IHNjcmlwdFNpZyB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJldk91dFR5cGU6IFNDUklQVF9UWVBFUy5QMlBLLFxuICAgICAgICBwdWJrZXlzOiBbdW5kZWZpbmVkXSxcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyTVM6IHtcbiAgICAgIGNvbnN0IHsgbSwgcHVia2V5cywgc2lnbmF0dXJlcyB9ID0gcGF5bWVudHMucDJtcyhcbiAgICAgICAge1xuICAgICAgICAgIGlucHV0OiBzY3JpcHRTaWcsXG4gICAgICAgICAgb3V0cHV0OiBzY3JpcHRQdWJLZXksXG4gICAgICAgIH0sXG4gICAgICAgIHsgYWxsb3dJbmNvbXBsZXRlOiB0cnVlIH1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJNUyxcbiAgICAgICAgcHVia2V5cyxcbiAgICAgICAgc2lnbmF0dXJlcyxcbiAgICAgICAgbWF4U2lnbmF0dXJlczogbSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSBTQ1JJUFRfVFlQRVMuUDJUUl9OUzoge1xuICAgICAgY29uc3QgeyBuLCBwdWJrZXlzLCBzaWduYXR1cmVzIH0gPSBwMnRyUGF5bWVudHMucDJ0cl9ucyhcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdpdG5lc3Mgc2lnbmF0dXJlcyBhcmUgcmV2ZXJzZSBvZiBwdWJrZXlzLCBiZWNhdXNlIGl0J3MgYSBzdGFja1xuICAgICAgICAgIHNpZ25hdHVyZXM6IHdpdG5lc3NTdGFjay5sZW5ndGggPyB3aXRuZXNzU3RhY2sucmV2ZXJzZSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG91dHB1dDogc2NyaXB0UHViS2V5LFxuICAgICAgICB9LFxuICAgICAgICB7IGFsbG93SW5jb21wbGV0ZTogdHJ1ZSwgZWNjTGliIH1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJUUl9OUyxcbiAgICAgICAgcHVia2V5cyxcbiAgICAgICAgc2lnbmF0dXJlcyxcbiAgICAgICAgbWF4U2lnbmF0dXJlczogbixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFNDUklQVF9UWVBFUy5QMlNIKSB7XG4gICAgY29uc3QgeyBvdXRwdXQsIHJlZGVlbSB9ID0gcGF5bWVudHMucDJzaCh7XG4gICAgICBpbnB1dDogc2NyaXB0U2lnLFxuICAgICAgd2l0bmVzczogd2l0bmVzc1N0YWNrLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3V0cHV0VHlwZSA9IGNsYXNzaWZ5Lm91dHB1dChyZWRlZW0hLm91dHB1dCEpO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5kSW5wdXQ8VE51bWJlcj4ocmVkZWVtIS5pbnB1dCEsIHJlZGVlbSEud2l0bmVzcyEsIG91dHB1dFR5cGUsIHJlZGVlbSEub3V0cHV0KTtcbiAgICBpZiAoIWV4cGFuZGVkLnByZXZPdXRUeXBlKSByZXR1cm4ge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJldk91dFNjcmlwdDogb3V0cHV0LFxuICAgICAgcHJldk91dFR5cGU6IFNDUklQVF9UWVBFUy5QMlNILFxuICAgICAgcmVkZWVtU2NyaXB0OiByZWRlZW0hLm91dHB1dCxcbiAgICAgIHJlZGVlbVNjcmlwdFR5cGU6IGV4cGFuZGVkLnByZXZPdXRUeXBlLFxuICAgICAgd2l0bmVzc1NjcmlwdDogZXhwYW5kZWQud2l0bmVzc1NjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHRUeXBlOiBleHBhbmRlZC53aXRuZXNzU2NyaXB0VHlwZSxcblxuICAgICAgcHVia2V5czogZXhwYW5kZWQucHVia2V5cyxcbiAgICAgIHNpZ25hdHVyZXM6IGV4cGFuZGVkLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXU0gpIHtcbiAgICBjb25zdCB7IG91dHB1dCwgcmVkZWVtIH0gPSBwYXltZW50cy5wMndzaCh7XG4gICAgICBpbnB1dDogc2NyaXB0U2lnLFxuICAgICAgd2l0bmVzczogd2l0bmVzc1N0YWNrLFxuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dFR5cGUgPSBjbGFzc2lmeS5vdXRwdXQocmVkZWVtIS5vdXRwdXQhKTtcbiAgICBsZXQgZXhwYW5kZWQ7XG4gICAgaWYgKG91dHB1dFR5cGUgPT09IFNDUklQVF9UWVBFUy5QMldQS0gpIHtcbiAgICAgIGV4cGFuZGVkID0gZXhwYW5kSW5wdXQ8VE51bWJlcj4ocmVkZWVtIS5pbnB1dCEsIHJlZGVlbSEud2l0bmVzcyEsIG91dHB1dFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBhbmRlZCA9IGV4cGFuZElucHV0PFROdW1iZXI+KGJzY3JpcHQuY29tcGlsZShyZWRlZW0hLndpdG5lc3MhKSwgW10sIG91dHB1dFR5cGUsIHJlZGVlbSEub3V0cHV0KTtcbiAgICB9XG4gICAgaWYgKCFleHBhbmRlZC5wcmV2T3V0VHlwZSkgcmV0dXJuIHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByZXZPdXRTY3JpcHQ6IG91dHB1dCxcbiAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJXU0gsXG4gICAgICB3aXRuZXNzU2NyaXB0OiByZWRlZW0hLm91dHB1dCxcbiAgICAgIHdpdG5lc3NTY3JpcHRUeXBlOiBleHBhbmRlZC5wcmV2T3V0VHlwZSxcblxuICAgICAgcHVia2V5czogZXhwYW5kZWQucHVia2V5cyxcbiAgICAgIHNpZ25hdHVyZXM6IGV4cGFuZGVkLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJUUikge1xuICAgIGNvbnN0IHBhcnNlZFdpdG5lc3MgPSB0YXByb290LnBhcnNlVGFwcm9vdFdpdG5lc3Mod2l0bmVzc1N0YWNrKTtcbiAgICBpZiAocGFyc2VkV2l0bmVzcy5zcGVuZFR5cGUgPT09ICdLZXknKSB7XG4gICAgICAvLyBrZXkgcGF0aCBzcGVuZCwgbm90aGluZyB0byBleHBhbmRcbiAgICAgIGNvbnN0IHsgc2lnbmF0dXJlLCBhbm5leCB9ID0gcGFyc2VkV2l0bmVzcztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJUUixcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICAgIGFubmV4LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2NyaXB0IHBhdGggc3BlbmRcbiAgICAgIGNvbnN0IHsgdGFwc2NyaXB0LCBjb250cm9sQmxvY2ssIGFubmV4IH0gPSBwYXJzZWRXaXRuZXNzO1xuICAgICAgY29uc3QgcHJldk91dFNjcmlwdCA9IHAydHJQYXltZW50cy5wMnRyKFxuICAgICAgICB7XG4gICAgICAgICAgcmVkZWVtczogW3sgb3V0cHV0OiB0YXBzY3JpcHQgfV0sXG4gICAgICAgICAgcmVkZWVtSW5kZXg6IDAsXG4gICAgICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgICAgIGFubmV4LFxuICAgICAgICB9LFxuICAgICAgICB7IGVjY0xpYiB9XG4gICAgICApLm91dHB1dDtcbiAgICAgIGNvbnN0IHdpdG5lc3NTY3JpcHRUeXBlID0gY2xhc3NpZnkub3V0cHV0KHRhcHNjcmlwdCk7XG4gICAgICBjb25zdCB7IHB1YmtleXMsIHNpZ25hdHVyZXMgfSA9IGV4cGFuZElucHV0PFROdW1iZXI+KFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHBhcnNlZFdpdG5lc3Muc2NyaXB0U2lnLFxuICAgICAgICB3aXRuZXNzU2NyaXB0VHlwZSxcbiAgICAgICAgdGFwc2NyaXB0XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmV2T3V0U2NyaXB0LFxuICAgICAgICBwcmV2T3V0VHlwZTogU0NSSVBUX1RZUEVTLlAyVFIsXG4gICAgICAgIHdpdG5lc3NTY3JpcHQ6IHRhcHNjcmlwdCxcbiAgICAgICAgd2l0bmVzc1NjcmlwdFR5cGUsXG5cbiAgICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgICBhbm5leCxcblxuICAgICAgICBwdWJrZXlzLFxuICAgICAgICBzaWduYXR1cmVzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuTk9OU1RBTkRBUkQsXG4gICAgcHJldk91dFNjcmlwdDogc2NyaXB0U2lnLFxuICB9O1xufVxuXG4vLyBjb3VsZCBiZSBkb25lIGluIGV4cGFuZElucHV0LCBidXQgcmVxdWlyZXMgdGhlIG9yaWdpbmFsIFRyYW5zYWN0aW9uIGZvciBoYXNoRm9yU2lnbmF0dXJlXG5mdW5jdGlvbiBmaXhNdWx0aXNpZ09yZGVyPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBpbnB1dDogVHhiSW5wdXQ8VE51bWJlcj4sXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgdmluOiBudW1iZXIsXG4gIHByZXZPdXRwdXRzPzogVHhPdXRwdXQ8VE51bWJlcj5bXVxuKTogdm9pZCB7XG4gIGlmIChpbnB1dC5yZWRlZW1TY3JpcHRUeXBlICE9PSBTQ1JJUFRfVFlQRVMuUDJNUyB8fCAhaW5wdXQucmVkZWVtU2NyaXB0KSByZXR1cm47XG4gIGlmIChpbnB1dC5wdWJrZXlzIS5sZW5ndGggPT09IGlucHV0LnNpZ25hdHVyZXMhLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBwcmV2T3V0cHV0ID0gcHJldk91dHB1dHMgJiYgcHJldk91dHB1dHNbdmluXTtcblxuICBjb25zdCB1bm1hdGNoZWQgPSBpbnB1dC5zaWduYXR1cmVzIS5jb25jYXQoKTtcblxuICBpbnB1dC5zaWduYXR1cmVzID0gaW5wdXQucHVia2V5cyEubWFwKChwdWJLZXkpID0+IHtcbiAgICBjb25zdCBrZXlQYWlyID0gRUNQYWlyLmZyb21QdWJsaWNLZXkocHViS2V5ISk7XG4gICAgbGV0IG1hdGNoOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBjaGVjayBmb3IgYSBzaWduYXR1cmVcbiAgICB1bm1hdGNoZWQuc29tZSgoc2lnbmF0dXJlLCBpKSA9PiB7XG4gICAgICAvLyBza2lwIGlmIHVuZGVmaW5lZCB8fCBPUF8wXG4gICAgICBpZiAoIXNpZ25hdHVyZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBUT0RPOiBhdm9pZCBPKG4pIGhhc2hGb3JTaWduYXR1cmVcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGJzY3JpcHQuc2lnbmF0dXJlLmRlY29kZShzaWduYXR1cmUpO1xuICAgICAgY29uc3QgaGFzaCA9IHRyYW5zYWN0aW9uLmhhc2hGb3JTaWduYXR1cmUodmluLCBpbnB1dC5yZWRlZW1TY3JpcHQhLCBwYXJzZWQuaGFzaFR5cGUsIHByZXZPdXRwdXQ/LnZhbHVlKTtcblxuICAgICAgLy8gc2tpcCBpZiBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggcHViS2V5XG4gICAgICBpZiAoIWtleVBhaXIudmVyaWZ5KGhhc2gsIHBhcnNlZC5zaWduYXR1cmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIHJlbW92ZSBtYXRjaGVkIHNpZ25hdHVyZSBmcm9tIHVubWF0Y2hlZFxuICAgICAgdW5tYXRjaGVkW2ldID0gdW5kZWZpbmVkO1xuICAgICAgbWF0Y2ggPSBzaWduYXR1cmU7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhwYW5kT3V0cHV0KHNjcmlwdDogQnVmZmVyLCBvdXJQdWJLZXk/OiBCdWZmZXIsIGNvbnRyb2xCbG9jaz86IEJ1ZmZlcik6IFR4Yk91dHB1dCB7XG4gIHR5cGVmb3JjZSh0eXBlcy5CdWZmZXIsIHNjcmlwdCk7XG4gIGNvbnN0IHR5cGUgPSBjbGFzc2lmeS5vdXRwdXQoc2NyaXB0KTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlBLSDoge1xuICAgICAgaWYgKCFvdXJQdWJLZXkpIHJldHVybiB7IHR5cGUgfTtcblxuICAgICAgLy8gZG9lcyBvdXIgaGFzaDE2MChwdWJLZXkpIG1hdGNoIHRoZSBvdXRwdXQgc2NyaXB0cz9cbiAgICAgIGNvbnN0IHBraDEgPSBwYXltZW50cy5wMnBraCh7IG91dHB1dDogc2NyaXB0IH0pLmhhc2g7XG4gICAgICBjb25zdCBwa2gyID0gYmNyeXB0by5oYXNoMTYwKG91clB1YktleSk7XG4gICAgICBpZiAoIXBraDEhLmVxdWFscyhwa2gyKSkgcmV0dXJuIHsgdHlwZSB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwdWJrZXlzOiBbb3VyUHViS2V5XSxcbiAgICAgICAgc2lnbmF0dXJlczogW3VuZGVmaW5lZF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyV1BLSDoge1xuICAgICAgaWYgKCFvdXJQdWJLZXkpIHJldHVybiB7IHR5cGUgfTtcblxuICAgICAgLy8gZG9lcyBvdXIgaGFzaDE2MChwdWJLZXkpIG1hdGNoIHRoZSBvdXRwdXQgc2NyaXB0cz9cbiAgICAgIGNvbnN0IHdwa2gxID0gcGF5bWVudHMucDJ3cGtoKHsgb3V0cHV0OiBzY3JpcHQgfSkuaGFzaDtcbiAgICAgIGNvbnN0IHdwa2gyID0gYmNyeXB0by5oYXNoMTYwKG91clB1YktleSk7XG4gICAgICBpZiAoIXdwa2gxIS5lcXVhbHMod3BraDIpKSByZXR1cm4geyB0eXBlIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHB1YmtleXM6IFtvdXJQdWJLZXldLFxuICAgICAgICBzaWduYXR1cmVzOiBbdW5kZWZpbmVkXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSBTQ1JJUFRfVFlQRVMuUDJUUjoge1xuICAgICAgaWYgKCFvdXJQdWJLZXkpIHJldHVybiB7IHR5cGUgfTtcbiAgICAgIC8vIEhBQ0sgb3VyUHViS2V5IHRvIEJJUDM0MC1zdHlsZVxuICAgICAgaWYgKG91clB1YktleS5sZW5ndGggPT09IDMzKSBvdXJQdWJLZXkgPSBvdXJQdWJLZXkuc2xpY2UoMSk7XG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG11bHRpcGxlIHB1YmtleXNcbiAgICAgIGNvbnN0IHAydHIgPSBwMnRyUGF5bWVudHMucDJ0cih7IHB1YmtleTogb3VyUHViS2V5LCBjb250cm9sQmxvY2sgfSwgeyBlY2NMaWIgfSk7XG5cbiAgICAgIC8vIERvZXMgdHdlYWtlZCBvdXRwdXQgZm9yIGEgc2luZ2xlIHB1YmtleSBtYXRjaD9cbiAgICAgIGlmICghc2NyaXB0LmVxdWFscyhwMnRyLm91dHB1dCEpKSByZXR1cm4geyB0eXBlIH07XG5cbiAgICAgIC8vIFAyVFIgS2V5UGF0aCwgc2luZ2xlIGtleVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgcHVia2V5czogW291clB1YktleV0sXG4gICAgICAgIHNpZ25hdHVyZXM6IFt1bmRlZmluZWRdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlRSX05TOiB7XG4gICAgICBjb25zdCBwMnRyTnMgPSBwMnRyUGF5bWVudHMucDJ0cl9ucyh7IG91dHB1dDogc2NyaXB0IH0sIHsgZWNjTGliIH0pO1xuICAgICAgLy8gUDJUUiBTY3JpcHRQYXRoXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwdWJrZXlzOiBwMnRyTnMucHVia2V5cyxcbiAgICAgICAgc2lnbmF0dXJlczogcDJ0ck5zLnB1YmtleXMhLm1hcCgoKTogdW5kZWZpbmVkID0+IHVuZGVmaW5lZCksXG4gICAgICAgIG1heFNpZ25hdHVyZXM6IHAydHJOcy5wdWJrZXlzIS5sZW5ndGgsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyUEs6IHtcbiAgICAgIGNvbnN0IHAycGsgPSBwYXltZW50cy5wMnBrKHsgb3V0cHV0OiBzY3JpcHQgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwdWJrZXlzOiBbcDJway5wdWJrZXldLFxuICAgICAgICBzaWduYXR1cmVzOiBbdW5kZWZpbmVkXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSBTQ1JJUFRfVFlQRVMuUDJNUzoge1xuICAgICAgY29uc3QgcDJtcyA9IHBheW1lbnRzLnAybXMoeyBvdXRwdXQ6IHNjcmlwdCB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHB1YmtleXM6IHAybXMucHVia2V5cyxcbiAgICAgICAgc2lnbmF0dXJlczogcDJtcy5wdWJrZXlzIS5tYXAoKCk6IHVuZGVmaW5lZCA9PiB1bmRlZmluZWQpLFxuICAgICAgICBtYXhTaWduYXR1cmVzOiBwMm1zLm0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHR5cGUgfTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUlucHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBpbnB1dDogVHhiSW5wdXQ8VE51bWJlcj4sXG4gIG91clB1YktleTogQnVmZmVyLFxuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXIsXG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXIsXG4gIGNvbnRyb2xCbG9jaz86IEJ1ZmZlcixcbiAgYW5uZXg/OiBCdWZmZXJcbik6IFR4YklucHV0PFROdW1iZXI+IHtcbiAgaWYgKHJlZGVlbVNjcmlwdCAmJiB3aXRuZXNzU2NyaXB0KSB7XG4gICAgY29uc3QgcDJ3c2ggPSBwYXltZW50cy5wMndzaCh7XG4gICAgICByZWRlZW06IHsgb3V0cHV0OiB3aXRuZXNzU2NyaXB0IH0sXG4gICAgfSkgYXMgUGF5bWVudDtcbiAgICBjb25zdCBwMndzaEFsdCA9IHBheW1lbnRzLnAyd3NoKHsgb3V0cHV0OiByZWRlZW1TY3JpcHQgfSkgYXMgUGF5bWVudDtcbiAgICBjb25zdCBwMnNoID0gcGF5bWVudHMucDJzaCh7IHJlZGVlbTogeyBvdXRwdXQ6IHJlZGVlbVNjcmlwdCB9IH0pIGFzIFBheW1lbnQ7XG4gICAgY29uc3QgcDJzaEFsdCA9IHBheW1lbnRzLnAyc2goeyByZWRlZW06IHAyd3NoIH0pIGFzIFBheW1lbnQ7XG5cbiAgICAvLyBlbmZvcmNlcyBQMlNIKFAyV1NIKC4uLikpXG4gICAgaWYgKCFwMndzaC5oYXNoIS5lcXVhbHMocDJ3c2hBbHQuaGFzaCEpKSB0aHJvdyBuZXcgRXJyb3IoJ1dpdG5lc3Mgc2NyaXB0IGluY29uc2lzdGVudCB3aXRoIHByZXZPdXRTY3JpcHQnKTtcbiAgICBpZiAoIXAyc2guaGFzaCEuZXF1YWxzKHAyc2hBbHQuaGFzaCEpKSB0aHJvdyBuZXcgRXJyb3IoJ1JlZGVlbSBzY3JpcHQgaW5jb25zaXN0ZW50IHdpdGggcHJldk91dFNjcmlwdCcpO1xuXG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQocDJ3c2gucmVkZWVtIS5vdXRwdXQhLCBvdXJQdWJLZXkpO1xuICAgIGlmICghZXhwYW5kZWQucHVia2V5cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cGFuZGVkLnR5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgYXMgd2l0bmVzc1NjcmlwdCAoJyArIGJzY3JpcHQudG9BU00od2l0bmVzc1NjcmlwdCkgKyAnKScpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2lnbmF0dXJlcyAmJiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHgpID0+IHggIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIGV4cGFuZGVkLnNpZ25hdHVyZXMgPSBpbnB1dC5zaWduYXR1cmVzO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25TY3JpcHQgPSB3aXRuZXNzU2NyaXB0O1xuICAgIGlmIChleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIKSB0aHJvdyBuZXcgRXJyb3IoJ1AyU0goUDJXU0goUDJXUEtIKSkgaXMgYSBjb25zZW5zdXMgZmFpbHVyZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgIHJlZGVlbVNjcmlwdFR5cGU6IFNDUklQVF9UWVBFUy5QMldTSCxcblxuICAgICAgd2l0bmVzc1NjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHRUeXBlOiBleHBhbmRlZC50eXBlLFxuXG4gICAgICBwcmV2T3V0VHlwZTogU0NSSVBUX1RZUEVTLlAyU0gsXG4gICAgICBwcmV2T3V0U2NyaXB0OiBwMnNoLm91dHB1dCxcblxuICAgICAgd2l0bmVzc1ZlcnNpb246IDAsXG4gICAgICBzaWduU2NyaXB0LFxuICAgICAgc2lnblR5cGU6IGV4cGFuZGVkLnR5cGUsXG5cbiAgICAgIHB1YmtleXM6IGV4cGFuZGVkLnB1YmtleXMsXG4gICAgICBzaWduYXR1cmVzOiBleHBhbmRlZC5zaWduYXR1cmVzLFxuICAgICAgbWF4U2lnbmF0dXJlczogZXhwYW5kZWQubWF4U2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlZGVlbVNjcmlwdCkge1xuICAgIGNvbnN0IHAyc2ggPSBwYXltZW50cy5wMnNoKHsgcmVkZWVtOiB7IG91dHB1dDogcmVkZWVtU2NyaXB0IH0gfSkgYXMgUGF5bWVudDtcblxuICAgIGlmIChpbnB1dC5wcmV2T3V0U2NyaXB0KSB7XG4gICAgICBsZXQgcDJzaEFsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHAyc2hBbHQgPSBwYXltZW50cy5wMnNoKHsgb3V0cHV0OiBpbnB1dC5wcmV2T3V0U2NyaXB0IH0pIGFzIFBheW1lbnQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHJldk91dFNjcmlwdCBtdXN0IGJlIFAyU0gnKTtcbiAgICAgIH1cbiAgICAgIGlmICghcDJzaC5oYXNoIS5lcXVhbHMocDJzaEFsdC5oYXNoISkpIHRocm93IG5ldyBFcnJvcignUmVkZWVtIHNjcmlwdCBpbmNvbnNpc3RlbnQgd2l0aCBwcmV2T3V0U2NyaXB0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQocDJzaC5yZWRlZW0hLm91dHB1dCEsIG91clB1YktleSk7XG4gICAgaWYgKCFleHBhbmRlZC5wdWJrZXlzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXhwYW5kZWQudHlwZSArICcgbm90IHN1cHBvcnRlZCBhcyByZWRlZW1TY3JpcHQgKCcgKyBic2NyaXB0LnRvQVNNKHJlZGVlbVNjcmlwdCkgKyAnKScpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2lnbmF0dXJlcyAmJiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHgpID0+IHggIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIGV4cGFuZGVkLnNpZ25hdHVyZXMgPSBpbnB1dC5zaWduYXR1cmVzO1xuICAgIH1cblxuICAgIGxldCBzaWduU2NyaXB0ID0gcmVkZWVtU2NyaXB0O1xuICAgIGlmIChleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIKSB7XG4gICAgICBzaWduU2NyaXB0ID0gcGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGV4cGFuZGVkLnB1YmtleXNbMF0gfSkub3V0cHV0ITtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVkZWVtU2NyaXB0LFxuICAgICAgcmVkZWVtU2NyaXB0VHlwZTogZXhwYW5kZWQudHlwZSxcblxuICAgICAgcHJldk91dFR5cGU6IFNDUklQVF9UWVBFUy5QMlNILFxuICAgICAgcHJldk91dFNjcmlwdDogcDJzaC5vdXRwdXQsXG5cbiAgICAgIHdpdG5lc3NWZXJzaW9uOiBleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIID8gMCA6IHVuZGVmaW5lZCxcbiAgICAgIHNpZ25TY3JpcHQsXG4gICAgICBzaWduVHlwZTogZXhwYW5kZWQudHlwZSxcblxuICAgICAgcHVia2V5czogZXhwYW5kZWQucHVia2V5cyxcbiAgICAgIHNpZ25hdHVyZXM6IGV4cGFuZGVkLnNpZ25hdHVyZXMsXG4gICAgICBtYXhTaWduYXR1cmVzOiBleHBhbmRlZC5tYXhTaWduYXR1cmVzLFxuICAgIH07XG4gIH1cblxuICBpZiAod2l0bmVzc1NjcmlwdCAmJiBjb250cm9sQmxvY2spIHtcbiAgICAvLyBQMlRSIFNjcmlwdFBhdGhcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGUgKi9cbiAgICBsZXQgcHJldk91dFNjcmlwdCA9IGlucHV0LnByZXZPdXRTY3JpcHQ7XG4gICAgaWYgKCFwcmV2T3V0U2NyaXB0KSB7XG4gICAgICBwcmV2T3V0U2NyaXB0ID0gcDJ0clBheW1lbnRzLnAydHIoXG4gICAgICAgIHtcbiAgICAgICAgICByZWRlZW1zOiBbeyBvdXRwdXQ6IHdpdG5lc3NTY3JpcHQgfV0sXG4gICAgICAgICAgcmVkZWVtSW5kZXg6IDAsXG4gICAgICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgICAgIGFubmV4LFxuICAgICAgICB9LFxuICAgICAgICB7IGVjY0xpYiB9XG4gICAgICApLm91dHB1dDtcbiAgICB9XG5cbiAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZE91dHB1dCh3aXRuZXNzU2NyaXB0LCBvdXJQdWJLZXkpO1xuICAgIGlmICghZXhwYW5kZWQucHVia2V5cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cGFuZGVkLnR5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgYXMgd2l0bmVzc1NjcmlwdCAoJyArIGJzY3JpcHQudG9BU00od2l0bmVzc1NjcmlwdCkgKyAnKScpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2lnbmF0dXJlcyAmJiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHgpID0+IHggIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIGV4cGFuZGVkLnNpZ25hdHVyZXMgPSBpbnB1dC5zaWduYXR1cmVzO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB3aXRuZXNzU2NyaXB0LFxuICAgICAgd2l0bmVzc1NjcmlwdFR5cGU6IGV4cGFuZGVkLnR5cGUsXG5cbiAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJUUixcbiAgICAgIHByZXZPdXRTY3JpcHQsXG5cbiAgICAgIHdpdG5lc3NWZXJzaW9uOiAxLFxuICAgICAgc2lnblNjcmlwdDogd2l0bmVzc1NjcmlwdCxcbiAgICAgIHNpZ25UeXBlOiBleHBhbmRlZC50eXBlLFxuXG4gICAgICBwdWJrZXlzOiBleHBhbmRlZC5wdWJrZXlzLFxuICAgICAgc2lnbmF0dXJlczogZXhwYW5kZWQuc2lnbmF0dXJlcyxcbiAgICAgIG1heFNpZ25hdHVyZXM6IGV4cGFuZGVkLm1heFNpZ25hdHVyZXMsXG5cbiAgICAgIGNvbnRyb2xCbG9jayxcbiAgICAgIGFubmV4LFxuICAgIH07XG4gIH1cblxuICBpZiAod2l0bmVzc1NjcmlwdCkge1xuICAgIGNvbnN0IHAyd3NoID0gcGF5bWVudHMucDJ3c2goeyByZWRlZW06IHsgb3V0cHV0OiB3aXRuZXNzU2NyaXB0IH0gfSk7XG5cbiAgICBpZiAoaW5wdXQucHJldk91dFNjcmlwdCkge1xuICAgICAgY29uc3QgcDJ3c2hBbHQgPSBwYXltZW50cy5wMndzaCh7IG91dHB1dDogaW5wdXQucHJldk91dFNjcmlwdCB9KTtcbiAgICAgIGlmICghcDJ3c2guaGFzaCEuZXF1YWxzKHAyd3NoQWx0Lmhhc2ghKSkgdGhyb3cgbmV3IEVycm9yKCdXaXRuZXNzIHNjcmlwdCBpbmNvbnNpc3RlbnQgd2l0aCBwcmV2T3V0U2NyaXB0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQocDJ3c2gucmVkZWVtIS5vdXRwdXQhLCBvdXJQdWJLZXkpO1xuICAgIGlmICghZXhwYW5kZWQucHVia2V5cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cGFuZGVkLnR5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgYXMgd2l0bmVzc1NjcmlwdCAoJyArIGJzY3JpcHQudG9BU00od2l0bmVzc1NjcmlwdCkgKyAnKScpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2lnbmF0dXJlcyAmJiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHgpID0+IHggIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIGV4cGFuZGVkLnNpZ25hdHVyZXMgPSBpbnB1dC5zaWduYXR1cmVzO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25TY3JpcHQgPSB3aXRuZXNzU2NyaXB0O1xuICAgIGlmIChleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIKSB0aHJvdyBuZXcgRXJyb3IoJ1AyV1NIKFAyV1BLSCkgaXMgYSBjb25zZW5zdXMgZmFpbHVyZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICB3aXRuZXNzU2NyaXB0VHlwZTogZXhwYW5kZWQudHlwZSxcblxuICAgICAgcHJldk91dFR5cGU6IFNDUklQVF9UWVBFUy5QMldTSCxcbiAgICAgIHByZXZPdXRTY3JpcHQ6IHAyd3NoLm91dHB1dCxcblxuICAgICAgd2l0bmVzc1ZlcnNpb246IDAsXG4gICAgICBzaWduU2NyaXB0LFxuICAgICAgc2lnblR5cGU6IGV4cGFuZGVkLnR5cGUsXG5cbiAgICAgIHB1YmtleXM6IGV4cGFuZGVkLnB1YmtleXMsXG4gICAgICBzaWduYXR1cmVzOiBleHBhbmRlZC5zaWduYXR1cmVzLFxuICAgICAgbWF4U2lnbmF0dXJlczogZXhwYW5kZWQubWF4U2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlucHV0LnByZXZPdXRUeXBlICYmIGlucHV0LnByZXZPdXRTY3JpcHQpIHtcbiAgICAvLyBlbWJlZGRlZCBzY3JpcHRzIGFyZSBub3QgcG9zc2libGUgd2l0aG91dCBleHRyYSBpbmZvcm1hdGlvblxuICAgIGlmIChpbnB1dC5wcmV2T3V0VHlwZSA9PT0gU0NSSVBUX1RZUEVTLlAyU0gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJldk91dFNjcmlwdCBpcyAnICsgaW5wdXQucHJldk91dFR5cGUgKyAnLCByZXF1aXJlcyByZWRlZW1TY3JpcHQnKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnByZXZPdXRUeXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXU0gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJldk91dFNjcmlwdCBpcyAnICsgaW5wdXQucHJldk91dFR5cGUgKyAnLCByZXF1aXJlcyB3aXRuZXNzU2NyaXB0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQoaW5wdXQucHJldk91dFNjcmlwdCwgb3VyUHViS2V5KTtcbiAgICBpZiAoIWV4cGFuZGVkLnB1YmtleXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihleHBhbmRlZC50eXBlICsgJyBub3Qgc3VwcG9ydGVkICgnICsgYnNjcmlwdC50b0FTTShpbnB1dC5wcmV2T3V0U2NyaXB0KSArICcpJyk7XG4gICAgfVxuICAgIGlmIChpbnB1dC5zaWduYXR1cmVzICYmIGlucHV0LnNpZ25hdHVyZXMuc29tZSgoeCkgPT4geCAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgZXhwYW5kZWQuc2lnbmF0dXJlcyA9IGlucHV0LnNpZ25hdHVyZXM7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25TY3JpcHQgPSBpbnB1dC5wcmV2T3V0U2NyaXB0O1xuICAgIGlmIChleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIKSB7XG4gICAgICBzaWduU2NyaXB0ID0gcGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGV4cGFuZGVkLnB1YmtleXNbMF0gfSkub3V0cHV0IGFzIEJ1ZmZlcjtcbiAgICB9XG5cbiAgICBsZXQgd2l0bmVzc1ZlcnNpb247XG4gICAgaWYgKGV4cGFuZGVkLnR5cGUgPT09IFNDUklQVF9UWVBFUy5QMldQS0gpIHtcbiAgICAgIHdpdG5lc3NWZXJzaW9uID0gMDtcbiAgICB9IGVsc2UgaWYgKGV4cGFuZGVkLnR5cGUgPT09IFNDUklQVF9UWVBFUy5QMlRSKSB7XG4gICAgICB3aXRuZXNzVmVyc2lvbiA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByZXZPdXRUeXBlOiBleHBhbmRlZC50eXBlLFxuICAgICAgcHJldk91dFNjcmlwdDogaW5wdXQucHJldk91dFNjcmlwdCxcblxuICAgICAgd2l0bmVzc1ZlcnNpb24sXG4gICAgICBzaWduU2NyaXB0LFxuICAgICAgc2lnblR5cGU6IGV4cGFuZGVkLnR5cGUsXG5cbiAgICAgIHB1YmtleXM6IGV4cGFuZGVkLnB1YmtleXMsXG4gICAgICBzaWduYXR1cmVzOiBleHBhbmRlZC5zaWduYXR1cmVzLFxuICAgICAgbWF4U2lnbmF0dXJlczogZXhwYW5kZWQubWF4U2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHJldk91dFNjcmlwdCA9IHBheW1lbnRzLnAycGtoKHsgcHVia2V5OiBvdXJQdWJLZXkgfSkub3V0cHV0O1xuICByZXR1cm4ge1xuICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJQS0gsXG4gICAgcHJldk91dFNjcmlwdCxcblxuICAgIHNpZ25TY3JpcHQ6IHByZXZPdXRTY3JpcHQsXG4gICAgc2lnblR5cGU6IFNDUklQVF9UWVBFUy5QMlBLSCxcblxuICAgIHB1YmtleXM6IFtvdXJQdWJLZXldLFxuICAgIHNpZ25hdHVyZXM6IFt1bmRlZmluZWRdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgdHlwZTogc3RyaW5nLFxuICBpbnB1dDogVHhiSW5wdXQ8VE51bWJlcj4sXG4gIGFsbG93SW5jb21wbGV0ZT86IGJvb2xlYW5cbik6IFBheW1lbnQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwdWJrZXlzID0gKGlucHV0LnB1YmtleXMgfHwgW10pIGFzIEJ1ZmZlcltdO1xuICBsZXQgc2lnbmF0dXJlcyA9IChpbnB1dC5zaWduYXR1cmVzIHx8IFtdKSBhcyBCdWZmZXJbXTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlBLSDoge1xuICAgICAgaWYgKHB1YmtleXMubGVuZ3RoID09PSAwKSBicmVhaztcbiAgICAgIGlmIChzaWduYXR1cmVzLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG5cbiAgICAgIHJldHVybiBwYXltZW50cy5wMnBraCh7IHB1YmtleTogcHVia2V5c1swXSwgc2lnbmF0dXJlOiBzaWduYXR1cmVzWzBdIH0pO1xuICAgIH1cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMldQS0g6IHtcbiAgICAgIGlmIChwdWJrZXlzLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPT09IDApIGJyZWFrO1xuXG4gICAgICByZXR1cm4gcGF5bWVudHMucDJ3cGtoKHsgcHVia2V5OiBwdWJrZXlzWzBdLCBzaWduYXR1cmU6IHNpZ25hdHVyZXNbMF0gfSk7XG4gICAgfVxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyUEs6IHtcbiAgICAgIGlmIChwdWJrZXlzLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPT09IDApIGJyZWFrO1xuXG4gICAgICByZXR1cm4gcGF5bWVudHMucDJwayh7IHNpZ25hdHVyZTogc2lnbmF0dXJlc1swXSB9KTtcbiAgICB9XG4gICAgY2FzZSBTQ1JJUFRfVFlQRVMuUDJNUzoge1xuICAgICAgY29uc3QgbSA9IGlucHV0Lm1heFNpZ25hdHVyZXM7XG4gICAgICBpZiAoYWxsb3dJbmNvbXBsZXRlKSB7XG4gICAgICAgIHNpZ25hdHVyZXMgPSBzaWduYXR1cmVzLm1hcCgoeCkgPT4geCB8fCBvcHMuT1BfMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWduYXR1cmVzID0gc2lnbmF0dXJlcy5maWx0ZXIoKHgpID0+IHgpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IG5vdCBjb21wbGV0ZSAoY29tcGxldGUpLCBvciBpZiBzaWduYXR1cmVzLmxlbmd0aCA9PT0gbSwgdmFsaWRhdGVcbiAgICAgIC8vIG90aGVyd2lzZSwgdGhlIG51bWJlciBvZiBPUF8wJ3MgbWF5IGJlID49IG0sIHNvIGRvbid0IHZhbGlkYXRlIChib28pXG4gICAgICBjb25zdCB2YWxpZGF0ZSA9ICFhbGxvd0luY29tcGxldGUgfHwgbSA9PT0gc2lnbmF0dXJlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gcGF5bWVudHMucDJtcyh7IG0sIHB1YmtleXMsIHNpZ25hdHVyZXMgfSwgeyBhbGxvd0luY29tcGxldGUsIHZhbGlkYXRlIH0pO1xuICAgIH1cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlNIOiB7XG4gICAgICBjb25zdCByZWRlZW0gPSBidWlsZDxUTnVtYmVyPihpbnB1dC5yZWRlZW1TY3JpcHRUeXBlISwgaW5wdXQsIGFsbG93SW5jb21wbGV0ZSk7XG4gICAgICBpZiAoIXJlZGVlbSkgcmV0dXJuO1xuXG4gICAgICByZXR1cm4gcGF5bWVudHMucDJzaCh7XG4gICAgICAgIHJlZGVlbToge1xuICAgICAgICAgIG91dHB1dDogcmVkZWVtLm91dHB1dCB8fCBpbnB1dC5yZWRlZW1TY3JpcHQsXG4gICAgICAgICAgaW5wdXQ6IHJlZGVlbS5pbnB1dCxcbiAgICAgICAgICB3aXRuZXNzOiByZWRlZW0ud2l0bmVzcyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMldTSDoge1xuICAgICAgY29uc3QgcmVkZWVtID0gYnVpbGQ8VE51bWJlcj4oaW5wdXQud2l0bmVzc1NjcmlwdFR5cGUhLCBpbnB1dCwgYWxsb3dJbmNvbXBsZXRlKTtcbiAgICAgIGlmICghcmVkZWVtKSByZXR1cm47XG5cbiAgICAgIHJldHVybiBwYXltZW50cy5wMndzaCh7XG4gICAgICAgIHJlZGVlbToge1xuICAgICAgICAgIG91dHB1dDogaW5wdXQud2l0bmVzc1NjcmlwdCxcbiAgICAgICAgICBpbnB1dDogcmVkZWVtLmlucHV0LFxuICAgICAgICAgIHdpdG5lc3M6IHJlZGVlbS53aXRuZXNzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyVFI6IHtcbiAgICAgIGlmIChpbnB1dC53aXRuZXNzU2NyaXB0VHlwZSA9PT0gU0NSSVBUX1RZUEVTLlAyVFJfTlMpIHtcbiAgICAgICAgLy8gU2NyaXB0UGF0aFxuICAgICAgICBjb25zdCByZWRlZW0gPSBidWlsZDxUTnVtYmVyPihpbnB1dC53aXRuZXNzU2NyaXB0VHlwZSEsIGlucHV0LCBhbGxvd0luY29tcGxldGUpO1xuICAgICAgICByZXR1cm4gcDJ0clBheW1lbnRzLnAydHIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3V0cHV0OiBpbnB1dC5wcmV2T3V0U2NyaXB0LFxuICAgICAgICAgICAgY29udHJvbEJsb2NrOiBpbnB1dC5jb250cm9sQmxvY2ssXG4gICAgICAgICAgICBhbm5leDogaW5wdXQuYW5uZXgsXG4gICAgICAgICAgICByZWRlZW1zOiBbcmVkZWVtIV0sXG4gICAgICAgICAgICByZWRlZW1JbmRleDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgZWNjTGliIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gS2V5UGF0aFxuICAgICAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID09PSAwKSBicmVhaztcblxuICAgICAgcmV0dXJuIHAydHJQYXltZW50cy5wMnRyKHsgcHVia2V5cywgc2lnbmF0dXJlOiBzaWduYXR1cmVzWzBdIH0sIHsgZWNjTGliIH0pO1xuICAgIH1cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlRSX05TOiB7XG4gICAgICBjb25zdCBtID0gaW5wdXQubWF4U2lnbmF0dXJlcztcbiAgICAgIGlmIChhbGxvd0luY29tcGxldGUpIHtcbiAgICAgICAgc2lnbmF0dXJlcyA9IHNpZ25hdHVyZXMubWFwKCh4KSA9PiB4IHx8IG9wcy5PUF8wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ25hdHVyZXMgPSBzaWduYXR1cmVzLmZpbHRlcigoeCkgPT4geCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBub3Qgbm90IGNvbXBsZXRlIChjb21wbGV0ZSksIG9yIGlmIHNpZ25hdHVyZXMubGVuZ3RoID09PSBtLCB2YWxpZGF0ZVxuICAgICAgLy8gb3RoZXJ3aXNlLCB0aGUgbnVtYmVyIG9mIE9QXzAncyBtYXkgYmUgPj0gbSwgc28gZG9uJ3QgdmFsaWRhdGUgKGJvbylcbiAgICAgIGNvbnN0IHZhbGlkYXRlID0gIWFsbG93SW5jb21wbGV0ZSB8fCBtID09PSBzaWduYXR1cmVzLmxlbmd0aDtcbiAgICAgIHJldHVybiBwMnRyUGF5bWVudHMucDJ0cl9ucyh7IHB1YmtleXMsIHNpZ25hdHVyZXMgfSwgeyBhbGxvd0luY29tcGxldGUsIHZhbGlkYXRlLCBlY2NMaWIgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhblNpZ248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oaW5wdXQ6IFR4YklucHV0PFROdW1iZXI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaW5wdXQuc2lnblNjcmlwdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgaW5wdXQuc2lnblR5cGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LnB1YmtleXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LnNpZ25hdHVyZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LnNpZ25hdHVyZXMubGVuZ3RoID09PSBpbnB1dC5wdWJrZXlzLmxlbmd0aCAmJlxuICAgIGlucHV0LnB1YmtleXMubGVuZ3RoID4gMCAmJlxuICAgIChpbnB1dC53aXRuZXNzVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGlucHV0LnZhbHVlICE9PSB1bmRlZmluZWQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hdHVyZUhhc2hUeXBlKGJ1ZmZlcjogQnVmZmVyKTogbnVtYmVyIHtcbiAgaWYgKGJzY3JpcHQuaXNDYW5vbmljYWxTY2hub3JyU2lnbmF0dXJlKGJ1ZmZlcikgJiYgYnVmZmVyLmxlbmd0aCA9PT0gNjQpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUO1xuICB9XG4gIHJldHVybiBidWZmZXIucmVhZFVJbnQ4KGJ1ZmZlci5sZW5ndGggLSAxKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tTaWduQXJnczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgaW5wdXRzOiBBcnJheTxUeGJJbnB1dDxUTnVtYmVyPj4sXG4gIHNpZ25QYXJhbXM6IFR4YlNpZ25Bcmc8VE51bWJlcj5cbik6IHZvaWQge1xuICBpZiAoIVBSRVZPVVRfVFlQRVMuaGFzKHNpZ25QYXJhbXMucHJldk91dFNjcmlwdFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBwcmV2T3V0U2NyaXB0VHlwZSBcIiR7c2lnblBhcmFtcy5wcmV2T3V0U2NyaXB0VHlwZX1cImApO1xuICB9XG4gIHRmTWVzc2FnZSh0eXBlZm9yY2UuTnVtYmVyLCBzaWduUGFyYW1zLnZpbiwgYHNpZ24gbXVzdCBpbmNsdWRlIHZpbiBwYXJhbWV0ZXIgYXMgTnVtYmVyIChpbnB1dCBpbmRleClgKTtcbiAgdGZNZXNzYWdlKHRmRnVsbFNpZ25lciwgc2lnblBhcmFtcy5rZXlQYWlyLCBgc2lnbiBtdXN0IGluY2x1ZGUga2V5UGFpciBwYXJhbWV0ZXIgYXMgU2lnbmVyIGludGVyZmFjZWApO1xuICB0Zk1lc3NhZ2UodHlwZWZvcmNlLm1heWJlKHR5cGVmb3JjZS5OdW1iZXIpLCBzaWduUGFyYW1zLmhhc2hUeXBlLCBgc2lnbiBoYXNoVHlwZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcmApO1xuICBjb25zdCBwcmV2T3V0VHlwZSA9IChpbnB1dHNbc2lnblBhcmFtcy52aW5dIHx8IFtdKS5wcmV2T3V0VHlwZTtcbiAgY29uc3QgcG9zVHlwZSA9IHNpZ25QYXJhbXMucHJldk91dFNjcmlwdFR5cGU7XG4gIHN3aXRjaCAocG9zVHlwZSkge1xuICAgIGNhc2UgJ3AycGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3B1YmtleWhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSBwMnBraDogJHtwcmV2T3V0VHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy53aXRuZXNzU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMucmVkZWVtU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyByZWRlZW1TY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy53aXRuZXNzVmFsdWUsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHdpdG5lc3NWYWx1ZWApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncDJwayc6XG4gICAgICBpZiAocHJldk91dFR5cGUgJiYgcHJldk91dFR5cGUgIT09ICdwdWJrZXknKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSBwMnBrOiAke3ByZXZPdXRUeXBlfWApO1xuICAgICAgfVxuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLndpdG5lc3NTY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy5yZWRlZW1TY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHJlZGVlbVNjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLndpdG5lc3NWYWx1ZSwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gd2l0bmVzc1ZhbHVlYCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwMndwa2gnOlxuICAgICAgaWYgKHByZXZPdXRUeXBlICYmIHByZXZPdXRUeXBlICE9PSAnd2l0bmVzc3B1YmtleWhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSBwMndwa2g6ICR7cHJldk91dFR5cGV9YCk7XG4gICAgICB9XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1NjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gd2l0bmVzc1NjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLnJlZGVlbVNjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gcmVkZWVtU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZXMuU2F0b3NoaSwgc2lnblBhcmFtcy53aXRuZXNzVmFsdWUsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHdpdG5lc3NWYWx1ZWApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncDJtcyc6XG4gICAgICBpZiAocHJldk91dFR5cGUgJiYgcHJldk91dFR5cGUgIT09ICdtdWx0aXNpZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW5wdXQgIyR7c2lnblBhcmFtcy52aW59IGlzIG5vdCBvZiB0eXBlIHAybXM6ICR7cHJldk91dFR5cGV9YCk7XG4gICAgICB9XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1NjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gd2l0bmVzc1NjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLnJlZGVlbVNjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gcmVkZWVtU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Ayc2gtcDJ3cGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3NjcmlwdGhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSBwMnNoLXAyd3BraDogJHtwcmV2T3V0VHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy53aXRuZXNzU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLkJ1ZmZlciwgc2lnblBhcmFtcy5yZWRlZW1TY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHJlZGVlbVNjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVzLlNhdG9zaGksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Ayc2gtcDJtcyc6XG4gICAgY2FzZSAncDJzaC1wMnBrJzpcbiAgICBjYXNlICdwMnNoLXAycGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3NjcmlwdGhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSAke3Bvc1R5cGV9OiAke3ByZXZPdXRUeXBlfWApO1xuICAgICAgfVxuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLndpdG5lc3NTY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UuQnVmZmVyLCBzaWduUGFyYW1zLnJlZGVlbVNjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgcmVkZWVtU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Ayd3NoLXAybXMnOlxuICAgIGNhc2UgJ3Ayd3NoLXAycGsnOlxuICAgIGNhc2UgJ3Ayd3NoLXAycGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3dpdG5lc3NzY3JpcHRoYXNoJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnB1dCAjJHtzaWduUGFyYW1zLnZpbn0gaXMgbm90IG9mIHR5cGUgJHtwb3NUeXBlfTogJHtwcmV2T3V0VHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UuQnVmZmVyLCBzaWduUGFyYW1zLndpdG5lc3NTY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy5yZWRlZW1TY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHJlZGVlbVNjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVzLlNhdG9zaGksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Ayc2gtcDJ3c2gtcDJtcyc6XG4gICAgY2FzZSAncDJzaC1wMndzaC1wMnBrJzpcbiAgICBjYXNlICdwMnNoLXAyd3NoLXAycGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3NjcmlwdGhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSAke3Bvc1R5cGV9OiAke3ByZXZPdXRUeXBlfWApO1xuICAgICAgfVxuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS5CdWZmZXIsIHNpZ25QYXJhbXMud2l0bmVzc1NjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgd2l0bmVzc1NjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS5CdWZmZXIsIHNpZ25QYXJhbXMucmVkZWVtU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyB3aXRuZXNzU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZXMuU2F0b3NoaSwgc2lnblBhcmFtcy53aXRuZXNzVmFsdWUsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3AydHInOlxuICAgICAgaWYgKHByZXZPdXRUeXBlICYmIHByZXZPdXRUeXBlICE9PSAndGFwcm9vdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW5wdXQgIyR7c2lnblBhcmFtcy52aW59IGlzIG5vdCBvZiB0eXBlICR7cG9zVHlwZX06ICR7cHJldk91dFR5cGV9YCk7XG4gICAgICB9XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1NjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gd2l0bmVzc1NjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLnJlZGVlbVNjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gcmVkZWVtU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3AydHItcDJucyc6XG4gICAgICBpZiAocHJldk91dFR5cGUgJiYgcHJldk91dFR5cGUgIT09ICd0YXByb290Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnB1dCAjJHtzaWduUGFyYW1zLnZpbn0gaXMgbm90IG9mIHR5cGUgJHtwb3NUeXBlfTogJHtwcmV2T3V0VHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIGlucHV0c1tzaWduUGFyYW1zLnZpbl0ucHJldk91dFR5cGUgPSBpbnB1dHNbc2lnblBhcmFtcy52aW5dLnByZXZPdXRUeXBlIHx8ICd0YXByb290JztcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UuQnVmZmVyLCBzaWduUGFyYW1zLndpdG5lc3NTY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UuQnVmZmVyLCBzaWduUGFyYW1zLmNvbnRyb2xCbG9jaywgYCR7cG9zVHlwZX0gcmVxdWlyZXMgY29udHJvbEJsb2NrYCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMucmVkZWVtU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyByZWRlZW1TY3JpcHRgKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVNpZ248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oe1xuICBpbnB1dCxcbiAgb3VyUHViS2V5LFxuICBrZXlQYWlyLFxuICBzaWduYXR1cmVIYXNoLFxuICBoYXNoVHlwZSxcbiAgdXNlTG93UixcbiAgdGFwdHJlZVJvb3QsXG59OiBTaWduaW5nRGF0YTxUTnVtYmVyPik6IHZvaWQge1xuICBpZiAoaW5wdXQud2l0bmVzc1ZlcnNpb24gPT09IDEgJiYgb3VyUHViS2V5Lmxlbmd0aCA9PT0gMzMpIG91clB1YktleSA9IG91clB1YktleS5zbGljZSgxKTtcbiAgLy8gZW5mb3JjZSBpbiBvcmRlciBzaWduaW5nIG9mIHB1YmxpYyBrZXlzXG4gIGxldCBzaWduZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaSwgcHViS2V5XSBvZiBpbnB1dC5wdWJrZXlzIS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoIW91clB1YktleS5lcXVhbHMocHViS2V5ISkpIGNvbnRpbnVlO1xuICAgIGlmIChpbnB1dC5zaWduYXR1cmVzIVtpXSAmJiBpbnB1dC5zaWduYXR1cmVzIVtpXSEubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdTaWduYXR1cmUgYWxyZWFkeSBleGlzdHMnKTtcblxuICAgIC8vIFRPRE86IGFkZCB0ZXN0c1xuICAgIGlmIChvdXJQdWJLZXkubGVuZ3RoICE9PSAzMyAmJiBpbnB1dC53aXRuZXNzVmVyc2lvbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCSVAxNDMgKFdpdG5lc3MgdjApIGlucHV0cyByZXF1aXJlIGNvbXByZXNzZWQgcHVia2V5cycpO1xuICAgIH0gZWxzZSBpZiAob3VyUHViS2V5Lmxlbmd0aCAhPT0gMzIgJiYgaW5wdXQud2l0bmVzc1ZlcnNpb24gPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQklQMzQxIChXaXRuZXNzIHYxKSBpbnB1dHMgcmVxdWlyZSB4LW9ubHkgcHVia2V5cycpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC53aXRuZXNzVmVyc2lvbiA9PT0gMSkge1xuICAgICAgaWYgKCFpbnB1dC53aXRuZXNzU2NyaXB0KSB7XG4gICAgICAgIC8vIEZJWE1FOiBXb3JrYXJvdW5kIGZvciBub3QgaGF2aW5nIHByb3BlciB0d2Vha2luZyBzdXBwb3J0IGZvciBrZXkgcGF0aFxuICAgICAgICBpZiAoIWtleVBhaXIucHJpdmF0ZUtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBrZXlwYWlyYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IHRhcHJvb3QudGFwVHdlYWtQcml2a2V5KGVjY0xpYiwgb3VyUHViS2V5LCBrZXlQYWlyLnByaXZhdGVLZXksIHRhcHRyZWVSb290KTtcbiAgICAgICAga2V5UGFpciA9IEVDUGFpci5mcm9tUHJpdmF0ZUtleShCdWZmZXIuZnJvbShwcml2YXRlS2V5KSk7XG4gICAgICB9XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQxLm1lZGlhd2lraSNjb21tb24tc2lnbmF0dXJlLW1lc3NhZ2VcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGtleVBhaXIuc2lnblNjaG5vcnIoc2lnbmF0dXJlSGFzaCk7XG4gICAgICAvLyBTSUdIQVNIX0RFRkFVTFQgaXMgb21pdHRlZCBmcm9tIHRoZSBzaWduYXR1cmVcbiAgICAgIGlmIChoYXNoVHlwZSA9PT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICAgIGlucHV0LnNpZ25hdHVyZXMhW2ldID0gQnVmZmVyLmZyb20oc2lnbmF0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LnNpZ25hdHVyZXMhW2ldID0gQnVmZmVyLmNvbmNhdChbc2lnbmF0dXJlLCBCdWZmZXIub2YoaGFzaFR5cGUpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGtleVBhaXIuc2lnbihzaWduYXR1cmVIYXNoLCB1c2VMb3dSKTtcbiAgICAgIGlucHV0LnNpZ25hdHVyZXMhW2ldID0gYnNjcmlwdC5zaWduYXR1cmUuZW5jb2RlKHNpZ25hdHVyZSwgaGFzaFR5cGUpO1xuICAgIH1cbiAgICBzaWduZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFzaWduZWQpIHRocm93IG5ldyBFcnJvcignS2V5IHBhaXIgY2Fubm90IHNpZ24gZm9yIHRoaXMgaW5wdXQnKTtcbn1cblxuaW50ZXJmYWNlIFNpZ25pbmdEYXRhPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgaW5wdXQ6IFR4YklucHV0PFROdW1iZXI+O1xuICBvdXJQdWJLZXk6IEJ1ZmZlcjtcbiAga2V5UGFpcjogU2lnbmVyO1xuICBzaWduYXR1cmVIYXNoOiBCdWZmZXI7XG4gIGhhc2hUeXBlOiBudW1iZXI7XG4gIHVzZUxvd1I6IGJvb2xlYW47XG4gIHRhcHRyZWVSb290PzogQnVmZmVyO1xufVxuXG50eXBlIEhhc2hUeXBlQ2hlY2sgPSAoaGFzaFR5cGU6IG51bWJlcikgPT4gYm9vbGVhbjtcblxuZnVuY3Rpb24gZ2V0U2lnbmluZ0RhdGE8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIGlucHV0czogQXJyYXk8VHhiSW5wdXQ8VE51bWJlcj4+LFxuICBuZWVkc091dHB1dHM6IEhhc2hUeXBlQ2hlY2ssXG4gIHR4OiBUcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgc2lnblBhcmFtczogbnVtYmVyIHwgVHhiU2lnbkFyZzxUTnVtYmVyPixcbiAga2V5UGFpcj86IFNpZ25lcixcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyLFxuICBoYXNoVHlwZT86IG51bWJlcixcbiAgd2l0bmVzc1ZhbHVlPzogVE51bWJlcixcbiAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcixcbiAgY29udHJvbEJsb2NrPzogQnVmZmVyLFxuICBhbm5leD86IEJ1ZmZlcixcbiAgdXNlTG93Uj86IGJvb2xlYW5cbik6IFNpZ25pbmdEYXRhPFROdW1iZXI+IHtcbiAgbGV0IHZpbjogbnVtYmVyO1xuICBpZiAodHlwZW9mIHNpZ25QYXJhbXMgPT09ICdudW1iZXInKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RFUFJFQ0FURUQ6IFRyYW5zYWN0aW9uQnVpbGRlciBzaWduIG1ldGhvZCBhcmd1bWVudHMgJyArICd3aWxsIGNoYW5nZSBpbiB2NiwgcGxlYXNlIHVzZSB0aGUgVHhiU2lnbkFyZyBpbnRlcmZhY2UnXG4gICAgKTtcbiAgICB2aW4gPSBzaWduUGFyYW1zO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzaWduUGFyYW1zID09PSAnb2JqZWN0Jykge1xuICAgIGNoZWNrU2lnbkFyZ3M8VE51bWJlcj4oaW5wdXRzLCBzaWduUGFyYW1zKTtcbiAgICAoeyB2aW4sIGtleVBhaXIsIHJlZGVlbVNjcmlwdCwgaGFzaFR5cGUsIHdpdG5lc3NWYWx1ZSwgd2l0bmVzc1NjcmlwdCwgY29udHJvbEJsb2NrLCBhbm5leCB9ID0gc2lnblBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJhbnNhY3Rpb25CdWlsZGVyIHNpZ24gZmlyc3QgYXJnIG11c3QgYmUgVHhiU2lnbkFyZyBvciBudW1iZXInKTtcbiAgfVxuICBpZiAoa2V5UGFpciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaWduIHJlcXVpcmVzIGtleXBhaXInKTtcbiAgfVxuICBpZiAoIWlucHV0c1t2aW5dKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGlucHV0IGF0IGluZGV4OiAnICsgdmluKTtcblxuICBjb25zdCBpbnB1dCA9IGlucHV0c1t2aW5dO1xuXG4gIC8vIGlmIHJlZGVlbVNjcmlwdCB3YXMgcHJldmlvdXNseSBwcm92aWRlZCwgZW5mb3JjZSBjb25zaXN0ZW5jeVxuICBpZiAoaW5wdXQucmVkZWVtU2NyaXB0ICE9PSB1bmRlZmluZWQgJiYgcmVkZWVtU2NyaXB0ICYmICFpbnB1dC5yZWRlZW1TY3JpcHQuZXF1YWxzKHJlZGVlbVNjcmlwdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29uc2lzdGVudCByZWRlZW1TY3JpcHQnKTtcbiAgfVxuXG4gIGNvbnN0IG91clB1YktleSA9IGtleVBhaXIucHVibGljS2V5IHx8IChrZXlQYWlyLmdldFB1YmxpY0tleSAmJiBrZXlQYWlyLmdldFB1YmxpY0tleSgpKTtcbiAgaWYgKCFjYW5TaWduPFROdW1iZXI+KGlucHV0KSkge1xuICAgIGlmICh3aXRuZXNzVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlucHV0LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgaW5wdXQudmFsdWUgIT09IHdpdG5lc3NWYWx1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IGRpZCBub3QgbWF0Y2ggd2l0bmVzc1ZhbHVlJyk7XG4gICAgICB9XG4gICAgICB0eXBlZm9yY2UodHlwZXMuU2F0b3NoaSwgd2l0bmVzc1ZhbHVlKTtcbiAgICAgIGlucHV0LnZhbHVlID0gd2l0bmVzc1ZhbHVlO1xuICAgIH1cblxuICAgIGlmICghY2FuU2lnbjxUTnVtYmVyPihpbnB1dCkpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkID0gcHJlcGFyZUlucHV0PFROdW1iZXI+KGlucHV0LCBvdXJQdWJLZXksIHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCwgY29udHJvbEJsb2NrLCBhbm5leCk7XG5cbiAgICAgIC8vIHVwZGF0ZXMgaW5saW5lXG4gICAgICBPYmplY3QuYXNzaWduKGlucHV0LCBwcmVwYXJlZCk7XG4gICAgfVxuXG4gICAgaWYgKCFjYW5TaWduPFROdW1iZXI+KGlucHV0KSkgdGhyb3cgRXJyb3IoaW5wdXQucHJldk91dFR5cGUgKyAnIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuXG4gIC8vIGhhc2hUeXBlIGNhbiBiZSAwIGluIFRhcHJvb3QsIHNvIGNhbid0IHVzZSBoYXNoVHlwZSB8fCBTSUdIQVNIX0FMTFxuICBpZiAoaW5wdXQud2l0bmVzc1ZlcnNpb24gPT09IDEpIHtcbiAgICBoYXNoVHlwZSA9IGhhc2hUeXBlID09PSB1bmRlZmluZWQgPyBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgOiBoYXNoVHlwZTtcbiAgfSBlbHNlIHtcbiAgICBoYXNoVHlwZSA9IGhhc2hUeXBlIHx8IFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMO1xuICB9XG4gIGlmIChuZWVkc091dHB1dHMoaGFzaFR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIG5lZWRzIG91dHB1dHMnKTtcblxuICAvLyBUT0RPOiBUaGlzIGlzIG5vdCB0aGUgYmVzdCBwbGFjZSB0byBkbyB0aGlzLCBidXQgbWlnaHQgc3RpY2sgd2l0aCBpdCB1bnRpbCBQU0JUXG4gIGxldCBsZWFmSGFzaDtcbiAgbGV0IHRhcHRyZWVSb290O1xuICBpZiAoY29udHJvbEJsb2NrICYmIHdpdG5lc3NTY3JpcHQpIHtcbiAgICBsZWFmSGFzaCA9IHRhcHJvb3QuZ2V0VGFwbGVhZkhhc2goZWNjTGliLCBjb250cm9sQmxvY2ssIHdpdG5lc3NTY3JpcHQpO1xuICAgIHRhcHRyZWVSb290ID0gdGFwcm9vdC5nZXRUYXB0cmVlUm9vdChlY2NMaWIsIGNvbnRyb2xCbG9jaywgd2l0bmVzc1NjcmlwdCwgbGVhZkhhc2gpO1xuICB9XG5cbiAgLy8gcmVhZHkgdG8gc2lnblxuICBsZXQgc2lnbmF0dXJlSGFzaDogQnVmZmVyO1xuICBzd2l0Y2ggKGlucHV0LndpdG5lc3NWZXJzaW9uKSB7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBzaWduYXR1cmVIYXNoID0gdHguaGFzaEZvclNpZ25hdHVyZSh2aW4sIGlucHV0LnNpZ25TY3JpcHQgYXMgQnVmZmVyLCBoYXNoVHlwZSwgaW5wdXQudmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAwOlxuICAgICAgc2lnbmF0dXJlSGFzaCA9IHR4Lmhhc2hGb3JXaXRuZXNzVjAodmluLCBpbnB1dC5zaWduU2NyaXB0IGFzIEJ1ZmZlciwgaW5wdXQudmFsdWUgYXMgVE51bWJlciwgaGFzaFR5cGUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc2lnbmF0dXJlSGFzaCA9IHR4Lmhhc2hGb3JXaXRuZXNzVjEoXG4gICAgICAgIHZpbixcbiAgICAgICAgaW5wdXRzLm1hcCgoeyBwcmV2T3V0U2NyaXB0IH0pID0+IHByZXZPdXRTY3JpcHQgYXMgQnVmZmVyKSxcbiAgICAgICAgaW5wdXRzLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSBhcyBUTnVtYmVyKSxcbiAgICAgICAgaGFzaFR5cGUsXG4gICAgICAgIGxlYWZIYXNoXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vuc3VwcG9ydGVkIHdpdG5lc3MgdmVyc2lvbicpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpbnB1dCxcbiAgICBvdXJQdWJLZXksXG4gICAga2V5UGFpcixcbiAgICBzaWduYXR1cmVIYXNoLFxuICAgIGhhc2hUeXBlLFxuICAgIHVzZUxvd1I6ICEhdXNlTG93UixcbiAgICB0YXB0cmVlUm9vdCxcbiAgfTtcbn1cbiJdfQ==
|