@bitgo/sdk-coin-cspr 2.4.1 → 2.4.3
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/test/fixtures/cspr.d.ts +4 -0
- package/dist/test/fixtures/cspr.d.ts.map +1 -0
- package/dist/test/fixtures/cspr.js +7 -0
- package/dist/test/fixtures/resources.d.ts +92 -0
- package/dist/test/fixtures/resources.d.ts.map +1 -0
- package/dist/test/fixtures/resources.js +96 -0
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/unit/cspr.d.ts +2 -0
- package/dist/test/unit/cspr.d.ts.map +1 -0
- package/dist/test/unit/cspr.js +680 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +159 -0
- package/dist/test/unit/lib/signMessage.d.ts +2 -0
- package/dist/test/unit/lib/signMessage.d.ts.map +1 -0
- package/dist/test/unit/lib/signMessage.js +68 -0
- package/dist/test/unit/lib/transaction.d.ts +2 -0
- package/dist/test/unit/lib/transaction.d.ts.map +1 -0
- package/dist/test/unit/lib/transaction.js +271 -0
- package/dist/test/unit/lib/transactionBuilder/delegateBuilder.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/delegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/delegateBuilder.js +191 -0
- package/dist/test/unit/lib/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/transactionBuilder.js +315 -0
- package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/transferBuilder.js +519 -0
- package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/undelegateBuilder.js +192 -0
- package/dist/test/unit/lib/transactionBuilder/walletInitialization.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilder/walletInitialization.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilder/walletInitialization.js +338 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +328 -0
- package/dist/test/unit/lib/util.d.ts +2 -0
- package/dist/test/unit/lib/util.d.ts.map +1 -0
- package/dist/test/unit/lib/util.js +176 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +9 -6
- package/.eslintignore +0 -4
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -847
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const should_1 = __importDefault(require("should"));
|
|
41
|
+
const casper_js_sdk_1 = require("casper-js-sdk");
|
|
42
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
43
|
+
const lib_1 = require("../../../../src/lib");
|
|
44
|
+
const testData = __importStar(require("../../../fixtures/resources"));
|
|
45
|
+
const constants_1 = require("../../../../src/lib/constants");
|
|
46
|
+
const statics_1 = require("@bitgo/statics");
|
|
47
|
+
describe('Casper Transfer Builder', () => {
|
|
48
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
|
|
49
|
+
const factoryProd = new lib_1.TransactionBuilderFactory(statics_1.coins.get('cspr'));
|
|
50
|
+
const owner1Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress();
|
|
51
|
+
const owner2Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress();
|
|
52
|
+
const initTxTransferBuilder = () => {
|
|
53
|
+
const txBuilder = factory.getTransferBuilder();
|
|
54
|
+
txBuilder.fee({ gasLimit: testData.FEE.gasLimit, gasPrice: testData.FEE.gasPrice });
|
|
55
|
+
txBuilder.source({ address: owner1Address });
|
|
56
|
+
txBuilder.to(owner2Address);
|
|
57
|
+
txBuilder.transferId(255);
|
|
58
|
+
return txBuilder;
|
|
59
|
+
};
|
|
60
|
+
describe('transfer builder environment', function () {
|
|
61
|
+
it('should select the right chain name', function () {
|
|
62
|
+
should_1.default.equal(factory.getTransferBuilder().coinName(), 'tcspr');
|
|
63
|
+
should_1.default.equal(factoryProd.getTransferBuilder().coinName(), 'cspr');
|
|
64
|
+
should_1.default.equal(factory.getTransferBuilder().chainName, constants_1.DEFAULT_CHAIN_NAMES.testnet);
|
|
65
|
+
should_1.default.equal(factoryProd.getTransferBuilder().chainName, constants_1.DEFAULT_CHAIN_NAMES.mainnet);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('should build ', () => {
|
|
69
|
+
describe('non serialized transactions', () => {
|
|
70
|
+
it('should build a transaction without transferId', async function () {
|
|
71
|
+
const txBuilder = factory.getTransferBuilder();
|
|
72
|
+
txBuilder.fee({ gasLimit: testData.FEE.gasLimit, gasPrice: testData.FEE.gasPrice });
|
|
73
|
+
txBuilder.source({ address: owner1Address });
|
|
74
|
+
txBuilder.to(owner2Address);
|
|
75
|
+
txBuilder.amount(testData.MIN_MOTES_AMOUNT);
|
|
76
|
+
txBuilder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
77
|
+
const tx = (await txBuilder.build());
|
|
78
|
+
const txJson = tx.toJson();
|
|
79
|
+
should_1.default.exist(tx.casperTx.approvals, 'There are no approvals');
|
|
80
|
+
should_1.default.deepEqual(tx.casperTx.approvals.length, 1, 'Error in the number of signatures');
|
|
81
|
+
should_1.default.deepEqual(tx.casperTx.approvals[0].signer, owner1Address, 'Error in the signature');
|
|
82
|
+
should_1.default.exist(tx.casperTx.hash, 'There is no hash');
|
|
83
|
+
should_1.default.exist(txJson.from, 'There is no from');
|
|
84
|
+
should_1.default.deepEqual(txJson.from, owner1Address, 'The recipient does not match');
|
|
85
|
+
should_1.default.exist(tx.casperTx.header.gasPrice, 'There is no gasPrice');
|
|
86
|
+
should_1.default.equal(tx.casperTx.header.gasPrice.toString(), testData.FEE.gasPrice, 'Gas price does not match expected');
|
|
87
|
+
should_1.default.exist(txJson.fee.gasLimit, 'Gas Limit is not defined');
|
|
88
|
+
should_1.default.equal(txJson.fee.gasLimit, testData.FEE.gasLimit);
|
|
89
|
+
should_1.default.equal(txJson.to, owner2Address, 'To address was not the expected one');
|
|
90
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT, 'Amount was not as expected');
|
|
91
|
+
should_1.default.equal(txJson.transferId, undefined);
|
|
92
|
+
});
|
|
93
|
+
it('should build a transaction to an address from an ed25519 key', async function () {
|
|
94
|
+
const ed25519Address = '01513fa90c1a74c34a8958dd86055e9736edb1ead918bd4d4d750ca851946be7aa';
|
|
95
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
96
|
+
builder.to(ed25519Address);
|
|
97
|
+
const tx = (await builder.build());
|
|
98
|
+
const txJson = tx.toJson();
|
|
99
|
+
should_1.default.equal(txJson.to, ed25519Address);
|
|
100
|
+
});
|
|
101
|
+
it('should build a transaction with transferId of type string', async function () {
|
|
102
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT).transferId('26794144639134510');
|
|
103
|
+
const tx = (await builder.build());
|
|
104
|
+
const txJson = tx.toJson();
|
|
105
|
+
should_1.default.equal(txJson.transferId, '26794144639134510');
|
|
106
|
+
});
|
|
107
|
+
it('should build a transaction with large numeric transfer id value', async function () {
|
|
108
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT).transferId(26794144639134510);
|
|
109
|
+
const tx = (await builder.build());
|
|
110
|
+
const txJson = tx.toJson();
|
|
111
|
+
should_1.default.equal(txJson.transferId, '26794144639134510');
|
|
112
|
+
});
|
|
113
|
+
it('a signed transfer transaction', async () => {
|
|
114
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
115
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
116
|
+
const tx = (await builder.build());
|
|
117
|
+
const txJson = tx.toJson();
|
|
118
|
+
should_1.default.exist(tx.casperTx.approvals, 'There are no approvals');
|
|
119
|
+
should_1.default.deepEqual(tx.casperTx.approvals.length, 1, 'Error in the number of signatures');
|
|
120
|
+
should_1.default.deepEqual(tx.casperTx.approvals[0].signer, owner1Address, 'Error in the signature');
|
|
121
|
+
should_1.default.exist(tx.casperTx.hash, 'There is no hash');
|
|
122
|
+
should_1.default.exist(txJson.from, 'There is no from');
|
|
123
|
+
should_1.default.deepEqual(txJson.from, owner1Address, 'The recipient does not match');
|
|
124
|
+
should_1.default.exist(tx.casperTx.header.gasPrice, 'There is no gasPrice');
|
|
125
|
+
should_1.default.equal(tx.casperTx.header.gasPrice.toString(), testData.FEE.gasPrice, 'Gas price does not match expected');
|
|
126
|
+
should_1.default.exist(txJson.fee.gasLimit, 'Gas Limit is not defined');
|
|
127
|
+
should_1.default.equal(txJson.fee.gasLimit, testData.FEE.gasLimit);
|
|
128
|
+
should_1.default.equal(txJson.to, owner2Address, 'To address was not the expected one');
|
|
129
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT, 'Amount was not as expected');
|
|
130
|
+
});
|
|
131
|
+
it('a signed transfer transaction using extended key', async () => {
|
|
132
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
133
|
+
builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
|
|
134
|
+
const tx = (await builder.build());
|
|
135
|
+
const txJson = tx.toJson();
|
|
136
|
+
should_1.default.exist(tx.casperTx.approvals, 'There are no approvals');
|
|
137
|
+
should_1.default.deepEqual(tx.casperTx.approvals.length, 1, 'Error in the number of signatures');
|
|
138
|
+
should_1.default.deepEqual(tx.casperTx.approvals[0].signer, owner1Address, 'Error in the signature');
|
|
139
|
+
should_1.default.exist(tx.casperTx.hash, 'There is no hash');
|
|
140
|
+
should_1.default.exist(txJson.from, 'There is no from');
|
|
141
|
+
should_1.default.deepEqual(txJson.from, owner1Address, 'The recipient does not match');
|
|
142
|
+
should_1.default.exist(tx.casperTx.header.gasPrice, 'There is no gasPrice');
|
|
143
|
+
should_1.default.equal(tx.casperTx.header.gasPrice.toString(), testData.FEE.gasPrice, 'Gas price does not match expected');
|
|
144
|
+
should_1.default.exist(txJson.fee.gasLimit, 'Gas Limit is not defined');
|
|
145
|
+
should_1.default.equal(txJson.fee.gasLimit, testData.FEE.gasLimit);
|
|
146
|
+
should_1.default.equal(txJson.to, owner2Address, 'To address was not the expected one');
|
|
147
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT, 'Amount was not as expected');
|
|
148
|
+
});
|
|
149
|
+
it('a transfer transaction signed multiple times', async () => {
|
|
150
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
151
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
152
|
+
builder.sign({ key: testData.ACCOUNT_2.privateKey });
|
|
153
|
+
const tx = (await builder.build());
|
|
154
|
+
const txJson = tx.toJson();
|
|
155
|
+
should_1.default.exist(tx.casperTx.approvals, 'There are no approvals');
|
|
156
|
+
should_1.default.deepEqual(tx.casperTx.approvals.length, 2, 'Error in the number of signatures');
|
|
157
|
+
should_1.default.deepEqual(tx.casperTx.approvals[0].signer, owner1Address, 'Error in the signature');
|
|
158
|
+
should_1.default.deepEqual(tx.casperTx.approvals[1].signer, owner2Address, 'Error in the signature');
|
|
159
|
+
should_1.default.exist(tx.casperTx.hash, 'There is no hash');
|
|
160
|
+
should_1.default.exist(txJson.from, 'There is no from');
|
|
161
|
+
should_1.default.deepEqual(txJson.from, owner1Address, 'The recipient does not match');
|
|
162
|
+
should_1.default.exist(tx.casperTx.header.gasPrice, 'There is no gasPrice');
|
|
163
|
+
should_1.default.equal(tx.casperTx.header.gasPrice.toString(), testData.FEE.gasPrice, 'Gas price does not match expected');
|
|
164
|
+
should_1.default.exist(txJson.fee.gasLimit, 'Gas Limit is not defined');
|
|
165
|
+
should_1.default.equal(txJson.fee.gasLimit, testData.FEE.gasLimit);
|
|
166
|
+
should_1.default.equal(txJson.to, owner2Address, 'To address was not the expected one');
|
|
167
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT, 'Amount does not match expected');
|
|
168
|
+
});
|
|
169
|
+
it('a transfer transaction signed multiple times using extended keys', async () => {
|
|
170
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
171
|
+
builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
|
|
172
|
+
builder.sign({ key: testData.ACCOUNT_2.xPrivateKey });
|
|
173
|
+
const tx = (await builder.build());
|
|
174
|
+
const txJson = tx.toJson();
|
|
175
|
+
should_1.default.exist(tx.casperTx.approvals, 'There are no approvals');
|
|
176
|
+
should_1.default.deepEqual(tx.casperTx.approvals.length, 2, 'Error in the number of signatures');
|
|
177
|
+
should_1.default.deepEqual(tx.casperTx.approvals[0].signer, owner1Address, 'Error in the signature');
|
|
178
|
+
should_1.default.deepEqual(tx.casperTx.approvals[1].signer, owner2Address, 'Error in the signature');
|
|
179
|
+
should_1.default.exist(tx.casperTx.hash, 'There is no hash');
|
|
180
|
+
should_1.default.exist(txJson.from, 'There is no from');
|
|
181
|
+
should_1.default.deepEqual(txJson.from, owner1Address, 'The recipient does not match');
|
|
182
|
+
should_1.default.exist(tx.casperTx.header.gasPrice, 'There is no gasPrice');
|
|
183
|
+
should_1.default.equal(tx.casperTx.header.gasPrice.toString(), testData.FEE.gasPrice, 'Gas price does not match expected');
|
|
184
|
+
should_1.default.exist(txJson.fee.gasLimit, 'Gas Limit is not defined');
|
|
185
|
+
should_1.default.equal(txJson.fee.gasLimit, testData.FEE.gasLimit);
|
|
186
|
+
should_1.default.equal(txJson.to, owner2Address, 'To address was not the expected one');
|
|
187
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT, 'Amount does not match expected');
|
|
188
|
+
});
|
|
189
|
+
it('a transfer transaction signed multiple times using one extended key', async () => {
|
|
190
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
191
|
+
builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
|
|
192
|
+
builder.sign({ key: testData.ACCOUNT_2.privateKey });
|
|
193
|
+
const tx = (await builder.build());
|
|
194
|
+
const txJson = tx.toJson();
|
|
195
|
+
should_1.default.exist(tx.casperTx.approvals, 'There are no approvals');
|
|
196
|
+
should_1.default.deepEqual(tx.casperTx.approvals.length, 2, 'Error in the number of signatures');
|
|
197
|
+
should_1.default.deepEqual(tx.casperTx.approvals[0].signer, owner1Address, 'Error in the signature');
|
|
198
|
+
should_1.default.deepEqual(tx.casperTx.approvals[1].signer, owner2Address, 'Error in the signature');
|
|
199
|
+
should_1.default.exist(tx.casperTx.hash, 'There is no hash');
|
|
200
|
+
should_1.default.exist(txJson.from, 'There is no from');
|
|
201
|
+
should_1.default.deepEqual(txJson.from, owner1Address, 'The recipient does not match');
|
|
202
|
+
should_1.default.exist(tx.casperTx.header.gasPrice, 'There is no gasPrice');
|
|
203
|
+
should_1.default.equal(tx.casperTx.header.gasPrice.toString(), testData.FEE.gasPrice, 'Gas price does not match expected');
|
|
204
|
+
should_1.default.exist(txJson.fee.gasLimit, 'Gas Limit is not defined');
|
|
205
|
+
should_1.default.equal(txJson.fee.gasLimit, testData.FEE.gasLimit);
|
|
206
|
+
should_1.default.equal(txJson.to, owner2Address, 'To address was not the expected one');
|
|
207
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT, 'Amount does not match expected');
|
|
208
|
+
});
|
|
209
|
+
it('a non signed transfer transaction', async () => {
|
|
210
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
211
|
+
const tx = (await builder.build());
|
|
212
|
+
const txJson = tx.toJson();
|
|
213
|
+
should_1.default.deepEqual(tx.casperTx.approvals.length, 0, 'Error in the number of signatures');
|
|
214
|
+
should_1.default.exist(tx.casperTx.hash, 'There is no hash');
|
|
215
|
+
should_1.default.exist(txJson.from, 'There is no from');
|
|
216
|
+
should_1.default.deepEqual(txJson.from, owner1Address, 'The recipient does not match');
|
|
217
|
+
should_1.default.exist(tx.casperTx.header.gasPrice, 'There is no gasPrice');
|
|
218
|
+
should_1.default.exist(tx.casperTx.header.gasPrice, 'There is no gasPrice');
|
|
219
|
+
should_1.default.equal(tx.casperTx.header.gasPrice.toString(), testData.FEE.gasPrice, 'Gas price does not match expected');
|
|
220
|
+
should_1.default.exist(txJson.fee.gasLimit, 'Gas Limit is not defined');
|
|
221
|
+
should_1.default.equal(txJson.fee.gasLimit, testData.FEE.gasLimit);
|
|
222
|
+
should_1.default.equal(txJson.to, owner2Address, 'To address was not the expected one');
|
|
223
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT, 'Amount does not match expected');
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
describe('should build from', () => {
|
|
227
|
+
describe('serialized transactions', () => {
|
|
228
|
+
it('a non signed transfer transaction from serialized', async () => {
|
|
229
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
230
|
+
const tx = (await builder.build());
|
|
231
|
+
const txJson = tx.toJson();
|
|
232
|
+
const txId = tx.casperTx.session.getArgByName('id');
|
|
233
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
234
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
235
|
+
should_1.default.equal(txId.isSome(), true);
|
|
236
|
+
should_1.default.equal(txId.value().unwrap().value().toNumber(), 255);
|
|
237
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
238
|
+
const builder2 = factory.getTransferBuilder();
|
|
239
|
+
builder2.from(tx.toBroadcastFormat());
|
|
240
|
+
const tx2 = (await builder2.build());
|
|
241
|
+
const tx2Json = tx2.toJson();
|
|
242
|
+
const txId2 = tx2.casperTx.session.getArgByName('id');
|
|
243
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
244
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
245
|
+
should_1.default.equal(txId2.isSome(), true);
|
|
246
|
+
should_1.default.equal(txId2.value().unwrap().value().toNumber(), 255);
|
|
247
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
248
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
249
|
+
});
|
|
250
|
+
it('a signed transfer transaction from serialized', async () => {
|
|
251
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
252
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
253
|
+
const tx = (await builder.build());
|
|
254
|
+
const txJson = tx.toJson();
|
|
255
|
+
const txId = tx.casperTx.session.getArgByName('id');
|
|
256
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
257
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
258
|
+
should_1.default.equal(txId.isSome(), true);
|
|
259
|
+
should_1.default.equal(txId.value().unwrap().value().toNumber(), 255);
|
|
260
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
261
|
+
const builder2 = factory.getTransferBuilder();
|
|
262
|
+
builder2.from(tx.toBroadcastFormat());
|
|
263
|
+
const tx2 = (await builder2.build());
|
|
264
|
+
const tx2Json = tx2.toJson();
|
|
265
|
+
const txId2 = tx2.casperTx.session.getArgByName('id');
|
|
266
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
267
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
268
|
+
should_1.default.equal(txId2.isSome(), true);
|
|
269
|
+
should_1.default.equal(txId2.value().unwrap().value().toNumber(), 255);
|
|
270
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
271
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
272
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
273
|
+
});
|
|
274
|
+
it('a signed transfer transaction from serialized with extended key ', async () => {
|
|
275
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
276
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
277
|
+
const tx = (await builder.build());
|
|
278
|
+
const txJson = tx.toJson();
|
|
279
|
+
const txId = tx.casperTx.session.getArgByName('id');
|
|
280
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
281
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
282
|
+
should_1.default.equal(txId.isSome(), true);
|
|
283
|
+
should_1.default.equal(txId.value().unwrap().value().toNumber(), 255);
|
|
284
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
285
|
+
const builder2 = factory.getTransferBuilder();
|
|
286
|
+
builder2.from(tx.toBroadcastFormat());
|
|
287
|
+
const tx2 = (await builder2.build());
|
|
288
|
+
const tx2Json = tx2.toJson();
|
|
289
|
+
const txId2 = tx2.casperTx.session.getArgByName('id');
|
|
290
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
291
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
292
|
+
should_1.default.equal(txId2.isSome(), true);
|
|
293
|
+
should_1.default.equal(txId2.value().unwrap().value().toNumber(), 255);
|
|
294
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
295
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
296
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
297
|
+
});
|
|
298
|
+
it('an offline multisig transfer transaction', async () => {
|
|
299
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
300
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
301
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
302
|
+
const tx = (await builder.build());
|
|
303
|
+
const txJson = tx.toJson();
|
|
304
|
+
const txId = tx.casperTx.session.getArgByName('id');
|
|
305
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
306
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
307
|
+
should_1.default.equal(txId.isSome(), true);
|
|
308
|
+
should_1.default.equal(txId.value().unwrap().value().toNumber(), 255);
|
|
309
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
310
|
+
const builder2 = factory.getTransferBuilder();
|
|
311
|
+
builder2.from(tx.toBroadcastFormat());
|
|
312
|
+
const tx2 = (await builder2.build());
|
|
313
|
+
const tx2Json = tx2.toJson();
|
|
314
|
+
const txId2 = tx2.casperTx.session.getArgByName('id');
|
|
315
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
316
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
317
|
+
should_1.default.equal(txId2.isSome(), true);
|
|
318
|
+
should_1.default.equal(txId2.value().unwrap().value().toNumber(), 255);
|
|
319
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
320
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
321
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
322
|
+
});
|
|
323
|
+
it('an offline multisig transfer transaction with one extended key', async () => {
|
|
324
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
325
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
326
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
327
|
+
const tx = (await builder.build());
|
|
328
|
+
const txJson = tx.toJson();
|
|
329
|
+
const txId = tx.casperTx.session.getArgByName('id');
|
|
330
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
331
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
332
|
+
should_1.default.equal(txId.isSome(), true);
|
|
333
|
+
should_1.default.equal(txId.value().unwrap().value().toNumber(), 255);
|
|
334
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
335
|
+
const builder2 = factory.getTransferBuilder();
|
|
336
|
+
builder2.from(tx.toBroadcastFormat());
|
|
337
|
+
const tx2 = (await builder2.build());
|
|
338
|
+
const tx2Json = tx2.toJson();
|
|
339
|
+
const txId2 = tx2.casperTx.session.getArgByName('id');
|
|
340
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
341
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
342
|
+
should_1.default.equal(txId2.isSome(), true);
|
|
343
|
+
should_1.default.equal(txId2.value().unwrap().value().toNumber(), 255);
|
|
344
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
345
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
346
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
347
|
+
});
|
|
348
|
+
it('an offline multisig transfer transaction with extended keys', async () => {
|
|
349
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
350
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
351
|
+
builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
|
|
352
|
+
const tx = (await builder.build());
|
|
353
|
+
const txJson = tx.toJson();
|
|
354
|
+
const txId = tx.casperTx.session.getArgByName('id');
|
|
355
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
356
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
357
|
+
should_1.default.equal(txId.isSome(), true);
|
|
358
|
+
should_1.default.equal(txId.value().unwrap().value().toNumber(), 255);
|
|
359
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
360
|
+
const builder2 = factory.getTransferBuilder();
|
|
361
|
+
builder2.from(tx.toBroadcastFormat());
|
|
362
|
+
const tx2 = (await builder2.build());
|
|
363
|
+
const tx2Json = tx2.toJson();
|
|
364
|
+
const txId2 = tx2.casperTx.session.getArgByName('id');
|
|
365
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'Send');
|
|
366
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('to_address').value(), owner2Address);
|
|
367
|
+
should_1.default.equal(txId2.isSome(), true);
|
|
368
|
+
should_1.default.equal(txId2.value().unwrap().value().toNumber(), 255);
|
|
369
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('amount').value().toString(), testData.MIN_MOTES_AMOUNT);
|
|
370
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
371
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
describe('should fail rebuild from', () => {
|
|
377
|
+
it('a serialized transaction with invalid destination address', async () => {
|
|
378
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
379
|
+
const tx = (await builder.build());
|
|
380
|
+
tx.casperTx = casper_js_sdk_1.DeployUtil.addArgToDeploy(tx.casperTx, 'to_address', casper_js_sdk_1.CLValueBuilder.byteArray(Uint8Array.from([])));
|
|
381
|
+
const builder2 = factory.getTransferBuilder();
|
|
382
|
+
assert_1.default.throws(() => {
|
|
383
|
+
builder2.from(tx.toBroadcastFormat());
|
|
384
|
+
}, new RegExp(testData.ERROR_INVALID_DESTINATION_ADDRESS_ON_FROM));
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
describe('should fail', () => {
|
|
388
|
+
it('a transfer transaction with an invalid source address', () => {
|
|
389
|
+
assert_1.default.throws(() => {
|
|
390
|
+
initTxTransferBuilder().source({ address: testData.INVALID_ADDRESS });
|
|
391
|
+
}, new RegExp(testData.ERROR_INVALID_ADDRESS));
|
|
392
|
+
});
|
|
393
|
+
it('a transfer transaction with an invalid destination address', () => {
|
|
394
|
+
assert_1.default.throws(() => {
|
|
395
|
+
initTxTransferBuilder().to(testData.INVALID_ADDRESS);
|
|
396
|
+
}, new RegExp(testData.ERROR_INVALID_ADDRESS));
|
|
397
|
+
});
|
|
398
|
+
it('a transfer transaction with repeated sign', async () => {
|
|
399
|
+
const txBuilder = await initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
400
|
+
assert_1.default.throws(() => {
|
|
401
|
+
txBuilder.sign({ key: testData.ACCOUNT_3.privateKey });
|
|
402
|
+
txBuilder.sign({ key: testData.ACCOUNT_3.privateKey });
|
|
403
|
+
}, new RegExp(testData.ERROR_REPEATED_SIGNATURE));
|
|
404
|
+
});
|
|
405
|
+
it('a transfer transaction with repeated sign using extended keys', async () => {
|
|
406
|
+
const txBuilder = await initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
407
|
+
assert_1.default.throws(() => {
|
|
408
|
+
txBuilder.sign({ key: testData.ACCOUNT_3.xPrivateKey });
|
|
409
|
+
txBuilder.sign({ key: testData.ACCOUNT_3.xPrivateKey });
|
|
410
|
+
}, new RegExp(testData.ERROR_REPEATED_SIGNATURE));
|
|
411
|
+
});
|
|
412
|
+
it('a transfer transaction with an invalid amount: text value', () => {
|
|
413
|
+
assert_1.default.throws(() => {
|
|
414
|
+
initTxTransferBuilder().amount('invalid_value');
|
|
415
|
+
}, new RegExp(testData.ERROR_INVALID_AMOUNT));
|
|
416
|
+
});
|
|
417
|
+
it('a transfer transaction with an invalid amount: negative value', () => {
|
|
418
|
+
assert_1.default.throws(() => {
|
|
419
|
+
initTxTransferBuilder().amount('-1');
|
|
420
|
+
}, new RegExp(testData.ERROR_INVALID_AMOUNT));
|
|
421
|
+
});
|
|
422
|
+
it('a transfer transaction with an invalid amount: zero', () => {
|
|
423
|
+
assert_1.default.throws(() => {
|
|
424
|
+
initTxTransferBuilder().amount('0');
|
|
425
|
+
}, new RegExp(testData.ERROR_INVALID_AMOUNT));
|
|
426
|
+
});
|
|
427
|
+
it('a transfer transaction with an invalid amount: minAmount - 1', () => {
|
|
428
|
+
const maxInvalidAmount = new bignumber_js_1.default(testData.MIN_MOTES_AMOUNT).minus(1).toString();
|
|
429
|
+
assert_1.default.throws(() => {
|
|
430
|
+
initTxTransferBuilder().amount(maxInvalidAmount);
|
|
431
|
+
}, new RegExp(testData.ERROR_INVALID_AMOUNT));
|
|
432
|
+
});
|
|
433
|
+
it('a transfer transaction without destination param', () => {
|
|
434
|
+
const txBuilder = factory.getTransferBuilder();
|
|
435
|
+
txBuilder.fee(testData.FEE);
|
|
436
|
+
txBuilder.source({ address: owner1Address });
|
|
437
|
+
txBuilder.amount(testData.MIN_MOTES_AMOUNT);
|
|
438
|
+
txBuilder.build().should.be.rejectedWith(testData.ERROR_MISSING_TRANSFER_TARGET);
|
|
439
|
+
});
|
|
440
|
+
it('a transfer transaction with invalid destination param', () => {
|
|
441
|
+
const txBuilder = factory.getTransferBuilder();
|
|
442
|
+
assert_1.default.throws(() => {
|
|
443
|
+
txBuilder.to(testData.INVALID_ADDRESS);
|
|
444
|
+
}, new RegExp(testData.ERROR_INVALID_ADDRESS));
|
|
445
|
+
});
|
|
446
|
+
it('a transfer transaction without amount', () => {
|
|
447
|
+
const txBuilder = factory.getTransferBuilder();
|
|
448
|
+
txBuilder.fee(testData.FEE);
|
|
449
|
+
txBuilder.source({ address: owner1Address });
|
|
450
|
+
// txBuilder.to(owner2Address);
|
|
451
|
+
txBuilder.to('01513fa90c1a74c34a8958dd86055e9736edb1ead918bd4d4d750ca851946be7aa');
|
|
452
|
+
txBuilder.build().should.be.rejectedWith(testData.ERROR_MISSING_TRANSFER_AMOUNT);
|
|
453
|
+
});
|
|
454
|
+
it('a transfer transaction with invalid amount', async () => {
|
|
455
|
+
const txBuilder = factory.getTransferBuilder();
|
|
456
|
+
txBuilder.fee(testData.FEE);
|
|
457
|
+
txBuilder.source({ address: owner1Address });
|
|
458
|
+
txBuilder.to(owner2Address);
|
|
459
|
+
assert_1.default.throws(() => {
|
|
460
|
+
txBuilder.amount('');
|
|
461
|
+
}, new RegExp(testData.ERROR_INVALID_AMOUNT));
|
|
462
|
+
});
|
|
463
|
+
it('a transfer transaction with invalid transfer id', () => {
|
|
464
|
+
const txBuilder = factory.getTransferBuilder();
|
|
465
|
+
assert_1.default.throws(() => {
|
|
466
|
+
txBuilder.transferId(-1);
|
|
467
|
+
}, new RegExp(testData.ERROR_INVALID_TRANSFER_ID));
|
|
468
|
+
});
|
|
469
|
+
it('a transfer transaction with more than 3 signatures', () => {
|
|
470
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
471
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
472
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
473
|
+
builder.sign({ key: testData.ACCOUNT_2.privateKey });
|
|
474
|
+
assert_1.default.throws(() => {
|
|
475
|
+
builder.sign({ key: testData.ACCOUNT_2.privateKey });
|
|
476
|
+
}, new RegExp(testData.ERROR_MAX_AMOUNT_OF_SIGNERS_REACHED));
|
|
477
|
+
});
|
|
478
|
+
it('a transfer transaction with more than 3 signatures with extended keys', () => {
|
|
479
|
+
const builder = initTxTransferBuilder().amount(testData.MIN_MOTES_AMOUNT);
|
|
480
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
481
|
+
builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
|
|
482
|
+
builder.sign({ key: testData.ACCOUNT_2.xPrivateKey });
|
|
483
|
+
assert_1.default.throws(() => {
|
|
484
|
+
builder.sign({ key: testData.ACCOUNT_2.xPrivateKey });
|
|
485
|
+
}, new RegExp(testData.ERROR_MAX_AMOUNT_OF_SIGNERS_REACHED));
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
describe('txJson validation', () => {
|
|
489
|
+
it('contains all required fields for Transfer', async () => {
|
|
490
|
+
const txBuilder = initTxTransferBuilder();
|
|
491
|
+
txBuilder.amount(testData.MIN_MOTES_AMOUNT);
|
|
492
|
+
txBuilder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
493
|
+
const tx = (await txBuilder.build());
|
|
494
|
+
const txJson = tx.toJson();
|
|
495
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
496
|
+
should_1.default.equal(txJson.deployType, 'Send');
|
|
497
|
+
should_1.default.equal(txJson.from, owner1Address);
|
|
498
|
+
should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
|
|
499
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT);
|
|
500
|
+
should_1.default.equal(txJson.to, owner2Address);
|
|
501
|
+
should_1.default.equal(txJson.transferId, 255);
|
|
502
|
+
});
|
|
503
|
+
it('contains all required fields for Transfer signed with extended key', async () => {
|
|
504
|
+
const txBuilder = initTxTransferBuilder();
|
|
505
|
+
txBuilder.amount(testData.MIN_MOTES_AMOUNT);
|
|
506
|
+
txBuilder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
|
|
507
|
+
const tx = (await txBuilder.build());
|
|
508
|
+
const txJson = tx.toJson();
|
|
509
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
510
|
+
should_1.default.equal(txJson.deployType, 'Send');
|
|
511
|
+
should_1.default.equal(txJson.from, owner1Address);
|
|
512
|
+
should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
|
|
513
|
+
should_1.default.equal(txJson.amount, testData.MIN_MOTES_AMOUNT);
|
|
514
|
+
should_1.default.equal(txJson.to, owner2Address);
|
|
515
|
+
should_1.default.equal(txJson.transferId, 255);
|
|
516
|
+
});
|
|
517
|
+
});
|
|
518
|
+
});
|
|
519
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIvdHJhbnNmZXJCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QixpREFBOEY7QUFDOUYsZ0VBQXFDO0FBQ3JDLDZDQUF5RTtBQUN6RSxzRUFBd0Q7QUFFeEQsNkRBQW9FO0FBQ3BFLDRDQUF1QztBQUV2QyxRQUFRLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sV0FBVyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFdEYsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLEVBQUU7UUFDakMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUs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O1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IERlcGxveVV0aWwsIENMT3B0aW9uLCBDTFN0cmluZywgQ0xVNTEyLCBDTFU2NCwgQ0xWYWx1ZUJ1aWxkZXIgfSBmcm9tICdjYXNwZXItanMtc2RrJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgREVGQVVMVF9DSEFJTl9OQU1FUyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5kZXNjcmliZSgnQ2FzcGVyIFRyYW5zZmVyIEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3Rjc3ByJykpO1xuICBjb25zdCBmYWN0b3J5UHJvZCA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgnY3NwcicpKTtcbiAgY29uc3Qgb3duZXIxQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcbiAgY29uc3Qgb3duZXIyQWRkcmVzcyA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKTtcblxuICBjb25zdCBpbml0VHhUcmFuc2ZlckJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZmVlKHsgZ2FzTGltaXQ6IHRlc3REYXRhLkZFRS5nYXNMaW1pdCwgZ2FzUHJpY2U6IHRlc3REYXRhLkZFRS5nYXNQcmljZSB9KTtcbiAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogb3duZXIxQWRkcmVzcyB9KTtcbiAgICB0eEJ1aWxkZXIudG8ob3duZXIyQWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLnRyYW5zZmVySWQoMjU1KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGRlc2NyaWJlKCd0cmFuc2ZlciBidWlsZGVyIGVudmlyb25tZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc2VsZWN0IHRoZSByaWdodCBjaGFpbiBuYW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCkuY29pbk5hbWUoKSwgJ3Rjc3ByJyk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFjdG9yeVByb2QuZ2V0VHJhbnNmZXJCdWlsZGVyKCkuY29pbk5hbWUoKSwgJ2NzcHInKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCkuY2hhaW5OYW1lLCBERUZBVUxUX0NIQUlOX05BTUVTLnRlc3RuZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGZhY3RvcnlQcm9kLmdldFRyYW5zZmVyQnVpbGRlcigpLmNoYWluTmFtZSwgREVGQVVMVF9DSEFJTl9OQU1FUy5tYWlubmV0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCAnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ25vbiBzZXJpYWxpemVkIHRyYW5zYWN0aW9ucycsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRob3V0IHRyYW5zZmVySWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5mZWUoeyBnYXNMaW1pdDogdGVzdERhdGEuRkVFLmdhc0xpbWl0LCBnYXNQcmljZTogdGVzdERhdGEuRkVFLmdhc1ByaWNlIH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogb3duZXIxQWRkcmVzcyB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnRvKG93bmVyMkFkZHJlc3MpO1xuICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmFwcHJvdmFscywgJ1RoZXJlIGFyZSBubyBhcHByb3ZhbHMnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHMubGVuZ3RoLCAxLCAnRXJyb3IgaW4gdGhlIG51bWJlciBvZiBzaWduYXR1cmVzJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lciwgb3duZXIxQWRkcmVzcywgJ0Vycm9yIGluIHRoZSBzaWduYXR1cmUnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4Lmhhc2gsICdUaGVyZSBpcyBubyBoYXNoJyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZnJvbSwgJ1RoZXJlIGlzIG5vIGZyb20nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgb3duZXIxQWRkcmVzcywgJ1RoZSByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmhlYWRlci5nYXNQcmljZSwgJ1RoZXJlIGlzIG5vIGdhc1ByaWNlJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5jYXNwZXJUeC5oZWFkZXIuZ2FzUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgICB0ZXN0RGF0YS5GRUUuZ2FzUHJpY2UsXG4gICAgICAgICAgJ0dhcyBwcmljZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCdcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5mZWUuZ2FzTGltaXQsICdHYXMgTGltaXQgaXMgbm90IGRlZmluZWQnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mZWUuZ2FzTGltaXQsIHRlc3REYXRhLkZFRS5nYXNMaW1pdCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIG93bmVyMkFkZHJlc3MsICdUbyBhZGRyZXNzIHdhcyBub3QgdGhlIGV4cGVjdGVkIG9uZScpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLmFtb3VudCwgdGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCwgJ0Ftb3VudCB3YXMgbm90IGFzIGV4cGVjdGVkJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udHJhbnNmZXJJZCwgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNhY3Rpb24gdG8gYW4gYWRkcmVzcyBmcm9tIGFuIGVkMjU1MTkga2V5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBlZDI1NTE5QWRkcmVzcyA9ICcwMTUxM2ZhOTBjMWE3NGMzNGE4OTU4ZGQ4NjA1NWU5NzM2ZWRiMWVhZDkxOGJkNGQ0ZDc1MGNhODUxOTQ2YmU3YWEnO1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgICBidWlsZGVyLnRvKGVkMjU1MTlBZGRyZXNzKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgZWQyNTUxOUFkZHJlc3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoIHRyYW5zZmVySWQgb2YgdHlwZSBzdHJpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCkudHJhbnNmZXJJZCgnMjY3OTQxNDQ2MzkxMzQ1MTAnKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50cmFuc2ZlcklkLCAnMjY3OTQxNDQ2MzkxMzQ1MTAnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgdHJhbnNhY3Rpb24gd2l0aCBsYXJnZSBudW1lcmljIHRyYW5zZmVyIGlkIHZhbHVlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpLnRyYW5zZmVySWQoMjY3OTQxNDQ2MzkxMzQ1MTApO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRyYW5zZmVySWQsICcyNjc5NDE0NDYzOTEzNDUxMCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeFRyYW5zZmVyQnVpbGRlcigpLmFtb3VudCh0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmFwcHJvdmFscywgJ1RoZXJlIGFyZSBubyBhcHByb3ZhbHMnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHMubGVuZ3RoLCAxLCAnRXJyb3IgaW4gdGhlIG51bWJlciBvZiBzaWduYXR1cmVzJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lciwgb3duZXIxQWRkcmVzcywgJ0Vycm9yIGluIHRoZSBzaWduYXR1cmUnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4Lmhhc2gsICdUaGVyZSBpcyBubyBoYXNoJyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZnJvbSwgJ1RoZXJlIGlzIG5vIGZyb20nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgb3duZXIxQWRkcmVzcywgJ1RoZSByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmhlYWRlci5nYXNQcmljZSwgJ1RoZXJlIGlzIG5vIGdhc1ByaWNlJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5jYXNwZXJUeC5oZWFkZXIuZ2FzUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgICB0ZXN0RGF0YS5GRUUuZ2FzUHJpY2UsXG4gICAgICAgICAgJ0dhcyBwcmljZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCdcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5mZWUuZ2FzTGltaXQsICdHYXMgTGltaXQgaXMgbm90IGRlZmluZWQnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mZWUuZ2FzTGltaXQsIHRlc3REYXRhLkZFRS5nYXNMaW1pdCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgb3duZXIyQWRkcmVzcywgJ1RvIGFkZHJlc3Mgd2FzIG5vdCB0aGUgZXhwZWN0ZWQgb25lJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uYW1vdW50LCB0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5ULCAnQW1vdW50IHdhcyBub3QgYXMgZXhwZWN0ZWQnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdXNpbmcgZXh0ZW5kZWQga2V5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmFwcHJvdmFscywgJ1RoZXJlIGFyZSBubyBhcHByb3ZhbHMnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHMubGVuZ3RoLCAxLCAnRXJyb3IgaW4gdGhlIG51bWJlciBvZiBzaWduYXR1cmVzJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lciwgb3duZXIxQWRkcmVzcywgJ0Vycm9yIGluIHRoZSBzaWduYXR1cmUnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4Lmhhc2gsICdUaGVyZSBpcyBubyBoYXNoJyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZnJvbSwgJ1RoZXJlIGlzIG5vIGZyb20nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgb3duZXIxQWRkcmVzcywgJ1RoZSByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmhlYWRlci5nYXNQcmljZSwgJ1RoZXJlIGlzIG5vIGdhc1ByaWNlJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5jYXNwZXJUeC5oZWFkZXIuZ2FzUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgICB0ZXN0RGF0YS5GRUUuZ2FzUHJpY2UsXG4gICAgICAgICAgJ0dhcyBwcmljZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCdcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmZlZS5nYXNMaW1pdCwgJ0dhcyBMaW1pdCBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZlZS5nYXNMaW1pdCwgdGVzdERhdGEuRkVFLmdhc0xpbWl0KTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBvd25lcjJBZGRyZXNzLCAnVG8gYWRkcmVzcyB3YXMgbm90IHRoZSBleHBlY3RlZCBvbmUnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5hbW91bnQsIHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQsICdBbW91bnQgd2FzIG5vdCBhcyBleHBlY3RlZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHNpZ25lZCBtdWx0aXBsZSB0aW1lcycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeFRyYW5zZmVyQnVpbGRlcigpLmFtb3VudCh0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmFwcHJvdmFscywgJ1RoZXJlIGFyZSBubyBhcHByb3ZhbHMnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHMubGVuZ3RoLCAyLCAnRXJyb3IgaW4gdGhlIG51bWJlciBvZiBzaWduYXR1cmVzJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lciwgb3duZXIxQWRkcmVzcywgJ0Vycm9yIGluIHRoZSBzaWduYXR1cmUnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHNbMV0uc2lnbmVyLCBvd25lcjJBZGRyZXNzLCAnRXJyb3IgaW4gdGhlIHNpZ25hdHVyZScpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHguY2FzcGVyVHguaGFzaCwgJ1RoZXJlIGlzIG5vIGhhc2gnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5mcm9tLCAnVGhlcmUgaXMgbm8gZnJvbScpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBvd25lcjFBZGRyZXNzLCAnVGhlIHJlY2lwaWVudCBkb2VzIG5vdCBtYXRjaCcpO1xuXG4gICAgICAgIHNob3VsZC5leGlzdCh0eC5jYXNwZXJUeC5oZWFkZXIuZ2FzUHJpY2UsICdUaGVyZSBpcyBubyBnYXNQcmljZScpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgdHguY2FzcGVyVHguaGVhZGVyLmdhc1ByaWNlLnRvU3RyaW5nKCksXG4gICAgICAgICAgdGVzdERhdGEuRkVFLmdhc1ByaWNlLFxuICAgICAgICAgICdHYXMgcHJpY2UgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQnXG4gICAgICAgICk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5mZWUuZ2FzTGltaXQsICdHYXMgTGltaXQgaXMgbm90IGRlZmluZWQnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mZWUuZ2FzTGltaXQsIHRlc3REYXRhLkZFRS5nYXNMaW1pdCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgb3duZXIyQWRkcmVzcywgJ1RvIGFkZHJlc3Mgd2FzIG5vdCB0aGUgZXhwZWN0ZWQgb25lJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uYW1vdW50LCB0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5ULCAnQW1vdW50IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIG11bHRpcGxlIHRpbWVzIHVzaW5nIGV4dGVuZGVkIGtleXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnhQcml2YXRlS2V5IH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMi54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmFwcHJvdmFscywgJ1RoZXJlIGFyZSBubyBhcHByb3ZhbHMnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHMubGVuZ3RoLCAyLCAnRXJyb3IgaW4gdGhlIG51bWJlciBvZiBzaWduYXR1cmVzJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguY2FzcGVyVHguYXBwcm92YWxzWzBdLnNpZ25lciwgb3duZXIxQWRkcmVzcywgJ0Vycm9yIGluIHRoZSBzaWduYXR1cmUnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHNbMV0uc2lnbmVyLCBvd25lcjJBZGRyZXNzLCAnRXJyb3IgaW4gdGhlIHNpZ25hdHVyZScpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHguY2FzcGVyVHguaGFzaCwgJ1RoZXJlIGlzIG5vIGhhc2gnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5mcm9tLCAnVGhlcmUgaXMgbm8gZnJvbScpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mcm9tLCBvd25lcjFBZGRyZXNzLCAnVGhlIHJlY2lwaWVudCBkb2VzIG5vdCBtYXRjaCcpO1xuXG4gICAgICAgIHNob3VsZC5leGlzdCh0eC5jYXNwZXJUeC5oZWFkZXIuZ2FzUHJpY2UsICdUaGVyZSBpcyBubyBnYXNQcmljZScpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgdHguY2FzcGVyVHguaGVhZGVyLmdhc1ByaWNlLnRvU3RyaW5nKCksXG4gICAgICAgICAgdGVzdERhdGEuRkVFLmdhc1ByaWNlLFxuICAgICAgICAgICdHYXMgcHJpY2UgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQnXG4gICAgICAgICk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4SnNvbi5mZWUuZ2FzTGltaXQsICdHYXMgTGltaXQgaXMgbm90IGRlZmluZWQnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mZWUuZ2FzTGltaXQsIHRlc3REYXRhLkZFRS5nYXNMaW1pdCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50bywgb3duZXIyQWRkcmVzcywgJ1RvIGFkZHJlc3Mgd2FzIG5vdCB0aGUgZXhwZWN0ZWQgb25lJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uYW1vdW50LCB0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5ULCAnQW1vdW50IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc2lnbmVkIG11bHRpcGxlIHRpbWVzIHVzaW5nIG9uZSBleHRlbmRlZCBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnhQcml2YXRlS2V5IH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMi5wcml2YXRlS2V5IH0pO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXhpc3QodHguY2FzcGVyVHguYXBwcm92YWxzLCAnVGhlcmUgYXJlIG5vIGFwcHJvdmFscycpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmNhc3BlclR4LmFwcHJvdmFscy5sZW5ndGgsIDIsICdFcnJvciBpbiB0aGUgbnVtYmVyIG9mIHNpZ25hdHVyZXMnKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5jYXNwZXJUeC5hcHByb3ZhbHNbMF0uc2lnbmVyLCBvd25lcjFBZGRyZXNzLCAnRXJyb3IgaW4gdGhlIHNpZ25hdHVyZScpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmNhc3BlclR4LmFwcHJvdmFsc1sxXS5zaWduZXIsIG93bmVyMkFkZHJlc3MsICdFcnJvciBpbiB0aGUgc2lnbmF0dXJlJyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eC5jYXNwZXJUeC5oYXNoLCAnVGhlcmUgaXMgbm8gaGFzaCcpO1xuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmZyb20sICdUaGVyZSBpcyBubyBmcm9tJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZyb20sIG93bmVyMUFkZHJlc3MsICdUaGUgcmVjaXBpZW50IGRvZXMgbm90IG1hdGNoJyk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmhlYWRlci5nYXNQcmljZSwgJ1RoZXJlIGlzIG5vIGdhc1ByaWNlJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5jYXNwZXJUeC5oZWFkZXIuZ2FzUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgICB0ZXN0RGF0YS5GRUUuZ2FzUHJpY2UsXG4gICAgICAgICAgJ0dhcyBwcmljZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCdcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmZlZS5nYXNMaW1pdCwgJ0dhcyBMaW1pdCBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZlZS5nYXNMaW1pdCwgdGVzdERhdGEuRkVFLmdhc0xpbWl0KTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBvd25lcjJBZGRyZXNzLCAnVG8gYWRkcmVzcyB3YXMgbm90IHRoZSBleHBlY3RlZCBvbmUnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5hbW91bnQsIHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQsICdBbW91bnQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBub24gc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmNhc3BlclR4LmFwcHJvdmFscy5sZW5ndGgsIDAsICdFcnJvciBpbiB0aGUgbnVtYmVyIG9mIHNpZ25hdHVyZXMnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4Lmhhc2gsICdUaGVyZSBpcyBubyBoYXNoJyk7XG4gICAgICAgIHNob3VsZC5leGlzdCh0eEpzb24uZnJvbSwgJ1RoZXJlIGlzIG5vIGZyb20nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eEpzb24uZnJvbSwgb3duZXIxQWRkcmVzcywgJ1RoZSByZWNpcGllbnQgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmhlYWRlci5nYXNQcmljZSwgJ1RoZXJlIGlzIG5vIGdhc1ByaWNlJyk7XG5cbiAgICAgICAgc2hvdWxkLmV4aXN0KHR4LmNhc3BlclR4LmhlYWRlci5nYXNQcmljZSwgJ1RoZXJlIGlzIG5vIGdhc1ByaWNlJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICB0eC5jYXNwZXJUeC5oZWFkZXIuZ2FzUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgICB0ZXN0RGF0YS5GRUUuZ2FzUHJpY2UsXG4gICAgICAgICAgJ0dhcyBwcmljZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCdcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZXhpc3QodHhKc29uLmZlZS5nYXNMaW1pdCwgJ0dhcyBMaW1pdCBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZlZS5nYXNMaW1pdCwgdGVzdERhdGEuRkVFLmdhc0xpbWl0KTtcblxuICAgICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBvd25lcjJBZGRyZXNzLCAnVG8gYWRkcmVzcyB3YXMgbm90IHRoZSBleHBlY3RlZCBvbmUnKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5hbW91bnQsIHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQsICdBbW91bnQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCBmcm9tJywgKCkgPT4ge1xuICAgICAgZGVzY3JpYmUoJ3NlcmlhbGl6ZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgICAgICBpdCgnYSBub24gc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgICAgY29uc3QgdHhJZCA9IHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdpZCcpIGFzIENMT3B0aW9uPENMVTY0PjtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnU2VuZCcpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ3RvX2FkZHJlc3MnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgb3duZXIyQWRkcmVzcyk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHR4SWQuaXNTb21lKCksIHRydWUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh0eElkLnZhbHVlKCkudW53cmFwKCkudmFsdWUoKS50b051bWJlcigpLCAyNTUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnYW1vdW50JykgYXMgQ0xVNTEyKS52YWx1ZSgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBidWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgICAgY29uc3QgdHhJZDIgPSB0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2lkJykgYXMgQ0xPcHRpb248Q0xVNjQ+O1xuICAgICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnU2VuZCcpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCd0b19hZGRyZXNzJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksIG93bmVyMkFkZHJlc3MpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh0eElkMi5pc1NvbWUoKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHR4SWQyLnZhbHVlKCkudW53cmFwKCkudmFsdWUoKS50b051bWJlcigpLCAyNTUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2Ftb3VudCcpIGFzIENMVTUxMikudmFsdWUoKS50b1N0cmluZygpLFxuICAgICAgICAgICAgdGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgICAgY29uc3QgdHhJZCA9IHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdpZCcpIGFzIENMT3B0aW9uPENMVTY0PjtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnU2VuZCcpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ3RvX2FkZHJlc3MnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgb3duZXIyQWRkcmVzcyk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHR4SWQuaXNTb21lKCksIHRydWUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh0eElkLnZhbHVlKCkudW53cmFwKCkudmFsdWUoKS50b051bWJlcigpLCAyNTUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnYW1vdW50JykgYXMgQ0xVNTEyKS52YWx1ZSgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBidWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgICAgY29uc3QgdHhJZDIgPSB0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2lkJykgYXMgQ0xPcHRpb248Q0xVNjQ+O1xuICAgICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnU2VuZCcpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCd0b19hZGRyZXNzJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksIG93bmVyMkFkZHJlc3MpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh0eElkMi5pc1NvbWUoKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHR4SWQyLnZhbHVlKCkudW53cmFwKCkudmFsdWUoKS50b051bWJlcigpLCAyNTUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2Ftb3VudCcpIGFzIENMVTUxMikudmFsdWUoKS50b1N0cmluZygpLFxuICAgICAgICAgICAgdGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgICB0eDIuY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBzZXJpYWxpemVkIHdpdGggZXh0ZW5kZWQga2V5ICcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgICBjb25zdCB0eElkID0gdHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2lkJykgYXMgQ0xPcHRpb248Q0xVNjQ+O1xuICAgICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdTZW5kJyk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgndG9fYWRkcmVzcycpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCBvd25lcjJBZGRyZXNzKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodHhJZC5pc1NvbWUoKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHR4SWQudmFsdWUoKS51bndyYXAoKS52YWx1ZSgpLnRvTnVtYmVyKCksIDI1NSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdhbW91bnQnKSBhcyBDTFU1MTIpLnZhbHVlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICAgIGJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgICBjb25zdCB0eElkMiA9IHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnaWQnKSBhcyBDTE9wdGlvbjxDTFU2ND47XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdTZW5kJyk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ3RvX2FkZHJlc3MnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgb3duZXIyQWRkcmVzcyk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHR4SWQyLmlzU29tZSgpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodHhJZDIudmFsdWUoKS51bndyYXAoKS52YWx1ZSgpLnRvTnVtYmVyKCksIDI1NSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnYW1vdW50JykgYXMgQ0xVNTEyKS52YWx1ZSgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICAgIHR4Mi5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgICAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIGdldCBhcHByb3ZhbHMgY29ycmVjdGx5J1xuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhbiBvZmZsaW5lIG11bHRpc2lnIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcml2YXRlS2V5IH0pO1xuICAgICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgICBjb25zdCB0eElkID0gdHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2lkJykgYXMgQ0xPcHRpb248Q0xVNjQ+O1xuICAgICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdTZW5kJyk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgndG9fYWRkcmVzcycpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCBvd25lcjJBZGRyZXNzKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodHhJZC5pc1NvbWUoKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHR4SWQudmFsdWUoKS51bndyYXAoKS52YWx1ZSgpLnRvTnVtYmVyKCksIDI1NSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdhbW91bnQnKSBhcyBDTFU1MTIpLnZhbHVlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICAgIGJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgICBjb25zdCB0eElkMiA9IHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnaWQnKSBhcyBDTE9wdGlvbjxDTFU2ND47XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdTZW5kJyk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ3RvX2FkZHJlc3MnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgb3duZXIyQWRkcmVzcyk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHR4SWQyLmlzU29tZSgpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodHhJZDIudmFsdWUoKS51bndyYXAoKS52YWx1ZSgpLnRvTnVtYmVyKCksIDI1NSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnYW1vdW50JykgYXMgQ0xVNTEyKS52YWx1ZSgpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICAgIHR4Mi5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgICAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIGdldCBhcHByb3ZhbHMgY29ycmVjdGx5J1xuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdhbiBvZmZsaW5lIG11bHRpc2lnIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggb25lIGV4dGVuZGVkIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7XG4gICAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICAgIGNvbnN0IHR4SWQgPSB0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnaWQnKSBhcyBDTE9wdGlvbjxDTFU2ND47XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1NlbmQnKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCd0b19hZGRyZXNzJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksIG93bmVyMkFkZHJlc3MpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh0eElkLmlzU29tZSgpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodHhJZC52YWx1ZSgpLnVud3JhcCgpLnZhbHVlKCkudG9OdW1iZXIoKSwgMjU1KTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2Ftb3VudCcpIGFzIENMVTUxMikudmFsdWUoKS50b1N0cmluZygpLFxuICAgICAgICAgICAgdGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgICAgIGNvbnN0IHR4SWQyID0gdHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdpZCcpIGFzIENMT3B0aW9uPENMVTY0PjtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1NlbmQnKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgndG9fYWRkcmVzcycpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCBvd25lcjJBZGRyZXNzKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodHhJZDIuaXNTb21lKCksIHRydWUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh0eElkMi52YWx1ZSgpLnVud3JhcCgpLnZhbHVlKCkudG9OdW1iZXIoKSwgMjU1KTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdhbW91bnQnKSBhcyBDTFU1MTIpLnZhbHVlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDJKc29uLCB0eEpzb24sICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgcmVjcmVhdGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAgICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgZ2V0IGFwcHJvdmFscyBjb3JyZWN0bHknXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FuIG9mZmxpbmUgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBleHRlbmRlZCBrZXlzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQueFByaXZhdGVLZXkgfSk7XG4gICAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEueFByaXZhdGVLZXkgfSk7XG4gICAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICAgIGNvbnN0IHR4SWQgPSB0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnaWQnKSBhcyBDTE9wdGlvbjxDTFU2ND47XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1NlbmQnKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCd0b19hZGRyZXNzJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksIG93bmVyMkFkZHJlc3MpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh0eElkLmlzU29tZSgpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodHhJZC52YWx1ZSgpLnVud3JhcCgpLnZhbHVlKCkudG9OdW1iZXIoKSwgMjU1KTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2Ftb3VudCcpIGFzIENMVTUxMikudmFsdWUoKS50b1N0cmluZygpLFxuICAgICAgICAgICAgdGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgICAgIGNvbnN0IHR4SWQyID0gdHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdpZCcpIGFzIENMT3B0aW9uPENMVTY0PjtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1NlbmQnKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgndG9fYWRkcmVzcycpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCBvd25lcjJBZGRyZXNzKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodHhJZDIuaXNTb21lKCksIHRydWUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh0eElkMi52YWx1ZSgpLnVud3JhcCgpLnZhbHVlKCkudG9OdW1iZXIoKSwgMjU1KTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdhbW91bnQnKSBhcyBDTFU1MTIpLnZhbHVlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDJKc29uLCB0eEpzb24sICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgcmVjcmVhdGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAgICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgZ2V0IGFwcHJvdmFscyBjb3JyZWN0bHknXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHJlYnVpbGQgZnJvbScsICgpID0+IHtcbiAgICBpdCgnYSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeFRyYW5zZmVyQnVpbGRlcigpLmFtb3VudCh0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UKTtcbiAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICAgIHR4LmNhc3BlclR4ID0gRGVwbG95VXRpbC5hZGRBcmdUb0RlcGxveSh0eC5jYXNwZXJUeCwgJ3RvX2FkZHJlc3MnLCBDTFZhbHVlQnVpbGRlci5ieXRlQXJyYXkoVWludDhBcnJheS5mcm9tKFtdKSkpO1xuXG4gICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIH0sIG5ldyBSZWdFeHAodGVzdERhdGEuRVJST1JfSU5WQUxJRF9ERVNUSU5BVElPTl9BRERSRVNTX09OX0ZST00pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsJywgKCkgPT4ge1xuICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggYW4gaW52YWxpZCBzb3VyY2UgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5zb3VyY2UoeyBhZGRyZXNzOiB0ZXN0RGF0YS5JTlZBTElEX0FERFJFU1MgfSk7XG4gICAgICB9LCBuZXcgUmVnRXhwKHRlc3REYXRhLkVSUk9SX0lOVkFMSURfQUREUkVTUykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkudG8odGVzdERhdGEuSU5WQUxJRF9BRERSRVNTKTtcbiAgICAgIH0sIG5ldyBSZWdFeHAodGVzdERhdGEuRVJST1JfSU5WQUxJRF9BRERSRVNTKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIHJlcGVhdGVkIHNpZ24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhd2FpdCBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMy5wcml2YXRlS2V5IH0pO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8zLnByaXZhdGVLZXkgfSk7XG4gICAgICB9LCBuZXcgUmVnRXhwKHRlc3REYXRhLkVSUk9SX1JFUEVBVEVEX1NJR05BVFVSRSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCByZXBlYXRlZCBzaWduIHVzaW5nIGV4dGVuZGVkIGtleXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBhd2FpdCBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMy54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMy54UHJpdmF0ZUtleSB9KTtcbiAgICAgIH0sIG5ldyBSZWdFeHAodGVzdERhdGEuRVJST1JfUkVQRUFURURfU0lHTkFUVVJFKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGFuIGludmFsaWQgYW1vdW50OiB0ZXh0IHZhbHVlJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGluaXRUeFRyYW5zZmVyQnVpbGRlcigpLmFtb3VudCgnaW52YWxpZF92YWx1ZScpO1xuICAgICAgfSwgbmV3IFJlZ0V4cCh0ZXN0RGF0YS5FUlJPUl9JTlZBTElEX0FNT1VOVCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIGFtb3VudDogbmVnYXRpdmUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KCctMScpO1xuICAgICAgfSwgbmV3IFJlZ0V4cCh0ZXN0RGF0YS5FUlJPUl9JTlZBTElEX0FNT1VOVCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBhbiBpbnZhbGlkIGFtb3VudDogemVybycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKS5hbW91bnQoJzAnKTtcbiAgICAgIH0sIG5ldyBSZWdFeHAodGVzdERhdGEuRVJST1JfSU5WQUxJRF9BTU9VTlQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggYW4gaW52YWxpZCBhbW91bnQ6IG1pbkFtb3VudCAtIDEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXhJbnZhbGlkQW1vdW50ID0gbmV3IEJpZ051bWJlcih0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UKS5taW51cygxKS50b1N0cmluZygpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGluaXRUeFRyYW5zZmVyQnVpbGRlcigpLmFtb3VudChtYXhJbnZhbGlkQW1vdW50KTtcbiAgICAgIH0sIG5ldyBSZWdFeHAodGVzdERhdGEuRVJST1JfSU5WQUxJRF9BTU9VTlQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGhvdXQgZGVzdGluYXRpb24gcGFyYW0nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IG93bmVyMUFkZHJlc3MgfSk7XG4gICAgICB0eEJ1aWxkZXIuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh0ZXN0RGF0YS5FUlJPUl9NSVNTSU5HX1RSQU5TRkVSX1RBUkdFVCk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgZGVzdGluYXRpb24gcGFyYW0nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIHR4QnVpbGRlci50byh0ZXN0RGF0YS5JTlZBTElEX0FERFJFU1MpO1xuICAgICAgfSwgbmV3IFJlZ0V4cCh0ZXN0RGF0YS5FUlJPUl9JTlZBTElEX0FERFJFU1MpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGhvdXQgYW1vdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBvd25lcjFBZGRyZXNzIH0pO1xuICAgICAgLy8gdHhCdWlsZGVyLnRvKG93bmVyMkFkZHJlc3MpO1xuICAgICAgdHhCdWlsZGVyLnRvKCcwMTUxM2ZhOTBjMWE3NGMzNGE4OTU4ZGQ4NjA1NWU5NzM2ZWRiMWVhZDkxOGJkNGQ0ZDc1MGNhODUxOTQ2YmU3YWEnKTtcbiAgICAgIHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgodGVzdERhdGEuRVJST1JfTUlTU0lOR19UUkFOU0ZFUl9BTU9VTlQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIGFtb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogb3duZXIxQWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci50byhvd25lcjJBZGRyZXNzKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KCcnKTtcbiAgICAgIH0sIG5ldyBSZWdFeHAodGVzdERhdGEuRVJST1JfSU5WQUxJRF9BTU9VTlQpKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCB0cmFuc2ZlciBpZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgdHhCdWlsZGVyLnRyYW5zZmVySWQoLTEpO1xuICAgICAgfSwgbmV3IFJlZ0V4cCh0ZXN0RGF0YS5FUlJPUl9JTlZBTElEX1RSQU5TRkVSX0lEKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG1vcmUgdGhhbiAzIHNpZ25hdHVyZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gaW5pdFR4VHJhbnNmZXJCdWlsZGVyKCkuYW1vdW50KHRlc3REYXRhLk1JTl9NT1RFU19BTU9VTlQpO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnByaXZhdGVLZXkgfSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMi5wcml2YXRlS2V5IH0pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8yLnByaXZhdGVLZXkgfSk7XG4gICAgICB9LCBuZXcgUmVnRXhwKHRlc3REYXRhLkVSUk9SX01BWF9BTU9VTlRfT0ZfU0lHTkVSU19SRUFDSEVEKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG1vcmUgdGhhbiAzIHNpZ25hdHVyZXMgd2l0aCBleHRlbmRlZCBrZXlzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRUeFRyYW5zZmVyQnVpbGRlcigpLmFtb3VudCh0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UKTtcbiAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEueFByaXZhdGVLZXkgfSk7XG4gICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMi54UHJpdmF0ZUtleSB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMi54UHJpdmF0ZUtleSB9KTtcbiAgICAgIH0sIG5ldyBSZWdFeHAodGVzdERhdGEuRVJST1JfTUFYX0FNT1VOVF9PRl9TSUdORVJTX1JFQUNIRUQpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3R4SnNvbiB2YWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdjb250YWlucyBhbGwgcmVxdWlyZWQgZmllbGRzIGZvciBUcmFuc2ZlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRUeFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFtb3VudCh0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcblxuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmRlcGxveVR5cGUsICdTZW5kJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIG93bmVyMUFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5oYXNoLCBCdWZmZXIuZnJvbSh0eC5jYXNwZXJUeC5oYXNoKS50b1N0cmluZygnaGV4JykpO1xuXG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmFtb3VudCwgdGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLnRvLCBvd25lcjJBZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udHJhbnNmZXJJZCwgMjU1KTtcbiAgICB9KTtcblxuICAgIGl0KCdjb250YWlucyBhbGwgcmVxdWlyZWQgZmllbGRzIGZvciBUcmFuc2ZlciBzaWduZWQgd2l0aCBleHRlbmRlZCBrZXknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VHhUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hbW91bnQodGVzdERhdGEuTUlOX01PVEVTX0FNT1VOVCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnhQcml2YXRlS2V5IH0pO1xuXG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZSwgdGVzdERhdGEuRkVFKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZGVwbG95VHlwZSwgJ1NlbmQnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgb3duZXIxQWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmhhc2gsIEJ1ZmZlci5mcm9tKHR4LmNhc3BlclR4Lmhhc2gpLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uYW1vdW50LCB0ZXN0RGF0YS5NSU5fTU9URVNfQU1PVU5UKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24udG8sIG93bmVyMkFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi50cmFuc2ZlcklkLCAyNTUpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|