@bitgo/sdk-coin-cspr 2.4.2 → 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 -851
|
@@ -0,0 +1,338 @@
|
|
|
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 lib_1 = require("../../../../src/lib");
|
|
42
|
+
const testData = __importStar(require("../../../fixtures/resources"));
|
|
43
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
44
|
+
const utils_1 = require("../../../../src/lib/utils");
|
|
45
|
+
const statics_1 = require("@bitgo/statics");
|
|
46
|
+
describe('CSPR Wallet initialization', () => {
|
|
47
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
|
|
48
|
+
const owner1Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress();
|
|
49
|
+
const owner2Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress();
|
|
50
|
+
const owner3Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress();
|
|
51
|
+
const owner4Address = new lib_1.KeyPair({ pub: testData.ACCOUNT_4.publicKey }).getAddress();
|
|
52
|
+
const sourceAddress = new lib_1.KeyPair({ pub: testData.ROOT_ACCOUNT.publicKey }).getAddress();
|
|
53
|
+
const initSignedTxBuilder = () => {
|
|
54
|
+
const txBuilder = initUnsignedTxBuilder();
|
|
55
|
+
txBuilder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
56
|
+
return txBuilder;
|
|
57
|
+
};
|
|
58
|
+
const initSignedTxBuilderWithExtendedKey = () => {
|
|
59
|
+
const txBuilder = initUnsignedTxBuilder();
|
|
60
|
+
txBuilder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
61
|
+
return txBuilder;
|
|
62
|
+
};
|
|
63
|
+
const initUnsignedTxBuilder = () => {
|
|
64
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
65
|
+
txBuilder.fee(testData.FEE);
|
|
66
|
+
txBuilder.owner(owner1Address);
|
|
67
|
+
txBuilder.owner(owner2Address);
|
|
68
|
+
txBuilder.owner(owner3Address);
|
|
69
|
+
txBuilder.source({ address: sourceAddress });
|
|
70
|
+
return txBuilder;
|
|
71
|
+
};
|
|
72
|
+
describe('should build ', () => {
|
|
73
|
+
it('an init transaction', async () => {
|
|
74
|
+
const txBuilder = initSignedTxBuilder();
|
|
75
|
+
const tx = await txBuilder.build();
|
|
76
|
+
const txJson = tx.toJson();
|
|
77
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
78
|
+
should_1.default.deepEqual(tx.signature.length, 1);
|
|
79
|
+
should_1.default.doesNotThrow(() => (0, utils_1.verifySignature)(tx.signature[0], txJson.hash, testData.ROOT_ACCOUNT.publicKey));
|
|
80
|
+
should_1.default.equal(txJson.from, sourceAddress);
|
|
81
|
+
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
82
|
+
});
|
|
83
|
+
it('an init transaction using extended key to sign', async () => {
|
|
84
|
+
const txBuilder = initSignedTxBuilderWithExtendedKey();
|
|
85
|
+
const tx = await txBuilder.build();
|
|
86
|
+
const txJson = tx.toJson();
|
|
87
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
88
|
+
should_1.default.deepEqual(tx.signature.length, 1);
|
|
89
|
+
should_1.default.doesNotThrow(() => (0, utils_1.verifySignature)(tx.signature[0], txJson.hash, testData.ROOT_ACCOUNT.publicKey));
|
|
90
|
+
should_1.default.equal(txJson.from, sourceAddress);
|
|
91
|
+
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
|
|
92
|
+
});
|
|
93
|
+
it('an init transaction with external signature', async () => {
|
|
94
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
95
|
+
txBuilder.fee(testData.FEE);
|
|
96
|
+
txBuilder.owner(owner1Address);
|
|
97
|
+
txBuilder.owner(owner2Address);
|
|
98
|
+
txBuilder.owner(owner3Address);
|
|
99
|
+
txBuilder.source({ address: sourceAddress });
|
|
100
|
+
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
|
|
101
|
+
const tx = await txBuilder.build();
|
|
102
|
+
const txJson = tx.toJson();
|
|
103
|
+
should_1.default.equal(txJson.from, sourceAddress);
|
|
104
|
+
});
|
|
105
|
+
it('an init transaction with external signature included twice', async () => {
|
|
106
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
107
|
+
txBuilder.fee(testData.FEE);
|
|
108
|
+
txBuilder.owner(owner1Address);
|
|
109
|
+
txBuilder.owner(owner2Address);
|
|
110
|
+
txBuilder.owner(owner3Address);
|
|
111
|
+
txBuilder.source({ address: sourceAddress });
|
|
112
|
+
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
|
|
113
|
+
txBuilder.signature(testData.EXTERNAL_SIGNATURE.signature, new lib_1.KeyPair({ pub: testData.EXTERNAL_SIGNATURE.publicKey }));
|
|
114
|
+
const tx = await txBuilder.build();
|
|
115
|
+
const txJson = tx.toJson();
|
|
116
|
+
should_1.default.equal(txJson.from, sourceAddress);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('should fail to build', () => {
|
|
120
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
|
|
121
|
+
it('a transaction without fee', async () => {
|
|
122
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
123
|
+
txBuilder.owner(owner1Address);
|
|
124
|
+
txBuilder.owner(owner2Address);
|
|
125
|
+
txBuilder.owner(owner3Address);
|
|
126
|
+
txBuilder.source({ address: sourceAddress });
|
|
127
|
+
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_FEE);
|
|
128
|
+
});
|
|
129
|
+
it('a wallet initialization the wrong number of owners', async () => {
|
|
130
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
131
|
+
txBuilder.fee(testData.FEE);
|
|
132
|
+
txBuilder.owner(owner1Address);
|
|
133
|
+
txBuilder.owner(owner2Address);
|
|
134
|
+
txBuilder.source({ address: sourceAddress });
|
|
135
|
+
await txBuilder.build().should.be.rejectedWith(testData.INVALID_NUMBER_OF_OWNERS_TWO_OF_THREE);
|
|
136
|
+
assert_1.default.throws(() => txBuilder.owner(owner1Address), 'Repeated owner address: ' + owner1Address);
|
|
137
|
+
should_1.default.doesNotThrow(() => txBuilder.owner(owner3Address));
|
|
138
|
+
assert_1.default.throws(() => txBuilder.owner(owner4Address), /A maximum of 3 owners can be set for a multisig wallet/);
|
|
139
|
+
const newTxBuilder = factory.getWalletInitializationBuilder();
|
|
140
|
+
newTxBuilder.fee(testData.FEE);
|
|
141
|
+
txBuilder.source({ address: sourceAddress });
|
|
142
|
+
await newTxBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_OWNERS);
|
|
143
|
+
});
|
|
144
|
+
it('a transaction with invalid source', async () => {
|
|
145
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('thbar'));
|
|
146
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
147
|
+
txBuilder.fee(testData.FEE);
|
|
148
|
+
txBuilder.owner(owner1Address);
|
|
149
|
+
txBuilder.owner(owner2Address);
|
|
150
|
+
txBuilder.owner(owner3Address);
|
|
151
|
+
await txBuilder.build().should.be.rejectedWith(testData.INVALID_TRANSACTION_MISSING_SOURCE);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('should validate', () => {
|
|
155
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tcspr'));
|
|
156
|
+
it('an address', async () => {
|
|
157
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
158
|
+
txBuilder.validateAddress({ address: testData.VALID_ADDRESS });
|
|
159
|
+
assert_1.default.throws(() => txBuilder.validateAddress({ address: testData.INVALID_ADDRESS }), new RegExp('Invalid address ' + testData.INVALID_ADDRESS));
|
|
160
|
+
});
|
|
161
|
+
it('value should be greater than zero', () => {
|
|
162
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
163
|
+
assert_1.default.throws(() => txBuilder.fee({ gasLimit: '-10' }));
|
|
164
|
+
should_1.default.doesNotThrow(() => txBuilder.fee({ gasLimit: '10' }));
|
|
165
|
+
});
|
|
166
|
+
it('a private key', () => {
|
|
167
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
168
|
+
assert_1.default.throws(() => txBuilder.validateKey({ key: 'abc' }), /Unsupported private key/);
|
|
169
|
+
should_1.default.doesNotThrow(() => txBuilder.validateKey({ key: testData.ACCOUNT_1.privateKey }));
|
|
170
|
+
});
|
|
171
|
+
it('a transaction to build', async () => {
|
|
172
|
+
const txBuilder = factory.getWalletInitializationBuilder();
|
|
173
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
|
|
174
|
+
txBuilder.fee(testData.FEE);
|
|
175
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
|
|
176
|
+
txBuilder.source({ address: testData.VALID_ADDRESS });
|
|
177
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /Invalid transaction: missing wallet owners/);
|
|
178
|
+
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
179
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 1/);
|
|
180
|
+
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
181
|
+
assert_1.default.throws(() => txBuilder.validateTransaction(), /wrong number of owners -- required: 3, found: 2/);
|
|
182
|
+
txBuilder.owner(new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
183
|
+
should_1.default.doesNotThrow(() => txBuilder.validateTransaction());
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('should build from', () => {
|
|
187
|
+
describe('serialized transactions', () => {
|
|
188
|
+
it('a non signed transfer transaction from serialized', async () => {
|
|
189
|
+
const builder = initUnsignedTxBuilder();
|
|
190
|
+
const tx = (await builder.build());
|
|
191
|
+
const txJson = tx.toJson();
|
|
192
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
193
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
194
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
195
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
196
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
197
|
+
builder2.from(tx.toBroadcastFormat());
|
|
198
|
+
const tx2 = (await builder2.build());
|
|
199
|
+
const tx2Json = tx2.toJson();
|
|
200
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
201
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
202
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
203
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
204
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
205
|
+
});
|
|
206
|
+
it('a signed transfer transaction from serialized', async () => {
|
|
207
|
+
const builder = initUnsignedTxBuilder();
|
|
208
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
209
|
+
const tx = (await builder.build());
|
|
210
|
+
const txJson = tx.toJson();
|
|
211
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
212
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
213
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
214
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
215
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
216
|
+
builder2.from(tx.toBroadcastFormat());
|
|
217
|
+
const tx2 = (await builder2.build());
|
|
218
|
+
const tx2Json = tx2.toJson();
|
|
219
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
220
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
221
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
222
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
223
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
224
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
225
|
+
});
|
|
226
|
+
it('a signed transfer transaction with extended key from serialized', async () => {
|
|
227
|
+
const builder = initUnsignedTxBuilder();
|
|
228
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
229
|
+
const tx = (await builder.build());
|
|
230
|
+
const txJson = tx.toJson();
|
|
231
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
232
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
233
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
234
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
235
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
236
|
+
builder2.from(tx.toBroadcastFormat());
|
|
237
|
+
const tx2 = (await builder2.build());
|
|
238
|
+
const tx2Json = tx2.toJson();
|
|
239
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
240
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
241
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
242
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
243
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
244
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
245
|
+
});
|
|
246
|
+
it('an offline multisig transfer transaction', async () => {
|
|
247
|
+
const builder = initUnsignedTxBuilder();
|
|
248
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.privateKey });
|
|
249
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
250
|
+
const tx = (await builder.build());
|
|
251
|
+
const txJson = tx.toJson();
|
|
252
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
253
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
254
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
255
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
256
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
257
|
+
builder2.from(tx.toBroadcastFormat());
|
|
258
|
+
const tx2 = (await builder2.build());
|
|
259
|
+
const tx2Json = tx2.toJson();
|
|
260
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
261
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
262
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
263
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
264
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
265
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
266
|
+
});
|
|
267
|
+
it('an offline multisig transfer transaction using extended keys', async () => {
|
|
268
|
+
const builder = initUnsignedTxBuilder();
|
|
269
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
270
|
+
builder.sign({ key: testData.ACCOUNT_1.xPrivateKey });
|
|
271
|
+
const tx = (await builder.build());
|
|
272
|
+
const txJson = tx.toJson();
|
|
273
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
274
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
275
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
276
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
277
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
278
|
+
builder2.from(tx.toBroadcastFormat());
|
|
279
|
+
const tx2 = (await builder2.build());
|
|
280
|
+
const tx2Json = tx2.toJson();
|
|
281
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
282
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
283
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
284
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
285
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
286
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
287
|
+
});
|
|
288
|
+
it('an offline multisig transfer transaction using one extended key', async () => {
|
|
289
|
+
const builder = initUnsignedTxBuilder();
|
|
290
|
+
builder.sign({ key: testData.ROOT_ACCOUNT.xPrivateKey });
|
|
291
|
+
builder.sign({ key: testData.ACCOUNT_1.privateKey });
|
|
292
|
+
const tx = (await builder.build());
|
|
293
|
+
const txJson = tx.toJson();
|
|
294
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
295
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
296
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
297
|
+
should_1.default.equal(tx.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
298
|
+
const builder2 = factory.getWalletInitializationBuilder();
|
|
299
|
+
builder2.from(tx.toBroadcastFormat());
|
|
300
|
+
const tx2 = (await builder2.build());
|
|
301
|
+
const tx2Json = tx2.toJson();
|
|
302
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('deploy_type').value(), 'WalletInitialization');
|
|
303
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_0').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
304
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_1').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
305
|
+
should_1.default.equal(tx2.casperTx.session.getArgByName('owner_2').value(), new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
306
|
+
should_1.default.deepEqual(tx2Json, txJson, 'from implementation from factory should recreate original transaction');
|
|
307
|
+
should_1.default.deepEqual(tx2.casperTx.approvals, tx.casperTx.approvals, 'from implementation from factory should get approvals correctly');
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
describe('txJson validation', () => {
|
|
312
|
+
it('contains all required fields for Wallet Initialization', async () => {
|
|
313
|
+
const txBuilder = initSignedTxBuilder();
|
|
314
|
+
const tx = (await txBuilder.build());
|
|
315
|
+
const txJson = tx.toJson();
|
|
316
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
317
|
+
should_1.default.equal(txJson.deployType, 'WalletInitialization');
|
|
318
|
+
should_1.default.equal(txJson.from, '02' + testData.ROOT_ACCOUNT.publicKey);
|
|
319
|
+
should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
|
|
320
|
+
should_1.default.equal(txJson.owner1, new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
321
|
+
should_1.default.equal(txJson.owner2, new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
322
|
+
should_1.default.equal(txJson.owner3, new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
323
|
+
});
|
|
324
|
+
it('contains all required fields for Wallet Initialization using extended key to sign', async () => {
|
|
325
|
+
const txBuilder = initSignedTxBuilderWithExtendedKey();
|
|
326
|
+
const tx = (await txBuilder.build());
|
|
327
|
+
const txJson = tx.toJson();
|
|
328
|
+
should_1.default.deepEqual(txJson.fee, testData.FEE);
|
|
329
|
+
should_1.default.equal(txJson.deployType, 'WalletInitialization');
|
|
330
|
+
should_1.default.equal(txJson.from, '02' + testData.ROOT_ACCOUNT.publicKey);
|
|
331
|
+
should_1.default.equal(txJson.hash, Buffer.from(tx.casperTx.hash).toString('hex'));
|
|
332
|
+
should_1.default.equal(txJson.owner1, new lib_1.KeyPair({ pub: testData.ACCOUNT_1.publicKey }).getAddress());
|
|
333
|
+
should_1.default.equal(txJson.owner2, new lib_1.KeyPair({ pub: testData.ACCOUNT_2.publicKey }).getAddress());
|
|
334
|
+
should_1.default.equal(txJson.owner3, new lib_1.KeyPair({ pub: testData.ACCOUNT_3.publicKey }).getAddress());
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvbGliL3RyYW5zYWN0aW9uQnVpbGRlci93YWxsZXRJbml0aWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsNkNBQXlFO0FBQ3pFLHNFQUF3RDtBQUN4RCw4Q0FBa0Q7QUFFbEQscURBQTREO0FBRTVELDRDQUF1QztBQUV2QyxRQUFRLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxFQUFFO0lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RGLE1BQU0sYUFBYSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFekYsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEVBQUU7UUFDL0IsTUFBTSxTQUFTLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztRQUMxQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMxRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixNQUFNLGtDQUFrQyxHQUFHLEdBQUcsRUFBRTtRQUM5QyxNQUFNLFNBQVMsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO1FBQzFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxFQUFFO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzNELFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQixTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9CLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM3QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtRQUM3QixFQUFFLENBQUMscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkMsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSx1QkFBZSxFQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDMUcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN6QyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzlELE1BQU0sU0FBUyxHQUFHLGtDQUFrQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsdUJBQWUsRUFBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzFHLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDekMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUMzRCxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDN0MsU0FBUyxDQUFDLFNBQVMsQ0FDakIsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFDckMsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQzVELENBQUM7WUFFRixNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMxRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUMzRCxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDN0MsU0FBUyxDQUFDLFNBQVMsQ0FDakIsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFDckMsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQzVELENBQUM7WUFDRixTQUFTLENBQUMsU0FBUyxDQUNqQixRQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUNyQyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FDNUQsQ0FBQztZQUVGLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWxFLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN6QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUMzRCxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDN0MsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDM0YsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDM0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUM3QyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMscUNBQXFDLENBQUMsQ0FBQztZQUUvRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLDBCQUEwQixHQUFHLGFBQWEsQ0FBQyxDQUFDO1lBRWhHLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUMxRCxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLHdEQUF3RCxDQUFDLENBQUM7WUFFOUcsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDOUQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2pHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQzNELFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzlGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksK0JBQXlCLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWxFLEVBQUUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDM0QsU0FBUyxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUMvRCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUN0RSxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7WUFDM0MsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDM0QsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEQsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtZQUN2QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUMzRCxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUseUJBQXlCLENBQUMsQ0FBQztZQUN0RixnQkFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdCQUF3QixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1lBQzNELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLDRDQUE0QyxDQUFDLENBQUM7WUFDbkcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsNENBQTRDLENBQUMsQ0FBQztZQUNuRyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLDRDQUE0QyxDQUFDLENBQUM7WUFDbkcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNqRixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1lBQ3hHLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDakYsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsaURBQWlELENBQUMsQ0FBQztZQUN4RyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLGdCQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUNILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDakMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtZQUN2QyxFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pFLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7Z0JBQ2xELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFFM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7Z0JBQzVHLGdCQUFNLENBQUMsS0FBSyxDQUNULEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDakUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNULEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDakUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNULEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDakUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUVGLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO2dCQUMxRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7Z0JBQ3BELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFFN0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7Z0JBQzdHLGdCQUFNLENBQUMsS0FBSyxDQUNULEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDbEUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNULEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDbEUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNULEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDbEUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUVGLGdCQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsdUVBQXVFLENBQUMsQ0FBQztZQUM3RyxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDN0QsTUFBTSxPQUFPLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7Z0JBQ2xELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFFM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7Z0JBQzVHLGdCQUFNLENBQUMsS0FBSyxDQUNULEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDakUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNULEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDakUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNULEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDakUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUVGLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO2dCQUMxRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7Z0JBQ3BELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFFN0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUM7Z0JBQzdHLGdCQUFNLENBQUMsS0FBSyxDQUNULEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDbEUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNULEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDbEUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUNGLGdCQUFNLENBQUMsS0FBSyxDQUNULEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQWMsQ0FBQyxLQUFLLEVBQUUsRUFDbEUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUNoRSxDQUFDO2dCQUVGLGdCQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsdUVBQXVFLENBQUMsQ0FBQztnQkFDM0csZ0JBQU0sQ0FBQyxTQUFTLENBQ2QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQ3RCLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUNyQixpRUFBaUUsQ0FDbEUsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLGlFQUFpRSxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUMvRSxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsRUFBRSxDQUFDO2dCQUN4QyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDekQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztnQkFDbEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUUzQixnQkFBTSxDQUFDLEtBQUssQ0FBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDNUcsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBRUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUM7Z0JBQzFELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztnQkFDcEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUU3QixnQkFBTSxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDN0csZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBRUYsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSx1RUFBdUUsQ0FBQyxDQUFDO2dCQUMzRyxnQkFBTSxDQUFDLFNBQVMsQ0FDZCxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFDdEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQ3JCLGlFQUFpRSxDQUNsRSxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDckQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztnQkFDbEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUUzQixnQkFBTSxDQUFDLEtBQUssQ0FBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDNUcsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBRUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUM7Z0JBQzFELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztnQkFDcEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUU3QixnQkFBTSxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDN0csZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBRUYsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSx1RUFBdUUsQ0FBQyxDQUFDO2dCQUMzRyxnQkFBTSxDQUFDLFNBQVMsQ0FDZCxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFDdEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQ3JCLGlFQUFpRSxDQUNsRSxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsOERBQThELEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQzVFLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDdEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztnQkFDbEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUUzQixnQkFBTSxDQUFDLEtBQUssQ0FBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDNUcsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBRUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUM7Z0JBQzFELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztnQkFDcEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUU3QixnQkFBTSxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDN0csZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBRUYsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSx1RUFBdUUsQ0FBQyxDQUFDO2dCQUMzRyxnQkFBTSxDQUFDLFNBQVMsQ0FDZCxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFDdEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQ3JCLGlFQUFpRSxDQUNsRSxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsaUVBQWlFLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQy9FLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDckQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztnQkFDbEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUUzQixnQkFBTSxDQUFDLEtBQUssQ0FBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDNUcsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNqRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBRUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUM7Z0JBQzFELFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztnQkFDcEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUU3QixnQkFBTSxDQUFDLEtBQUssQ0FBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFjLENBQUMsS0FBSyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztnQkFDN0csZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBYyxDQUFDLEtBQUssRUFBRSxFQUNsRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ2hFLENBQUM7Z0JBRUYsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSx1RUFBdUUsQ0FBQyxDQUFDO2dCQUMzRyxnQkFBTSxDQUFDLFNBQVMsQ0FDZCxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFDdEIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQ3JCLGlFQUFpRSxDQUNsRSxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEUsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1lBQ3BELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQixnQkFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDeEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUV6RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDN0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRkFBbUYsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNqRyxNQUFNLFNBQVMsR0FBRyxrQ0FBa0MsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7WUFDcEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLGdCQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUN4RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXpFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDN0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM3RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uLy4uL2ZpeHR1cmVzL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IHZlcmlmeVNpZ25hdHVyZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgQ0xTdHJpbmcgfSBmcm9tICdjYXNwZXItanMtc2RrJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5kZXNjcmliZSgnQ1NQUiBXYWxsZXQgaW5pdGlhbGl6YXRpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3Rjc3ByJykpO1xuICBjb25zdCBvd25lcjFBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCBvd25lcjJBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCBvd25lcjNBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCBvd25lcjRBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfNC5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuICBjb25zdCBzb3VyY2VBZGRyZXNzID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpO1xuXG4gIGNvbnN0IGluaXRTaWduZWRUeEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wcml2YXRlS2V5IH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgaW5pdFNpZ25lZFR4QnVpbGRlcldpdGhFeHRlbmRlZEtleSA9ICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgaW5pdFVuc2lnbmVkVHhCdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgdHhCdWlsZGVyLm93bmVyKG93bmVyM0FkZHJlc3MpO1xuICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCAnLCAoKSA9PiB7XG4gICAgaXQoJ2FuIGluaXQgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0U2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB2ZXJpZnlTaWduYXR1cmUodHguc2lnbmF0dXJlWzBdLCB0eEpzb24uaGFzaCwgdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnB1YmxpY0tleSkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCBzb3VyY2VBZGRyZXNzKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbiB1c2luZyBleHRlbmRlZCBrZXkgdG8gc2lnbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGluaXRTaWduZWRUeEJ1aWxkZXJXaXRoRXh0ZW5kZWRLZXkoKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZSwgdGVzdERhdGEuRkVFKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguc2lnbmF0dXJlLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHZlcmlmeVNpZ25hdHVyZSh0eC5zaWduYXR1cmVbMF0sIHR4SnNvbi5oYXNoLCB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHVibGljS2V5KSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sIHNvdXJjZUFkZHJlc3MpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdhbiBpbml0IHRyYW5zYWN0aW9uIHdpdGggZXh0ZXJuYWwgc2lnbmF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgICAgdHhCdWlsZGVyLnNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEuRVhURVJOQUxfU0lHTkFUVVJFLnNpZ25hdHVyZSxcbiAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5wdWJsaWNLZXkgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgc291cmNlQWRkcmVzcyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbiB3aXRoIGV4dGVybmFsIHNpZ25hdHVyZSBpbmNsdWRlZCB0d2ljZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIzQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICAgIHR4QnVpbGRlci5zaWduYXR1cmUoXG4gICAgICAgIHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5zaWduYXR1cmUsXG4gICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5FWFRFUk5BTF9TSUdOQVRVUkUucHVibGljS2V5IH0pXG4gICAgICApO1xuICAgICAgdHhCdWlsZGVyLnNpZ25hdHVyZShcbiAgICAgICAgdGVzdERhdGEuRVhURVJOQUxfU0lHTkFUVVJFLnNpZ25hdHVyZSxcbiAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkVYVEVSTkFMX1NJR05BVFVSRS5wdWJsaWNLZXkgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZnJvbSwgc291cmNlQWRkcmVzcyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgZmFpbCB0byBidWlsZCcsICgpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0Y3NwcicpKTtcblxuICAgIGl0KCdhIHRyYW5zYWN0aW9uIHdpdGhvdXQgZmVlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBzb3VyY2VBZGRyZXNzIH0pO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OX01JU1NJTkdfRkVFKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHdhbGxldCBpbml0aWFsaXphdGlvbiB0aGUgd3JvbmcgbnVtYmVyIG9mIG93bmVycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIxQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIob3duZXIyQWRkcmVzcyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKHsgYWRkcmVzczogc291cmNlQWRkcmVzcyB9KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgodGVzdERhdGEuSU5WQUxJRF9OVU1CRVJfT0ZfT1dORVJTX1RXT19PRl9USFJFRSk7XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLm93bmVyKG93bmVyMUFkZHJlc3MpLCAnUmVwZWF0ZWQgb3duZXIgYWRkcmVzczogJyArIG93bmVyMUFkZHJlc3MpO1xuXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5vd25lcihvd25lcjRBZGRyZXNzKSwgL0EgbWF4aW11bSBvZiAzIG93bmVycyBjYW4gYmUgc2V0IGZvciBhIG11bHRpc2lnIHdhbGxldC8pO1xuXG4gICAgICBjb25zdCBuZXdUeEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgbmV3VHhCdWlsZGVyLmZlZSh0ZXN0RGF0YS5GRUUpO1xuICAgICAgdHhCdWlsZGVyLnNvdXJjZSh7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSk7XG4gICAgICBhd2FpdCBuZXdUeEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKHRlc3REYXRhLklOVkFMSURfVFJBTlNBQ1RJT05fTUlTU0lOR19PV05FUlMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHNvdXJjZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RoYmFyJykpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5mZWUodGVzdERhdGEuRkVFKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjFBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjJBZGRyZXNzKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcihvd25lcjNBZGRyZXNzKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgodGVzdERhdGEuSU5WQUxJRF9UUkFOU0FDVElPTl9NSVNTSU5HX1NPVVJDRSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgdmFsaWRhdGUnLCAoKSA9PiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGNzcHInKSk7XG5cbiAgICBpdCgnYW4gYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIudmFsaWRhdGVBZGRyZXNzKHsgYWRkcmVzczogdGVzdERhdGEuVkFMSURfQUREUkVTUyB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoeyBhZGRyZXNzOiB0ZXN0RGF0YS5JTlZBTElEX0FERFJFU1MgfSksXG4gICAgICAgIG5ldyBSZWdFeHAoJ0ludmFsaWQgYWRkcmVzcyAnICsgdGVzdERhdGEuSU5WQUxJRF9BRERSRVNTKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd2YWx1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHplcm8nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuZmVlKHsgZ2FzTGltaXQ6ICctMTAnIH0pKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLmZlZSh7IGdhc0xpbWl0OiAnMTAnIH0pKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlS2V5KHsga2V5OiAnYWJjJyB9KSwgL1Vuc3VwcG9ydGVkIHByaXZhdGUga2V5Lyk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZUtleSh7IGtleTogdGVzdERhdGEuQUNDT1VOVF8xLnByaXZhdGVLZXkgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2EgdHJhbnNhY3Rpb24gdG8gYnVpbGQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB3YWxsZXQgb3duZXJzLyk7XG4gICAgICB0eEJ1aWxkZXIuZmVlKHRlc3REYXRhLkZFRSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKCksIC9JbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHdhbGxldCBvd25lcnMvKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiB0ZXN0RGF0YS5WQUxJRF9BRERSRVNTIH0pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVUcmFuc2FjdGlvbigpLCAvSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyB3YWxsZXQgb3duZXJzLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL3dyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAxLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSwgL3dyb25nIG51bWJlciBvZiBvd25lcnMgLS0gcmVxdWlyZWQ6IDMsIGZvdW5kOiAyLyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIobmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlVHJhbnNhY3Rpb24oKSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnc2hvdWxkIGJ1aWxkIGZyb20nLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ3NlcmlhbGl6ZWQgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgICAgaXQoJ2Egbm9uIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2Egc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGZyb20gc2VyaWFsaXplZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGluaXRVbnNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLlJPT1RfQUNDT1VOVC5wcml2YXRlS2V5IH0pO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBidWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDJKc29uLCB0eEpzb24sICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgcmVjcmVhdGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICB0eDIuY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIGdldCBhcHByb3ZhbHMgY29ycmVjdGx5J1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHNpZ25lZCB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIGV4dGVuZGVkIGtleSBmcm9tIHNlcmlhbGl6ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQueFByaXZhdGVLZXkgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gKGF3YWl0IGJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJ1aWxkZXIyID0gZmFjdG9yeS5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlcjIuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgICAgY29uc3QgdHgyID0gKGF3YWl0IGJ1aWxkZXIyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eDJKc29uID0gdHgyLnRvSnNvbigpO1xuXG4gICAgICAgIHNob3VsZC5lcXVhbCgodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzEnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8yLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Mkpzb24sIHR4SnNvbiwgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCByZWNyZWF0ZSBvcmlnaW5hbCB0cmFuc2FjdGlvbicpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHR4Mi5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgdHguY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgZ2V0IGFwcHJvdmFscyBjb3JyZWN0bHknXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FuIG9mZmxpbmUgbXVsdGlzaWcgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBpbml0VW5zaWduZWRUeEJ1aWxkZXIoKTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgYnVpbGRlci5zaWduKHsga2V5OiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYW4gb2ZmbGluZSBtdWx0aXNpZyB0cmFuc2ZlciB0cmFuc2FjdGlvbiB1c2luZyBleHRlbmRlZCBrZXlzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS54UHJpdmF0ZUtleSB9KTtcbiAgICAgICAgY29uc3QgdHggPSAoYXdhaXQgYnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzAnKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYnVpbGRlcjIgPSBmYWN0b3J5LmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpO1xuICAgICAgICBidWlsZGVyMi5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgICBjb25zdCB0eDIgPSAoYXdhaXQgYnVpbGRlcjIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHR4Mkpzb24gPSB0eDIudG9Kc29uKCk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKCh0eDIuY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ2RlcGxveV90eXBlJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMicpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzMucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgySnNvbiwgdHhKc29uLCAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIHJlY3JlYXRlIG9yaWdpbmFsIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHgyLmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICB0eC5jYXNwZXJUeC5hcHByb3ZhbHMsXG4gICAgICAgICAgJ2Zyb20gaW1wbGVtZW50YXRpb24gZnJvbSBmYWN0b3J5IHNob3VsZCBnZXQgYXBwcm92YWxzIGNvcnJlY3RseSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYW4gb2ZmbGluZSBtdWx0aXNpZyB0cmFuc2ZlciB0cmFuc2FjdGlvbiB1c2luZyBvbmUgZXh0ZW5kZWQga2V5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gaW5pdFVuc2lnbmVkVHhCdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIuc2lnbih7IGtleTogdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnhQcml2YXRlS2V5IH0pO1xuICAgICAgICBidWlsZGVyLnNpZ24oeyBrZXk6IHRlc3REYXRhLkFDQ09VTlRfMS5wcml2YXRlS2V5IH0pO1xuICAgICAgICBjb25zdCB0eCA9IChhd2FpdCBidWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdkZXBsb3lfdHlwZScpIGFzIENMU3RyaW5nKS52YWx1ZSgpLCAnV2FsbGV0SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICh0eC5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnb3duZXJfMCcpIGFzIENMU3RyaW5nKS52YWx1ZSgpLFxuICAgICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgICAgKHR4LmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHguY2FzcGVyVHguc2Vzc2lvbi5nZXRBcmdCeU5hbWUoJ293bmVyXzInKSBhcyBDTFN0cmluZykudmFsdWUoKSxcbiAgICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKClcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBidWlsZGVyMiA9IGZhY3RvcnkuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICAgIGJ1aWxkZXIyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICAgIGNvbnN0IHR4MiA9IChhd2FpdCBidWlsZGVyMi5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3QgdHgySnNvbiA9IHR4Mi50b0pzb24oKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwoKHR4Mi5jYXNwZXJUeC5zZXNzaW9uLmdldEFyZ0J5TmFtZSgnZGVwbG95X3R5cGUnKSBhcyBDTFN0cmluZykudmFsdWUoKSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8wJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMS5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8xJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG4gICAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgICAodHgyLmNhc3BlclR4LnNlc3Npb24uZ2V0QXJnQnlOYW1lKCdvd25lcl8yJykgYXMgQ0xTdHJpbmcpLnZhbHVlKCksXG4gICAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpXG4gICAgICAgICk7XG5cbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eDJKc29uLCB0eEpzb24sICdmcm9tIGltcGxlbWVudGF0aW9uIGZyb20gZmFjdG9yeSBzaG91bGQgcmVjcmVhdGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24nKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICB0eDIuY2FzcGVyVHguYXBwcm92YWxzLFxuICAgICAgICAgIHR4LmNhc3BlclR4LmFwcHJvdmFscyxcbiAgICAgICAgICAnZnJvbSBpbXBsZW1lbnRhdGlvbiBmcm9tIGZhY3Rvcnkgc2hvdWxkIGdldCBhcHByb3ZhbHMgY29ycmVjdGx5J1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0eEpzb24gdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnY29udGFpbnMgYWxsIHJlcXVpcmVkIGZpZWxkcyBmb3IgV2FsbGV0IEluaXRpYWxpemF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gaW5pdFNpZ25lZFR4QnVpbGRlcigpO1xuICAgICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4SnNvbi5mZWUsIHRlc3REYXRhLkZFRSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmRlcGxveVR5cGUsICdXYWxsZXRJbml0aWFsaXphdGlvbicpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5mcm9tLCAnMDInICsgdGVzdERhdGEuUk9PVF9BQ0NPVU5ULnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmhhc2gsIEJ1ZmZlci5mcm9tKHR4LmNhc3BlclR4Lmhhc2gpLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ub3duZXIxLCBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8xLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5vd25lcjIsIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzIucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm93bmVyMywgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMy5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb250YWlucyBhbGwgcmVxdWlyZWQgZmllbGRzIGZvciBXYWxsZXQgSW5pdGlhbGl6YXRpb24gdXNpbmcgZXh0ZW5kZWQga2V5IHRvIHNpZ24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBpbml0U2lnbmVkVHhCdWlsZGVyV2l0aEV4dGVuZGVkS2V5KCk7XG4gICAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uLmZlZSwgdGVzdERhdGEuRkVFKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uZGVwbG95VHlwZSwgJ1dhbGxldEluaXRpYWxpemF0aW9uJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLmZyb20sICcwMicgKyB0ZXN0RGF0YS5ST09UX0FDQ09VTlQucHVibGljS2V5KTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24uaGFzaCwgQnVmZmVyLmZyb20odHguY2FzcGVyVHguaGFzaCkudG9TdHJpbmcoJ2hleCcpKTtcblxuICAgICAgc2hvdWxkLmVxdWFsKHR4SnNvbi5vd25lcjEsIG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5BQ0NPVU5UXzEucHVibGljS2V5IH0pLmdldEFkZHJlc3MoKSk7XG4gICAgICBzaG91bGQuZXF1YWwodHhKc29uLm93bmVyMiwgbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLkFDQ09VTlRfMi5wdWJsaWNLZXkgfSkuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eEpzb24ub3duZXIzLCBuZXcgS2V5UGFpcih7IHB1YjogdGVzdERhdGEuQUNDT1VOVF8zLnB1YmxpY0tleSB9KS5nZXRBZGRyZXNzKCkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../../test/unit/lib/transactionBuilderFactory.ts"],"names":[],"mappings":""}
|