@bitgo-beta/sdk-coin-iota 1.0.1-beta.42 → 1.0.1-beta.420
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/src/iota.d.ts +134 -23
- package/dist/src/iota.d.ts.map +1 -1
- package/dist/src/iota.js +286 -46
- package/dist/src/lib/constants.d.ts +59 -6
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +76 -8
- package/dist/src/lib/iface.d.ts +174 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/keyPair.d.ts +100 -6
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +103 -10
- package/dist/src/lib/transaction.d.ts +175 -5
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +390 -6
- package/dist/src/lib/transactionBuilder.d.ts +109 -9
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +200 -14
- package/dist/src/lib/transactionBuilderFactory.d.ts +98 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +132 -5
- package/dist/src/lib/transferBuilder.d.ts +52 -2
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +86 -3
- package/dist/src/lib/transferTransaction.d.ts +124 -0
- package/dist/src/lib/transferTransaction.d.ts.map +1 -0
- package/dist/src/lib/transferTransaction.js +341 -0
- package/dist/src/lib/utils.d.ts +108 -7
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +146 -11
- package/dist/test/resources/iota.d.ts +35 -0
- package/dist/test/resources/iota.d.ts.map +1 -0
- package/dist/test/resources/iota.js +93 -0
- package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
- package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
- package/dist/test/unit/helpers/testHelpers.js +176 -0
- package/dist/test/unit/index.d.ts +2 -0
- package/dist/test/unit/index.d.ts.map +1 -0
- package/dist/test/unit/index.js +16 -0
- package/dist/test/unit/iota.d.ts +2 -0
- package/dist/test/unit/iota.d.ts.map +1 -0
- package/dist/test/unit/iota.js +501 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +108 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +188 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +178 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +438 -0
- package/dist/test/unit/transferTransaction.d.ts +2 -0
- package/dist/test/unit/transferTransaction.d.ts.map +1 -0
- package/dist/test/unit/transferTransaction.js +218 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +252 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +16 -10
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -28
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const should_1 = __importDefault(require("should"));
|
|
7
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const constants_1 = require("../../../src/lib/constants");
|
|
9
|
+
const testHelpers_1 = require("../helpers/testHelpers");
|
|
10
|
+
describe('Iota Transfer Builder', () => {
|
|
11
|
+
const factory = (0, testHelpers_1.getFactory)();
|
|
12
|
+
describe('Basic Transaction Building', () => {
|
|
13
|
+
it('should build a transfer transaction in simulate mode', async function () {
|
|
14
|
+
const txBuilder = (0, testHelpers_1.createBasicTransferBuilder)();
|
|
15
|
+
const tx = (await txBuilder.build());
|
|
16
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
17
|
+
should_1.default.equal(tx.isSimulateTx, true);
|
|
18
|
+
(0, testHelpers_1.assertBasicTransactionProperties)(tx);
|
|
19
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
20
|
+
});
|
|
21
|
+
it('should build a transfer transaction with gas data', async function () {
|
|
22
|
+
const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
|
|
23
|
+
const tx = (await txBuilder.build());
|
|
24
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
25
|
+
should_1.default.equal(tx.isSimulateTx, false);
|
|
26
|
+
(0, testHelpers_1.assertBasicTransactionProperties)(tx);
|
|
27
|
+
(0, testHelpers_1.assertGasData)(tx);
|
|
28
|
+
(0, testHelpers_1.assertInputsAndOutputs)(tx, testHelpers_1.testData.recipients);
|
|
29
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
30
|
+
});
|
|
31
|
+
it('should build a transfer transaction with gas sponsor', async function () {
|
|
32
|
+
const txBuilder = (0, testHelpers_1.createTransferBuilderWithSponsor)();
|
|
33
|
+
const tx = (await txBuilder.build());
|
|
34
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
35
|
+
should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
|
|
36
|
+
should_1.default.equal(tx.gasSponsor, testHelpers_1.testData.gasSponsor.address);
|
|
37
|
+
should_1.default.equal(tx.isSimulateTx, false);
|
|
38
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
39
|
+
});
|
|
40
|
+
it('should build transaction using gas objects when no payment objects', async function () {
|
|
41
|
+
const txBuilder = (0, testHelpers_1.createBuilderWithGasObjectsOnly)();
|
|
42
|
+
const tx = (await txBuilder.build());
|
|
43
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
44
|
+
should_1.default.equal(tx.isSimulateTx, false);
|
|
45
|
+
should_1.default.equal(tx.paymentObjects, undefined);
|
|
46
|
+
should_1.default.exist(tx.gasPaymentObjects);
|
|
47
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
48
|
+
});
|
|
49
|
+
it('should support method chaining', async function () {
|
|
50
|
+
const tx = (await factory
|
|
51
|
+
.getTransferBuilder()
|
|
52
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
53
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
54
|
+
.paymentObjects(testHelpers_1.testData.paymentObjects)
|
|
55
|
+
.gasData(testHelpers_1.testData.gasData)
|
|
56
|
+
.gasSponsor(testHelpers_1.testData.gasSponsor.address)
|
|
57
|
+
.build());
|
|
58
|
+
should_1.default.exist(tx);
|
|
59
|
+
should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
|
|
60
|
+
should_1.default.equal(tx.gasSponsor, testHelpers_1.testData.gasSponsor.address);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('Serialization and Deserialization', () => {
|
|
64
|
+
it('should serialize to JSON and rebuild transaction', async function () {
|
|
65
|
+
const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
|
|
66
|
+
const tx = (await txBuilder.build());
|
|
67
|
+
const txJson = tx.toJson();
|
|
68
|
+
const rebuiltTxBuilder = factory.getTransferBuilder();
|
|
69
|
+
rebuiltTxBuilder.transaction.parseFromJSON(txJson);
|
|
70
|
+
const rebuiltTx = (await rebuiltTxBuilder.build());
|
|
71
|
+
should_1.default.equal(rebuiltTx.sender, tx.sender);
|
|
72
|
+
should_1.default.deepEqual(rebuiltTx.recipients, tx.recipients);
|
|
73
|
+
should_1.default.equal(rebuiltTx.gasBudget, tx.gasBudget);
|
|
74
|
+
should_1.default.equal(rebuiltTx.gasPrice, tx.gasPrice);
|
|
75
|
+
});
|
|
76
|
+
it('should serialize to broadcast format consistently', async function () {
|
|
77
|
+
const tx1 = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
78
|
+
const rawTx1 = await tx1.toBroadcastFormat();
|
|
79
|
+
const tx2 = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
80
|
+
const rawTx2 = await tx2.toBroadcastFormat();
|
|
81
|
+
should_1.default.equal(rawTx1, rawTx2);
|
|
82
|
+
});
|
|
83
|
+
it('should validate toJSON output', async function () {
|
|
84
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
85
|
+
const txJson = tx.toJson();
|
|
86
|
+
should_1.default.equal(txJson.sender, testHelpers_1.testData.sender.address);
|
|
87
|
+
should_1.default.deepEqual(txJson.recipients, testHelpers_1.testData.recipients);
|
|
88
|
+
should_1.default.deepEqual(txJson.paymentObjects, testHelpers_1.testData.paymentObjects);
|
|
89
|
+
should_1.default.equal(txJson.gasBudget, testHelpers_1.testData.GAS_BUDGET);
|
|
90
|
+
should_1.default.equal(txJson.gasPrice, testHelpers_1.testData.GAS_PRICE);
|
|
91
|
+
should_1.default.deepEqual(txJson.gasPaymentObjects, testHelpers_1.testData.gasPaymentObjects);
|
|
92
|
+
should_1.default.equal(txJson.type, sdk_core_1.TransactionType.Send);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe('Round-trip Parsing', () => {
|
|
96
|
+
it('should correctly parse and rebuild transaction using gas objects', async function () {
|
|
97
|
+
const tx = (await (0, testHelpers_1.createBuilderWithGasObjectsOnly)().build());
|
|
98
|
+
const rawTx = await tx.toBroadcastFormat();
|
|
99
|
+
const txHex = Buffer.from(rawTx, 'base64').toString('hex');
|
|
100
|
+
const rebuiltBuilder = factory.from(txHex);
|
|
101
|
+
const rebuiltTx = (await rebuiltBuilder.build());
|
|
102
|
+
should_1.default.equal(rebuiltTx.sender, tx.sender);
|
|
103
|
+
should_1.default.deepEqual(rebuiltTx.recipients, tx.recipients);
|
|
104
|
+
should_1.default.equal(rebuiltTx.gasBudget, tx.gasBudget);
|
|
105
|
+
should_1.default.equal(rebuiltTx.gasPrice, tx.gasPrice);
|
|
106
|
+
should_1.default.equal(rebuiltTx.paymentObjects, undefined);
|
|
107
|
+
should_1.default.exist(rebuiltTx.gasPaymentObjects);
|
|
108
|
+
});
|
|
109
|
+
it('should correctly parse transaction with payment objects', async function () {
|
|
110
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
111
|
+
const rawTx = await tx.toBroadcastFormat();
|
|
112
|
+
const txHex = Buffer.from(rawTx, 'base64').toString('hex');
|
|
113
|
+
const rebuiltBuilder = factory.from(txHex);
|
|
114
|
+
const rebuiltTx = (await rebuiltBuilder.build());
|
|
115
|
+
should_1.default.exist(rebuiltTx.paymentObjects);
|
|
116
|
+
should_1.default.equal(rebuiltTx.paymentObjects?.length, testHelpers_1.testData.paymentObjects.length);
|
|
117
|
+
});
|
|
118
|
+
it('should handle round-trip with gas sponsor and payment objects', async function () {
|
|
119
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithSponsor)().build());
|
|
120
|
+
const rawTx = await tx.toBroadcastFormat();
|
|
121
|
+
const txHex = Buffer.from(rawTx, 'base64').toString('hex');
|
|
122
|
+
const rebuiltBuilder = factory.from(txHex);
|
|
123
|
+
const rebuiltTx = (await rebuiltBuilder.build());
|
|
124
|
+
should_1.default.equal(rebuiltTx.gasSponsor, testHelpers_1.testData.gasSponsor.address);
|
|
125
|
+
should_1.default.exist(rebuiltTx.paymentObjects);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('Recipient Handling', () => {
|
|
129
|
+
const testCases = [
|
|
130
|
+
{ count: 1, description: 'single recipient' },
|
|
131
|
+
{ count: 10, description: 'multiple recipients' },
|
|
132
|
+
{ count: constants_1.MAX_RECIPIENTS, description: 'maximum recipients' },
|
|
133
|
+
];
|
|
134
|
+
testCases.forEach(({ count, description }) => {
|
|
135
|
+
it(`should build transaction with ${description}`, async function () {
|
|
136
|
+
const recipients = (0, testHelpers_1.createRecipients)(count, '1000');
|
|
137
|
+
const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(recipients).build());
|
|
138
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
139
|
+
tx.outputs.length.should.equal(count);
|
|
140
|
+
tx.outputs.forEach((output) => {
|
|
141
|
+
output.value.should.equal('1000');
|
|
142
|
+
output.coin?.should.equal('tiota');
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
it('should fail with more than MAX_RECIPIENTS', async function () {
|
|
147
|
+
const recipients = (0, testHelpers_1.createRecipients)(constants_1.MAX_RECIPIENTS + 1);
|
|
148
|
+
const builder = (0, testHelpers_1.createBuilderWithRecipients)(recipients);
|
|
149
|
+
await builder.build().should.be.rejected();
|
|
150
|
+
});
|
|
151
|
+
it('should handle duplicate recipient addresses', async function () {
|
|
152
|
+
const duplicateRecipients = [
|
|
153
|
+
{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: '1000' },
|
|
154
|
+
{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: '2000' },
|
|
155
|
+
];
|
|
156
|
+
const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(duplicateRecipients).build());
|
|
157
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
158
|
+
tx.outputs.length.should.equal(2);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('Gas Object Handling', () => {
|
|
162
|
+
it('should build with single gas object', async function () {
|
|
163
|
+
const tx = (await (0, testHelpers_1.createBuilderWithGasObjects)([testHelpers_1.testData.gasPaymentObjects[0]]).build());
|
|
164
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
165
|
+
should_1.default.exist(tx.gasPaymentObjects);
|
|
166
|
+
tx.gasPaymentObjects?.length.should.equal(1);
|
|
167
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
168
|
+
});
|
|
169
|
+
it('should build with exactly MAX_GAS_PAYMENT_OBJECTS gas objects', async function () {
|
|
170
|
+
// Create exactly MAX_GAS_PAYMENT_OBJECTS (256) with valid digests
|
|
171
|
+
const exactlyMaxGasObjects = [];
|
|
172
|
+
for (let i = 0; i < constants_1.MAX_GAS_PAYMENT_OBJECTS; i++) {
|
|
173
|
+
exactlyMaxGasObjects.push({
|
|
174
|
+
...testHelpers_1.testData.gasPaymentObjects[i % testHelpers_1.testData.gasPaymentObjects.length],
|
|
175
|
+
objectId: `0x${i.toString(16).padStart(64, '0')}`,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
const tx = (await (0, testHelpers_1.createBuilderWithGasObjects)(exactlyMaxGasObjects).build());
|
|
179
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
180
|
+
should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
|
|
181
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
182
|
+
});
|
|
183
|
+
it('should build with more than MAX_GAS_PAYMENT_OBJECTS requiring merge', async function () {
|
|
184
|
+
// Create more than MAX_GAS_PAYMENT_OBJECTS (256) to test merge logic
|
|
185
|
+
const manyGasObjects = [];
|
|
186
|
+
for (let i = 0; i < constants_1.MAX_GAS_PAYMENT_OBJECTS + 10; i++) {
|
|
187
|
+
manyGasObjects.push({
|
|
188
|
+
...testHelpers_1.testData.gasPaymentObjects[i % testHelpers_1.testData.gasPaymentObjects.length],
|
|
189
|
+
objectId: `0x${i.toString(16).padStart(64, '0')}`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const tx = (await (0, testHelpers_1.createBuilderWithGasObjects)(manyGasObjects).build());
|
|
193
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
194
|
+
should_1.default.equal(tx.isSimulateTx, false);
|
|
195
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('Payment Object Handling', () => {
|
|
199
|
+
it('should build with single payment object', async function () {
|
|
200
|
+
const builder = factory
|
|
201
|
+
.getTransferBuilder()
|
|
202
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
203
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
204
|
+
.paymentObjects([testHelpers_1.testData.paymentObjects[0]])
|
|
205
|
+
.gasData(testHelpers_1.testData.gasData);
|
|
206
|
+
const tx = (await builder.build());
|
|
207
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
208
|
+
tx.paymentObjects?.length.should.equal(1);
|
|
209
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
210
|
+
});
|
|
211
|
+
it('should keep payment and gas objects separate', async function () {
|
|
212
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
213
|
+
should_1.default.exist(tx.paymentObjects);
|
|
214
|
+
should_1.default.exist(tx.gasPaymentObjects);
|
|
215
|
+
tx.paymentObjects?.length.should.equal(testHelpers_1.testData.paymentObjects.length);
|
|
216
|
+
tx.gasPaymentObjects?.length.should.equal(testHelpers_1.testData.gasPaymentObjects.length);
|
|
217
|
+
});
|
|
218
|
+
it('should handle payment objects with different versions', async function () {
|
|
219
|
+
const mixedVersionObjects = [
|
|
220
|
+
{
|
|
221
|
+
objectId: '0x1111111111111111111111111111111111111111111111111111111111111111',
|
|
222
|
+
version: '1',
|
|
223
|
+
digest: 'DGVhYjk6YHwdPdZBgBN8czavy8LvbrshkbxF963EW7mB',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
objectId: '0x2222222222222222222222222222222222222222222222222222222222222222',
|
|
227
|
+
version: '999999',
|
|
228
|
+
digest: 'DoJwXuz9oU5Y5v5vBRiTgisVTQuZQLmHZWeqJzzD5QUE',
|
|
229
|
+
},
|
|
230
|
+
];
|
|
231
|
+
const builder = factory
|
|
232
|
+
.getTransferBuilder()
|
|
233
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
234
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
235
|
+
.paymentObjects(mixedVersionObjects)
|
|
236
|
+
.gasData(testHelpers_1.testData.gasData);
|
|
237
|
+
const tx = (await builder.build());
|
|
238
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
239
|
+
tx.paymentObjects?.length.should.equal(2);
|
|
240
|
+
});
|
|
241
|
+
it('should accept empty payment objects array and use gas objects for payment in non-sponsor mode', async function () {
|
|
242
|
+
const builder = factory
|
|
243
|
+
.getTransferBuilder()
|
|
244
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
245
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
246
|
+
.paymentObjects([])
|
|
247
|
+
.gasData(testHelpers_1.testData.gasData);
|
|
248
|
+
const tx = (await builder.build());
|
|
249
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
250
|
+
should_1.default.equal(tx.isSimulateTx, false);
|
|
251
|
+
should_1.default.equal(tx.sender, testHelpers_1.testData.sender.address);
|
|
252
|
+
await (0, testHelpers_1.assertValidRawTransaction)(tx);
|
|
253
|
+
});
|
|
254
|
+
it('should fail tx building in case of empty payment objects in sponsor mode', async function () {
|
|
255
|
+
const builder = factory
|
|
256
|
+
.getTransferBuilder()
|
|
257
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
258
|
+
.gasSponsor(testHelpers_1.testData.gasSponsor.address)
|
|
259
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
260
|
+
.paymentObjects([])
|
|
261
|
+
.gasData(testHelpers_1.testData.gasData);
|
|
262
|
+
await builder.build().should.be.rejectedWith(/Payment objects are required when using a gas sponsor/);
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('Validation Errors', () => {
|
|
266
|
+
describe('Address Validation', () => {
|
|
267
|
+
it('should fail for invalid sender', function () {
|
|
268
|
+
const builder = factory.getTransferBuilder();
|
|
269
|
+
(0, should_1.default)(() => builder.sender('randomString')).throwError('Invalid address randomString');
|
|
270
|
+
});
|
|
271
|
+
it('should fail for invalid recipient address', function () {
|
|
272
|
+
const builder = (0, testHelpers_1.createBasicTransferBuilder)();
|
|
273
|
+
(0, should_1.default)(() => builder.recipients([{ address: 'invalidAddress', amount: '1000' }])).throwError('Invalid address invalidAddress');
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
describe('Amount Validation', () => {
|
|
277
|
+
it('should fail for negative amount', function () {
|
|
278
|
+
const builder = (0, testHelpers_1.createBasicTransferBuilder)();
|
|
279
|
+
(0, should_1.default)(() => builder.recipients([{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: '-1000' }])).throwError('Value cannot be less than zero');
|
|
280
|
+
});
|
|
281
|
+
it('should fail for invalid format', function () {
|
|
282
|
+
const builder = (0, testHelpers_1.createBasicTransferBuilder)();
|
|
283
|
+
(0, should_1.default)(() => builder.recipients([{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: 'invalid' }])).throw();
|
|
284
|
+
});
|
|
285
|
+
it('should accept zero amount', async function () {
|
|
286
|
+
const recipients = [{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: '0' }];
|
|
287
|
+
const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(recipients).build());
|
|
288
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
289
|
+
tx.outputs[0].value.should.equal('0');
|
|
290
|
+
});
|
|
291
|
+
it('should accept very large amount', async function () {
|
|
292
|
+
const largeAmount = '999999999999999999';
|
|
293
|
+
const recipients = [{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: largeAmount }];
|
|
294
|
+
const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(recipients).build());
|
|
295
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
296
|
+
tx.outputs[0].value.should.equal(largeAmount);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
describe('Required Field Validation', () => {
|
|
300
|
+
it('should fail when missing sender', async function () {
|
|
301
|
+
const builder = factory
|
|
302
|
+
.getTransferBuilder()
|
|
303
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
304
|
+
.paymentObjects(testHelpers_1.testData.paymentObjects)
|
|
305
|
+
.gasData(testHelpers_1.testData.gasData);
|
|
306
|
+
await builder.build().should.be.rejected();
|
|
307
|
+
});
|
|
308
|
+
it('should fail when missing recipients', async function () {
|
|
309
|
+
const builder = factory
|
|
310
|
+
.getTransferBuilder()
|
|
311
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
312
|
+
.paymentObjects(testHelpers_1.testData.paymentObjects)
|
|
313
|
+
.gasData(testHelpers_1.testData.gasData);
|
|
314
|
+
await builder.build().should.be.rejected();
|
|
315
|
+
});
|
|
316
|
+
it('should fail for empty recipients', async function () {
|
|
317
|
+
const builder = factory
|
|
318
|
+
.getTransferBuilder()
|
|
319
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
320
|
+
.recipients([])
|
|
321
|
+
.paymentObjects(testHelpers_1.testData.paymentObjects)
|
|
322
|
+
.gasData(testHelpers_1.testData.gasData);
|
|
323
|
+
await builder.build().should.be.rejected();
|
|
324
|
+
});
|
|
325
|
+
it('should allow empty payment objects', function () {
|
|
326
|
+
const builder = (0, testHelpers_1.createBasicTransferBuilder)();
|
|
327
|
+
should_1.default.doesNotThrow(() => builder.paymentObjects([]));
|
|
328
|
+
});
|
|
329
|
+
it('should fail without payment objects when using gas sponsor', async function () {
|
|
330
|
+
const builder = factory
|
|
331
|
+
.getTransferBuilder()
|
|
332
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
333
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
334
|
+
.gasData(testHelpers_1.testData.gasData)
|
|
335
|
+
.gasSponsor(testHelpers_1.testData.gasSponsor.address);
|
|
336
|
+
await builder.build().should.be.rejected();
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
describe('Gas Data Validation', () => {
|
|
340
|
+
it('should fail for empty gas payment objects', function () {
|
|
341
|
+
const builder = (0, testHelpers_1.createBasicTransferBuilder)();
|
|
342
|
+
(0, should_1.default)(() => builder.gasData({
|
|
343
|
+
gasBudget: testHelpers_1.testData.GAS_BUDGET,
|
|
344
|
+
gasPrice: testHelpers_1.testData.GAS_PRICE,
|
|
345
|
+
gasPaymentObjects: [],
|
|
346
|
+
})).throwError(/Gas input objects list is empty/);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
describe('Object Duplication Validation', () => {
|
|
350
|
+
it('should fail when payment and gas payment objects overlap', async function () {
|
|
351
|
+
const builder = factory
|
|
352
|
+
.getTransferBuilder()
|
|
353
|
+
.sender(testHelpers_1.testData.sender.address)
|
|
354
|
+
.recipients(testHelpers_1.testData.recipients)
|
|
355
|
+
.paymentObjects(testHelpers_1.testData.gasPaymentObjects)
|
|
356
|
+
.gasData(testHelpers_1.testData.gasData);
|
|
357
|
+
await builder.build().should.be.rejected();
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
describe('Transaction Parsing Validation', () => {
|
|
361
|
+
it('should fail to parse invalid raw transaction', function () {
|
|
362
|
+
(0, should_1.default)(() => factory.from('invalidRawTransaction')).throwError();
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
describe('Transaction Signing', () => {
|
|
367
|
+
it('should build transaction with sender signature', async function () {
|
|
368
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
369
|
+
tx.addSignature(testHelpers_1.testData.testSignature.publicKey, testHelpers_1.testData.testSignature.signature);
|
|
370
|
+
await tx.build();
|
|
371
|
+
should_1.default.exist(tx.serializedSignature);
|
|
372
|
+
should_1.default.equal(tx.serializedSignature.length > 0, true);
|
|
373
|
+
});
|
|
374
|
+
it('should build transaction with gas sponsor signature', async function () {
|
|
375
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithSponsor)().build());
|
|
376
|
+
tx.addGasSponsorSignature(testHelpers_1.testData.testGasSponsorSignature.publicKey, testHelpers_1.testData.testGasSponsorSignature.signature);
|
|
377
|
+
await tx.build();
|
|
378
|
+
should_1.default.exist(tx.serializedGasSponsorSignature);
|
|
379
|
+
should_1.default.equal(tx.serializedGasSponsorSignature.length > 0, true);
|
|
380
|
+
});
|
|
381
|
+
it('should build transaction with both sender and gas sponsor signatures', async function () {
|
|
382
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithSponsor)().build());
|
|
383
|
+
tx.addSignature(testHelpers_1.testData.testSignature.publicKey, testHelpers_1.testData.testSignature.signature);
|
|
384
|
+
tx.addGasSponsorSignature(testHelpers_1.testData.testGasSponsorSignature.publicKey, testHelpers_1.testData.testGasSponsorSignature.signature);
|
|
385
|
+
await tx.build();
|
|
386
|
+
should_1.default.exist(tx.serializedSignature);
|
|
387
|
+
should_1.default.exist(tx.serializedGasSponsorSignature);
|
|
388
|
+
tx.signature.length.should.equal(2);
|
|
389
|
+
tx.signature[0].should.equal(tx.serializedSignature);
|
|
390
|
+
tx.signature[1].should.equal(tx.serializedGasSponsorSignature);
|
|
391
|
+
});
|
|
392
|
+
it('should add signature through builder and serialize correctly', async function () {
|
|
393
|
+
const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
|
|
394
|
+
txBuilder.addSignature(testHelpers_1.testData.testSignature.publicKey, testHelpers_1.testData.testSignature.signature);
|
|
395
|
+
const tx = (await txBuilder.build());
|
|
396
|
+
should_1.default.exist(tx.serializedSignature);
|
|
397
|
+
should_1.default.equal(typeof tx.serializedSignature, 'string');
|
|
398
|
+
tx.signature.length.should.equal(1);
|
|
399
|
+
});
|
|
400
|
+
it('should fail to add invalid sender signature via builder', function () {
|
|
401
|
+
const txBuilder = (0, testHelpers_1.createTransferBuilderWithGas)();
|
|
402
|
+
(0, should_1.default)(() => txBuilder.addSignature({ pub: 'tooshort' }, testHelpers_1.testData.testSignature.signature)).throwError('Invalid transaction signature');
|
|
403
|
+
});
|
|
404
|
+
it('should fail to add invalid gas sponsor signature via builder', function () {
|
|
405
|
+
const txBuilder = (0, testHelpers_1.createTransferBuilderWithSponsor)();
|
|
406
|
+
(0, should_1.default)(() => txBuilder.addGasSponsorSignature(testHelpers_1.testData.testGasSponsorSignature.publicKey, Buffer.from('invalid'))).throwError('Invalid transaction signature');
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
describe('Signable Payload', () => {
|
|
410
|
+
it('should generate signable payload for non-simulate transaction', async function () {
|
|
411
|
+
const tx = (await (0, testHelpers_1.createTransferBuilderWithGas)().build());
|
|
412
|
+
should_1.default.equal(tx.isSimulateTx, false);
|
|
413
|
+
const signablePayload = tx.signablePayload;
|
|
414
|
+
should_1.default.exist(signablePayload);
|
|
415
|
+
should_1.default.equal(Buffer.isBuffer(signablePayload), true);
|
|
416
|
+
should_1.default.equal(signablePayload.length, 32); // Blake2b hash is 32 bytes
|
|
417
|
+
});
|
|
418
|
+
it('should fail to get signable payload for simulate transaction', async function () {
|
|
419
|
+
const tx = (await (0, testHelpers_1.createBasicTransferBuilder)().build());
|
|
420
|
+
should_1.default.equal(tx.isSimulateTx, true);
|
|
421
|
+
(0, should_1.default)(() => tx.signablePayload).throwError('Cannot sign a simulate tx');
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
describe('Input and Output Calculation', () => {
|
|
425
|
+
it('should calculate total input amount correctly for multiple recipients', async function () {
|
|
426
|
+
const recipients = [
|
|
427
|
+
{ address: testHelpers_1.testData.addresses.validAddresses[0], amount: '1000' },
|
|
428
|
+
{ address: testHelpers_1.testData.addresses.validAddresses[1], amount: '2000' },
|
|
429
|
+
{ address: testHelpers_1.testData.addresses.validAddresses[2], amount: '3000' },
|
|
430
|
+
];
|
|
431
|
+
const tx = (await (0, testHelpers_1.createBuilderWithRecipients)(recipients).build());
|
|
432
|
+
const expectedTotal = '6000';
|
|
433
|
+
tx.inputs[0].value.should.equal(expectedTotal);
|
|
434
|
+
tx.outputs.length.should.equal(3);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbURBQXVEO0FBQ3ZELDBEQUFxRjtBQUVyRix3REFjZ0M7QUFHaEMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHdCQUFVLEdBQUUsQ0FBQztJQUU3QixRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO1FBQzFDLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxLQUFLO1lBQzlELE1BQU0sU0FBUyxHQUFHLElBQUEsd0NBQTBCLEdBQUUsQ0FBQztZQUMvQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUF3QixDQUFDO1lBRTVELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQUEsOENBQWdDLEVBQUMsRUFBRSxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFBLHVDQUF5QixFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEtBQUs7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBQSwwQ0FBNEIsR0FBRSxDQUFDO1lBQ2pELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQXdCLENBQUM7WUFFNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElB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RixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDN0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTLCBNQVhfUkVDSVBJRU5UUyB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7XG4gIGNyZWF0ZUJhc2ljVHJhbnNmZXJCdWlsZGVyLFxuICBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzLFxuICBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoU3BvbnNvcixcbiAgY3JlYXRlQnVpbGRlcldpdGhSZWNpcGllbnRzLFxuICBjcmVhdGVCdWlsZGVyV2l0aEdhc09iamVjdHNPbmx5LFxuICBjcmVhdGVCdWlsZGVyV2l0aEdhc09iamVjdHMsXG4gIGFzc2VydEJhc2ljVHJhbnNhY3Rpb25Qcm9wZXJ0aWVzLFxuICBhc3NlcnRHYXNEYXRhLFxuICBhc3NlcnRJbnB1dHNBbmRPdXRwdXRzLFxuICBhc3NlcnRWYWxpZFJhd1RyYW5zYWN0aW9uLFxuICBjcmVhdGVSZWNpcGllbnRzLFxuICBnZXRGYWN0b3J5LFxuICB0ZXN0RGF0YSxcbn0gZnJvbSAnLi4vaGVscGVycy90ZXN0SGVscGVycyc7XG5pbXBvcnQgeyBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ0lvdGEgVHJhbnNmZXIgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTtcblxuICBkZXNjcmliZSgnQmFzaWMgVHJhbnNhY3Rpb24gQnVpbGRpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGluIHNpbXVsYXRlIG1vZGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVCYXNpY1RyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCB0cnVlKTtcbiAgICAgIGFzc2VydEJhc2ljVHJhbnNhY3Rpb25Qcm9wZXJ0aWVzKHR4KTtcbiAgICAgIGF3YWl0IGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggZ2FzIGRhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICAgIGFzc2VydEJhc2ljVHJhbnNhY3Rpb25Qcm9wZXJ0aWVzKHR4KTtcbiAgICAgIGFzc2VydEdhc0RhdGEodHgpO1xuICAgICAgYXNzZXJ0SW5wdXRzQW5kT3V0cHV0cyh0eCwgdGVzdERhdGEucmVjaXBpZW50cyk7XG4gICAgICBhd2FpdCBhc3NlcnRWYWxpZFJhd1RyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGdhcyBzcG9uc29yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aFNwb25zb3IoKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Lmdhc1Nwb25zb3IsIHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCBmYWxzZSk7XG4gICAgICBhd2FpdCBhc3NlcnRWYWxpZFJhd1RyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gdXNpbmcgZ2FzIG9iamVjdHMgd2hlbiBubyBwYXltZW50IG9iamVjdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyV2l0aEdhc09iamVjdHNPbmx5KCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIGZhbHNlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5wYXltZW50T2JqZWN0cywgdW5kZWZpbmVkKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eC5nYXNQYXltZW50T2JqZWN0cyk7XG4gICAgICBhd2FpdCBhc3NlcnRWYWxpZFJhd1RyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VwcG9ydCBtZXRob2QgY2hhaW5pbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKVxuICAgICAgICAucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKVxuICAgICAgICAucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpXG4gICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpXG4gICAgICAgIC5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcylcbiAgICAgICAgLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5leGlzdCh0eCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguZ2FzU3BvbnNvciwgdGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1NlcmlhbGl6YXRpb24gYW5kIERlc2VyaWFsaXphdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSB0byBKU09OIGFuZCByZWJ1aWxkIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgY29uc3QgcmVidWlsdFR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAocmVidWlsdFR4QnVpbGRlci50cmFuc2FjdGlvbiBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uKS5wYXJzZUZyb21KU09OKHR4SnNvbik7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgcmVidWlsdFR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNlbmRlciwgdHguc2VuZGVyKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVidWlsdFR4LnJlY2lwaWVudHMsIHR4LnJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5nYXNCdWRnZXQsIHR4Lmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4Lmdhc1ByaWNlLCB0eC5nYXNQcmljZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNlcmlhbGl6ZSB0byBicm9hZGNhc3QgZm9ybWF0IGNvbnNpc3RlbnRseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4MSA9IChhd2FpdCBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHJhd1R4MSA9IGF3YWl0IHR4MS50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB0eDIgPSAoYXdhaXQgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByYXdUeDIgPSBhd2FpdCB0eDIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4MSwgcmF3VHgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgdG9KU09OIG91dHB1dCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uc2VuZGVyLCB0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5yZWNpcGllbnRzLCB0ZXN0RGF0YS5yZWNpcGllbnRzKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLnBheW1lbnRPYmplY3RzLCB0ZXN0RGF0YS5wYXltZW50T2JqZWN0cyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuR0FTX0JVREdFVCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmdhc1ByaWNlLCB0ZXN0RGF0YS5HQVNfUFJJQ0UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZ2FzUGF5bWVudE9iamVjdHMsIHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUm91bmQtdHJpcCBQYXJzaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IHBhcnNlIGFuZCByZWJ1aWxkIHRyYW5zYWN0aW9uIHVzaW5nIGdhcyBvYmplY3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlQnVpbGRlcldpdGhHYXNPYmplY3RzT25seSgpLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCByYXdUeCA9IGF3YWl0IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCB0eEhleCA9IEJ1ZmZlci5mcm9tKHJhd1R4LCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBjb25zdCByZWJ1aWx0QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eEhleCk7XG4gICAgICBjb25zdCByZWJ1aWx0VHggPSAoYXdhaXQgcmVidWlsdEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5zZW5kZXIsIHR4LnNlbmRlcik7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHJlYnVpbHRUeC5yZWNpcGllbnRzLCB0eC5yZWNpcGllbnRzKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHguZ2FzQnVkZ2V0LCB0eC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5nYXNQcmljZSwgdHguZ2FzUHJpY2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC5wYXltZW50T2JqZWN0cywgdW5kZWZpbmVkKTtcbiAgICAgIHNob3VsZC5leGlzdChyZWJ1aWx0VHguZ2FzUGF5bWVudE9iamVjdHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgcGFyc2UgdHJhbnNhY3Rpb24gd2l0aCBwYXltZW50IG9iamVjdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHJhd1R4ID0gYXdhaXQgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IHR4SGV4ID0gQnVmZmVyLmZyb20ocmF3VHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGNvbnN0IHJlYnVpbHRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICAgIGNvbnN0IHJlYnVpbHRUeCA9IChhd2FpdCByZWJ1aWx0QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXhpc3QocmVidWlsdFR4LnBheW1lbnRPYmplY3RzKTtcbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgucGF5bWVudE9iamVjdHM/Lmxlbmd0aCwgdGVzdERhdGEucGF5bWVudE9iamVjdHMubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHJvdW5kLXRyaXAgd2l0aCBnYXMgc3BvbnNvciBhbmQgcGF5bWVudCBvYmplY3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aFNwb25zb3IoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgcmF3VHggPSBhd2FpdCB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3QgdHhIZXggPSBCdWZmZXIuZnJvbShyYXdUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgY29uc3QgcmVidWlsdEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHhIZXgpO1xuICAgICAgY29uc3QgcmVidWlsdFR4ID0gKGF3YWl0IHJlYnVpbHRCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHguZ2FzU3BvbnNvciwgdGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcbiAgICAgIHNob3VsZC5leGlzdChyZWJ1aWx0VHgucGF5bWVudE9iamVjdHMpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjaXBpZW50IEhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3RDYXNlcyA9IFtcbiAgICAgIHsgY291bnQ6IDEsIGRlc2NyaXB0aW9uOiAnc2luZ2xlIHJlY2lwaWVudCcgfSxcbiAgICAgIHsgY291bnQ6IDEwLCBkZXNjcmlwdGlvbjogJ211bHRpcGxlIHJlY2lwaWVudHMnIH0sXG4gICAgICB7IGNvdW50OiBNQVhfUkVDSVBJRU5UUywgZGVzY3JpcHRpb246ICdtYXhpbXVtIHJlY2lwaWVudHMnIH0sXG4gICAgXTtcblxuICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh7IGNvdW50LCBkZXNjcmlwdGlvbiB9KSA9PiB7XG4gICAgICBpdChgc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggJHtkZXNjcmlwdGlvbn1gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBjcmVhdGVSZWNpcGllbnRzKGNvdW50LCAnMTAwMCcpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCdWlsZGVyV2l0aFJlY2lwaWVudHMocmVjaXBpZW50cykuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoY291bnQpO1xuICAgICAgICB0eC5vdXRwdXRzLmZvckVhY2goKG91dHB1dCkgPT4ge1xuICAgICAgICAgIG91dHB1dC52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICAgICAgICBvdXRwdXQuY29pbj8uc2hvdWxkLmVxdWFsKCd0aW90YScpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGggbW9yZSB0aGFuIE1BWF9SRUNJUElFTlRTJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IGNyZWF0ZVJlY2lwaWVudHMoTUFYX1JFQ0lQSUVOVFMgKyAxKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCdWlsZGVyV2l0aFJlY2lwaWVudHMocmVjaXBpZW50cyk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgcmVjaXBpZW50IGFkZHJlc3NlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZVJlY2lwaWVudHMgPSBbXG4gICAgICAgIHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLCBhbW91bnQ6ICcxMDAwJyB9LFxuICAgICAgICB7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSwgYW1vdW50OiAnMjAwMCcgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCdWlsZGVyV2l0aFJlY2lwaWVudHMoZHVwbGljYXRlUmVjaXBpZW50cykuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0dhcyBPYmplY3QgSGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCB3aXRoIHNpbmdsZSBnYXMgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlQnVpbGRlcldpdGhHYXNPYmplY3RzKFt0ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0c1swXV0pLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXhpc3QodHguZ2FzUGF5bWVudE9iamVjdHMpO1xuICAgICAgdHguZ2FzUGF5bWVudE9iamVjdHM/Lmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBhd2FpdCBhc3NlcnRWYWxpZFJhd1RyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBleGFjdGx5IE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTIGdhcyBvYmplY3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ3JlYXRlIGV4YWN0bHkgTUFYX0dBU19QQVlNRU5UX09CSkVDVFMgKDI1Nikgd2l0aCB2YWxpZCBkaWdlc3RzXG4gICAgICBjb25zdCBleGFjdGx5TWF4R2FzT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTOyBpKyspIHtcbiAgICAgICAgZXhhY3RseU1heEdhc09iamVjdHMucHVzaCh7XG4gICAgICAgICAgLi4udGVzdERhdGEuZ2FzUGF5bWVudE9iamVjdHNbaSAlIHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aF0sXG4gICAgICAgICAgb2JqZWN0SWQ6IGAweCR7aS50b1N0cmluZygxNikucGFkU3RhcnQoNjQsICcwJyl9YCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZUJ1aWxkZXJXaXRoR2FzT2JqZWN0cyhleGFjdGx5TWF4R2FzT2JqZWN0cykuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICAgIGF3YWl0IGFzc2VydFZhbGlkUmF3VHJhbnNhY3Rpb24odHgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB3aXRoIG1vcmUgdGhhbiBNQVhfR0FTX1BBWU1FTlRfT0JKRUNUUyByZXF1aXJpbmcgbWVyZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDcmVhdGUgbW9yZSB0aGFuIE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTICgyNTYpIHRvIHRlc3QgbWVyZ2UgbG9naWNcbiAgICAgIGNvbnN0IG1hbnlHYXNPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTUFYX0dBU19QQVlNRU5UX09CSkVDVFMgKyAxMDsgaSsrKSB7XG4gICAgICAgIG1hbnlHYXNPYmplY3RzLnB1c2goe1xuICAgICAgICAgIC4uLnRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzW2kgJSB0ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGhdLFxuICAgICAgICAgIG9iamVjdElkOiBgMHgke2kudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDY0LCAnMCcpfWAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCdWlsZGVyV2l0aEdhc09iamVjdHMobWFueUdhc09iamVjdHMpLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCBmYWxzZSk7XG4gICAgICBhd2FpdCBhc3NlcnRWYWxpZFJhd1RyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1BheW1lbnQgT2JqZWN0IEhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBzaW5nbGUgcGF5bWVudCBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcylcbiAgICAgICAgLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cylcbiAgICAgICAgLnBheW1lbnRPYmplY3RzKFt0ZXN0RGF0YS5wYXltZW50T2JqZWN0c1swXV0pXG4gICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHgucGF5bWVudE9iamVjdHM/Lmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBhd2FpdCBhc3NlcnRWYWxpZFJhd1RyYW5zYWN0aW9uKHR4KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQga2VlcCBwYXltZW50IGFuZCBnYXMgb2JqZWN0cyBzZXBhcmF0ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXhpc3QodHgucGF5bWVudE9iamVjdHMpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4Lmdhc1BheW1lbnRPYmplY3RzKTtcbiAgICAgIHR4LnBheW1lbnRPYmplY3RzPy5sZW5ndGguc2hvdWxkLmVxdWFsKHRlc3REYXRhLnBheW1lbnRPYmplY3RzLmxlbmd0aCk7XG4gICAgICB0eC5nYXNQYXltZW50T2JqZWN0cz8ubGVuZ3RoLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgcGF5bWVudCBvYmplY3RzIHdpdGggZGlmZmVyZW50IHZlcnNpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWl4ZWRWZXJzaW9uT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb2JqZWN0SWQ6ICcweDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnLFxuICAgICAgICAgIHZlcnNpb246ICcxJyxcbiAgICAgICAgICBkaWdlc3Q6ICdER1ZoWWprNllId2RQZFpCZ0JOOGN6YXZ5OEx2YnJzaGtieEY5NjNFVzdtQicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvYmplY3RJZDogJzB4MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMicsXG4gICAgICAgICAgdmVyc2lvbjogJzk5OTk5OScsXG4gICAgICAgICAgZGlnZXN0OiAnRG9Kd1h1ejlvVTVZNXY1dkJSaVRnaXNWVFF1WlFMbUhaV2VxSnp6RDVRVUUnLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpXG4gICAgICAgIC5wYXltZW50T2JqZWN0cyhtaXhlZFZlcnNpb25PYmplY3RzKVxuICAgICAgICAuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4LnBheW1lbnRPYmplY3RzPy5sZW5ndGguc2hvdWxkLmVxdWFsKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgZW1wdHkgcGF5bWVudCBvYmplY3RzIGFycmF5IGFuZCB1c2UgZ2FzIG9iamVjdHMgZm9yIHBheW1lbnQgaW4gbm9uLXNwb25zb3IgbW9kZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKVxuICAgICAgICAucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKVxuICAgICAgICAucGF5bWVudE9iamVjdHMoW10pXG4gICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LmlzU2ltdWxhdGVUeCwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlbmRlciwgdGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpO1xuICAgICAgYXdhaXQgYXNzZXJ0VmFsaWRSYXdUcmFuc2FjdGlvbih0eCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdHggYnVpbGRpbmcgaW4gY2FzZSBvZiBlbXB0eSBwYXltZW50IG9iamVjdHMgaW4gc3BvbnNvciBtb2RlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpXG4gICAgICAgIC5nYXNTcG9uc29yKHRlc3REYXRhLmdhc1Nwb25zb3IuYWRkcmVzcylcbiAgICAgICAgLnJlY2lwaWVudHModGVzdERhdGEucmVjaXBpZW50cylcbiAgICAgICAgLnBheW1lbnRPYmplY3RzKFtdKVxuICAgICAgICAuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL1BheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQgd2hlbiB1c2luZyBhIGdhcyBzcG9uc29yLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWYWxpZGF0aW9uIEVycm9ycycsICgpID0+IHtcbiAgICBkZXNjcmliZSgnQWRkcmVzcyBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBpbnZhbGlkIHNlbmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBidWlsZGVyLnNlbmRlcigncmFuZG9tU3RyaW5nJykpLnRocm93RXJyb3IoJ0ludmFsaWQgYWRkcmVzcyByYW5kb21TdHJpbmcnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgcmVjaXBpZW50IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVCYXNpY1RyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5yZWNpcGllbnRzKFt7IGFkZHJlc3M6ICdpbnZhbGlkQWRkcmVzcycsIGFtb3VudDogJzEwMDAnIH1dKSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBhZGRyZXNzIGludmFsaWRBZGRyZXNzJ1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnQW1vdW50IFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIG5lZ2F0aXZlIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZUJhc2ljVHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICAgIGJ1aWxkZXIucmVjaXBpZW50cyhbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogJy0xMDAwJyB9XSlcbiAgICAgICAgKS50aHJvd0Vycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGludmFsaWQgZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSwgYW1vdW50OiAnaW52YWxpZCcgfV0pXG4gICAgICAgICkudGhyb3coKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGFjY2VwdCB6ZXJvIGFtb3VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSwgYW1vdW50OiAnMCcgfV07XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZUJ1aWxkZXJXaXRoUmVjaXBpZW50cyhyZWNpcGllbnRzKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBhY2NlcHQgdmVyeSBsYXJnZSBhbW91bnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGxhcmdlQW1vdW50ID0gJzk5OTk5OTk5OTk5OTk5OTk5OSc7XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogbGFyZ2VBbW91bnQgfV07XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZUJ1aWxkZXJXaXRoUmVjaXBpZW50cyhyZWNpcGllbnRzKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHR4Lm91dHB1dHNbMF0udmFsdWUuc2hvdWxkLmVxdWFsKGxhcmdlQW1vdW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1JlcXVpcmVkIEZpZWxkIFZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBtaXNzaW5nIHNlbmRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgICAucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKVxuICAgICAgICAgIC5wYXltZW50T2JqZWN0cyh0ZXN0RGF0YS5wYXltZW50T2JqZWN0cylcbiAgICAgICAgICAuZ2FzRGF0YSh0ZXN0RGF0YS5nYXNEYXRhKTtcblxuICAgICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdoZW4gbWlzc2luZyByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAgIC5nZXRUcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAgIC5zZW5kZXIodGVzdERhdGEuc2VuZGVyLmFkZHJlc3MpXG4gICAgICAgICAgLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLnBheW1lbnRPYmplY3RzKVxuICAgICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgZm9yIGVtcHR5IHJlY2lwaWVudHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcylcbiAgICAgICAgICAucmVjaXBpZW50cyhbXSlcbiAgICAgICAgICAucGF5bWVudE9iamVjdHModGVzdERhdGEucGF5bWVudE9iamVjdHMpXG4gICAgICAgICAgLmdhc0RhdGEodGVzdERhdGEuZ2FzRGF0YSk7XG5cbiAgICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYWxsb3cgZW1wdHkgcGF5bWVudCBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnBheW1lbnRPYmplY3RzKFtdKSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWlsIHdpdGhvdXQgcGF5bWVudCBvYmplY3RzIHdoZW4gdXNpbmcgZ2FzIHNwb25zb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5XG4gICAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgICAgLnNlbmRlcih0ZXN0RGF0YS5zZW5kZXIuYWRkcmVzcylcbiAgICAgICAgICAucmVjaXBpZW50cyh0ZXN0RGF0YS5yZWNpcGllbnRzKVxuICAgICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpXG4gICAgICAgICAgLmdhc1Nwb25zb3IodGVzdERhdGEuZ2FzU3BvbnNvci5hZGRyZXNzKTtcblxuICAgICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdHYXMgRGF0YSBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGZvciBlbXB0eSBnYXMgcGF5bWVudCBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gY3JlYXRlQmFzaWNUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgICAgYnVpbGRlci5nYXNEYXRhKHtcbiAgICAgICAgICAgIGdhc0J1ZGdldDogdGVzdERhdGEuR0FTX0JVREdFVCxcbiAgICAgICAgICAgIGdhc1ByaWNlOiB0ZXN0RGF0YS5HQVNfUFJJQ0UsXG4gICAgICAgICAgICBnYXNQYXltZW50T2JqZWN0czogW10sXG4gICAgICAgICAgfSlcbiAgICAgICAgKS50aHJvd0Vycm9yKC9HYXMgaW5wdXQgb2JqZWN0cyBsaXN0IGlzIGVtcHR5Lyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdPYmplY3QgRHVwbGljYXRpb24gVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIHBheW1lbnQgYW5kIGdhcyBwYXltZW50IG9iamVjdHMgb3ZlcmxhcCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgICAuc2VuZGVyKHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKVxuICAgICAgICAgIC5yZWNpcGllbnRzKHRlc3REYXRhLnJlY2lwaWVudHMpXG4gICAgICAgICAgLnBheW1lbnRPYmplY3RzKHRlc3REYXRhLmdhc1BheW1lbnRPYmplY3RzKVxuICAgICAgICAgIC5nYXNEYXRhKHRlc3REYXRhLmdhc0RhdGEpO1xuXG4gICAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFBhcnNpbmcgVmFsaWRhdGlvbicsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB0byBwYXJzZSBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2hvdWxkKCgpID0+IGZhY3RvcnkuZnJvbSgnaW52YWxpZFJhd1RyYW5zYWN0aW9uJykpLnRocm93RXJyb3IoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gU2lnbmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggc2VuZGVyIHNpZ25hdHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgdHguYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIGF3YWl0IHR4LmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHguc2VyaWFsaXplZFNpZ25hdHVyZSEubGVuZ3RoID4gMCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRyYW5zYWN0aW9uIHdpdGggZ2FzIHNwb25zb3Igc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aFNwb25zb3IoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgdHguYWRkR2FzU3BvbnNvclNpZ25hdHVyZSh0ZXN0RGF0YS50ZXN0R2FzU3BvbnNvclNpZ25hdHVyZS5wdWJsaWNLZXksIHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIGF3YWl0IHR4LmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXhpc3QodHguc2VyaWFsaXplZEdhc1Nwb25zb3JTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRHYXNTcG9uc29yU2lnbmF0dXJlIS5sZW5ndGggPiAwLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBib3RoIHNlbmRlciBhbmQgZ2FzIHNwb25zb3Igc2lnbmF0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhTcG9uc29yKCkuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgdHguYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG4gICAgICB0eC5hZGRHYXNTcG9uc29yU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RHYXNTcG9uc29yU2lnbmF0dXJlLnB1YmxpY0tleSwgdGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUuc2lnbmF0dXJlKTtcblxuICAgICAgYXdhaXQgdHguYnVpbGQoKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eC5zZXJpYWxpemVkU2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eC5zZXJpYWxpemVkR2FzU3BvbnNvclNpZ25hdHVyZSk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgICAgIHR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwodHguc2VyaWFsaXplZFNpZ25hdHVyZSk7XG4gICAgICB0eC5zaWduYXR1cmVbMV0uc2hvdWxkLmVxdWFsKHR4LnNlcmlhbGl6ZWRHYXNTcG9uc29yU2lnbmF0dXJlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIHNpZ25hdHVyZSB0aHJvdWdoIGJ1aWxkZXIgYW5kIHNlcmlhbGl6ZSBjb3JyZWN0bHknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjcmVhdGVUcmFuc2ZlckJ1aWxkZXJXaXRoR2FzKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHRlc3REYXRhLnRlc3RTaWduYXR1cmUucHVibGljS2V5LCB0ZXN0RGF0YS50ZXN0U2lnbmF0dXJlLnNpZ25hdHVyZSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4LnNlcmlhbGl6ZWRTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR5cGVvZiB0eC5zZXJpYWxpemVkU2lnbmF0dXJlLCAnc3RyaW5nJyk7XG4gICAgICB0eC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBhZGQgaW52YWxpZCBzZW5kZXIgc2lnbmF0dXJlIHZpYSBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3JlYXRlVHJhbnNmZXJCdWlsZGVyV2l0aEdhcygpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6ICd0b29zaG9ydCcgfSwgdGVzdERhdGEudGVzdFNpZ25hdHVyZS5zaWduYXR1cmUpKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiBzaWduYXR1cmUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGFkZCBpbnZhbGlkIGdhcyBzcG9uc29yIHNpZ25hdHVyZSB2aWEgYnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhTcG9uc29yKCk7XG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmFkZEdhc1Nwb25zb3JTaWduYXR1cmUodGVzdERhdGEudGVzdEdhc1Nwb25zb3JTaWduYXR1cmUucHVibGljS2V5LCBCdWZmZXIuZnJvbSgnaW52YWxpZCcpKVxuICAgICAgKS50aHJvd0Vycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uIHNpZ25hdHVyZScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2lnbmFibGUgUGF5bG9hZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGdlbmVyYXRlIHNpZ25hYmxlIHBheWxvYWQgZm9yIG5vbi1zaW11bGF0ZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGNyZWF0ZVRyYW5zZmVyQnVpbGRlcldpdGhHYXMoKS5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHguaXNTaW11bGF0ZVR4LCBmYWxzZSk7XG4gICAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBzaG91bGQuZXhpc3Qoc2lnbmFibGVQYXlsb2FkKTtcbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuaXNCdWZmZXIoc2lnbmFibGVQYXlsb2FkKSwgdHJ1ZSk7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmFibGVQYXlsb2FkLmxlbmd0aCwgMzIpOyAvLyBCbGFrZTJiIGhhc2ggaXMgMzIgYnl0ZXNcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBnZXQgc2lnbmFibGUgcGF5bG9hZCBmb3Igc2ltdWxhdGUgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCYXNpY1RyYW5zZmVyQnVpbGRlcigpLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pc1NpbXVsYXRlVHgsIHRydWUpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4LnNpZ25hYmxlUGF5bG9hZCkudGhyb3dFcnJvcignQ2Fubm90IHNpZ24gYSBzaW11bGF0ZSB0eCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSW5wdXQgYW5kIE91dHB1dCBDYWxjdWxhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0b3RhbCBpbnB1dCBhbW91bnQgY29ycmVjdGx5IGZvciBtdWx0aXBsZSByZWNpcGllbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50cyA9IFtcbiAgICAgICAgeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sIGFtb3VudDogJzEwMDAnIH0sXG4gICAgICAgIHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzFdLCBhbW91bnQ6ICcyMDAwJyB9LFxuICAgICAgICB7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1syXSwgYW1vdW50OiAnMzAwMCcgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCBjcmVhdGVCdWlsZGVyV2l0aFJlY2lwaWVudHMocmVjaXBpZW50cykuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRUb3RhbCA9ICc2MDAwJztcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoZXhwZWN0ZWRUb3RhbCk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferTransaction.d.ts","sourceRoot":"","sources":["../../../test/unit/transferTransaction.ts"],"names":[],"mappings":""}
|