@bitgo/sdk-core 27.4.1 → 27.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/src/api/types.d.ts +1 -0
  3. package/dist/src/api/types.d.ts.map +1 -1
  4. package/dist/src/api/types.js +1 -1
  5. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +10 -0
  6. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  7. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  8. package/dist/src/bitgo/config.d.ts +6 -0
  9. package/dist/src/bitgo/config.d.ts.map +1 -1
  10. package/dist/src/bitgo/enterprise/enterprise.d.ts +2 -2
  11. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  12. package/dist/src/bitgo/enterprise/enterprise.js +9 -4
  13. package/dist/src/bitgo/environments.js +2 -2
  14. package/dist/src/bitgo/keychain/iKeychains.d.ts +27 -1
  15. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  16. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  17. package/dist/src/bitgo/keychain/keychains.d.ts +2 -1
  18. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  19. package/dist/src/bitgo/keychain/keychains.js +41 -2
  20. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  21. package/dist/src/bitgo/utils/mpcUtils.js +4 -1
  22. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +14 -3
  23. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  24. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +14 -1
  25. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +46 -2
  26. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  27. package/dist/src/bitgo/utils/tss/baseTypes.js +4 -1
  28. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +3 -3
  29. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  30. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +1 -1
  31. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +83 -9
  32. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  33. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +338 -50
  34. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +2 -2
  35. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  36. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +1 -1
  37. package/dist/src/bitgo/wallet/iWallet.d.ts +5 -1
  38. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  39. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  40. package/dist/src/bitgo/wallet/iWallets.d.ts +16 -2
  41. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  42. package/dist/src/bitgo/wallet/iWallets.js +32 -2
  43. package/dist/src/bitgo/wallet/wallet.d.ts +6 -0
  44. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  45. package/dist/src/bitgo/wallet/wallet.js +53 -6
  46. package/dist/src/bitgo/wallet/wallets.d.ts +10 -3
  47. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  48. package/dist/src/bitgo/wallet/wallets.js +68 -29
  49. package/dist/src/index.d.ts +2 -0
  50. package/dist/src/index.d.ts.map +1 -1
  51. package/dist/src/index.js +4 -2
  52. package/dist/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +5 -5
@@ -1,31 +1,52 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.EcdsaMPCv2Utils = void 0;
30
+ const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
7
31
  const assert_1 = __importDefault(require("assert"));
8
- const io_ts_types_1 = require("io-ts-types");
9
32
  const buffer_1 = require("buffer");
33
+ const io_ts_types_1 = require("io-ts-types");
10
34
  const keccak_1 = __importDefault(require("keccak"));
11
- const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
12
- const opengpgUtils_1 = require("../../opengpgUtils");
13
- const base_1 = require("./base");
35
+ const pgp = __importStar(require("openpgp"));
14
36
  const public_types_1 = require("@bitgo/public-types");
15
- const typesMPCv2_1 = require("./typesMPCv2");
16
- const baseTypes_1 = require("../baseTypes");
37
+ const account_lib_1 = require("../../../../account-lib");
17
38
  const tss_1 = require("../../../tss");
18
- const ecdsaMPCv2_1 = require("../../../tss/ecdsa/ecdsaMPCv2");
19
39
  const common_1 = require("../../../tss/common");
20
- const account_lib_1 = require("../../../../account-lib");
40
+ const ecdsaMPCv2_1 = require("../../../tss/ecdsa/ecdsaMPCv2");
41
+ const opengpgUtils_1 = require("../../opengpgUtils");
42
+ const baseTypes_1 = require("../baseTypes");
43
+ const base_1 = require("./base");
44
+ const typesMPCv2_1 = require("./typesMPCv2");
21
45
  class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
22
46
  /** @inheritdoc */
23
47
  async createKeychains(params) {
24
- var _a;
25
- const m = 2;
26
- const n = 3;
27
- const userSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.USER);
28
- const backupSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
48
+ var _a, _b;
49
+ const { userSession, backupSession } = this.getUserAndBackupSession(2, 3, params.retrofit);
29
50
  const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
30
51
  const backupGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
31
52
  // Get the BitGo public key based on user/enterprise feature flags
@@ -51,7 +72,12 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
51
72
  p2pMessages: [],
52
73
  });
53
74
  const round1Messages = await sdk_lib_mpc_1.DklsComms.encryptAndAuthOutgoingMessages(round1SerializedMessages, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
54
- const { sessionId, bitgoMsg1, bitgoToBackupMsg2, bitgoToUserMsg2 } = await this.sendKeyGenerationRound1(params.enterprise, userGpgKey.publicKey, backupGpgKey.publicKey, round1Messages);
75
+ const { sessionId, bitgoMsg1, bitgoToBackupMsg2, bitgoToUserMsg2 } = await this.sendKeyGenerationRound1(params.enterprise, userGpgKey.publicKey, backupGpgKey.publicKey, ((_b = params.retrofit) === null || _b === void 0 ? void 0 : _b.walletId)
76
+ ? {
77
+ ...round1Messages,
78
+ walletId: params.retrofit.walletId,
79
+ }
80
+ : round1Messages);
55
81
  // #endregion
56
82
  // #region round 2
57
83
  const bitgoRound1BroadcastMessages = await sdk_lib_mpc_1.DklsComms.decryptAndVerifyIncomingMessages({ p2pMessages: [], broadcastMessages: [this.formatBitgoBroadcastMessage(bitgoMsg1)] }, [bitgoGpgPubKey], [userGpgPrvKey, backupGpgPrvKey]);
@@ -213,36 +239,61 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
213
239
  * Converts user and backup MPCv1 SigningMaterial to RetrofitData needed by MPCv2 DKG.
214
240
  *
215
241
  * @param {Object} params - MPCv1 decrypted signing material for user and backup as a json.stringify string and bitgo's Big Si.
216
- * @returns {Promise<{ mpcv2UserKeyShare: DklsTypes.RetrofitData; mpcv2BakcupKeyShare: DklsTypes.RetrofitData }>} - the retrofit data needed to start an MPCv2 DKG session.
242
+ * @returns {{ mpcv2UserKeyShare: DklsTypes.RetrofitData; mpcv2BakcupKeyShare: DklsTypes.RetrofitData }} - the retrofit data needed to start an MPCv2 DKG session.
217
243
  */
218
- async getMpcV2RetrofitDataFromMpcV1Keys(params) {
219
- const userSigningMaterial = JSON.parse(params.mpcv1UserKeyShare);
220
- const backupSigningMaterial = JSON.parse(params.mpcv1BackupKeyShare);
244
+ getMpcV2RetrofitDataFromMpcV1Keys(params) {
221
245
  const mpc = new account_lib_1.Ecdsa();
222
- (0, assert_1.default)(userSigningMaterial.backupNShare, 'User MPCv1 key material should have backup NShare.');
223
- (0, assert_1.default)(backupSigningMaterial.userNShare, 'Backup MPCv1 key material should have user NShare.');
224
- const userCombined = mpc.keyCombine(userSigningMaterial.pShare, [
225
- userSigningMaterial.backupNShare,
226
- userSigningMaterial.bitgoNShare,
227
- ]);
228
- const backupCombined = mpc.keyCombine(backupSigningMaterial.pShare, [
229
- backupSigningMaterial.userNShare,
230
- backupSigningMaterial.bitgoNShare,
231
- ]);
232
246
  const xiList = [
233
247
  Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(1), 32)),
234
248
  Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(2), 32)),
235
249
  Array.from((0, sdk_lib_mpc_1.bigIntToBufferBE)(BigInt(3), 32)),
236
250
  ];
237
251
  return {
238
- mpcv2BakcupKeyShare: {
239
- xShare: backupCombined.xShare,
240
- xiList: xiList,
241
- },
242
- mpcv2UserKeyShare: {
243
- xShare: userCombined.xShare,
244
- xiList: xiList,
245
- },
252
+ mpcv2UserKeyShare: this.getMpcV2RetrofitDataFromMpcV1Key({
253
+ mpcv1PartyKeyShare: params.mpcv1UserKeyShare,
254
+ mpcv1PartyIndex: 1,
255
+ xiList,
256
+ mpc,
257
+ }),
258
+ mpcv2BackupKeyShare: this.getMpcV2RetrofitDataFromMpcV1Key({
259
+ mpcv1PartyKeyShare: params.mpcv1BackupKeyShare,
260
+ mpcv1PartyIndex: 2,
261
+ xiList,
262
+ mpc,
263
+ }),
264
+ };
265
+ }
266
+ getMpcV2RetrofitDataFromMpcV1Key({ mpcv1PartyKeyShare, mpcv1PartyIndex, xiList, mpc, }) {
267
+ const signingMaterial = JSON.parse(mpcv1PartyKeyShare);
268
+ let keyCombined = undefined;
269
+ switch (mpcv1PartyIndex) {
270
+ case 1:
271
+ (0, assert_1.default)(signingMaterial.backupNShare, 'User MPCv1 key material should have backup NShare.');
272
+ (0, assert_1.default)(signingMaterial.bitgoNShare, 'BitGo MPCv1 key material should have user NShare.');
273
+ keyCombined = mpc.keyCombine(signingMaterial.pShare, [
274
+ signingMaterial.backupNShare,
275
+ signingMaterial.bitgoNShare,
276
+ ]);
277
+ break;
278
+ case 2:
279
+ (0, assert_1.default)(signingMaterial.userNShare, 'User MPCv1 key material should have backup NShare.');
280
+ (0, assert_1.default)(signingMaterial.bitgoNShare, 'BitGo MPCv1 key material should have user NShare.');
281
+ keyCombined = mpc.keyCombine(signingMaterial.pShare, [signingMaterial.userNShare, signingMaterial.bitgoNShare]);
282
+ break;
283
+ case 3:
284
+ (0, assert_1.default)(signingMaterial.userNShare, 'User MPCv1 key material should have backup NShare.');
285
+ (0, assert_1.default)(signingMaterial.backupNShare, 'Backup MPCv1 key material should have user NShare.');
286
+ keyCombined = mpc.keyCombine(signingMaterial.pShare, [
287
+ signingMaterial.userNShare,
288
+ signingMaterial.backupNShare,
289
+ ]);
290
+ break;
291
+ default:
292
+ throw new Error('Invalid participant index');
293
+ }
294
+ return {
295
+ xShare: keyCombined.xShare,
296
+ xiList: xiList,
246
297
  };
247
298
  }
248
299
  async addUserKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode) {
@@ -251,6 +302,20 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
251
302
  async addBackupKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode) {
252
303
  return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode);
253
304
  }
305
+ getUserAndBackupSession(m, n, retrofit) {
306
+ if (retrofit) {
307
+ const retrofitData = this.getMpcV2RetrofitDataFromMpcV1Keys({
308
+ mpcv1UserKeyShare: retrofit.decryptedUserKey,
309
+ mpcv1BackupKeyShare: retrofit.decryptedBackupKey,
310
+ });
311
+ const userSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.USER, undefined, retrofitData.mpcv2UserKeyShare);
312
+ const backupSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.BACKUP, undefined, retrofitData.mpcv2BackupKeyShare);
313
+ return { userSession, backupSession };
314
+ }
315
+ const userSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.USER);
316
+ const backupSession = new sdk_lib_mpc_1.DklsDkg.Dkg(n, m, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
317
+ return { userSession, backupSession };
318
+ }
254
319
  async addBitgoKeychain(commonKeychain) {
255
320
  return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, commonKeychain);
256
321
  }
@@ -275,6 +340,7 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
275
340
  backupGpgPublicKey,
276
341
  userMsg1: { from: 0, ...userMsg1 },
277
342
  backupMsg1: { from: 1, ...backupMsg1 },
343
+ walletId: payload.walletId,
278
344
  });
279
345
  }
280
346
  async sendKeyGenerationRound2(enterprise, sessionId, payload) {
@@ -324,6 +390,8 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
324
390
  backupMsg4: { from: 1, ...backupMsg4 },
325
391
  });
326
392
  }
393
+ // #endregion
394
+ // #region sign tx request
327
395
  /**
328
396
  * Signs the transaction associated to the transaction request.
329
397
  * @param {string | TxRequest} params.txRequest - transaction request object or id
@@ -335,13 +403,25 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
335
403
  this.bitgo.setRequestTracer(params.reqId);
336
404
  return this.signRequestBase(params, baseTypes_1.RequestType.tx);
337
405
  }
406
+ /**
407
+ * Signs the message associated to the transaction request.
408
+ * @param {string | TxRequest} params.txRequest - transaction request object or id
409
+ * @param {string} params.prv - decrypted private key
410
+ * @param {string} params.reqId - request id
411
+ * @returns {Promise<TxRequest>} fully signed TxRequest object
412
+ */
413
+ async signTxRequestForMessage(params) {
414
+ this.bitgo.setRequestTracer(params.reqId);
415
+ return this.signRequestBase(params, baseTypes_1.RequestType.message);
416
+ }
338
417
  async signRequestBase(params, requestType) {
339
418
  const userKeyShare = buffer_1.Buffer.from(params.prv, 'base64');
340
419
  const txRequest = typeof params.txRequest === 'string'
341
420
  ? await (0, tss_1.getTxRequest)(this.bitgo, this.wallet.id(), params.txRequest, params.reqId)
342
421
  : params.txRequest;
422
+ let txOrMessageToSign;
343
423
  let derivationPath;
344
- let txToSign;
424
+ let bufferContent;
345
425
  const [userGpgKey, bitgoGpgPubKey] = await Promise.all([
346
426
  (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1'),
347
427
  this.getBitgoGpgPubkeyBasedOnFeatureFlags(txRequest.enterpriseId, true, params.reqId).then((pubKey) => pubKey !== null && pubKey !== void 0 ? pubKey : this.bitgoMPCv2PublicGpgKey),
@@ -352,11 +432,14 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
352
432
  if (requestType === baseTypes_1.RequestType.tx) {
353
433
  (0, assert_1.default)(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
354
434
  const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
355
- txToSign = unsignedTx.signableHex;
435
+ txOrMessageToSign = unsignedTx.signableHex;
356
436
  derivationPath = unsignedTx.derivationPath;
437
+ bufferContent = buffer_1.Buffer.from(txOrMessageToSign, 'hex');
357
438
  }
358
439
  else if (requestType === baseTypes_1.RequestType.message) {
359
- throw new Error('MPCv2 message signing not supported yet.');
440
+ txOrMessageToSign = txRequest.messages[0].messageEncoded;
441
+ derivationPath = txRequest.messages[0].derivationPath || 'm/0';
442
+ bufferContent = buffer_1.Buffer.from(txOrMessageToSign);
360
443
  }
361
444
  else {
362
445
  throw new Error('Invalid request type');
@@ -368,13 +451,20 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
368
451
  catch (err) {
369
452
  hash = (0, keccak_1.default)('keccak256');
370
453
  }
371
- const hashBuffer = hash.update(buffer_1.Buffer.from(txToSign, 'hex')).digest();
454
+ // check what the encoding is supposed to be for message
455
+ const hashBuffer = hash.update(bufferContent).digest();
372
456
  const otherSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
373
457
  const userSignerBroadcastMsg1 = await otherSigner.init();
374
458
  const signatureShareRound1 = await (0, ecdsaMPCv2_1.getSignatureShareRoundOne)(userSignerBroadcastMsg1, userGpgKey);
375
- let latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound1], baseTypes_1.RequestType.tx, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
376
- (0, assert_1.default)(latestTxRequest.transactions);
377
- const bitgoToUserMessages1And2 = latestTxRequest.transactions[0].signatureShares;
459
+ let latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
460
+ (0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest Object');
461
+ let bitgoToUserMessages1And2;
462
+ if (requestType === baseTypes_1.RequestType.tx) {
463
+ bitgoToUserMessages1And2 = latestTxRequest.transactions[0].signatureShares;
464
+ }
465
+ else {
466
+ bitgoToUserMessages1And2 = latestTxRequest.messages[0].signatureShares;
467
+ }
378
468
  // TODO: Use codec for parsing
379
469
  const parsedBitGoToUserSigShareRoundOne = JSON.parse(bitgoToUserMessages1And2[bitgoToUserMessages1And2.length - 1].share);
380
470
  if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
@@ -392,9 +482,11 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
392
482
  broadcastMessages: [],
393
483
  });
394
484
  const signatureShareRoundTwo = await (0, ecdsaMPCv2_1.getSignatureShareRoundTwo)(userToBitGoMessagesRound2, userToBitGoMessagesRound3, userGpgKey, bitgoGpgPubKey);
395
- latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundTwo], baseTypes_1.RequestType.tx, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
396
- (0, assert_1.default)(latestTxRequest.transactions);
397
- const txRequestSignatureShares = latestTxRequest.transactions[0].signatureShares;
485
+ latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundTwo], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
486
+ (0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest Object');
487
+ const txRequestSignatureShares = requestType === baseTypes_1.RequestType.tx
488
+ ? latestTxRequest.transactions[0].signatureShares
489
+ : latestTxRequest.messages[0].signatureShares;
398
490
  // TODO: Use codec for parsing
399
491
  const parsedBitGoToUserSigShareRoundTwo = JSON.parse(txRequestSignatureShares[txRequestSignatureShares.length - 1].share);
400
492
  if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
@@ -412,11 +504,11 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
412
504
  });
413
505
  const signatureShareRoundThree = await (0, ecdsaMPCv2_1.getSignatureShareRoundThree)(userToBitGoMessagesRound4, userGpgKey, bitgoGpgPubKey);
414
506
  // Submit for final signature share combine
415
- await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundThree], baseTypes_1.RequestType.tx, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
416
- return (0, common_1.sendTxRequest)(this.bitgo, txRequest.walletId, txRequest.txRequestId, baseTypes_1.RequestType.tx, params.reqId);
507
+ await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundThree], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
508
+ return (0, common_1.sendTxRequest)(this.bitgo, txRequest.walletId, txRequest.txRequestId, requestType, params.reqId);
417
509
  }
418
510
  // #endregion
419
- // #region utils
511
+ // #region private utils
420
512
  formatBitgoBroadcastMessage(broadcastMessage) {
421
513
  return {
422
514
  from: broadcastMessage.from,
@@ -431,6 +523,202 @@ class EcdsaMPCv2Utils extends base_1.BaseEcdsaUtils {
431
523
  commitment,
432
524
  };
433
525
  }
526
+ /**
527
+ * Get the hash string and derivation path from the transaction request.
528
+ * @param {TxRequest} txRequest - the transaction request object
529
+ * @param {RequestType} requestType - the request type
530
+ * @returns {{ hashBuffer: Buffer; derivationPath: string }} - the hash string and derivation path
531
+ */
532
+ getHashStringAndDerivationPath(txRequest, requestType = baseTypes_1.RequestType.tx) {
533
+ let txToSign;
534
+ let derivationPath;
535
+ if (requestType === baseTypes_1.RequestType.tx) {
536
+ (0, assert_1.default)(txRequest.transactions && txRequest.transactions.length === 1, 'Unable to find transactions in txRequest');
537
+ txToSign = txRequest.transactions[0].unsignedTx.signableHex;
538
+ derivationPath = txRequest.transactions[0].unsignedTx.derivationPath;
539
+ }
540
+ else if (requestType === baseTypes_1.RequestType.message) {
541
+ // TODO(WP-2176): Add support for message signing
542
+ throw new Error('MPCv2 message signing not supported yet.');
543
+ }
544
+ else {
545
+ throw new Error('Invalid request type, got: ' + requestType);
546
+ }
547
+ let hash;
548
+ try {
549
+ hash = this.baseCoin.getHashFunction();
550
+ }
551
+ catch (err) {
552
+ hash = (0, keccak_1.default)('keccak256');
553
+ }
554
+ const hashBuffer = hash.update(buffer_1.Buffer.from(txToSign, 'hex')).digest();
555
+ return { hashBuffer, derivationPath };
556
+ }
557
+ /**
558
+ * Gets the BitGo and user GPG keys from the BitGo public GPG key and the encrypted user GPG private key.
559
+ * @param {string} bitgoPublicGpgKey - the BitGo public GPG key
560
+ * @param {string} encryptedUserGpgPrvKey - the encrypted user GPG private key
561
+ * @param {string} walletPassphrase - the wallet passphrase
562
+ * @returns {Promise<{ bitgoGpgKey: pgp.Key; userGpgKey: pgp.SerializedKeyPair<string> }>} - the BitGo and user GPG keys
563
+ */
564
+ async getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase) {
565
+ const bitgoGpgKey = await pgp.readKey({ armoredKey: bitgoPublicGpgKey });
566
+ const userDecryptedKey = await pgp.readKey({
567
+ armoredKey: this.bitgo.decrypt({ input: encryptedUserGpgPrvKey, password: walletPassphrase }),
568
+ });
569
+ const userGpgKey = {
570
+ privateKey: userDecryptedKey.armor(),
571
+ publicKey: userDecryptedKey.toPublic().armor(),
572
+ };
573
+ return {
574
+ bitgoGpgKey,
575
+ userGpgKey,
576
+ };
577
+ }
578
+ /**
579
+ * Validates the adata and cyphertext.
580
+ * @param adata string
581
+ * @param cyphertext string
582
+ * @returns void
583
+ * @throws {Error} if the adata or cyphertext is invalid
584
+ */
585
+ validateAdata(adata, cyphertext) {
586
+ let cypherJson;
587
+ try {
588
+ cypherJson = JSON.parse(cyphertext);
589
+ }
590
+ catch (e) {
591
+ throw new Error('Failed to parse cyphertext to JSON, got: ' + cyphertext);
592
+ }
593
+ if (cypherJson.adata !== adata) {
594
+ throw new Error('Adata does not match cyphertext adata');
595
+ }
596
+ }
597
+ // #endregion
598
+ // #region external signer
599
+ /** @inheritdoc */
600
+ async signEcdsaMPCv2TssUsingExternalSigner(params, externalSignerMPCv2SigningRound1Generator, externalSignerMPCv2SigningRound2Generator, externalSignerMPCv2SigningRound3Generator, requestType = baseTypes_1.RequestType.tx) {
601
+ var _a;
602
+ const { txRequest, reqId } = params;
603
+ let txRequestResolved;
604
+ // TODO(WP-2176): Add support for message signing
605
+ (0, assert_1.default)(requestType === baseTypes_1.RequestType.tx, 'Only transaction signing is supported for external signer, got: ' + requestType);
606
+ if (typeof txRequest === 'string') {
607
+ txRequestResolved = await (0, tss_1.getTxRequest)(this.bitgo, this.wallet.id(), txRequest, reqId);
608
+ }
609
+ else {
610
+ txRequestResolved = txRequest;
611
+ }
612
+ const bitgoPublicGpgKey = (_a = (await this.getBitgoGpgPubkeyBasedOnFeatureFlags(txRequestResolved.enterpriseId, true, reqId))) !== null && _a !== void 0 ? _a : this.bitgoMPCv2PublicGpgKey;
613
+ if (!bitgoPublicGpgKey) {
614
+ throw new Error('Missing BitGo GPG key for MPCv2');
615
+ }
616
+ // round 1
617
+ const { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey } = await externalSignerMPCv2SigningRound1Generator({ txRequest: txRequestResolved });
618
+ const round1TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
619
+ // round 2
620
+ const { signatureShareRound2, encryptedRound2Session } = await externalSignerMPCv2SigningRound2Generator({
621
+ txRequest: round1TxRequest,
622
+ encryptedRound1Session,
623
+ encryptedUserGpgPrvKey,
624
+ bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
625
+ });
626
+ const round2TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound2], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
627
+ (0, assert_1.default)(round2TxRequest.transactions && round2TxRequest.transactions[0].signatureShares, 'Missing signature shares in round 2 txRequest');
628
+ // round 3
629
+ const { signatureShareRound3 } = await externalSignerMPCv2SigningRound3Generator({
630
+ txRequest: round2TxRequest,
631
+ encryptedRound2Session,
632
+ encryptedUserGpgPrvKey,
633
+ bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
634
+ });
635
+ await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
636
+ return (0, common_1.sendTxRequest)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, requestType, reqId);
637
+ }
638
+ async createOfflineRound1Share(params) {
639
+ const { prv, walletPassphrase, txRequest } = params;
640
+ const { hashBuffer, derivationPath } = this.getHashStringAndDerivationPath(txRequest);
641
+ const adata = hashBuffer.toString('hex');
642
+ const userKeyShare = buffer_1.Buffer.from(prv, 'base64');
643
+ const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('secp256k1');
644
+ const userSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
645
+ const userSignerBroadcastMsg1 = await userSigner.init();
646
+ const signatureShareRound1 = await (0, ecdsaMPCv2_1.getSignatureShareRoundOne)(userSignerBroadcastMsg1, userGpgKey);
647
+ const session = userSigner.getSession();
648
+ const encryptedRound1Session = this.bitgo.encrypt({ input: session, password: walletPassphrase, adata });
649
+ const userGpgPubKey = userGpgKey.publicKey;
650
+ const encryptedUserGpgPrvKey = this.bitgo.encrypt({
651
+ input: userGpgKey.privateKey,
652
+ password: walletPassphrase,
653
+ adata,
654
+ });
655
+ return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
656
+ }
657
+ async createOfflineRound2Share(params) {
658
+ var _a;
659
+ const { prv, walletPassphrase, encryptedUserGpgPrvKey, encryptedRound1Session, bitgoPublicGpgKey, txRequest } = params;
660
+ const { hashBuffer, derivationPath } = this.getHashStringAndDerivationPath(txRequest);
661
+ const adata = hashBuffer.toString('hex');
662
+ const { bitgoGpgKey, userGpgKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase);
663
+ const signatureShares = (_a = txRequest.transactions) === null || _a === void 0 ? void 0 : _a[0].signatureShares;
664
+ (0, assert_1.default)(signatureShares, 'Missing signature shares in round 1 txRequest');
665
+ const parsedBitGoToUserSigShareRoundOne = JSON.parse(signatureShares[signatureShares.length - 1].share);
666
+ if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
667
+ throw new Error('Unexpected signature share response. Unable to parse data.');
668
+ }
669
+ const serializedBitGoToUserMessagesRound1 = await (0, ecdsaMPCv2_1.verifyBitGoMessagesAndSignaturesRoundOne)(parsedBitGoToUserSigShareRoundOne, userGpgKey, bitgoGpgKey);
670
+ const round1Session = this.bitgo.decrypt({ input: encryptedRound1Session, password: walletPassphrase });
671
+ this.validateAdata(adata, encryptedRound1Session);
672
+ const userKeyShare = buffer_1.Buffer.from(prv, 'base64');
673
+ const userSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
674
+ userSigner.setSession(round1Session);
675
+ const deserializedMessages = sdk_lib_mpc_1.DklsTypes.deserializeMessages(serializedBitGoToUserMessagesRound1);
676
+ const userToBitGoMessagesRound2 = userSigner.handleIncomingMessages({
677
+ p2pMessages: [],
678
+ broadcastMessages: deserializedMessages.broadcastMessages,
679
+ });
680
+ const userToBitGoMessagesRound3 = userSigner.handleIncomingMessages({
681
+ p2pMessages: deserializedMessages.p2pMessages,
682
+ broadcastMessages: [],
683
+ });
684
+ const signatureShareRound2 = await (0, ecdsaMPCv2_1.getSignatureShareRoundTwo)(userToBitGoMessagesRound2, userToBitGoMessagesRound3, userGpgKey, bitgoGpgKey);
685
+ const session = userSigner.getSession();
686
+ const encryptedRound2Session = this.bitgo.encrypt({ input: session, password: walletPassphrase, adata });
687
+ return {
688
+ signatureShareRound2,
689
+ encryptedRound2Session,
690
+ };
691
+ }
692
+ async createOfflineRound3Share(params) {
693
+ var _a;
694
+ const { prv, walletPassphrase, encryptedUserGpgPrvKey, encryptedRound2Session, bitgoPublicGpgKey, txRequest } = params;
695
+ (0, assert_1.default)(txRequest.transactions && txRequest.transactions.length === 1, 'Unable to find transactions in txRequest');
696
+ const { hashBuffer, derivationPath } = this.getHashStringAndDerivationPath(txRequest);
697
+ const adata = hashBuffer.toString('hex');
698
+ const { bitgoGpgKey, userGpgKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase);
699
+ const signatureShares = (_a = txRequest.transactions) === null || _a === void 0 ? void 0 : _a[0].signatureShares;
700
+ (0, assert_1.default)(signatureShares, 'Missing signature shares in round 2 txRequest');
701
+ const parsedBitGoToUserSigShareRoundTwo = JSON.parse(signatureShares[signatureShares.length - 1].share);
702
+ if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
703
+ throw new Error('Unexpected signature share response. Unable to parse data.');
704
+ }
705
+ const serializedBitGoToUserMessagesRound3 = await (0, ecdsaMPCv2_1.verifyBitGoMessagesAndSignaturesRoundTwo)(parsedBitGoToUserSigShareRoundTwo, userGpgKey, bitgoGpgKey);
706
+ const deserializedBitGoToUserMessagesRound3 = sdk_lib_mpc_1.DklsTypes.deserializeMessages({
707
+ p2pMessages: serializedBitGoToUserMessagesRound3.p2pMessages,
708
+ broadcastMessages: [],
709
+ });
710
+ const round2Session = this.bitgo.decrypt({ input: encryptedRound2Session, password: walletPassphrase });
711
+ this.validateAdata(adata, encryptedRound2Session);
712
+ const userKeyShare = buffer_1.Buffer.from(prv, 'base64');
713
+ const userSigner = new sdk_lib_mpc_1.DklsDsg.Dsg(userKeyShare, 0, derivationPath, hashBuffer);
714
+ userSigner.setSession(round2Session);
715
+ const userToBitGoMessagesRound4 = userSigner.handleIncomingMessages({
716
+ p2pMessages: deserializedBitGoToUserMessagesRound3.p2pMessages,
717
+ broadcastMessages: [],
718
+ });
719
+ const signatureShareRound3 = await (0, ecdsaMPCv2_1.getSignatureShareRoundThree)(userToBitGoMessagesRound4, userGpgKey, bitgoGpgKey);
720
+ return { signatureShareRound3 };
721
+ }
434
722
  }
435
723
  exports.EcdsaMPCv2Utils = EcdsaMPCv2Utils;
436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBQTZDO0FBQzdDLG1DQUFnQztBQUVoQyxvREFBc0M7QUFDdEMsb0RBQThGO0FBSTlGLHFEQUF3RDtBQUN4RCxpQ0FBd0M7QUFDeEMsc0RBWTZCO0FBQzdCLDZDQUE4RztBQUM5Ryw0Q0FBc0Y7QUFDdEYsc0NBQThEO0FBQzlELDhEQU11QztBQUN2QyxnREFBMEU7QUFDMUUseURBQWdEO0FBRWhELE1BQWEsZUFBZ0IsU0FBUSxxQkFBYztJQUNqRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUlyQjs7UUFDQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWixNQUFNLFdBQVcsR0FBRyxJQUFJLHFCQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsNkJBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsTUFBTSxhQUFhLEdBQUcsSUFBSSxxQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLDZCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBQSxpQ0FBa0IsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUN6RCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0Qsa0VBQWtFO1FBQ2xFLG9FQUFvRTtRQUNwRSxNQUFNLGlCQUFpQixHQUFHLENBQ3hCLE1BQUEsQ0FBQyxNQUFNLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLG1DQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FDMUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVWLE1BQU0sYUFBYSxHQUEwQjtZQUMzQyxPQUFPLEVBQUUsNkJBQWdCLENBQUMsSUFBSTtZQUM5QixNQUFNLEVBQUUsVUFBVSxDQUFDLFVBQVU7U0FDOUIsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUEwQjtZQUM3QyxPQUFPLEVBQUUsNkJBQWdCLENBQUMsTUFBTTtZQUNoQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFVBQVU7U0FDaEMsQ0FBQztRQUNGLE1BQU0sY0FBYyxHQUEwQjtZQUM1QyxPQUFPLEVBQUUsNkJBQWdCLENBQUMsS0FBSztZQUMvQixNQUFNLEVBQUUsaUJBQWlCO1NBQzFCLENBQUM7UUFFRixrQkFBa0I7UUFDbEIsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzRCxNQUFNLHdCQUF3QixHQUFHLE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9ELE1BQU0sd0JBQXdCLEdBQUcsdUJBQVMsQ0FBQyxpQkFBaUIsQ0FBQztZQUMzRCxpQkFBaUIsRUFBRSxDQUFDLHNCQUFzQixFQUFFLHdCQUF3QixDQUFDO1lBQ3JFLFdBQVcsRUFBRSxFQUFFO1NBQ2hCLENBQUMsQ0FBQztRQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sdUJBQVMsQ0FBQyw4QkFBOEIsQ0FDbkUsd0JBQXdCLEVBQ3hCLENBQUMsY0FBYyxDQUFDLEVBQ2hCLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUNqQyxDQUFDO1FBRUYsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQ3JHLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLFVBQVUsQ0FBQyxTQUFTLEVBQ3BCLFlBQVksQ0FBQyxTQUFTLEVBQ3RCLGNBQWMsQ0FDZixDQUFDO1FBQ0YsYUFBYTtRQUViLGtCQUFrQjtRQUNsQixNQUFNLDRCQUE0QixHQUFHLE1BQU0sdUJBQVMsQ0FBQyxnQ0FBZ0MsQ0FDbkYsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFDckYsQ0FBQyxjQUFjLENBQUMsRUFDaEIsQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQ2pDLENBQUM7UUFDRixNQUFNLHVCQUF1QixHQUFHLDRCQUE0QixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDakYsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsS0FBSyxDQUN6QyxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLHVCQUF1QixFQUFFLGlEQUFpRCxDQUFDLENBQUM7UUFFbkYsTUFBTSxxQkFBcUIsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUM7WUFDL0QsV0FBVyxFQUFFLEVBQUU7WUFDZixpQkFBaUIsRUFBRSxDQUFDLHVCQUFTLENBQUMsMkJBQTJCLENBQUMsdUJBQXVCLENBQUMsRUFBRSx3QkFBd0IsQ0FBQztTQUM5RyxDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUM1RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyw2QkFBZ0IsQ0FBQyxLQUFLLENBQzNFLENBQUM7UUFDRixJQUFBLGdCQUFNLEVBQUMsZUFBZSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7UUFDcEUsTUFBTSx5QkFBeUIsR0FBRyx1QkFBUyxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWpGLE1BQU0sdUJBQXVCLEdBQUcsYUFBYSxDQUFDLHNCQUFzQixDQUFDO1lBQ25FLFdBQVcsRUFBRSxFQUFFO1lBQ2YsaUJBQWlCLEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSx1QkFBUyxDQUFDLDJCQUEyQixDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDNUcsQ0FBQyxDQUFDO1FBQ0gsTUFBTSwyQkFBMkIsR0FBRyx1QkFBUyxDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDdkcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssNkJBQWdCLENBQUMsS0FBSyxDQUM3RSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLDJCQUEyQixFQUFFLDRDQUE0QyxDQUFDLENBQUM7UUFFbEYsTUFBTSxjQUFjLEdBQUcsTUFBTSx1QkFBUyxDQUFDLDhCQUE4QixDQUNuRSxFQUFFLFdBQVcsRUFBRSxDQUFDLHlCQUF5QixFQUFFLDJCQUEyQixDQUFDLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQ2hHLENBQUMsY0FBYyxDQUFDLEVBQ2hCLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUNqQyxDQUFDO1FBRUYsTUFBTSxFQUNKLFNBQVMsRUFBRSxlQUFlLEVBQzFCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsaUJBQWlCLEdBQ2xCLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDckYsYUFBYTtRQUViLGtCQUFrQjtRQUNsQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDbkYsTUFBTSw4QkFBOEIsR0FBRyxNQUFNLHVCQUFTLENBQUMsZ0NBQWdDLENBQ3JGLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQ2hGLENBQUMsY0FBYyxDQUFDLEVBQ2hCLENBQUMsYUFBYSxDQUFDLENBQ2hCLENBQUM7UUFDRixNQUFNLDhCQUE4QixHQUFHLDhCQUE4QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3BGLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUFnQixDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLDZCQUFnQixDQUFDLElBQUksQ0FDM0UsQ0FBQztRQUNGLElBQUEsZ0JBQU0sRUFBQyw4QkFBOEIsRUFBRSxtREFBbUQsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sb0JBQW9CLEdBQUcsdUJBQVMsQ0FBQyxxQkFBcUIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBRTdGLE1BQU0sK0JBQStCLEdBQUcsTUFBTSx1QkFBUyxDQUFDLGdDQUFnQyxDQUN0RixFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQ2xGLENBQUMsY0FBYyxDQUFDLEVBQ2hCLENBQUMsZUFBZSxDQUFDLENBQ2xCLENBQUM7UUFDRixNQUFNLGdDQUFnQyxHQUFHLCtCQUErQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3ZGLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUFnQixDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLDZCQUFnQixDQUFDLE1BQU0sQ0FDN0UsQ0FBQztRQUNGLElBQUEsZ0JBQU0sRUFBQyxnQ0FBZ0MsRUFBRSxxREFBcUQsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sc0JBQXNCLEdBQUcsdUJBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBRWpHLE1BQU0sZ0JBQWdCLEdBQUcscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDN0QsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssNkJBQWdCLENBQUMsTUFBTSxDQUM1RSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixFQUFFLG9EQUFvRCxDQUFDLENBQUM7UUFFL0UsTUFBTSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUMvRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyw2QkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJLENBQzVFLENBQUM7UUFDRixJQUFBLGdCQUFNLEVBQUMsZ0JBQWdCLEVBQUUsb0RBQW9ELENBQUMsQ0FBQztRQUUvRSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLFdBQVcsRUFBRSxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixDQUFDO1NBQ3RELENBQUMsQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDMUQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssNkJBQWdCLENBQUMsTUFBTSxDQUM1RSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixFQUFFLG9EQUFvRCxDQUFDLENBQUM7UUFDL0UsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDekQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssNkJBQWdCLENBQUMsS0FBSyxDQUMzRSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLGVBQWUsRUFBRSxtREFBbUQsQ0FBQyxDQUFDO1FBQzdFLE1BQU0seUJBQXlCLEdBQUcsdUJBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVqRixNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUNoRSxpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLFdBQVcsRUFBRSxDQUFDLHNCQUFzQixFQUFFLGdCQUFnQixDQUFDO1NBQ3hELENBQUMsQ0FBQztRQUVILE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDNUQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssNkJBQWdCLENBQUMsSUFBSSxDQUM1RSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLGdCQUFnQixFQUFFLG9EQUFvRCxDQUFDLENBQUM7UUFDL0UsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUM3RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyw2QkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyw2QkFBZ0IsQ0FBQyxLQUFLLENBQzdFLENBQUM7UUFDRixJQUFBLGdCQUFNLEVBQUMsaUJBQWlCLEVBQUUscURBQXFELENBQUMsQ0FBQztRQUNqRixNQUFNLDJCQUEyQixHQUFHLHVCQUFTLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVyRixNQUFNLGtDQUFrQyxHQUFHLE1BQU0sdUJBQVMsQ0FBQyxnQ0FBZ0MsQ0FDekYsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFDbEcsQ0FBQyxjQUFjLENBQUMsRUFDaEIsQ0FBQyxhQUFhLENBQUMsQ0FDaEIsQ0FBQztRQUNGLE1BQU0sOEJBQThCLEdBQUcsa0NBQWtDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDeEYsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssNkJBQWdCLENBQUMsSUFBSSxDQUMzRSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLDhCQUE4QixFQUFFLG1EQUFtRCxDQUFDLENBQUM7UUFDNUYsTUFBTSxvQkFBb0IsR0FBRyx1QkFBUyxDQUFDLHFCQUFxQixDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFFN0YsTUFBTSxvQ0FBb0MsR0FBRyxNQUFNLHVCQUFTLENBQUMsZ0NBQWdDLENBQzNGLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFDcEcsQ0FBQyxjQUFjLENBQUMsRUFDaEIsQ0FBQyxlQUFlLENBQUMsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sZ0NBQWdDLEdBQUcsb0NBQW9DLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDNUYsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssNkJBQWdCLENBQUMsTUFBTSxDQUM3RSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLGdDQUFnQyxFQUFFLHFEQUFxRCxDQUFDLENBQUM7UUFDaEcsTUFBTSxzQkFBc0IsR0FBRyx1QkFBUyxDQUFDLHFCQUFxQixDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFFakcsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsV0FBVyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUM7WUFDckQsaUJBQWlCLEVBQUUsRUFBRTtTQUN0QixDQUFDLENBQUM7UUFFSCxNQUFNLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsSCxJQUFBLGdCQUFNLEVBQUMsc0JBQXNCLEVBQUUsZ0RBQWdELENBQUMsQ0FBQztRQUNqRixNQUFNLGdDQUFnQyxHQUFHLHVCQUFTLENBQUMseUJBQXlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVyRyxNQUFNLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztZQUNoRSxXQUFXLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQztZQUN2RCxpQkFBaUIsRUFBRSxFQUFFO1NBQ3RCLENBQUMsQ0FBQztRQUNILE1BQU0sd0JBQXdCLEdBQUcsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUMxRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyw2QkFBZ0IsQ0FBQyxNQUFNLENBQzFDLENBQUM7UUFDRixJQUFBLGdCQUFNLEVBQUMsd0JBQXdCLEVBQUUsa0RBQWtELENBQUMsQ0FBQztRQUNyRixNQUFNLGtDQUFrQyxHQUFHLHVCQUFTLENBQUMseUJBQXlCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUV6RyxNQUFNLGNBQWMsR0FBRyxNQUFNLHVCQUFTLENBQUMsOEJBQThCLENBQ25FO1lBQ0UsV0FBVyxFQUFFLENBQUMseUJBQXlCLEVBQUUsMkJBQTJCLENBQUM7WUFDckUsaUJBQWlCLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxrQ0FBa0MsQ0FBQztTQUMxRixFQUNELENBQUMsY0FBYyxDQUFDLEVBQ2hCLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUNqQyxDQUFDO1FBRUYsTUFBTSxFQUNKLFNBQVMsRUFBRSxlQUFlLEVBQzFCLFNBQVMsRUFDVCxjQUFjLEVBQUUsbUJBQW1CLEdBQ3BDLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFckYsYUFBYTtRQUViLDRCQUE0QjtRQUM1QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDbkYsTUFBTSw0QkFBNEIsR0FBRyx1QkFBUyxDQUFDLG1CQUFtQixDQUNoRSxNQUFNLHVCQUFTLENBQUMsZ0NBQWdDLENBQzlDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQ3JGLENBQUMsY0FBYyxDQUFDLEVBQ2hCLEVBQUUsQ0FDSCxDQUNGLENBQUMsaUJBQWlCLENBQUM7UUFDcEIsTUFBTSx1QkFBdUIsR0FBRyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFNUcsSUFBQSxnQkFBTSxFQUFDLHVCQUF1QixFQUFFLGlEQUFpRCxDQUFDLENBQUM7UUFDbkYsV0FBVyxDQUFDLHNCQUFzQixDQUFDO1lBQ2pDLFdBQVcsRUFBRSxFQUFFO1lBQ2YsaUJBQWlCLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSx3QkFBd0IsQ0FBQztTQUN2RSxDQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsc0JBQXNCLENBQUM7WUFDbkMsV0FBVyxFQUFFLEVBQUU7WUFDZixpQkFBaUIsRUFBRSxDQUFDLHVCQUF1QixFQUFFLHNCQUFzQixDQUFDO1NBQ3JFLENBQUMsQ0FBQztRQUVILE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RELE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFELE1BQU0sMEJBQTBCLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDcEUsTUFBTSw0QkFBNEIsR0FBRyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUV4RSxNQUFNLGtCQUFrQixHQUFHLHVCQUFTLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM1RSxNQUFNLG9CQUFvQixHQUFHLHVCQUFTLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVoRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ3RHLGdCQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLGdEQUFnRCxDQUFDLENBQUM7UUFFMUcsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUM5QyxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsOEJBQThCLENBQ3RDLENBQUM7UUFDRixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEQsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLDhCQUE4QixDQUN0QyxDQUFDO1FBQ0YsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUV4RSxNQUFNLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDdEUsbUJBQW1CO1lBQ25CLHFCQUFxQjtZQUNyQixvQkFBb0I7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsYUFBYTtRQUViLE9BQU87WUFDTCxZQUFZO1lBQ1osY0FBYztZQUNkLGFBQWE7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVELHlCQUF5QjtJQUN6QixLQUFLLENBQUMseUJBQXlCLENBQzdCLGdCQUE4QyxFQUM5QyxjQUFzQixFQUN0QixlQUF3QixFQUN4QixzQkFBK0IsRUFDL0IsVUFBbUIsRUFDbkIsOEJBQXVDO1FBRXZDLElBQUksTUFBYyxDQUFDO1FBQ25CLElBQUksWUFBWSxHQUF1QixTQUFTLENBQUM7UUFDakQsSUFBSSxtQkFBbUIsR0FBdUIsU0FBUyxDQUFDO1FBQ3hELFFBQVEsZ0JBQWdCLEVBQUU7WUFDeEIsS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSyw2QkFBZ0IsQ0FBQyxNQUFNO2dCQUMxQixNQUFNLEdBQUcsZ0JBQWdCLEtBQUssNkJBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDeEUsSUFBQSxnQkFBTSxFQUFDLGVBQWUsRUFBRSxvQ0FBb0MsTUFBTSxXQUFXLENBQUMsQ0FBQztnQkFDL0UsSUFBQSxnQkFBTSxFQUFDLHNCQUFzQixFQUFFLDRDQUE0QyxNQUFNLFdBQVcsQ0FBQyxDQUFDO2dCQUM5RixJQUFBLGdCQUFNLEVBQUMsVUFBVSxFQUFFLDhCQUE4QixNQUFNLFdBQVcsQ0FBQyxDQUFDO2dCQUNwRSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7b0JBQ2hDLEtBQUssRUFBRSxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztvQkFDekMsUUFBUSxFQUFFLFVBQVU7aUJBQ3JCLENBQUMsQ0FBQztnQkFDSCxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztvQkFDdkMscUZBQXFGO29CQUNyRix5SkFBeUo7b0JBQ3pKLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hHLFFBQVEsRUFBRSxVQUFVO2lCQUNyQixDQUFDLENBQUM7Z0JBQ0gsTUFBTTtZQUNSLEtBQUssNkJBQWdCLENBQUMsS0FBSztnQkFDekIsTUFBTSxHQUFHLE9BQU8sQ0FBQztnQkFDakIsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUNoRDtRQUVELE1BQU0sdUJBQXVCLEdBQXVCO1lBQ2xELE1BQU07WUFDTixPQUFPLEVBQUUsS0FBZ0I7WUFDekIsY0FBYztZQUNkLFlBQVk7WUFDWiw4QkFBOEI7WUFDOUIsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxPQUFPLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztJQUN6RyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsaUNBQWlDLENBQUMsTUFHdkM7UUFDQyxNQUFNLG1CQUFtQixHQUFxQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25HLE1BQU0scUJBQXFCLEdBQXFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdkcsTUFBTSxHQUFHLEdBQUcsSUFBSSxtQkFBSyxFQUFFLENBQUM7UUFDeEIsSUFBQSxnQkFBTSxFQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxvREFBb0QsQ0FBQyxDQUFDO1FBQy9GLElBQUEsZ0JBQU0sRUFBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsb0RBQW9ELENBQUMsQ0FBQztRQUMvRixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRTtZQUM5RCxtQkFBbUIsQ0FBQyxZQUFZO1lBQ2hDLG1CQUFtQixDQUFDLFdBQVc7U0FDaEMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUU7WUFDbEUscUJBQXFCLENBQUMsVUFBVTtZQUNoQyxxQkFBcUIsQ0FBQyxXQUFXO1NBQ2xDLENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHO1lBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFBLDhCQUFnQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUEsOEJBQWdCLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBQSw4QkFBZ0IsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDNUMsQ0FBQztRQUNGLE9BQU87WUFDTCxtQkFBbUIsRUFBRTtnQkFDbkIsTUFBTSxFQUFFLGNBQWMsQ0FBQyxNQUFNO2dCQUM3QixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2pCLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtnQkFDM0IsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FDM0IsY0FBc0IsRUFDdEIsZUFBdUIsRUFDdkIsc0JBQThCLEVBQzlCLFVBQWtCLEVBQ2xCLDhCQUF1QztRQUV2QyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FDbkMsNkJBQWdCLENBQUMsSUFBSSxFQUNyQixjQUFjLEVBQ2QsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixVQUFVLEVBQ1YsOEJBQThCLENBQy9CLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUM3QixjQUFzQixFQUN0QixlQUF1QixFQUN2QixzQkFBOEIsRUFDOUIsVUFBa0IsRUFDbEIsOEJBQXVDO1FBRXZDLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUNuQyw2QkFBZ0IsQ0FBQyxNQUFNLEVBQ3ZCLGNBQWMsRUFDZCxlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLFVBQVUsRUFDViw4QkFBOEIsQ0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsY0FBc0I7UUFDbkQsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsNkJBQWdCLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxhQUFhO0lBRWIscUNBQXFDO0lBQzdCLEtBQUssQ0FBQyx3QkFBd0IsQ0FDcEMsVUFBa0IsRUFDbEIsS0FBdUIsRUFDdkIsT0FBb0M7UUFFcEMsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUMzQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLDZCQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQzthQUNoRSxNQUFNLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFTyxLQUFLLENBQUMsdUJBQXVCLENBQ25DLFVBQWtCLEVBQ2xCLGdCQUF3QixFQUN4QixrQkFBMEIsRUFDMUIsT0FBa0M7O1FBRWxDLElBQUEsZ0JBQU0sRUFBQyw0QkFBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDL0UsSUFBQSxnQkFBTSxFQUFDLDRCQUFjLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUNuRixNQUFNLFFBQVEsR0FBRyxNQUFBLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsSUFBSSxDQUFDLDBDQUFFLE9BQU8sQ0FBQztRQUNsRyxJQUFBLGdCQUFNLEVBQUMsUUFBUSxFQUFFLGdEQUFnRCxDQUFDLENBQUM7UUFDbkUsTUFBTSxVQUFVLEdBQUcsTUFBQSxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUFnQixDQUFDLE1BQU0sQ0FBQywwQ0FBRSxPQUFPLENBQUM7UUFDdEcsSUFBQSxnQkFBTSxFQUFDLFVBQVUsRUFBRSxrREFBa0QsQ0FBQyxDQUFDO1FBRXZFLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUE0QixVQUFVLEVBQUUsbUNBQW9CLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDNUcsZ0JBQWdCO1lBQ2hCLGtCQUFrQjtZQUNsQixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFO1lBQ2xDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUU7U0FDdkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbkMsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsT0FBa0M7UUFFbEMsSUFBQSxnQkFBTSxFQUFDLDRCQUFjLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDL0QsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3ZDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLDZCQUFnQixDQUFDLEtBQUssQ0FDM0UsQ0FBQztRQUNGLElBQUEsZ0JBQU0sRUFBQyxRQUFRLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUN0RSxJQUFBLGdCQUFNLEVBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxvREFBb0QsQ0FBQyxDQUFDO1FBQ2xGLElBQUEsZ0JBQU0sRUFBQyw0QkFBYyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztRQUN2RixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDekMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssNkJBQWdCLENBQUMsS0FBSyxDQUM3RSxDQUFDO1FBQ0YsSUFBQSxnQkFBTSxFQUFDLFVBQVUsRUFBRSxxREFBcUQsQ0FBQyxDQUFDO1FBQzFFLElBQUEsZ0JBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxFQUFFLHNEQUFzRCxDQUFDLENBQUM7UUFDdEYsSUFBQSxnQkFBTSxFQUFDLDRCQUFjLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBRTNGLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUE0QixVQUFVLEVBQUUsbUNBQW9CLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDNUcsU0FBUztZQUNULFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsNkJBQWdCLENBQUMsSUFBSTtnQkFDM0IsRUFBRSxFQUFFLDZCQUFnQixDQUFDLEtBQUs7Z0JBQzFCLFNBQVMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVM7Z0JBQ3JDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO2FBQ3BEO1lBQ0QsZUFBZSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQ3BDLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsNkJBQWdCLENBQUMsTUFBTTtnQkFDN0IsRUFBRSxFQUFFLDZCQUFnQixDQUFDLEtBQUs7Z0JBQzFCLFNBQVMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVM7Z0JBQ3ZDLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCO2FBQ3REO1lBQ0QsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLFVBQVU7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbkMsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsT0FBa0M7O1FBRWxDLElBQUEsZ0JBQU0sRUFBQyw0QkFBYyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sUUFBUSxHQUFHLE1BQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3ZDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLDZCQUFnQixDQUFDLEtBQUssQ0FDM0UsMENBQUUsT0FBTyxDQUFDO1FBQ1gsSUFBQSxnQkFBTSxFQUFDLFFBQVEsRUFBRSxtREFBbUQsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sVUFBVSxHQUFHLE1BQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3pDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLDZCQUFnQixDQUFDLEtBQUssQ0FDN0UsMENBQUUsT0FBTyxDQUFDO1FBQ1gsSUFBQSxnQkFBTSxFQUFDLFVBQVUsRUFBRSxxREFBcUQsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sUUFBUSxHQUFHLE1BQUEsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyw2QkFBZ0IsQ0FBQyxJQUFJLENBQUMsMENBQUUsT0FBTyxDQUFDO1FBQ2xHLElBQUEsZ0JBQU0sRUFBQyxRQUFRLEVBQUUsZ0RBQWdELENBQUMsQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxNQUFBLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWdCLENBQUMsTUFBTSxDQUFDLDBDQUFFLE9BQU8sQ0FBQztRQUN0RyxJQUFBLGdCQUFNLEVBQUMsVUFBVSxFQUFFLGtEQUFrRCxDQUFDLENBQUM7UUFFdkUsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQTRCLFVBQVUsRUFBRSxtQ0FBb0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM1RyxTQUFTO1lBQ1QsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFO1lBQ3pDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRTtZQUM3QyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFO1lBQ2xDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUU7U0FDdkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBaUI7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSx1QkFBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQXVDLEVBQUUsV0FBd0I7UUFDN0YsTUFBTSxZQUFZLEdBQUcsZUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRO1lBQ2xDLENBQUMsQ0FBQyxNQUFNLElBQUEsa0JBQVksRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2xGLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBRXZCLElBQUksY0FBc0IsQ0FBQztRQUMzQixJQUFJLFFBQWdCLENBQUM7UUFDckIsTUFBTSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDckQsSUFBQSxpQ0FBa0IsRUFBQyxXQUFXLENBQUM7WUFDL0IsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQ3hGLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLGFBQU4sTUFBTSxjQUFOLE1BQU0sR0FBSSxJQUFJLENBQUMsc0JBQXNCLENBQ2xEO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDcEQ7UUFFRCxJQUFJLFdBQVcsS0FBSyx1QkFBVyxDQUFDLEVBQUUsRUFBRTtZQUNsQyxJQUFBLGdCQUFNLEVBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUMsV0FBVyxFQUFFLDBDQUEwQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxVQUFVLEdBQ2QsU0FBUyxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JHLFFBQVEsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQ2xDLGNBQWMsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDO1NBQzVDO2FBQU0sSUFBSSxXQUFXLEtBQUssdUJBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQzdEO2FBQU07WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDekM7UUFFRCxJQUFJLElBQVUsQ0FBQztRQUNmLElBQUk7WUFDRixJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QztRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osSUFBSSxHQUFHLElBQUEsZ0JBQWdCLEVBQUMsV0FBVyxDQUFTLENBQUM7U0FDOUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFdEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxxQkFBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRixNQUFNLHVCQUF1QixHQUFHLE1BQU0sV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxJQUFBLHNDQUF5QixFQUFDLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRWxHLElBQUksZUFBZSxHQUFHLE1BQU0sSUFBQSw2QkFBb0IsRUFDOUMsSUFBSSxDQUFDLEtBQUssRUFDVixTQUFTLENBQUMsUUFBUSxFQUNsQixTQUFTLENBQUMsV0FBVyxFQUNyQixDQUFDLG9CQUFvQixDQUFDLEVBQ3RCLHVCQUFXLENBQUMsRUFBRSxFQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQy9CLFVBQVUsQ0FBQyxTQUFTLEVBQ3BCLFNBQVMsRUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQ2IsQ0FBQztRQUNGLElBQUEsZ0JBQU0sRUFBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFckMsTUFBTSx3QkFBd0IsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztRQUNqRiw4QkFBOEI7UUFDOUIsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNsRCx3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNqQyxDQUFDO1FBQ3JDLElBQUksaUNBQWlDLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7U0FDL0U7UUFDRCxNQUFNLHVDQUF1QyxHQUFHLE1BQU0sSUFBQSxxREFBd0MsRUFDNUYsaUNBQWlDLEVBQ2pDLFVBQVUsRUFDVixjQUFjLENBQ2YsQ0FBQztRQUVGLGVBQWU7UUFDZixNQUFNLG9CQUFvQixHQUFHLHVCQUFTLENBQUMsbUJBQW1CLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUNwRyxNQUFNLHlCQUF5QixHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztZQUNuRSxXQUFXLEVBQUUsRUFBRTtZQUNmLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLGlCQUFpQjtTQUMxRCxDQUFDLENBQUM7UUFDSCxNQUFNLHlCQUF5QixHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztZQUNuRSxXQUFXLEVBQUUsb0JBQW9CLENBQUMsV0FBVztZQUM3QyxpQkFBaUIsRUFBRSxFQUFFO1NBQ3RCLENBQUMsQ0FBQztRQUNILE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFBLHNDQUF5QixFQUM1RCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLFVBQVUsRUFDVixjQUFjLENBQ2YsQ0FBQztRQUNGLGVBQWUsR0FBRyxNQUFNLElBQUEsNkJBQW9CLEVBQzFDLElBQUksQ0FBQyxLQUFLLEVBQ1YsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFdBQVcsRUFDckIsQ0FBQyxzQkFBc0IsQ0FBQyxFQUN4Qix1QkFBVyxDQUFDLEVBQUUsRUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUMvQixVQUFVLENBQUMsU0FBUyxFQUNwQixTQUFTLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUNqQyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFDRixJQUFBLGdCQUFNLEVBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJDLE1BQU0sd0JBQXdCLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDakYsOEJBQThCO1FBQzlCLE1BQU0saUNBQWlDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDbEQsd0JBQXdCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDakMsQ0FBQztRQUNyQyxJQUFJLGlDQUFpQyxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1NBQy9FO1FBQ0QsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLElBQUEscURBQXdDLEVBQ3hGLGlDQUFpQyxFQUNqQyxVQUFVLEVBQ1YsY0FBYyxDQUNmLENBQUM7UUFFRixlQUFlO1FBQ2YsTUFBTSxxQ0FBcUMsR0FBRyx1QkFBUyxDQUFDLG1CQUFtQixDQUFDO1lBQzFFLFdBQVcsRUFBRSxtQ0FBbUMsQ0FBQyxXQUFXO1lBQzVELGlCQUFpQixFQUFFLEVBQUU7U0FDdEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUM7WUFDbkUsV0FBVyxFQUFFLHFDQUFxQyxDQUFDLFdBQVc7WUFDOUQsaUJBQWlCLEVBQUUsRUFBRTtTQUN0QixDQUFDLENBQUM7UUFFSCxNQUFNLHdCQUF3QixHQUFHLE1BQU0sSUFBQSx3Q0FBMkIsRUFDaEUseUJBQXlCLEVBQ3pCLFVBQVUsRUFDVixjQUFjLENBQ2YsQ0FBQztRQUNGLDJDQUEyQztRQUMzQyxNQUFNLElBQUEsNkJBQW9CLEVBQ3hCLElBQUksQ0FBQyxLQUFLLEVBQ1YsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFdBQVcsRUFDckIsQ0FBQyx3QkFBd0IsQ0FBQyxFQUMxQix1QkFBVyxDQUFDLEVBQUUsRUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUMvQixVQUFVLENBQUMsU0FBUyxFQUNwQixTQUFTLEVBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUNqQyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFFRixPQUFPLElBQUEsc0JBQWEsRUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSx1QkFBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELGFBQWE7SUFFYixnQkFBZ0I7SUFDUiwyQkFBMkIsQ0FBQyxnQkFBdUM7UUFDekUsT0FBTztZQUNMLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJO1lBQzNCLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLFNBQVMsRUFBRTtTQUN0RixDQUFDO0lBQ0osQ0FBQztJQUVPLGdCQUFnQixDQUFDLFVBQTJCLEVBQUUsVUFBbUI7UUFDdkUsT0FBTztZQUNMLE9BQU8sRUFBRSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRTtZQUMzRixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7WUFDckIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ2pCLFVBQVU7U0FDWCxDQUFDO0lBQ0osQ0FBQztDQUVGO0FBbHJCRCwwQ0FrckJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgTm9uRW1wdHlTdHJpbmcgfSBmcm9tICdpby10cy10eXBlcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgY3JlYXRlS2VjY2FrSGFzaCBmcm9tICdrZWNjYWsnO1xuaW1wb3J0IHsgRGtsc0RrZywgRGtsc1R5cGVzLCBEa2xzQ29tbXMsIERrbHNEc2csIGJpZ0ludFRvQnVmZmVyQkUgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuXG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEtleWNoYWluLCBLZXlUeXBlIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IGdlbmVyYXRlR1BHS2V5UGFpciB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQgeyBCYXNlRWNkc2FVdGlscyB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQge1xuICBNUEN2MktleUdlblN0YXRlLFxuICBNUEN2MkJyb2FkY2FzdE1lc3NhZ2UsXG4gIE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2UsXG4gIE1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2UsXG4gIE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2UsXG4gIE1QQ3YyUDJQTWVzc2FnZSxcbiAgS2V5R2VuVHlwZUVudW0sXG4gIE1QQ3YyS2V5R2VuU3RhdGVFbnVtLFxuICBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IEdlbmVyYXRlTVBDdjJLZXlSZXF1ZXN0Qm9keSwgR2VuZXJhdGVNUEN2MktleVJlcXVlc3RSZXNwb25zZSwgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4vdHlwZXNNUEN2Mic7XG5pbXBvcnQgeyBSZXF1ZXN0VHlwZSwgVFNTUGFyYW1zLCBUU1NQYXJhbXNGb3JNZXNzYWdlLCBUeFJlcXVlc3QgfSBmcm9tICcuLi9iYXNlVHlwZXMnO1xuaW1wb3J0IHsgRUNEU0FNZXRob2RUeXBlcywgZ2V0VHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzJztcbmltcG9ydCB7XG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUsXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byxcbiAgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZE9uZSxcbiAgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byxcbn0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL2VjZHNhTVBDdjInO1xuaW1wb3J0IHsgc2VuZFNpZ25hdHVyZVNoYXJlVjIsIHNlbmRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi90c3MvY29tbW9uJztcbmltcG9ydCB7IEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWInO1xuXG5leHBvcnQgY2xhc3MgRWNkc2FNUEN2MlV0aWxzIGV4dGVuZHMgQmFzZUVjZHNhVXRpbHMge1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgbSA9IDI7XG4gICAgY29uc3QgbiA9IDM7XG4gICAgY29uc3QgdXNlclNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBjb25zdCBiYWNrdXBTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBiYWNrdXBHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuXG4gICAgLy8gR2V0IHRoZSBCaXRHbyBwdWJsaWMga2V5IGJhc2VkIG9uIHVzZXIvZW50ZXJwcmlzZSBmZWF0dXJlIGZsYWdzXG4gICAgLy8gSWYgaXQgZG9lc24ndCB3b3JrLCB1c2UgdGhlIGRlZmF1bHQgcHVibGljIGtleSBmcm9tIHRoZSBjb25zdGFudHNcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IChcbiAgICAgIChhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhwYXJhbXMuZW50ZXJwcmlzZSwgdHJ1ZSkpID8/IHRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleVxuICAgICkuYXJtb3IoKTtcblxuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGdwZ0tleTogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgIH07XG4gICAgY29uc3QgYmFja3VwR3BnUHJ2S2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCxcbiAgICAgIGdwZ0tleTogYmFja3VwR3BnS2V5LnByaXZhdGVLZXksXG4gICAgfTtcbiAgICBjb25zdCBiaXRnb0dwZ1B1YktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIGdwZ0tleTogYml0Z29QdWJsaWNHcGdLZXksXG4gICAgfTtcblxuICAgIC8vICNyZWdpb24gcm91bmQgMVxuICAgIGNvbnN0IHVzZXJSb3VuZDFCcm9hZGNhc3RNc2cgPSBhd2FpdCB1c2VyU2Vzc2lvbi5pbml0RGtnKCk7XG4gICAgY29uc3QgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnID0gYXdhaXQgYmFja3VwU2Vzc2lvbi5pbml0RGtnKCk7XG5cbiAgICBjb25zdCByb3VuZDFTZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxQnJvYWRjYXN0TXNnLCBiYWNrdXBSb3VuZDFCcm9hZGNhc3RNc2ddLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHJvdW5kMVNlcmlhbGl6ZWRNZXNzYWdlcyxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxLCBiaXRnb1RvQmFja3VwTXNnMiwgYml0Z29Ub1VzZXJNc2cyIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICByb3VuZDFNZXNzYWdlc1xuICAgICk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAyXG4gICAgY29uc3QgYml0Z29Sb3VuZDFCcm9hZGNhc3RNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW3RoaXMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKGJpdGdvTXNnMSldIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnID0gYml0Z29Sb3VuZDFCcm9hZGNhc3RNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnLCAnQml0R28gbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDJQMlBNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtEa2xzVHlwZXMuZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnKSwgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJUb0JpdGdvTXNnMiA9IHVzZXJSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CaXRnb01zZzIsICdVc2VyIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKHVzZXJUb0JpdGdvTXNnMik7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDJQMlBNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW3VzZXJSb3VuZDFCcm9hZGNhc3RNc2csIERrbHNUeXBlcy5kZXNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYml0Z29Sb3VuZDFCcm9hZGNhc3RNc2cpXSxcbiAgICB9KTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzIgPSBEa2xzVHlwZXMuc2VyaWFsaXplTWVzc2FnZXMoYmFja3VwUm91bmQyUDJQTWVzc2FnZXMpLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyLCAnQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCByb3VuZDJNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJUb0JpdGdvTXNnMiwgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDIsXG4gICAgICBiaXRnb0NvbW1pdG1lbnQyLFxuICAgICAgYml0Z29Ub1VzZXJNc2czLFxuICAgICAgYml0Z29Ub0JhY2t1cE1zZzMsXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIocGFyYW1zLmVudGVycHJpc2UsIHNlc3Npb25JZCwgcm91bmQyTWVzc2FnZXMpO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgM1xuICAgIGFzc2VydC5lcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIDIgU2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDJNc2dzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvVXNlck1zZzIpXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvVXNlclJvdW5kMk1zZ3MucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnLCAnQml0R28gdG8gVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUm91bmQyTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDJNc2cpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub0JhY2t1cE1zZzIpXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFtdIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW2JhY2t1cEdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnID0gZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnLCAnQml0R28gdG8gQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cpO1xuXG4gICAgY29uc3QgdXNlclRvQmFja3VwTXNnMiA9IHVzZXJSb3VuZDJQMlBNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQmFja3VwTXNnMiwgJ1VzZXIgdG8gQmFja3VwIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJNc2cyID0gYmFja3VwUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvVXNlck1zZzIsICdCYWNrdXAgdG8gVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kM01lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgICBwMnBNZXNzYWdlczogW2JpdGdvVG9Vc2VyUm91bmQyTXNnLCBiYWNrdXBUb1VzZXJNc2cyXSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CYWNrdXBNc2czID0gdXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydCh1c2VyVG9CYWNrdXBNc2czLCAnVXNlciB0byBCYWNrdXAgbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCB1c2VyVG9CaXRnb01zZzMgPSB1c2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQml0Z29Nc2czLCAnVXNlciB0byBCaXRnbyBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzMgPSBEa2xzVHlwZXMuc2VyaWFsaXplUDJQTWVzc2FnZSh1c2VyVG9CaXRnb01zZzMpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQzTWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtiaXRnb1RvQmFja3VwUm91bmQyTXNnLCB1c2VyVG9CYWNrdXBNc2cyXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlck1zZzMgPSBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoYmFja3VwVG9Vc2VyTXNnMywgJ0JhY2t1cCB0byBVc2VyIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwVG9CaXRnb01zZzMgPSBiYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvQml0Z29Nc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2czID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UoYmFja3VwVG9CaXRnb01zZzMpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDNNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW3RoaXMuZm9ybWF0UDJQTWVzc2FnZShiaXRnb1RvVXNlck1zZzMsIGJpdGdvQ29tbWl0bWVudDIpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnID0gZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2csICdCaXRHbyB0byBVc2VyIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub1VzZXJSb3VuZDNNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZyk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub0JhY2t1cE1zZzMsIGJpdGdvQ29tbWl0bWVudDIpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFtiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZyA9IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnLCAnQml0R28gdG8gQmFja3VwIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cFJvdW5kM01zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2cpO1xuXG4gICAgY29uc3QgdXNlclJvdW5kNE1lc3NhZ2VzID0gdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW2JhY2t1cFRvVXNlck1zZzMsIGJpdGdvVG9Vc2VyUm91bmQzTXNnXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDRCcm9hZGNhc3RNc2cgPSB1c2VyUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGFzc2VydCh1c2VyUm91bmQ0QnJvYWRjYXN0TXNnLCAnVXNlciBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyUm91bmQ0QnJvYWRjYXN0TXNnID0gRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UodXNlclJvdW5kNEJyb2FkY2FzdE1zZyk7XG5cbiAgICBjb25zdCBiYWNrdXBSb3VuZDRNZXNzYWdlcyA9IGJhY2t1cFNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW3VzZXJUb0JhY2t1cE1zZzMsIGJpdGdvVG9CYWNrdXBSb3VuZDNNc2ddLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZyA9IGJhY2t1cFJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZywgJ0JhY2t1cCBtZXNzYWdlIDQgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cgPSBEa2xzVHlwZXMuc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cpO1xuXG4gICAgY29uc3Qgcm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAge1xuICAgICAgICBwMnBNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzMsIHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnM10sXG4gICAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbc2VyaWFsaXplZFVzZXJSb3VuZDRCcm9hZGNhc3RNc2csIHNlcmlhbGl6ZWRCYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgICAgfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleSwgYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMyxcbiAgICAgIGJpdGdvTXNnNCxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQzKHBhcmFtcy5lbnRlcnByaXNlLCBzZXNzaW9uSWQsIHJvdW5kM01lc3NhZ2VzKTtcblxuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24ga2V5Y2hhaW4gY3JlYXRpb25cbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDMsICdSb3VuZCAxIGFuZCAzIFNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuICAgIGNvbnN0IGJpdGdvUm91bmQ0QnJvYWRjYXN0TWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhcbiAgICAgIGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgICAgeyBwMnBNZXNzYWdlczogW10sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYml0Z29Nc2c0KV0gfSxcbiAgICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgICAgW11cbiAgICAgIClcbiAgICApLmJyb2FkY2FzdE1lc3NhZ2VzO1xuICAgIGNvbnN0IGJpdGdvUm91bmQ0QnJvYWRjYXN0TXNnID0gYml0Z29Sb3VuZDRCcm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuXG4gICAgYXNzZXJ0KGJpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCAnQml0R28gbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICB1c2VyU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csIGJhY2t1cFJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgdXNlclJvdW5kNEJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyUHJpdmF0ZU1hdGVyaWFsID0gdXNlclNlc3Npb24uZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgdXNlclJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSB1c2VyU2Vzc2lvbi5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwU2Vzc2lvbi5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbih1c2VyUHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBjb25zdCBiYWNrdXBDb21tb25LZXljaGFpbiA9IERrbHNUeXBlcy5nZXRDb21tb25LZXljaGFpbihiYWNrdXBQcml2YXRlTWF0ZXJpYWwpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIHVzZXJDb21tb25LZXljaGFpbiwgJ1VzZXIgYW5kIEJpdGdvIENvbW1vbiBrZXljaGFpbnMgZG8gbm90IG1hdGNoJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGJpdGdvQ29tbW9uS2V5Y2hhaW4sIGJhY2t1cENvbW1vbktleWNoYWluLCAnQmFja3VwIGFuZCBCaXRnbyBDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkVXNlcktleWNoYWluKFxuICAgICAgYml0Z29Db21tb25LZXljaGFpbixcbiAgICAgIHVzZXJQcml2YXRlTWF0ZXJpYWwsXG4gICAgICB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCYWNrdXBLZXljaGFpbihcbiAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gICAgY29uc3QgYml0Z29LZXljaGFpblByb21pc2UgPSB0aGlzLmFkZEJpdGdvS2V5Y2hhaW4oYml0Z29Db21tb25LZXljaGFpbik7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYmFja3VwS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgXSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBrZXljaGFpbiB1dGlsc1xuICBhc3luYyBjcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgIHBhcnRpY2lwYW50SW5kZXg6IE1QQ3YyUGFydHlGcm9tU3RyaW5nT3JOdW1iZXIsXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbD86IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlPzogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgbGV0IHNvdXJjZTogc3RyaW5nO1xuICAgIGxldCBlbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVkdWNlZEVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAocGFydGljaXBhbnRJbmRleCkge1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLlVTRVI6XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQOlxuICAgICAgICBzb3VyY2UgPSBwYXJ0aWNpcGFudEluZGV4ID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyAndXNlcicgOiAnYmFja3VwJztcbiAgICAgICAgYXNzZXJ0KHByaXZhdGVNYXRlcmlhbCwgYFByaXZhdGUgbWF0ZXJpYWwgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBhc3NlcnQocmVkdWNlZFByaXZhdGVNYXRlcmlhbCwgYFJlZHVjZWQgcHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChwYXNzcGhyYXNlLCBgUGFzc3BocmFzZSBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbC50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZWR1Y2VkRW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICAvLyBCdWZmZXIudG9TdHJpbmcoJ2Jhc2U2NCcpIGNhbiBub3QgYmUgdXNlZCBoZXJlIGFzIGl0IGRvZXMgbm90IHdvcmsgb24gdGhlIGJyb3dzZXIuXG4gICAgICAgICAgLy8gVGhlIGJyb3dzZXIgZGVhbHMgd2l0aCBhIEJ1ZmZlciBhcyBVaW50OEFycmF5LCB0aGVyZWZvcmUgaW4gdGhlIGJyb3dzZXIgLnRvU3RyaW5nKCdiYXNlNjQnKSBqdXN0IGNyZWF0ZXMgYSBjb21tYSBzZXBlcmF0ZWQgc3RyaW5nIG9mIHRoZSBhcnJheSB2YWx1ZXMuXG4gICAgICAgICAgaW5wdXQ6IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwpKSkpLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQklUR086XG4gICAgICAgIHNvdXJjZSA9ICdiaXRnbyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBpZW50S2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZSxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIGVuY3J5cHRlZFBydixcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGlzTVBDdjI6IHRydWUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIHsgLi4uKGF3YWl0IGtleWNoYWlucy5hZGQocmVjaXBpZW50S2V5Y2hhaW5QYXJhbXMpKSwgcmVkdWNlZEVuY3J5cHRlZFBydjogcmVkdWNlZEVuY3J5cHRlZFBydiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHVzZXIgYW5kIGJhY2t1cCBNUEN2MSBTaWduaW5nTWF0ZXJpYWwgdG8gUmV0cm9maXREYXRhIG5lZWRlZCBieSBNUEN2MiBES0cuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBNUEN2MSBkZWNyeXB0ZWQgc2lnbmluZyBtYXRlcmlhbCBmb3IgdXNlciBhbmQgYmFja3VwIGFzIGEganNvbi5zdHJpbmdpZnkgc3RyaW5nIGFuZCBiaXRnbydzIEJpZyBTaS5cbiAgICogQHJldHVybnMge1Byb21pc2U8eyBtcGN2MlVzZXJLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YTsgbXBjdjJCYWtjdXBLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSB9Pn0gLSB0aGUgcmV0cm9maXQgZGF0YSBuZWVkZWQgdG8gc3RhcnQgYW4gTVBDdjIgREtHIHNlc3Npb24uXG4gICAqL1xuICBhc3luYyBnZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleXMocGFyYW1zOiB7XG4gICAgbXBjdjFVc2VyS2V5U2hhcmU6IHN0cmluZztcbiAgICBtcGN2MUJhY2t1cEtleVNoYXJlOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHsgbXBjdjJVc2VyS2V5U2hhcmU6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGE7IG1wY3YyQmFrY3VwS2V5U2hhcmU6IERrbHNUeXBlcy5SZXRyb2ZpdERhdGEgfT4ge1xuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWw6IEVDRFNBTWV0aG9kVHlwZXMuU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwYXJhbXMubXBjdjFVc2VyS2V5U2hhcmUpO1xuICAgIGNvbnN0IGJhY2t1cFNpZ25pbmdNYXRlcmlhbDogRUNEU0FNZXRob2RUeXBlcy5TaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBhcmFtcy5tcGN2MUJhY2t1cEtleVNoYXJlKTtcbiAgICBjb25zdCBtcGMgPSBuZXcgRWNkc2EoKTtcbiAgICBhc3NlcnQodXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsICdVc2VyIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSBiYWNrdXAgTlNoYXJlLicpO1xuICAgIGFzc2VydChiYWNrdXBTaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSwgJ0JhY2t1cCBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgdXNlciBOU2hhcmUuJyk7XG4gICAgY29uc3QgdXNlckNvbWJpbmVkID0gbXBjLmtleUNvbWJpbmUodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSxcbiAgICBdKTtcbiAgICBjb25zdCBiYWNrdXBDb21iaW5lZCA9IG1wYy5rZXlDb21iaW5lKGJhY2t1cFNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtcbiAgICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLFxuICAgICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICAgIF0pO1xuICAgIGNvbnN0IHhpTGlzdCA9IFtcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMSksIDMyKSksXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDIpLCAzMikpLFxuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgzKSwgMzIpKSxcbiAgICBdO1xuICAgIHJldHVybiB7XG4gICAgICBtcGN2MkJha2N1cEtleVNoYXJlOiB7XG4gICAgICAgIHhTaGFyZTogYmFja3VwQ29tYmluZWQueFNoYXJlLFxuICAgICAgICB4aUxpc3Q6IHhpTGlzdCxcbiAgICAgIH0sXG4gICAgICBtcGN2MlVzZXJLZXlTaGFyZToge1xuICAgICAgICB4U2hhcmU6IHVzZXJDb21iaW5lZC54U2hhcmUsXG4gICAgICAgIHhpTGlzdDogeGlMaXN0LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRVc2VyS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRCYWNrdXBLZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQml0Z29LZXljaGFpbihjb21tb25LZXljaGFpbjogc3RyaW5nKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oTVBDdjJQYXJ0aWVzRW51bS5CSVRHTywgY29tbW9uS2V5Y2hhaW4pO1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIGdlbmVyYXRlIGtleSByZXF1ZXN0IHV0aWxzXG4gIHByaXZhdGUgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25SZXF1ZXN0PFQgZXh0ZW5kcyBHZW5lcmF0ZU1QQ3YyS2V5UmVxdWVzdFJlc3BvbnNlPihcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgcm91bmQ6IE1QQ3YyS2V5R2VuU3RhdGUsXG4gICAgcGF5bG9hZDogR2VuZXJhdGVNUEN2MktleVJlcXVlc3RCb2R5XG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJpdGdvLnVybCgnL21wYy9nZW5lcmF0ZWtleScsIDIpKVxuICAgICAgLnNlbmQoeyBlbnRlcnByaXNlLCB0eXBlOiBLZXlHZW5UeXBlRW51bS5NUEN2Miwgcm91bmQsIHBheWxvYWQgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDEoXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nLFxuICAgIHVzZXJHcGdQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyR3BnUHVibGljS2V5KSwgJ1VzZXIgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwR3BnUHVibGljS2V5KSwgJ0JhY2t1cCBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gcGF5bG9hZC5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUik/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KHVzZXJNc2cxLCAnVXNlciBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzEgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2cxLCAnQmFja3VwIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJlcXVlc3Q8TVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4oZW50ZXJwcmlzZSwgTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10sIHtcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICB1c2VyTXNnMTogeyBmcm9tOiAwLCAuLi51c2VyTXNnMSB9LFxuICAgICAgYmFja3VwTXNnMTogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2cxIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhzZXNzaW9uSWQpLCAnU2Vzc2lvbiBJRCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2cyID0gcGF5bG9hZC5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQodXNlck1zZzIuY29tbWl0bWVudCwgJ1VzZXIgdG8gQml0Z28gY29tbWl0bWVudCBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJNc2cyLmNvbW1pdG1lbnQpLCAnVXNlciB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMiA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBNc2cyLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzIuY29tbWl0bWVudCwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwTXNnMi5jb21taXRtZW50KSwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJlcXVlc3Q8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4oZW50ZXJwcmlzZSwgTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIyJ10sIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogdXNlck1zZzIucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IHVzZXJNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICB1c2VyQ29tbWl0bWVudDI6IHVzZXJNc2cyLmNvbW1pdG1lbnQsXG4gICAgICBiYWNrdXBNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgICB0bzogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgICAgc2lnbmF0dXJlOiBiYWNrdXBNc2cyLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiBiYWNrdXBNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICBiYWNrdXBDb21taXRtZW50MjogYmFja3VwTXNnMi5jb21taXRtZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzMsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlck1zZzQgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzQsICdVc2VyIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnNCA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzQsICdCYWNrdXAgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUmVxdWVzdDxNUEN2MktleUdlblJvdW5kM1Jlc3BvbnNlPihlbnRlcnByaXNlLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjMnXSwge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdXNlck1zZzM6IHsgZnJvbTogMCwgdG86IDIsIC4uLnVzZXJNc2czIH0sXG4gICAgICBiYWNrdXBNc2czOiB7IGZyb206IDEsIHRvOiAyLCAuLi5iYWNrdXBNc2czIH0sXG4gICAgICB1c2VyTXNnNDogeyBmcm9tOiAwLCAuLi51c2VyTXNnNCB9LFxuICAgICAgYmFja3VwTXNnNDogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2c0IH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG4gIGFzeW5jIHNpZ25UeFJlcXVlc3QocGFyYW1zOiBUU1NQYXJhbXMpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLnR4KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKHBhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZSwgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwYXJhbXMucHJ2LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPVxuICAgICAgdHlwZW9mIHBhcmFtcy50eFJlcXVlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHBhcmFtcy50eFJlcXVlc3QsIHBhcmFtcy5yZXFJZClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gICAgbGV0IHR4VG9TaWduOiBzdHJpbmc7XG4gICAgY29uc3QgW3VzZXJHcGdLZXksIGJpdGdvR3BnUHViS2V5XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyksXG4gICAgICB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyh0eFJlcXVlc3QuZW50ZXJwcmlzZUlkLCB0cnVlLCBwYXJhbXMucmVxSWQpLnRoZW4oXG4gICAgICAgIChwdWJLZXkpID0+IHB1YktleSA/PyB0aGlzLmJpdGdvTVBDdjJQdWJsaWNHcGdLZXlcbiAgICAgICksXG4gICAgXSk7XG4gICAgaWYgKCFiaXRnb0dwZ1B1YktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0LnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9XG4gICAgICAgIHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4IDogdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuICAgICAgdHhUb1NpZ24gPSB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4O1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB1bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTVBDdjIgbWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVxdWVzdCB0eXBlJyk7XG4gICAgfVxuXG4gICAgbGV0IGhhc2g6IEhhc2g7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSB0aGlzLmJhc2VDb2luLmdldEhhc2hGdW5jdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFzaCA9IGNyZWF0ZUtlY2Nha0hhc2goJ2tlY2NhazI1NicpIGFzIEhhc2g7XG4gICAgfVxuICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBoYXNoLnVwZGF0ZShCdWZmZXIuZnJvbSh0eFRvU2lnbiwgJ2hleCcpKS5kaWdlc3QoKTtcblxuICAgIGNvbnN0IG90aGVyU2lnbmVyID0gbmV3IERrbHNEc2cuRHNnKHVzZXJLZXlTaGFyZSwgMCwgZGVyaXZhdGlvblBhdGgsIGhhc2hCdWZmZXIpO1xuICAgIGNvbnN0IHVzZXJTaWduZXJCcm9hZGNhc3RNc2cxID0gYXdhaXQgb3RoZXJTaWduZXIuaW5pdCgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQxID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSh1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSwgdXNlckdwZ0tleSk7XG5cbiAgICBsZXQgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQxXSxcbiAgICAgIFJlcXVlc3RUeXBlLnR4LFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyk7XG5cbiAgICBjb25zdCBiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDIgPSBsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICAvLyBUT0RPOiBVc2UgY29kZWMgZm9yIHBhcnNpbmdcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBKU09OLnBhcnNlKFxuICAgICAgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyW2JpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMi5sZW5ndGggLSAxXS5zaGFyZVxuICAgICkgYXMgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dDtcbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDFBbmQyID0gYXdhaXQgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZE9uZShcbiAgICAgIHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ1B1YktleVxuICAgICk7XG5cbiAgICAvKiogUm91bmQgMiAqKi9cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxQW5kMik7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMiA9IG90aGVyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IGRlc2VyaWFsaXplZE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMgPSBvdGhlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVHdvID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byhcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDIsXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQzLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnUHViS2V5XG4gICAgKTtcbiAgICBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZFR3b10sXG4gICAgICBSZXF1ZXN0VHlwZS50eCxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzID0gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgLy8gVE9ETzogVXNlIGNvZGVjIGZvciBwYXJzaW5nXG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvID0gSlNPTi5wYXJzZShcbiAgICAgIHR4UmVxdWVzdFNpZ25hdHVyZVNoYXJlc1t0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXMubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzID0gYXdhaXQgdmVyaWZ5Qml0R29NZXNzYWdlc0FuZFNpZ25hdHVyZXNSb3VuZFR3byhcbiAgICAgIHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ1B1YktleVxuICAgICk7XG5cbiAgICAvKiogUm91bmQgMyAqKi9cbiAgICBjb25zdCBkZXNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzLnAycE1lc3NhZ2VzLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQgPSBvdGhlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQzLnAycE1lc3NhZ2VzLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kNCxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ1B1YktleVxuICAgICk7XG4gICAgLy8gU3VibWl0IGZvciBmaW5hbCBzaWduYXR1cmUgc2hhcmUgY29tYmluZVxuICAgIGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kVGhyZWVdLFxuICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0LndhbGxldElkLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIFJlcXVlc3RUeXBlLnR4LCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gdXRpbHNcbiAgcHJpdmF0ZSBmb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYnJvYWRjYXN0TWVzc2FnZTogTVBDdjJCcm9hZGNhc3RNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IGJyb2FkY2FzdE1lc3NhZ2UuZnJvbSxcbiAgICAgIHBheWxvYWQ6IHsgbWVzc2FnZTogYnJvYWRjYXN0TWVzc2FnZS5tZXNzYWdlLCBzaWduYXR1cmU6IGJyb2FkY2FzdE1lc3NhZ2Uuc2lnbmF0dXJlIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UDJQTWVzc2FnZShwMnBNZXNzYWdlOiBNUEN2MlAyUE1lc3NhZ2UsIGNvbW1pdG1lbnQ/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF5bG9hZDogeyBlbmNyeXB0ZWRNZXNzYWdlOiBwMnBNZXNzYWdlLmVuY3J5cHRlZE1lc3NhZ2UsIHNpZ25hdHVyZTogcDJwTWVzc2FnZS5zaWduYXR1cmUgfSxcbiAgICAgIGZyb206IHAycE1lc3NhZ2UuZnJvbSxcbiAgICAgIHRvOiBwMnBNZXNzYWdlLnRvLFxuICAgICAgY29tbWl0bWVudCxcbiAgICB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cbn1cbiJdfQ==
724
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWNkc2EvZWNkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE4RjtBQUM5RixvREFBNEI7QUFDNUIsbUNBQWdDO0FBRWhDLDZDQUE2QztBQUM3QyxvREFBc0M7QUFDdEMsNkNBQStCO0FBRS9CLHNEQVk2QjtBQUU3Qix5REFBZ0Q7QUFHaEQsc0NBQThEO0FBQzlELGdEQUEwRTtBQUMxRSw4REFNdUM7QUFFdkMscURBQXdEO0FBQ3hELDRDQVdzQjtBQUN0QixpQ0FBd0M7QUFDeEMsNkNBQThHO0FBRTlHLE1BQWEsZUFBZ0IsU0FBUSxxQkFBYztJQUNqRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUtyQjs7UUFDQyxNQUFNLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTNELGtFQUFrRTtRQUNsRSxvRUFBb0U7UUFDcEUsTUFBTSxpQkFBaUIsR0FBRyxDQUN4QixNQUFBLENBQUMsTUFBTSxJQUFJLENBQUMsb0NBQW9DLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxtQ0FBSSxJQUFJLENBQUMsc0JBQXNCLENBQzFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFVixNQUFNLGFBQWEsR0FBMEI7WUFDM0MsT0FBTyxFQUFFLDZCQUFnQixDQUFDLElBQUk7WUFD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LENBQUM7UUFDaEYsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVyQyxNQUFNLHlCQUF5QixHQUFHLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQztZQUNsRSxXQUFXLEVBQUUscUNBQXFDLENBQUMsV0FBVztZQUM5RCxpQkFBaUIsRUFBRSxFQUFFO1NBQ3RCLENBQUMsQ0FBQztRQUVILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxJQUFBLHdDQUEyQixFQUFDLHlCQUF5QixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVuSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0NBRUY7QUExbENELDBDQTBsQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBiaWdJbnRUb0J1ZmZlckJFLCBEa2xzQ29tbXMsIERrbHNEa2csIERrbHNEc2csIERrbHNUeXBlcyB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBOb25FbXB0eVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCBjcmVhdGVLZWNjYWtIYXNoIGZyb20gJ2tlY2Nhayc7XG5pbXBvcnQgKiBhcyBwZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBLZXljaGFpbnNUcmlwbGV0IH0gZnJvbSAnLi4vLi4vLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHtcbiAgS2V5R2VuVHlwZUVudW0sXG4gIE1QQ3YyQnJvYWRjYXN0TWVzc2FnZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5Sb3VuZDNSZXNwb25zZSxcbiAgTVBDdjJLZXlHZW5TdGF0ZSxcbiAgTVBDdjJLZXlHZW5TdGF0ZUVudW0sXG4gIE1QQ3YyUDJQTWVzc2FnZSxcbiAgTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbiAgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmltcG9ydCB7IEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWInO1xuaW1wb3J0IHsgQWRkS2V5Y2hhaW5PcHRpb25zLCBLZXljaGFpbiwgS2V5VHlwZSB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluJztcbmltcG9ydCB7IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZCB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluL2lLZXljaGFpbnMnO1xuaW1wb3J0IHsgRUNEU0FNZXRob2RUeXBlcywgZ2V0VHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzJztcbmltcG9ydCB7IHNlbmRTaWduYXR1cmVTaGFyZVYyLCBzZW5kVHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQge1xuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lLFxuICBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVGhyZWUsXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28sXG4gIHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRPbmUsXG4gIHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28sXG59IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS9lY2RzYU1QQ3YyJztcbmltcG9ydCB7IEtleUNvbWJpbmVkIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlR1BHS2V5UGFpciB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQge1xuICBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBSZXF1ZXN0VHlwZSxcbiAgU2lnbmF0dXJlU2hhcmVSZWNvcmQsXG4gIFRTU1BhcmFtcyxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gIFRTU1BhcmFtc1dpdGhQcnYsXG4gIFR4UmVxdWVzdCxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IEJhc2VFY2RzYVV0aWxzIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IEdlbmVyYXRlTVBDdjJLZXlSZXF1ZXN0Qm9keSwgR2VuZXJhdGVNUEN2MktleVJlcXVlc3RSZXNwb25zZSwgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4vdHlwZXNNUEN2Mic7XG5cbmV4cG9ydCBjbGFzcyBFY2RzYU1QQ3YyVXRpbHMgZXh0ZW5kcyBCYXNlRWNkc2FVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnMocGFyYW1zOiB7XG4gICAgcGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVudGVycHJpc2U6IHN0cmluZztcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmc7XG4gICAgcmV0cm9maXQ/OiBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQ7XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCB7IHVzZXJTZXNzaW9uLCBiYWNrdXBTZXNzaW9uIH0gPSB0aGlzLmdldFVzZXJBbmRCYWNrdXBTZXNzaW9uKDIsIDMsIHBhcmFtcy5yZXRyb2ZpdCk7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgYmFja3VwR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcblxuICAgIC8vIEdldCB0aGUgQml0R28gcHVibGljIGtleSBiYXNlZCBvbiB1c2VyL2VudGVycHJpc2UgZmVhdHVyZSBmbGFnc1xuICAgIC8vIElmIGl0IGRvZXNuJ3Qgd29yaywgdXNlIHRoZSBkZWZhdWx0IHB1YmxpYyBrZXkgZnJvbSB0aGUgY29uc3RhbnRzXG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSAoXG4gICAgICAoYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MocGFyYW1zLmVudGVycHJpc2UsIHRydWUpKSA/PyB0aGlzLmJpdGdvTVBDdjJQdWJsaWNHcGdLZXlcbiAgICApLmFybW9yKCk7XG5cbiAgICBjb25zdCB1c2VyR3BnUHJ2S2V5OiBEa2xzVHlwZXMuUGFydHlHcGdLZXkgPSB7XG4gICAgICBwYXJ0eUlkOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBncGdLZXk6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICB9O1xuICAgIGNvbnN0IGJhY2t1cEdwZ1BydktleTogRGtsc1R5cGVzLlBhcnR5R3BnS2V5ID0ge1xuICAgICAgcGFydHlJZDogTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBncGdLZXk6IGJhY2t1cEdwZ0tleS5wcml2YXRlS2V5LFxuICAgIH07XG4gICAgY29uc3QgYml0Z29HcGdQdWJLZXk6IERrbHNUeXBlcy5QYXJ0eUdwZ0tleSA9IHtcbiAgICAgIHBhcnR5SWQ6IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBncGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LFxuICAgIH07XG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDFcbiAgICBjb25zdCB1c2VyUm91bmQxQnJvYWRjYXN0TXNnID0gYXdhaXQgdXNlclNlc3Npb24uaW5pdERrZygpO1xuICAgIGNvbnN0IGJhY2t1cFJvdW5kMUJyb2FkY2FzdE1zZyA9IGF3YWl0IGJhY2t1cFNlc3Npb24uaW5pdERrZygpO1xuXG4gICAgY29uc3Qgcm91bmQxU2VyaWFsaXplZE1lc3NhZ2VzID0gRGtsc1R5cGVzLnNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdXNlclJvdW5kMUJyb2FkY2FzdE1zZywgYmFja3VwUm91bmQxQnJvYWRjYXN0TXNnXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCByb3VuZDFNZXNzYWdlcyA9IGF3YWl0IERrbHNDb21tcy5lbmNyeXB0QW5kQXV0aE91dGdvaW5nTWVzc2FnZXMoXG4gICAgICByb3VuZDFTZXJpYWxpemVkTWVzc2FnZXMsXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIGJpdGdvTXNnMSwgYml0Z29Ub0JhY2t1cE1zZzIsIGJpdGdvVG9Vc2VyTXNnMiB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMShcbiAgICAgIHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdLZXkucHVibGljS2V5LFxuICAgICAgcGFyYW1zLnJldHJvZml0Py53YWxsZXRJZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnJvdW5kMU1lc3NhZ2VzLFxuICAgICAgICAgICAgd2FsbGV0SWQ6IHBhcmFtcy5yZXRyb2ZpdC53YWxsZXRJZCxcbiAgICAgICAgICB9XG4gICAgICAgIDogcm91bmQxTWVzc2FnZXNcbiAgICApO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgMlxuICAgIGNvbnN0IGJpdGdvUm91bmQxQnJvYWRjYXN0TWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbXSwgYnJvYWRjYXN0TWVzc2FnZXM6IFt0aGlzLmZvcm1hdEJpdGdvQnJvYWRjYXN0TWVzc2FnZShiaXRnb01zZzEpXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5LCBiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZyA9IGJpdGdvUm91bmQxQnJvYWRjYXN0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZywgJ0JpdEdvIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG5cbiAgICBjb25zdCB1c2VyUm91bmQyUDJQTWVzc2FnZXMgPSB1c2VyU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbRGtsc1R5cGVzLmRlc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZShiaXRnb1JvdW5kMUJyb2FkY2FzdE1zZyksIGJhY2t1cFJvdW5kMUJyb2FkY2FzdE1zZ10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyVG9CaXRnb01zZzIgPSB1c2VyUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQml0Z29Nc2cyLCAnVXNlciBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzIgPSBEa2xzVHlwZXMuc2VyaWFsaXplUDJQTWVzc2FnZSh1c2VyVG9CaXRnb01zZzIpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQyUDJQTWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxQnJvYWRjYXN0TXNnLCBEa2xzVHlwZXMuZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKGJpdGdvUm91bmQxQnJvYWRjYXN0TXNnKV0sXG4gICAgfSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJhY2t1cFRvQml0Z29Nc2cyID0gRGtsc1R5cGVzLnNlcmlhbGl6ZU1lc3NhZ2VzKGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzKS5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMiwgJ0JhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3Qgcm91bmQyTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICAgICAgeyBwMnBNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyVG9CaXRnb01zZzIsIHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMl0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5LCBiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLFxuICAgICAgYml0Z29Db21taXRtZW50MixcbiAgICAgIGJpdGdvVG9Vc2VyTXNnMyxcbiAgICAgIGJpdGdvVG9CYWNrdXBNc2czLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKHBhcmFtcy5lbnRlcnByaXNlLCBzZXNzaW9uSWQsIHJvdW5kMk1lc3NhZ2VzKTtcbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDNcbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDIsICdSb3VuZCAxIGFuZCAyIFNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQyTXNncyA9IGF3YWl0IERrbHNDb21tcy5kZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgICAgIHsgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub1VzZXJNc2cyKV0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFt1c2VyR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnID0gZGVjcnlwdGVkQml0Z29Ub1VzZXJSb3VuZDJNc2dzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kMk1zZywgJ0JpdEdvIHRvIFVzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiaXRnb1RvVXNlclJvdW5kMk1zZyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZVAyUE1lc3NhZ2Uoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQyTXNnKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9CYWNrdXBNc2cyKV0sIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSB9LFxuICAgICAgW2JpdGdvR3BnUHViS2V5XSxcbiAgICAgIFtiYWNrdXBHcGdQcnZLZXldXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZyA9IGRlY3J5cHRlZEJpdGdvVG9CYWNrdXBSb3VuZDJNc2cucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kMk1zZywgJ0JpdEdvIHRvIEJhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBSb3VuZDJNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQyTXNnKTtcblxuICAgIGNvbnN0IHVzZXJUb0JhY2t1cE1zZzIgPSB1c2VyUm91bmQyUDJQTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUFxuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JhY2t1cE1zZzIsICdVc2VyIHRvIEJhY2t1cCBtZXNzYWdlIDIgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyTXNnMiA9IGJhY2t1cFJvdW5kMlAyUE1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVJcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb1VzZXJNc2cyLCAnQmFja3VwIHRvIFVzZXIgbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDNNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtiaXRnb1RvVXNlclJvdW5kMk1zZywgYmFja3VwVG9Vc2VyTXNnMl0sXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQmFja3VwTXNnMyA9IHVzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQXG4gICAgKTtcbiAgICBhc3NlcnQodXNlclRvQmFja3VwTXNnMywgJ1VzZXIgdG8gQmFja3VwIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlclRvQml0Z29Nc2czID0gdXNlclJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CSVRHT1xuICAgICk7XG4gICAgYXNzZXJ0KHVzZXJUb0JpdGdvTXNnMywgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAzIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclRvQml0Z29Nc2czID0gRGtsc1R5cGVzLnNlcmlhbGl6ZVAyUE1lc3NhZ2UodXNlclRvQml0Z29Nc2czKTtcblxuICAgIGNvbnN0IGJhY2t1cFJvdW5kM01lc3NhZ2VzID0gYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICAgIHAycE1lc3NhZ2VzOiBbYml0Z29Ub0JhY2t1cFJvdW5kMk1zZywgdXNlclRvQmFja3VwTXNnMl0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJNc2czID0gYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUlxuICAgICk7XG4gICAgYXNzZXJ0KGJhY2t1cFRvVXNlck1zZzMsICdCYWNrdXAgdG8gVXNlciBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29Nc2czID0gYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBUb0JpdGdvTXNnMywgJ0JhY2t1cCB0byBCaXRnbyBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCYWNrdXBUb0JpdGdvTXNnMyA9IERrbHNUeXBlcy5zZXJpYWxpemVQMlBNZXNzYWdlKGJhY2t1cFRvQml0Z29Nc2czKTtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQzTWVzc2FnZXMgPSBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICB7IGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSwgcDJwTWVzc2FnZXM6IFt0aGlzLmZvcm1hdFAyUE1lc3NhZ2UoYml0Z29Ub1VzZXJNc2czLCBiaXRnb0NvbW1pdG1lbnQyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbdXNlckdwZ1BydktleV1cbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRnb1RvVXNlclJvdW5kM01zZyA9IGRlY3J5cHRlZEJpdGdvVG9Vc2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSXG4gICAgKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEJpdGdvVG9Vc2VyUm91bmQzTXNnLCAnQml0R28gdG8gVXNlciBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUm91bmQzTXNnID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplUDJQTWVzc2FnZShzZXJpYWxpemVkQml0Z29Ub1VzZXJSb3VuZDNNc2cpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQml0Z29Ub0JhY2t1cFJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmRlY3J5cHRBbmRWZXJpZnlJbmNvbWluZ01lc3NhZ2VzKFxuICAgICAgeyBicm9hZGNhc3RNZXNzYWdlczogW10sIHAycE1lc3NhZ2VzOiBbdGhpcy5mb3JtYXRQMlBNZXNzYWdlKGJpdGdvVG9CYWNrdXBNc2czLCBiaXRnb0NvbW1pdG1lbnQyKV0gfSxcbiAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICBbYmFja3VwR3BnUHJ2S2V5XVxuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdGdvVG9CYWNrdXBSb3VuZDNNc2cgPSBkZWNyeXB0ZWRCaXRnb1RvQmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR08gJiYgbS50byA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChzZXJpYWxpemVkQml0Z29Ub0JhY2t1cFJvdW5kM01zZywgJ0JpdEdvIHRvIEJhY2t1cCBtZXNzYWdlIDMgbm90IGZvdW5kIGluIFAyUCBtZXNzYWdlcycpO1xuICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBSb3VuZDNNc2cgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVQMlBNZXNzYWdlKHNlcmlhbGl6ZWRCaXRnb1RvQmFja3VwUm91bmQzTXNnKTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDRNZXNzYWdlcyA9IHVzZXJTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFtiYWNrdXBUb1VzZXJNc2czLCBiaXRnb1RvVXNlclJvdW5kM01zZ10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCB1c2VyUm91bmQ0QnJvYWRjYXN0TXNnID0gdXNlclJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhc3NlcnQodXNlclJvdW5kNEJyb2FkY2FzdE1zZywgJ1VzZXIgbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVXNlclJvdW5kNEJyb2FkY2FzdE1zZyA9IERrbHNUeXBlcy5zZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKHVzZXJSb3VuZDRCcm9hZGNhc3RNc2cpO1xuXG4gICAgY29uc3QgYmFja3VwUm91bmQ0TWVzc2FnZXMgPSBiYWNrdXBTZXNzaW9uLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IFt1c2VyVG9CYWNrdXBNc2czLCBiaXRnb1RvQmFja3VwUm91bmQzTXNnXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCBiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2cgPSBiYWNrdXBSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVBcbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2csICdCYWNrdXAgbWVzc2FnZSA0IG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnID0gRGtsc1R5cGVzLnNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UoYmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnKTtcblxuICAgIGNvbnN0IHJvdW5kM01lc3NhZ2VzID0gYXdhaXQgRGtsc0NvbW1zLmVuY3J5cHRBbmRBdXRoT3V0Z29pbmdNZXNzYWdlcyhcbiAgICAgIHtcbiAgICAgICAgcDJwTWVzc2FnZXM6IFtzZXJpYWxpemVkVXNlclRvQml0Z29Nc2czLCBzZXJpYWxpemVkQmFja3VwVG9CaXRnb01zZzNdLFxuICAgICAgICBicm9hZGNhc3RNZXNzYWdlczogW3NlcmlhbGl6ZWRVc2VyUm91bmQ0QnJvYWRjYXN0TXNnLCBzZXJpYWxpemVkQmFja3VwUm91bmQ0QnJvYWRjYXN0TXNnXSxcbiAgICAgIH0sXG4gICAgICBbYml0Z29HcGdQdWJLZXldLFxuICAgICAgW3VzZXJHcGdQcnZLZXksIGJhY2t1cEdwZ1BydktleV1cbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWRSb3VuZDMsXG4gICAgICBiaXRnb01zZzQsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29Db21tb25LZXljaGFpbixcbiAgICB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhwYXJhbXMuZW50ZXJwcmlzZSwgc2Vzc2lvbklkLCByb3VuZDNNZXNzYWdlcyk7XG5cbiAgICAvLyAjZW5kcmVnaW9uXG5cbiAgICAvLyAjcmVnaW9uIGtleWNoYWluIGNyZWF0aW9uXG4gICAgYXNzZXJ0LmVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQzLCAnUm91bmQgMSBhbmQgMyBTZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcbiAgICBjb25zdCBiaXRnb1JvdW5kNEJyb2FkY2FzdE1lc3NhZ2VzID0gRGtsc1R5cGVzLmRlc2VyaWFsaXplTWVzc2FnZXMoXG4gICAgICBhd2FpdCBEa2xzQ29tbXMuZGVjcnlwdEFuZFZlcmlmeUluY29taW5nTWVzc2FnZXMoXG4gICAgICAgIHsgcDJwTWVzc2FnZXM6IFtdLCBicm9hZGNhc3RNZXNzYWdlczogW3RoaXMuZm9ybWF0Qml0Z29Ccm9hZGNhc3RNZXNzYWdlKGJpdGdvTXNnNCldIH0sXG4gICAgICAgIFtiaXRnb0dwZ1B1YktleV0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKS5icm9hZGNhc3RNZXNzYWdlcztcbiAgICBjb25zdCBiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZyA9IGJpdGdvUm91bmQ0QnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPKTtcblxuICAgIGFzc2VydChiaXRnb1JvdW5kNEJyb2FkY2FzdE1zZywgJ0JpdEdvIG1lc3NhZ2UgNCBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgdXNlclNlc3Npb24uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW2JpdGdvUm91bmQ0QnJvYWRjYXN0TXNnLCBiYWNrdXBSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgYmFja3VwU2Vzc2lvbi5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDRCcm9hZGNhc3RNc2csIHVzZXJSb3VuZDRCcm9hZGNhc3RNc2ddLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdXNlclByaXZhdGVNYXRlcmlhbCA9IHVzZXJTZXNzaW9uLmdldEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwU2Vzc2lvbi5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gdXNlclNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cFNlc3Npb24uZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG5cbiAgICBjb25zdCB1c2VyQ29tbW9uS2V5Y2hhaW4gPSBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4odXNlclByaXZhdGVNYXRlcmlhbCk7XG4gICAgY29uc3QgYmFja3VwQ29tbW9uS2V5Y2hhaW4gPSBEa2xzVHlwZXMuZ2V0Q29tbW9uS2V5Y2hhaW4oYmFja3VwUHJpdmF0ZU1hdGVyaWFsKTtcblxuICAgIGFzc2VydC5lcXVhbChiaXRnb0NvbW1vbktleWNoYWluLCB1c2VyQ29tbW9uS2V5Y2hhaW4sICdVc2VyIGFuZCBCaXRnbyBDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuICAgIGFzc2VydC5lcXVhbChiaXRnb0NvbW1vbktleWNoYWluLCBiYWNrdXBDb21tb25LZXljaGFpbiwgJ0JhY2t1cCBhbmQgQml0Z28gQ29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSB0aGlzLmFkZFVzZXJLZXljaGFpbihcbiAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgdXNlclJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgICBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgICAgdXNlclByaXZhdGVNYXRlcmlhbCxcbiAgICAgIGJhY2t1cFJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCaXRnb0tleWNoYWluKGJpdGdvQ29tbW9uS2V5Y2hhaW4pO1xuXG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdXNlcktleWNoYWluUHJvbWlzZSxcbiAgICAgIGJhY2t1cEtleWNoYWluUHJvbWlzZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW5Qcm9taXNlLFxuICAgIF0pO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIC8vICNyZWdpb24ga2V5Y2hhaW4gdXRpbHNcbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICBwYXJ0aWNpcGFudEluZGV4OiBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGxldCBzb3VyY2U6IHN0cmluZztcbiAgICBsZXQgZW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlZHVjZWRFbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBzd2l0Y2ggKHBhcnRpY2lwYW50SW5kZXgpIHtcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5VU0VSOlxuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDpcbiAgICAgICAgc291cmNlID0gcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSID8gJ3VzZXInIDogJ2JhY2t1cCc7XG4gICAgICAgIGFzc2VydChwcml2YXRlTWF0ZXJpYWwsIGBQcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsIGBSZWR1Y2VkIHByaXZhdGUgbWF0ZXJpYWwgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBhc3NlcnQocGFzc3BocmFzZSwgYFBhc3NwaHJhc2UgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBlbmNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OiBwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVkdWNlZEVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgLy8gQnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKSBjYW4gbm90IGJlIHVzZWQgaGVyZSBhcyBpdCBkb2VzIG5vdCB3b3JrIG9uIHRoZSBicm93c2VyLlxuICAgICAgICAgIC8vIFRoZSBicm93c2VyIGRlYWxzIHdpdGggYSBCdWZmZXIgYXMgVWludDhBcnJheSwgdGhlcmVmb3JlIGluIHRoZSBicm93c2VyIC50b1N0cmluZygnYmFzZTY0JykganVzdCBjcmVhdGVzIGEgY29tbWEgc2VwZXJhdGVkIHN0cmluZyBvZiB0aGUgYXJyYXkgdmFsdWVzLlxuICAgICAgICAgIGlucHV0OiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgQXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsKSkpKSxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPOlxuICAgICAgICBzb3VyY2UgPSAnYml0Z28nO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudCBpbmRleCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY2lwaWVudEtleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2UsXG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBlbmNyeXB0ZWRQcnYsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBpc01QQ3YyOiB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKHJlY2lwaWVudEtleWNoYWluUGFyYW1zKSksIHJlZHVjZWRFbmNyeXB0ZWRQcnY6IHJlZHVjZWRFbmNyeXB0ZWRQcnYgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB1c2VyIGFuZCBiYWNrdXAgTVBDdjEgU2lnbmluZ01hdGVyaWFsIHRvIFJldHJvZml0RGF0YSBuZWVkZWQgYnkgTVBDdjIgREtHLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gTVBDdjEgZGVjcnlwdGVkIHNpZ25pbmcgbWF0ZXJpYWwgZm9yIHVzZXIgYW5kIGJhY2t1cCBhcyBhIGpzb24uc3RyaW5naWZ5IHN0cmluZyBhbmQgYml0Z28ncyBCaWcgU2kuXG4gICAqIEByZXR1cm5zIHt7IG1wY3YyVXNlcktleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhOyBtcGN2MkJha2N1cEtleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhIH19IC0gdGhlIHJldHJvZml0IGRhdGEgbmVlZGVkIHRvIHN0YXJ0IGFuIE1QQ3YyIERLRyBzZXNzaW9uLlxuICAgKi9cbiAgZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXlzKHBhcmFtczogeyBtcGN2MVVzZXJLZXlTaGFyZTogc3RyaW5nOyBtcGN2MUJhY2t1cEtleVNoYXJlOiBzdHJpbmcgfSk6IHtcbiAgICBtcGN2MlVzZXJLZXlTaGFyZTogRGtsc1R5cGVzLlJldHJvZml0RGF0YTtcbiAgICBtcGN2MkJhY2t1cEtleVNoYXJlOiBEa2xzVHlwZXMuUmV0cm9maXREYXRhO1xuICB9IHtcbiAgICBjb25zdCBtcGMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCB4aUxpc3QgPSBbXG4gICAgICBBcnJheS5mcm9tKGJpZ0ludFRvQnVmZmVyQkUoQmlnSW50KDEpLCAzMikpLFxuICAgICAgQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludCgyKSwgMzIpKSxcbiAgICAgIEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShCaWdJbnQoMyksIDMyKSksXG4gICAgXTtcbiAgICByZXR1cm4ge1xuICAgICAgbXBjdjJVc2VyS2V5U2hhcmU6IHRoaXMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoe1xuICAgICAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHBhcmFtcy5tcGN2MVVzZXJLZXlTaGFyZSxcbiAgICAgICAgbXBjdjFQYXJ0eUluZGV4OiAxLFxuICAgICAgICB4aUxpc3QsXG4gICAgICAgIG1wYyxcbiAgICAgIH0pLFxuICAgICAgbXBjdjJCYWNrdXBLZXlTaGFyZTogdGhpcy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleSh7XG4gICAgICAgIG1wY3YxUGFydHlLZXlTaGFyZTogcGFyYW1zLm1wY3YxQmFja3VwS2V5U2hhcmUsXG4gICAgICAgIG1wY3YxUGFydHlJbmRleDogMixcbiAgICAgICAgeGlMaXN0LFxuICAgICAgICBtcGMsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoe1xuICAgIG1wY3YxUGFydHlLZXlTaGFyZSxcbiAgICBtcGN2MVBhcnR5SW5kZXgsXG4gICAgeGlMaXN0LFxuICAgIG1wYyxcbiAgfToge1xuICAgIG1wY3YxUGFydHlLZXlTaGFyZTogc3RyaW5nO1xuICAgIG1wY3YxUGFydHlJbmRleDogbnVtYmVyO1xuICAgIHhpTGlzdDogbnVtYmVyW11bXTtcbiAgICBtcGM6IEVjZHNhO1xuICB9KTogRGtsc1R5cGVzLlJldHJvZml0RGF0YSB7XG4gICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UobXBjdjFQYXJ0eUtleVNoYXJlKTtcbiAgICBsZXQga2V5Q29tYmluZWQ6IEtleUNvbWJpbmVkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHN3aXRjaCAobXBjdjFQYXJ0eUluZGV4KSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLCAnVXNlciBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgYmFja3VwIE5TaGFyZS4nKTtcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSwgJ0JpdEdvIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSB1c2VyIE5TaGFyZS4nKTtcbiAgICAgICAga2V5Q29tYmluZWQgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSxcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUsXG4gICAgICAgIF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLCAnVXNlciBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgYmFja3VwIE5TaGFyZS4nKTtcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZSwgJ0JpdEdvIE1QQ3YxIGtleSBtYXRlcmlhbCBzaG91bGQgaGF2ZSB1c2VyIE5TaGFyZS4nKTtcbiAgICAgICAga2V5Q29tYmluZWQgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUsIHNpZ25pbmdNYXRlcmlhbC5iaXRnb05TaGFyZV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC51c2VyTlNoYXJlLCAnVXNlciBNUEN2MSBrZXkgbWF0ZXJpYWwgc2hvdWxkIGhhdmUgYmFja3VwIE5TaGFyZS4nKTtcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsICdCYWNrdXAgTVBDdjEga2V5IG1hdGVyaWFsIHNob3VsZCBoYXZlIHVzZXIgTlNoYXJlLicpO1xuICAgICAgICBrZXlDb21iaW5lZCA9IG1wYy5rZXlDb21iaW5lKHNpZ25pbmdNYXRlcmlhbC5wU2hhcmUsIFtcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwudXNlck5TaGFyZSxcbiAgICAgICAgICBzaWduaW5nTWF0ZXJpYWwuYmFja3VwTlNoYXJlLFxuICAgICAgICBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHhTaGFyZToga2V5Q29tYmluZWQueFNoYXJlLFxuICAgICAgeGlMaXN0OiB4aUxpc3QsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkVXNlcktleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJBbmRCYWNrdXBTZXNzaW9uKG06IG51bWJlciwgbjogbnVtYmVyLCByZXRyb2ZpdD86IERlY3J5cHRlZFJldHJvZml0UGF5bG9hZCkge1xuICAgIGlmIChyZXRyb2ZpdCkge1xuICAgICAgY29uc3QgcmV0cm9maXREYXRhID0gdGhpcy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleXMoe1xuICAgICAgICBtcGN2MVVzZXJLZXlTaGFyZTogcmV0cm9maXQuZGVjcnlwdGVkVXNlcktleSxcbiAgICAgICAgbXBjdjFCYWNrdXBLZXlTaGFyZTogcmV0cm9maXQuZGVjcnlwdGVkQmFja3VwS2V5LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVzZXJTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uVVNFUiwgdW5kZWZpbmVkLCByZXRyb2ZpdERhdGEubXBjdjJVc2VyS2V5U2hhcmUpO1xuICAgICAgY29uc3QgYmFja3VwU2Vzc2lvbiA9IG5ldyBEa2xzRGtnLkRrZyhuLCBtLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCwgdW5kZWZpbmVkLCByZXRyb2ZpdERhdGEubXBjdjJCYWNrdXBLZXlTaGFyZSk7XG5cbiAgICAgIHJldHVybiB7IHVzZXJTZXNzaW9uLCBiYWNrdXBTZXNzaW9uIH07XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNlc3Npb24gPSBuZXcgRGtsc0RrZy5Ea2cobiwgbSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBjb25zdCBiYWNrdXBTZXNzaW9uID0gbmV3IERrbHNEa2cuRGtnKG4sIG0sIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKTtcblxuICAgIHJldHVybiB7IHVzZXJTZXNzaW9uLCBiYWNrdXBTZXNzaW9uIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEJpdGdvS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW46IHN0cmluZyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKE1QQ3YyUGFydGllc0VudW0uQklUR08sIGNvbW1vbktleWNoYWluKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBnZW5lcmF0ZSBrZXkgcmVxdWVzdCB1dGlsc1xuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUmVxdWVzdDxUIGV4dGVuZHMgR2VuZXJhdGVNUEN2MktleVJlcXVlc3RSZXNwb25zZT4oXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nLFxuICAgIHJvdW5kOiBNUEN2MktleUdlblN0YXRlLFxuICAgIHBheWxvYWQ6IEdlbmVyYXRlTVBDdjJLZXlSZXF1ZXN0Qm9keSAmIHsgd2FsbGV0SWQ/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iaXRnby51cmwoJy9tcGMvZ2VuZXJhdGVrZXknLCAyKSlcbiAgICAgIC5zZW5kKHsgZW50ZXJwcmlzZSwgdHlwZTogS2V5R2VuVHlwZUVudW0uTVBDdjIsIHJvdW5kLCBwYXlsb2FkIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICB1c2VyR3BnUHVibGljS2V5OiBzdHJpbmcsXG4gICAgYmFja3VwR3BnUHVibGljS2V5OiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlcyAmIHsgd2FsbGV0SWQ/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cEdwZ1B1YmxpY0tleSksICdCYWNrdXAgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMSA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpPy5wYXlsb2FkO1xuICAgIGFzc2VydCh1c2VyTXNnMSwgJ1VzZXIgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcbiAgICBjb25zdCBiYWNrdXBNc2cxID0gcGF5bG9hZC5icm9hZGNhc3RNZXNzYWdlcy5maW5kKChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQoYmFja3VwTXNnMSwgJ0JhY2t1cCBtZXNzYWdlIDEgbm90IGZvdW5kIGluIGJyb2FkY2FzdCBtZXNzYWdlcycpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25SZXF1ZXN0PE1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+KGVudGVycHJpc2UsIE1QQ3YyS2V5R2VuU3RhdGVFbnVtWydNUEN2Mi1SMSddLCB7XG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgdXNlck1zZzE6IHsgZnJvbTogMCwgLi4udXNlck1zZzEgfSxcbiAgICAgIGJhY2t1cE1zZzE6IHsgZnJvbTogMSwgLi4uYmFja3VwTXNnMSB9LFxuICAgICAgd2FsbGV0SWQ6IHBheWxvYWQud2FsbGV0SWQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBEa2xzVHlwZXMuQXV0aEVuY01lc3NhZ2VzXG4gICk6IFByb21pc2U8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhzZXNzaW9uSWQpLCAnU2Vzc2lvbiBJRCBpcyByZXF1aXJlZCcpO1xuICAgIGNvbnN0IHVzZXJNc2cyID0gcGF5bG9hZC5wMnBNZXNzYWdlcy5maW5kKFxuICAgICAgKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ1VzZXIgdG8gQml0Z28gbWVzc2FnZSAyIG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQodXNlck1zZzIuY29tbWl0bWVudCwgJ1VzZXIgdG8gQml0Z28gY29tbWl0bWVudCBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJNc2cyLmNvbW1pdG1lbnQpLCAnVXNlciB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMiA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApO1xuICAgIGFzc2VydChiYWNrdXBNc2cyLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMiBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzIuY29tbWl0bWVudCwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IG5vdCBmb3VuZCBpbiBQMlAgbWVzc2FnZXMnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwTXNnMi5jb21taXRtZW50KSwgJ0JhY2t1cCB0byBCaXRnbyBjb21taXRtZW50IGlzIHJlcXVpcmVkJyk7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJlcXVlc3Q8TVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4oZW50ZXJwcmlzZSwgTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIyJ10sIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICAgdG86IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAgIHNpZ25hdHVyZTogdXNlck1zZzIucGF5bG9hZC5zaWduYXR1cmUsXG4gICAgICAgIGVuY3J5cHRlZE1lc3NhZ2U6IHVzZXJNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICB1c2VyQ29tbWl0bWVudDI6IHVzZXJNc2cyLmNvbW1pdG1lbnQsXG4gICAgICBiYWNrdXBNc2cyOiB7XG4gICAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgICB0bzogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgICAgc2lnbmF0dXJlOiBiYWNrdXBNc2cyLnBheWxvYWQuc2lnbmF0dXJlLFxuICAgICAgICBlbmNyeXB0ZWRNZXNzYWdlOiBiYWNrdXBNc2cyLnBheWxvYWQuZW5jcnlwdGVkTWVzc2FnZSxcbiAgICAgIH0sXG4gICAgICBiYWNrdXBDb21taXRtZW50MjogYmFja3VwTXNnMi5jb21taXRtZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMyhcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcsXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogRGtsc1R5cGVzLkF1dGhFbmNNZXNzYWdlc1xuICApOiBQcm9taXNlPE1QQ3YyS2V5R2VuUm91bmQzUmVzcG9uc2U+IHtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoc2Vzc2lvbklkKSwgJ1Nlc3Npb24gSUQgaXMgcmVxdWlyZWQnKTtcbiAgICBjb25zdCB1c2VyTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiAmJiBtLnRvID09PSBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPXG4gICAgKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzMsICdVc2VyIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnMyA9IHBheWxvYWQucDJwTWVzc2FnZXMuZmluZChcbiAgICAgIChtKSA9PiBtLmZyb20gPT09IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQICYmIG0udG8gPT09IE1QQ3YyUGFydGllc0VudW0uQklUR09cbiAgICApPy5wYXlsb2FkO1xuICAgIGFzc2VydChiYWNrdXBNc2czLCAnQmFja3VwIHRvIEJpdGdvIG1lc3NhZ2UgMyBub3QgZm91bmQgaW4gUDJQIG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgdXNlck1zZzQgPSBwYXlsb2FkLmJyb2FkY2FzdE1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uZnJvbSA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSKT8ucGF5bG9hZDtcbiAgICBhc3NlcnQodXNlck1zZzQsICdVc2VyIG1lc3NhZ2UgMSBub3QgZm91bmQgaW4gYnJvYWRjYXN0IG1lc3NhZ2VzJyk7XG4gICAgY29uc3QgYmFja3VwTXNnNCA9IHBheWxvYWQuYnJvYWRjYXN0TWVzc2FnZXMuZmluZCgobSkgPT4gbS5mcm9tID09PSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk/LnBheWxvYWQ7XG4gICAgYXNzZXJ0KGJhY2t1cE1zZzQsICdCYWNrdXAgbWVzc2FnZSAxIG5vdCBmb3VuZCBpbiBicm9hZGNhc3QgbWVzc2FnZXMnKTtcblxuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUmVxdWVzdDxNUEN2MktleUdlblJvdW5kM1Jlc3BvbnNlPihlbnRlcnByaXNlLCBNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjMnXSwge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgdXNlck1zZzM6IHsgZnJvbTogMCwgdG86IDIsIC4uLnVzZXJNc2czIH0sXG4gICAgICBiYWNrdXBNc2czOiB7IGZyb206IDEsIHRvOiAyLCAuLi5iYWNrdXBNc2czIH0sXG4gICAgICB1c2VyTXNnNDogeyBmcm9tOiAwLCAuLi51c2VyTXNnNCB9LFxuICAgICAgYmFja3VwTXNnNDogeyBmcm9tOiAxLCAuLi5iYWNrdXBNc2c0IH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBzaWduIHR4IHJlcXVlc3RcblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gZnVsbHkgc2lnbmVkIFR4UmVxdWVzdCBvYmplY3RcbiAgICovXG5cbiAgYXN5bmMgc2lnblR4UmVxdWVzdChwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLnR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKFxuICAgIHBhcmFtczogVFNTUGFyYW1zV2l0aFBydiB8IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2LFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBhcmFtcy5wcnYsICdiYXNlNjQnKTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFR4UmVxdWVzdCA9XG4gICAgICB0eXBlb2YgcGFyYW1zLnR4UmVxdWVzdCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgcGFyYW1zLnR4UmVxdWVzdCwgcGFyYW1zLnJlcUlkKVxuICAgICAgICA6IHBhcmFtcy50eFJlcXVlc3Q7XG5cbiAgICBsZXQgdHhPck1lc3NhZ2VUb1NpZ247XG4gICAgbGV0IGRlcml2YXRpb25QYXRoO1xuICAgIGxldCBidWZmZXJDb250ZW50O1xuICAgIGNvbnN0IFt1c2VyR3BnS2V5LCBiaXRnb0dwZ1B1YktleV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpLFxuICAgICAgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3ModHhSZXF1ZXN0LmVudGVycHJpc2VJZCwgdHJ1ZSwgcGFyYW1zLnJlcUlkKS50aGVuKFxuICAgICAgICAocHViS2V5KSA9PiBwdWJLZXkgPz8gdGhpcy5iaXRnb01QQ3YyUHVibGljR3BnS2V5XG4gICAgICApLFxuICAgIF0pO1xuICAgIGlmICghYml0Z29HcGdQdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBHUEcga2V5IGZvciBNUEN2MicpO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIGFzc2VydCh0eFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IHR4UmVxdWVzdC51bnNpZ25lZFR4cywgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnKTtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgICB0eFJlcXVlc3QuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnID8gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeCA6IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcbiAgICAgIHR4T3JNZXNzYWdlVG9TaWduID0gdW5zaWduZWRUeC5zaWduYWJsZUhleDtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aDtcbiAgICAgIGJ1ZmZlckNvbnRlbnQgPSBCdWZmZXIuZnJvbSh0eE9yTWVzc2FnZVRvU2lnbiwgJ2hleCcpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIHR4T3JNZXNzYWdlVG9TaWduID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5tZXNzYWdlRW5jb2RlZDtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5kZXJpdmF0aW9uUGF0aCB8fCAnbS8wJztcbiAgICAgIGJ1ZmZlckNvbnRlbnQgPSBCdWZmZXIuZnJvbSh0eE9yTWVzc2FnZVRvU2lnbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXF1ZXN0IHR5cGUnKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzaDogSGFzaDtcbiAgICB0cnkge1xuICAgICAgaGFzaCA9IHRoaXMuYmFzZUNvaW4uZ2V0SGFzaEZ1bmN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBoYXNoID0gY3JlYXRlS2VjY2FrSGFzaCgna2VjY2FrMjU2JykgYXMgSGFzaDtcbiAgICB9XG4gICAgLy8gY2hlY2sgd2hhdCB0aGUgZW5jb2RpbmcgaXMgc3VwcG9zZWQgdG8gYmUgZm9yIG1lc3NhZ2VcbiAgICBjb25zdCBoYXNoQnVmZmVyID0gaGFzaC51cGRhdGUoYnVmZmVyQ29udGVudCkuZGlnZXN0KCk7XG4gICAgY29uc3Qgb3RoZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgY29uc3QgdXNlclNpZ25lckJyb2FkY2FzdE1zZzEgPSBhd2FpdCBvdGhlclNpZ25lci5pbml0KCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDEgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kT25lKHVzZXJTaWduZXJCcm9hZGNhc3RNc2cxLCB1c2VyR3BnS2V5KTtcblxuICAgIGxldCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3QgT2JqZWN0Jyk7XG5cbiAgICBsZXQgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyOiBhbnk7XG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYml0Z29Ub1VzZXJNZXNzYWdlczFBbmQyID0gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDIgPSBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICB9XG4gICAgLy8gVE9ETzogVXNlIGNvZGVjIGZvciBwYXJzaW5nXG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lID0gSlNPTi5wYXJzZShcbiAgICAgIGJpdGdvVG9Vc2VyTWVzc2FnZXMxQW5kMltiaXRnb1RvVXNlck1lc3NhZ2VzMUFuZDIubGVuZ3RoIC0gMV0uc2hhcmVcbiAgICApIGFzIE1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQ7XG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCaXRHb1RvVXNlck1lc3NhZ2VzUm91bmQxQW5kMiA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRPbmUoXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXlcbiAgICApO1xuXG4gICAgLyoqIFJvdW5kIDIgKiovXG4gICAgY29uc3QgZGVzZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMUFuZDIpO1xuICAgIGNvbnN0IHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDIgPSBvdGhlclNpZ25lci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBkZXNlcmlhbGl6ZWRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQzID0gb3RoZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZFR3byA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28oXG4gICAgICB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQyLFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyxcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiaXRnb0dwZ1B1YktleVxuICAgICk7XG4gICAgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUd29dLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGFzc2VydChsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIHx8IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcywgJ0ludmFsaWQgdHhSZXF1ZXN0IE9iamVjdCcpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzID1cbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eFxuICAgICAgICA/IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlc1xuICAgICAgICA6IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIC8vIFRPRE86IFVzZSBjb2RlYyBmb3IgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IEpTT04ucGFyc2UoXG4gICAgICB0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXNbdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28oXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXlcbiAgICApO1xuXG4gICAgLyoqIFJvdW5kIDMgKiovXG4gICAgY29uc3QgZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0ID0gb3RoZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZShcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdQdWJLZXlcbiAgICApO1xuICAgIC8vIFN1Ym1pdCBmb3IgZmluYWwgc2lnbmF0dXJlIHNoYXJlIGNvbWJpbmVcbiAgICBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdC53YWxsZXRJZCwgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHByaXZhdGUgdXRpbHNcbiAgcHJpdmF0ZSBmb3JtYXRCaXRnb0Jyb2FkY2FzdE1lc3NhZ2UoYnJvYWRjYXN0TWVzc2FnZTogTVBDdjJCcm9hZGNhc3RNZXNzYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IGJyb2FkY2FzdE1lc3NhZ2UuZnJvbSxcbiAgICAgIHBheWxvYWQ6IHsgbWVzc2FnZTogYnJvYWRjYXN0TWVzc2FnZS5tZXNzYWdlLCBzaWduYXR1cmU6IGJyb2FkY2FzdE1lc3NhZ2Uuc2lnbmF0dXJlIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UDJQTWVzc2FnZShwMnBNZXNzYWdlOiBNUEN2MlAyUE1lc3NhZ2UsIGNvbW1pdG1lbnQ/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF5bG9hZDogeyBlbmNyeXB0ZWRNZXNzYWdlOiBwMnBNZXNzYWdlLmVuY3J5cHRlZE1lc3NhZ2UsIHNpZ25hdHVyZTogcDJwTWVzc2FnZS5zaWduYXR1cmUgfSxcbiAgICAgIGZyb206IHAycE1lc3NhZ2UuZnJvbSxcbiAgICAgIHRvOiBwMnBNZXNzYWdlLnRvLFxuICAgICAgY29tbWl0bWVudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaGFzaCBzdHJpbmcgYW5kIGRlcml2YXRpb24gcGF0aCBmcm9tIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge1R4UmVxdWVzdH0gdHhSZXF1ZXN0IC0gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7UmVxdWVzdFR5cGV9IHJlcXVlc3RUeXBlIC0gdGhlIHJlcXVlc3QgdHlwZVxuICAgKiBAcmV0dXJucyB7eyBoYXNoQnVmZmVyOiBCdWZmZXI7IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfX0gLSB0aGUgaGFzaCBzdHJpbmcgYW5kIGRlcml2YXRpb24gcGF0aFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRIYXNoU3RyaW5nQW5kRGVyaXZhdGlvblBhdGgoXG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3QsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlID0gUmVxdWVzdFR5cGUudHhcbiAgKTogeyBoYXNoQnVmZmVyOiBCdWZmZXI7IGRlcml2YXRpb25QYXRoOiBzdHJpbmcgfSB7XG4gICAgbGV0IHR4VG9TaWduOiBzdHJpbmc7XG4gICAgbGV0IGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICB0eFRvU2lnbiA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zaWduYWJsZUhleDtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmRlcml2YXRpb25QYXRoO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICAgIHRocm93IG5ldyBFcnJvcignTVBDdjIgbWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVxdWVzdCB0eXBlLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZSk7XG4gICAgfVxuXG4gICAgbGV0IGhhc2g6IEhhc2g7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSB0aGlzLmJhc2VDb2luLmdldEhhc2hGdW5jdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFzaCA9IGNyZWF0ZUtlY2Nha0hhc2goJ2tlY2NhazI1NicpIGFzIEhhc2g7XG4gICAgfVxuICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBoYXNoLnVwZGF0ZShCdWZmZXIuZnJvbSh0eFRvU2lnbiwgJ2hleCcpKS5kaWdlc3QoKTtcblxuICAgIHJldHVybiB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgQml0R28gYW5kIHVzZXIgR1BHIGtleXMgZnJvbSB0aGUgQml0R28gcHVibGljIEdQRyBrZXkgYW5kIHRoZSBlbmNyeXB0ZWQgdXNlciBHUEcgcHJpdmF0ZSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiaXRnb1B1YmxpY0dwZ0tleSAgLSB0aGUgQml0R28gcHVibGljIEdQRyBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgIC0gdGhlIGVuY3J5cHRlZCB1c2VyIEdQRyBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFzc3BocmFzZSAgLSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHJldHVybnMge1Byb21pc2U8eyBiaXRnb0dwZ0tleTogcGdwLktleTsgdXNlckdwZ0tleTogcGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gfT59IC0gdGhlIEJpdEdvIGFuZCB1c2VyIEdQRyBrZXlzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZyxcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmcsXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nXG4gICk6IFByb21pc2U8e1xuICAgIGJpdGdvR3BnS2V5OiBwZ3AuS2V5O1xuICAgIHVzZXJHcGdLZXk6IHBncC5TZXJpYWxpemVkS2V5UGFpcjxzdHJpbmc+O1xuICB9PiB7XG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvUHVibGljR3BnS2V5IH0pO1xuICAgIGNvbnN0IHVzZXJEZWNyeXB0ZWRLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7XG4gICAgICBhcm1vcmVkS2V5OiB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkVXNlckdwZ1BydktleSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSksXG4gICAgfSk7XG4gICAgY29uc3QgdXNlckdwZ0tleTogcGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4gPSB7XG4gICAgICBwcml2YXRlS2V5OiB1c2VyRGVjcnlwdGVkS2V5LmFybW9yKCksXG4gICAgICBwdWJsaWNLZXk6IHVzZXJEZWNyeXB0ZWRLZXkudG9QdWJsaWMoKS5hcm1vcigpLFxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGJpdGdvR3BnS2V5LFxuICAgICAgdXNlckdwZ0tleSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgYWRhdGEgYW5kIGN5cGhlcnRleHQuXG4gICAqIEBwYXJhbSBhZGF0YSBzdHJpbmdcbiAgICogQHBhcmFtIGN5cGhlcnRleHQgc3RyaW5nXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBhZGF0YSBvciBjeXBoZXJ0ZXh0IGlzIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBZGF0YShhZGF0YTogc3RyaW5nLCBjeXBoZXJ0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsZXQgY3lwaGVySnNvbjtcbiAgICB0cnkge1xuICAgICAgY3lwaGVySnNvbiA9IEpTT04ucGFyc2UoY3lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgY3lwaGVydGV4dCB0byBKU09OLCBnb3Q6ICcgKyBjeXBoZXJ0ZXh0KTtcbiAgICB9XG4gICAgaWYgKGN5cGhlckpzb24uYWRhdGEgIT09IGFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkYXRhIGRvZXMgbm90IG1hdGNoIGN5cGhlcnRleHQgYWRhdGEnKTtcbiAgICB9XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBleHRlcm5hbCBzaWduZXJcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIHNpZ25FY2RzYU1QQ3YyVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3I6IEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcjogQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yOiBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlID0gUmVxdWVzdFR5cGUudHhcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB7IHR4UmVxdWVzdCwgcmVxSWQgfSA9IHBhcmFtcztcbiAgICBsZXQgdHhSZXF1ZXN0UmVzb2x2ZWQ6IFR4UmVxdWVzdDtcblxuICAgIC8vIFRPRE8oV1AtMjE3Nik6IEFkZCBzdXBwb3J0IGZvciBtZXNzYWdlIHNpZ25pbmdcbiAgICBhc3NlcnQoXG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgsXG4gICAgICAnT25seSB0cmFuc2FjdGlvbiBzaWduaW5nIGlzIHN1cHBvcnRlZCBmb3IgZXh0ZXJuYWwgc2lnbmVyLCBnb3Q6ICcgKyByZXF1ZXN0VHlwZVxuICAgICk7XG5cbiAgICBpZiAodHlwZW9mIHR4UmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdCwgcmVxSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IHR4UmVxdWVzdDtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9XG4gICAgICAoYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3ModHhSZXF1ZXN0UmVzb2x2ZWQuZW50ZXJwcmlzZUlkLCB0cnVlLCByZXFJZCkpID8/XG4gICAgICB0aGlzLmJpdGdvTVBDdjJQdWJsaWNHcGdLZXk7XG4gICAgaWYgKCFiaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG4gICAgfVxuXG4gICAgLy8gcm91bmQgMVxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfSA9XG4gICAgICBhd2FpdCBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcih7IHR4UmVxdWVzdDogdHhSZXF1ZXN0UmVzb2x2ZWQgfSk7XG4gICAgY29uc3Qgcm91bmQxVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgLy8gcm91bmQgMlxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQxVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBjb25zdCByb3VuZDJUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQyXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgcm91bmQyVHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyAmJiByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcyxcbiAgICAgICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMiB0eFJlcXVlc3QnXG4gICAgKTtcblxuICAgIC8vIHJvdW5kIDNcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcih7XG4gICAgICB0eFJlcXVlc3Q6IHJvdW5kMlR4UmVxdWVzdCxcbiAgICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXk6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgfSk7XG4gICAgYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kM10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcmVxSWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHBhcmFtczogeyB0eFJlcXVlc3Q6IFR4UmVxdWVzdDsgcHJ2OiBzdHJpbmc7IHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDE6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIHVzZXJHcGdQdWJLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uOiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgeyBwcnYsIHdhbGxldFBhc3NwaHJhc2UsIHR4UmVxdWVzdCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHsgaGFzaEJ1ZmZlciwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0SGFzaFN0cmluZ0FuZERlcml2YXRpb25QYXRoKHR4UmVxdWVzdCk7XG4gICAgY29uc3QgYWRhdGEgPSBoYXNoQnVmZmVyLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuXG4gICAgY29uc3QgdXNlclNpZ25lciA9IG5ldyBEa2xzRHNnLkRzZyh1c2VyS2V5U2hhcmUsIDAsIGRlcml2YXRpb25QYXRoLCBoYXNoQnVmZmVyKTtcbiAgICBjb25zdCB1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSA9IGF3YWl0IHVzZXJTaWduZXIuaW5pdCgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQxID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSh1c2VyU2lnbmVyQnJvYWRjYXN0TXNnMSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHVzZXJTaWduZXIuZ2V0U2Vzc2lvbigpO1xuICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogc2Vzc2lvbiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsIGFkYXRhIH0pO1xuXG4gICAgY29uc3QgdXNlckdwZ1B1YktleSA9IHVzZXJHcGdLZXkucHVibGljS2V5O1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgaW5wdXQ6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMlNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMjogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbjogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgeyBwcnYsIHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9XG4gICAgICBwYXJhbXM7XG5cbiAgICBjb25zdCB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldEhhc2hTdHJpbmdBbmREZXJpdmF0aW9uUGF0aCh0eFJlcXVlc3QpO1xuICAgIGNvbnN0IGFkYXRhID0gaGFzaEJ1ZmZlci50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ0tleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZVxuICAgICk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5bMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIGFzc2VydChzaWduYXR1cmVTaGFyZXMsICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMSB0eFJlcXVlc3QnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBKU09OLnBhcnNlKFxuICAgICAgc2lnbmF0dXJlU2hhcmVzW3NpZ25hdHVyZVNoYXJlcy5sZW5ndGggLSAxXS5zaGFyZVxuICAgICkgYXMgTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dDtcbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDEgPSBhd2FpdCB2ZXJpZnlCaXRHb01lc3NhZ2VzQW5kU2lnbmF0dXJlc1JvdW5kT25lKFxuICAgICAgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJpdGdvR3BnS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHJvdW5kMVNlc3Npb24gPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlQWRhdGEoYWRhdGEsIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24pO1xuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IEJ1ZmZlci5mcm9tKHBydiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHVzZXJTaWduZXIgPSBuZXcgRGtsc0RzZy5Ec2codXNlcktleVNoYXJlLCAwLCBkZXJpdmF0aW9uUGF0aCwgaGFzaEJ1ZmZlcik7XG4gICAgdXNlclNpZ25lci5zZXRTZXNzaW9uKHJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgZGVzZXJpYWxpemVkTWVzc2FnZXMgPSBEa2xzVHlwZXMuZGVzZXJpYWxpemVNZXNzYWdlcyhzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMiA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogW10sXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gICAgfSk7XG4gICAgY29uc3QgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMyA9IHVzZXJTaWduZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgICBwMnBNZXNzYWdlczogZGVzZXJpYWxpemVkTWVzc2FnZXMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVSb3VuZDIgPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKFxuICAgICAgdXNlclRvQml0R29NZXNzYWdlc1JvdW5kMixcbiAgICAgIHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDMsXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuICAgIGNvbnN0IHNlc3Npb24gPSB1c2VyU2lnbmVyLmdldFNlc3Npb24oKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uID0gdGhpcy5iaXRnby5lbmNyeXB0KHsgaW5wdXQ6IHNlc3Npb24sIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLCBhZGF0YSB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzaWduYXR1cmVTaGFyZVJvdW5kMixcbiAgICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDNTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBwcnY6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbjogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDM6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICB9PiB7XG4gICAgY29uc3QgeyBwcnYsIHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9XG4gICAgICBwYXJhbXM7XG5cbiAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyAmJiB0eFJlcXVlc3QudHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMSwgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnKTtcbiAgICBjb25zdCB7IGhhc2hCdWZmZXIsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldEhhc2hTdHJpbmdBbmREZXJpdmF0aW9uUGF0aCh0eFJlcXVlc3QpO1xuICAgIGNvbnN0IGFkYXRhID0gaGFzaEJ1ZmZlci50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlXG4gICAgKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM/LlswXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IEpTT04ucGFyc2UoXG4gICAgICBzaWduYXR1cmVTaGFyZXNbc2lnbmF0dXJlU2hhcmVzLmxlbmd0aCAtIDFdLnNoYXJlXG4gICAgKSBhcyBNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0O1xuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28udHlwZSAhPT0gJ3JvdW5kMk91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IGF3YWl0IHZlcmlmeUJpdEdvTWVzc2FnZXNBbmRTaWduYXR1cmVzUm91bmRUd28oXG4gICAgICBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgYml0Z29HcGdLZXlcbiAgICApO1xuXG4gICAgY29uc3QgZGVzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMyA9IERrbHNUeXBlcy5kZXNlcmlhbGl6ZU1lc3NhZ2VzKHtcbiAgICAgIHAycE1lc3NhZ2VzOiBzZXJpYWxpemVkQml0R29Ub1VzZXJNZXNzYWdlc1JvdW5kMy5wMnBNZXNzYWdlcyxcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvdW5kMlNlc3Npb24gPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uKTtcbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwcnYsICdiYXNlNjQnKTtcbiAgICBjb25zdCB1c2VyU2lnbmVyID0gbmV3IERrbHNEc2cuRHNnKHVzZXJLZXlTaGFyZSwgMCwgZGVyaXZhdGlvblBhdGgsIGhhc2hCdWZmZXIpO1xuICAgIHVzZXJTaWduZXIuc2V0U2Vzc2lvbihyb3VuZDJTZXNzaW9uKTtcblxuICAgIGNvbnN0IHVzZXJUb0JpdEdvTWVzc2FnZXNSb3VuZDQgPSB1c2VyU2lnbmVyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgICAgcDJwTWVzc2FnZXM6IGRlc2VyaWFsaXplZEJpdEdvVG9Vc2VyTWVzc2FnZXNSb3VuZDMucDJwTWVzc2FnZXMsXG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMyA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSh1c2VyVG9CaXRHb01lc3NhZ2VzUm91bmQ0LCB1c2VyR3BnS2V5LCBiaXRnb0dwZ0tleSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMyB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cbn1cbiJdfQ==