@bitgo-beta/unspents 0.13.2-beta.49 → 0.13.2-beta.491
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mocharc.js +1 -1
- package/CHANGELOG.md +455 -0
- package/bin/generate_tables.ts +94 -0
- package/dist/bin/generate_tables.d.ts +2 -0
- package/dist/bin/generate_tables.d.ts.map +1 -0
- package/dist/bin/generate_tables.js +98 -0
- package/dist/{codes.d.ts → src/codes.d.ts} +3 -2
- package/dist/src/codes.d.ts.map +1 -0
- package/dist/src/codes.js +172 -0
- package/dist/{dimensions.d.ts → src/dimensions.d.ts} +5 -3
- package/dist/src/dimensions.d.ts.map +1 -0
- package/dist/src/dimensions.js +492 -0
- package/dist/{index.d.ts → src/index.d.ts} +1 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -2
- package/dist/{inputWeights.d.ts → src/inputWeights.d.ts} +4 -3
- package/dist/src/inputWeights.d.ts.map +1 -0
- package/dist/src/inputWeights.js +97 -0
- package/dist/{scriptSizes.d.ts → src/scriptSizes.d.ts} +1 -0
- package/dist/src/scriptSizes.d.ts.map +1 -0
- package/dist/src/scriptSizes.js +51 -0
- package/dist/{types.d.ts → src/types.d.ts} +1 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/{types.js → src/types.js} +6 -2
- package/dist/{virtualSizes.d.ts → src/virtualSizes.d.ts} +13 -12
- package/dist/src/virtualSizes.d.ts.map +1 -0
- package/dist/src/virtualSizes.js +114 -0
- package/dist/src/zcash.d.ts +9 -0
- package/dist/src/zcash.d.ts.map +1 -0
- package/dist/src/zcash.js +24 -0
- package/dist/test/chain.d.ts +2 -0
- package/dist/test/chain.d.ts.map +1 -0
- package/dist/test/chain.js +92 -0
- package/dist/test/dimensions.d.ts +2 -0
- package/dist/test/dimensions.d.ts.map +1 -0
- package/dist/test/dimensions.js +225 -0
- package/dist/test/signedTx/inputWeights.d.ts +2 -0
- package/dist/test/signedTx/inputWeights.d.ts.map +1 -0
- package/dist/test/signedTx/inputWeights.js +117 -0
- package/dist/test/signedTx/txCombinations.d.ts +3 -0
- package/dist/test/signedTx/txCombinations.d.ts.map +1 -0
- package/dist/test/signedTx/txCombinations.js +120 -0
- package/dist/test/signedTx/txGen.d.ts +75 -0
- package/dist/test/signedTx/txGen.d.ts.map +1 -0
- package/dist/test/signedTx/txGen.js +223 -0
- package/dist/test/testutils.d.ts +36 -0
- package/dist/test/testutils.d.ts.map +1 -0
- package/dist/test/testutils.js +180 -0
- package/dist/test/virtualSizes.d.ts +2 -0
- package/dist/test/virtualSizes.d.ts.map +1 -0
- package/dist/test/virtualSizes.js +18 -0
- package/dist/test/zcash.d.ts +2 -0
- package/dist/test/zcash.d.ts.map +1 -0
- package/dist/test/zcash.js +60 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/input-costs.md +13 -0
- package/package.json +7 -7
- package/dist/codes.js +0 -168
- package/dist/dimensions.js +0 -485
- package/dist/inputWeights.js +0 -97
- package/dist/scriptSizes.js +0 -51
- package/dist/virtualSizes.js +0 -114
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
27
|
+
const should = __importStar(require("should"));
|
|
28
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
29
|
+
const { chainCodes, chainCodesP2sh, chainCodesP2shP2wsh, chainCodesP2tr, chainCodesP2trMusig2, chainCodesP2wsh } = utxo_lib_1.bitgo;
|
|
30
|
+
const src_1 = require("../src");
|
|
31
|
+
const testutils_1 = require("./testutils");
|
|
32
|
+
describe('Dimensions Attributes', function () {
|
|
33
|
+
it('has read-only nInputs and nOutputs', function () {
|
|
34
|
+
should.throws(() => (src_1.Dimensions.ZERO.nInputs = 1), /read-only/);
|
|
35
|
+
should.throws(() => (src_1.Dimensions.ZERO.nOutputs = 1), /read-only/);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('Output Dimensions', function () {
|
|
39
|
+
it('instantiates', function () {
|
|
40
|
+
const dims = new src_1.OutputDimensions({ size: 0, count: 0 });
|
|
41
|
+
should.throws(() => (dims.count += 1));
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('Dimensions Arithmetic', function () {
|
|
45
|
+
it('sums correctly', function () {
|
|
46
|
+
src_1.Dimensions.zero()
|
|
47
|
+
.plus({ nP2shInputs: 1 })
|
|
48
|
+
.should.eql(new src_1.Dimensions({
|
|
49
|
+
nP2shInputs: 1,
|
|
50
|
+
nP2shP2wshInputs: 0,
|
|
51
|
+
nP2wshInputs: 0,
|
|
52
|
+
nP2trKeypathInputs: 0,
|
|
53
|
+
nP2trScriptPathLevel1Inputs: 0,
|
|
54
|
+
nP2trScriptPathLevel2Inputs: 0,
|
|
55
|
+
nP2shP2pkInputs: 0,
|
|
56
|
+
outputs: { size: 0, count: 0 },
|
|
57
|
+
}));
|
|
58
|
+
const components = [
|
|
59
|
+
{ nP2shInputs: 1 },
|
|
60
|
+
{ nP2shP2wshInputs: 2 },
|
|
61
|
+
{ nP2wshInputs: 3 },
|
|
62
|
+
{ nP2trKeypathInputs: 4 },
|
|
63
|
+
{ nP2trScriptPathLevel1Inputs: 5 },
|
|
64
|
+
{ nP2trScriptPathLevel2Inputs: 6 },
|
|
65
|
+
{ outputs: { size: 23, count: 1 } },
|
|
66
|
+
{ outputs: { size: 44, count: 2 } },
|
|
67
|
+
{ outputs: { size: 0, count: 0 } },
|
|
68
|
+
];
|
|
69
|
+
components.forEach((component) => should.doesNotThrow(() => src_1.Dimensions.sum(component)));
|
|
70
|
+
const sum = components.reduce((a, b) => a.plus(b), src_1.Dimensions.zero());
|
|
71
|
+
sum.should.eql(src_1.Dimensions.sum(...components));
|
|
72
|
+
sum.should.eql(new src_1.Dimensions({
|
|
73
|
+
nP2shInputs: 1,
|
|
74
|
+
nP2shP2wshInputs: 2,
|
|
75
|
+
nP2wshInputs: 3,
|
|
76
|
+
nP2trKeypathInputs: 4,
|
|
77
|
+
nP2trScriptPathLevel1Inputs: 5,
|
|
78
|
+
nP2trScriptPathLevel2Inputs: 6,
|
|
79
|
+
nP2shP2pkInputs: 0,
|
|
80
|
+
outputs: { size: 67, count: 3 },
|
|
81
|
+
}));
|
|
82
|
+
sum.nOutputs.should.eql(sum.outputs.count);
|
|
83
|
+
});
|
|
84
|
+
it('provides some typical output sizes', function () {
|
|
85
|
+
[
|
|
86
|
+
[src_1.Dimensions.SingleOutput.p2sh, src_1.VirtualSizes.txP2shOutputSize],
|
|
87
|
+
[src_1.Dimensions.SingleOutput.p2shP2wsh, src_1.VirtualSizes.txP2shP2wshOutputSize],
|
|
88
|
+
[src_1.Dimensions.SingleOutput.p2wsh, src_1.VirtualSizes.txP2wshOutputSize],
|
|
89
|
+
[src_1.Dimensions.SingleOutput.p2pkh, src_1.VirtualSizes.txP2pkhOutputSize],
|
|
90
|
+
[src_1.Dimensions.SingleOutput.p2wpkh, src_1.VirtualSizes.txP2wpkhOutputSize],
|
|
91
|
+
[src_1.Dimensions.SingleOutput.p2tr, src_1.VirtualSizes.txP2trOutputSize],
|
|
92
|
+
].forEach(([dims, size]) => {
|
|
93
|
+
dims.getOutputsVSize().should.eql(size);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
it('prevents sum of invalid data', function () {
|
|
97
|
+
should.doesNotThrow(() => src_1.Dimensions.sum({ outputs: { count: 0, size: 0 } }));
|
|
98
|
+
should.doesNotThrow(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 1 } }));
|
|
99
|
+
should.throws(() => src_1.Dimensions.sum({ nOutputs: 1 }));
|
|
100
|
+
should.throws(() => src_1.Dimensions.sum({ nOutputs: 1, outputs: { count: 2, size: 1 } }));
|
|
101
|
+
// @ts-ignore
|
|
102
|
+
should.throws(() => src_1.Dimensions.sum({ nP2shInputs: 1 }, { nP2shInputs: 'foo' }));
|
|
103
|
+
should.throws(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 0 } }));
|
|
104
|
+
should.throws(() => src_1.Dimensions.sum({ outputs: { count: 0, size: 1 } }));
|
|
105
|
+
should.throws(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 1 } }, { outputs: { count: 1, size: 0 } }));
|
|
106
|
+
});
|
|
107
|
+
it('counts inputs correctly', function () {
|
|
108
|
+
Object.entries(src_1.Dimensions.SingleInput).forEach(([key, value]) => {
|
|
109
|
+
value.nInputs.should.eql(1, key);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
it('multiplies correctly', function () {
|
|
113
|
+
const d = new src_1.Dimensions({
|
|
114
|
+
nP2shInputs: 1,
|
|
115
|
+
nP2shP2wshInputs: 2,
|
|
116
|
+
nP2wshInputs: 3,
|
|
117
|
+
nP2trKeypathInputs: 4,
|
|
118
|
+
nP2trScriptPathLevel1Inputs: 5,
|
|
119
|
+
nP2trScriptPathLevel2Inputs: 6,
|
|
120
|
+
nP2shP2pkInputs: 7,
|
|
121
|
+
outputs: { count: 1, size: 22 },
|
|
122
|
+
}).times(3);
|
|
123
|
+
d.should.eql(new src_1.Dimensions({
|
|
124
|
+
nP2shInputs: 3,
|
|
125
|
+
nP2shP2wshInputs: 6,
|
|
126
|
+
nP2wshInputs: 9,
|
|
127
|
+
nP2trKeypathInputs: 12,
|
|
128
|
+
nP2trScriptPathLevel1Inputs: 15,
|
|
129
|
+
nP2trScriptPathLevel2Inputs: 18,
|
|
130
|
+
nP2shP2pkInputs: 21,
|
|
131
|
+
outputs: { count: 3, size: 66 },
|
|
132
|
+
}));
|
|
133
|
+
d.getNInputs().should.eql(84);
|
|
134
|
+
d.nInputs.should.eql(84);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('Dimensions from unspent types', function () {
|
|
138
|
+
it('determines unspent size according to chain', function () {
|
|
139
|
+
chainCodesP2sh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2shInputs: 1 })));
|
|
140
|
+
chainCodesP2shP2wsh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2shP2wshInputs: 1 })));
|
|
141
|
+
chainCodesP2wsh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2wshInputs: 1 })));
|
|
142
|
+
chainCodesP2tr.forEach((chain) => {
|
|
143
|
+
src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel2Inputs: 1 }));
|
|
144
|
+
src_1.Dimensions.fromUnspent({ chain }, { p2tr: { scriptPathLevel: 1 }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 }));
|
|
145
|
+
});
|
|
146
|
+
chainCodesP2trMusig2.forEach((chain) => {
|
|
147
|
+
src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 }));
|
|
148
|
+
src_1.Dimensions.fromUnspent({ chain }, { p2tr: { scriptPathLevel: undefined }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(src_1.Dimensions.sum({ nP2trKeypathInputs: 1 }));
|
|
149
|
+
});
|
|
150
|
+
src_1.Dimensions.fromUnspents(chainCodes.map((chain) => ({ chain }))).should.eql(new src_1.Dimensions({
|
|
151
|
+
nP2shP2wshInputs: 2,
|
|
152
|
+
nP2shInputs: 2,
|
|
153
|
+
nP2wshInputs: 2,
|
|
154
|
+
nP2trKeypathInputs: 0,
|
|
155
|
+
nP2trScriptPathLevel1Inputs: 2,
|
|
156
|
+
nP2trScriptPathLevel2Inputs: 2,
|
|
157
|
+
nP2shP2pkInputs: 0,
|
|
158
|
+
outputs: { count: 0, size: 0 },
|
|
159
|
+
}));
|
|
160
|
+
src_1.Dimensions.fromUnspents(chainCodes.map((chain) => ({ chain })), { p2tr: { scriptPathLevel: 1 }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(new src_1.Dimensions({
|
|
161
|
+
nP2shP2wshInputs: 2,
|
|
162
|
+
nP2shInputs: 2,
|
|
163
|
+
nP2wshInputs: 2,
|
|
164
|
+
nP2trKeypathInputs: 2,
|
|
165
|
+
nP2trScriptPathLevel1Inputs: 2,
|
|
166
|
+
nP2trScriptPathLevel2Inputs: 0,
|
|
167
|
+
nP2shP2pkInputs: 0,
|
|
168
|
+
outputs: { count: 0, size: 0 },
|
|
169
|
+
}));
|
|
170
|
+
});
|
|
171
|
+
it('calculates output dimensions dynamically', function () {
|
|
172
|
+
const expectedSizes = new Map([
|
|
173
|
+
[testutils_1.UnspentTypeScript2of3.p2sh, src_1.VirtualSizes.txP2shOutputSize],
|
|
174
|
+
[testutils_1.UnspentTypeScript2of3.p2shP2wsh, src_1.VirtualSizes.txP2shP2wshOutputSize],
|
|
175
|
+
[testutils_1.UnspentTypeScript2of3.p2wsh, src_1.VirtualSizes.txP2wshOutputSize],
|
|
176
|
+
[testutils_1.UnspentTypeScript2of3.p2tr, src_1.VirtualSizes.txP2trOutputSize],
|
|
177
|
+
[testutils_1.UnspentTypeScript2of3.p2trMusig2, src_1.VirtualSizes.txP2trOutputSize],
|
|
178
|
+
[testutils_1.UnspentTypeScript2of3.taprootKeyPathSpend, src_1.VirtualSizes.txP2trOutputSize],
|
|
179
|
+
[testutils_1.UnspentTypePubKeyHash.p2pkh, src_1.VirtualSizes.txP2pkhOutputSize],
|
|
180
|
+
[testutils_1.UnspentTypePubKeyHash.p2wpkh, src_1.VirtualSizes.txP2wpkhOutputSize],
|
|
181
|
+
]);
|
|
182
|
+
[...Object.keys(testutils_1.UnspentTypeScript2of3), ...Object.keys(testutils_1.UnspentTypePubKeyHash)].forEach((type) => (0, testutils_1.getOutputDimensionsForUnspentType)(type).outputs.size.should.eql(expectedSizes.get(type)));
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('Dimensions estimates', function () {
|
|
186
|
+
it('calculates vsizes', function () {
|
|
187
|
+
function dim(nP2shInputs, nP2shP2wshInputs, nP2wshInputs, nOutputs) {
|
|
188
|
+
return src_1.Dimensions.sum({
|
|
189
|
+
nP2shInputs,
|
|
190
|
+
nP2shP2wshInputs,
|
|
191
|
+
nP2wshInputs,
|
|
192
|
+
}, (0, testutils_1.getOutputDimensionsForUnspentType)(testutils_1.UnspentTypePubKeyHash.p2pkh).times(nOutputs));
|
|
193
|
+
}
|
|
194
|
+
function dimP2tr(nP2trKeypathInputs, nP2trScriptPathLevel1Inputs, nP2trScriptPathLevel2Inputs, nOutputs) {
|
|
195
|
+
return src_1.Dimensions.sum({
|
|
196
|
+
nP2trKeypathInputs,
|
|
197
|
+
nP2trScriptPathLevel1Inputs,
|
|
198
|
+
nP2trScriptPathLevel2Inputs,
|
|
199
|
+
}, (0, testutils_1.getOutputDimensionsForUnspentType)(testutils_1.UnspentTypePubKeyHash.p2pkh).times(nOutputs));
|
|
200
|
+
}
|
|
201
|
+
const vectors = [
|
|
202
|
+
[dim(1, 0, 0, 1), [false, 10, 298, 34, 342]],
|
|
203
|
+
[dim(0, 1, 0, 1), [true, 11, 140, 34, 185]],
|
|
204
|
+
[dim(0, 0, 1, 1), [true, 11, 105, 34, 150]],
|
|
205
|
+
[dim(2, 0, 0, 1), [false, 10, 596, 34, 640]],
|
|
206
|
+
[dim(0, 2, 0, 1), [true, 11, 280, 34, 325]],
|
|
207
|
+
[dim(0, 0, 2, 1), [true, 11, 210, 34, 255]],
|
|
208
|
+
[dim(1, 1, 1, 1), [true, 11, 543, 34, 588]],
|
|
209
|
+
[dim(1, 1, 1, 2), [true, 11, 543, 68, 622]],
|
|
210
|
+
[dimP2tr(1, 0, 0, 1), [true, 11, 58, 34, 103]],
|
|
211
|
+
[dimP2tr(0, 1, 0, 1), [true, 11, 108, 34, 153]],
|
|
212
|
+
[dimP2tr(0, 0, 1, 1), [true, 11, 116, 34, 161]],
|
|
213
|
+
];
|
|
214
|
+
vectors.forEach(([dimensions, props]) => {
|
|
215
|
+
[
|
|
216
|
+
dimensions.isSegwit(),
|
|
217
|
+
dimensions.getOverheadVSize(),
|
|
218
|
+
dimensions.getInputsVSize(),
|
|
219
|
+
dimensions.getOutputsVSize(),
|
|
220
|
+
dimensions.getVSize(),
|
|
221
|
+
].should.eql(props);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZGltZW5zaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQXNEO0FBQ3RELCtDQUFpQztBQUNqQyxtREFBNkM7QUFDN0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxHQUM5RyxnQkFBSyxDQUFDO0FBQ1IsZ0NBQW9FO0FBRXBFLDJDQUE4RztBQUU5RyxRQUFRLENBQUMsdUJBQXVCLEVBQUU7SUFDaEMsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBRSxnQkFBVSxDQUFDLElBQVksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFFLGdCQUFVLENBQUMsSUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLEVBQUUsQ0FBQyxjQUFjLEVBQUU7UUFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxzQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLHVC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QUE4QjtZQUN6QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUUzQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNoRCxDQUFDO1FBRUYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDdEM7Z0JBQ0UsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQkFDckIsVUFBVSxDQUFDLGdCQUFnQixFQUFFO2dCQUM3QixVQUFVLENBQUMsY0FBYyxFQUFFO2dCQUMzQixVQUFVLENBQUMsZUFBZSxFQUFFO2dCQUM1QixVQUFVLENBQUMsUUFBUSxFQUFFO2FBQ3RCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgYml0Z28gfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5jb25zdCB7IGNoYWluQ29kZXMsIGNoYWluQ29kZXNQMnNoLCBjaGFpbkNvZGVzUDJzaFAyd3NoLCBjaGFpbkNvZGVzUDJ0ciwgY2hhaW5Db2Rlc1AydHJNdXNpZzIsIGNoYWluQ29kZXNQMndzaCB9ID1cbiAgYml0Z287XG5pbXBvcnQgeyBEaW1lbnNpb25zLCBPdXRwdXREaW1lbnNpb25zLCBWaXJ0dWFsU2l6ZXMgfSBmcm9tICcuLi9zcmMnO1xuXG5pbXBvcnQgeyBnZXRPdXRwdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUsIFVuc3BlbnRUeXBlUHViS2V5SGFzaCwgVW5zcGVudFR5cGVTY3JpcHQyb2YzIH0gZnJvbSAnLi90ZXN0dXRpbHMnO1xuXG5kZXNjcmliZSgnRGltZW5zaW9ucyBBdHRyaWJ1dGVzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnaGFzIHJlYWQtb25seSBuSW5wdXRzIGFuZCBuT3V0cHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+ICgoRGltZW5zaW9ucy5aRVJPIGFzIGFueSkubklucHV0cyA9IDEpLCAvcmVhZC1vbmx5Lyk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiAoKERpbWVuc2lvbnMuWkVSTyBhcyBhbnkpLm5PdXRwdXRzID0gMSksIC9yZWFkLW9ubHkvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ091dHB1dCBEaW1lbnNpb25zJywgZnVuY3Rpb24gKCkge1xuICBpdCgnaW5zdGFudGlhdGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGRpbXMgPSBuZXcgT3V0cHV0RGltZW5zaW9ucyh7IHNpemU6IDAsIGNvdW50OiAwIH0pO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gKGRpbXMuY291bnQgKz0gMSkpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRGltZW5zaW9ucyBBcml0aG1ldGljJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc3VtcyBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgRGltZW5zaW9ucy56ZXJvKClcbiAgICAgIC5wbHVzKHsgblAyc2hJbnB1dHM6IDEgfSlcbiAgICAgIC5zaG91bGQuZXFsKFxuICAgICAgICBuZXcgRGltZW5zaW9ucyh7XG4gICAgICAgICAgblAyc2hJbnB1dHM6IDEsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogMCxcbiAgICAgICAgICBuUDJ3c2hJbnB1dHM6IDAsXG4gICAgICAgICAgblAydHJLZXlwYXRoSW5wdXRzOiAwLFxuICAgICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogMCxcbiAgICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDAsXG4gICAgICAgICAgblAyc2hQMnBrSW5wdXRzOiAwLFxuICAgICAgICAgIG91dHB1dHM6IHsgc2l6ZTogMCwgY291bnQ6IDAgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gW1xuICAgICAgeyBuUDJzaElucHV0czogMSB9LFxuICAgICAgeyBuUDJzaFAyd3NoSW5wdXRzOiAyIH0sXG4gICAgICB7IG5QMndzaElucHV0czogMyB9LFxuICAgICAgeyBuUDJ0cktleXBhdGhJbnB1dHM6IDQgfSxcbiAgICAgIHsgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiA1IH0sXG4gICAgICB7IG5QMnRyU2NyaXB0UGF0aExldmVsMklucHV0czogNiB9LFxuICAgICAgeyBvdXRwdXRzOiB7IHNpemU6IDIzLCBjb3VudDogMSB9IH0sXG4gICAgICB7IG91dHB1dHM6IHsgc2l6ZTogNDQsIGNvdW50OiAyIH0gfSxcbiAgICAgIHsgb3V0cHV0czogeyBzaXplOiAwLCBjb3VudDogMCB9IH0sXG4gICAgXTtcblxuICAgIGNvbXBvbmVudHMuZm9yRWFjaCgoY29tcG9uZW50KSA9PiBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IERpbWVuc2lvbnMuc3VtKGNvbXBvbmVudCkpKTtcblxuICAgIGNvbnN0IHN1bSA9IGNvbXBvbmVudHMucmVkdWNlKChhLCBiKSA9PiBhLnBsdXMoYiksIERpbWVuc2lvbnMuemVybygpKTtcblxuICAgIHN1bS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKC4uLmNvbXBvbmVudHMpKTtcblxuICAgIHN1bS5zaG91bGQuZXFsKFxuICAgICAgbmV3IERpbWVuc2lvbnMoe1xuICAgICAgICBuUDJzaElucHV0czogMSxcbiAgICAgICAgblAyc2hQMndzaElucHV0czogMixcbiAgICAgICAgblAyd3NoSW5wdXRzOiAzLFxuICAgICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IDQsXG4gICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogNSxcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiA2LFxuICAgICAgICBuUDJzaFAycGtJbnB1dHM6IDAsXG4gICAgICAgIG91dHB1dHM6IHsgc2l6ZTogNjcsIGNvdW50OiAzIH0sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBzdW0ubk91dHB1dHMuc2hvdWxkLmVxbChzdW0ub3V0cHV0cy5jb3VudCk7XG4gIH0pO1xuXG4gIGl0KCdwcm92aWRlcyBzb21lIHR5cGljYWwgb3V0cHV0IHNpemVzJywgZnVuY3Rpb24gKCkge1xuICAgIChcbiAgICAgIFtcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAyc2gsIFZpcnR1YWxTaXplcy50eFAyc2hPdXRwdXRTaXplXSxcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAyc2hQMndzaCwgVmlydHVhbFNpemVzLnR4UDJzaFAyd3NoT3V0cHV0U2l6ZV0sXG4gICAgICAgIFtEaW1lbnNpb25zLlNpbmdsZU91dHB1dC5wMndzaCwgVmlydHVhbFNpemVzLnR4UDJ3c2hPdXRwdXRTaXplXSxcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAycGtoLCBWaXJ0dWFsU2l6ZXMudHhQMnBraE91dHB1dFNpemVdLFxuICAgICAgICBbRGltZW5zaW9ucy5TaW5nbGVPdXRwdXQucDJ3cGtoLCBWaXJ0dWFsU2l6ZXMudHhQMndwa2hPdXRwdXRTaXplXSxcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAydHIsIFZpcnR1YWxTaXplcy50eFAydHJPdXRwdXRTaXplXSxcbiAgICAgIF0gYXMgW0RpbWVuc2lvbnMsIG51bWJlcl1bXVxuICAgICkuZm9yRWFjaCgoW2RpbXMsIHNpemVdKSA9PiB7XG4gICAgICBkaW1zLmdldE91dHB1dHNWU2l6ZSgpLnNob3VsZC5lcWwoc2l6ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdwcmV2ZW50cyBzdW0gb2YgaW52YWxpZCBkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAwLCBzaXplOiAwIH0gfSkpO1xuICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAxIH0gfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBuT3V0cHV0czogMSB9KSk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBEaW1lbnNpb25zLnN1bSh7IG5PdXRwdXRzOiAxLCBvdXRwdXRzOiB7IGNvdW50OiAyLCBzaXplOiAxIH0gfSkpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IERpbWVuc2lvbnMuc3VtKHsgblAyc2hJbnB1dHM6IDEgfSwgeyBuUDJzaElucHV0czogJ2ZvbycgfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAwIH0gfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAwLCBzaXplOiAxIH0gfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAxIH0gfSwgeyBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAwIH0gfSkpO1xuICB9KTtcblxuICBpdCgnY291bnRzIGlucHV0cyBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoRGltZW5zaW9ucy5TaW5nbGVJbnB1dCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICB2YWx1ZS5uSW5wdXRzLnNob3VsZC5lcWwoMSwga2V5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ211bHRpcGxpZXMgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGQgPSBuZXcgRGltZW5zaW9ucyh7XG4gICAgICBuUDJzaElucHV0czogMSxcbiAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDIsXG4gICAgICBuUDJ3c2hJbnB1dHM6IDMsXG4gICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IDQsXG4gICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDUsXG4gICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDYsXG4gICAgICBuUDJzaFAycGtJbnB1dHM6IDcsXG4gICAgICBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAyMiB9LFxuICAgIH0pLnRpbWVzKDMpO1xuXG4gICAgZC5zaG91bGQuZXFsKFxuICAgICAgbmV3IERpbWVuc2lvbnMoe1xuICAgICAgICBuUDJzaElucHV0czogMyxcbiAgICAgICAgblAyc2hQMndzaElucHV0czogNixcbiAgICAgICAgblAyd3NoSW5wdXRzOiA5LFxuICAgICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IDEyLFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDE1LFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDE4LFxuICAgICAgICBuUDJzaFAycGtJbnB1dHM6IDIxLFxuICAgICAgICBvdXRwdXRzOiB7IGNvdW50OiAzLCBzaXplOiA2NiB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgZC5nZXROSW5wdXRzKCkuc2hvdWxkLmVxbCg4NCk7XG4gICAgZC5uSW5wdXRzLnNob3VsZC5lcWwoODQpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRGltZW5zaW9ucyBmcm9tIHVuc3BlbnQgdHlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdkZXRlcm1pbmVzIHVuc3BlbnQgc2l6ZSBhY2NvcmRpbmcgdG8gY2hhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgY2hhaW5Db2Rlc1Ayc2guZm9yRWFjaCgoY2hhaW4pID0+IERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoeyBjaGFpbiB9KS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAyc2hJbnB1dHM6IDEgfSkpKTtcblxuICAgIGNoYWluQ29kZXNQMnNoUDJ3c2guZm9yRWFjaCgoY2hhaW4pID0+XG4gICAgICBEaW1lbnNpb25zLmZyb21VbnNwZW50KHsgY2hhaW4gfSkuc2hvdWxkLmVxbChEaW1lbnNpb25zLnN1bSh7IG5QMnNoUDJ3c2hJbnB1dHM6IDEgfSkpXG4gICAgKTtcblxuICAgIGNoYWluQ29kZXNQMndzaC5mb3JFYWNoKChjaGFpbikgPT5cbiAgICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoeyBjaGFpbiB9KS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAyd3NoSW5wdXRzOiAxIH0pKVxuICAgICk7XG5cbiAgICBjaGFpbkNvZGVzUDJ0ci5mb3JFYWNoKChjaGFpbikgPT4ge1xuICAgICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudCh7IGNoYWluIH0pLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oeyBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDEgfSkpO1xuICAgICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudChcbiAgICAgICAgeyBjaGFpbiB9LFxuICAgICAgICB7IHAydHI6IHsgc2NyaXB0UGF0aExldmVsOiAxIH0sIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSB9XG4gICAgICApLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oeyBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDEgfSkpO1xuICAgIH0pO1xuXG4gICAgY2hhaW5Db2Rlc1AydHJNdXNpZzIuZm9yRWFjaCgoY2hhaW4pID0+IHtcbiAgICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoeyBjaGFpbiB9KS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiAxIH0pKTtcbiAgICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoXG4gICAgICAgIHsgY2hhaW4gfSxcbiAgICAgICAgeyBwMnRyOiB7IHNjcmlwdFBhdGhMZXZlbDogdW5kZWZpbmVkIH0sIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSB9XG4gICAgICApLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oeyBuUDJ0cktleXBhdGhJbnB1dHM6IDEgfSkpO1xuICAgIH0pO1xuXG4gICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudHMoY2hhaW5Db2Rlcy5tYXAoKGNoYWluKSA9PiAoeyBjaGFpbiB9KSkpLnNob3VsZC5lcWwoXG4gICAgICBuZXcgRGltZW5zaW9ucyh7XG4gICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMnNoSW5wdXRzOiAyLFxuICAgICAgICBuUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMnRyS2V5cGF0aElucHV0czogMCxcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiAyLFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDIsXG4gICAgICAgIG5QMnNoUDJwa0lucHV0czogMCxcbiAgICAgICAgb3V0cHV0czogeyBjb3VudDogMCwgc2l6ZTogMCB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudHMoXG4gICAgICBjaGFpbkNvZGVzLm1hcCgoY2hhaW4pID0+ICh7IGNoYWluIH0pKSxcbiAgICAgIHsgcDJ0cjogeyBzY3JpcHRQYXRoTGV2ZWw6IDEgfSwgcDJ0ck11c2lnMjogeyBzY3JpcHRQYXRoTGV2ZWw6IHVuZGVmaW5lZCB9IH1cbiAgICApLnNob3VsZC5lcWwoXG4gICAgICBuZXcgRGltZW5zaW9ucyh7XG4gICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMnNoSW5wdXRzOiAyLFxuICAgICAgICBuUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMnRyS2V5cGF0aElucHV0czogMixcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiAyLFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDAsXG4gICAgICAgIG5QMnNoUDJwa0lucHV0czogMCxcbiAgICAgICAgb3V0cHV0czogeyBjb3VudDogMCwgc2l6ZTogMCB9LFxuICAgICAgfSlcbiAgICApO1xuICB9KTtcblxuICBpdCgnY2FsY3VsYXRlcyBvdXRwdXQgZGltZW5zaW9ucyBkeW5hbWljYWxseScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBleHBlY3RlZFNpemVzID0gbmV3IE1hcChbXG4gICAgICBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2gsIFZpcnR1YWxTaXplcy50eFAyc2hPdXRwdXRTaXplXSxcbiAgICAgIFtVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJzaFAyd3NoLCBWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hPdXRwdXRTaXplXSxcbiAgICAgIFtVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ3c2gsIFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZV0sXG4gICAgICBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHIsIFZpcnR1YWxTaXplcy50eFAydHJPdXRwdXRTaXplXSxcbiAgICAgIFtVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ0ck11c2lnMiwgVmlydHVhbFNpemVzLnR4UDJ0ck91dHB1dFNpemVdLFxuICAgICAgW1Vuc3BlbnRUeXBlU2NyaXB0Mm9mMy50YXByb290S2V5UGF0aFNwZW5kLCBWaXJ0dWFsU2l6ZXMudHhQMnRyT3V0cHV0U2l6ZV0sXG4gICAgICBbVW5zcGVudFR5cGVQdWJLZXlIYXNoLnAycGtoLCBWaXJ0dWFsU2l6ZXMudHhQMnBraE91dHB1dFNpemVdLFxuICAgICAgW1Vuc3BlbnRUeXBlUHViS2V5SGFzaC5wMndwa2gsIFZpcnR1YWxTaXplcy50eFAyd3BraE91dHB1dFNpemVdLFxuICAgIF0pO1xuXG4gICAgWy4uLk9iamVjdC5rZXlzKFVuc3BlbnRUeXBlU2NyaXB0Mm9mMyksIC4uLk9iamVjdC5rZXlzKFVuc3BlbnRUeXBlUHViS2V5SGFzaCldLmZvckVhY2goKHR5cGUpID0+XG4gICAgICBnZXRPdXRwdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUodHlwZSkub3V0cHV0cy5zaXplLnNob3VsZC5lcWwoZXhwZWN0ZWRTaXplcy5nZXQodHlwZSBhcyBhbnkpKVxuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdEaW1lbnNpb25zIGVzdGltYXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2NhbGN1bGF0ZXMgdnNpemVzJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGRpbShuUDJzaElucHV0czogbnVtYmVyLCBuUDJzaFAyd3NoSW5wdXRzOiBudW1iZXIsIG5QMndzaElucHV0czogbnVtYmVyLCBuT3V0cHV0czogbnVtYmVyKTogRGltZW5zaW9ucyB7XG4gICAgICByZXR1cm4gRGltZW5zaW9ucy5zdW0oXG4gICAgICAgIHtcbiAgICAgICAgICBuUDJzaElucHV0cyxcbiAgICAgICAgICBuUDJzaFAyd3NoSW5wdXRzLFxuICAgICAgICAgIG5QMndzaElucHV0cyxcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKFVuc3BlbnRUeXBlUHViS2V5SGFzaC5wMnBraCkudGltZXMobk91dHB1dHMpXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpbVAydHIoXG4gICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IG51bWJlcixcbiAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogbnVtYmVyLFxuICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiBudW1iZXIsXG4gICAgICBuT3V0cHV0czogbnVtYmVyXG4gICAgKTogRGltZW5zaW9ucyB7XG4gICAgICByZXR1cm4gRGltZW5zaW9ucy5zdW0oXG4gICAgICAgIHtcbiAgICAgICAgICBuUDJ0cktleXBhdGhJbnB1dHMsXG4gICAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzLFxuICAgICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMklucHV0cyxcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKFVuc3BlbnRUeXBlUHViS2V5SGFzaC5wMnBraCkudGltZXMobk91dHB1dHMpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZlY3RvcnM6IFtEaW1lbnNpb25zLCB1bmtub3duW11dW10gPSBbXG4gICAgICBbZGltKDEsIDAsIDAsIDEpLCBbZmFsc2UsIDEwLCAyOTgsIDM0LCAzNDJdXSxcbiAgICAgIFtkaW0oMCwgMSwgMCwgMSksIFt0cnVlLCAxMSwgMTQwLCAzNCwgMTg1XV0sXG4gICAgICBbZGltKDAsIDAsIDEsIDEpLCBbdHJ1ZSwgMTEsIDEwNSwgMzQsIDE1MF1dLFxuICAgICAgW2RpbSgyLCAwLCAwLCAxKSwgW2ZhbHNlLCAxMCwgNTk2LCAzNCwgNjQwXV0sXG4gICAgICBbZGltKDAsIDIsIDAsIDEpLCBbdHJ1ZSwgMTEsIDI4MCwgMzQsIDMyNV1dLFxuICAgICAgW2RpbSgwLCAwLCAyLCAxKSwgW3RydWUsIDExLCAyMTAsIDM0LCAyNTVdXSxcbiAgICAgIFtkaW0oMSwgMSwgMSwgMSksIFt0cnVlLCAxMSwgNTQzLCAzNCwgNTg4XV0sXG4gICAgICBbZGltKDEsIDEsIDEsIDIpLCBbdHJ1ZSwgMTEsIDU0MywgNjgsIDYyMl1dLFxuXG4gICAgICBbZGltUDJ0cigxLCAwLCAwLCAxKSwgW3RydWUsIDExLCA1OCwgMzQsIDEwM11dLFxuICAgICAgW2RpbVAydHIoMCwgMSwgMCwgMSksIFt0cnVlLCAxMSwgMTA4LCAzNCwgMTUzXV0sXG4gICAgICBbZGltUDJ0cigwLCAwLCAxLCAxKSwgW3RydWUsIDExLCAxMTYsIDM0LCAxNjFdXSxcbiAgICBdO1xuXG4gICAgdmVjdG9ycy5mb3JFYWNoKChbZGltZW5zaW9ucywgcHJvcHNdKSA9PiB7XG4gICAgICBbXG4gICAgICAgIGRpbWVuc2lvbnMuaXNTZWd3aXQoKSxcbiAgICAgICAgZGltZW5zaW9ucy5nZXRPdmVyaGVhZFZTaXplKCksXG4gICAgICAgIGRpbWVuc2lvbnMuZ2V0SW5wdXRzVlNpemUoKSxcbiAgICAgICAgZGltZW5zaW9ucy5nZXRPdXRwdXRzVlNpemUoKSxcbiAgICAgICAgZGltZW5zaW9ucy5nZXRWU2l6ZSgpLFxuICAgICAgXS5zaG91bGQuZXFsKHByb3BzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputWeights.d.ts","sourceRoot":"","sources":["../../../test/signedTx/inputWeights.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const assert = __importStar(require("assert"));
|
|
27
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
28
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
29
|
+
const inputWeights_1 = require("../../src/inputWeights");
|
|
30
|
+
const scriptSizes_1 = require("../../src/scriptSizes");
|
|
31
|
+
const testutils_1 = require("../testutils");
|
|
32
|
+
describe('Input Script Sizes (Worst-Case)', function () {
|
|
33
|
+
const keys = [1, 2, 3].map((v) => utxo_lib_1.bip32.fromSeed(Buffer.alloc(16, `test/${v}`)));
|
|
34
|
+
const rootWalletKeys = new utxolib.bitgo.RootWalletKeys([keys[0], keys[1], keys[2]]);
|
|
35
|
+
function getLargestInputWithType(inputType, signKeys, inputCount = 100) {
|
|
36
|
+
const signerName = signKeys[0];
|
|
37
|
+
const cosignerName = signKeys.length > 1 ? signKeys[1] : signerName;
|
|
38
|
+
const inputScriptTypes = Array.from({ length: inputCount }).fill(inputType);
|
|
39
|
+
const outputScriptTypes = [testutils_1.UnspentTypeScript2of3.p2sh];
|
|
40
|
+
return (0, testutils_1.getSignedTransaction)(rootWalletKeys, signerName, cosignerName, inputScriptTypes, outputScriptTypes).ins.reduce((a, b) => ((0, inputWeights_1.getInputWeight)(a) > (0, inputWeights_1.getInputWeight)(b) ? a : b));
|
|
41
|
+
}
|
|
42
|
+
function getInputComponents(input) {
|
|
43
|
+
const decompiled = utxolib.script.decompile(input.script);
|
|
44
|
+
if (!decompiled) {
|
|
45
|
+
throw new Error();
|
|
46
|
+
}
|
|
47
|
+
const script = decompiled.map((v) => {
|
|
48
|
+
if (!Buffer.isBuffer(v)) {
|
|
49
|
+
return { length: 1 };
|
|
50
|
+
}
|
|
51
|
+
return { length: v.length + (0, scriptSizes_1.pushdataEncodingLength)(v.length) };
|
|
52
|
+
});
|
|
53
|
+
const witness = (input.witness || []).map((v) => ({ length: v.length }));
|
|
54
|
+
const scriptSize = script.reduce((a, b) => a + b.length, 0);
|
|
55
|
+
assert.strictEqual(scriptSize, input.script.length, utxolib.script.toASM(decompiled));
|
|
56
|
+
return {
|
|
57
|
+
script: script.map((v) => v.length),
|
|
58
|
+
witness: witness.map((v) => v.length),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function runTestComponentSizes(inputType, signKeys) {
|
|
62
|
+
const signKeysStr = signKeys.join(',');
|
|
63
|
+
describe(`inputType=${inputType} signKeys=${signKeysStr}`, function () {
|
|
64
|
+
it(`component sizes`, function () {
|
|
65
|
+
this.timeout(10000);
|
|
66
|
+
let expectedComponents;
|
|
67
|
+
switch (inputType) {
|
|
68
|
+
case 'p2sh':
|
|
69
|
+
expectedComponents = inputWeights_1.inputComponentsP2sh;
|
|
70
|
+
break;
|
|
71
|
+
case 'p2shP2wsh':
|
|
72
|
+
expectedComponents = inputWeights_1.inputComponentsP2shP2wsh;
|
|
73
|
+
break;
|
|
74
|
+
case 'p2wsh':
|
|
75
|
+
expectedComponents = inputWeights_1.inputComponentsP2wsh;
|
|
76
|
+
break;
|
|
77
|
+
case 'p2shP2pk':
|
|
78
|
+
expectedComponents = inputWeights_1.inputComponentsP2shP2pk;
|
|
79
|
+
break;
|
|
80
|
+
case 'p2tr':
|
|
81
|
+
if (signKeys[1] === 'bitgo') {
|
|
82
|
+
expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel1;
|
|
83
|
+
}
|
|
84
|
+
else if (signKeys[1] === 'backup') {
|
|
85
|
+
expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel2;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
throw new Error(`unexpected cosigner`);
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case 'p2trMusig2':
|
|
92
|
+
// assumes only script path
|
|
93
|
+
expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel1;
|
|
94
|
+
break;
|
|
95
|
+
case 'taprootKeyPathSpend':
|
|
96
|
+
expectedComponents = inputWeights_1.inputComponentsP2trKeySpend;
|
|
97
|
+
break;
|
|
98
|
+
default:
|
|
99
|
+
throw new Error(`invalid inputType ${inputType}`);
|
|
100
|
+
}
|
|
101
|
+
const input = getLargestInputWithType(inputType, signKeys, inputType === 'p2tr' || inputType === 'p2trMusig2' || inputType === 'taprootKeyPathSpend' ? 10 : 100);
|
|
102
|
+
const components = getInputComponents(input);
|
|
103
|
+
assert.deepStrictEqual(components, expectedComponents);
|
|
104
|
+
assert.strictEqual((0, inputWeights_1.getInputComponentsWeight)(components), (0, inputWeights_1.getInputWeight)(input));
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
(0, testutils_1.getInputScriptTypes)().forEach((inputType) => {
|
|
109
|
+
if (inputType !== 'p2trMusig2') {
|
|
110
|
+
runTestComponentSizes(inputType, inputType === 'p2shP2pk' ? ['user'] : ['user', 'bitgo']);
|
|
111
|
+
}
|
|
112
|
+
if (inputType !== 'p2shP2pk' && inputType !== 'taprootKeyPathSpend') {
|
|
113
|
+
runTestComponentSizes(inputType, ['user', 'backup']);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRXZWlnaHRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9zaWduZWRUeC9pbnB1dFdlaWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUdqQyw4REFBZ0Q7QUFDaEQsbURBQTZEO0FBQzdELHlEQVdnQztBQUNoQyx1REFBK0Q7QUFDL0QsNENBTXNCO0FBRXRCLFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRTtJQUMxQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBcUIsQ0FBQztJQUNyRyxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJGLFNBQVMsdUJBQXVCLENBQzlCLFNBQWlCLEVBQ2pCLFFBQWlDLEVBQ2pDLFVBQVUsR0FBRyxHQUFHO1FBRWhCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FB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Q0FBQztJQUVELElBQUEsK0JBQW1CLEdBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFpQixFQUFFLEVBQUU7UUFDbEQsSUFBSSxTQUFTLEtBQUssWUFBWSxFQUFFO1lBQzlCLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzNGO1FBQ0QsSUFBSSxTQUFTLEtBQUssVUFBVSxJQUFJLFNBQVMsS0FBSyxxQkFBcUIsRUFBRTtZQUNuRSxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUN0RDtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgbW9jaGEgZnJvbSAnbW9jaGEnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQge1xuICBnZXRJbnB1dENvbXBvbmVudHNXZWlnaHQsXG4gIGdldElucHV0V2VpZ2h0LFxuICBJbnB1dENvbXBvbmVudHMsXG4gIGlucHV0Q29tcG9uZW50c1Ayc2gsXG4gIGlucHV0Q29tcG9uZW50c1Ayc2hQMnBrLFxuICBpbnB1dENvbXBvbmVudHNQMnNoUDJ3c2gsXG4gIGlucHV0Q29tcG9uZW50c1AydHJLZXlTcGVuZCxcbiAgaW5wdXRDb21wb25lbnRzUDJ0clNjcmlwdFNwZW5kTGV2ZWwxLFxuICBpbnB1dENvbXBvbmVudHNQMnRyU2NyaXB0U3BlbmRMZXZlbDIsXG4gIGlucHV0Q29tcG9uZW50c1Ayd3NoLFxufSBmcm9tICcuLi8uLi9zcmMvaW5wdXRXZWlnaHRzJztcbmltcG9ydCB7IHB1c2hkYXRhRW5jb2RpbmdMZW5ndGggfSBmcm9tICcuLi8uLi9zcmMvc2NyaXB0U2l6ZXMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5wdXRTY3JpcHRUeXBlcyxcbiAgZ2V0U2lnbmVkVHJhbnNhY3Rpb24sXG4gIElucHV0U2NyaXB0VHlwZSxcbiAgVGVzdFVuc3BlbnRUeXBlLFxuICBVbnNwZW50VHlwZVNjcmlwdDJvZjMsXG59IGZyb20gJy4uL3Rlc3R1dGlscyc7XG5cbmRlc2NyaWJlKCdJbnB1dCBTY3JpcHQgU2l6ZXMgKFdvcnN0LUNhc2UpJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBrZXlzID0gWzEsIDIsIDNdLm1hcCgodikgPT4gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDE2LCBgdGVzdC8ke3Z9YCkpKSBhcyBCSVAzMkludGVyZmFjZVtdO1xuICBjb25zdCByb290V2FsbGV0S2V5cyA9IG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKFtrZXlzWzBdLCBrZXlzWzFdLCBrZXlzWzJdXSk7XG5cbiAgZnVuY3Rpb24gZ2V0TGFyZ2VzdElucHV0V2l0aFR5cGUoXG4gICAgaW5wdXRUeXBlOiBzdHJpbmcsXG4gICAgc2lnbktleXM6IHV0eG9saWIuYml0Z28uS2V5TmFtZVtdLFxuICAgIGlucHV0Q291bnQgPSAxMDBcbiAgKTogdXR4b2xpYi5UeElucHV0IHtcbiAgICBjb25zdCBzaWduZXJOYW1lID0gc2lnbktleXNbMF07XG4gICAgY29uc3QgY29zaWduZXJOYW1lID0gc2lnbktleXMubGVuZ3RoID4gMSA/IHNpZ25LZXlzWzFdIDogc2lnbmVyTmFtZTtcbiAgICBjb25zdCBpbnB1dFNjcmlwdFR5cGVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaW5wdXRDb3VudCB9KS5maWxsKGlucHV0VHlwZSkgYXMgSW5wdXRTY3JpcHRUeXBlW107XG4gICAgY29uc3Qgb3V0cHV0U2NyaXB0VHlwZXMgPSBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2hdIGFzIFRlc3RVbnNwZW50VHlwZVtdO1xuICAgIHJldHVybiBnZXRTaWduZWRUcmFuc2FjdGlvbihcbiAgICAgIHJvb3RXYWxsZXRLZXlzLFxuICAgICAgc2lnbmVyTmFtZSxcbiAgICAgIGNvc2lnbmVyTmFtZSxcbiAgICAgIGlucHV0U2NyaXB0VHlwZXMsXG4gICAgICBvdXRwdXRTY3JpcHRUeXBlc1xuICAgICkuaW5zLnJlZHVjZSgoYSwgYikgPT4gKGdldElucHV0V2VpZ2h0KGEpID4gZ2V0SW5wdXRXZWlnaHQoYikgPyBhIDogYikpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5wdXRDb21wb25lbnRzKGlucHV0OiB1dHhvbGliLlR4SW5wdXQpOiBJbnB1dENvbXBvbmVudHMge1xuICAgIGNvbnN0IGRlY29tcGlsZWQgPSB1dHhvbGliLnNjcmlwdC5kZWNvbXBpbGUoaW5wdXQuc2NyaXB0KTtcbiAgICBpZiAoIWRlY29tcGlsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjcmlwdCA9IGRlY29tcGlsZWQubWFwKCh2KSA9PiB7XG4gICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih2KSkge1xuICAgICAgICByZXR1cm4geyBsZW5ndGg6IDEgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGxlbmd0aDogdi5sZW5ndGggKyBwdXNoZGF0YUVuY29kaW5nTGVuZ3RoKHYubGVuZ3RoKSB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHdpdG5lc3MgPSAoaW5wdXQud2l0bmVzcyB8fCBbXSkubWFwKCh2KSA9PiAoeyBsZW5ndGg6IHYubGVuZ3RoIH0pKTtcblxuICAgIGNvbnN0IHNjcmlwdFNpemUgPSBzY3JpcHQucmVkdWNlKChhLCBiKSA9PiBhICsgYi5sZW5ndGgsIDApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRTaXplLCBpbnB1dC5zY3JpcHQubGVuZ3RoLCB1dHhvbGliLnNjcmlwdC50b0FTTShkZWNvbXBpbGVkKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2NyaXB0OiBzY3JpcHQubWFwKCh2KSA9PiB2Lmxlbmd0aCksXG4gICAgICB3aXRuZXNzOiB3aXRuZXNzLm1hcCgodikgPT4gdi5sZW5ndGgpLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBydW5UZXN0Q29tcG9uZW50U2l6ZXMoaW5wdXRUeXBlOiBzdHJpbmcsIHNpZ25LZXlzOiB1dHhvbGliLmJpdGdvLktleU5hbWVbXSkge1xuICAgIGNvbnN0IHNpZ25LZXlzU3RyID0gc2lnbktleXMuam9pbignLCcpO1xuXG4gICAgZGVzY3JpYmUoYGlucHV0VHlwZT0ke2lucHV0VHlwZX0gc2lnbktleXM9JHtzaWduS2V5c1N0cn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgY29tcG9uZW50IHNpemVzYCwgZnVuY3Rpb24gKHRoaXM6IG1vY2hhLkNvbnRleHQpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0KDEwXzAwMCk7XG4gICAgICAgIGxldCBleHBlY3RlZENvbXBvbmVudHM7XG4gICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICAgICAgY2FzZSAncDJzaCc6XG4gICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnNoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncDJzaFAyd3NoJzpcbiAgICAgICAgICAgIGV4cGVjdGVkQ29tcG9uZW50cyA9IGlucHV0Q29tcG9uZW50c1Ayc2hQMndzaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Ayd3NoJzpcbiAgICAgICAgICAgIGV4cGVjdGVkQ29tcG9uZW50cyA9IGlucHV0Q29tcG9uZW50c1Ayd3NoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncDJzaFAycGsnOlxuICAgICAgICAgICAgZXhwZWN0ZWRDb21wb25lbnRzID0gaW5wdXRDb21wb25lbnRzUDJzaFAycGs7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwMnRyJzpcbiAgICAgICAgICAgIGlmIChzaWduS2V5c1sxXSA9PT0gJ2JpdGdvJykge1xuICAgICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnRyU2NyaXB0U3BlbmRMZXZlbDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNpZ25LZXlzWzFdID09PSAnYmFja3VwJykge1xuICAgICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnRyU2NyaXB0U3BlbmRMZXZlbDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgY29zaWduZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3AydHJNdXNpZzInOlxuICAgICAgICAgICAgLy8gYXNzdW1lcyBvbmx5IHNjcmlwdCBwYXRoXG4gICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnRyU2NyaXB0U3BlbmRMZXZlbDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICd0YXByb290S2V5UGF0aFNwZW5kJzpcbiAgICAgICAgICAgIGV4cGVjdGVkQ29tcG9uZW50cyA9IGlucHV0Q29tcG9uZW50c1AydHJLZXlTcGVuZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5wdXRUeXBlICR7aW5wdXRUeXBlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRMYXJnZXN0SW5wdXRXaXRoVHlwZShcbiAgICAgICAgICBpbnB1dFR5cGUsXG4gICAgICAgICAgc2lnbktleXMsXG4gICAgICAgICAgaW5wdXRUeXBlID09PSAncDJ0cicgfHwgaW5wdXRUeXBlID09PSAncDJ0ck11c2lnMicgfHwgaW5wdXRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAxMCA6IDEwMFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gZ2V0SW5wdXRDb21wb25lbnRzKGlucHV0KTtcbiAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChjb21wb25lbnRzLCBleHBlY3RlZENvbXBvbmVudHMpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0SW5wdXRDb21wb25lbnRzV2VpZ2h0KGNvbXBvbmVudHMpLCBnZXRJbnB1dFdlaWdodChpbnB1dCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRJbnB1dFNjcmlwdFR5cGVzKCkuZm9yRWFjaCgoaW5wdXRUeXBlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoaW5wdXRUeXBlICE9PSAncDJ0ck11c2lnMicpIHtcbiAgICAgIHJ1blRlc3RDb21wb25lbnRTaXplcyhpbnB1dFR5cGUsIGlucHV0VHlwZSA9PT0gJ3Ayc2hQMnBrJyA/IFsndXNlciddIDogWyd1c2VyJywgJ2JpdGdvJ10pO1xuICAgIH1cbiAgICBpZiAoaW5wdXRUeXBlICE9PSAncDJzaFAycGsnICYmIGlucHV0VHlwZSAhPT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKSB7XG4gICAgICBydW5UZXN0Q29tcG9uZW50U2l6ZXMoaW5wdXRUeXBlLCBbJ3VzZXInLCAnYmFja3VwJ10pO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txCombinations.d.ts","sourceRoot":"","sources":["../../../test/signedTx/txCombinations.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,GAAG,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const should_1 = __importDefault(require("should"));
|
|
30
|
+
const src_1 = require("../../src");
|
|
31
|
+
const testutils_1 = require("../testutils");
|
|
32
|
+
const txGen_1 = require("./txGen");
|
|
33
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
34
|
+
const keys = [1, 2, 3].map((v) => utxolib.bip32.fromSeed(Buffer.alloc(16, `test/2/${v}`), utxolib.networks.bitcoin));
|
|
35
|
+
const rootWalletKeys = new utxolib.bitgo.RootWalletKeys([keys[0], keys[1], keys[2]]);
|
|
36
|
+
const testDimensionsFromTx = (txCombo) => {
|
|
37
|
+
const { inputTypes, outputTypes, expectedDims } = txCombo;
|
|
38
|
+
describe(`Combination inputs=${inputTypes}; outputs=${outputTypes}`, function () {
|
|
39
|
+
const nInputs = inputTypes.length;
|
|
40
|
+
const outputDims = src_1.Dimensions.sum(...outputTypes.map(testutils_1.getOutputDimensionsForUnspentType));
|
|
41
|
+
it(`calculates dimensions from unsigned transaction`, function () {
|
|
42
|
+
const unsignedTx = txCombo.getUnsignedTx();
|
|
43
|
+
// does not work for unsigned transactions
|
|
44
|
+
should_1.default.throws(() => src_1.Dimensions.fromTransaction(unsignedTx));
|
|
45
|
+
// unless explicitly allowed
|
|
46
|
+
src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2SH }).should.eql(src_1.Dimensions.sum({ nP2shInputs: nInputs }, outputDims));
|
|
47
|
+
src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2SH_P2WSH }).should.eql(src_1.Dimensions.sum({ nP2shP2wshInputs: nInputs }, outputDims));
|
|
48
|
+
src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2WSH }).should.eql(src_1.Dimensions.sum({ nP2wshInputs: nInputs }, outputDims));
|
|
49
|
+
});
|
|
50
|
+
it(`calculates dimensions for signed transaction`, function () {
|
|
51
|
+
const dimensions = src_1.Dimensions.fromTransaction(txCombo.getSignedTx());
|
|
52
|
+
dimensions.should.eql(expectedDims);
|
|
53
|
+
});
|
|
54
|
+
it(`calculates dimensions for signed input of transaction`, function () {
|
|
55
|
+
const signedTx = txCombo.getSignedTx();
|
|
56
|
+
// test Dimensions.fromInput()
|
|
57
|
+
inputTypes.forEach((input, i) => src_1.Dimensions.fromInput(signedTx.ins[i]).should.eql(src_1.Dimensions.sum((0, testutils_1.getInputDimensionsForUnspentType)(input))));
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const testDimensionsFromPsbt = (keys, inputTypes, outputTypes, expectedDims) => {
|
|
62
|
+
describe(`Psbt Combination inputs=${inputTypes}; outputs=${outputTypes}`, function () {
|
|
63
|
+
['unsigned', 'halfsigned', 'fullysigned'].forEach((s) => {
|
|
64
|
+
it(`calculates dimensions from ${s} psbt`, function () {
|
|
65
|
+
const dimensions = src_1.Dimensions.fromPsbt((0, testutils_1.constructPsbt)(keys, inputTypes, outputTypes, s));
|
|
66
|
+
dimensions.should.eql(expectedDims);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it(`calculates dimensions for signed input of psbt`, function () {
|
|
70
|
+
const signedPsbt = (0, testutils_1.constructPsbt)(keys, inputTypes, outputTypes, 'fullysigned');
|
|
71
|
+
inputTypes.forEach((input, i) => src_1.Dimensions.fromPsbtInput(signedPsbt.data.inputs[i]).should.eql(src_1.Dimensions.sum((0, testutils_1.getInputDimensionsForUnspentType)(input))));
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
describe(`Dimensions for transaction combinations`, function () {
|
|
76
|
+
// p2trMusig2 is supported only with PSBT
|
|
77
|
+
const scriptTypes = utxolib.bitgo.outputScripts.scriptTypes2Of3.filter((t) => t !== 'p2trMusig2');
|
|
78
|
+
const params = {
|
|
79
|
+
inputTypes: [...scriptTypes, testutils_1.UnspentTypeP2shP2pk],
|
|
80
|
+
maxNInputs: 2,
|
|
81
|
+
outputTypes: [...scriptTypes, ...Object.keys(testutils_1.UnspentTypePubKeyHash)],
|
|
82
|
+
maxNOutputs: 2,
|
|
83
|
+
};
|
|
84
|
+
(0, txGen_1.runCombinations)(params, (inputTypeCombo, outputTypeCombo) => {
|
|
85
|
+
const expectedInputDims = src_1.Dimensions.sum(...inputTypeCombo.map(testutils_1.getInputDimensionsForUnspentType));
|
|
86
|
+
const expectedOutputDims = src_1.Dimensions.sum(...outputTypeCombo.map(testutils_1.getOutputDimensionsForUnspentType));
|
|
87
|
+
testDimensionsFromTx(new txGen_1.TxCombo(keys, inputTypeCombo, outputTypeCombo, expectedInputDims.plus(expectedOutputDims)));
|
|
88
|
+
// Doubling the inputs should yield twice the input dims
|
|
89
|
+
testDimensionsFromTx(new txGen_1.TxCombo(keys, [...inputTypeCombo, ...inputTypeCombo], outputTypeCombo, expectedInputDims.plus(expectedInputDims).plus(expectedOutputDims)));
|
|
90
|
+
// Same for outputs
|
|
91
|
+
testDimensionsFromTx(new txGen_1.TxCombo(keys, inputTypeCombo, [...outputTypeCombo, ...outputTypeCombo], expectedInputDims.plus(expectedOutputDims).plus(expectedOutputDims)));
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe(`Dimensions for PSBT combinations`, function () {
|
|
95
|
+
const params = {
|
|
96
|
+
inputTypes: [
|
|
97
|
+
...utxolib.bitgo.outputScripts.scriptTypes2Of3,
|
|
98
|
+
utxolib.bitgo.outputScripts.scriptTypeP2shP2pk,
|
|
99
|
+
'taprootKeyPathSpend',
|
|
100
|
+
],
|
|
101
|
+
maxNInputs: 1,
|
|
102
|
+
outputTypes: [...Object.keys(testutils_1.UnspentTypeScript2of3), ...Object.keys(testutils_1.UnspentTypePubKeyHash)],
|
|
103
|
+
maxNOutputs: 1,
|
|
104
|
+
};
|
|
105
|
+
it(`does not work for unknown psbt input`, function () {
|
|
106
|
+
const psbt = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin });
|
|
107
|
+
psbt.addInput({ hash: Buffer.alloc(32), index: 0 });
|
|
108
|
+
should_1.default.throws(() => src_1.Dimensions.fromPsbt(psbt));
|
|
109
|
+
});
|
|
110
|
+
(0, txGen_1.runCombinations)(params, (inputTypeCombo, outputTypeCombo) => {
|
|
111
|
+
const expectedInputDims = src_1.Dimensions.sum(...inputTypeCombo.map(testutils_1.getInputDimensionsForUnspentType));
|
|
112
|
+
const expectedOutputDims = src_1.Dimensions.sum(...outputTypeCombo.map(testutils_1.getOutputDimensionsForUnspentType));
|
|
113
|
+
testDimensionsFromPsbt(rootWalletKeys, inputTypeCombo, outputTypeCombo, expectedInputDims.plus(expectedOutputDims));
|
|
114
|
+
// Doubling the inputs should yield twice the input dims
|
|
115
|
+
testDimensionsFromPsbt(rootWalletKeys, [...inputTypeCombo, ...inputTypeCombo], outputTypeCombo, expectedInputDims.plus(expectedInputDims).plus(expectedOutputDims));
|
|
116
|
+
// Same for outputs
|
|
117
|
+
testDimensionsFromPsbt(rootWalletKeys, inputTypeCombo, [...outputTypeCombo, ...outputTypeCombo], expectedInputDims.plus(expectedOutputDims).plus(expectedOutputDims));
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhDb21iaW5hdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3NpZ25lZFR4L3R4Q29tYmluYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQXVDO0FBRXZDLDRDQVFzQjtBQUV0QixtQ0FBbUQ7QUFDbkQsOERBQWdEO0FBSWhELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FDdEQsQ0FBQztBQUU5QixNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXJGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFZLEVBQUUsRUFBRTtJQUM1QyxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFMUQsUUFBUSxDQUFDLHNCQUFzQixVQUFVLGFBQWEsV0FBVyxFQUFFLEVBQUU7UUFDbkUsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxnQkFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsNkNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBRXpGLEVBQUUsQ0FBQyxpREFBaUQs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Q0FBQyxrQkFBa0IsQ0FBQyxDQUNwRSxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5pbXBvcnQge1xuICBjb25zdHJ1Y3RQc2J0LFxuICBnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSxcbiAgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlLFxuICBUZXN0VW5zcGVudFR5cGUsXG4gIFVuc3BlbnRUeXBlUDJzaFAycGssXG4gIFVuc3BlbnRUeXBlUHViS2V5SGFzaCxcbiAgVW5zcGVudFR5cGVTY3JpcHQyb2YzLFxufSBmcm9tICcuLi90ZXN0dXRpbHMnO1xuXG5pbXBvcnQgeyBydW5Db21iaW5hdGlvbnMsIFR4Q29tYm8gfSBmcm9tICcuL3R4R2VuJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5leHBvcnQgdHlwZSBJbnB1dFNjcmlwdFR5cGUgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZSB8ICd0YXByb290S2V5UGF0aFNwZW5kJztcblxuY29uc3Qga2V5cyA9IFsxLCAyLCAzXS5tYXAoKHYpID0+XG4gIHV0eG9saWIuYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDE2LCBgdGVzdC8yLyR7dn1gKSwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKVxuKSBhcyB1dHhvbGliLkJJUDMySW50ZXJmYWNlW107XG5cbmNvbnN0IHJvb3RXYWxsZXRLZXlzID0gbmV3IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMoW2tleXNbMF0sIGtleXNbMV0sIGtleXNbMl1dKTtcblxuY29uc3QgdGVzdERpbWVuc2lvbnNGcm9tVHggPSAodHhDb21ibzogYW55KSA9PiB7XG4gIGNvbnN0IHsgaW5wdXRUeXBlcywgb3V0cHV0VHlwZXMsIGV4cGVjdGVkRGltcyB9ID0gdHhDb21ibztcblxuICBkZXNjcmliZShgQ29tYmluYXRpb24gaW5wdXRzPSR7aW5wdXRUeXBlc307IG91dHB1dHM9JHtvdXRwdXRUeXBlc31gLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbklucHV0cyA9IGlucHV0VHlwZXMubGVuZ3RoO1xuICAgIGNvbnN0IG91dHB1dERpbXMgPSBEaW1lbnNpb25zLnN1bSguLi5vdXRwdXRUeXBlcy5tYXAoZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKSk7XG5cbiAgICBpdChgY2FsY3VsYXRlcyBkaW1lbnNpb25zIGZyb20gdW5zaWduZWQgdHJhbnNhY3Rpb25gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gdHhDb21iby5nZXRVbnNpZ25lZFR4KCk7XG5cbiAgICAgIC8vIGRvZXMgbm90IHdvcmsgZm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9uc1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBEaW1lbnNpb25zLmZyb21UcmFuc2FjdGlvbih1bnNpZ25lZFR4KSk7XG5cbiAgICAgIC8vIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWRcbiAgICAgIERpbWVuc2lvbnMuZnJvbVRyYW5zYWN0aW9uKHVuc2lnbmVkVHgsIHsgYXNzdW1lVW5zaWduZWQ6IERpbWVuc2lvbnMuQVNTVU1FX1AyU0ggfSkuc2hvdWxkLmVxbChcbiAgICAgICAgRGltZW5zaW9ucy5zdW0oeyBuUDJzaElucHV0czogbklucHV0cyB9LCBvdXRwdXREaW1zKVxuICAgICAgKTtcblxuICAgICAgRGltZW5zaW9ucy5mcm9tVHJhbnNhY3Rpb24odW5zaWduZWRUeCwgeyBhc3N1bWVVbnNpZ25lZDogRGltZW5zaW9ucy5BU1NVTUVfUDJTSF9QMldTSCB9KS5zaG91bGQuZXFsKFxuICAgICAgICBEaW1lbnNpb25zLnN1bSh7IG5QMnNoUDJ3c2hJbnB1dHM6IG5JbnB1dHMgfSwgb3V0cHV0RGltcylcbiAgICAgICk7XG5cbiAgICAgIERpbWVuc2lvbnMuZnJvbVRyYW5zYWN0aW9uKHVuc2lnbmVkVHgsIHsgYXNzdW1lVW5zaWduZWQ6IERpbWVuc2lvbnMuQVNTVU1FX1AyV1NIIH0pLnNob3VsZC5lcWwoXG4gICAgICAgIERpbWVuc2lvbnMuc3VtKHsgblAyd3NoSW5wdXRzOiBuSW5wdXRzIH0sIG91dHB1dERpbXMpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoYGNhbGN1bGF0ZXMgZGltZW5zaW9ucyBmb3Igc2lnbmVkIHRyYW5zYWN0aW9uYCwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGltZW5zaW9ucyA9IERpbWVuc2lvbnMuZnJvbVRyYW5zYWN0aW9uKHR4Q29tYm8uZ2V0U2lnbmVkVHgoKSk7XG4gICAgICBkaW1lbnNpb25zLnNob3VsZC5lcWwoZXhwZWN0ZWREaW1zKTtcbiAgICB9KTtcblxuICAgIGl0KGBjYWxjdWxhdGVzIGRpbWVuc2lvbnMgZm9yIHNpZ25lZCBpbnB1dCBvZiB0cmFuc2FjdGlvbmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gdHhDb21iby5nZXRTaWduZWRUeCgpO1xuXG4gICAgICAvLyB0ZXN0IERpbWVuc2lvbnMuZnJvbUlucHV0KClcbiAgICAgIGlucHV0VHlwZXMuZm9yRWFjaCgoaW5wdXQ6IGFueSwgaTogbnVtYmVyKSA9PlxuICAgICAgICBEaW1lbnNpb25zLmZyb21JbnB1dChzaWduZWRUeC5pbnNbaV0pLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oZ2V0SW5wdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUoaW5wdXQpKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgdGVzdERpbWVuc2lvbnNGcm9tUHNidCA9IChcbiAga2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyxcbiAgaW5wdXRUeXBlczogSW5wdXRTY3JpcHRUeXBlW10sXG4gIG91dHB1dFR5cGVzOiBUZXN0VW5zcGVudFR5cGVbXSxcbiAgZXhwZWN0ZWREaW1zOiBEaW1lbnNpb25zXG4pID0+IHtcbiAgZGVzY3JpYmUoYFBzYnQgQ29tYmluYXRpb24gaW5wdXRzPSR7aW5wdXRUeXBlc307IG91dHB1dHM9JHtvdXRwdXRUeXBlc31gLCBmdW5jdGlvbiAoKSB7XG4gICAgKFsndW5zaWduZWQnLCAnaGFsZnNpZ25lZCcsICdmdWxseXNpZ25lZCddIGFzIGNvbnN0KS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBpdChgY2FsY3VsYXRlcyBkaW1lbnNpb25zIGZyb20gJHtzfSBwc2J0YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gRGltZW5zaW9ucy5mcm9tUHNidChjb25zdHJ1Y3RQc2J0KGtleXMsIGlucHV0VHlwZXMsIG91dHB1dFR5cGVzLCBzKSk7XG4gICAgICAgIGRpbWVuc2lvbnMuc2hvdWxkLmVxbChleHBlY3RlZERpbXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdChgY2FsY3VsYXRlcyBkaW1lbnNpb25zIGZvciBzaWduZWQgaW5wdXQgb2YgcHNidGAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25lZFBzYnQgPSBjb25zdHJ1Y3RQc2J0KGtleXMsIGlucHV0VHlwZXMsIG91dHB1dFR5cGVzLCAnZnVsbHlzaWduZWQnKTtcblxuICAgICAgaW5wdXRUeXBlcy5mb3JFYWNoKChpbnB1dDogYW55LCBpOiBudW1iZXIpID0+XG4gICAgICAgIERpbWVuc2lvbnMuZnJvbVBzYnRJbnB1dChzaWduZWRQc2J0LmRhdGEuaW5wdXRzW2ldKS5zaG91bGQuZXFsKFxuICAgICAgICAgIERpbWVuc2lvbnMuc3VtKGdldElucHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKGlucHV0KSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5kZXNjcmliZShgRGltZW5zaW9ucyBmb3IgdHJhbnNhY3Rpb24gY29tYmluYXRpb25zYCwgZnVuY3Rpb24gKCkge1xuICAvLyBwMnRyTXVzaWcyIGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggUFNCVFxuICBjb25zdCBzY3JpcHRUeXBlcyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjMuZmlsdGVyKCh0KSA9PiB0ICE9PSAncDJ0ck11c2lnMicpO1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgaW5wdXRUeXBlczogWy4uLnNjcmlwdFR5cGVzLCBVbnNwZW50VHlwZVAyc2hQMnBrXSBhcyBJbnB1dFNjcmlwdFR5cGVbXSxcbiAgICBtYXhOSW5wdXRzOiAyLFxuICAgIG91dHB1dFR5cGVzOiBbLi4uc2NyaXB0VHlwZXMsIC4uLk9iamVjdC5rZXlzKFVuc3BlbnRUeXBlUHViS2V5SGFzaCldIGFzIFRlc3RVbnNwZW50VHlwZVtdLFxuICAgIG1heE5PdXRwdXRzOiAyLFxuICB9O1xuXG4gIHJ1bkNvbWJpbmF0aW9ucyhwYXJhbXMsIChpbnB1dFR5cGVDb21ibzogSW5wdXRTY3JpcHRUeXBlW10sIG91dHB1dFR5cGVDb21ibzogVGVzdFVuc3BlbnRUeXBlW10pID0+IHtcbiAgICBjb25zdCBleHBlY3RlZElucHV0RGltcyA9IERpbWVuc2lvbnMuc3VtKC4uLmlucHV0VHlwZUNvbWJvLm1hcChnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSkpO1xuICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0RGltcyA9IERpbWVuc2lvbnMuc3VtKC4uLm91dHB1dFR5cGVDb21iby5tYXAoZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKSk7XG5cbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21UeChcbiAgICAgIG5ldyBUeENvbWJvKGtleXMsIGlucHV0VHlwZUNvbWJvLCBvdXRwdXRUeXBlQ29tYm8sIGV4cGVjdGVkSW5wdXREaW1zLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKSlcbiAgICApO1xuXG4gICAgLy8gRG91YmxpbmcgdGhlIGlucHV0cyBzaG91bGQgeWllbGQgdHdpY2UgdGhlIGlucHV0IGRpbXNcbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21UeChcbiAgICAgIG5ldyBUeENvbWJvKFxuICAgICAgICBrZXlzLFxuICAgICAgICBbLi4uaW5wdXRUeXBlQ29tYm8sIC4uLmlucHV0VHlwZUNvbWJvXSxcbiAgICAgICAgb3V0cHV0VHlwZUNvbWJvLFxuICAgICAgICBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkSW5wdXREaW1zKS5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcylcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gU2FtZSBmb3Igb3V0cHV0c1xuICAgIHRlc3REaW1lbnNpb25zRnJvbVR4KFxuICAgICAgbmV3IFR4Q29tYm8oXG4gICAgICAgIGtleXMsXG4gICAgICAgIGlucHV0VHlwZUNvbWJvLFxuICAgICAgICBbLi4ub3V0cHV0VHlwZUNvbWJvLCAuLi5vdXRwdXRUeXBlQ29tYm9dLFxuICAgICAgICBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcykucGx1cyhleHBlY3RlZE91dHB1dERpbXMpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoYERpbWVuc2lvbnMgZm9yIFBTQlQgY29tYmluYXRpb25zYCwgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgaW5wdXRUeXBlczogW1xuICAgICAgLi4udXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMyxcbiAgICAgIHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlUDJzaFAycGssXG4gICAgICAndGFwcm9vdEtleVBhdGhTcGVuZCcsXG4gICAgXSBhcyBJbnB1dFNjcmlwdFR5cGVbXSxcbiAgICBtYXhOSW5wdXRzOiAxLFxuICAgIG91dHB1dFR5cGVzOiBbLi4uT2JqZWN0LmtleXMoVW5zcGVudFR5cGVTY3JpcHQyb2YzKSwgLi4uT2JqZWN0LmtleXMoVW5zcGVudFR5cGVQdWJLZXlIYXNoKV0sXG4gICAgbWF4Tk91dHB1dHM6IDEsXG4gIH07XG5cbiAgaXQoYGRvZXMgbm90IHdvcmsgZm9yIHVua25vd24gcHNidCBpbnB1dGAsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbiB9KTtcbiAgICBwc2J0LmFkZElucHV0KHsgaGFzaDogQnVmZmVyLmFsbG9jKDMyKSwgaW5kZXg6IDAgfSk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBEaW1lbnNpb25zLmZyb21Qc2J0KHBzYnQpKTtcbiAgfSk7XG5cbiAgcnVuQ29tYmluYXRpb25zKHBhcmFtcywgKGlucHV0VHlwZUNvbWJvOiBJbnB1dFNjcmlwdFR5cGVbXSwgb3V0cHV0VHlwZUNvbWJvOiBUZXN0VW5zcGVudFR5cGVbXSkgPT4ge1xuICAgIGNvbnN0IGV4cGVjdGVkSW5wdXREaW1zID0gRGltZW5zaW9ucy5zdW0oLi4uaW5wdXRUeXBlQ29tYm8ubWFwKGdldElucHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKSk7XG4gICAgY29uc3QgZXhwZWN0ZWRPdXRwdXREaW1zID0gRGltZW5zaW9ucy5zdW0oLi4ub3V0cHV0VHlwZUNvbWJvLm1hcChnZXRPdXRwdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUpKTtcblxuICAgIHRlc3REaW1lbnNpb25zRnJvbVBzYnQocm9vdFdhbGxldEtleXMsIGlucHV0VHlwZUNvbWJvLCBvdXRwdXRUeXBlQ29tYm8sIGV4cGVjdGVkSW5wdXREaW1zLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKSk7XG5cbiAgICAvLyBEb3VibGluZyB0aGUgaW5wdXRzIHNob3VsZCB5aWVsZCB0d2ljZSB0aGUgaW5wdXQgZGltc1xuICAgIHRlc3REaW1lbnNpb25zRnJvbVBzYnQoXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIFsuLi5pbnB1dFR5cGVDb21ibywgLi4uaW5wdXRUeXBlQ29tYm9dLFxuICAgICAgb3V0cHV0VHlwZUNvbWJvLFxuICAgICAgZXhwZWN0ZWRJbnB1dERpbXMucGx1cyhleHBlY3RlZElucHV0RGltcykucGx1cyhleHBlY3RlZE91dHB1dERpbXMpXG4gICAgKTtcblxuICAgIC8vIFNhbWUgZm9yIG91dHB1dHNcbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21Qc2J0KFxuICAgICAgcm9vdFdhbGxldEtleXMsXG4gICAgICBpbnB1dFR5cGVDb21ibyxcbiAgICAgIFsuLi5vdXRwdXRUeXBlQ29tYm8sIC4uLm91dHB1dFR5cGVDb21ib10sXG4gICAgICBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcykucGx1cyhleHBlY3RlZE91dHB1dERpbXMpXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
|