@bitgo-beta/sdk-core 8.2.1-beta.7 → 8.2.1-beta.70
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/CHANGELOG.md +98 -0
- package/dist/src/account-lib/baseCoin/enum.d.ts +3 -1
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +5 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +38 -12
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +555 -178
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +92 -155
- package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +0 -3
- package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
- package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
- package/dist/src/account-lib/util/crypto.d.ts +5 -25
- package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
- package/dist/src/account-lib/util/crypto.js +10 -55
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts +16 -0
- package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/baseCoin.js +15 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +13 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
- package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
- package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -3
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +7 -6
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +3 -3
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/environments.d.ts +6 -0
- package/dist/src/bitgo/environments.d.ts.map +1 -1
- package/dist/src/bitgo/environments.js +15 -3
- package/dist/src/bitgo/keychain/iKeychains.d.ts +1 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +30 -24
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +124 -89
- package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/ovcJsonCodec.js +31 -24
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
- package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/iPendingApproval.js +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +12 -1
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +11 -1
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +1 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts +7 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +9 -1
- package/dist/src/bitgo/tss/common.d.ts +16 -6
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +26 -11
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +11 -8
- package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/ecdsa.js +36 -33
- package/dist/src/bitgo/tss/ecdsa/types.d.ts +2 -2
- package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +4 -3
- package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/tss/eddsa/eddsa.js +16 -5
- package/dist/src/bitgo/tss/types.d.ts +4 -0
- package/dist/src/bitgo/tss/types.d.ts.map +1 -1
- package/dist/src/bitgo/tss/types.js +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +38 -12
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +28 -9
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +48 -8
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +11 -2
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +10 -8
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +65 -62
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +4 -3
- package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +18 -5
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +76 -22
- package/dist/src/bitgo/wallet/iWallet.d.ts +2 -1
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +22 -8
- package/dist/src/openssl/index.d.ts +4 -1
- package/dist/src/openssl/index.d.ts.map +1 -1
- package/dist/src/openssl/index.js +7 -12
- package/dist/tsconfig.tsbuildinfo +1 -8264
- package/package.json +6 -7
- package/dist/src/openssl/openssl.d.ts +0 -12
- package/dist/src/openssl/openssl.d.ts.map +0 -1
- package/dist/src/openssl/openssl.js +0 -48
- package/dist/src/openssl/opensslbytes.d.ts +0 -4
- package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
- package/dist/src/openssl/opensslbytes.js +0 -20
|
@@ -28,15 +28,11 @@ const secp = __importStar(require("@noble/secp256k1"));
|
|
|
28
28
|
const hdTree_1 = require("../../hdTree");
|
|
29
29
|
const crypto_1 = require("crypto");
|
|
30
30
|
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
31
|
-
const crypto_2 = require("../../../util/crypto");
|
|
32
31
|
const util_1 = require("../../util");
|
|
33
32
|
const curves_1 = require("../../curves");
|
|
34
33
|
const shamir_1 = __importDefault(require("../../shamir"));
|
|
35
34
|
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
36
35
|
const _5n = BigInt(5);
|
|
37
|
-
function hasNtilde(share) {
|
|
38
|
-
return 'ntilde' in share;
|
|
39
|
-
}
|
|
40
36
|
/**
|
|
41
37
|
* ECDSA TSS implementation supporting 2:n Threshold
|
|
42
38
|
*/
|
|
@@ -67,10 +63,10 @@ class Ecdsa {
|
|
|
67
63
|
// Generate additively homomorphic encryption key.
|
|
68
64
|
let paillierKeyPair;
|
|
69
65
|
if (!sync) {
|
|
70
|
-
paillierKeyPair = await paillierBigint.generateRandomKeys(
|
|
66
|
+
paillierKeyPair = await paillierBigint.generateRandomKeys(sdk_lib_mpc_1.minModulusBitLength, true);
|
|
71
67
|
}
|
|
72
68
|
else {
|
|
73
|
-
paillierKeyPair = paillierBigint.generateRandomKeysSync(
|
|
69
|
+
paillierKeyPair = paillierBigint.generateRandomKeysSync(sdk_lib_mpc_1.minModulusBitLength, true);
|
|
74
70
|
}
|
|
75
71
|
const { publicKey, privateKey } = paillierKeyPair;
|
|
76
72
|
// Accept a 64 byte seed and create an extended private key from that seed
|
|
@@ -122,14 +118,14 @@ class Ecdsa {
|
|
|
122
118
|
keyCombine(pShare, nShares) {
|
|
123
119
|
const allShares = [pShare, ...nShares];
|
|
124
120
|
// Compute the public key.
|
|
125
|
-
const y = allShares.map((participant) =>
|
|
121
|
+
const y = allShares.map((participant) => sdk_lib_mpc_1.hexToBigInt(participant['y'])).reduce(Ecdsa.curve.pointAdd);
|
|
126
122
|
// Add secret shares
|
|
127
|
-
const x = allShares.map((participant) =>
|
|
123
|
+
const x = allShares.map((participant) => sdk_lib_mpc_1.hexToBigInt(participant['u'])).reduce(Ecdsa.curve.scalarAdd);
|
|
128
124
|
// Verify shares.
|
|
129
125
|
for (const share of nShares) {
|
|
130
126
|
if (share.v) {
|
|
131
127
|
try {
|
|
132
|
-
Ecdsa.shamir.verify(
|
|
128
|
+
Ecdsa.shamir.verify(sdk_lib_mpc_1.hexToBigInt(share.u), [sdk_lib_mpc_1.hexToBigInt(share.y), sdk_lib_mpc_1.hexToBigInt(share.v)], pShare.i);
|
|
133
129
|
}
|
|
134
130
|
catch (err) {
|
|
135
131
|
throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
|
|
@@ -171,17 +167,17 @@ class Ecdsa {
|
|
|
171
167
|
* be distributed to participants at their corresponding index.
|
|
172
168
|
*/
|
|
173
169
|
keyDerive(pShare, nShares, path) {
|
|
174
|
-
const yValues = [pShare, ...nShares].map((share) =>
|
|
170
|
+
const yValues = [pShare, ...nShares].map((share) => sdk_lib_mpc_1.hexToBigInt(share.y));
|
|
175
171
|
const y = yValues.reduce((partial, share) => Ecdsa.curve.pointAdd(partial, share));
|
|
176
172
|
const u = BigInt(pShare.uu);
|
|
177
|
-
let contribChaincode =
|
|
178
|
-
const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) =>
|
|
173
|
+
let contribChaincode = sdk_lib_mpc_1.hexToBigInt(pShare.chaincode);
|
|
174
|
+
const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) => sdk_lib_mpc_1.hexToBigInt(chaincode))];
|
|
179
175
|
const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) % hdTree_1.chaincodeBase);
|
|
180
176
|
// Verify shares.
|
|
181
177
|
for (const share of nShares) {
|
|
182
178
|
if (share.v) {
|
|
183
179
|
try {
|
|
184
|
-
Ecdsa.shamir.verify(
|
|
180
|
+
Ecdsa.shamir.verify(sdk_lib_mpc_1.hexToBigInt(share.u), [sdk_lib_mpc_1.hexToBigInt(share.y), sdk_lib_mpc_1.hexToBigInt(share.v)], pShare.i);
|
|
185
181
|
}
|
|
186
182
|
catch (err) {
|
|
187
183
|
throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
|
|
@@ -198,7 +194,7 @@ class Ecdsa {
|
|
|
198
194
|
// Calculate new u values.
|
|
199
195
|
const { shares: split_u, v } = Ecdsa.shamir.split(subkey.sk, pShare.t || 2, pShare.c || 3);
|
|
200
196
|
// Calculate new signing key.
|
|
201
|
-
const x = [split_u[pShare.i], ...nShares.map(({ u }) =>
|
|
197
|
+
const x = [split_u[pShare.i], ...nShares.map(({ u }) => sdk_lib_mpc_1.hexToBigInt(u))].reduce(Ecdsa.curve.scalarAdd);
|
|
202
198
|
const P_i = {
|
|
203
199
|
i: pShare.i,
|
|
204
200
|
l: pShare.l,
|
|
@@ -217,7 +213,7 @@ class Ecdsa {
|
|
|
217
213
|
shares.nShares[P_j.j] = {
|
|
218
214
|
i: P_j.j,
|
|
219
215
|
j: P_i.i,
|
|
220
|
-
n:
|
|
216
|
+
n: P_i.n,
|
|
221
217
|
u: util_1.bigIntToBufferBE(split_u[P_j.j], 32).toString('hex'),
|
|
222
218
|
y: util_1.bigIntToBufferBE(contribY, 32).toString('hex'),
|
|
223
219
|
v: util_1.bigIntToBufferBE(v[0], 32).toString('hex'),
|
|
@@ -249,30 +245,19 @@ class Ecdsa {
|
|
|
249
245
|
/**
|
|
250
246
|
* Appends a given range proof challenge to the shares previously created
|
|
251
247
|
* by #keyCombine. Generates a new challenge if not provided.
|
|
252
|
-
* @param {XShare}
|
|
253
|
-
* @param
|
|
254
|
-
*
|
|
255
|
-
* @
|
|
256
|
-
* @returns {KeyCombined} The new XShare and YShares with the amended
|
|
257
|
-
* challenge values
|
|
248
|
+
* @param {XShare | YShare} share Private xShare or yShare of the signing operation
|
|
249
|
+
* @param rangeProofChallenge - challenge generated via generateNtilde
|
|
250
|
+
* @param paillierProofChallenge
|
|
251
|
+
* @returns {KeyCombined} The share with amended challenge values
|
|
258
252
|
*/
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
challenge = Ecdsa.serializeNtilde(await sdk_lib_mpc_1.EcdsaRangeProof.generateNtilde(3072));
|
|
262
|
-
}
|
|
263
|
-
const { ntilde, h1, h2 } = challenge;
|
|
253
|
+
appendChallenge(share, rangeProofChallenge, paillierProofChallenge) {
|
|
254
|
+
const { ntilde, h1, h2 } = rangeProofChallenge;
|
|
264
255
|
return {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
n: xShare.n,
|
|
271
|
-
ntilde,
|
|
272
|
-
h1,
|
|
273
|
-
h2,
|
|
274
|
-
},
|
|
275
|
-
},
|
|
256
|
+
...share,
|
|
257
|
+
ntilde,
|
|
258
|
+
h1,
|
|
259
|
+
h2,
|
|
260
|
+
p: paillierProofChallenge.p,
|
|
276
261
|
};
|
|
277
262
|
}
|
|
278
263
|
/**
|
|
@@ -283,45 +268,42 @@ class Ecdsa {
|
|
|
283
268
|
* and k-share to be distributed to other participant signer
|
|
284
269
|
*/
|
|
285
270
|
async signShare(xShare, yShare) {
|
|
286
|
-
const pk = util_1.getPaillierPublicKey(
|
|
287
|
-
// Generate a challenge if ntilde is not present in the xShare.
|
|
288
|
-
if (!hasNtilde(xShare)) {
|
|
289
|
-
xShare = (await this.appendChallenge(xShare, yShare)).xShare;
|
|
290
|
-
}
|
|
271
|
+
const pk = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(xShare.n));
|
|
291
272
|
const k = Ecdsa.curve.scalarRandom();
|
|
292
|
-
const rk = await sdk_lib_mpc_1.
|
|
273
|
+
const rk = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pk.n);
|
|
293
274
|
const ck = pk.encrypt(k, rk);
|
|
294
275
|
const gamma = Ecdsa.curve.scalarRandom();
|
|
295
276
|
const d = Ecdsa.curve.scalarMult(Ecdsa.curve.scalarSub(BigInt(yShare.j), BigInt(xShare.i)), BigInt(xShare.i));
|
|
296
277
|
const w = [
|
|
297
278
|
Ecdsa.curve.scalarMult(BigInt(yShare.j), BigInt(xShare.i)),
|
|
298
|
-
|
|
279
|
+
sdk_lib_mpc_1.hexToBigInt(xShare['x']),
|
|
299
280
|
Ecdsa.curve.scalarInvert(d),
|
|
300
281
|
].reduce(Ecdsa.curve.scalarMult);
|
|
301
282
|
const { ntilde: ntildea, h1: h1a, h2: h2a } = xShare;
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
},
|
|
317
|
-
kShare: {},
|
|
283
|
+
const wShare = {
|
|
284
|
+
i: xShare.i,
|
|
285
|
+
l: xShare.l,
|
|
286
|
+
m: xShare.m,
|
|
287
|
+
n: xShare.n,
|
|
288
|
+
y: xShare.y,
|
|
289
|
+
ntilde: ntildea,
|
|
290
|
+
h1: h1a,
|
|
291
|
+
h2: h2a,
|
|
292
|
+
p: xShare.p,
|
|
293
|
+
k: util_1.bigIntToBufferBE(k, 32).toString('hex'),
|
|
294
|
+
ck: util_1.bigIntToBufferBE(ck, 768).toString('hex'),
|
|
295
|
+
w: util_1.bigIntToBufferBE(w, 32).toString('hex'),
|
|
296
|
+
gamma: util_1.bigIntToBufferBE(gamma, 32).toString('hex'),
|
|
318
297
|
};
|
|
319
298
|
const { ntilde: ntildeb, h1: h1b, h2: h2b } = yShare;
|
|
320
|
-
const proof = await sdk_lib_mpc_1.EcdsaRangeProof.prove(Ecdsa.curve,
|
|
321
|
-
ntilde:
|
|
322
|
-
h1:
|
|
323
|
-
h2:
|
|
299
|
+
const proof = await sdk_lib_mpc_1.EcdsaRangeProof.prove(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pk, {
|
|
300
|
+
ntilde: sdk_lib_mpc_1.hexToBigInt(ntildeb),
|
|
301
|
+
h1: sdk_lib_mpc_1.hexToBigInt(h1b),
|
|
302
|
+
h2: sdk_lib_mpc_1.hexToBigInt(h2b),
|
|
324
303
|
}, ck, k, rk);
|
|
304
|
+
// create paillier challenge proof based on the other signers challenge
|
|
305
|
+
// only send sigma if we also send challenge p
|
|
306
|
+
const sigma = sdk_lib_mpc_1.EcdsaPaillierProof.prove(sdk_lib_mpc_1.hexToBigInt(xShare.n), sdk_lib_mpc_1.hexToBigInt(xShare.l), sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: yShare.p }).p);
|
|
325
307
|
const proofShare = {
|
|
326
308
|
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
327
309
|
u: util_1.bigIntToBufferBE(proof.u, 768).toString('hex'),
|
|
@@ -330,22 +312,443 @@ class Ecdsa {
|
|
|
330
312
|
s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
|
|
331
313
|
s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
|
|
332
314
|
};
|
|
333
|
-
|
|
315
|
+
const kShare = {
|
|
316
|
+
// this share will be sent to the other participant,
|
|
317
|
+
// so we need to swap the i and j values here
|
|
318
|
+
// so that they know it's their kShare, produced by us
|
|
334
319
|
i: yShare.j,
|
|
335
320
|
j: xShare.i,
|
|
336
321
|
n: pk.n.toString(16),
|
|
337
322
|
ntilde: ntildea,
|
|
338
323
|
h1: h1a,
|
|
339
324
|
h2: h2a,
|
|
325
|
+
p: xShare.p,
|
|
340
326
|
k: util_1.bigIntToBufferBE(ck, 768).toString('hex'),
|
|
327
|
+
sigma: sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallengeProofs({ sigma: sigma }).sigma,
|
|
341
328
|
proof: proofShare,
|
|
342
329
|
};
|
|
343
|
-
return
|
|
330
|
+
return {
|
|
331
|
+
wShare,
|
|
332
|
+
kShare,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Perform multiplicitive-to-additive (MtA) share conversion with another signer.
|
|
337
|
+
* Connection 1.2 in https://lucid.app/lucidchart/7061785b-bc5c-4002-b546-3f4a3612fc62/edit?page=IAVmvYO4FvKc#
|
|
338
|
+
* If signer A completed signShare initially (input to this fn), then this step is completed by signer B.
|
|
339
|
+
* @param {SignConvert} shares
|
|
340
|
+
* @returns {SignConvertRT}
|
|
341
|
+
*/
|
|
342
|
+
async signConvertStep1(shares) {
|
|
343
|
+
const receivedKShare = shares.kShare;
|
|
344
|
+
const xShare = shares.xShare; // currentParticipant secret xShare
|
|
345
|
+
const yShare = {
|
|
346
|
+
...shares.yShare,
|
|
347
|
+
ntilde: receivedKShare.ntilde,
|
|
348
|
+
h1: receivedKShare.h1,
|
|
349
|
+
h2: receivedKShare.h2,
|
|
350
|
+
p: receivedKShare.p,
|
|
351
|
+
};
|
|
352
|
+
const signShare = await this.signShare(xShare, yShare);
|
|
353
|
+
const shareParticipant = signShare.wShare;
|
|
354
|
+
if (shareParticipant.i !== receivedKShare.i) {
|
|
355
|
+
throw new Error('Shares from same participant');
|
|
356
|
+
}
|
|
357
|
+
if (!receivedKShare.proof) {
|
|
358
|
+
throw new Error('Unexpected missing proof on aShareToBeSent');
|
|
359
|
+
}
|
|
360
|
+
// the other participants paillier public key
|
|
361
|
+
const n = sdk_lib_mpc_1.hexToBigInt(receivedKShare.n);
|
|
362
|
+
const pka = util_1.getPaillierPublicKey(n);
|
|
363
|
+
// the other participant's range proof challenge
|
|
364
|
+
const ntildea = sdk_lib_mpc_1.hexToBigInt(receivedKShare.ntilde);
|
|
365
|
+
const h1a = sdk_lib_mpc_1.hexToBigInt(receivedKShare.h1);
|
|
366
|
+
const h2a = sdk_lib_mpc_1.hexToBigInt(receivedKShare.h2);
|
|
367
|
+
// the current participant's range proof challenge
|
|
368
|
+
const ntildeb = sdk_lib_mpc_1.hexToBigInt(shareParticipant.ntilde);
|
|
369
|
+
const h1b = sdk_lib_mpc_1.hexToBigInt(shareParticipant.h1);
|
|
370
|
+
const h2b = sdk_lib_mpc_1.hexToBigInt(shareParticipant.h2);
|
|
371
|
+
const k = sdk_lib_mpc_1.hexToBigInt(receivedKShare.k);
|
|
372
|
+
// the current participants paillier proof challenge
|
|
373
|
+
const shareParticipantPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: shareParticipant.p });
|
|
374
|
+
// the other signing parties proof to the current participants paillier proof challenge
|
|
375
|
+
const receivedPaillierChallengeProof = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallengeProofs({
|
|
376
|
+
sigma: receivedKShare.sigma,
|
|
377
|
+
});
|
|
378
|
+
if (!(await sdk_lib_mpc_1.EcdsaPaillierProof.verify(n, shareParticipantPaillierChallenge.p, receivedPaillierChallengeProof.sigma))) {
|
|
379
|
+
throw new Error('Could not verify signing A share paillier proof');
|
|
380
|
+
}
|
|
381
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
382
|
+
ntilde: ntildeb,
|
|
383
|
+
h1: h1b,
|
|
384
|
+
h2: h2b,
|
|
385
|
+
}, {
|
|
386
|
+
z: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.z),
|
|
387
|
+
u: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.u),
|
|
388
|
+
w: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.w),
|
|
389
|
+
s: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s),
|
|
390
|
+
s1: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s1),
|
|
391
|
+
s2: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s2),
|
|
392
|
+
}, k)) {
|
|
393
|
+
throw new Error('Could not verify signing A share proof');
|
|
394
|
+
}
|
|
395
|
+
// MtA $k_j, \gamma_i$.
|
|
396
|
+
const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
397
|
+
const beta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
|
|
398
|
+
const g = sdk_lib_mpc_1.hexToBigInt(shareParticipant.gamma);
|
|
399
|
+
const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
|
|
400
|
+
const cb = pka.encrypt(beta0, rb);
|
|
401
|
+
const alpha = pka.addition(pka.multiply(k, g), cb);
|
|
402
|
+
const alphaToBeSent = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
|
|
403
|
+
// Prove $\gamma_i \in Z_{N^2}$.
|
|
404
|
+
const gx = Ecdsa.curve.basePointMult(g);
|
|
405
|
+
let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
406
|
+
ntilde: ntildea,
|
|
407
|
+
h1: h1a,
|
|
408
|
+
h2: h2a,
|
|
409
|
+
}, k, alpha, g, beta0, rb, gx);
|
|
410
|
+
const gammaProofToBeSent = {
|
|
411
|
+
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
412
|
+
zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
|
|
413
|
+
t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
|
|
414
|
+
v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
|
|
415
|
+
w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
|
|
416
|
+
s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
|
|
417
|
+
s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
|
|
418
|
+
s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
|
|
419
|
+
t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
|
|
420
|
+
t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
|
|
421
|
+
u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
|
|
422
|
+
x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
|
|
423
|
+
};
|
|
424
|
+
// MtA $k_j, w_i$.
|
|
425
|
+
const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
426
|
+
const nu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
|
|
427
|
+
const w = sdk_lib_mpc_1.hexToBigInt(shareParticipant.w);
|
|
428
|
+
const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
|
|
429
|
+
const cn = pka.encrypt(nu0, rn);
|
|
430
|
+
const mu = pka.addition(pka.multiply(k, w), cn);
|
|
431
|
+
const muToBeSent = util_1.bigIntToBufferBE(mu, 32).toString('hex');
|
|
432
|
+
// Prove $\w_i \in Z_{N^2}$.
|
|
433
|
+
const wx = Ecdsa.curve.basePointMult(w);
|
|
434
|
+
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
435
|
+
ntilde: ntildea,
|
|
436
|
+
h1: h1a,
|
|
437
|
+
h2: h2a,
|
|
438
|
+
}, k, sdk_lib_mpc_1.hexToBigInt(muToBeSent), w, nu0, rn, wx);
|
|
439
|
+
const wProofToBeSent = {
|
|
440
|
+
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
441
|
+
zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
|
|
442
|
+
t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
|
|
443
|
+
v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
|
|
444
|
+
w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
|
|
445
|
+
s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
|
|
446
|
+
s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
|
|
447
|
+
s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
|
|
448
|
+
t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
|
|
449
|
+
t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
|
|
450
|
+
u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
|
|
451
|
+
x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
|
|
452
|
+
};
|
|
453
|
+
const nToBeSent = signShare.kShare.n;
|
|
454
|
+
const ntildeToBeSent = util_1.bigIntToBufferBE(ntildeb, 384).toString('hex');
|
|
455
|
+
const h1ToBeSent = util_1.bigIntToBufferBE(h1b, 384).toString('hex');
|
|
456
|
+
const h2ToBeSent = util_1.bigIntToBufferBE(h2b, 384).toString('hex');
|
|
457
|
+
const kToBeSent = signShare.kShare.k;
|
|
458
|
+
const proofToBeSent = signShare.kShare.proof;
|
|
459
|
+
const [iToBeSent, jToBeSent] = [receivedKShare.j, receivedKShare.i];
|
|
460
|
+
return {
|
|
461
|
+
aShare: {
|
|
462
|
+
i: iToBeSent,
|
|
463
|
+
j: jToBeSent,
|
|
464
|
+
ntilde: ntildeToBeSent,
|
|
465
|
+
h1: h1ToBeSent,
|
|
466
|
+
h2: h2ToBeSent,
|
|
467
|
+
n: nToBeSent,
|
|
468
|
+
k: kToBeSent,
|
|
469
|
+
alpha: alphaToBeSent,
|
|
470
|
+
mu: muToBeSent,
|
|
471
|
+
proof: proofToBeSent,
|
|
472
|
+
gammaProof: gammaProofToBeSent,
|
|
473
|
+
wProof: wProofToBeSent,
|
|
474
|
+
// provide the share participants proof
|
|
475
|
+
// to the paillier challenge in the receivedKShare from the other signer
|
|
476
|
+
sigma: signShare.kShare.sigma,
|
|
477
|
+
},
|
|
478
|
+
bShare: {
|
|
479
|
+
...shareParticipant,
|
|
480
|
+
beta,
|
|
481
|
+
nu,
|
|
482
|
+
},
|
|
483
|
+
};
|
|
344
484
|
}
|
|
345
485
|
/**
|
|
346
486
|
* Perform multiplicitive-to-additive (MtA) share conversion with another
|
|
347
487
|
* signer.
|
|
348
|
-
*
|
|
488
|
+
* Connection 2.1 in https://lucid.app/lucidchart/7061785b-bc5c-4002-b546-3f4a3612fc62/edit?page=IAVmvYO4FvKc#
|
|
489
|
+
* If signer B completed signConvertStep1, then this step is completed by signer A.
|
|
490
|
+
* @param {SignConvert} shares
|
|
491
|
+
* @returns {SignConvertRT}
|
|
492
|
+
*/
|
|
493
|
+
async signConvertStep2(shares) {
|
|
494
|
+
const receivedAShare = shares.aShare;
|
|
495
|
+
if (!receivedAShare.gammaProof) {
|
|
496
|
+
throw new Error('Unexpected missing gammaProof on aShareToBeSent');
|
|
497
|
+
}
|
|
498
|
+
if (!receivedAShare.wProof) {
|
|
499
|
+
throw new Error('Unexpected missing wProof on aShareToBeSent');
|
|
500
|
+
}
|
|
501
|
+
const n = sdk_lib_mpc_1.hexToBigInt(receivedAShare.n); // Paillier pub from other signer
|
|
502
|
+
// current participant public key
|
|
503
|
+
const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(shares.wShare.n));
|
|
504
|
+
const ntildea = sdk_lib_mpc_1.hexToBigInt(shares.wShare.ntilde);
|
|
505
|
+
const h1a = sdk_lib_mpc_1.hexToBigInt(shares.wShare.h1);
|
|
506
|
+
const h2a = sdk_lib_mpc_1.hexToBigInt(shares.wShare.h2);
|
|
507
|
+
const ck = sdk_lib_mpc_1.hexToBigInt(shares.wShare.ck);
|
|
508
|
+
const shareParticipantPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: shares.wShare.p });
|
|
509
|
+
const receivedPaillierChallengeProof = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallengeProofs({
|
|
510
|
+
sigma: shares.aShare.sigma,
|
|
511
|
+
});
|
|
512
|
+
if (!sdk_lib_mpc_1.EcdsaPaillierProof.verify(n, shareParticipantPaillierChallenge.p, receivedPaillierChallengeProof.sigma)) {
|
|
513
|
+
throw new Error('could not verify signing share for paillier proof');
|
|
514
|
+
}
|
|
515
|
+
// Verify $\gamma_i \in Z_{N^2}$.
|
|
516
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
517
|
+
ntilde: ntildea,
|
|
518
|
+
h1: h1a,
|
|
519
|
+
h2: h2a,
|
|
520
|
+
}, {
|
|
521
|
+
z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.z),
|
|
522
|
+
zprm: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.zprm),
|
|
523
|
+
t: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t),
|
|
524
|
+
v: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.v),
|
|
525
|
+
w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.w),
|
|
526
|
+
s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s),
|
|
527
|
+
s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s1),
|
|
528
|
+
s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s2),
|
|
529
|
+
t1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t1),
|
|
530
|
+
t2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t2),
|
|
531
|
+
u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.u),
|
|
532
|
+
}, ck, sdk_lib_mpc_1.hexToBigInt(receivedAShare.alpha), sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.x))) {
|
|
533
|
+
throw new Error('could not verify signing share for gamma proof');
|
|
534
|
+
}
|
|
535
|
+
// Verify $\w_i \in Z_{N^2}$.
|
|
536
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
537
|
+
ntilde: ntildea,
|
|
538
|
+
h1: h1a,
|
|
539
|
+
h2: h2a,
|
|
540
|
+
}, {
|
|
541
|
+
z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.z),
|
|
542
|
+
zprm: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.zprm),
|
|
543
|
+
t: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t),
|
|
544
|
+
v: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.v),
|
|
545
|
+
w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.w),
|
|
546
|
+
s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s),
|
|
547
|
+
s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s1),
|
|
548
|
+
s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s2),
|
|
549
|
+
t1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t1),
|
|
550
|
+
t2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t2),
|
|
551
|
+
u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.u),
|
|
552
|
+
}, ck, sdk_lib_mpc_1.hexToBigInt(receivedAShare.mu), sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.x))) {
|
|
553
|
+
throw new Error('could not verify share for wProof');
|
|
554
|
+
}
|
|
555
|
+
const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(shares.wShare.l), sdk_lib_mpc_1.hexToBigInt(shares.wShare.m), pka);
|
|
556
|
+
const gShareAlpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedAShare.alpha))), 32).toString('hex');
|
|
557
|
+
const gShareMu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedAShare.mu))), // recheck encrypted number
|
|
558
|
+
32).toString('hex');
|
|
559
|
+
if (!receivedAShare.proof) {
|
|
560
|
+
throw new Error('Unexpected missing proof on aShareToBeSent');
|
|
561
|
+
}
|
|
562
|
+
const pkb = util_1.getPaillierPublicKey(n);
|
|
563
|
+
const ntildeb = sdk_lib_mpc_1.hexToBigInt(receivedAShare.ntilde);
|
|
564
|
+
const h1b = sdk_lib_mpc_1.hexToBigInt(receivedAShare.h1);
|
|
565
|
+
const h2b = sdk_lib_mpc_1.hexToBigInt(receivedAShare.h2);
|
|
566
|
+
const k = sdk_lib_mpc_1.hexToBigInt(receivedAShare.k);
|
|
567
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
|
|
568
|
+
ntilde: ntildea,
|
|
569
|
+
h1: h1a,
|
|
570
|
+
h2: h2a,
|
|
571
|
+
}, {
|
|
572
|
+
z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.z),
|
|
573
|
+
u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.u),
|
|
574
|
+
w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.w),
|
|
575
|
+
s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s),
|
|
576
|
+
s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s1),
|
|
577
|
+
s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s2),
|
|
578
|
+
}, k)) {
|
|
579
|
+
throw new Error('Could not verify signing A share proof');
|
|
580
|
+
}
|
|
581
|
+
// MtA $k_j, \gamma_i$.
|
|
582
|
+
const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
583
|
+
const gShareBeta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
|
|
584
|
+
const g = sdk_lib_mpc_1.hexToBigInt(shares.wShare.gamma);
|
|
585
|
+
const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pkb.n);
|
|
586
|
+
const cb = pkb.encrypt(beta0, rb);
|
|
587
|
+
const alpha = pkb.addition(pkb.multiply(k, g), cb);
|
|
588
|
+
const alphaToBeSent = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
|
|
589
|
+
// Prove $\gamma_i \in Z_{N^2}$.
|
|
590
|
+
const gx = Ecdsa.curve.basePointMult(g);
|
|
591
|
+
let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
|
|
592
|
+
ntilde: ntildeb,
|
|
593
|
+
h1: h1b,
|
|
594
|
+
h2: h2b,
|
|
595
|
+
}, k, alpha, g, beta0, rb, gx);
|
|
596
|
+
const gammaProofToBeSent = {
|
|
597
|
+
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
598
|
+
zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
|
|
599
|
+
t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
|
|
600
|
+
v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
|
|
601
|
+
w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
|
|
602
|
+
s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
|
|
603
|
+
s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
|
|
604
|
+
s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
|
|
605
|
+
t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
|
|
606
|
+
t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
|
|
607
|
+
u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
|
|
608
|
+
x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
|
|
609
|
+
};
|
|
610
|
+
// MtA $k_j, w_i$.
|
|
611
|
+
const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
612
|
+
const gShareNu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
|
|
613
|
+
const w = sdk_lib_mpc_1.hexToBigInt(shares.wShare.w);
|
|
614
|
+
const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pkb.n);
|
|
615
|
+
const cn = pkb.encrypt(nu0, rn);
|
|
616
|
+
const mu = pkb.addition(pkb.multiply(k, w), cn);
|
|
617
|
+
const muToBeSent = util_1.bigIntToBufferBE(mu, 32).toString('hex');
|
|
618
|
+
// Prove $\w_i \in Z_{N^2}$.
|
|
619
|
+
const wx = Ecdsa.curve.basePointMult(w);
|
|
620
|
+
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
|
|
621
|
+
ntilde: ntildeb,
|
|
622
|
+
h1: h1b,
|
|
623
|
+
h2: h2b,
|
|
624
|
+
}, k, sdk_lib_mpc_1.hexToBigInt(muToBeSent), w, nu0, rn, wx);
|
|
625
|
+
const wProofToBeSent = {
|
|
626
|
+
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
627
|
+
zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
|
|
628
|
+
t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
|
|
629
|
+
v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
|
|
630
|
+
w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
|
|
631
|
+
s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
|
|
632
|
+
s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
|
|
633
|
+
s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
|
|
634
|
+
t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
|
|
635
|
+
t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
|
|
636
|
+
u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
|
|
637
|
+
x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
|
|
638
|
+
};
|
|
639
|
+
const [iToBeSent, jToBeSent] = [receivedAShare.j, receivedAShare.i];
|
|
640
|
+
return {
|
|
641
|
+
muShare: {
|
|
642
|
+
i: iToBeSent,
|
|
643
|
+
j: jToBeSent,
|
|
644
|
+
alpha: alphaToBeSent,
|
|
645
|
+
mu: muToBeSent,
|
|
646
|
+
gammaProof: gammaProofToBeSent,
|
|
647
|
+
wProof: wProofToBeSent,
|
|
648
|
+
},
|
|
649
|
+
gShare: {
|
|
650
|
+
i: shares.wShare.i,
|
|
651
|
+
n: shares.wShare.n,
|
|
652
|
+
y: shares.wShare.y,
|
|
653
|
+
k: shares.wShare.k,
|
|
654
|
+
w: shares.wShare.w,
|
|
655
|
+
gamma: shares.wShare.gamma,
|
|
656
|
+
alpha: gShareAlpha,
|
|
657
|
+
mu: gShareMu,
|
|
658
|
+
beta: gShareBeta,
|
|
659
|
+
nu: gShareNu,
|
|
660
|
+
},
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Perform multiplicitive-to-additive (MtA) share conversion with another signer.
|
|
665
|
+
* Connection 2.2 in https://lucid.app/lucidchart/7061785b-bc5c-4002-b546-3f4a3612fc62/edit?page=IAVmvYO4FvKc#
|
|
666
|
+
* If signer A completed signConvertStep2, then this step is completed by signer B.
|
|
667
|
+
* @param {SignConvert} shares
|
|
668
|
+
* @returns {SignConvertRT}
|
|
669
|
+
*/
|
|
670
|
+
async signConvertStep3(shares) {
|
|
671
|
+
const receivedMuShare = shares.muShare;
|
|
672
|
+
if (!receivedMuShare.gammaProof) {
|
|
673
|
+
throw new Error('Unexpected missing gammaProof on aShareToBeSent');
|
|
674
|
+
}
|
|
675
|
+
if (!receivedMuShare.wProof) {
|
|
676
|
+
throw new Error('Unexpected missing wProof on aShareToBeSent');
|
|
677
|
+
}
|
|
678
|
+
const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(shares.bShare.n));
|
|
679
|
+
const ntildea = sdk_lib_mpc_1.hexToBigInt(shares.bShare.ntilde);
|
|
680
|
+
const h1a = sdk_lib_mpc_1.hexToBigInt(shares.bShare.h1);
|
|
681
|
+
const h2a = sdk_lib_mpc_1.hexToBigInt(shares.bShare.h2);
|
|
682
|
+
const ck = sdk_lib_mpc_1.hexToBigInt(shares.bShare.ck);
|
|
683
|
+
// Verify $\gamma_i \in Z_{N^2}$.
|
|
684
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
685
|
+
ntilde: ntildea,
|
|
686
|
+
h1: h1a,
|
|
687
|
+
h2: h2a,
|
|
688
|
+
}, {
|
|
689
|
+
z: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.z),
|
|
690
|
+
zprm: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.zprm),
|
|
691
|
+
t: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t),
|
|
692
|
+
v: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.v),
|
|
693
|
+
w: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.w),
|
|
694
|
+
s: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s),
|
|
695
|
+
s1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s1),
|
|
696
|
+
s2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s2),
|
|
697
|
+
t1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t1),
|
|
698
|
+
t2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t2),
|
|
699
|
+
u: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.u),
|
|
700
|
+
}, ck, sdk_lib_mpc_1.hexToBigInt(receivedMuShare.alpha), sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.x))) {
|
|
701
|
+
throw new Error('could not verify signing share for gamma proof');
|
|
702
|
+
}
|
|
703
|
+
// Verify $\w_i \in Z_{N^2}$.
|
|
704
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
705
|
+
ntilde: ntildea,
|
|
706
|
+
h1: h1a,
|
|
707
|
+
h2: h2a,
|
|
708
|
+
}, {
|
|
709
|
+
z: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.z),
|
|
710
|
+
zprm: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.zprm),
|
|
711
|
+
t: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t),
|
|
712
|
+
v: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.v),
|
|
713
|
+
w: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.w),
|
|
714
|
+
s: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s),
|
|
715
|
+
s1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s1),
|
|
716
|
+
s2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s2),
|
|
717
|
+
t1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t1),
|
|
718
|
+
t2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t2),
|
|
719
|
+
u: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.u),
|
|
720
|
+
}, ck, sdk_lib_mpc_1.hexToBigInt(receivedMuShare.mu), sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.x))) {
|
|
721
|
+
throw new Error('could not verify share for wProof');
|
|
722
|
+
}
|
|
723
|
+
const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(shares.bShare.l), sdk_lib_mpc_1.hexToBigInt(shares.bShare.m), pka);
|
|
724
|
+
const alpha = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedMuShare.alpha));
|
|
725
|
+
const gShareAlpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
|
|
726
|
+
const mu = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedMuShare.mu)); // recheck encrypted number
|
|
727
|
+
const gShareMu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
|
|
728
|
+
const [iToBeSent, jToBeSent] = [receivedMuShare.j, receivedMuShare.i];
|
|
729
|
+
return {
|
|
730
|
+
gShare: {
|
|
731
|
+
i: shares.bShare.i,
|
|
732
|
+
n: shares.bShare.n,
|
|
733
|
+
y: shares.bShare.y,
|
|
734
|
+
k: shares.bShare.k,
|
|
735
|
+
w: shares.bShare.w,
|
|
736
|
+
gamma: shares.bShare.gamma,
|
|
737
|
+
alpha: gShareAlpha,
|
|
738
|
+
mu: gShareMu,
|
|
739
|
+
beta: shares.bShare.beta,
|
|
740
|
+
nu: shares.bShare.nu,
|
|
741
|
+
},
|
|
742
|
+
signIndex: {
|
|
743
|
+
i: iToBeSent,
|
|
744
|
+
j: jToBeSent,
|
|
745
|
+
},
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* Perform multiplicitive-to-additive (MtA) share conversion with another signer.
|
|
750
|
+
* @deprecated - use one of [signConvertStep1, signConvertStep2, signConvertStep3] instead
|
|
751
|
+
* @param {SignConvert} shares
|
|
349
752
|
* @returns {SignConvertRT}
|
|
350
753
|
*/
|
|
351
754
|
async signConvert(shares) {
|
|
@@ -359,6 +762,7 @@ class Ecdsa {
|
|
|
359
762
|
ntilde: shares.kShare.ntilde,
|
|
360
763
|
h1: shares.kShare.h1,
|
|
361
764
|
h2: shares.kShare.h2,
|
|
765
|
+
p: shares.kShare.p,
|
|
362
766
|
};
|
|
363
767
|
const signShare = await this.signShare(xShare, yShare);
|
|
364
768
|
kShare = signShare.kShare;
|
|
@@ -379,60 +783,66 @@ class Ecdsa {
|
|
|
379
783
|
if (shareToBeSent.alpha) {
|
|
380
784
|
const bShareParticipant = shareParticipant;
|
|
381
785
|
const aShareToBeSent = shareToBeSent;
|
|
382
|
-
|
|
786
|
+
if (!aShareToBeSent.gammaProof) {
|
|
787
|
+
throw new Error('Unexpected missing gammaProof on aShareToBeSent');
|
|
788
|
+
}
|
|
789
|
+
if (!aShareToBeSent.wProof) {
|
|
790
|
+
throw new Error('Unexpected missing wProof on aShareToBeSent');
|
|
791
|
+
}
|
|
792
|
+
const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(bShareParticipant.n));
|
|
383
793
|
let ntildea, h1a, h2a, ck;
|
|
384
794
|
if (bShareParticipant.ntilde) {
|
|
385
|
-
ntildea =
|
|
386
|
-
h1a =
|
|
387
|
-
h2a =
|
|
388
|
-
ck =
|
|
795
|
+
ntildea = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ntilde);
|
|
796
|
+
h1a = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h1);
|
|
797
|
+
h2a = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h2);
|
|
798
|
+
ck = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ck);
|
|
389
799
|
}
|
|
390
800
|
// Verify $\gamma_i \in Z_{N^2}$.
|
|
391
|
-
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve,
|
|
801
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
392
802
|
ntilde: ntildea,
|
|
393
803
|
h1: h1a,
|
|
394
804
|
h2: h2a,
|
|
395
805
|
}, {
|
|
396
|
-
z:
|
|
397
|
-
zprm:
|
|
398
|
-
t:
|
|
399
|
-
v:
|
|
400
|
-
w:
|
|
401
|
-
s:
|
|
402
|
-
s1:
|
|
403
|
-
s2:
|
|
404
|
-
t1:
|
|
405
|
-
t2:
|
|
406
|
-
u:
|
|
407
|
-
}, ck,
|
|
806
|
+
z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.z),
|
|
807
|
+
zprm: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.zprm),
|
|
808
|
+
t: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t),
|
|
809
|
+
v: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.v),
|
|
810
|
+
w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.w),
|
|
811
|
+
s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s),
|
|
812
|
+
s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s1),
|
|
813
|
+
s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s2),
|
|
814
|
+
t1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t1),
|
|
815
|
+
t2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t2),
|
|
816
|
+
u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.u),
|
|
817
|
+
}, ck, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.alpha), sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.x))) {
|
|
408
818
|
throw new Error('could not verify signing share for gamma proof');
|
|
409
819
|
}
|
|
410
820
|
// Verify $\w_i \in Z_{N^2}$.
|
|
411
|
-
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve,
|
|
821
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
412
822
|
ntilde: ntildea,
|
|
413
823
|
h1: h1a,
|
|
414
824
|
h2: h2a,
|
|
415
825
|
}, {
|
|
416
|
-
z:
|
|
417
|
-
zprm:
|
|
418
|
-
t:
|
|
419
|
-
v:
|
|
420
|
-
w:
|
|
421
|
-
s:
|
|
422
|
-
s1:
|
|
423
|
-
s2:
|
|
424
|
-
t1:
|
|
425
|
-
t2:
|
|
426
|
-
u:
|
|
427
|
-
}, ck,
|
|
826
|
+
z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.z),
|
|
827
|
+
zprm: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.zprm),
|
|
828
|
+
t: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t),
|
|
829
|
+
v: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.v),
|
|
830
|
+
w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.w),
|
|
831
|
+
s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s),
|
|
832
|
+
s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s1),
|
|
833
|
+
s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s2),
|
|
834
|
+
t1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t1),
|
|
835
|
+
t2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t2),
|
|
836
|
+
u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.u),
|
|
837
|
+
}, ck, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu), sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.x))) {
|
|
428
838
|
throw new Error('could not verify share for wProof');
|
|
429
839
|
}
|
|
430
|
-
const sk = new paillierBigint.PrivateKey(
|
|
840
|
+
const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(bShareParticipant.l), sdk_lib_mpc_1.hexToBigInt(bShareParticipant.m), pka);
|
|
431
841
|
const gShareParticipant = shareParticipant;
|
|
432
842
|
const muShareToBeSent = shareToBeSent;
|
|
433
|
-
const alpha = sk.decrypt(
|
|
843
|
+
const alpha = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.alpha));
|
|
434
844
|
gShareParticipant.alpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
|
|
435
|
-
const mu = sk.decrypt(
|
|
845
|
+
const mu = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu)); // recheck encrypted number
|
|
436
846
|
gShareParticipant.mu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
|
|
437
847
|
const partialShareParticipant = shareParticipant;
|
|
438
848
|
const partialShareToBeSent = muShareToBeSent;
|
|
@@ -444,44 +854,43 @@ class Ecdsa {
|
|
|
444
854
|
if (shareToBeSent.k) {
|
|
445
855
|
const bShareParticipant = shareParticipant;
|
|
446
856
|
const aShareToBeSent = shareToBeSent;
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
let ntildea, h1a, h2a, ntildeb, h1b, h2b;
|
|
450
|
-
if (aShareToBeSent.ntilde) {
|
|
451
|
-
ntildea = crypto_2.hexToBigInt(aShareToBeSent.ntilde);
|
|
452
|
-
h1a = crypto_2.hexToBigInt(aShareToBeSent.h1);
|
|
453
|
-
h2a = crypto_2.hexToBigInt(aShareToBeSent.h2);
|
|
454
|
-
ntildeb = crypto_2.hexToBigInt(bShareParticipant.ntilde);
|
|
455
|
-
h1b = crypto_2.hexToBigInt(bShareParticipant.h1);
|
|
456
|
-
h2b = crypto_2.hexToBigInt(bShareParticipant.h2);
|
|
857
|
+
if (!aShareToBeSent.proof) {
|
|
858
|
+
throw new Error('Unexpected missing proof on aShareToBeSent');
|
|
457
859
|
}
|
|
458
|
-
const
|
|
459
|
-
|
|
860
|
+
const n = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.n); // Paillier pub from other signer
|
|
861
|
+
const pka = util_1.getPaillierPublicKey(n);
|
|
862
|
+
const ntildea = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.ntilde);
|
|
863
|
+
const h1a = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.h1);
|
|
864
|
+
const h2a = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.h2);
|
|
865
|
+
const ntildeb = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ntilde);
|
|
866
|
+
const h1b = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h1);
|
|
867
|
+
const h2b = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h2);
|
|
868
|
+
const k = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.k);
|
|
869
|
+
if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
460
870
|
ntilde: ntildeb,
|
|
461
871
|
h1: h1b,
|
|
462
872
|
h2: h2b,
|
|
463
873
|
}, {
|
|
464
|
-
z:
|
|
465
|
-
u:
|
|
466
|
-
w:
|
|
467
|
-
s:
|
|
468
|
-
s1:
|
|
469
|
-
s2:
|
|
874
|
+
z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.z),
|
|
875
|
+
u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.u),
|
|
876
|
+
w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.w),
|
|
877
|
+
s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s),
|
|
878
|
+
s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s1),
|
|
879
|
+
s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s2),
|
|
470
880
|
}, k)) {
|
|
471
881
|
throw new Error('Could not verify signing A share proof');
|
|
472
882
|
}
|
|
473
883
|
// MtA $k_j, \gamma_i$.
|
|
474
884
|
const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
475
885
|
bShareParticipant.beta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
|
|
476
|
-
const g =
|
|
477
|
-
const rb = await sdk_lib_mpc_1.
|
|
886
|
+
const g = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.gamma);
|
|
887
|
+
const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
|
|
478
888
|
const cb = pka.encrypt(beta0, rb);
|
|
479
889
|
const alpha = pka.addition(pka.multiply(k, g), cb);
|
|
480
890
|
aShareToBeSent.alpha = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
|
|
481
891
|
// Prove $\gamma_i \in Z_{N^2}$.
|
|
482
892
|
const gx = Ecdsa.curve.basePointMult(g);
|
|
483
|
-
let proof
|
|
484
|
-
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, 3072, pka, {
|
|
893
|
+
let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
485
894
|
ntilde: ntildea,
|
|
486
895
|
h1: h1a,
|
|
487
896
|
h2: h2a,
|
|
@@ -505,18 +914,18 @@ class Ecdsa {
|
|
|
505
914
|
// MtA $k_j, w_i$.
|
|
506
915
|
const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
|
|
507
916
|
shareParticipant.nu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
|
|
508
|
-
const w =
|
|
509
|
-
const rn = await sdk_lib_mpc_1.
|
|
917
|
+
const w = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.w);
|
|
918
|
+
const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
|
|
510
919
|
const cn = pka.encrypt(nu0, rn);
|
|
511
920
|
const mu = pka.addition(pka.multiply(k, w), cn);
|
|
512
921
|
shareToBeSent.mu = util_1.bigIntToBufferBE(mu, 32).toString('hex');
|
|
513
922
|
// Prove $\w_i \in Z_{N^2}$.
|
|
514
923
|
const wx = Ecdsa.curve.basePointMult(w);
|
|
515
|
-
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve,
|
|
924
|
+
proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
|
|
516
925
|
ntilde: ntildea,
|
|
517
926
|
h1: h1a,
|
|
518
927
|
h2: h2a,
|
|
519
|
-
}, k,
|
|
928
|
+
}, k, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu), w, nu0, rn, wx);
|
|
520
929
|
Object.assign(shareToBeSent, {
|
|
521
930
|
wProof: {
|
|
522
931
|
z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
|
|
@@ -590,13 +999,13 @@ class Ecdsa {
|
|
|
590
999
|
signCombine(shares) {
|
|
591
1000
|
const gShare = shares.gShare;
|
|
592
1001
|
const S = shares.signIndex;
|
|
593
|
-
const gamma =
|
|
594
|
-
const alpha =
|
|
595
|
-
const beta =
|
|
596
|
-
const mu =
|
|
597
|
-
const nu =
|
|
598
|
-
const k =
|
|
599
|
-
const w =
|
|
1002
|
+
const gamma = sdk_lib_mpc_1.hexToBigInt(gShare.gamma);
|
|
1003
|
+
const alpha = sdk_lib_mpc_1.hexToBigInt(gShare.alpha);
|
|
1004
|
+
const beta = sdk_lib_mpc_1.hexToBigInt(gShare.beta);
|
|
1005
|
+
const mu = sdk_lib_mpc_1.hexToBigInt(gShare.mu);
|
|
1006
|
+
const nu = sdk_lib_mpc_1.hexToBigInt(gShare.nu);
|
|
1007
|
+
const k = sdk_lib_mpc_1.hexToBigInt(gShare.k);
|
|
1008
|
+
const w = sdk_lib_mpc_1.hexToBigInt(gShare.w);
|
|
600
1009
|
const delta = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, gamma), Ecdsa.curve.scalarAdd(alpha, beta));
|
|
601
1010
|
const omicron = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, w), Ecdsa.curve.scalarAdd(mu, nu));
|
|
602
1011
|
const Gamma = Ecdsa.curve.basePointMult(gamma);
|
|
@@ -628,11 +1037,11 @@ class Ecdsa {
|
|
|
628
1037
|
*/
|
|
629
1038
|
sign(M, oShare, dShare, hash, shouldHash = true) {
|
|
630
1039
|
const m = shouldHash ? (hash || crypto_1.createHash('sha256')).update(M).digest() : M;
|
|
631
|
-
const delta = Ecdsa.curve.scalarAdd(
|
|
632
|
-
const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd(
|
|
1040
|
+
const delta = Ecdsa.curve.scalarAdd(sdk_lib_mpc_1.hexToBigInt(oShare.delta), sdk_lib_mpc_1.hexToBigInt(dShare.delta));
|
|
1041
|
+
const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd(sdk_lib_mpc_1.hexToBigInt(oShare.Gamma), sdk_lib_mpc_1.hexToBigInt(dShare.Gamma)), Ecdsa.curve.scalarInvert(delta));
|
|
633
1042
|
const pointR = secp.Point.fromHex(util_1.bigIntToBufferBE(R, 32));
|
|
634
1043
|
const r = pointR.x;
|
|
635
|
-
const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(util_1.bigIntFromU8ABE(m),
|
|
1044
|
+
const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(util_1.bigIntFromU8ABE(m), sdk_lib_mpc_1.hexToBigInt(oShare.k)), Ecdsa.curve.scalarMult(r, sdk_lib_mpc_1.hexToBigInt(oShare.omicron)));
|
|
636
1045
|
return {
|
|
637
1046
|
i: oShare.i,
|
|
638
1047
|
y: oShare.y,
|
|
@@ -652,7 +1061,7 @@ class Ecdsa {
|
|
|
652
1061
|
if (!isRMatching) {
|
|
653
1062
|
throw new Error('R value should be consistent across all shares');
|
|
654
1063
|
}
|
|
655
|
-
let s = shares.map((share) =>
|
|
1064
|
+
let s = shares.map((share) => sdk_lib_mpc_1.hexToBigInt(share['s'])).reduce(Ecdsa.curve.scalarAdd);
|
|
656
1065
|
const recid = (R.slice(0, 2) === '03' ? 1 : 0) ^ (s > Ecdsa.curve.order() / BigInt(2) ? 1 : 0);
|
|
657
1066
|
// Normalize s.
|
|
658
1067
|
s = s > Ecdsa.curve.order() / BigInt(2) ? Ecdsa.curve.order() - s : s;
|
|
@@ -675,60 +1084,28 @@ class Ecdsa {
|
|
|
675
1084
|
const messageToVerify = shouldHash ? (hash || crypto_1.createHash('sha256')).update(message).digest() : message;
|
|
676
1085
|
return Ecdsa.curve.verify(messageToVerify, Buffer.concat([
|
|
677
1086
|
Buffer.from([signature['recid']]),
|
|
678
|
-
util_1.bigIntToBufferBE(
|
|
679
|
-
util_1.bigIntToBufferBE(
|
|
680
|
-
]),
|
|
1087
|
+
util_1.bigIntToBufferBE(sdk_lib_mpc_1.hexToBigInt(signature['r']), 32),
|
|
1088
|
+
util_1.bigIntToBufferBE(sdk_lib_mpc_1.hexToBigInt(signature['s']), 32),
|
|
1089
|
+
]), sdk_lib_mpc_1.hexToBigInt(signature['y']));
|
|
681
1090
|
}
|
|
682
1091
|
/**
|
|
683
1092
|
* Deserializes a challenge and it's proofs from hex strings to bigint
|
|
1093
|
+
* @deprecated use sdk-lib-mpc EcdsaTypes.deserializeNtilde instead
|
|
684
1094
|
*/
|
|
685
1095
|
static deserializeNtilde(challenge) {
|
|
686
|
-
|
|
687
|
-
ntilde: crypto_2.hexToBigInt(challenge.ntilde),
|
|
688
|
-
h1: crypto_2.hexToBigInt(challenge.h1),
|
|
689
|
-
h2: crypto_2.hexToBigInt(challenge.h2),
|
|
690
|
-
};
|
|
691
|
-
if (challenge.ntildeProof) {
|
|
692
|
-
deserializedNtilde.ntildeProof = {
|
|
693
|
-
h1WrtH2: {
|
|
694
|
-
alpha: crypto_2.convertHexArrToBigIntArr(challenge.ntildeProof.h1WrtH2.alpha),
|
|
695
|
-
t: crypto_2.convertHexArrToBigIntArr(challenge.ntildeProof.h1WrtH2.t),
|
|
696
|
-
},
|
|
697
|
-
h2WrtH1: {
|
|
698
|
-
alpha: crypto_2.convertHexArrToBigIntArr(challenge.ntildeProof.h2WrtH1.alpha),
|
|
699
|
-
t: crypto_2.convertHexArrToBigIntArr(challenge.ntildeProof.h2WrtH1.t),
|
|
700
|
-
},
|
|
701
|
-
};
|
|
702
|
-
}
|
|
703
|
-
return deserializedNtilde;
|
|
1096
|
+
return sdk_lib_mpc_1.EcdsaTypes.deserializeNtilde(challenge);
|
|
704
1097
|
}
|
|
705
1098
|
/**
|
|
706
1099
|
* Serializes a challenge and it's proofs from big int to hex strings.
|
|
1100
|
+
* @deprecated use sdk-lib-mpc EcdsaTypes.deserializeNtilde instead
|
|
707
1101
|
* @param challenge
|
|
708
1102
|
*/
|
|
709
1103
|
static serializeNtilde(challenge) {
|
|
710
|
-
|
|
711
|
-
ntilde: crypto_2.bigIntToHex(challenge.ntilde),
|
|
712
|
-
h1: crypto_2.bigIntToHex(challenge.h1),
|
|
713
|
-
h2: crypto_2.bigIntToHex(challenge.h2),
|
|
714
|
-
};
|
|
715
|
-
if (challenge.ntildeProof) {
|
|
716
|
-
serializedNtilde.ntildeProof = {
|
|
717
|
-
h1WrtH2: {
|
|
718
|
-
alpha: crypto_2.convertBigIntArrToHexArr(challenge.ntildeProof.h1WrtH2.alpha),
|
|
719
|
-
t: crypto_2.convertBigIntArrToHexArr(challenge.ntildeProof.h1WrtH2.t),
|
|
720
|
-
},
|
|
721
|
-
h2WrtH1: {
|
|
722
|
-
alpha: crypto_2.convertBigIntArrToHexArr(challenge.ntildeProof.h2WrtH1.alpha),
|
|
723
|
-
t: crypto_2.convertBigIntArrToHexArr(challenge.ntildeProof.h2WrtH1.t),
|
|
724
|
-
},
|
|
725
|
-
};
|
|
726
|
-
}
|
|
727
|
-
return serializedNtilde;
|
|
1104
|
+
return sdk_lib_mpc_1.EcdsaTypes.serializeNtilde(challenge);
|
|
728
1105
|
}
|
|
729
1106
|
}
|
|
730
1107
|
exports.default = Ecdsa;
|
|
731
1108
|
Ecdsa.curve = new curves_1.Secp256k1Curve();
|
|
732
1109
|
Ecdsa.hdTree = new hdTree_1.BIP32();
|
|
733
1110
|
Ecdsa.shamir = new shamir_1.default(Ecdsa.curve);
|
|
734
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBa0Q7QUFDbEQsdUVBQXlEO0FBQ3pELHVEQUF5QztBQUN6Qyx5Q0FBNEQ7QUFDNUQsbUNBQXVEO0FBQ3ZELG1EQUE2QztBQUM3QyxpREFBb0g7QUFDcEgscUNBQXlHO0FBQ3pHLHlDQUE4QztBQUM5QywwREFBa0M7QUFDbEMseURBQTJFO0FBK0IzRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFdEIsU0FBUyxTQUFTLENBQUMsS0FBc0I7SUFDdkMsT0FBTyxRQUFRLElBQUksS0FBSyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQXFCLEtBQUs7SUFJeEI7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLElBQWEsRUFBRSxJQUFJLEdBQUcsS0FBSzs7UUFDN0YsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ25GLE1BQU0seUJBQXlCLENBQUM7U0FDakM7UUFFRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7U0FDakU7UUFFRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtZQUM1QixrRUFBa0U7WUFDbEUsbUJBQW1CLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbEU7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxlQUF1QyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxlQUFlLEdBQUcsTUFBTSxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3ZFO2FBQU07WUFDTCxlQUFlLEdBQUcsY0FBYyxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyRTtRQUNELE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsZUFBZSxDQUFDO1FBQ2xELDBFQUEwRTtRQUMxRSxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsSUFBSSxnQkFBSyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxHQUNMLE1BQUEsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsSUFBSSxzQkFBZSxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG1DQUM1RixLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLE1BQUEsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxtQ0FBSSxvQkFBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLDJDQUEyQztRQUMzQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sa0JBQWtCLEdBQVc7WUFDakMsQ0FBQyxFQUFFLEtBQUs7WUFDUixDQUFDLEVBQUUsU0FBUztZQUNaLENBQUMsRUFBRSxTQUFTO1lBQ1osQ0FBQyxFQUFFLHVCQUFnQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUMzRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDckQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzFDLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUN2RCxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUNoQixTQUFTLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDckMsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFhO1lBQ3pCLE1BQU0sRUFBRSxrQkFBa0I7WUFDMUIsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRUYsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUU7WUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksZ0JBQWdCLEtBQUssS0FBSyxFQUFFO2dCQUM5QixRQUFRLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUc7b0JBQ25DLENBQUMsRUFBRSxnQkFBZ0I7b0JBQ25CLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7b0JBQzFCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDMUMsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUM3QyxDQUFDLEVBQUUsdUJBQWdCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbEUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUMzQixDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxVQUFVLENBQUMsTUFBYyxFQUFFLE9BQWlCO1FBQzFDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDdkMsMEJBQTBCO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLG9CQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRyxvQkFBb0I7UUFDcEIsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsb0JBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXRHLGlCQUFpQjtRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtZQUMzQixJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSTtvQkFDRixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLG9CQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLG9CQUFXLENBQUMsS0FBSyxDQUFDLENBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwRztnQkFBQyxPQUFPLEdBQUcsRUFBRTtvQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxLQUFLLENBQUMsQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQztpQkFDbkc7YUFDRjtTQUNGO1FBRUQsb0ZBQW9GO1FBQ3BGLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMseUJBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xILE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQ2pDLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQ2pCLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDLFFBQVE7U0FDOUcsQ0FBQztRQUVGLE1BQU0sWUFBWSxHQUFnQjtZQUNoQyxNQUFNLEVBQUU7Z0JBQ04sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDMUMsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMxQyxTQUFTLEVBQUUsdUJBQWdCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7YUFDM0Q7WUFDRCxPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7UUFFRixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRTtZQUMzQixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUc7Z0JBQ3ZDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDWCxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDdEIsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7YUFDdkIsQ0FBQztTQUNIO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxTQUFTLENBQUMsTUFBYyxFQUFFLE9BQWlCLEVBQUUsSUFBWTtRQUN2RCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsb0JBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixJQUFJLGdCQUFnQixHQUFHLG9CQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsb0JBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakcsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLHNCQUFhLENBQUMsQ0FBQztRQUUzRixpQkFBaUI7UUFDakIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUU7WUFDM0IsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNYLElBQUk7b0JBQ0YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxvQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxvQkFBVyxDQUFDLEtBQUssQ0FBQyxDQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEc7Z0JBQUMsT0FBTyxHQUFHLEVBQUU7b0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsS0FBSyxDQUFDLENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUM7aUJBQ25HO2FBQ0Y7U0FDRjtRQUVELGlCQUFpQjtRQUNqQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUU3RSx5Q0FBeUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRELHdDQUF3QztRQUN4QyxNQUFNLGNBQWMsR0FBRyxDQUFDLHNCQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxzQkFBYSxDQUFDO1FBQ3RGLGdCQUFnQixHQUFHLENBQUMsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLEdBQUcsc0JBQWEsQ0FBQztRQUV2RSwwQkFBMEI7UUFDMUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTNGLDZCQUE2QjtRQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsb0JBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdkcsTUFBTSxHQUFHLEdBQVc7WUFDbEIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNsRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDMUMsU0FBUyxFQUFFLHVCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUNsRSxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQWdCO1lBQzFCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFDO1FBRUYsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUN0QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ1IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNSLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDUixDQUFDLEVBQUUsdUJBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUN2RCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDN0MsU0FBUyxFQUFFLHVCQUFnQixDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7YUFDbEUsQ0FBQztTQUNIO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGdCQUFnQixDQUFDLGNBQXNCLEVBQUUsSUFBWTtRQUNuRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztTQUNuRTtRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXBELE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQ3JEO1lBQ0UsRUFBRSxFQUFFLHlCQUFrQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLFNBQVMsRUFBRSx5QkFBa0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xELEVBQ0QsSUFBSSxDQUNMLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyx1QkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQWdCLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRixPQUFPLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFjLEVBQUUsTUFBYyxFQUFFLFNBQTRCO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxTQUFTLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLDZCQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDL0U7UUFDRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFDckMsT0FBTztZQUNMLE1BQU0sRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ3JDLE9BQU8sRUFBRTtnQkFDUCxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDVixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNYLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDWCxNQUFNO29CQUNOLEVBQUU7b0JBQ0YsRUFBRTtpQkFDSDthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQWlDLEVBQUUsTUFBd0I7UUFDekUsTUFBTSxFQUFFLEdBQUcsMkJBQW9CLENBQUMsb0JBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RCwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN0QixNQUFNLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQzlEO1FBRUQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBRyxNQUFNLDZCQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFekMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlHLE1BQU0sQ0FBQyxHQUFHO1lBQ1IsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFELG9CQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUM1QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQTBCLENBQUM7UUFFekUsTUFBTSxPQUFPLEdBQWdCO1lBQzNCLE1BQU0sRUFBRTtnQkFDTixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLE1BQU0sRUFBRSxPQUFPO2dCQUNmLEVBQUUsRUFBRSxHQUFHO2dCQUNQLEVBQUUsRUFBRSxHQUFHO2dCQUNQLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDMUMsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUM3QyxDQUFDLEVBQUUsdUJBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQzFDLEtBQUssRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzthQUNuRDtZQUNELE1BQU0sRUFBRSxFQUFZO1NBQ3JCLENBQUM7UUFFRixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDckQsTUFBTSxLQUFLLEdBQUcsTUFBTSw2QkFBZSxDQUFDLEtBQUssQ0FDdkMsS0FBSyxDQUFDLEtBQUssRUFDWCxJQUFJLEVBQ0osRUFBRSxFQUNGO1lBQ0UsTUFBTSxFQUFFLG9CQUFXLENBQUMsT0FBTyxDQUFDO1lBQzVCLEVBQUUsRUFBRSxvQkFBVyxDQUFDLEdBQUcsQ0FBQztZQUNwQixFQUFFLEVBQUUsb0JBQVcsQ0FBQyxHQUFHLENBQUM7U0FDckIsRUFDRCxFQUFFLEVBQ0YsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUc7WUFDakIsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2xELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDcEQsQ0FBQztRQUVGLE9BQU8sQ0FBQyxNQUFNLEdBQUc7WUFDZixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsRUFBRSxFQUFFLEdBQUc7WUFDUCxFQUFFLEVBQUUsR0FBRztZQUNQLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM1QyxLQUFLLEVBQUUsVUFBVTtTQUNsQixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFtQjtRQUNuQyxJQUFJLGdCQUFtRCxFQUFFLGFBQXdDLENBQUM7UUFDbEcsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksTUFBTSxHQUFvQixFQUFFLENBQUM7UUFDakMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsbUNBQW1DO1lBQ2pFLE1BQU0sTUFBTSxHQUFHO2dCQUNiLEdBQUcsTUFBTSxDQUFDLE1BQU07Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU07Z0JBQzVCLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3BCLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7YUFDckIsQ0FBQztZQUNGLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkQsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDMUIsYUFBYSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFxQixDQUFDO1lBQ3hELGdCQUFnQixHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFxQixDQUFDO1NBQy9EO2FBQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDaEYsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQWMsQ0FBQyxDQUFDLENBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQWMsQ0FBQztZQUN2RyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBc0IsQ0FBQyxDQUFDLENBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQWEsQ0FBQztTQUNqSDthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLENBQUMsRUFBRTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUFLLGFBQXdCLENBQUMsS0FBSyxFQUFFO1lBQ25DLE1BQU0saUJBQWlCLEdBQUcsZ0JBQTBCLENBQUM7WUFDckQsTUFBTSxjQUFjLEdBQUcsYUFBdUIsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRywyQkFBb0IsQ0FBQyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsSUFBSSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDMUIsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7Z0JBQzVCLE9BQU8sR0FBRyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRCxHQUFHLEdBQUcsb0JBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEMsR0FBRyxHQUFHLG9CQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hDLEVBQUUsR0FBRyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3hDO1lBQ0QsaUNBQWlDO1lBQ2pDLElBQ0UsQ0FBQyw2QkFBZSxDQUFDLGVBQWUsQ0FDOUIsS0FBSyxDQUFDLEtBQUssRUFDWCxJQUFJLEVBQ0osR0FBRyxFQUNIO2dCQUNFLE1BQU0sRUFBRSxPQUFPO2dCQUNmLEVBQUUsRUFBRSxHQUFHO2dCQUNQLEVBQUUsRUFBRSxHQUFHO2FBQ1IsRUFDRDtnQkFDRSxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2pELENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxFQUFFLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsRUFBRSxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLEVBQUUsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxFQUFFLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDNUMsRUFDRCxFQUFFLEVBQ0Ysb0JBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQ2pDLG9CQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDekMsRUFDRDtnQkFDQSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7YUFDbkU7WUFDRCw2QkFBNkI7WUFDN0IsSUFDRSxDQUFDLDZCQUFlLENBQUMsZUFBZSxDQUM5QixLQUFLLENBQUMsS0FBSyxFQUNYLElBQUksRUFDSixHQUFHLEVBQ0g7Z0JBQ0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsRUFBRSxFQUFFLEdBQUc7YUFDUixFQUNEO2dCQUNFLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDN0MsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLEVBQUUsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxFQUFFLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsRUFBRSxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLEVBQUUsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUN4QyxFQUNELEVBQUUsRUFDRixvQkFBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFDOUIsb0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUNyQyxFQUNEO2dCQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQzthQUN0RDtZQUNELE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLFVBQVUsQ0FDdEMsb0JBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFXLENBQUMsRUFDMUMsb0JBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFXLENBQUMsRUFDMUMsR0FBRyxDQUNKLENBQUM7WUFDRixNQUFNLGlCQUFpQixHQUFHLGdCQUEwQixDQUFDO1lBQ3JELE1BQU0sZUFBZSxHQUFHLGFBQXdCLENBQUM7WUFDakQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVELGlCQUFpQixDQUFDLEtBQUssR0FBRyx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEcsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxFQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1lBQzVGLGlCQUFpQixDQUFDLEVBQUUsR0FBRyx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUYsTUFBTSx1QkFBdUIsR0FBRyxnQkFBbUMsQ0FBQztZQUNwRSxNQUFNLG9CQUFvQixHQUFHLGVBQW1DLENBQUM7WUFDakUsT0FBTyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7WUFDakMsT0FBTyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7WUFDakMsT0FBTyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7WUFDbEMsT0FBTyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFLLGFBQXdCLENBQUMsQ0FBQyxFQUFFO1lBQy9CLE1BQU0saUJBQWlCLEdBQUcsZ0JBQTBCLENBQUM7WUFDckQsTUFBTSxjQUFjLEdBQUcsYUFBdUIsQ0FBQztZQUMvQyxNQUFNLENBQUMsR0FBRyxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztZQUMxRSxNQUFNLEdBQUcsR0FBRywyQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1lBQ3pDLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRTtnQkFDekIsT0FBTyxHQUFHLG9CQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QyxHQUFHLEdBQUcsb0JBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLEdBQUcsR0FBRyxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckMsT0FBTyxHQUFHLG9CQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hELEdBQUcsR0FBRyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxHQUFHLEdBQUcsb0JBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN6QztZQUNELE1BQU0sQ0FBQyxHQUFHLG9CQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQ0UsQ0FBQyw2QkFBZSxDQUFDLE1BQU0sQ0FDckIsS0FBSyxDQUFDLEtBQUssRUFDWCxJQUFJLEVBQ0osR0FBRyxFQUNIO2dCQUNFLE1BQU0sRUFBRSxPQUFPO2dCQUNmLEVBQUUsRUFBRSxHQUFHO2dCQUNQLEVBQUUsRUFBRSxHQUFHO2FBQ1IsRUFDRDtnQkFDRSxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLENBQUMsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDLEVBQUUsb0JBQVcsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsRUFBRSxFQUFFLG9CQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLEVBQUUsRUFBRSxvQkFBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ3pDLEVBQ0QsQ0FBQyxDQUNGLEVBQ0Q7Z0JBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO2FBQzNEO1lBQ0QsdUJBQXVCO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3hFLGlCQUFpQixDQUFDLElBQUksR0FBRyx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDL0csS0FBSyxDQUNOLENBQUM7WUFDRixNQUFNLENBQUMsR0FBRyxvQkFBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE1BQU0sRUFBRSxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRCxjQUFjLENBQUMsS0FBSyxHQUFHLHVCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkUsZ0NBQWdDO1lBQ2hDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksS0FBMEIsQ0FBQztZQUMvQixLQUFLLEdBQUcsTUFBTSw2QkFBZSxDQUFDLGNBQWMsQ0FDMUMsS0FBSyxDQUFDLEtBQUssRUFDWCxJQUFJLEVBQ0osR0FBRyxFQUNIO2dCQUNFLE1BQU0sRUFBRSxPQUFPO2dCQUNmLEVBQUUsRUFBRSxHQUFHO2dCQUNQLEVBQUUsRUFBRSxHQUFHO2FBQ1IsRUFDRCxDQUFDLEVBQ0QsS0FBSyxFQUNMLENBQUMsRUFDRCxLQUFLLEVBQ0wsRUFBRSxFQUNGLEVBQUUsQ0FDSCxDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUU7Z0JBQzVCLFVBQVUsRUFBRTtvQkFDVixDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxJQUFJLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUN2RCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNsRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNoRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQzVDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsa0JBQWtCO1lBQ2xCLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixD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RUFBRTtvQkFDUCxLQUFLLEVBQUUsaUNBQXdCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNwRSxDQUFDLEVBQUUsaUNBQXdCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUM3RDthQUNGLENBQUM7U0FDSDtRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQzs7QUFqekJILHdCQWt6QkM7QUFqekJRLFdBQUssR0FBbUIsSUFBSSx1QkFBYyxFQUFFLENBQUM7QUFDN0MsWUFBTSxHQUFXLElBQUksY0FBSyxFQUFFLENBQUM7QUFDN0IsWUFBTSxHQUFXLElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYWlsbGllckJpZ2ludCBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0ICogYXMgYmlnaW50Q3J5cHRvVXRpbHMgZnJvbSAnYmlnaW50LWNyeXB0by11dGlscyc7XG5pbXBvcnQgKiBhcyBzZWNwIGZyb20gJ0Bub2JsZS9zZWNwMjU2azEnO1xuaW1wb3J0IEhEVHJlZSwgeyBCSVAzMiwgY2hhaW5jb2RlQmFzZSB9IGZyb20gJy4uLy4uL2hkVHJlZSc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpZ0ludFRvSGV4LCBjb252ZXJ0QmlnSW50QXJyVG9IZXhBcnIsIGNvbnZlcnRIZXhBcnJUb0JpZ0ludEFyciwgaGV4VG9CaWdJbnQgfSBmcm9tICcuLi8uLi8uLi91dGlsL2NyeXB0byc7XG5pbXBvcnQgeyBiaWdJbnRGcm9tQnVmZmVyQkUsIGJpZ0ludEZyb21VOEFCRSwgYmlnSW50VG9CdWZmZXJCRSwgZ2V0UGFpbGxpZXJQdWJsaWNLZXkgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IFNlY3AyNTZrMUN1cnZlIH0gZnJvbSAnLi4vLi4vY3VydmVzJztcbmltcG9ydCBTaGFtaXIgZnJvbSAnLi4vLi4vc2hhbWlyJztcbmltcG9ydCB7IEVjZHNhUmFuZ2VQcm9vZiwgcmFuZG9tQ29QcmltZVRvIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHtcbiAgQVNoYXJlLFxuICBCU2hhcmUsXG4gIERTaGFyZSxcbiAgR1NoYXJlLFxuICBLZXlDb21iaW5lZCxcbiAgS2V5Q29tYmluZWRXaXRoTnRpbGRlLFxuICBLZXlTaGFyZSxcbiAgS1NoYXJlLFxuICBNVVNoYXJlLFxuICBOU2hhcmUsXG4gIE9TaGFyZSxcbiAgUFNoYXJlLFxuICBSYW5nZVByb29mV2l0aENoZWNrLFxuICBTaWduYXR1cmUsXG4gIFNpZ25Db21iaW5lLFxuICBTaWduQ29tYmluZVJULFxuICBTaWduQ29udmVydCxcbiAgU2lnbkNvbnZlcnRSVCxcbiAgU2lnblNoYXJlUlQsXG4gIFNTaGFyZSxcbiAgU3Via2V5U2hhcmUsXG4gIFhTaGFyZSxcbiAgWFNoYXJlV2l0aE50aWxkZSxcbiAgWVNoYXJlLFxuICBZU2hhcmVXaXRoTnRpbGRlLFxuICBTZXJpYWxpemVkTnRpbGRlLFxuICBEZXNlcmlhbGl6ZWROdGlsZGUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG5cbmZ1bmN0aW9uIGhhc050aWxkZShzaGFyZTogWFNoYXJlIHwgWVNoYXJlKTogc2hhcmUgaXMgWFNoYXJlV2l0aE50aWxkZSB8IFlTaGFyZVdpdGhOdGlsZGUge1xuICByZXR1cm4gJ250aWxkZScgaW4gc2hhcmU7XG59XG5cbi8qKlxuICogRUNEU0EgVFNTIGltcGxlbWVudGF0aW9uIHN1cHBvcnRpbmcgMjpuIFRocmVzaG9sZFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY2RzYSB7XG4gIHN0YXRpYyBjdXJ2ZTogU2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgc3RhdGljIGhkVHJlZTogSERUcmVlID0gbmV3IEJJUDMyKCk7XG4gIHN0YXRpYyBzaGFtaXI6IFNoYW1pciA9IG5ldyBTaGFtaXIoRWNkc2EuY3VydmUpO1xuICAvKipcbiAgICogR2VuZXJhdGUgc2hhcmVzIGZvciBwYXJ0aWNpcGFudCBhdCBpbmRleCBhbmQgc3BsaXQga2V5cyBgKHRocmVzaG9sZCxudW1TaGFyZXMpYCB3YXlzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggcGFydGljaXBhbnQgaW5kZXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCBTaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtU2hhcmVzICBOdW1iZXIgb2Ygc2hhcmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzZWVkIG9wdGlvbmFsIDY0IGJ5dGUgc2VlZCB0byB1c2UgZm9yIGtleSBnZW5lcmF0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3luYyBvcHRpb25hbCBzeW5jIGZsYWcsIGlmIHRydWUgdGhlbiBhIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgUGFpbGxpZXIga2V5IGdlbmVyYXRpb24gaXMgdXNlZCB0aGF0IGRvZXMgbm90IHNwYXduIFdvcmtlciB0aHJlYWRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlTaGFyZT59IFJldHVybnMgdGhlIHByaXZhdGUgcC1zaGFyZVxuICAgKiBhbmQgbi1zaGFyZXMgdG8gYmUgZGlzdHJpYnV0ZWQgdG8gcGFydGljaXBhbnRzIGF0IHRoZWlyIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqL1xuICBhc3luYyBrZXlTaGFyZShpbmRleDogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlciwgbnVtU2hhcmVzOiBudW1iZXIsIHNlZWQ/OiBCdWZmZXIsIHN5bmMgPSBmYWxzZSk6IFByb21pc2U8S2V5U2hhcmU+IHtcbiAgICBpZiAoIShpbmRleCA+IDAgJiYgaW5kZXggPD0gbnVtU2hhcmVzICYmIHRocmVzaG9sZCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkID09PSAyKSkge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgS2V5U2hhcmUgQ29uZmlnJztcbiAgICB9XG5cbiAgICBpZiAoc2VlZCAmJiBzZWVkLmxlbmd0aCA8IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlZWQgbXVzdCBoYXZlIGEgbGVuZ3RoIG9mIGF0IGxlYXN0IDY0IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgbGV0IHNlZWRXaXRoVmFsaWRMZW5ndGggPSBzZWVkO1xuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoID4gNjQpIHtcbiAgICAgIC8vIGlmIHNlZWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA2NCBieXRlcywgaGFzaCBzZWVkIHRvIDY0IGJ5dGVzLlxuICAgICAgc2VlZFdpdGhWYWxpZExlbmd0aCA9IGNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzZWVkKS5kaWdlc3QoKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhZGRpdGl2ZWx5IGhvbW9tb3JwaGljIGVuY3J5cHRpb24ga2V5LlxuICAgIGxldCBwYWlsbGllcktleVBhaXI6IHBhaWxsaWVyQmlnaW50LktleVBhaXI7XG4gICAgaWYgKCFzeW5jKSB7XG4gICAgICBwYWlsbGllcktleVBhaXIgPSBhd2FpdCBwYWlsbGllckJpZ2ludC5nZW5lcmF0ZVJhbmRvbUtleXMoMzA3MiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5c1N5bmMoMzA3MiwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHVibGljS2V5LCBwcml2YXRlS2V5IH0gPSBwYWlsbGllcktleVBhaXI7XG4gICAgLy8gQWNjZXB0IGEgNjQgYnl0ZSBzZWVkIGFuZCBjcmVhdGUgYW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgZnJvbSB0aGF0IHNlZWRcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBzZWVkV2l0aFZhbGlkTGVuZ3RoICYmIGJpcDMyLmZyb21TZWVkKHNlZWRXaXRoVmFsaWRMZW5ndGgpO1xuICAgIGNvbnN0IHUgPVxuICAgICAgKHNlY3JldEtleSAmJiBzZWNyZXRLZXkucHJpdmF0ZUtleSAmJiBiaWdJbnRGcm9tVThBQkUobmV3IFVpbnQ4QXJyYXkoc2VjcmV0S2V5LnByaXZhdGVLZXkpKSkgPz9cbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHkgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHUpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IChzZWNyZXRLZXkgJiYgc2VjcmV0S2V5LmNoYWluQ29kZSkgPz8gcmFuZG9tQnl0ZXMoMzIpO1xuICAgIC8vIENvbXB1dGUgc2VjcmV0IHNoYXJlcyBvZiB0aGUgcHJpdmF0ZSBrZXlcbiAgICBjb25zdCB7IHNoYXJlczogdVNoYXJlcywgdiB9ID0gRWNkc2Euc2hhbWlyLnNwbGl0KHUsIHRocmVzaG9sZCwgbnVtU2hhcmVzKTtcbiAgICBjb25zdCBjdXJyZW50UGFydGljaXBhbnQ6IFBTaGFyZSA9IHtcbiAgICAgIGk6IGluZGV4LFxuICAgICAgdDogdGhyZXNob2xkLFxuICAgICAgYzogbnVtU2hhcmVzLFxuICAgICAgbDogYmlnSW50VG9CdWZmZXJCRShwcml2YXRlS2V5LmxhbWJkYSwgMTkyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBtOiBiaWdJbnRUb0J1ZmZlckJFKHByaXZhdGVLZXkubXUsIDE5MikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgbjogYmlnSW50VG9CdWZmZXJCRShwdWJsaWNLZXkubiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbaW5kZXhdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdXU6IHUudG9TdHJpbmcoKSxcbiAgICAgIGNoYWluY29kZTogY2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIGNvbnN0IGtleVNoYXJlOiBLZXlTaGFyZSA9IHtcbiAgICAgIHBTaGFyZTogY3VycmVudFBhcnRpY2lwYW50LFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gdVNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IHBhcnNlSW50KHNoYXJlLCAxMCk7XG4gICAgICBpZiAocGFydGljaXBhbnRJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAga2V5U2hhcmUublNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgICBpOiBwYXJ0aWNpcGFudEluZGV4LFxuICAgICAgICAgIGo6IGN1cnJlbnRQYXJ0aWNpcGFudFsnaSddLFxuICAgICAgICAgIG46IHB1YmxpY0tleS5uLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRSh2WzBdLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUodVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IGNoYWluY29kZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0gYXMgTlNoYXJlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBkYXRhIHNoYXJlZCBkdXJpbmcgdGhlIGtleSBnZW5lcmF0aW9uIHByb3RvY29sLlxuICAgKiBAcGFyYW0ge0tleVNoYXJlfSBwYXJ0aWNpcGFudFNoYXJlcyBwcml2YXRlIHAtc2hhcmUgYW5kXG4gICAqIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHJldHVybnMge0tleUNvbWJpbmVkfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHgtc2hhcmVcbiAgICogYW5kIHktc2hhcmVzIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNpZ25pbmcgc2hhcmVzLlxuICAgKi9cbiAga2V5Q29tYmluZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10pOiBLZXlDb21iaW5lZCB7XG4gICAgY29uc3QgYWxsU2hhcmVzID0gW3BTaGFyZSwgLi4ublNoYXJlc107XG4gICAgLy8gQ29tcHV0ZSB0aGUgcHVibGljIGtleS5cbiAgICBjb25zdCB5ID0gYWxsU2hhcmVzLm1hcCgocGFydGljaXBhbnQpID0+IGhleFRvQmlnSW50KHBhcnRpY2lwYW50Wyd5J10pKS5yZWR1Y2UoRWNkc2EuY3VydmUucG9pbnRBZGQpO1xuICAgIC8vIEFkZCBzZWNyZXQgc2hhcmVzXG4gICAgY29uc3QgeCA9IGFsbFNoYXJlcy5tYXAoKHBhcnRpY2lwYW50KSA9PiBoZXhUb0JpZ0ludChwYXJ0aWNpcGFudFsndSddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYhKV0sIHBTaGFyZS5pKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZyb20gcGFydGljaXBhbnQgJHtzaGFyZS5qfS4gVmVyaWZpY2F0aW9uIGVycm9yOiAke2Vycn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoYWluY29kZSB3aWxsIGJlIHVzZWQgaW4gZnV0dXJlIHdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIGtleSBkZXJpdmF0aW9uIGZvciBlY2RzYVxuICAgIGNvbnN0IGNoYWluY29kZXMgPSBbcFNoYXJlLCAuLi5uU2hhcmVzXS5tYXAoKHsgY2hhaW5jb2RlIH0pID0+IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShjaGFpbmNvZGUsICdoZXgnKSkpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGNoYWluY29kZXMucmVkdWNlKFxuICAgICAgKGFjYywgY2hhaW5jb2RlKSA9PlxuICAgICAgICAoYWNjICsgY2hhaW5jb2RlKSAlIEJpZ0ludCgnMHgwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKSAvLyAyXjI1NlxuICAgICk7XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudHM6IEtleUNvbWJpbmVkID0ge1xuICAgICAgeFNoYXJlOiB7XG4gICAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgICBsOiBwU2hhcmUubCxcbiAgICAgICAgbTogcFNoYXJlLm0sXG4gICAgICAgIG46IHBTaGFyZS5uLFxuICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoeCwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKGNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICB5U2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBzaGFyZSBpbiBuU2hhcmVzKSB7XG4gICAgICBjb25zdCBwYXJ0aWNpcGFudEluZGV4ID0gblNoYXJlc1tzaGFyZV1bJ2onXTtcbiAgICAgIHBhcnRpY2lwYW50cy55U2hhcmVzW3BhcnRpY2lwYW50SW5kZXhdID0ge1xuICAgICAgICBpOiBwU2hhcmUuaSxcbiAgICAgICAgajogblNoYXJlc1tzaGFyZV1bJ2onXSxcbiAgICAgICAgbjogblNoYXJlc1tzaGFyZV1bJ24nXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJ0aWNpcGFudHM7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlIHNoYXJlcyBmb3IgYSBCSVAtMzIgc3Via2V5LlxuICAgKiBAcGFyYW0ge1BTaGFyZX0gVGhlIHVzZXIncyBwLXNoYXJlLlxuICAgKiBAcGFyYW0ge05TaGFyZVtdfSBUaGUgbi1zaGFyZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgcGFydGljaXBhbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIEJJUC0zMiBwYXRoIHRvIGRlcml2ZS5cbiAgICogQHJldHVybnMge1N1YmtleVNoYXJlfSBSZXR1cm5zIHRoZSBwcml2YXRlIHgtc2hhcmUgYW5kIG4tc2hhcmVzIHRvXG4gICAqIGJlIGRpc3RyaWJ1dGVkIHRvIHBhcnRpY2lwYW50cyBhdCB0aGVpciBjb3JyZXNwb25kaW5nIGluZGV4LlxuICAgKi9cbiAga2V5RGVyaXZlKHBTaGFyZTogUFNoYXJlLCBuU2hhcmVzOiBOU2hhcmVbXSwgcGF0aDogc3RyaW5nKTogU3Via2V5U2hhcmUge1xuICAgIGNvbnN0IHlWYWx1ZXMgPSBbcFNoYXJlLCAuLi5uU2hhcmVzXS5tYXAoKHNoYXJlKSA9PiBoZXhUb0JpZ0ludChzaGFyZS55KSk7XG4gICAgY29uc3QgeSA9IHlWYWx1ZXMucmVkdWNlKChwYXJ0aWFsLCBzaGFyZSkgPT4gRWNkc2EuY3VydmUucG9pbnRBZGQocGFydGlhbCwgc2hhcmUpKTtcbiAgICBjb25zdCB1ID0gQmlnSW50KHBTaGFyZS51dSk7XG4gICAgbGV0IGNvbnRyaWJDaGFpbmNvZGUgPSBoZXhUb0JpZ0ludChwU2hhcmUuY2hhaW5jb2RlKTtcbiAgICBjb25zdCBjaGFpbmNvZGVzID0gW2NvbnRyaWJDaGFpbmNvZGUsIC4uLm5TaGFyZXMubWFwKCh7IGNoYWluY29kZSB9KSA9PiBoZXhUb0JpZ0ludChjaGFpbmNvZGUpKV07XG4gICAgY29uc3QgY2hhaW5jb2RlID0gY2hhaW5jb2Rlcy5yZWR1Y2UoKGFjYywgY2hhaW5jb2RlKSA9PiAoYWNjICsgY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2UpO1xuXG4gICAgLy8gVmVyaWZ5IHNoYXJlcy5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIG9mIG5TaGFyZXMpIHtcbiAgICAgIGlmIChzaGFyZS52KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRWNkc2Euc2hhbWlyLnZlcmlmeShoZXhUb0JpZ0ludChzaGFyZS51KSwgW2hleFRvQmlnSW50KHNoYXJlLnkpLCBoZXhUb0JpZ0ludChzaGFyZS52ISldLCBwU2hhcmUuaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZlcmlmeSBzaGFyZSBmcm9tIHBhcnRpY2lwYW50ICR7c2hhcmUuan0uIFZlcmlmaWNhdGlvbiBlcnJvcjogJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXJpdmUgc3Via2V5LlxuICAgIGNvbnN0IHN1YmtleSA9IEVjZHNhLmhkVHJlZS5wcml2YXRlRGVyaXZlKHsgcGs6IHksIHNrOiB1LCBjaGFpbmNvZGUgfSwgcGF0aCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHB1YmxpYyBrZXkgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNvbnRyaWJZID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChzdWJrZXkuc2spO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBjaGFpbmNvZGUgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNoYWluY29kZURlbHRhID0gKGNoYWluY29kZUJhc2UgKyBzdWJrZXkuY2hhaW5jb2RlIC0gY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2U7XG4gICAgY29udHJpYkNoYWluY29kZSA9IChjb250cmliQ2hhaW5jb2RlICsgY2hhaW5jb2RlRGVsdGEpICUgY2hhaW5jb2RlQmFzZTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgdSB2YWx1ZXMuXG4gICAgY29uc3QgeyBzaGFyZXM6IHNwbGl0X3UsIHYgfSA9IEVjZHNhLnNoYW1pci5zcGxpdChzdWJrZXkuc2ssIHBTaGFyZS50IHx8IDIsIHBTaGFyZS5jIHx8IDMpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBzaWduaW5nIGtleS5cbiAgICBjb25zdCB4ID0gW3NwbGl0X3VbcFNoYXJlLmldLCAuLi5uU2hhcmVzLm1hcCgoeyB1IH0pID0+IGhleFRvQmlnSW50KHUpKV0ucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICBjb25zdCBQX2k6IFhTaGFyZSA9IHtcbiAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgbDogcFNoYXJlLmwsXG4gICAgICBtOiBwU2hhcmUubSxcbiAgICAgIG46IHBTaGFyZS5uLFxuICAgICAgeTogYmlnSW50VG9CdWZmZXJCRShzdWJrZXkucGssIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHgsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBjaGFpbmNvZGU6IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2hhcmVzOiBTdWJrZXlTaGFyZSA9IHtcbiAgICAgIHhTaGFyZTogUF9pLFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAobGV0IGluZCA9IDA7IGluZCA8IG5TaGFyZXMubGVuZ3RoOyBpbmQrKykge1xuICAgICAgY29uc3QgUF9qID0gblNoYXJlc1tpbmRdO1xuICAgICAgc2hhcmVzLm5TaGFyZXNbUF9qLmpdID0ge1xuICAgICAgICBpOiBQX2ouaixcbiAgICAgICAgajogUF9pLmksXG4gICAgICAgIG46IFBfai5uLFxuICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHNwbGl0X3VbUF9qLmpdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJZLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHZbMF0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShjb250cmliQ2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgYSBjaGlsZCBjb21tb24ga2V5Y2hhaW4gZnJvbSBjb21tb24ga2V5Y2hhaW5cbiAgICpcbiAgICogQHBhcmFtIHtjb21tb25LZXljaGFpbn0gVGhlIGNvbW1vbiBrZXljaGFpbiBhcyBhIGhleCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7cGF0aH0gVGhlIEJJUC0zMiBwYXRoIHRvIGRlcml2ZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVyaXZlZCBjb21tb24ga2V5Y2hhaW4gYXMgYSBoZXggc3RyaW5nLlxuICAgKi9cbiAgZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChFY2RzYS5oZFRyZWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZGVyaXZlIGtleSB3aXRob3V0IEhEVHJlZSBpbXBsZW1lbnRhdGlvblwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbiA9IEJ1ZmZlci5mcm9tKGNvbW1vbktleWNoYWluLCAnaGV4Jyk7XG5cbiAgICBjb25zdCBkZXJpdmVkUHVibGljS2V5Y2hhaW4gPSBFY2RzYS5oZFRyZWUucHVibGljRGVyaXZlKFxuICAgICAge1xuICAgICAgICBwazogYmlnSW50RnJvbUJ1ZmZlckJFKGtleWNoYWluLnNsaWNlKDAsIDMzKSksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50RnJvbUJ1ZmZlckJFKGtleWNoYWluLnNsaWNlKDMzKSksXG4gICAgICB9LFxuICAgICAgcGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBkZXJpdmVkUGsgPSBiaWdJbnRUb0J1ZmZlckJFKGRlcml2ZWRQdWJsaWNLZXljaGFpbi5waywgMzMpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBkZXJpdmVkQ2hhaW5jb2RlID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHVibGljS2V5Y2hhaW4uY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgcmV0dXJuIGRlcml2ZWRQayArIGRlcml2ZWRDaGFpbmNvZGU7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGdpdmVuIHJhbmdlIHByb29mIGNoYWxsZW5nZSB0byB0aGUgc2hhcmVzIHByZXZpb3VzbHkgY3JlYXRlZFxuICAgKiBieSAja2V5Q29tYmluZS4gR2VuZXJhdGVzIGEgbmV3IGNoYWxsZW5nZSBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSB7WFNoYXJlfSB4U2hhcmUgUHJpdmF0ZSB4U2hhcmUgb2Ygc2lnbmVyXG4gICAqIEBwYXJhbSB7WVNoYXJlfSB5U2hhcmUgWVNoYXJlIG9mIHRoZSBvdGhlciBwYXJ0aWNpcGFudCBpbnZvbHZlZCBpblxuICAgKiB0aGlzIHNpZ25pbmcgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplZE50aWxkZX0gY2hhbGxlbmdlXG4gICAqIEByZXR1cm5zIHtLZXlDb21iaW5lZH0gVGhlIG5ldyBYU2hhcmUgYW5kIFlTaGFyZXMgd2l0aCB0aGUgYW1lbmRlZFxuICAgKiBjaGFsbGVuZ2UgdmFsdWVzXG4gICAqL1xuICBhc3luYyBhcHBlbmRDaGFsbGVuZ2UoeFNoYXJlOiBYU2hhcmUsIHlTaGFyZTogWVNoYXJlLCBjaGFsbGVuZ2U/OiBTZXJpYWxpemVkTnRpbGRlKTogUHJvbWlzZTxLZXlDb21iaW5lZFdpdGhOdGlsZGU+IHtcbiAgICBpZiAoIWNoYWxsZW5nZSkge1xuICAgICAgY2hhbGxlbmdlID0gRWNkc2Euc2VyaWFsaXplTnRpbGRlKGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5nZW5lcmF0ZU50aWxkZSgzMDcyKSk7XG4gICAgfVxuICAgIGNvbnN0IHsgbnRpbGRlLCBoMSwgaDIgfSA9IGNoYWxsZW5nZTtcbiAgICByZXR1cm4ge1xuICAgICAgeFNoYXJlOiB7IC4uLnhTaGFyZSwgbnRpbGRlLCBoMSwgaDIgfSxcbiAgICAgIHlTaGFyZXM6IHtcbiAgICAgICAgW3lTaGFyZS5qXToge1xuICAgICAgICAgIGk6IHlTaGFyZS5qLFxuICAgICAgICAgIGo6IHlTaGFyZS5pLFxuICAgICAgICAgIG46IHhTaGFyZS5uLFxuICAgICAgICAgIG50aWxkZSxcbiAgICAgICAgICBoMSxcbiAgICAgICAgICBoMixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgc2lnbmluZyBzaGFyZXMuXG4gICAqIEBwYXJhbSB7eFNoYXJlfSB4U2hhcmUgUHJpdmF0ZSB4U2hhcmUgb2YgY3VycmVudCBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICogQHBhcmFtIHtZU2hhcmV9IHlTaGFyZSB5U2hhcmUgY29ycmVzcG9uZGluZyB0byB0aGUgb3RoZXIgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqIEByZXR1cm5zIHtTaWduU2hhcmVSVH0gUmV0dXJucyB0aGUgcGFydGljaXBhbnQgcHJpdmF0ZSB3LXNoYXJlXG4gICAqIGFuZCBrLXNoYXJlIHRvIGJlIGRpc3RyaWJ1dGVkIHRvIG90aGVyIHBhcnRpY2lwYW50IHNpZ25lclxuICAgKi9cbiAgYXN5bmMgc2lnblNoYXJlKHhTaGFyZTogWFNoYXJlIHwgWFNoYXJlV2l0aE50aWxkZSwgeVNoYXJlOiBZU2hhcmVXaXRoTnRpbGRlKTogUHJvbWlzZTxTaWduU2hhcmVSVD4ge1xuICAgIGNvbnN0IHBrID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoeFNoYXJlLm4pKTtcblxuICAgIC8vIEdlbmVyYXRlIGEgY2hhbGxlbmdlIGlmIG50aWxkZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgeFNoYXJlLlxuICAgIGlmICghaGFzTnRpbGRlKHhTaGFyZSkpIHtcbiAgICAgIHhTaGFyZSA9IChhd2FpdCB0aGlzLmFwcGVuZENoYWxsZW5nZSh4U2hhcmUsIHlTaGFyZSkpLnhTaGFyZTtcbiAgICB9XG5cbiAgICBjb25zdCBrID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG4gICAgY29uc3QgcmsgPSBhd2FpdCByYW5kb21Db1ByaW1lVG8ocGsubik7XG4gICAgY29uc3QgY2sgPSBway5lbmNyeXB0KGssIHJrKTtcbiAgICBjb25zdCBnYW1tYSA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuXG4gICAgY29uc3QgZCA9IEVjZHNhLmN1cnZlLnNjYWxhck11bHQoRWNkc2EuY3VydmUuc2NhbGFyU3ViKEJpZ0ludCh5U2hhcmUuaiksIEJpZ0ludCh4U2hhcmUuaSkpLCBCaWdJbnQoeFNoYXJlLmkpKTtcblxuICAgIGNvbnN0IHcgPSBbXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KEJpZ0ludCh5U2hhcmUuaiksIEJpZ0ludCh4U2hhcmUuaSkpLFxuICAgICAgaGV4VG9CaWdJbnQoeFNoYXJlWyd4J10pLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFySW52ZXJ0KGQpLFxuICAgIF0ucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhck11bHQpO1xuXG4gICAgY29uc3QgeyBudGlsZGU6IG50aWxkZWEsIGgxOiBoMWEsIGgyOiBoMmEgfSA9IHhTaGFyZSBhcyBYU2hhcmVXaXRoTnRpbGRlO1xuXG4gICAgY29uc3Qgc2lnbmVyczogU2lnblNoYXJlUlQgPSB7XG4gICAgICB3U2hhcmU6IHtcbiAgICAgICAgaTogeFNoYXJlLmksXG4gICAgICAgIGw6IHhTaGFyZS5sLFxuICAgICAgICBtOiB4U2hhcmUubSxcbiAgICAgICAgbjogeFNoYXJlLm4sXG4gICAgICAgIHk6IHhTaGFyZS55LFxuICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgIGgxOiBoMWEsXG4gICAgICAgIGgyOiBoMmEsXG4gICAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2s6IGJpZ0ludFRvQnVmZmVyQkUoY2ssIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHcsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKGdhbW1hLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIGtTaGFyZToge30gYXMgS1NoYXJlLFxuICAgIH07XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYiwgaDE6IGgxYiwgaDI6IGgyYiB9ID0geVNoYXJlO1xuICAgIGNvbnN0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAzMDcyLFxuICAgICAgcGssXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogaGV4VG9CaWdJbnQobnRpbGRlYiksXG4gICAgICAgIGgxOiBoZXhUb0JpZ0ludChoMWIpLFxuICAgICAgICBoMjogaGV4VG9CaWdJbnQoaDJiKSxcbiAgICAgIH0sXG4gICAgICBjayxcbiAgICAgIGssXG4gICAgICBya1xuICAgICk7XG4gICAgY29uc3QgcHJvb2ZTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgc2lnbmVycy5rU2hhcmUgPSB7XG4gICAgICBpOiB5U2hhcmUuaixcbiAgICAgIGo6IHhTaGFyZS5pLFxuICAgICAgbjogcGsubi50b1N0cmluZygxNiksXG4gICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICBoMTogaDFhLFxuICAgICAgaDI6IGgyYSxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoY2ssIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgcHJvb2Y6IHByb29mU2hhcmUsXG4gICAgfTtcblxuICAgIHJldHVybiBzaWduZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXJcbiAgICogc2lnbmVyLlxuICAgKiBAcGFyYW0ge1NpZ25Db252ZXJ0fVxuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0KHNoYXJlczogU2lnbkNvbnZlcnQpOiBQcm9taXNlPFNpZ25Db252ZXJ0UlQ+IHtcbiAgICBsZXQgc2hhcmVQYXJ0aWNpcGFudDogUGFydGlhbDxCU2hhcmU+IHwgUGFydGlhbDxHU2hhcmU+LCBzaGFyZVRvQmVTZW50OiBQYXJ0aWFsPEFTaGFyZT4gfCBNVVNoYXJlO1xuICAgIGxldCBpc0dhbW1hU2hhcmUgPSBmYWxzZTtcbiAgICBsZXQga1NoYXJlOiBQYXJ0aWFsPEtTaGFyZT4gPSB7fTtcbiAgICBpZiAoc2hhcmVzLnhTaGFyZSAmJiBzaGFyZXMueVNoYXJlICYmIHNoYXJlcy5rU2hhcmUpIHtcbiAgICAgIGNvbnN0IHhTaGFyZSA9IHNoYXJlcy54U2hhcmU7IC8vIGN1cnJlbnRQYXJ0aWNpcGFudCBzZWNyZXQgeFNoYXJlXG4gICAgICBjb25zdCB5U2hhcmUgPSB7XG4gICAgICAgIC4uLnNoYXJlcy55U2hhcmUsXG4gICAgICAgIG50aWxkZTogc2hhcmVzLmtTaGFyZS5udGlsZGUsXG4gICAgICAgIGgxOiBzaGFyZXMua1NoYXJlLmgxLFxuICAgICAgICBoMjogc2hhcmVzLmtTaGFyZS5oMixcbiAgICAgIH07XG4gICAgICBjb25zdCBzaWduU2hhcmUgPSBhd2FpdCB0aGlzLnNpZ25TaGFyZSh4U2hhcmUsIHlTaGFyZSk7XG4gICAgICBrU2hhcmUgPSBzaWduU2hhcmUua1NoYXJlO1xuICAgICAgc2hhcmVUb0JlU2VudCA9IHsgLi4uc2hhcmVzLmtTaGFyZSB9IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQgPSB7IC4uLnNpZ25TaGFyZS53U2hhcmUgfSBhcyBQYXJ0aWFsPEJTaGFyZT47XG4gICAgfSBlbHNlIGlmICgoc2hhcmVzLmJTaGFyZSAmJiBzaGFyZXMubXVTaGFyZSkgfHwgKHNoYXJlcy5hU2hhcmUgJiYgc2hhcmVzLndTaGFyZSkpIHtcbiAgICAgIGlzR2FtbWFTaGFyZSA9IHRydWU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0gc2hhcmVzLmFTaGFyZSA/ICh7IC4uLnNoYXJlcy5hU2hhcmUgfSBhcyBNVVNoYXJlKSA6ICh7IC4uLnNoYXJlcy5tdVNoYXJlIH0gYXMgTVVTaGFyZSk7XG4gICAgICBzaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVzLndTaGFyZSA/ICh7IC4uLnNoYXJlcy53U2hhcmUgfSBhcyBQYXJ0aWFsPEdTaGFyZT4pIDogKHsgLi4uc2hhcmVzLmJTaGFyZSB9IGFzIEdTaGFyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25maWcgZm9yIFNpZ24gQ29udmVydCcpO1xuICAgIH1cbiAgICBpZiAoc2hhcmVQYXJ0aWNpcGFudC5pICE9PSBzaGFyZVRvQmVTZW50LmkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2hhcmVzIGZyb20gc2FtZSBwYXJ0aWNpcGFudCcpO1xuICAgIH1cbiAgICBpZiAoKHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlKS5hbHBoYSkge1xuICAgICAgY29uc3QgYlNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZTtcbiAgICAgIGNvbnN0IGFTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBBU2hhcmU7XG4gICAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5uKSk7XG4gICAgICBsZXQgbnRpbGRlYSwgaDFhLCBoMmEsIGNrO1xuICAgICAgaWYgKGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSkge1xuICAgICAgICBudGlsZGVhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKTtcbiAgICAgICAgaDFhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgICAgICBoMmEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICAgIGNrID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuY2spO1xuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5ICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGlmIChcbiAgICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgICAgMzA3MixcbiAgICAgICAgICBwa2EsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnopLFxuICAgICAgICAgICAgenBybTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi56cHJtKSxcbiAgICAgICAgICAgIHQ6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgICB2OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnYpLFxuICAgICAgICAgICAgdzogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi53KSxcbiAgICAgICAgICAgIHM6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgICBzMjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zMiksXG4gICAgICAgICAgICB0MTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgICB0MjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2ssXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuYWxwaGEpLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YueClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaWduaW5nIHNoYXJlIGZvciBnYW1tYSBwcm9vZicpO1xuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5ICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICAzMDcyLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi56KSxcbiAgICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi56cHJtKSxcbiAgICAgICAgICAgIHQ6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50KSxcbiAgICAgICAgICAgIHY6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi52KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi53KSxcbiAgICAgICAgICAgIHM6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zKSxcbiAgICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zMiksXG4gICAgICAgICAgICB0MTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQxKSxcbiAgICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudDIpLFxuICAgICAgICAgICAgdTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2ssXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi54KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNrID0gbmV3IHBhaWxsaWVyQmlnaW50LlByaXZhdGVLZXkoXG4gICAgICAgIGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmwgYXMgc3RyaW5nKSxcbiAgICAgICAgaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubSBhcyBzdHJpbmcpLFxuICAgICAgICBwa2FcbiAgICAgICk7XG4gICAgICBjb25zdCBnU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgR1NoYXJlO1xuICAgICAgY29uc3QgbXVTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBNVVNoYXJlO1xuICAgICAgY29uc3QgYWxwaGEgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmFscGhhKSk7XG4gICAgICBnU2hhcmVQYXJ0aWNpcGFudC5hbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGFscGhhKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IG11ID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSBhcyBzdHJpbmcpKTsgLy8gcmVjaGVjayBlbmNyeXB0ZWQgbnVtYmVyXG4gICAgICBnU2hhcmVQYXJ0aWNpcGFudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG11KSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBQYXJ0aWFsPEdTaGFyZT47XG4gICAgICBjb25zdCBwYXJ0aWFsU2hhcmVUb0JlU2VudCA9IG11U2hhcmVUb0JlU2VudCBhcyBQYXJ0aWFsPE1VU2hhcmU+O1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lmw7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5hbHBoYTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5tdTtcbiAgICB9XG4gICAgaWYgKChzaGFyZVRvQmVTZW50IGFzIEFTaGFyZSkuaykge1xuICAgICAgY29uc3QgYlNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZTtcbiAgICAgIGNvbnN0IGFTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBBU2hhcmU7XG4gICAgICBjb25zdCBuID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubik7IC8vIFBhaWxsaWVyIHB1YiBmcm9tIG90aGVyIHNpZ25lclxuICAgICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkobik7XG4gICAgICBsZXQgbnRpbGRlYSwgaDFhLCBoMmEsIG50aWxkZWIsIGgxYiwgaDJiO1xuICAgICAgaWYgKGFTaGFyZVRvQmVTZW50Lm50aWxkZSkge1xuICAgICAgICBudGlsZGVhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubnRpbGRlKTtcbiAgICAgICAgaDFhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDEpO1xuICAgICAgICBoMmEgPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5oMik7XG4gICAgICAgIG50aWxkZWIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgICAgICBoMWIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICAgIGgyYiA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmgyKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5rKTtcbiAgICAgIGlmIChcbiAgICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnkoXG4gICAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgICAgMzA3MixcbiAgICAgICAgICBwa2EsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbnRpbGRlOiBudGlsZGViLFxuICAgICAgICAgICAgaDE6IGgxYixcbiAgICAgICAgICAgIGgyOiBoMmIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi56KSxcbiAgICAgICAgICAgIHU6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnUpLFxuICAgICAgICAgICAgdzogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YudyksXG4gICAgICAgICAgICBzOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi5zKSxcbiAgICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi5zMSksXG4gICAgICAgICAgICBzMjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YuczIpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAga1xuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgICAgfVxuICAgICAgLy8gTXRBICRrX2osIFxcZ2FtbWFfaSQuXG4gICAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICAgIGJTaGFyZVBhcnRpY2lwYW50LmJldGEgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UoYmV0YTApKSwgMzIpLnRvU3RyaW5nKFxuICAgICAgICAnaGV4J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGcgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5nYW1tYSk7XG4gICAgICBjb25zdCByYiA9IGF3YWl0IHJhbmRvbUNvUHJpbWVUbyhwa2Eubik7XG4gICAgICBjb25zdCBjYiA9IHBrYS5lbmNyeXB0KGJldGEwLCByYik7XG4gICAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICAgIGFTaGFyZVRvQmVTZW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IGd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnKTtcbiAgICAgIGxldCBwcm9vZjogUmFuZ2VQcm9vZldpdGhDaGVjaztcbiAgICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgMzA3MixcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAgayxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGcsXG4gICAgICAgIGJldGEwLFxuICAgICAgICByYixcbiAgICAgICAgZ3hcbiAgICAgICk7XG4gICAgICBPYmplY3QuYXNzaWduKGFTaGFyZVRvQmVTZW50LCB7XG4gICAgICAgIGdhbW1hUHJvb2Y6IHtcbiAgICAgICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRShneCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgLy8gTXRBICRrX2osIHdfaSQuXG4gICAgICBjb25zdCBudTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgICBzaGFyZVBhcnRpY2lwYW50Lm51ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG51MCkpLCAzMikudG9TdHJpbmcoXG4gICAgICAgICdoZXgnXG4gICAgICApO1xuICAgICAgY29uc3QgdyA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LncpO1xuICAgICAgY29uc3Qgcm4gPSBhd2FpdCByYW5kb21Db1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY24gPSBwa2EuZW5jcnlwdChudTAsIHJuKTtcbiAgICAgIGNvbnN0IG11ID0gcGthLmFkZGl0aW9uKHBrYS5tdWx0aXBseShrLCB3KSwgY24pO1xuICAgICAgc2hhcmVUb0JlU2VudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IHd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh3KTtcbiAgICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgMzA3MixcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAgayxcbiAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICB3LFxuICAgICAgICBudTAsXG4gICAgICAgIHJuLFxuICAgICAgICB3eFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2hhcmVUb0JlU2VudCwge1xuICAgICAgICB3UHJvb2Y6IHtcbiAgICAgICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKChzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSkuYWxwaGEpIHtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm50aWxkZTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgxO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5jaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm47XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5udGlsZGU7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5oMTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmgyO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LnByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzaGFyZVRvQmVTZW50LCB7XG4gICAgICAgICAgbjoga1NoYXJlLm4sXG4gICAgICAgICAgbnRpbGRlOiBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGgxOiBiaWdJbnRUb0J1ZmZlckJFKGgxYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaDI6IGJpZ0ludFRvQnVmZmVyQkUoaDJiLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBrOiBrU2hhcmUuayxcbiAgICAgICAgICBwcm9vZjoga1NoYXJlLnByb29mLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoJ2FscGhhJyBpbiBzaGFyZVRvQmVTZW50KSAmJiAhKCdrJyBpbiBzaGFyZVRvQmVTZW50KSkge1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5udGlsZGU7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuY2s7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0ge1xuICAgICAgICBpOiBtdVNoYXJlVG9CZVNlbnQuaSxcbiAgICAgICAgajogbXVTaGFyZVRvQmVTZW50LmosXG4gICAgICB9IGFzIE1VU2hhcmU7XG4gICAgfVxuICAgIFtzaGFyZVRvQmVTZW50LmksIHNoYXJlVG9CZVNlbnQual0gPSBbc2hhcmVUb0JlU2VudC5qLCBzaGFyZVRvQmVTZW50LmldO1xuICAgIGlmIChpc0dhbW1hU2hhcmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG11U2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZSxcbiAgICAgICAgZ1NoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlLFxuICAgICAgYlNoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgZ2FtbWEgc2hhcmVzIHRvIGdldCB0aGUgcHJpdmF0ZSBvbWljcm9uIC8gZGVsdGEgc2hhcmVzXG4gICAqIEBwYXJhbSB7U2lnbkNvbWJpbmV9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbWJpbmVSVH1cbiAgICovXG4gIHNpZ25Db21iaW5lKHNoYXJlczogU2lnbkNvbWJpbmUpOiBTaWduQ29tYmluZVJUIHtcbiAgICBjb25zdCBnU2hhcmUgPSBzaGFyZXMuZ1NoYXJlO1xuICAgIGNvbnN0IFMgPSBzaGFyZXMuc2lnbkluZGV4O1xuICAgIGNvbnN0IGdhbW1hID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmdhbW1hKTtcbiAgICBjb25zdCBhbHBoYSA9IGhleFRvQmlnSW50KGdTaGFyZS5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9IGhleFRvQmlnSW50KGdTaGFyZS5iZXRhKTtcbiAgICBjb25zdCBtdSA9IGhleFRvQmlnSW50KGdTaGFyZS5tdSk7XG4gICAgY29uc3QgbnUgPSBoZXhUb0JpZ0ludChnU2hhcmUubnUpO1xuICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChnU2hhcmUuayk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KGdTaGFyZS53KTtcblxuICAgIGNvbnN0IGRlbHRhID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgZ2FtbWEpLCBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoYWxwaGEsIGJldGEpKTtcbiAgICBjb25zdCBvbWljcm9uID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgdyksIEVjZHNhLmN1cnZlLnNjYWxhckFkZChtdSwgbnUpKTtcbiAgICBjb25zdCBHYW1tYSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZ2FtbWEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9TaGFyZToge1xuICAgICAgICBpOiBnU2hhcmUuaSxcbiAgICAgICAgeTogZ1NoYXJlLnksXG4gICAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgb21pY3JvbjogYmlnSW50VG9CdWZmZXJCRShvbWljcm9uLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZWx0YTogYmlnSW50VG9CdWZmZXJCRShkZWx0YSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgR2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoR2FtbWEsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgZFNoYXJlOiB7XG4gICAgICAgIGk6IFMuaSxcbiAgICAgICAgajogZ1NoYXJlLmksXG4gICAgICAgIGRlbHRhOiBiaWdJbnRUb0J1ZmZlckJFKGRlbHRhLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBHYW1tYTogYmlnSW50VG9CdWZmZXJCRShHYW1tYSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IE0gTWVzc2FnZSB0byBiZSBzaWduZWRcbiAgICogQHBhcmFtIHtPU2hhcmV9IG9TaGFyZSBwcml2YXRlIG9taWNyb24gc2hhcmUgb2YgY3VycmVudCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge0RTaGFyZX0gZFNoYXJlIGRlbHRhIHNoYXJlIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhc2ggaWYgdHJ1ZSwgd2UgaGFzaCB0aGUgcHJvdmlkZWQgYnVmZmVyIGJlZm9yZSBzaWduaW5nXG4gICAqIEByZXR1cm5zIHtTU2hhcmV9XG4gICAqL1xuICBzaWduKE06IEJ1ZmZlciwgb1NoYXJlOiBPU2hhcmUsIGRTaGFyZTogRFNoYXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBTU2hhcmUge1xuICAgIGNvbnN0IG0gPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShNKS5kaWdlc3QoKSA6IE07XG5cbiAgICBjb25zdCBkZWx0YSA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChoZXhUb0JpZ0ludChvU2hhcmUuZGVsdGEpLCBoZXhUb0JpZ0ludChkU2hhcmUuZGVsdGEpKTtcblxuICAgIGNvbnN0IFIgPSBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KFxuICAgICAgRWNkc2EuY3VydmUucG9pbnRBZGQoaGV4VG9CaWdJbnQob1NoYXJlLkdhbW1hKSwgaGV4VG9CaWdJbnQoZFNoYXJlLkdhbW1hKSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJJbnZlcnQoZGVsdGEpXG4gICAgKTtcbiAgICBjb25zdCBwb2ludFIgPSBzZWNwLlBvaW50LmZyb21IZXgoYmlnSW50VG9CdWZmZXJCRShSLCAzMikpO1xuICAgIGNvbnN0IHIgPSBwb2ludFIueDtcblxuICAgIGNvbnN0IHMgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KGJpZ0ludEZyb21VOEFCRShtKSwgaGV4VG9CaWdJbnQob1NoYXJlLmspKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQociwgaGV4VG9CaWdJbnQob1NoYXJlLm9taWNyb24pKVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGk6IG9TaGFyZS5pLFxuICAgICAgeTogb1NoYXJlLnksXG4gICAgICBSOiBwb2ludFIudG9IZXgodHJ1ZSksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgZnVsbCBzaWduYXR1cmUgYnkgY29tYmluaW5nIFNpZ24gU2hhcmVzXG4gICAqIEBwYXJhbSB7U1NoYXJlW119IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbmF0dXJlfVxuICAgKi9cbiAgY29uc3RydWN0U2lnbmF0dXJlKHNoYXJlczogU1NoYXJlW10pOiBTaWduYXR1cmUge1xuICAgIC8vIEV2ZXJ5IFIgbXVzdCBtYXRjaC5cbiAgICBjb25zdCBSID0gc2hhcmVzWzBdWydSJ107XG4gICAgY29uc3QgaXNSTWF0Y2hpbmcgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gc2hhcmVbJ1InXSA9PT0gUikucmVkdWNlKChhLCBiKSA9PiBhICYmIGIpO1xuICAgIGlmICghaXNSTWF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUiB2YWx1ZSBzaG91bGQgYmUgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHNoYXJlcycpO1xuICAgIH1cblxuICAgIGxldCBzID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IGhleFRvQmlnSW50KHNoYXJlWydzJ10pKS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyQWRkKTtcbiAgICBjb25zdCByZWNpZCA9IChSLnNsaWNlKDAsIDIpID09PSAnMDMnID8gMSA6IDApIF4gKHMgPiBFY2RzYS5jdXJ2ZS5vcmRlcigpIC8gQmlnSW50KDIpID8gMSA6IDApO1xuXG4gICAgLy8gTm9ybWFsaXplIHMuXG4gICAgcyA9IHMgPiBFY2RzYS5jdXJ2ZS5vcmRlcigpIC8gQmlnSW50KDIpID8gRWNkc2EuY3VydmUub3JkZXIoKSAtIHMgOiBzO1xuICAgIHJldHVybiB7XG4gICAgICB5OiBzaGFyZXNbMF1bJ3knXSxcbiAgICAgIHI6IFIuc2xpY2UoMiksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICByZWNpZDogcmVjaWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgZWNkc2Egc2lnbmF0dXJlc1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWVzc2FnZVxuICAgKiBAcGFyYW0ge1NpZ25hdHVyZSB9IHNpZ25hdHVyZVxuICAgKiBAcGFyYW0ge0hhc2h9IGhhc2ggaGFzaGluZyBhbGdvcml0aG0gaW1wbGVtZW50aW5nIE5vZGVgcyBzdGFuZGFyZCBjcnlwdG8gaGFzaCBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRIYXNoIGlmIHRydWUsIHdlIGhhc2ggdGhlIHByb3ZpZGVkIGJ1ZmZlciBiZWZvcmUgdmVyaWZ5aW5nXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZDsgRmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2ZXJpZnkobWVzc2FnZTogQnVmZmVyLCBzaWduYXR1cmU6IFNpZ25hdHVyZSwgaGFzaD86IEhhc2gsIHNob3VsZEhhc2ggPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVzc2FnZVRvVmVyaWZ5ID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUobWVzc2FnZSkuZGlnZXN0KCkgOiBtZXNzYWdlO1xuICAgIHJldHVybiBFY2RzYS5jdXJ2ZS52ZXJpZnkoXG4gICAgICBtZXNzYWdlVG9WZXJpZnksXG4gICAgICBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgQnVmZmVyLmZyb20oW3NpZ25hdHVyZVsncmVjaWQnXV0pLFxuICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKGhleFRvQmlnSW50KHNpZ25hdHVyZVsnciddKSwgMzIpLFxuICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKGhleFRvQmlnSW50KHNpZ25hdHVyZVsncyddKSwgMzIpLFxuICAgICAgXSksXG4gICAgICBoZXhUb0JpZ0ludChzaWduYXR1cmVbJ3knXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBhIGNoYWxsZW5nZSBhbmQgaXQncyBwcm9vZnMgZnJvbSBoZXggc3RyaW5ncyB0byBiaWdpbnRcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2U6IFNlcmlhbGl6ZWROdGlsZGUpOiBEZXNlcmlhbGl6ZWROdGlsZGUge1xuICAgIGNvbnN0IGRlc2VyaWFsaXplZE50aWxkZTogRGVzZXJpYWxpemVkTnRpbGRlID0ge1xuICAgICAgbnRpbGRlOiBoZXhUb0JpZ0ludChjaGFsbGVuZ2UubnRpbGRlKSxcbiAgICAgIGgxOiBoZXhUb0JpZ0ludChjaGFsbGVuZ2UuaDEpLFxuICAgICAgaDI6IGhleFRvQmlnSW50KGNoYWxsZW5nZS5oMiksXG4gICAgfTtcbiAgICBpZiAoY2hhbGxlbmdlLm50aWxkZVByb29mKSB7XG4gICAgICBkZXNlcmlhbGl6ZWROdGlsZGUubnRpbGRlUHJvb2YgPSB7XG4gICAgICAgIGgxV3J0SDI6IHtcbiAgICAgICAgICBhbHBoYTogY29udmVydEhleEFyclRvQmlnSW50QXJyKGNoYWxsZW5nZS5udGlsZGVQcm9vZi5oMVdydEgyLmFscGhhKSxcbiAgICAgICAgICB0OiBjb252ZXJ0SGV4QXJyVG9CaWdJbnRBcnIoY2hhbGxlbmdlLm50aWxkZVByb29mLmgxV3J0SDIudCksXG4gICAgICAgIH0sXG4gICAgICAgIGgyV3J0SDE6IHtcbiAgICAgICAgICBhbHBoYTogY29udmVydEhleEFyclRvQmlnSW50QXJyKGNoYWxsZW5nZS5udGlsZGVQcm9vZi5oMldydEgxLmFscGhhKSxcbiAgICAgICAgICB0OiBjb252ZXJ0SGV4QXJyVG9CaWdJbnRBcnIoY2hhbGxlbmdlLm50aWxkZVByb29mLmgyV3J0SDEudCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkTnRpbGRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBjaGFsbGVuZ2UgYW5kIGl0J3MgcHJvb2ZzIGZyb20gYmlnIGludCB0byBoZXggc3RyaW5ncy5cbiAgICogQHBhcmFtIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2U6IERlc2VyaWFsaXplZE50aWxkZSk6IFNlcmlhbGl6ZWROdGlsZGUge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWROdGlsZGU6IFNlcmlhbGl6ZWROdGlsZGUgPSB7XG4gICAgICBudGlsZGU6IGJpZ0ludFRvSGV4KGNoYWxsZW5nZS5udGlsZGUpLFxuICAgICAgaDE6IGJpZ0ludFRvSGV4KGNoYWxsZW5nZS5oMSksXG4gICAgICBoMjogYmlnSW50VG9IZXgoY2hhbGxlbmdlLmgyKSxcbiAgICB9O1xuICAgIGlmIChjaGFsbGVuZ2UubnRpbGRlUHJvb2YpIHtcbiAgICAgIHNlcmlhbGl6ZWROdGlsZGUubnRpbGRlUHJvb2YgPSB7XG4gICAgICAgIGgxV3J0SDI6IHtcbiAgICAgICAgICBhbHBoYTogY29udmVydEJpZ0ludEFyclRvSGV4QXJyKGNoYWxsZW5nZS5udGlsZGVQcm9vZi5oMVdydEgyLmFscGhhKSxcbiAgICAgICAgICB0OiBjb252ZXJ0QmlnSW50QXJyVG9IZXhBcnIoY2hhbGxlbmdlLm50aWxkZVByb29mLmgxV3J0SDIudCksXG4gICAgICAgIH0sXG4gICAgICAgIGgyV3J0SDE6IHtcbiAgICAgICAgICBhbHBoYTogY29udmVydEJpZ0ludEFyclRvSGV4QXJyKGNoYWxsZW5nZS5udGlsZGVQcm9vZi5oMldydEgxLmFscGhhKSxcbiAgICAgICAgICB0OiBjb252ZXJ0QmlnSW50QXJyVG9IZXhBcnIoY2hhbGxlbmdlLm50aWxkZVByb29mLmgyV3J0SDEudCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZE50aWxkZTtcbiAgfVxufVxuIl19
|
|
1111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBa0Q7QUFDbEQsdUVBQXlEO0FBQ3pELHVEQUF5QztBQUN6Qyx5Q0FBNEQ7QUFDNUQsbUNBQXVEO0FBQ3ZELG1EQUE2QztBQUM3QyxxQ0FBeUc7QUFDekcseUNBQThDO0FBQzlDLDBEQUFrQztBQUNsQyx5REFPaUM7QUFrQ2pDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0Qjs7R0FFRztBQUNILE1BQXFCLEtBQUs7SUFJeEI7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLElBQWEsRUFBRSxJQUFJLEdBQUcsS0FBSzs7UUFDN0YsSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ25GLE1BQU0seUJBQXlCLENBQUM7U0FDakM7UUFFRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7U0FDakU7UUFFRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRTtZQUM1QixrRUFBa0U7WUFDbEUsbUJBQW1CLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDbEU7UUFFRCxrREFB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LENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUN2RCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNsRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNoRCxDQUFDLEVBQUUsdUJBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQzVDO2FB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ICogYXMgcGFpbGxpZXJCaWdpbnQgZnJvbSAncGFpbGxpZXItYmlnaW50JztcbmltcG9ydCAqIGFzIGJpZ2ludENyeXB0b1V0aWxzIGZyb20gJ2JpZ2ludC1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0ICogYXMgc2VjcCBmcm9tICdAbm9ibGUvc2VjcDI1NmsxJztcbmltcG9ydCBIRFRyZWUsIHsgQklQMzIsIGNoYWluY29kZUJhc2UgfSBmcm9tICcuLi8uLi9oZFRyZWUnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBiaWdJbnRGcm9tQnVmZmVyQkUsIGJpZ0ludEZyb21VOEFCRSwgYmlnSW50VG9CdWZmZXJCRSwgZ2V0UGFpbGxpZXJQdWJsaWNLZXkgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IFNlY3AyNTZrMUN1cnZlIH0gZnJvbSAnLi4vLi4vY3VydmVzJztcbmltcG9ydCBTaGFtaXIgZnJvbSAnLi4vLi4vc2hhbWlyJztcbmltcG9ydCB7XG4gIEVjZHNhUGFpbGxpZXJQcm9vZixcbiAgRWNkc2FSYW5nZVByb29mLFxuICBFY2RzYVR5cGVzLFxuICByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyxcbiAgaGV4VG9CaWdJbnQsXG4gIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIEFTaGFyZSxcbiAgQlNoYXJlLFxuICBEU2hhcmUsXG4gIEdTaGFyZSxcbiAgS2V5Q29tYmluZWQsXG4gIEtleVNoYXJlLFxuICBLU2hhcmUsXG4gIE1VU2hhcmUsXG4gIE5TaGFyZSxcbiAgT1NoYXJlLFxuICBQU2hhcmUsXG4gIFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSxcbiAgU2lnbmF0dXJlLFxuICBTaWduQ29tYmluZSxcbiAgU2lnbkNvbWJpbmVSVCxcbiAgU2lnbkNvbnZlcnQsXG4gIFNpZ25Db252ZXJ0UlQsXG4gIFNpZ25Db252ZXJ0U3RlcDEsXG4gIFNpZ25Db252ZXJ0U3RlcDFSZXNwb25zZSxcbiAgU2lnbkNvbnZlcnRTdGVwMixcbiAgU2lnbkNvbnZlcnRTdGVwMlJlc3BvbnNlLFxuICBTaWduQ29udmVydFN0ZXAzLFxuICBTaWduQ29udmVydFN0ZXAzUmVzcG9uc2UsXG4gIFNpZ25TaGFyZVJULFxuICBTU2hhcmUsXG4gIFN1YmtleVNoYXJlLFxuICBXU2hhcmUsXG4gIFhTaGFyZSxcbiAgWFNoYXJlV2l0aENoYWxsZW5nZXMsXG4gIFlTaGFyZVdpdGhDaGFsbGVuZ2VzLFxufSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgXzVuID0gQmlnSW50KDUpO1xuXG4vKipcbiAqIEVDRFNBIFRTUyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0aW5nIDI6biBUaHJlc2hvbGRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWNkc2Ege1xuICBzdGF0aWMgY3VydmU6IFNlY3AyNTZrMUN1cnZlID0gbmV3IFNlY3AyNTZrMUN1cnZlKCk7XG4gIHN0YXRpYyBoZFRyZWU6IEhEVHJlZSA9IG5ldyBCSVAzMigpO1xuICBzdGF0aWMgc2hhbWlyOiBTaGFtaXIgPSBuZXcgU2hhbWlyKEVjZHNhLmN1cnZlKTtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNoYXJlcyBmb3IgcGFydGljaXBhbnQgYXQgaW5kZXggYW5kIHNwbGl0IGtleXMgYCh0aHJlc2hvbGQsbnVtU2hhcmVzKWAgd2F5cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHBhcnRpY2lwYW50IGluZGV4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aHJlc2hvbGQgU2lnbmluZyB0aHJlc2hvbGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bVNoYXJlcyAgTnVtYmVyIG9mIHNoYXJlc1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gc2VlZCBvcHRpb25hbCA2NCBieXRlIHNlZWQgdG8gdXNlIGZvciBrZXkgZ2VuZXJhdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN5bmMgb3B0aW9uYWwgc3luYyBmbGFnLCBpZiB0cnVlIHRoZW4gYSBzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIFBhaWxsaWVyIGtleSBnZW5lcmF0aW9uIGlzIHVzZWQgdGhhdCBkb2VzIG5vdCBzcGF3biBXb3JrZXIgdGhyZWFkcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8S2V5U2hhcmU+fSBSZXR1cm5zIHRoZSBwcml2YXRlIHAtc2hhcmVcbiAgICogYW5kIG4tc2hhcmVzIHRvIGJlIGRpc3RyaWJ1dGVkIHRvIHBhcnRpY2lwYW50cyBhdCB0aGVpciBjb3JyZXNwb25kaW5nIGluZGV4LlxuICAgKi9cbiAgYXN5bmMga2V5U2hhcmUoaW5kZXg6IG51bWJlciwgdGhyZXNob2xkOiBudW1iZXIsIG51bVNoYXJlczogbnVtYmVyLCBzZWVkPzogQnVmZmVyLCBzeW5jID0gZmFsc2UpOiBQcm9taXNlPEtleVNoYXJlPiB7XG4gICAgaWYgKCEoaW5kZXggPiAwICYmIGluZGV4IDw9IG51bVNoYXJlcyAmJiB0aHJlc2hvbGQgPD0gbnVtU2hhcmVzICYmIHRocmVzaG9sZCA9PT0gMikpIHtcbiAgICAgIHRocm93ICdJbnZhbGlkIEtleVNoYXJlIENvbmZpZyc7XG4gICAgfVxuXG4gICAgaWYgKHNlZWQgJiYgc2VlZC5sZW5ndGggPCA2NCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWVkIG11c3QgaGF2ZSBhIGxlbmd0aCBvZiBhdCBsZWFzdCA2NCBieXRlcycpO1xuICAgIH1cblxuICAgIGxldCBzZWVkV2l0aFZhbGlkTGVuZ3RoID0gc2VlZDtcbiAgICBpZiAoc2VlZCAmJiBzZWVkLmxlbmd0aCA+IDY0KSB7XG4gICAgICAvLyBpZiBzZWVkIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gNjQgYnl0ZXMsIGhhc2ggc2VlZCB0byA2NCBieXRlcy5cbiAgICAgIHNlZWRXaXRoVmFsaWRMZW5ndGggPSBjcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc2VlZCkuZGlnZXN0KCk7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgYWRkaXRpdmVseSBob21vbW9ycGhpYyBlbmNyeXB0aW9uIGtleS5cbiAgICBsZXQgcGFpbGxpZXJLZXlQYWlyOiBwYWlsbGllckJpZ2ludC5LZXlQYWlyO1xuICAgIGlmICghc3luYykge1xuICAgICAgcGFpbGxpZXJLZXlQYWlyID0gYXdhaXQgcGFpbGxpZXJCaWdpbnQuZ2VuZXJhdGVSYW5kb21LZXlzKG1pbk1vZHVsdXNCaXRMZW5ndGgsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWlsbGllcktleVBhaXIgPSBwYWlsbGllckJpZ2ludC5nZW5lcmF0ZVJhbmRvbUtleXNTeW5jKG1pbk1vZHVsdXNCaXRMZW5ndGgsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCB7IHB1YmxpY0tleSwgcHJpdmF0ZUtleSB9ID0gcGFpbGxpZXJLZXlQYWlyO1xuICAgIC8vIEFjY2VwdCBhIDY0IGJ5dGUgc2VlZCBhbmQgY3JlYXRlIGFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGZyb20gdGhhdCBzZWVkXG4gICAgY29uc3Qgc2VjcmV0S2V5ID0gc2VlZFdpdGhWYWxpZExlbmd0aCAmJiBiaXAzMi5mcm9tU2VlZChzZWVkV2l0aFZhbGlkTGVuZ3RoKTtcbiAgICBjb25zdCB1ID1cbiAgICAgIChzZWNyZXRLZXkgJiYgc2VjcmV0S2V5LnByaXZhdGVLZXkgJiYgYmlnSW50RnJvbVU4QUJFKG5ldyBVaW50OEFycmF5KHNlY3JldEtleS5wcml2YXRlS2V5KSkpID8/XG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcbiAgICBjb25zdCB5ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh1KTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSAoc2VjcmV0S2V5ICYmIHNlY3JldEtleS5jaGFpbkNvZGUpID8/IHJhbmRvbUJ5dGVzKDMyKTtcbiAgICAvLyBDb21wdXRlIHNlY3JldCBzaGFyZXMgb2YgdGhlIHByaXZhdGUga2V5XG4gICAgY29uc3QgeyBzaGFyZXM6IHVTaGFyZXMsIHYgfSA9IEVjZHNhLnNoYW1pci5zcGxpdCh1LCB0aHJlc2hvbGQsIG51bVNoYXJlcyk7XG4gICAgY29uc3QgY3VycmVudFBhcnRpY2lwYW50OiBQU2hhcmUgPSB7XG4gICAgICBpOiBpbmRleCxcbiAgICAgIHQ6IHRocmVzaG9sZCxcbiAgICAgIGM6IG51bVNoYXJlcyxcbiAgICAgIGw6IGJpZ0ludFRvQnVmZmVyQkUocHJpdmF0ZUtleS5sYW1iZGEsIDE5MikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgbTogYmlnSW50VG9CdWZmZXJCRShwcml2YXRlS2V5Lm11LCAxOTIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIG46IGJpZ0ludFRvQnVmZmVyQkUocHVibGljS2V5Lm4sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeTogYmlnSW50VG9CdWZmZXJCRSh5LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRSh1U2hhcmVzW2luZGV4XSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHV1OiB1LnRvU3RyaW5nKCksXG4gICAgICBjaGFpbmNvZGU6IGNoYWluY29kZS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgICBjb25zdCBrZXlTaGFyZTogS2V5U2hhcmUgPSB7XG4gICAgICBwU2hhcmU6IGN1cnJlbnRQYXJ0aWNpcGFudCxcbiAgICAgIG5TaGFyZXM6IHt9LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIGluIHVTaGFyZXMpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50SW5kZXggPSBwYXJzZUludChzaGFyZSwgMTApO1xuICAgICAgaWYgKHBhcnRpY2lwYW50SW5kZXggIT09IGluZGV4KSB7XG4gICAgICAgIGtleVNoYXJlLm5TaGFyZXNbcGFydGljaXBhbnRJbmRleF0gPSB7XG4gICAgICAgICAgaTogcGFydGljaXBhbnRJbmRleCxcbiAgICAgICAgICBqOiBjdXJyZW50UGFydGljaXBhbnRbJ2knXSxcbiAgICAgICAgICBuOiBwdWJsaWNLZXkubi50b1N0cmluZygxNiksXG4gICAgICAgICAgeTogYmlnSW50VG9CdWZmZXJCRSh5LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUodlswXSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbcGFydGljaXBhbnRJbmRleF0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgY2hhaW5jb2RlOiBjaGFpbmNvZGUudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9IGFzIE5TaGFyZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleVNoYXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgZGF0YSBzaGFyZWQgZHVyaW5nIHRoZSBrZXkgZ2VuZXJhdGlvbiBwcm90b2NvbC5cbiAgICogQHBhcmFtIHtLZXlTaGFyZX0gcGFydGljaXBhbnRTaGFyZXMgcHJpdmF0ZSBwLXNoYXJlIGFuZFxuICAgKiBuLXNoYXJlcyByZWNlaXZlZCBmcm9tIGFsbCBvdGhlciBwYXJ0aWNpcGFudHMuXG4gICAqIEByZXR1cm5zIHtLZXlDb21iaW5lZH0gUmV0dXJucyB0aGUgcGFydGljaXBhbnQgcHJpdmF0ZSB4LXNoYXJlXG4gICAqIGFuZCB5LXNoYXJlcyB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzaWduaW5nIHNoYXJlcy5cbiAgICovXG4gIGtleUNvbWJpbmUocFNoYXJlOiBQU2hhcmUsIG5TaGFyZXM6IE5TaGFyZVtdKTogS2V5Q29tYmluZWQge1xuICAgIGNvbnN0IGFsbFNoYXJlcyA9IFtwU2hhcmUsIC4uLm5TaGFyZXNdO1xuICAgIC8vIENvbXB1dGUgdGhlIHB1YmxpYyBrZXkuXG4gICAgY29uc3QgeSA9IGFsbFNoYXJlcy5tYXAoKHBhcnRpY2lwYW50KSA9PiBoZXhUb0JpZ0ludChwYXJ0aWNpcGFudFsneSddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnBvaW50QWRkKTtcbiAgICAvLyBBZGQgc2VjcmV0IHNoYXJlc1xuICAgIGNvbnN0IHggPSBhbGxTaGFyZXMubWFwKChwYXJ0aWNpcGFudCkgPT4gaGV4VG9CaWdJbnQocGFydGljaXBhbnRbJ3UnXSkpLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQpO1xuXG4gICAgLy8gVmVyaWZ5IHNoYXJlcy5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIG9mIG5TaGFyZXMpIHtcbiAgICAgIGlmIChzaGFyZS52KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRWNkc2Euc2hhbWlyLnZlcmlmeShoZXhUb0JpZ0ludChzaGFyZS51KSwgW2hleFRvQmlnSW50KHNoYXJlLnkpLCBoZXhUb0JpZ0ludChzaGFyZS52ISldLCBwU2hhcmUuaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZlcmlmeSBzaGFyZSBmcm9tIHBhcnRpY2lwYW50ICR7c2hhcmUuan0uIFZlcmlmaWNhdGlvbiBlcnJvcjogJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGFpbmNvZGUgd2lsbCBiZSB1c2VkIGluIGZ1dHVyZSB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciBrZXkgZGVyaXZhdGlvbiBmb3IgZWNkc2FcbiAgICBjb25zdCBjaGFpbmNvZGVzID0gW3BTaGFyZSwgLi4ublNoYXJlc10ubWFwKCh7IGNoYWluY29kZSB9KSA9PiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oY2hhaW5jb2RlLCAnaGV4JykpKTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSBjaGFpbmNvZGVzLnJlZHVjZShcbiAgICAgIChhY2MsIGNoYWluY29kZSkgPT5cbiAgICAgICAgKGFjYyArIGNoYWluY29kZSkgJSBCaWdJbnQoJzB4MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJykgLy8gMl4yNTZcbiAgICApO1xuXG4gICAgY29uc3QgcGFydGljaXBhbnRzOiBLZXlDb21iaW5lZCA9IHtcbiAgICAgIHhTaGFyZToge1xuICAgICAgICBpOiBwU2hhcmUuaSxcbiAgICAgICAgbDogcFNoYXJlLmwsXG4gICAgICAgIG06IHBTaGFyZS5tLFxuICAgICAgICBuOiBwU2hhcmUubixcbiAgICAgICAgeTogYmlnSW50VG9CdWZmZXJCRSh5LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHgsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShjaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgeVNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gblNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IG5TaGFyZXNbc2hhcmVdWydqJ107XG4gICAgICBwYXJ0aWNpcGFudHMueVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgaTogcFNoYXJlLmksXG4gICAgICAgIGo6IG5TaGFyZXNbc2hhcmVdWydqJ10sXG4gICAgICAgIG46IG5TaGFyZXNbc2hhcmVdWyduJ10sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFydGljaXBhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZSBzaGFyZXMgZm9yIGEgQklQLTMyIHN1YmtleS5cbiAgICogQHBhcmFtIHtQU2hhcmV9IFRoZSB1c2VyJ3MgcC1zaGFyZS5cbiAgICogQHBhcmFtIHtOU2hhcmVbXX0gVGhlIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBCSVAtMzIgcGF0aCB0byBkZXJpdmUuXG4gICAqIEByZXR1cm5zIHtTdWJrZXlTaGFyZX0gUmV0dXJucyB0aGUgcHJpdmF0ZSB4LXNoYXJlIGFuZCBuLXNoYXJlcyB0b1xuICAgKiBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGtleURlcml2ZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10sIHBhdGg6IHN0cmluZyk6IFN1YmtleVNoYXJlIHtcbiAgICBjb25zdCB5VmFsdWVzID0gW3BTaGFyZSwgLi4ublNoYXJlc10ubWFwKChzaGFyZSkgPT4gaGV4VG9CaWdJbnQoc2hhcmUueSkpO1xuICAgIGNvbnN0IHkgPSB5VmFsdWVzLnJlZHVjZSgocGFydGlhbCwgc2hhcmUpID0+IEVjZHNhLmN1cnZlLnBvaW50QWRkKHBhcnRpYWwsIHNoYXJlKSk7XG4gICAgY29uc3QgdSA9IEJpZ0ludChwU2hhcmUudXUpO1xuICAgIGxldCBjb250cmliQ2hhaW5jb2RlID0gaGV4VG9CaWdJbnQocFNoYXJlLmNoYWluY29kZSk7XG4gICAgY29uc3QgY2hhaW5jb2RlcyA9IFtjb250cmliQ2hhaW5jb2RlLCAuLi5uU2hhcmVzLm1hcCgoeyBjaGFpbmNvZGUgfSkgPT4gaGV4VG9CaWdJbnQoY2hhaW5jb2RlKSldO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGNoYWluY29kZXMucmVkdWNlKChhY2MsIGNoYWluY29kZSkgPT4gKGFjYyArIGNoYWluY29kZSkgJSBjaGFpbmNvZGVCYXNlKTtcblxuICAgIC8vIFZlcmlmeSBzaGFyZXMuXG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBuU2hhcmVzKSB7XG4gICAgICBpZiAoc2hhcmUudikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEVjZHNhLnNoYW1pci52ZXJpZnkoaGV4VG9CaWdJbnQoc2hhcmUudSksIFtoZXhUb0JpZ0ludChzaGFyZS55KSwgaGV4VG9CaWdJbnQoc2hhcmUudiEpXSwgcFNoYXJlLmkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZnJvbSBwYXJ0aWNpcGFudCAke3NoYXJlLmp9LiBWZXJpZmljYXRpb24gZXJyb3I6ICR7ZXJyfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVyaXZlIHN1YmtleS5cbiAgICBjb25zdCBzdWJrZXkgPSBFY2RzYS5oZFRyZWUucHJpdmF0ZURlcml2ZSh7IHBrOiB5LCBzazogdSwgY2hhaW5jb2RlIH0sIHBhdGgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBwdWJsaWMga2V5IGNvbnRyaWJ1dGlvbi5cbiAgICBjb25zdCBjb250cmliWSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoc3Via2V5LnNrKTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgY2hhaW5jb2RlIGNvbnRyaWJ1dGlvbi5cbiAgICBjb25zdCBjaGFpbmNvZGVEZWx0YSA9IChjaGFpbmNvZGVCYXNlICsgc3Via2V5LmNoYWluY29kZSAtIGNoYWluY29kZSkgJSBjaGFpbmNvZGVCYXNlO1xuICAgIGNvbnRyaWJDaGFpbmNvZGUgPSAoY29udHJpYkNoYWluY29kZSArIGNoYWluY29kZURlbHRhKSAlIGNoYWluY29kZUJhc2U7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHUgdmFsdWVzLlxuICAgIGNvbnN0IHsgc2hhcmVzOiBzcGxpdF91LCB2IH0gPSBFY2RzYS5zaGFtaXIuc3BsaXQoc3Via2V5LnNrLCBwU2hhcmUudCB8fCAyLCBwU2hhcmUuYyB8fCAzKTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgc2lnbmluZyBrZXkuXG4gICAgY29uc3QgeCA9IFtzcGxpdF91W3BTaGFyZS5pXSwgLi4ublNoYXJlcy5tYXAoKHsgdSB9KSA9PiBoZXhUb0JpZ0ludCh1KSldLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQpO1xuXG4gICAgY29uc3QgUF9pOiBYU2hhcmUgPSB7XG4gICAgICBpOiBwU2hhcmUuaSxcbiAgICAgIGw6IHBTaGFyZS5sLFxuICAgICAgbTogcFNoYXJlLm0sXG4gICAgICBuOiBwU2hhcmUubixcbiAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LnBrLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh4LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5jaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IHNoYXJlczogU3Via2V5U2hhcmUgPSB7XG4gICAgICB4U2hhcmU6IFBfaSxcbiAgICAgIG5TaGFyZXM6IHt9LFxuICAgIH07XG5cbiAgICBmb3IgKGxldCBpbmQgPSAwOyBpbmQgPCBuU2hhcmVzLmxlbmd0aDsgaW5kKyspIHtcbiAgICAgIGNvbnN0IFBfaiA9IG5TaGFyZXNbaW5kXTtcbiAgICAgIHNoYXJlcy5uU2hhcmVzW1Bfai5qXSA9IHtcbiAgICAgICAgaTogUF9qLmosXG4gICAgICAgIGo6IFBfaS5pLFxuICAgICAgICBuOiBQX2kubixcbiAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShzcGxpdF91W1Bfai5qXSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgeTogYmlnSW50VG9CdWZmZXJCRShjb250cmliWSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRSh2WzBdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludFRvQnVmZmVyQkUoY29udHJpYkNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYXJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIGEgY2hpbGQgY29tbW9uIGtleWNoYWluIGZyb20gY29tbW9uIGtleWNoYWluXG4gICAqXG4gICAqIEBwYXJhbSB7Y29tbW9uS2V5Y2hhaW59IFRoZSBjb21tb24ga2V5Y2hhaW4gYXMgYSBoZXggc3RyaW5nLlxuICAgKiBAcGFyYW0ge3BhdGh9IFRoZSBCSVAtMzIgcGF0aCB0byBkZXJpdmUuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlcml2ZWQgY29tbW9uIGtleWNoYWluIGFzIGEgaGV4IHN0cmluZy5cbiAgICovXG4gIGRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW46IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoRWNkc2EuaGRUcmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGRlcml2ZSBrZXkgd2l0aG91dCBIRFRyZWUgaW1wbGVtZW50YXRpb25cIik7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW4gPSBCdWZmZXIuZnJvbShjb21tb25LZXljaGFpbiwgJ2hleCcpO1xuXG4gICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleWNoYWluID0gRWNkc2EuaGRUcmVlLnB1YmxpY0Rlcml2ZShcbiAgICAgIHtcbiAgICAgICAgcGs6IGJpZ0ludEZyb21CdWZmZXJCRShrZXljaGFpbi5zbGljZSgwLCAzMykpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludEZyb21CdWZmZXJCRShrZXljaGFpbi5zbGljZSgzMykpLFxuICAgICAgfSxcbiAgICAgIHBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgZGVyaXZlZFBrID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHVibGljS2V5Y2hhaW4ucGssIDMzKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZGVyaXZlZENoYWluY29kZSA9IGJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1YmxpY0tleWNoYWluLmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIHJldHVybiBkZXJpdmVkUGsgKyBkZXJpdmVkQ2hhaW5jb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBnaXZlbiByYW5nZSBwcm9vZiBjaGFsbGVuZ2UgdG8gdGhlIHNoYXJlcyBwcmV2aW91c2x5IGNyZWF0ZWRcbiAgICogYnkgI2tleUNvbWJpbmUuIEdlbmVyYXRlcyBhIG5ldyBjaGFsbGVuZ2UgaWYgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0ge1hTaGFyZSB8IFlTaGFyZX0gc2hhcmUgUHJpdmF0ZSB4U2hhcmUgb3IgeVNoYXJlIG9mIHRoZSBzaWduaW5nIG9wZXJhdGlvblxuICAgKiBAcGFyYW0gcmFuZ2VQcm9vZkNoYWxsZW5nZSAtIGNoYWxsZW5nZSBnZW5lcmF0ZWQgdmlhIGdlbmVyYXRlTnRpbGRlXG4gICAqIEBwYXJhbSBwYWlsbGllclByb29mQ2hhbGxlbmdlXG4gICAqIEByZXR1cm5zIHtLZXlDb21iaW5lZH0gVGhlIHNoYXJlIHdpdGggYW1lbmRlZCBjaGFsbGVuZ2UgdmFsdWVzXG4gICAqL1xuICBhcHBlbmRDaGFsbGVuZ2U8VD4oXG4gICAgc2hhcmU6IFQsXG4gICAgcmFuZ2VQcm9vZkNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlLFxuICAgIHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZFBhaWxsaWVyQ2hhbGxlbmdlXG4gICk6IFQgJiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWRFY2RzYUNoYWxsZW5nZXMge1xuICAgIGNvbnN0IHsgbnRpbGRlLCBoMSwgaDIgfSA9IHJhbmdlUHJvb2ZDaGFsbGVuZ2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYXJlLFxuICAgICAgbnRpbGRlLFxuICAgICAgaDEsXG4gICAgICBoMixcbiAgICAgIHA6IHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2UucCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBzaWduaW5nIHNoYXJlcy5cbiAgICogQHBhcmFtIHt4U2hhcmV9IHhTaGFyZSBQcml2YXRlIHhTaGFyZSBvZiBjdXJyZW50IHBhcnRpY2lwYW50IHNpZ25lclxuICAgKiBAcGFyYW0ge1lTaGFyZX0geVNoYXJlIHlTaGFyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICogQHJldHVybnMge1NpZ25TaGFyZVJUfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHctc2hhcmVcbiAgICogYW5kIGstc2hhcmUgdG8gYmUgZGlzdHJpYnV0ZWQgdG8gb3RoZXIgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqL1xuICBhc3luYyBzaWduU2hhcmUoeFNoYXJlOiBYU2hhcmVXaXRoQ2hhbGxlbmdlcywgeVNoYXJlOiBZU2hhcmVXaXRoQ2hhbGxlbmdlcyk6IFByb21pc2U8U2lnblNoYXJlUlQ+IHtcbiAgICBjb25zdCBwayA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHhTaGFyZS5uKSk7XG5cbiAgICBjb25zdCBrID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG4gICAgY29uc3QgcmsgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhway5uKTtcbiAgICBjb25zdCBjayA9IHBrLmVuY3J5cHQoaywgcmspO1xuICAgIGNvbnN0IGdhbW1hID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG5cbiAgICBjb25zdCBkID0gRWNkc2EuY3VydmUuc2NhbGFyTXVsdChFY2RzYS5jdXJ2ZS5zY2FsYXJTdWIoQmlnSW50KHlTaGFyZS5qKSwgQmlnSW50KHhTaGFyZS5pKSksIEJpZ0ludCh4U2hhcmUuaSkpO1xuXG4gICAgY29uc3QgdyA9IFtcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQoQmlnSW50KHlTaGFyZS5qKSwgQmlnSW50KHhTaGFyZS5pKSksXG4gICAgICBoZXhUb0JpZ0ludCh4U2hhcmVbJ3gnXSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJJbnZlcnQoZCksXG4gICAgXS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyTXVsdCk7XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYSwgaDE6IGgxYSwgaDI6IGgyYSB9ID0geFNoYXJlO1xuXG4gICAgY29uc3Qgd1NoYXJlOiBXU2hhcmUgPSB7XG4gICAgICBpOiB4U2hhcmUuaSxcbiAgICAgIGw6IHhTaGFyZS5sLFxuICAgICAgbTogeFNoYXJlLm0sXG4gICAgICBuOiB4U2hhcmUubixcbiAgICAgIHk6IHhTaGFyZS55LFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBwOiB4U2hhcmUucCxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUodywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKGdhbW1hLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYiwgaDE6IGgxYiwgaDI6IGgyYiB9ID0geVNoYXJlO1xuICAgIGNvbnN0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGssXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogaGV4VG9CaWdJbnQobnRpbGRlYiksXG4gICAgICAgIGgxOiBoZXhUb0JpZ0ludChoMWIpLFxuICAgICAgICBoMjogaGV4VG9CaWdJbnQoaDJiKSxcbiAgICAgIH0sXG4gICAgICBjayxcbiAgICAgIGssXG4gICAgICBya1xuICAgICk7XG5cbiAgICAvLyBjcmVhdGUgcGFpbGxpZXIgY2hhbGxlbmdlIHByb29mIGJhc2VkIG9uIHRoZSBvdGhlciBzaWduZXJzIGNoYWxsZW5nZVxuICAgIC8vIG9ubHkgc2VuZCBzaWdtYSBpZiB3ZSBhbHNvIHNlbmQgY2hhbGxlbmdlIHBcbiAgICBjb25zdCBzaWdtYSA9IEVjZHNhUGFpbGxpZXJQcm9vZi5wcm92ZShcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZS5uKSxcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZS5sKSxcbiAgICAgIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7IHA6IHlTaGFyZS5wISB9KS5wXG4gICAgKTtcblxuICAgIGNvbnN0IHByb29mU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IGtTaGFyZTogS1NoYXJlID0ge1xuICAgICAgLy8gdGhpcyBzaGFyZSB3aWxsIGJlIHNlbnQgdG8gdGhlIG90aGVyIHBhcnRpY2lwYW50LFxuICAgICAgLy8gc28gd2UgbmVlZCB0byBzd2FwIHRoZSBpIGFuZCBqIHZhbHVlcyBoZXJlXG4gICAgICAvLyBzbyB0aGF0IHRoZXkga25vdyBpdCdzIHRoZWlyIGtTaGFyZSwgcHJvZHVjZWQgYnkgdXNcbiAgICAgIGk6IHlTaGFyZS5qLFxuICAgICAgajogeFNoYXJlLmksXG4gICAgICBuOiBway5uLnRvU3RyaW5nKDE2KSxcbiAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgIGgxOiBoMWEsXG4gICAgICBoMjogaDJhLFxuICAgICAgcDogeFNoYXJlLnAsXG4gICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHNpZ21hOiBFY2RzYVR5cGVzLnNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlUHJvb2ZzKHsgc2lnbWE6IHNpZ21hIH0pLnNpZ21hLFxuICAgICAgcHJvb2Y6IHByb29mU2hhcmUsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICB3U2hhcmUsXG4gICAgICBrU2hhcmUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyIHNpZ25lci5cbiAgICogQ29ubmVjdGlvbiAxLjIgaW4gaHR0cHM6Ly9sdWNpZC5hcHAvbHVjaWRjaGFydC83MDYxNzg1Yi1iYzVjLTQwMDItYjU0Ni0zZjRhMzYxMmZjNjIvZWRpdD9wYWdlPUlBVm12WU80RnZLYyNcbiAgICogSWYgc2lnbmVyIEEgY29tcGxldGVkIHNpZ25TaGFyZSBpbml0aWFsbHkgKGlucHV0IHRvIHRoaXMgZm4pLCB0aGVuIHRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgYnkgc2lnbmVyIEIuXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0U3RlcDEoc2hhcmVzOiBTaWduQ29udmVydFN0ZXAxKTogUHJvbWlzZTxTaWduQ29udmVydFN0ZXAxUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWNlaXZlZEtTaGFyZSA9IHNoYXJlcy5rU2hhcmU7XG4gICAgY29uc3QgeFNoYXJlID0gc2hhcmVzLnhTaGFyZTsgLy8gY3VycmVudFBhcnRpY2lwYW50IHNlY3JldCB4U2hhcmVcbiAgICBjb25zdCB5U2hhcmU6IFlTaGFyZVdpdGhDaGFsbGVuZ2VzID0ge1xuICAgICAgLi4uc2hhcmVzLnlTaGFyZSxcbiAgICAgIG50aWxkZTogcmVjZWl2ZWRLU2hhcmUubnRpbGRlLFxuICAgICAgaDE6IHJlY2VpdmVkS1NoYXJlLmgxLFxuICAgICAgaDI6IHJlY2VpdmVkS1NoYXJlLmgyLFxuICAgICAgcDogcmVjZWl2ZWRLU2hhcmUucCxcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25TaGFyZSA9IGF3YWl0IHRoaXMuc2lnblNoYXJlKHhTaGFyZSwgeVNoYXJlKTtcbiAgICBjb25zdCBzaGFyZVBhcnRpY2lwYW50ID0gc2lnblNoYXJlLndTaGFyZTtcblxuICAgIGlmIChzaGFyZVBhcnRpY2lwYW50LmkgIT09IHJlY2VpdmVkS1NoYXJlLmkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2hhcmVzIGZyb20gc2FtZSBwYXJ0aWNpcGFudCcpO1xuICAgIH1cbiAgICBpZiAoIXJlY2VpdmVkS1NoYXJlLnByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBwcm9vZiBvbiBhU2hhcmVUb0JlU2VudCcpO1xuICAgIH1cblxuICAgIC8vIHRoZSBvdGhlciBwYXJ0aWNpcGFudHMgcGFpbGxpZXIgcHVibGljIGtleVxuICAgIGNvbnN0IG4gPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5uKTtcbiAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShuKTtcbiAgICAvLyB0aGUgb3RoZXIgcGFydGljaXBhbnQncyByYW5nZSBwcm9vZiBjaGFsbGVuZ2VcbiAgICBjb25zdCBudGlsZGVhID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5oMSk7XG4gICAgY29uc3QgaDJhID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUuaDIpO1xuXG4gICAgLy8gdGhlIGN1cnJlbnQgcGFydGljaXBhbnQncyByYW5nZSBwcm9vZiBjaGFsbGVuZ2VcbiAgICBjb25zdCBudGlsZGViID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgIGNvbnN0IGgxYiA9IGhleFRvQmlnSW50KHNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgIGNvbnN0IGgyYiA9IGhleFRvQmlnSW50KHNoYXJlUGFydGljaXBhbnQuaDIpO1xuXG4gICAgY29uc3QgayA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLmspO1xuXG4gICAgLy8gdGhlIGN1cnJlbnQgcGFydGljaXBhbnRzIHBhaWxsaWVyIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IHNoYXJlUGFydGljaXBhbnRQYWlsbGllckNoYWxsZW5nZSA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7IHA6IHNoYXJlUGFydGljaXBhbnQucCB9KTtcbiAgICAvLyB0aGUgb3RoZXIgc2lnbmluZyBwYXJ0aWVzIHByb29mIHRvIHRoZSBjdXJyZW50IHBhcnRpY2lwYW50cyBwYWlsbGllciBwcm9vZiBjaGFsbGVuZ2VcbiAgICBjb25zdCByZWNlaXZlZFBhaWxsaWVyQ2hhbGxlbmdlUHJvb2YgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZnMoe1xuICAgICAgc2lnbWE6IHJlY2VpdmVkS1NoYXJlLnNpZ21hLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICEoYXdhaXQgRWNkc2FQYWlsbGllclByb29mLnZlcmlmeShuLCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UucCwgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mLnNpZ21hKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcGFpbGxpZXIgcHJvb2YnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeShcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICBoMTogaDFiLFxuICAgICAgICAgIGgyOiBoMmIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi56KSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi51KSxcbiAgICAgICAgICB3OiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUucHJvb2YuczEpLFxuICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi5zMiksXG4gICAgICAgIH0sXG4gICAgICAgIGtcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICB9XG4gICAgLy8gTXRBICRrX2osIFxcZ2FtbWFfaSQuXG4gICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgY29uc3QgYmV0YSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShiZXRhMCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGcgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50LmdhbW1hKTtcbiAgICBjb25zdCByYiA9IGF3YWl0IHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHBrYS5uKTtcbiAgICBjb25zdCBjYiA9IHBrYS5lbmNyeXB0KGJldGEwLCByYik7XG4gICAgY29uc3QgYWxwaGEgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIGcpLCBjYik7XG4gICAgY29uc3QgYWxwaGFUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUoYWxwaGEsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gUHJvdmUgJFxcZ2FtbWFfaSBcXGluIFpfe05eMn0kLlxuICAgIGNvbnN0IGd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnKTtcbiAgICBsZXQgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICBwa2EsXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgaDI6IGgyYSxcbiAgICAgIH0sXG4gICAgICBrLFxuICAgICAgYWxwaGEsXG4gICAgICBnLFxuICAgICAgYmV0YTAsXG4gICAgICByYixcbiAgICAgIGd4XG4gICAgKTtcbiAgICBjb25zdCBnYW1tYVByb29mVG9CZVNlbnQ6IFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRShneCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIC8vIE10QSAka19qLCB3X2kkLlxuICAgIGNvbnN0IG51MCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBudSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShudTApKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCB3ID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC53KTtcbiAgICBjb25zdCBybiA9IGF3YWl0IHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHBrYS5uKTtcbiAgICBjb25zdCBjbiA9IHBrYS5lbmNyeXB0KG51MCwgcm4pO1xuICAgIGNvbnN0IG11ID0gcGthLmFkZGl0aW9uKHBrYS5tdWx0aXBseShrLCB3KSwgY24pO1xuICAgIGNvbnN0IG11VG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKG11LCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIFByb3ZlICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgIGNvbnN0IHd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh3KTtcbiAgICBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrYSxcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgfSxcbiAgICAgIGssXG4gICAgICBoZXhUb0JpZ0ludChtdVRvQmVTZW50KSxcbiAgICAgIHcsXG4gICAgICBudTAsXG4gICAgICBybixcbiAgICAgIHd4XG4gICAgKTtcbiAgICBjb25zdCB3UHJvb2ZUb0JlU2VudDogUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlID0ge1xuICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCBuVG9CZVNlbnQgPSBzaWduU2hhcmUua1NoYXJlLm47XG4gICAgY29uc3QgbnRpbGRlVG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGgxVG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKGgxYiwgMzg0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgaDJUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUoaDJiLCAzODQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBrVG9CZVNlbnQgPSBzaWduU2hhcmUua1NoYXJlLms7XG4gICAgY29uc3QgcHJvb2ZUb0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUucHJvb2Y7XG4gICAgY29uc3QgW2lUb0JlU2VudCwgalRvQmVTZW50XSA9IFtyZWNlaXZlZEtTaGFyZS5qLCByZWNlaXZlZEtTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgYVNoYXJlOiB7XG4gICAgICAgIGk6IGlUb0JlU2VudCxcbiAgICAgICAgajogalRvQmVTZW50LFxuICAgICAgICBudGlsZGU6IG50aWxkZVRvQmVTZW50LFxuICAgICAgICBoMTogaDFUb0JlU2VudCxcbiAgICAgICAgaDI6IGgyVG9CZVNlbnQsXG4gICAgICAgIG46IG5Ub0JlU2VudCxcbiAgICAgICAgazoga1RvQmVTZW50LFxuICAgICAgICBhbHBoYTogYWxwaGFUb0JlU2VudCxcbiAgICAgICAgbXU6IG11VG9CZVNlbnQsXG4gICAgICAgIHByb29mOiBwcm9vZlRvQmVTZW50LFxuICAgICAgICBnYW1tYVByb29mOiBnYW1tYVByb29mVG9CZVNlbnQsXG4gICAgICAgIHdQcm9vZjogd1Byb29mVG9CZVNlbnQsXG4gICAgICAgIC8vIHByb3ZpZGUgdGhlIHNoYXJlIHBhcnRpY2lwYW50cyBwcm9vZlxuICAgICAgICAvLyB0byB0aGUgcGFpbGxpZXIgY2hhbGxlbmdlIGluIHRoZSByZWNlaXZlZEtTaGFyZSBmcm9tIHRoZSBvdGhlciBzaWduZXJcbiAgICAgICAgc2lnbWE6IHNpZ25TaGFyZS5rU2hhcmUuc2lnbWEsXG4gICAgICB9LFxuICAgICAgYlNoYXJlOiB7XG4gICAgICAgIC4uLnNoYXJlUGFydGljaXBhbnQsXG4gICAgICAgIGJldGEsXG4gICAgICAgIG51LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXJcbiAgICogc2lnbmVyLlxuICAgKiBDb25uZWN0aW9uIDIuMSBpbiBodHRwczovL2x1Y2lkLmFwcC9sdWNpZGNoYXJ0LzcwNjE3ODViLWJjNWMtNDAwMi1iNTQ2LTNmNGEzNjEyZmM2Mi9lZGl0P3BhZ2U9SUFWbXZZTzRGdktjI1xuICAgKiBJZiBzaWduZXIgQiBjb21wbGV0ZWQgc2lnbkNvbnZlcnRTdGVwMSwgdGhlbiB0aGlzIHN0ZXAgaXMgY29tcGxldGVkIGJ5IHNpZ25lciBBLlxuICAgKiBAcGFyYW0ge1NpZ25Db252ZXJ0fSBzaGFyZXNcbiAgICogQHJldHVybnMge1NpZ25Db252ZXJ0UlR9XG4gICAqL1xuICBhc3luYyBzaWduQ29udmVydFN0ZXAyKHNoYXJlczogU2lnbkNvbnZlcnRTdGVwMik6IFByb21pc2U8U2lnbkNvbnZlcnRTdGVwMlJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVjZWl2ZWRBU2hhcmUgPSBzaGFyZXMuYVNoYXJlO1xuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3NpbmcgZ2FtbWFQcm9vZiBvbiBhU2hhcmVUb0JlU2VudCcpO1xuICAgIH1cbiAgICBpZiAoIXJlY2VpdmVkQVNoYXJlLndQcm9vZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3Npbmcgd1Byb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IG4gPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5uKTsgLy8gUGFpbGxpZXIgcHViIGZyb20gb3RoZXIgc2lnbmVyXG4gICAgLy8gY3VycmVudCBwYXJ0aWNpcGFudCBwdWJsaWMga2V5XG4gICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5uKSk7XG4gICAgY29uc3QgbnRpbGRlYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWEgPSBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLmgyKTtcbiAgICBjb25zdCBjayA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuY2spO1xuXG4gICAgY29uc3Qgc2hhcmVQYXJ0aWNpcGFudFBhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2hhcmVzLndTaGFyZS5wIH0pO1xuICAgIGNvbnN0IHJlY2VpdmVkUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZiA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZVByb29mcyh7XG4gICAgICBzaWdtYTogc2hhcmVzLmFTaGFyZS5zaWdtYSxcbiAgICB9KTtcbiAgICBpZiAoIUVjZHNhUGFpbGxpZXJQcm9vZi52ZXJpZnkobiwgc2hhcmVQYXJ0aWNpcGFudFBhaWxsaWVyQ2hhbGxlbmdlLnAsIHJlY2VpdmVkUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZi5zaWdtYSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaWduaW5nIHNoYXJlIGZvciBwYWlsbGllciBwcm9vZicpO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgaWYgKFxuICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgejogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi56KSxcbiAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnpwcm0pLFxuICAgICAgICAgIHQ6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgdjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi52KSxcbiAgICAgICAgICB3OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgczE6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuczEpLFxuICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnMyKSxcbiAgICAgICAgICB0MTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgdDI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudDIpLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudSksXG4gICAgICAgIH0sXG4gICAgICAgIGNrLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5hbHBoYSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YueClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaWduaW5nIHNoYXJlIGZvciBnYW1tYSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBWZXJpZnkgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgaWYgKFxuICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgejogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi56cHJtKSxcbiAgICAgICAgICB0OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudCksXG4gICAgICAgICAgdjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YucyksXG4gICAgICAgICAgczE6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi5zMiksXG4gICAgICAgICAgdDE6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi50MSksXG4gICAgICAgICAgdDI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnUpLFxuICAgICAgICB9LFxuICAgICAgICBjayxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUubXUpLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YueClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaGFyZSBmb3Igd1Byb29mJyk7XG4gICAgfVxuICAgIGNvbnN0IHNrID0gbmV3IHBhaWxsaWVyQmlnaW50LlByaXZhdGVLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5sKSwgaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5tKSwgcGthKTtcblxuICAgIGNvbnN0IGdTaGFyZUFscGhhID0gYmlnSW50VG9CdWZmZXJCRShcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShzay5kZWNyeXB0KGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmFscGhhKSkpLFxuICAgICAgMzJcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IGdTaGFyZU11ID0gYmlnSW50VG9CdWZmZXJCRShcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShzay5kZWNyeXB0KGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLm11KSkpLCAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICAgIDMyXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBpZiAoIXJlY2VpdmVkQVNoYXJlLnByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBwcm9vZiBvbiBhU2hhcmVUb0JlU2VudCcpO1xuICAgIH1cbiAgICBjb25zdCBwa2IgPSBnZXRQYWlsbGllclB1YmxpY0tleShuKTtcbiAgICBjb25zdCBudGlsZGViID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5oMSk7XG4gICAgY29uc3QgaDJiID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuaDIpO1xuICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5rKTtcbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeShcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYixcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi56KSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi51KSxcbiAgICAgICAgICB3OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUucHJvb2YuczEpLFxuICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi5zMiksXG4gICAgICAgIH0sXG4gICAgICAgIGtcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICB9XG4gICAgLy8gTXRBICRrX2osIFxcZ2FtbWFfaSQuXG4gICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgY29uc3QgZ1NoYXJlQmV0YSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShiZXRhMCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgZyA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuZ2FtbWEpO1xuICAgIGNvbnN0IHJiID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGtiLm4pO1xuICAgIGNvbnN0IGNiID0gcGtiLmVuY3J5cHQoYmV0YTAsIHJiKTtcbiAgICBjb25zdCBhbHBoYSA9IHBrYi5hZGRpdGlvbihwa2IubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICBjb25zdCBhbHBoYVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3QgZ3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGcpO1xuICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrYixcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBudGlsZGViLFxuICAgICAgICBoMTogaDFiLFxuICAgICAgICBoMjogaDJiLFxuICAgICAgfSxcbiAgICAgIGssXG4gICAgICBhbHBoYSxcbiAgICAgIGcsXG4gICAgICBiZXRhMCxcbiAgICAgIHJiLFxuICAgICAgZ3hcbiAgICApO1xuICAgIGNvbnN0IGdhbW1hUHJvb2ZUb0JlU2VudDogUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlID0ge1xuICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgLy8gTXRBICRrX2osIHdfaSQuXG4gICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgIGNvbnN0IGdTaGFyZU51ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG51MCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLncpO1xuICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGtiLm4pO1xuICAgIGNvbnN0IGNuID0gcGtiLmVuY3J5cHQobnUwLCBybik7XG4gICAgY29uc3QgbXUgPSBwa2IuYWRkaXRpb24ocGtiLm11bHRpcGx5KGssIHcpLCBjbik7XG4gICAgY29uc3QgbXVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gUHJvdmUgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3Qgd3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHcpO1xuICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGtiLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWIsXG4gICAgICAgIGgxOiBoMWIsXG4gICAgICAgIGgyOiBoMmIsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGhleFRvQmlnSW50KG11VG9CZVNlbnQpLFxuICAgICAgdyxcbiAgICAgIG51MCxcbiAgICAgIHJuLFxuICAgICAgd3hcbiAgICApO1xuICAgIGNvbnN0IHdQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUod3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IFtpVG9CZVNlbnQsIGpUb0JlU2VudF0gPSBbcmVjZWl2ZWRBU2hhcmUuaiwgcmVjZWl2ZWRBU2hhcmUuaV07XG4gICAgcmV0dXJuIHtcbiAgICAgIG11U2hhcmU6IHtcbiAgICAgICAgaTogaVRvQmVTZW50LFxuICAgICAgICBqOiBqVG9CZVNlbnQsXG4gICAgICAgIGFscGhhOiBhbHBoYVRvQmVTZW50LFxuICAgICAgICBtdTogbXVUb0JlU2VudCxcbiAgICAgICAgZ2FtbWFQcm9vZjogZ2FtbWFQcm9vZlRvQmVTZW50LFxuICAgICAgICB3UHJvb2Y6IHdQcm9vZlRvQmVTZW50LFxuICAgICAgfSxcbiAgICAgIGdTaGFyZToge1xuICAgICAgICBpOiBzaGFyZXMud1NoYXJlLmksXG4gICAgICAgIG46IHNoYXJlcy53U2hhcmUubixcbiAgICAgICAgeTogc2hhcmVzLndTaGFyZS55LFxuICAgICAgICBrOiBzaGFyZXMud1NoYXJlLmssXG4gICAgICAgIHc6IHNoYXJlcy53U2hhcmUudyxcbiAgICAgICAgZ2FtbWE6IHNoYXJlcy53U2hhcmUuZ2FtbWEsXG4gICAgICAgIGFscGhhOiBnU2hhcmVBbHBoYSxcbiAgICAgICAgbXU6IGdTaGFyZU11LFxuICAgICAgICBiZXRhOiBnU2hhcmVCZXRhLFxuICAgICAgICBudTogZ1NoYXJlTnUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBtdWx0aXBsaWNpdGl2ZS10by1hZGRpdGl2ZSAoTXRBKSBzaGFyZSBjb252ZXJzaW9uIHdpdGggYW5vdGhlciBzaWduZXIuXG4gICAqIENvbm5lY3Rpb24gMi4yIGluIGh0dHBzOi8vbHVjaWQuYXBwL2x1Y2lkY2hhcnQvNzA2MTc4NWItYmM1Yy00MDAyLWI1NDYtM2Y0YTM2MTJmYzYyL2VkaXQ/cGFnZT1JQVZtdllPNEZ2S2MjXG4gICAqIElmIHNpZ25lciBBIGNvbXBsZXRlZCBzaWduQ29udmVydFN0ZXAyLCB0aGVuIHRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgYnkgc2lnbmVyIEIuXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0U3RlcDMoc2hhcmVzOiBTaWduQ29udmVydFN0ZXAzKTogUHJvbWlzZTxTaWduQ29udmVydFN0ZXAzUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWNlaXZlZE11U2hhcmUgPSBzaGFyZXMubXVTaGFyZTtcbiAgICBpZiAoIXJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRNdVNoYXJlLndQcm9vZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3Npbmcgd1Byb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUubikpO1xuICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLm50aWxkZSk7XG4gICAgY29uc3QgaDFhID0gaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5oMSk7XG4gICAgY29uc3QgaDJhID0gaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5oMik7XG4gICAgY29uc3QgY2sgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmNrKTtcbiAgICAvLyBWZXJpZnkgJFxcZ2FtbWFfaSBcXGluIFpfe05eMn0kLlxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnpwcm0pLFxuICAgICAgICAgIHQ6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnQpLFxuICAgICAgICAgIHY6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnMyKSxcbiAgICAgICAgICB0MTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudDEpLFxuICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudSksXG4gICAgICAgIH0sXG4gICAgICAgIGNrLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuYWxwaGEpLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgfVxuICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5tdSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YueClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaGFyZSBmb3Igd1Byb29mJyk7XG4gICAgfVxuICAgIGNvbnN0IHNrID0gbmV3IHBhaWxsaWVyQmlnaW50LlByaXZhdGVLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5sKSwgaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5tKSwgcGthKTtcbiAgICBjb25zdCBhbHBoYSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmFscGhhKSk7XG4gICAgY29uc3QgZ1NoYXJlQWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShhbHBoYSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgbXUgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5tdSBhcyBzdHJpbmcpKTsgLy8gcmVjaGVjayBlbmNyeXB0ZWQgbnVtYmVyXG4gICAgY29uc3QgZ1NoYXJlTXUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShtdSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBbaVRvQmVTZW50LCBqVG9CZVNlbnRdID0gW3JlY2VpdmVkTXVTaGFyZS5qLCByZWNlaXZlZE11U2hhcmUuaV07XG4gICAgcmV0dXJuIHtcbiAgICAgIGdTaGFyZToge1xuICAgICAgICBpOiBzaGFyZXMuYlNoYXJlLmksXG4gICAgICAgIG46IHNoYXJlcy5iU2hhcmUubixcbiAgICAgICAgeTogc2hhcmVzLmJTaGFyZS55LFxuICAgICAgICBrOiBzaGFyZXMuYlNoYXJlLmssXG4gICAgICAgIHc6IHNoYXJlcy5iU2hhcmUudyxcbiAgICAgICAgZ2FtbWE6IHNoYXJlcy5iU2hhcmUuZ2FtbWEsXG4gICAgICAgIGFscGhhOiBnU2hhcmVBbHBoYSxcbiAgICAgICAgbXU6IGdTaGFyZU11LFxuICAgICAgICBiZXRhOiBzaGFyZXMuYlNoYXJlLmJldGEsXG4gICAgICAgIG51OiBzaGFyZXMuYlNoYXJlLm51LFxuICAgICAgfSxcbiAgICAgIHNpZ25JbmRleDoge1xuICAgICAgICBpOiBpVG9CZVNlbnQsXG4gICAgICAgIGo6IGpUb0JlU2VudCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyIHNpZ25lci5cbiAgICogQGRlcHJlY2F0ZWQgLSB1c2Ugb25lIG9mIFtzaWduQ29udmVydFN0ZXAxLCBzaWduQ29udmVydFN0ZXAyLCBzaWduQ29udmVydFN0ZXAzXSBpbnN0ZWFkXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0KHNoYXJlczogU2lnbkNvbnZlcnQpOiBQcm9taXNlPFNpZ25Db252ZXJ0UlQ+IHtcbiAgICBsZXQgc2hhcmVQYXJ0aWNpcGFudDogUGFydGlhbDxCU2hhcmU+IHwgUGFydGlhbDxHU2hhcmU+LCBzaGFyZVRvQmVTZW50OiBQYXJ0aWFsPEFTaGFyZT4gfCBNVVNoYXJlO1xuICAgIGxldCBpc0dhbW1hU2hhcmUgPSBmYWxzZTtcbiAgICBsZXQga1NoYXJlOiBQYXJ0aWFsPEtTaGFyZT4gPSB7fTtcbiAgICBpZiAoc2hhcmVzLnhTaGFyZSAmJiBzaGFyZXMueVNoYXJlICYmIHNoYXJlcy5rU2hhcmUpIHtcbiAgICAgIGNvbnN0IHhTaGFyZSA9IHNoYXJlcy54U2hhcmU7IC8vIGN1cnJlbnRQYXJ0aWNpcGFudCBzZWNyZXQgeFNoYXJlXG4gICAgICBjb25zdCB5U2hhcmU6IFlTaGFyZVdpdGhDaGFsbGVuZ2VzID0ge1xuICAgICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgICBudGlsZGU6IHNoYXJlcy5rU2hhcmUubnRpbGRlLFxuICAgICAgICBoMTogc2hhcmVzLmtTaGFyZS5oMSxcbiAgICAgICAgaDI6IHNoYXJlcy5rU2hhcmUuaDIsXG4gICAgICAgIHA6IHNoYXJlcy5rU2hhcmUucCxcbiAgICAgIH07XG4gICAgICBjb25zdCBzaWduU2hhcmUgPSBhd2FpdCB0aGlzLnNpZ25TaGFyZSh4U2hhcmUsIHlTaGFyZSk7XG4gICAgICBrU2hhcmUgPSBzaWduU2hhcmUua1NoYXJlO1xuICAgICAgc2hhcmVUb0JlU2VudCA9IHsgLi4uc2hhcmVzLmtTaGFyZSB9IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQgPSB7IC4uLnNpZ25TaGFyZS53U2hhcmUgfSBhcyBQYXJ0aWFsPEJTaGFyZT47XG4gICAgfSBlbHNlIGlmICgoc2hhcmVzLmJTaGFyZSAmJiBzaGFyZXMubXVTaGFyZSkgfHwgKHNoYXJlcy5hU2hhcmUgJiYgc2hhcmVzLndTaGFyZSkpIHtcbiAgICAgIGlzR2FtbWFTaGFyZSA9IHRydWU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0gc2hhcmVzLmFTaGFyZSA/ICh7IC4uLnNoYXJlcy5hU2hhcmUgfSBhcyBNVVNoYXJlKSA6ICh7IC4uLnNoYXJlcy5tdVNoYXJlIH0gYXMgTVVTaGFyZSk7XG4gICAgICBzaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVzLndTaGFyZSA/ICh7IC4uLnNoYXJlcy53U2hhcmUgfSBhcyBQYXJ0aWFsPEdTaGFyZT4pIDogKHsgLi4uc2hhcmVzLmJTaGFyZSB9IGFzIEdTaGFyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25maWcgZm9yIFNpZ24gQ29udmVydCcpO1xuICAgIH1cbiAgICBpZiAoc2hhcmVQYXJ0aWNpcGFudC5pICE9PSBzaGFyZVRvQmVTZW50LmkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2hhcmVzIGZyb20gc2FtZSBwYXJ0aWNpcGFudCcpO1xuICAgIH1cbiAgICBpZiAoKHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlKS5hbHBoYSkge1xuICAgICAgY29uc3QgYlNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZTtcbiAgICAgIGNvbnN0IGFTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBBU2hhcmU7XG4gICAgICBpZiAoIWFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3NpbmcgZ2FtbWFQcm9vZiBvbiBhU2hhcmVUb0JlU2VudCcpO1xuICAgICAgfVxuICAgICAgaWYgKCFhU2hhcmVUb0JlU2VudC53UHJvb2YpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3Npbmcgd1Byb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5uKSk7XG4gICAgICBsZXQgbnRpbGRlYSwgaDFhLCBoMmEsIGNrO1xuICAgICAgaWYgKGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSkge1xuICAgICAgICBudGlsZGVhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKTtcbiAgICAgICAgaDFhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgICAgICBoMmEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICAgIGNrID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuY2spO1xuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5ICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGlmIChcbiAgICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgICBwa2EsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnopLFxuICAgICAgICAgICAgenBybTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi56cHJtKSxcbiAgICAgICAgICAgIHQ6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgICB2OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnYpLFxuICAgICAgICAgICAgdzogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi53KSxcbiAgICAgICAgICAgIHM6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgICBzMjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zMiksXG4gICAgICAgICAgICB0MTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgICB0MjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2ssXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuYWxwaGEpLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YueClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaWduaW5nIHNoYXJlIGZvciBnYW1tYSBwcm9vZicpO1xuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5ICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi56KSxcbiAgICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi56cHJtKSxcbiAgICAgICAgICAgIHQ6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50KSxcbiAgICAgICAgICAgIHY6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi52KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi53KSxcbiAgICAgICAgICAgIHM6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zKSxcbiAgICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zMiksXG4gICAgICAgICAgICB0MTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQxKSxcbiAgICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudDIpLFxuICAgICAgICAgICAgdTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2ssXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi54KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNrID0gbmV3IHBhaWxsaWVyQmlnaW50LlByaXZhdGVLZXkoXG4gICAgICAgIGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmwgYXMgc3RyaW5nKSxcbiAgICAgICAgaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubSBhcyBzdHJpbmcpLFxuICAgICAgICBwa2FcbiAgICAgICk7XG4gICAgICBjb25zdCBnU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgR1NoYXJlO1xuICAgICAgY29uc3QgbXVTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBNVVNoYXJlO1xuICAgICAgY29uc3QgYWxwaGEgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmFscGhhKSk7XG4gICAgICBnU2hhcmVQYXJ0aWNpcGFudC5hbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGFscGhhKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IG11ID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSBhcyBzdHJpbmcpKTsgLy8gcmVjaGVjayBlbmNyeXB0ZWQgbnVtYmVyXG4gICAgICBnU2hhcmVQYXJ0aWNpcGFudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG11KSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBQYXJ0aWFsPEdTaGFyZT47XG4gICAgICBjb25zdCBwYXJ0aWFsU2hhcmVUb0JlU2VudCA9IG11U2hhcmVUb0JlU2VudCBhcyBQYXJ0aWFsPE1VU2hhcmU+O1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lmw7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5hbHBoYTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5tdTtcbiAgICB9XG4gICAgaWYgKChzaGFyZVRvQmVTZW50IGFzIEFTaGFyZSkuaykge1xuICAgICAgY29uc3QgYlNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZTtcbiAgICAgIGNvbnN0IGFTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBBU2hhcmU7XG4gICAgICBpZiAoIWFTaGFyZVRvQmVTZW50LnByb29mKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBuID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubik7IC8vIFBhaWxsaWVyIHB1YiBmcm9tIG90aGVyIHNpZ25lclxuICAgICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkobik7XG4gICAgICBjb25zdCBudGlsZGVhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubnRpbGRlKTtcbiAgICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmgxKTtcbiAgICAgIGNvbnN0IGgyYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmgyKTtcbiAgICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgICAgY29uc3QgaDFiID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgICAgY29uc3QgaDJiID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDIpO1xuICAgICAgY29uc3QgayA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmspO1xuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeShcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWIsXG4gICAgICAgICAgICBoMTogaDFiLFxuICAgICAgICAgICAgaDI6IGgyYixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnopLFxuICAgICAgICAgICAgdTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YudSksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi53KSxcbiAgICAgICAgICAgIHM6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi5zMiksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBrXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBBIHNoYXJlIHByb29mJyk7XG4gICAgICB9XG4gICAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICAgIGNvbnN0IGJldGEwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgICAgYlNoYXJlUGFydGljaXBhbnQuYmV0YSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShiZXRhMCkpLCAzMikudG9TdHJpbmcoXG4gICAgICAgICdoZXgnXG4gICAgICApO1xuICAgICAgY29uc3QgZyA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmdhbW1hKTtcbiAgICAgIGNvbnN0IHJiID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY2IgPSBwa2EuZW5jcnlwdChiZXRhMCwgcmIpO1xuICAgICAgY29uc3QgYWxwaGEgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIGcpLCBjYik7XG4gICAgICBhU2hhcmVUb0JlU2VudC5hbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoYWxwaGEsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBjb25zdCBneCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZyk7XG4gICAgICBsZXQgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICBrLFxuICAgICAgICBhbHBoYSxcbiAgICAgICAgZyxcbiAgICAgICAgYmV0YTAsXG4gICAgICAgIHJiLFxuICAgICAgICBneFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oYVNoYXJlVG9CZVNlbnQsIHtcbiAgICAgICAgZ2FtbWFQcm9vZjoge1xuICAgICAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvLyBNdEEgJGtfaiwgd19pJC5cbiAgICAgIGNvbnN0IG51MCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQubnUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobnUwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCB3ID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQudyk7XG4gICAgICBjb25zdCBybiA9IGF3YWl0IHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHBrYS5uKTtcbiAgICAgIGNvbnN0IGNuID0gcGthLmVuY3J5cHQobnUwLCBybik7XG4gICAgICBjb25zdCBtdSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgdyksIGNuKTtcbiAgICAgIHNoYXJlVG9CZVNlbnQubXUgPSBiaWdJbnRUb0J1ZmZlckJFKG11LCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgLy8gUHJvdmUgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBjb25zdCB3eCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQodyk7XG4gICAgICBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIGssXG4gICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11KSxcbiAgICAgICAgdyxcbiAgICAgICAgbnUwLFxuICAgICAgICBybixcbiAgICAgICAgd3hcbiAgICAgICk7XG4gICAgICBPYmplY3QuYXNzaWduKHNoYXJlVG9CZVNlbnQsIHtcbiAgICAgICAgd1Byb29mOiB7XG4gICAgICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUod3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmICgoc2hhcmVQYXJ0aWNpcGFudCBhcyBHU2hhcmUpLmFscGhhKSB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBQYXJ0aWFsPEJTaGFyZT47XG4gICAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBQYXJ0aWFsPEFTaGFyZT47XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5udGlsZGU7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5oMTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgyO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuY2s7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5uO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQubnRpbGRlO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaDE7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5oMjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lms7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5wcm9vZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2hhcmVUb0JlU2VudCwge1xuICAgICAgICAgIG46IGtTaGFyZS5uLFxuICAgICAgICAgIG50aWxkZTogYmlnSW50VG9CdWZmZXJCRShudGlsZGViLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBoMTogYmlnSW50VG9CdWZmZXJCRShoMWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGgyOiBiaWdJbnRUb0J1ZmZlckJFKGgyYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgazoga1NoYXJlLmssXG4gICAgICAgICAgcHJvb2Y6IGtTaGFyZS5wcm9vZixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghKCdhbHBoYScgaW4gc2hhcmVUb0JlU2VudCkgJiYgISgnaycgaW4gc2hhcmVUb0JlU2VudCkpIHtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBQYXJ0aWFsPEJTaGFyZT47XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubnRpbGRlO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgxO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgyO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmNrO1xuICAgICAgY29uc3QgbXVTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBNVVNoYXJlO1xuICAgICAgc2hhcmVUb0JlU2VudCA9IHtcbiAgICAgICAgaTogbXVTaGFyZVRvQmVTZW50LmksXG4gICAgICAgIGo6IG11U2hhcmVUb0JlU2VudC5qLFxuICAgICAgfSBhcyBNVVNoYXJlO1xuICAgIH1cbiAgICBbc2hhcmVUb0JlU2VudC5pLCBzaGFyZVRvQmVTZW50LmpdID0gW3NoYXJlVG9CZVNlbnQuaiwgc2hhcmVUb0JlU2VudC5pXTtcbiAgICBpZiAoaXNHYW1tYVNoYXJlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtdVNoYXJlOiBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmUsXG4gICAgICAgIGdTaGFyZTogc2hhcmVQYXJ0aWNpcGFudCBhcyBHU2hhcmUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYVNoYXJlOiBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZSxcbiAgICAgIGJTaGFyZTogc2hhcmVQYXJ0aWNpcGFudCBhcyBCU2hhcmUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5lIGdhbW1hIHNoYXJlcyB0byBnZXQgdGhlIHByaXZhdGUgb21pY3JvbiAvIGRlbHRhIHNoYXJlc1xuICAgKiBAcGFyYW0ge1NpZ25Db21iaW5lfSBzaGFyZXNcbiAgICogQHJldHVybnMge1NpZ25Db21iaW5lUlR9XG4gICAqL1xuICBzaWduQ29tYmluZShzaGFyZXM6IFNpZ25Db21iaW5lKTogU2lnbkNvbWJpbmVSVCB7XG4gICAgY29uc3QgZ1NoYXJlID0gc2hhcmVzLmdTaGFyZTtcbiAgICBjb25zdCBTID0gc2hhcmVzLnNpZ25JbmRleDtcbiAgICBjb25zdCBnYW1tYSA9IGhleFRvQmlnSW50KGdTaGFyZS5nYW1tYSk7XG4gICAgY29uc3QgYWxwaGEgPSBoZXhUb0JpZ0ludChnU2hhcmUuYWxwaGEpO1xuICAgIGNvbnN0IGJldGEgPSBoZXhUb0JpZ0ludChnU2hhcmUuYmV0YSk7XG4gICAgY29uc3QgbXUgPSBoZXhUb0JpZ0ludChnU2hhcmUubXUpO1xuICAgIGNvbnN0IG51ID0gaGV4VG9CaWdJbnQoZ1NoYXJlLm51KTtcbiAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmspO1xuICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChnU2hhcmUudyk7XG5cbiAgICBjb25zdCBkZWx0YSA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KGssIGdhbW1hKSwgRWNkc2EuY3VydmUuc2NhbGFyQWRkKGFscGhhLCBiZXRhKSk7XG4gICAgY29uc3Qgb21pY3JvbiA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KGssIHcpLCBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQobXUsIG51KSk7XG4gICAgY29uc3QgR2FtbWEgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGdhbW1hKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvU2hhcmU6IHtcbiAgICAgICAgaTogZ1NoYXJlLmksXG4gICAgICAgIHk6IGdTaGFyZS55LFxuICAgICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGssIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIG9taWNyb246IGJpZ0ludFRvQnVmZmVyQkUob21pY3JvbiwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgZGVsdGE6IGJpZ0ludFRvQnVmZmVyQkUoZGVsdGEsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIEdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKEdhbW1hLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIGRTaGFyZToge1xuICAgICAgICBpOiBTLmksXG4gICAgICAgIGo6IGdTaGFyZS5pLFxuICAgICAgICBkZWx0YTogYmlnSW50VG9CdWZmZXJCRShkZWx0YSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgR2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoR2FtbWEsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBNIE1lc3NhZ2UgdG8gYmUgc2lnbmVkXG4gICAqIEBwYXJhbSB7T1NoYXJlfSBvU2hhcmUgcHJpdmF0ZSBvbWljcm9uIHNoYXJlIG9mIGN1cnJlbnQgcGFydGljaXBhbnRcbiAgICogQHBhcmFtIHtEU2hhcmV9IGRTaGFyZSBkZWx0YSBzaGFyZSByZWNlaXZlZCBmcm9tIHRoZSBvdGhlciBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge0hhc2h9IGhhc2ggaGFzaGluZyBhbGdvcml0aG0gaW1wbGVtZW50aW5nIE5vZGVgcyBzdGFuZGFyZCBjcnlwdG8gaGFzaCBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRIYXNoIGlmIHRydWUsIHdlIGhhc2ggdGhlIHByb3ZpZGVkIGJ1ZmZlciBiZWZvcmUgc2lnbmluZ1xuICAgKiBAcmV0dXJucyB7U1NoYXJlfVxuICAgKi9cbiAgc2lnbihNOiBCdWZmZXIsIG9TaGFyZTogT1NoYXJlLCBkU2hhcmU6IERTaGFyZSwgaGFzaD86IEhhc2gsIHNob3VsZEhhc2ggPSB0cnVlKTogU1NoYXJlIHtcbiAgICBjb25zdCBtID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUoTSkuZGlnZXN0KCkgOiBNO1xuXG4gICAgY29uc3QgZGVsdGEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoaGV4VG9CaWdJbnQob1NoYXJlLmRlbHRhKSwgaGV4VG9CaWdJbnQoZFNoYXJlLmRlbHRhKSk7XG5cbiAgICBjb25zdCBSID0gRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShcbiAgICAgIEVjZHNhLmN1cnZlLnBvaW50QWRkKGhleFRvQmlnSW50KG9TaGFyZS5HYW1tYSksIGhleFRvQmlnSW50KGRTaGFyZS5HYW1tYSkpLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFySW52ZXJ0KGRlbHRhKVxuICAgICk7XG4gICAgY29uc3QgcG9pbnRSID0gc2VjcC5Qb2ludC5mcm9tSGV4KGJpZ0ludFRvQnVmZmVyQkUoUiwgMzIpKTtcbiAgICBjb25zdCByID0gcG9pbnRSLng7XG5cbiAgICBjb25zdCBzID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChiaWdJbnRGcm9tVThBQkUobSksIGhleFRvQmlnSW50KG9TaGFyZS5rKSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KHIsIGhleFRvQmlnSW50KG9TaGFyZS5vbWljcm9uKSlcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBpOiBvU2hhcmUuaSxcbiAgICAgIHk6IG9TaGFyZS55LFxuICAgICAgUjogcG9pbnRSLnRvSGV4KHRydWUpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShzLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGZ1bGwgc2lnbmF0dXJlIGJ5IGNvbWJpbmluZyBTaWduIFNoYXJlc1xuICAgKiBAcGFyYW0ge1NTaGFyZVtdfSBzaGFyZXNcbiAgICogQHJldHVybnMge1NpZ25hdHVyZX1cbiAgICovXG4gIGNvbnN0cnVjdFNpZ25hdHVyZShzaGFyZXM6IFNTaGFyZVtdKTogU2lnbmF0dXJlIHtcbiAgICAvLyBFdmVyeSBSIG11c3QgbWF0Y2guXG4gICAgY29uc3QgUiA9IHNoYXJlc1swXVsnUiddO1xuICAgIGNvbnN0IGlzUk1hdGNoaW5nID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IHNoYXJlWydSJ10gPT09IFIpLnJlZHVjZSgoYSwgYikgPT4gYSAmJiBiKTtcbiAgICBpZiAoIWlzUk1hdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1IgdmFsdWUgc2hvdWxkIGJlIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBzaGFyZXMnKTtcbiAgICB9XG5cbiAgICBsZXQgcyA9IHNoYXJlcy5tYXAoKHNoYXJlKSA9PiBoZXhUb0JpZ0ludChzaGFyZVsncyddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG4gICAgY29uc3QgcmVjaWQgPSAoUi5zbGljZSgwLCAyKSA9PT0gJzAzJyA/IDEgOiAwKSBeIChzID4gRWNkc2EuY3VydmUub3JkZXIoKSAvIEJpZ0ludCgyKSA/IDEgOiAwKTtcblxuICAgIC8vIE5vcm1hbGl6ZSBzLlxuICAgIHMgPSBzID4gRWNkc2EuY3VydmUub3JkZXIoKSAvIEJpZ0ludCgyKSA/IEVjZHNhLmN1cnZlLm9yZGVyKCkgLSBzIDogcztcbiAgICByZXR1cm4ge1xuICAgICAgeTogc2hhcmVzWzBdWyd5J10sXG4gICAgICByOiBSLnNsaWNlKDIpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShzLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgcmVjaWQ6IHJlY2lkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IGVjZHNhIHNpZ25hdHVyZXNcbiAgICogQHBhcmFtIHtCdWZmZXJ9IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTaWduYXR1cmUgfSBzaWduYXR1cmVcbiAgICogQHBhcmFtIHtIYXNofSBoYXNoIGhhc2hpbmcgYWxnb3JpdGhtIGltcGxlbWVudGluZyBOb2RlYHMgc3RhbmRhcmQgY3J5cHRvIGhhc2ggaW50ZXJmYWNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkSGFzaCBpZiB0cnVlLCB3ZSBoYXNoIHRoZSBwcm92aWRlZCBidWZmZXIgYmVmb3JlIHZlcmlmeWluZ1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQ7IEZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgdmVyaWZ5KG1lc3NhZ2U6IEJ1ZmZlciwgc2lnbmF0dXJlOiBTaWduYXR1cmUsIGhhc2g/OiBIYXNoLCBzaG91bGRIYXNoID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1lc3NhZ2VUb1ZlcmlmeSA9IHNob3VsZEhhc2ggPyAoaGFzaCB8fCBjcmVhdGVIYXNoKCdzaGEyNTYnKSkudXBkYXRlKG1lc3NhZ2UpLmRpZ2VzdCgpIDogbWVzc2FnZTtcbiAgICByZXR1cm4gRWNkc2EuY3VydmUudmVyaWZ5KFxuICAgICAgbWVzc2FnZVRvVmVyaWZ5LFxuICAgICAgQnVmZmVyLmNvbmNhdChbXG4gICAgICAgIEJ1ZmZlci5mcm9tKFtzaWduYXR1cmVbJ3JlY2lkJ11dKSxcbiAgICAgICAgYmlnSW50VG9CdWZmZXJCRShoZXhUb0JpZ0ludChzaWduYXR1cmVbJ3InXSksIDMyKSxcbiAgICAgICAgYmlnSW50VG9CdWZmZXJCRShoZXhUb0JpZ0ludChzaWduYXR1cmVbJ3MnXSksIDMyKSxcbiAgICAgIF0pLFxuICAgICAgaGV4VG9CaWdJbnQoc2lnbmF0dXJlWyd5J10pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgYSBjaGFsbGVuZ2UgYW5kIGl0J3MgcHJvb2ZzIGZyb20gaGV4IHN0cmluZ3MgdG8gYmlnaW50XG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZGstbGliLW1wYyBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlIGluc3RlYWRcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSk6IEVjZHNhVHlwZXMuRGVzZXJpYWxpemVkTnRpbGRlIHtcbiAgICByZXR1cm4gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBjaGFsbGVuZ2UgYW5kIGl0J3MgcHJvb2ZzIGZyb20gYmlnIGludCB0byBoZXggc3RyaW5ncy5cbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNkay1saWItbXBjIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUgaW5zdGVhZFxuICAgKiBAcGFyYW0gY2hhbGxlbmdlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZTogRWNkc2FUeXBlcy5EZXNlcmlhbGl6ZWROdGlsZGUpOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUge1xuICAgIHJldHVybiBFY2RzYVR5cGVzLnNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2UpO1xuICB9XG59XG4iXX0=
|