@bitgo/sdk-coin-flrp 1.3.3 → 1.4.0
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/dist/src/flrp.d.ts +6 -75
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +13 -298
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/lib/ExportInCTxBuilder.d.ts +51 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +186 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +273 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +215 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +180 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
- package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -79
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +138 -281
- package/dist/src/lib/iface.d.ts +50 -51
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +22 -10
- package/dist/src/lib/index.d.ts +2 -3
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +5 -6
- package/dist/src/lib/keyPair.d.ts +1 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +9 -5
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
- package/dist/src/lib/transaction.d.ts +8 -73
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +159 -210
- package/dist/src/lib/transactionBuilder.d.ts +56 -34
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +113 -70
- package/dist/src/lib/transactionBuilderFactory.d.ts +35 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +133 -74
- package/dist/src/lib/utils.d.ts +73 -151
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +197 -390
- package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +34 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/resources/transactionData/importInC.d.ts +27 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +44 -0
- package/dist/test/resources/transactionData/importInP.d.ts +35 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +58 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +95 -513
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.js +110 -366
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +40 -251
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +61 -489
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
- package/dist/test/unit/lib/utils.js +29 -302
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -10
- package/dist/src/iface.d.ts +0 -25
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/lib/constants.d.ts +0 -170
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -227
- package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/delegatorTxBuilder.js +0 -224
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -199
- package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInPTxBuilder.js +0 -120
- package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
- package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInCTxBuilder.js +0 -403
- package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
- package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInPTxBuilder.js +0 -464
- package/dist/src/lib/types.d.ts +0 -78
- package/dist/src/lib/types.d.ts.map +0 -1
- package/dist/src/lib/types.js +0 -5
- package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
- package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/validatorTxBuilder.js +0 -180
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
- package/dist/test/unit/flrp.d.ts +0 -2
- package/dist/test/unit/flrp.d.ts.map +0 -1
- package/dist/test/unit/flrp.js +0 -118
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
- package/dist/test/unit/lib/transaction.d.ts +0 -2
- package/dist/test/unit/lib/transaction.d.ts.map +0 -1
- package/dist/test/unit/lib/transaction.js +0 -460
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
- package/dist/test/unit/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
- package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
- package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder.test.js +0 -114
- package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/validatorTxBuilder.test.js +0 -293
|
@@ -36,549 +36,131 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
const statics_1 = require("@bitgo/statics");
|
|
37
37
|
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
38
38
|
const assert = __importStar(require("assert"));
|
|
39
|
-
const
|
|
39
|
+
const transactionBuilderFactory_1 = require("../../../src/lib/transactionBuilderFactory");
|
|
40
|
+
const exportInC_1 = require("../../resources/transactionData/exportInC");
|
|
40
41
|
describe('ExportInCTxBuilder', function () {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
});
|
|
46
|
-
describe('Constructor', function () {
|
|
47
|
-
it('should initialize with coin config', function () {
|
|
48
|
-
assert.ok(builder);
|
|
49
|
-
assert.ok(builder instanceof exportInCTxBuilder_1.ExportInCTxBuilder);
|
|
50
|
-
});
|
|
51
|
-
it('should extend AtomicInCTransactionBuilder', function () {
|
|
52
|
-
// Test inheritance
|
|
53
|
-
assert.ok(builder);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
describe('UTXO Override', function () {
|
|
57
|
-
it('should throw error when trying to set UTXOs', function () {
|
|
58
|
-
const mockUtxos = [{ id: 'test' }];
|
|
59
|
-
assert.throws(() => {
|
|
60
|
-
builder.utxos(mockUtxos);
|
|
61
|
-
}, sdk_core_1.BuildTransactionError, 'Should reject UTXOs for C-chain export transactions');
|
|
62
|
-
});
|
|
63
|
-
it('should throw error for empty UTXO array', function () {
|
|
42
|
+
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'));
|
|
43
|
+
const txBuilder = factory.getExportInCBuilder();
|
|
44
|
+
describe('utxos ExportInCTxBuilder', function () {
|
|
45
|
+
it('should throw an error when utxos are used', async function () {
|
|
64
46
|
assert.throws(() => {
|
|
65
|
-
|
|
66
|
-
}, sdk_core_1.BuildTransactionError
|
|
67
|
-
});
|
|
68
|
-
it('should throw error for any UTXO input', function () {
|
|
69
|
-
const testCases = [[], [{}], ['invalid'], null, undefined];
|
|
70
|
-
testCases.forEach((testCase, index) => {
|
|
71
|
-
assert.throws(() => {
|
|
72
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
|
-
builder.utxos(testCase);
|
|
74
|
-
}, sdk_core_1.BuildTransactionError, `Test case ${index} should throw error`);
|
|
75
|
-
});
|
|
47
|
+
txBuilder.utxos([]);
|
|
48
|
+
}, new sdk_core_1.BuildTransactionError('utxos are not required in Export Tx in C-Chain'));
|
|
76
49
|
});
|
|
77
50
|
});
|
|
78
|
-
describe('
|
|
79
|
-
it('should
|
|
80
|
-
const validAmounts = [
|
|
51
|
+
describe('amount ExportInCTxBuilder', function () {
|
|
52
|
+
it('should accept valid amounts in different formats', function () {
|
|
53
|
+
const validAmounts = [BigInt(1000), '1000'];
|
|
81
54
|
validAmounts.forEach((amount) => {
|
|
82
55
|
assert.doesNotThrow(() => {
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
it('should set bigint amounts', function () {
|
|
88
|
-
const bigintAmounts = [1000n, 1000000000000000000n, 999999999999999999n];
|
|
89
|
-
bigintAmounts.forEach((amount) => {
|
|
90
|
-
assert.doesNotThrow(() => {
|
|
91
|
-
builder.amount(amount);
|
|
92
|
-
}, `Should accept bigint amount: ${amount}`);
|
|
56
|
+
txBuilder.amount(amount);
|
|
57
|
+
});
|
|
93
58
|
});
|
|
94
59
|
});
|
|
95
|
-
it('should
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
assert.doesNotThrow(() => {
|
|
99
|
-
builder.amount(amount);
|
|
100
|
-
}, `Should accept numeric amount: ${amount}`);
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
it('should reject zero amount', function () {
|
|
104
|
-
assert.throws(() => {
|
|
105
|
-
builder.amount(0);
|
|
106
|
-
}, /Amount must be positive/);
|
|
107
|
-
assert.throws(() => {
|
|
108
|
-
builder.amount('0');
|
|
109
|
-
}, /Amount must be positive/);
|
|
110
|
-
assert.throws(() => {
|
|
111
|
-
builder.amount(0n);
|
|
112
|
-
}, /Amount must be positive/);
|
|
113
|
-
});
|
|
114
|
-
it('should reject negative amounts', function () {
|
|
115
|
-
const negativeAmounts = ['-1000', '-1'];
|
|
116
|
-
negativeAmounts.forEach((amount) => {
|
|
60
|
+
it('should throw error for invalid amounts', function () {
|
|
61
|
+
const invalidAmounts = ['0', '-1'];
|
|
62
|
+
invalidAmounts.forEach((amount) => {
|
|
117
63
|
assert.throws(() => {
|
|
118
|
-
|
|
119
|
-
}, sdk_core_1.BuildTransactionError
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
it('should handle large amounts', function () {
|
|
123
|
-
const largeAmounts = [
|
|
124
|
-
'100000000000000000000000', // Very large amount
|
|
125
|
-
'18446744073709551615', // Near uint64 max
|
|
126
|
-
BigInt('999999999999999999999999999999'),
|
|
127
|
-
];
|
|
128
|
-
largeAmounts.forEach((amount) => {
|
|
129
|
-
assert.doesNotThrow(() => {
|
|
130
|
-
builder.amount(amount);
|
|
131
|
-
}, `Should handle large amount: ${amount}`);
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
it('should chain amount setting with other methods', function () {
|
|
135
|
-
const amount = '1000000000000000000';
|
|
136
|
-
const nonce = 1n;
|
|
137
|
-
assert.doesNotThrow(() => {
|
|
138
|
-
builder.amount(amount).nonce(nonce);
|
|
64
|
+
txBuilder.amount(amount);
|
|
65
|
+
}, sdk_core_1.BuildTransactionError);
|
|
139
66
|
});
|
|
140
67
|
});
|
|
141
68
|
});
|
|
142
|
-
describe('
|
|
143
|
-
it('should
|
|
144
|
-
const validNonces = [
|
|
69
|
+
describe('nonce ExportInCTxBuilder', function () {
|
|
70
|
+
it('should accept valid nonces in different formats', function () {
|
|
71
|
+
const validNonces = ['1', 1, 0];
|
|
145
72
|
validNonces.forEach((nonce) => {
|
|
146
73
|
assert.doesNotThrow(() => {
|
|
147
|
-
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
it('should set string nonce values', function () {
|
|
152
|
-
const stringNonces = ['0', '1', '1000', '999999999999'];
|
|
153
|
-
stringNonces.forEach((nonce) => {
|
|
154
|
-
assert.doesNotThrow(() => {
|
|
155
|
-
builder.nonce(nonce);
|
|
156
|
-
}, `Should accept string nonce: ${nonce}`);
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
it('should set numeric nonce values', function () {
|
|
160
|
-
const numericNonces = [0, 1, 1000, 999999];
|
|
161
|
-
numericNonces.forEach((nonce) => {
|
|
162
|
-
assert.doesNotThrow(() => {
|
|
163
|
-
builder.nonce(nonce);
|
|
164
|
-
}, `Should accept numeric nonce: ${nonce}`);
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
it('should reject negative nonce values', function () {
|
|
168
|
-
const negativeNonces = [-1n, -1000n];
|
|
169
|
-
negativeNonces.forEach((nonce) => {
|
|
170
|
-
assert.throws(() => {
|
|
171
|
-
builder.nonce(nonce);
|
|
172
|
-
}, sdk_core_1.BuildTransactionError, `Should reject negative nonce: ${nonce}`);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
it('should reject negative string nonce values', function () {
|
|
176
|
-
const negativeStringNonces = ['-1', '-1000'];
|
|
177
|
-
negativeStringNonces.forEach((nonce) => {
|
|
178
|
-
assert.throws(() => {
|
|
179
|
-
builder.nonce(nonce);
|
|
180
|
-
}, sdk_core_1.BuildTransactionError, `Should reject negative string nonce: ${nonce}`);
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
it('should handle large nonce values', function () {
|
|
184
|
-
const largeNonces = [
|
|
185
|
-
'18446744073709551615', // Max uint64
|
|
186
|
-
BigInt('999999999999999999999999999999'),
|
|
187
|
-
1000000000000000000n,
|
|
188
|
-
];
|
|
189
|
-
largeNonces.forEach((nonce) => {
|
|
190
|
-
assert.doesNotThrow(() => {
|
|
191
|
-
builder.nonce(nonce);
|
|
192
|
-
}, `Should handle large nonce: ${nonce}`);
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
it('should chain nonce setting with other methods', function () {
|
|
196
|
-
const nonce = 123n;
|
|
197
|
-
const amount = '1000000000000000000';
|
|
198
|
-
assert.doesNotThrow(() => {
|
|
199
|
-
builder.nonce(nonce).amount(amount);
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
describe('Destination Address Management', function () {
|
|
204
|
-
it('should set single destination address', function () {
|
|
205
|
-
const singleAddress = 'P-flare1destination';
|
|
206
|
-
assert.doesNotThrow(() => {
|
|
207
|
-
builder.to(singleAddress);
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
it('should set multiple destination addresses', function () {
|
|
211
|
-
const multipleAddresses = ['P-flare1dest1', 'P-flare1dest2', 'P-flare1dest3'];
|
|
212
|
-
assert.doesNotThrow(() => {
|
|
213
|
-
builder.to(multipleAddresses);
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
it('should handle comma-separated addresses', function () {
|
|
217
|
-
const commaSeparated = 'P-flare1dest1~P-flare1dest2~P-flare1dest3';
|
|
218
|
-
assert.doesNotThrow(() => {
|
|
219
|
-
builder.to(commaSeparated);
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
it('should handle empty address array', function () {
|
|
223
|
-
assert.doesNotThrow(() => {
|
|
224
|
-
builder.to([]);
|
|
225
|
-
});
|
|
226
|
-
});
|
|
227
|
-
it('should chain address setting with other methods', function () {
|
|
228
|
-
const addresses = ['P-flare1dest1', 'P-flare1dest2'];
|
|
229
|
-
const amount = '1000000000000000000';
|
|
230
|
-
assert.doesNotThrow(() => {
|
|
231
|
-
builder.to(addresses).amount(amount);
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
describe('Transaction Type Verification', function () {
|
|
236
|
-
it('should verify transaction type (placeholder returns true)', function () {
|
|
237
|
-
const mockTx = { type: 'export' };
|
|
238
|
-
const result = exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(mockTx);
|
|
239
|
-
assert.strictEqual(result, true); // Placeholder always returns true
|
|
240
|
-
});
|
|
241
|
-
it('should handle different transaction objects', function () {
|
|
242
|
-
const testCases = [{}, null, undefined, { type: 'import' }, { data: 'test' }];
|
|
243
|
-
testCases.forEach((testCase, index) => {
|
|
244
|
-
const result = exportInCTxBuilder_1.ExportInCTxBuilder.verifyTxType(testCase);
|
|
245
|
-
assert.strictEqual(result, true, `Test case ${index} should return true (placeholder)`);
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
it('should verify via instance method', function () {
|
|
249
|
-
const mockTx = { type: 'export' };
|
|
250
|
-
const result = builder.verifyTxType(mockTx);
|
|
251
|
-
assert.strictEqual(result, true);
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
describe('Transaction Building', function () {
|
|
255
|
-
it('should handle building when transaction has credentials', function () {
|
|
256
|
-
const mockTx = {
|
|
257
|
-
unsignedTx: {
|
|
258
|
-
networkId: 0, // Match builder's default
|
|
259
|
-
sourceBlockchainId: Buffer.alloc(0), // Match builder's default
|
|
260
|
-
destinationBlockchainId: Buffer.from('test-dest'),
|
|
261
|
-
inputs: [
|
|
262
|
-
{
|
|
263
|
-
address: 'C-flare1test',
|
|
264
|
-
amount: 2000000000000000000n,
|
|
265
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
266
|
-
nonce: 1n,
|
|
267
|
-
},
|
|
268
|
-
],
|
|
269
|
-
outputs: [
|
|
270
|
-
{
|
|
271
|
-
addresses: ['P-flare1dest'],
|
|
272
|
-
amount: 1000000000000000000n,
|
|
273
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
274
|
-
},
|
|
275
|
-
],
|
|
276
|
-
},
|
|
277
|
-
credentials: [],
|
|
278
|
-
};
|
|
279
|
-
builder.initBuilder(mockTx);
|
|
280
|
-
// Should not throw when credentials exist
|
|
281
|
-
assert.doesNotThrow(() => {
|
|
282
|
-
// Access protected method via type assertion
|
|
283
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
284
|
-
builder.buildFlareTransaction();
|
|
285
|
-
});
|
|
286
|
-
});
|
|
287
|
-
it('should require amount for building', function () {
|
|
288
|
-
builder.nonce(1n);
|
|
289
|
-
builder.to(['P-flare1dest']);
|
|
290
|
-
// Mock setting from addresses via transaction initialization
|
|
291
|
-
const mockRawTx = {
|
|
292
|
-
unsignedTx: {
|
|
293
|
-
networkId: 0, // Match builder's default
|
|
294
|
-
sourceBlockchainId: Buffer.alloc(0), // Match builder's default
|
|
295
|
-
destinationBlockchainId: Buffer.from('test-dest'),
|
|
296
|
-
inputs: [
|
|
297
|
-
{
|
|
298
|
-
address: 'C-flare1test',
|
|
299
|
-
amount: 2000000000000000000n,
|
|
300
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
301
|
-
nonce: 1n,
|
|
302
|
-
},
|
|
303
|
-
],
|
|
304
|
-
outputs: [
|
|
305
|
-
{
|
|
306
|
-
addresses: ['P-flare1dest'],
|
|
307
|
-
amount: 1000000000000000000n,
|
|
308
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
309
|
-
},
|
|
310
|
-
],
|
|
311
|
-
},
|
|
312
|
-
credentials: [],
|
|
313
|
-
};
|
|
314
|
-
builder.initBuilder(mockRawTx);
|
|
315
|
-
// Clear amount to test error
|
|
316
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
317
|
-
builder._amount = undefined;
|
|
318
|
-
assert.throws(() => {
|
|
319
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
320
|
-
builder.buildFlareTransaction();
|
|
321
|
-
}, Error);
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
describe('Transaction Initialization', function () {
|
|
325
|
-
it('should initialize from raw transaction object', function () {
|
|
326
|
-
const mockRawTx = {
|
|
327
|
-
unsignedTx: {
|
|
328
|
-
networkId: 0, // Match builder's default
|
|
329
|
-
sourceBlockchainId: Buffer.alloc(0), // Match builder's default
|
|
330
|
-
destinationBlockchainId: Buffer.from('test-dest'),
|
|
331
|
-
inputs: [
|
|
332
|
-
{
|
|
333
|
-
address: 'C-flare1test',
|
|
334
|
-
amount: 2000000000000000000n,
|
|
335
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
336
|
-
nonce: 1n,
|
|
337
|
-
},
|
|
338
|
-
],
|
|
339
|
-
outputs: [
|
|
340
|
-
{
|
|
341
|
-
addresses: ['P-flare1dest'],
|
|
342
|
-
amount: 1000000000000000000n,
|
|
343
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
344
|
-
},
|
|
345
|
-
],
|
|
346
|
-
},
|
|
347
|
-
credentials: [],
|
|
348
|
-
};
|
|
349
|
-
assert.doesNotThrow(() => {
|
|
350
|
-
builder.initBuilder(mockRawTx);
|
|
74
|
+
txBuilder.nonce(nonce);
|
|
75
|
+
});
|
|
351
76
|
});
|
|
352
77
|
});
|
|
353
|
-
it('should
|
|
354
|
-
const mockRawTx = {
|
|
355
|
-
unsignedTx: {
|
|
356
|
-
networkId: 0, // Match builder's default
|
|
357
|
-
sourceBlockchainId: Buffer.from('wrong-blockchain'),
|
|
358
|
-
destinationBlockchainId: Buffer.from('test-dest'),
|
|
359
|
-
inputs: [
|
|
360
|
-
{
|
|
361
|
-
address: 'C-flare1test',
|
|
362
|
-
amount: 2000000000000000000n,
|
|
363
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
364
|
-
nonce: 1n,
|
|
365
|
-
},
|
|
366
|
-
],
|
|
367
|
-
outputs: [
|
|
368
|
-
{
|
|
369
|
-
addresses: ['P-flare1dest'],
|
|
370
|
-
amount: 1000000000000000000n,
|
|
371
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
372
|
-
},
|
|
373
|
-
],
|
|
374
|
-
},
|
|
375
|
-
credentials: [],
|
|
376
|
-
};
|
|
377
|
-
assert.throws(() => {
|
|
378
|
-
builder.initBuilder(mockRawTx);
|
|
379
|
-
}, Error);
|
|
380
|
-
});
|
|
381
|
-
it('should validate single output requirement', function () {
|
|
382
|
-
const mockRawTx = {
|
|
383
|
-
unsignedTx: {
|
|
384
|
-
networkId: 0, // Match builder's default
|
|
385
|
-
sourceBlockchainId: Buffer.alloc(0), // Match builder's default // Will match default
|
|
386
|
-
destinationBlockchainId: Buffer.from('test-dest'),
|
|
387
|
-
inputs: [
|
|
388
|
-
{
|
|
389
|
-
address: 'C-flare1test',
|
|
390
|
-
amount: 2000000000000000000n,
|
|
391
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
392
|
-
nonce: 1n,
|
|
393
|
-
},
|
|
394
|
-
],
|
|
395
|
-
outputs: [
|
|
396
|
-
{
|
|
397
|
-
addresses: ['P-flare1dest1'],
|
|
398
|
-
amount: 500000000000000000n,
|
|
399
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
400
|
-
},
|
|
401
|
-
{
|
|
402
|
-
addresses: ['P-flare1dest2'],
|
|
403
|
-
amount: 500000000000000000n,
|
|
404
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
405
|
-
},
|
|
406
|
-
],
|
|
407
|
-
},
|
|
408
|
-
credentials: [],
|
|
409
|
-
};
|
|
410
|
-
assert.throws(() => {
|
|
411
|
-
builder.initBuilder(mockRawTx);
|
|
412
|
-
}, sdk_core_1.BuildTransactionError);
|
|
413
|
-
});
|
|
414
|
-
it('should validate single input requirement', function () {
|
|
415
|
-
const mockRawTx = {
|
|
416
|
-
unsignedTx: {
|
|
417
|
-
networkId: 0, // Match builder's default
|
|
418
|
-
sourceBlockchainId: Buffer.alloc(0), // Match builder's default
|
|
419
|
-
destinationBlockchainId: Buffer.from('test-dest'),
|
|
420
|
-
inputs: [
|
|
421
|
-
{
|
|
422
|
-
address: 'C-flare1test1',
|
|
423
|
-
amount: 1000000000000000000n,
|
|
424
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
425
|
-
nonce: 1n,
|
|
426
|
-
},
|
|
427
|
-
{
|
|
428
|
-
address: 'C-flare1test2',
|
|
429
|
-
amount: 1000000000000000000n,
|
|
430
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
431
|
-
nonce: 2n,
|
|
432
|
-
},
|
|
433
|
-
],
|
|
434
|
-
outputs: [
|
|
435
|
-
{
|
|
436
|
-
addresses: ['P-flare1dest'],
|
|
437
|
-
amount: 1000000000000000000n,
|
|
438
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
439
|
-
},
|
|
440
|
-
],
|
|
441
|
-
},
|
|
442
|
-
credentials: [],
|
|
443
|
-
};
|
|
78
|
+
it('should throw error for negative nonce', function () {
|
|
444
79
|
assert.throws(() => {
|
|
445
|
-
|
|
446
|
-
}, sdk_core_1.BuildTransactionError);
|
|
447
|
-
});
|
|
448
|
-
it('should validate negative fee calculation', function () {
|
|
449
|
-
const mockRawTx = {
|
|
450
|
-
unsignedTx: {
|
|
451
|
-
networkId: 0, // Match builder's default
|
|
452
|
-
sourceBlockchainId: Buffer.alloc(0), // Match builder's default
|
|
453
|
-
destinationBlockchainId: Buffer.from('test-dest'),
|
|
454
|
-
inputs: [
|
|
455
|
-
{
|
|
456
|
-
address: 'C-flare1test',
|
|
457
|
-
amount: 500000000000000000n, // Less than output
|
|
458
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
459
|
-
nonce: 1n,
|
|
460
|
-
},
|
|
461
|
-
],
|
|
462
|
-
outputs: [
|
|
463
|
-
{
|
|
464
|
-
addresses: ['P-flare1dest'],
|
|
465
|
-
amount: 1000000000000000000n, // More than input
|
|
466
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
467
|
-
},
|
|
468
|
-
],
|
|
469
|
-
},
|
|
470
|
-
credentials: [],
|
|
471
|
-
};
|
|
472
|
-
assert.throws(() => {
|
|
473
|
-
builder.initBuilder(mockRawTx);
|
|
474
|
-
}, sdk_core_1.BuildTransactionError);
|
|
475
|
-
});
|
|
476
|
-
});
|
|
477
|
-
describe('From Implementation', function () {
|
|
478
|
-
it('should handle string raw transaction', function () {
|
|
479
|
-
const rawString = 'hex-encoded-transaction';
|
|
480
|
-
assert.doesNotThrow(() => {
|
|
481
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
482
|
-
builder.fromImplementation(rawString);
|
|
483
|
-
});
|
|
484
|
-
});
|
|
485
|
-
it('should handle object raw transaction', function () {
|
|
486
|
-
const mockRawTx = {
|
|
487
|
-
unsignedTx: {
|
|
488
|
-
networkId: 0, // Match builder's default
|
|
489
|
-
sourceBlockchainId: Buffer.alloc(0), // Match builder's default
|
|
490
|
-
destinationBlockchainId: Buffer.from('test-dest'),
|
|
491
|
-
inputs: [
|
|
492
|
-
{
|
|
493
|
-
address: 'C-flare1test',
|
|
494
|
-
amount: 2000000000000000000n,
|
|
495
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
496
|
-
nonce: 1n,
|
|
497
|
-
},
|
|
498
|
-
],
|
|
499
|
-
outputs: [
|
|
500
|
-
{
|
|
501
|
-
addresses: ['P-flare1dest'],
|
|
502
|
-
amount: 1000000000000000000n,
|
|
503
|
-
assetId: Buffer.alloc(0), // Match builder's default
|
|
504
|
-
},
|
|
505
|
-
],
|
|
506
|
-
},
|
|
507
|
-
credentials: [],
|
|
508
|
-
};
|
|
509
|
-
assert.doesNotThrow(() => {
|
|
510
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
511
|
-
builder.fromImplementation(mockRawTx);
|
|
512
|
-
});
|
|
80
|
+
txBuilder.nonce('-1');
|
|
81
|
+
}, new sdk_core_1.BuildTransactionError('Nonce must be greater or equal than 0'));
|
|
513
82
|
});
|
|
514
83
|
});
|
|
515
|
-
describe('
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
const
|
|
519
|
-
const toAddresses = ['P-flare1destination'];
|
|
520
|
-
// Complete setup
|
|
521
|
-
builder.amount(amount).nonce(nonce).to(toAddresses);
|
|
522
|
-
// All operations should complete without throwing
|
|
523
|
-
assert.ok(true);
|
|
524
|
-
});
|
|
525
|
-
it('should handle method chaining extensively', function () {
|
|
526
|
-
// Test extensive method chaining
|
|
84
|
+
describe('to ExportInCTxBuilder', function () {
|
|
85
|
+
const txBuilder = factory.getExportInCBuilder();
|
|
86
|
+
it('should accept multiple P-addresses', function () {
|
|
87
|
+
const pAddresses = exportInC_1.EXPORT_IN_C.pAddresses;
|
|
527
88
|
assert.doesNotThrow(() => {
|
|
528
|
-
|
|
529
|
-
.amount('5000000000000000000') // 5 FLR
|
|
530
|
-
.nonce(456n)
|
|
531
|
-
.to(['P-flare1receiver1', 'P-flare1receiver2']);
|
|
89
|
+
txBuilder.to(pAddresses);
|
|
532
90
|
});
|
|
533
91
|
});
|
|
534
|
-
it('should
|
|
535
|
-
const largeAmount = '100000000000000000000000'; // 100k FLR
|
|
536
|
-
const largeNonce = 999999999999n;
|
|
92
|
+
it('should accept single P-address', function () {
|
|
537
93
|
assert.doesNotThrow(() => {
|
|
538
|
-
|
|
94
|
+
txBuilder.to(exportInC_1.EXPORT_IN_C.pAddresses[0]);
|
|
539
95
|
});
|
|
540
96
|
});
|
|
541
|
-
it('should
|
|
542
|
-
const
|
|
543
|
-
'P-flare1dest1',
|
|
544
|
-
'P-flare1dest2',
|
|
545
|
-
'P-flare1dest3',
|
|
546
|
-
'P-flare1dest4',
|
|
547
|
-
'P-flare1dest5',
|
|
548
|
-
];
|
|
97
|
+
it('should accept tilde-separated P-addresses string', function () {
|
|
98
|
+
const pAddresses = exportInC_1.EXPORT_IN_C.pAddresses.join('~');
|
|
549
99
|
assert.doesNotThrow(() => {
|
|
550
|
-
|
|
100
|
+
txBuilder.to(pAddresses);
|
|
551
101
|
});
|
|
552
102
|
});
|
|
553
103
|
});
|
|
554
|
-
describe('
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
104
|
+
describe('should build a export txn from C to P', () => {
|
|
105
|
+
const newTxBuilder = () => factory
|
|
106
|
+
.getExportInCBuilder()
|
|
107
|
+
.fromPubKey(exportInC_1.EXPORT_IN_C.cHexAddress)
|
|
108
|
+
.nonce(exportInC_1.EXPORT_IN_C.nonce)
|
|
109
|
+
.amount(exportInC_1.EXPORT_IN_C.amount)
|
|
110
|
+
.threshold(exportInC_1.EXPORT_IN_C.threshold)
|
|
111
|
+
.locktime(exportInC_1.EXPORT_IN_C.locktime)
|
|
112
|
+
.to(exportInC_1.EXPORT_IN_C.pAddresses)
|
|
113
|
+
.feeRate(exportInC_1.EXPORT_IN_C.fee);
|
|
114
|
+
it('Should create export tx for same values', async () => {
|
|
115
|
+
const txBuilder = newTxBuilder();
|
|
116
|
+
const tx = await txBuilder.build();
|
|
117
|
+
const rawTx = tx.toBroadcastFormat();
|
|
118
|
+
rawTx.should.equal(exportInC_1.EXPORT_IN_C.unsignedHex);
|
|
119
|
+
tx.id.should.equal(exportInC_1.EXPORT_IN_C.txhash);
|
|
120
|
+
});
|
|
121
|
+
it('Should recover export tx from raw tx', async () => {
|
|
122
|
+
const txBuilder = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.unsignedHex);
|
|
123
|
+
const tx = await txBuilder.build();
|
|
124
|
+
const rawTx = tx.toBroadcastFormat();
|
|
125
|
+
rawTx.should.equal(exportInC_1.EXPORT_IN_C.unsignedHex);
|
|
126
|
+
tx.id.should.equal(exportInC_1.EXPORT_IN_C.txhash);
|
|
127
|
+
});
|
|
128
|
+
it('Should recover signed export from signed raw tx', async () => {
|
|
129
|
+
const txBuilder = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.signedHex);
|
|
130
|
+
const tx = await txBuilder.build();
|
|
131
|
+
const rawTx = tx.toBroadcastFormat();
|
|
132
|
+
rawTx.should.equal(exportInC_1.EXPORT_IN_C.signedHex);
|
|
133
|
+
tx.id.should.equal(exportInC_1.EXPORT_IN_C.txhash);
|
|
134
|
+
});
|
|
135
|
+
it('Should full sign a export tx for same values', async () => {
|
|
136
|
+
const txBuilder = newTxBuilder();
|
|
137
|
+
txBuilder.sign({ key: exportInC_1.EXPORT_IN_C.privateKey });
|
|
138
|
+
const tx = await txBuilder.build();
|
|
139
|
+
const rawTx = tx.toBroadcastFormat();
|
|
140
|
+
rawTx.should.equal(exportInC_1.EXPORT_IN_C.signedHex);
|
|
141
|
+
tx.signature.should.eql(exportInC_1.EXPORT_IN_C.signature);
|
|
142
|
+
tx.id.should.equal(exportInC_1.EXPORT_IN_C.txhash);
|
|
143
|
+
});
|
|
144
|
+
it('Should full sign a export tx from unsigned raw tx', async () => {
|
|
145
|
+
const txBuilder = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp')).from(exportInC_1.EXPORT_IN_C.unsignedHex);
|
|
146
|
+
txBuilder.sign({ key: exportInC_1.EXPORT_IN_C.privateKey });
|
|
147
|
+
const tx = await txBuilder.build();
|
|
148
|
+
const rawTx = tx.toBroadcastFormat();
|
|
149
|
+
rawTx.should.equal(exportInC_1.EXPORT_IN_C.signedHex);
|
|
150
|
+
tx.id.should.equal(exportInC_1.EXPORT_IN_C.txhash);
|
|
151
|
+
});
|
|
152
|
+
it('Key cannot sign the transaction', () => {
|
|
153
|
+
const txBuilder = new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get('tflrp'))
|
|
154
|
+
.from(exportInC_1.EXPORT_IN_C.unsignedHex)
|
|
155
|
+
.fromPubKey(exportInC_1.EXPORT_IN_C.pAddresses);
|
|
156
|
+
txBuilder.sign({ key: exportInC_1.EXPORT_IN_C.privateKey });
|
|
157
|
+
txBuilder
|
|
158
|
+
.build()
|
|
159
|
+
.then(() => assert.fail('it can sign'))
|
|
160
|
+
.catch((err) => {
|
|
161
|
+
err.message.should.be.equal('Private key cannot sign the transaction');
|
|
563
162
|
});
|
|
564
163
|
});
|
|
565
|
-
it('should handle maximum values', function () {
|
|
566
|
-
const maxBigInt = BigInt('18446744073709551615'); // Max uint64
|
|
567
|
-
assert.doesNotThrow(() => {
|
|
568
|
-
builder.amount(maxBigInt);
|
|
569
|
-
});
|
|
570
|
-
assert.doesNotThrow(() => {
|
|
571
|
-
builder.nonce(maxBigInt);
|
|
572
|
-
});
|
|
573
|
-
});
|
|
574
|
-
it('should maintain state across multiple operations', function () {
|
|
575
|
-
// Build state incrementally
|
|
576
|
-
builder.amount('1000000000000000000');
|
|
577
|
-
builder.nonce(123n);
|
|
578
|
-
builder.to(['P-flare1dest']);
|
|
579
|
-
// State should be maintained across operations
|
|
580
|
-
assert.ok(true);
|
|
581
|
-
});
|
|
582
164
|
});
|
|
583
165
|
});
|
|
584
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsOENBQXdEO0FBQ3hELCtDQUFpQztBQUNqQyw0RUFBeUU7QUFFekUsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsSUFBSSxPQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxJQUFJLHVDQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sWUFBWSx1Q0FBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLG1CQUFtQjtZQUNuQixNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUU7Z0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FB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b3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBFeHBvcnRJbkNUeEJ1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2V4cG9ydEluQ1R4QnVpbGRlcic7XG5cbmRlc2NyaWJlKCdFeHBvcnRJbkNUeEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQoJ3RmbHJwJyk7XG4gIGxldCBidWlsZGVyOiBFeHBvcnRJbkNUeEJ1aWxkZXI7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgYnVpbGRlciA9IG5ldyBFeHBvcnRJbkNUeEJ1aWxkZXIoY29pbkNvbmZpZyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGluaXRpYWxpemUgd2l0aCBjb2luIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5vayhidWlsZGVyKTtcbiAgICAgIGFzc2VydC5vayhidWlsZGVyIGluc3RhbmNlb2YgRXhwb3J0SW5DVHhCdWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0ZW5kIEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFRlc3QgaW5oZXJpdGFuY2VcbiAgICAgIGFzc2VydC5vayhidWlsZGVyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1VUWE8gT3ZlcnJpZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHRyeWluZyB0byBzZXQgVVRYT3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrVXR4b3MgPSBbeyBpZDogJ3Rlc3QnIH1dO1xuXG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci51dHhvcyhtb2NrVXR4b3MpO1xuICAgICAgICB9LFxuICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICdTaG91bGQgcmVqZWN0IFVUWE9zIGZvciBDLWNoYWluIGV4cG9ydCB0cmFuc2FjdGlvbnMnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgZW1wdHkgVVRYTyBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLnV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAnU2hvdWxkIHJlamVjdCBlbXB0eSBVVFhPIGFycmF5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGFueSBVVFhPIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGVzdENhc2VzID0gW1tdLCBbe31dLCBbJ2ludmFsaWQnXSwgbnVsbCwgdW5kZWZpbmVkXTtcblxuICAgICAgdGVzdENhc2VzLmZvckVhY2goKHRlc3RDYXNlLCBpbmRleCkgPT4ge1xuICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBidWlsZGVyLnV0eG9zKHRlc3RDYXNlIGFzIGFueSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gICAgICAgICAgYFRlc3QgY2FzZSAke2luZGV4fSBzaG91bGQgdGhyb3cgZXJyb3JgXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Ftb3VudCBNYW5hZ2VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHZhbGlkIHBvc2l0aXZlIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZEFtb3VudHMgPSBbJzEwMDAnLCAnMTAwMDAwMDAwMDAwMDAwMDAwMCcsICc5OTk5OTk5OTk5OTk5OTk5OTknXTtcblxuICAgICAgdmFsaWRBbW91bnRzLmZvckVhY2goKGFtb3VudCkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBhbW91bnQ6ICR7YW1vdW50fWApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBiaWdpbnQgYW1vdW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpZ2ludEFtb3VudHMgPSBbMTAwMG4sIDEwMDAwMDAwMDAwMDAwMDAwMDBuLCA5OTk5OTk5OTk5OTk5OTk5OTluXTtcblxuICAgICAgYmlnaW50QW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgYmlnaW50IGFtb3VudDogJHthbW91bnR9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IG51bWVyaWMgYW1vdW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG51bWVyaWNBbW91bnRzID0gWzEwMDAsIDIwMDAwMDAsIDk5OTk5OTk5OV07XG5cbiAgICAgIG51bWVyaWNBbW91bnRzLmZvckVhY2goKGFtb3VudCkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB9LCBgU2hvdWxkIGFjY2VwdCBudW1lcmljIGFtb3VudDogJHthbW91bnR9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHplcm8gYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYW1vdW50KDApO1xuICAgICAgfSwgL0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlLyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudCgnMCcpO1xuICAgICAgfSwgL0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlLyk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudCgwbik7XG4gICAgICB9LCAvQW1vdW50IG11c3QgYmUgcG9zaXRpdmUvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGFtb3VudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZUFtb3VudHMgPSBbJy0xMDAwJywgJy0xJ107XG5cbiAgICAgIG5lZ2F0aXZlQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBidWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICAgICAgICAgIGBTaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGFtb3VudDogJHthbW91bnR9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsYXJnZSBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGFyZ2VBbW91bnRzID0gW1xuICAgICAgICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgLy8gVmVyeSBsYXJnZSBhbW91bnRcbiAgICAgICAgJzE4NDQ2NzQ0MDczNzA5NTUxNjE1JywgLy8gTmVhciB1aW50NjQgbWF4XG4gICAgICAgIEJpZ0ludCgnOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyksXG4gICAgICBdO1xuXG4gICAgICBsYXJnZUFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICAgIH0sIGBTaG91bGQgaGFuZGxlIGxhcmdlIGFtb3VudDogJHthbW91bnR9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2hhaW4gYW1vdW50IHNldHRpbmcgd2l0aCBvdGhlciBtZXRob2RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICAgICAgY29uc3Qgbm9uY2UgPSAxbjtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYW1vdW50KGFtb3VudCkubm9uY2Uobm9uY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdOb25jZSBNYW5hZ2VtZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2V0IHZhbGlkIG5vbmNlIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkTm9uY2VzID0gWzBuLCAxbiwgMTAwMG4sIDk5OTk5OTk5OTk5OW5dO1xuXG4gICAgICB2YWxpZE5vbmNlcy5mb3JFYWNoKChub25jZSkgPT4ge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKTtcbiAgICAgICAgfSwgYFNob3VsZCBhY2NlcHQgbm9uY2U6ICR7bm9uY2V9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IHN0cmluZyBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdHJpbmdOb25jZXMgPSBbJzAnLCAnMScsICcxMDAwJywgJzk5OTk5OTk5OTk5OSddO1xuXG4gICAgICBzdHJpbmdOb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IHN0cmluZyBub25jZTogJHtub25jZX1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgbnVtZXJpYyBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBudW1lcmljTm9uY2VzID0gWzAsIDEsIDEwMDAsIDk5OTk5OV07XG5cbiAgICAgIG51bWVyaWNOb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgYnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgIH0sIGBTaG91bGQgYWNjZXB0IG51bWVyaWMgbm9uY2U6ICR7bm9uY2V9YCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIG5vbmNlIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG5lZ2F0aXZlTm9uY2VzID0gWy0xbiwgLTEwMDBuXTtcblxuICAgICAgbmVnYXRpdmVOb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgICBgU2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBub25jZTogJHtub25jZX1gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIHN0cmluZyBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBuZWdhdGl2ZVN0cmluZ05vbmNlcyA9IFsnLTEnLCAnLTEwMDAnXTtcblxuICAgICAgbmVnYXRpdmVTdHJpbmdOb25jZXMuZm9yRWFjaCgobm9uY2UpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBidWlsZGVyLm5vbmNlKG5vbmNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgICAgICAgICBgU2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBzdHJpbmcgbm9uY2U6ICR7bm9uY2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsYXJnZSBub25jZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBsYXJnZU5vbmNlcyA9IFtcbiAgICAgICAgJzE4NDQ2NzQ0MDczNzA5NTUxNjE1JywgLy8gTWF4IHVpbnQ2NFxuICAgICAgICBCaWdJbnQoJzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScpLFxuICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgIF07XG5cbiAgICAgIGxhcmdlTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkZXIubm9uY2Uobm9uY2UpO1xuICAgICAgICB9LCBgU2hvdWxkIGhhbmRsZSBsYXJnZSBub25jZTogJHtub25jZX1gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjaGFpbiBub25jZSBzZXR0aW5nIHdpdGggb3RoZXIgbWV0aG9kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG5vbmNlID0gMTIzbjtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIubm9uY2Uobm9uY2UpLmFtb3VudChhbW91bnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdEZXN0aW5hdGlvbiBBZGRyZXNzIE1hbmFnZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgc2luZ2xlIGRlc3RpbmF0aW9uIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzaW5nbGVBZGRyZXNzID0gJ1AtZmxhcmUxZGVzdGluYXRpb24nO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci50byhzaW5nbGVBZGRyZXNzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgbXVsdGlwbGUgZGVzdGluYXRpb24gYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbXVsdGlwbGVBZGRyZXNzZXMgPSBbJ1AtZmxhcmUxZGVzdDEnLCAnUC1mbGFyZTFkZXN0MicsICdQLWZsYXJlMWRlc3QzJ107XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnRvKG11bHRpcGxlQWRkcmVzc2VzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgY29tbWEtc2VwYXJhdGVkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbW1hU2VwYXJhdGVkID0gJ1AtZmxhcmUxZGVzdDF+UC1mbGFyZTFkZXN0Mn5QLWZsYXJlMWRlc3QzJztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudG8oY29tbWFTZXBhcmF0ZWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBhZGRyZXNzIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudG8oW10pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNoYWluIGFkZHJlc3Mgc2V0dGluZyB3aXRoIG90aGVyIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSBbJ1AtZmxhcmUxZGVzdDEnLCAnUC1mbGFyZTFkZXN0MiddO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzEwMDAwMDAwMDAwMDAwMDAwMDAnO1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci50byhhZGRyZXNzZXMpLmFtb3VudChhbW91bnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBUeXBlIFZlcmlmaWNhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHZlcmlmeSB0cmFuc2FjdGlvbiB0eXBlIChwbGFjZWhvbGRlciByZXR1cm5zIHRydWUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1R4ID0geyB0eXBlOiAnZXhwb3J0JyB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gRXhwb3J0SW5DVHhCdWlsZGVyLnZlcmlmeVR4VHlwZShtb2NrVHgpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7IC8vIFBsYWNlaG9sZGVyIGFsd2F5cyByZXR1cm5zIHRydWVcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGRpZmZlcmVudCB0cmFuc2FjdGlvbiBvYmplY3RzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGVzdENhc2VzID0gW3t9LCBudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ2ltcG9ydCcgfSwgeyBkYXRhOiAndGVzdCcgfV07XG5cbiAgICAgIHRlc3RDYXNlcy5mb3JFYWNoKCh0ZXN0Q2FzZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gRXhwb3J0SW5DVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0ZXN0Q2FzZSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUsIGBUZXN0IGNhc2UgJHtpbmRleH0gc2hvdWxkIHJldHVybiB0cnVlIChwbGFjZWhvbGRlcilgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2ZXJpZnkgdmlhIGluc3RhbmNlIG1ldGhvZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tUeCA9IHsgdHlwZTogJ2V4cG9ydCcgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIudmVyaWZ5VHhUeXBlKG1vY2tUeCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIEJ1aWxkaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIGJ1aWxkaW5nIHdoZW4gdHJhbnNhY3Rpb24gaGFzIGNyZWRlbnRpYWxzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1R4ID0ge1xuICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgbmV0d29ya0lkOiAwLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIHNvdXJjZUJsb2NrY2hhaW5JZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QnLFxuICAgICAgICAgICAgICBhbW91bnQ6IDIwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QnXSxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrVHgpO1xuXG4gICAgICAvLyBTaG91bGQgbm90IHRocm93IHdoZW4gY3JlZGVudGlhbHMgZXhpc3RcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAvLyBBY2Nlc3MgcHJvdGVjdGVkIG1ldGhvZCB2aWEgdHlwZSBhc3NlcnRpb25cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXF1aXJlIGFtb3VudCBmb3IgYnVpbGRpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLm5vbmNlKDFuKTtcbiAgICAgIGJ1aWxkZXIudG8oWydQLWZsYXJlMWRlc3QnXSk7XG5cbiAgICAgIC8vIE1vY2sgc2V0dGluZyBmcm9tIGFkZHJlc3NlcyB2aWEgdHJhbnNhY3Rpb24gaW5pdGlhbGl6YXRpb25cbiAgICAgIGNvbnN0IG1vY2tSYXdUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrUmF3VHgpO1xuICAgICAgLy8gQ2xlYXIgYW1vdW50IHRvIHRlc3QgZXJyb3JcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAoYnVpbGRlciBhcyBhbnkpLl9hbW91bnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAoYnVpbGRlciBhcyBhbnkpLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgICAgfSwgRXJyb3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gSW5pdGlhbGl6YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIGZyb20gcmF3IHRyYW5zYWN0aW9uIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSYXdUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiAyMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1Jhd1R4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBibG9ja2NoYWluIElEIGR1cmluZyBpbml0aWFsaXphdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSYXdUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd3cm9uZy1ibG9ja2NoYWluJyksXG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdCcsXG4gICAgICAgICAgICAgIGFtb3VudDogMjAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDFuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKG1vY2tSYXdUeCk7XG4gICAgICB9LCBFcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHNpbmdsZSBvdXRwdXQgcmVxdWlyZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0IC8vIFdpbGwgbWF0Y2ggZGVmYXVsdFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QnLFxuICAgICAgICAgICAgICBhbW91bnQ6IDIwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QxJ10sXG4gICAgICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdDInXSxcbiAgICAgICAgICAgICAgYW1vdW50OiA1MDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWRlbnRpYWxzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluaXRCdWlsZGVyKG1vY2tSYXdUeCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzaW5nbGUgaW5wdXQgcmVxdWlyZW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2NrUmF3VHggPSB7XG4gICAgICAgIHVuc2lnbmVkVHg6IHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IDAsIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgc291cmNlQmxvY2tjaGFpbklkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgZGVzdGluYXRpb25CbG9ja2NoYWluSWQ6IEJ1ZmZlci5mcm9tKCd0ZXN0LWRlc3QnKSxcbiAgICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogJ0MtZmxhcmUxdGVzdDEnLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QyJyxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgICBub25jZTogMm4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzZXM6IFsnUC1mbGFyZTFkZXN0J10sXG4gICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlZGVudGlhbHM6IFtdLFxuICAgICAgfTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuaW5pdEJ1aWxkZXIobW9ja1Jhd1R4KTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG5lZ2F0aXZlIGZlZSBjYWxjdWxhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vY2tSYXdUeCA9IHtcbiAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgIG5ldHdvcmtJZDogMCwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBzb3VyY2VCbG9ja2NoYWluSWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICBkZXN0aW5hdGlvbkJsb2NrY2hhaW5JZDogQnVmZmVyLmZyb20oJ3Rlc3QtZGVzdCcpLFxuICAgICAgICAgIGlucHV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhZGRyZXNzOiAnQy1mbGFyZTF0ZXN0JyxcbiAgICAgICAgICAgICAgYW1vdW50OiA1MDAwMDAwMDAwMDAwMDAwMDBuLCAvLyBMZXNzIHRoYW4gb3V0cHV0XG4gICAgICAgICAgICAgIGFzc2V0SWQ6IEJ1ZmZlci5hbGxvYygwKSwgLy8gTWF0Y2ggYnVpbGRlcidzIGRlZmF1bHRcbiAgICAgICAgICAgICAgbm9uY2U6IDFuLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzc2VzOiBbJ1AtZmxhcmUxZGVzdCddLFxuICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwMDAwMDBuLCAvLyBNb3JlIHRoYW4gaW5wdXRcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5pbml0QnVpbGRlcihtb2NrUmF3VHgpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Zyb20gSW1wbGVtZW50YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgc3RyaW5nIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJhd1N0cmluZyA9ICdoZXgtZW5jb2RlZC10cmFuc2FjdGlvbic7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAoYnVpbGRlciBhcyBhbnkpLmZyb21JbXBsZW1lbnRhdGlvbihyYXdTdHJpbmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBvYmplY3QgcmF3IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1Jhd1R4ID0ge1xuICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgbmV0d29ya0lkOiAwLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIHNvdXJjZUJsb2NrY2hhaW5JZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgIGRlc3RpbmF0aW9uQmxvY2tjaGFpbklkOiBCdWZmZXIuZnJvbSgndGVzdC1kZXN0JyksXG4gICAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6ICdDLWZsYXJlMXRlc3QnLFxuICAgICAgICAgICAgICBhbW91bnQ6IDIwMDAwMDAwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgICAgICBhc3NldElkOiBCdWZmZXIuYWxsb2MoMCksIC8vIE1hdGNoIGJ1aWxkZXIncyBkZWZhdWx0XG4gICAgICAgICAgICAgIG5vbmNlOiAxbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3NlczogWydQLWZsYXJlMWRlc3QnXSxcbiAgICAgICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICAgICAgYXNzZXRJZDogQnVmZmVyLmFsbG9jKDApLCAvLyBNYXRjaCBidWlsZGVyJ3MgZGVmYXVsdFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjcmVkZW50aWFsczogW10sXG4gICAgICB9O1xuXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKGJ1aWxkZXIgYXMgYW55KS5mcm9tSW1wbGVtZW50YXRpb24obW9ja1Jhd1R4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSW50ZWdyYXRpb24gVGVzdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgY29tcGxldGUgZXhwb3J0IGZsb3cgcHJlcGFyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwMDAwMDAwMDAwMDAwMCc7IC8vIDEgRkxSXG4gICAgICBjb25zdCBub25jZSA9IDEyM247XG4gICAgICBjb25zdCB0b0FkZHJlc3NlcyA9IFsnUC1mbGFyZTFkZXN0aW5hdGlvbiddO1xuXG4gICAgICAvLyBDb21wbGV0ZSBzZXR1cFxuICAgICAgYnVpbGRlci5hbW91bnQoYW1vdW50KS5ub25jZShub25jZSkudG8odG9BZGRyZXNzZXMpO1xuXG4gICAgICAvLyBBbGwgb3BlcmF0aW9ucyBzaG91bGQgY29tcGxldGUgd2l0aG91dCB0aHJvd2luZ1xuICAgICAgYXNzZXJ0Lm9rKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWV0aG9kIGNoYWluaW5nIGV4dGVuc2l2ZWx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGVzdCBleHRlbnNpdmUgbWV0aG9kIGNoYWluaW5nXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlclxuICAgICAgICAgIC5hbW91bnQoJzUwMDAwMDAwMDAwMDAwMDAwMDAnKSAvLyA1IEZMUlxuICAgICAgICAgIC5ub25jZSg0NTZuKVxuICAgICAgICAgIC50byhbJ1AtZmxhcmUxcmVjZWl2ZXIxJywgJ1AtZmxhcmUxcmVjZWl2ZXIyJ10pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsYXJnZSB0cmFuc2FjdGlvbiB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBsYXJnZUFtb3VudCA9ICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnOyAvLyAxMDBrIEZMUlxuICAgICAgY29uc3QgbGFyZ2VOb25jZSA9IDk5OTk5OTk5OTk5OW47XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudChsYXJnZUFtb3VudCkubm9uY2UobGFyZ2VOb25jZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG11bHRpcGxlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG11bHRpcGxlRGVzdGluYXRpb25zID0gW1xuICAgICAgICAnUC1mbGFyZTFkZXN0MScsXG4gICAgICAgICdQLWZsYXJlMWRlc3QyJyxcbiAgICAgICAgJ1AtZmxhcmUxZGVzdDMnLFxuICAgICAgICAnUC1mbGFyZTFkZXN0NCcsXG4gICAgICAgICdQLWZsYXJlMWRlc3Q1JyxcbiAgICAgIF07XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwMCcpLnRvKG11bHRpcGxlRGVzdGluYXRpb25zKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRWRnZSBDYXNlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB6ZXJvIHZhbHVlcyBhcHByb3ByaWF0ZWx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gWmVybyBhbW91bnQgc2hvdWxkIGJlIHJlamVjdGVkXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoMCk7XG4gICAgICB9LCAvQW1vdW50IG11c3QgYmUgcG9zaXRpdmUvKTtcblxuICAgICAgLy8gWmVybyBub25jZSBzaG91bGQgYmUgdmFsaWRcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLm5vbmNlKDBuKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgbWF4aW11bSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtYXhCaWdJbnQgPSBCaWdJbnQoJzE4NDQ2NzQ0MDczNzA5NTUxNjE1Jyk7IC8vIE1heCB1aW50NjRcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYW1vdW50KG1heEJpZ0ludCk7XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIubm9uY2UobWF4QmlnSW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYWludGFpbiBzdGF0ZSBhY3Jvc3MgbXVsdGlwbGUgb3BlcmF0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEJ1aWxkIHN0YXRlIGluY3JlbWVudGFsbHlcbiAgICAgIGJ1aWxkZXIuYW1vdW50KCcxMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICBidWlsZGVyLm5vbmNlKDEyM24pO1xuICAgICAgYnVpbGRlci50byhbJ1AtZmxhcmUxZGVzdCddKTtcblxuICAgICAgLy8gU3RhdGUgc2hvdWxkIGJlIG1haW50YWluZWQgYWNyb3NzIG9wZXJhdGlvbnNcbiAgICAgIGFzc2VydC5vayh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsOENBQXdEO0FBQ3hELCtDQUFpQztBQUNqQywwRkFBdUY7QUFDdkYseUVBQW9GO0FBRXBGLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLHFEQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUVoRCxRQUFRLENBQUMsMEJBQTBCLEVBQUU7UUFDbkMsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUs7WUFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQyxFQUFFLElBQUksZ0NBQXFCLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsMkJBQTJCLEVBQUU7UUFDcEMsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTVDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxDQUFD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Q0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgRVhQT1JUX0lOX0MgYXMgdGVzdERhdGEgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvdHJhbnNhY3Rpb25EYXRhL2V4cG9ydEluQyc7XG5cbmRlc2NyaWJlKCdFeHBvcnRJbkNUeEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpO1xuICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEV4cG9ydEluQ0J1aWxkZXIoKTtcblxuICBkZXNjcmliZSgndXR4b3MgRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2hlbiB1dHhvcyBhcmUgdXNlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudXR4b3MoW10pO1xuICAgICAgfSwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndXR4b3MgYXJlIG5vdCByZXF1aXJlZCBpbiBFeHBvcnQgVHggaW4gQy1DaGFpbicpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Ftb3VudCBFeHBvcnRJbkNUeEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgdmFsaWQgYW1vdW50cyBpbiBkaWZmZXJlbnQgZm9ybWF0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkQW1vdW50cyA9IFtCaWdJbnQoMTAwMCksICcxMDAwJ107XG5cbiAgICAgIHZhbGlkQW1vdW50cy5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBhbW91bnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW52YWxpZEFtb3VudHMgPSBbJzAnLCAnLTEnXTtcblxuICAgICAgaW52YWxpZEFtb3VudHMuZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9uY2UgRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IHZhbGlkIG5vbmNlcyBpbiBkaWZmZXJlbnQgZm9ybWF0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbGlkTm9uY2VzID0gWycxJywgMSwgMF07XG5cbiAgICAgIHZhbGlkTm9uY2VzLmZvckVhY2goKG5vbmNlKSA9PiB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5ub25jZShub25jZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBuZWdhdGl2ZSBub25jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIubm9uY2UoJy0xJyk7XG4gICAgICB9LCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdOb25jZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiAwJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndG8gRXhwb3J0SW5DVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RXhwb3J0SW5DQnVpbGRlcigpO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgbXVsdGlwbGUgUC1hZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwQWRkcmVzc2VzID0gdGVzdERhdGEucEFkZHJlc3NlcztcblxuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50byhwQWRkcmVzc2VzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgc2luZ2xlIFAtYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudG8odGVzdERhdGEucEFkZHJlc3Nlc1swXSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHRpbGRlLXNlcGFyYXRlZCBQLWFkZHJlc3NlcyBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwQWRkcmVzc2VzID0gdGVzdERhdGEucEFkZHJlc3Nlcy5qb2luKCd+Jyk7XG5cbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIudG8ocEFkZHJlc3Nlcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCBhIGV4cG9ydCB0eG4gZnJvbSBDIHRvIFAnLCAoKSA9PiB7XG4gICAgY29uc3QgbmV3VHhCdWlsZGVyID0gKCkgPT5cbiAgICAgIGZhY3RvcnlcbiAgICAgICAgLmdldEV4cG9ydEluQ0J1aWxkZXIoKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5jSGV4QWRkcmVzcylcbiAgICAgICAgLm5vbmNlKHRlc3REYXRhLm5vbmNlKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLmFtb3VudClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5sb2NrdGltZSlcbiAgICAgICAgLnRvKHRlc3REYXRhLnBBZGRyZXNzZXMpXG4gICAgICAgIC5mZWVSYXRlKHRlc3REYXRhLmZlZSk7XG5cbiAgICBpdCgnU2hvdWxkIGNyZWF0ZSBleHBvcnQgdHggZm9yIHNhbWUgdmFsdWVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3VHhCdWlsZGVyKCk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEudW5zaWduZWRIZXgpO1xuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4aGFzaCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlY292ZXIgZXhwb3J0IHR4IGZyb20gcmF3IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0ZmxycCcpKS5mcm9tKHRlc3REYXRhLnVuc2lnbmVkSGV4KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwodGVzdERhdGEudHhoYXNoKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgcmVjb3ZlciBzaWduZWQgZXhwb3J0IGZyb20gc2lnbmVkIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS5zaWduZWRIZXgpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHJhd1R4LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5zaWduZWRIZXgpO1xuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4aGFzaCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIGV4cG9ydCB0eCBmb3Igc2FtZSB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXdUeEJ1aWxkZXIoKTtcblxuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLnByaXZhdGVLZXkgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgcmF3VHguc2hvdWxkLmVxdWFsKHRlc3REYXRhLnNpZ25lZEhleCk7XG4gICAgICB0eC5zaWduYXR1cmUuc2hvdWxkLmVxbCh0ZXN0RGF0YS5zaWduYXR1cmUpO1xuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKHRlc3REYXRhLnR4aGFzaCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGZ1bGwgc2lnbiBhIGV4cG9ydCB0eCBmcm9tIHVuc2lnbmVkIHJhdyB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGZscnAnKSkuZnJvbSh0ZXN0RGF0YS51bnNpZ25lZEhleCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEucHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICByYXdUeC5zaG91bGQuZXF1YWwodGVzdERhdGEuc2lnbmVkSGV4KTtcbiAgICAgIHR4LmlkLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS50eGhhc2gpO1xuICAgIH0pO1xuXG4gICAgaXQoJ0tleSBjYW5ub3Qgc2lnbiB0aGUgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RmbHJwJykpXG4gICAgICAgIC5mcm9tKHRlc3REYXRhLnVuc2lnbmVkSGV4KVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5wQWRkcmVzc2VzKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5wcml2YXRlS2V5IH0pO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC5idWlsZCgpXG4gICAgICAgIC50aGVuKCgpID0+IGFzc2VydC5mYWlsKCdpdCBjYW4gc2lnbicpKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5iZS5lcXVhbCgnUHJpdmF0ZSBrZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|