@bitgo/sdk-core 37.10.1 → 38.0.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 (71) hide show
  1. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +1 -3
  2. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  3. package/dist/src/bitgo/baseCoin/baseCoin.js +3 -17
  4. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +2 -2
  5. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  6. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  7. package/dist/src/bitgo/bitgoBase.d.ts +3 -6
  8. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  9. package/dist/src/bitgo/bitgoBase.js +1 -1
  10. package/dist/src/bitgo/environments.d.ts.map +1 -1
  11. package/dist/src/bitgo/environments.js +9 -1
  12. package/dist/src/bitgo/internal/keycard.d.ts +9 -18
  13. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  14. package/dist/src/bitgo/internal/keycard.js +8 -56
  15. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +2 -12
  16. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -1
  17. package/dist/src/bitgo/keychain/decryptKeychain.js +6 -37
  18. package/dist/src/bitgo/keychain/iKeychains.d.ts +1 -2
  19. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  20. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  21. package/dist/src/bitgo/keychain/keychains.d.ts +1 -12
  22. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  23. package/dist/src/bitgo/keychain/keychains.js +16 -44
  24. package/dist/src/bitgo/recovery/initiate.d.ts +2 -15
  25. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  26. package/dist/src/bitgo/recovery/initiate.js +7 -47
  27. package/dist/src/bitgo/trading/tradingAccount.js +2 -2
  28. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -1
  29. package/dist/src/bitgo/utils/tss/addressVerification.js +3 -10
  30. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  31. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +5 -5
  32. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +7 -7
  33. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +13 -8
  34. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  35. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +78 -103
  36. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +9 -0
  37. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  38. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +61 -18
  39. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +3 -3
  40. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  41. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +30 -46
  42. package/dist/src/bitgo/wallet/iWallet.d.ts +2 -4
  43. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  44. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  45. package/dist/src/bitgo/wallet/iWallets.d.ts +96 -2
  46. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  47. package/dist/src/bitgo/wallet/iWallets.js +1 -1
  48. package/dist/src/bitgo/wallet/wallet.d.ts +8 -21
  49. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  50. package/dist/src/bitgo/wallet/wallet.js +26 -114
  51. package/dist/src/bitgo/wallet/wallets.d.ts +5 -0
  52. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  53. package/dist/src/bitgo/wallet/wallets.js +123 -27
  54. package/dist/src/index.d.ts +1 -0
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +1 -1
  57. package/dist/test/unit/bitgo/recovery/initiate.js +18 -89
  58. package/dist/test/unit/bitgo/trading/tradingAccount.js +5 -5
  59. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +26 -22
  60. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +14 -14
  61. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +129 -10
  62. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  63. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  64. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  65. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +47 -75
  66. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +4 -4
  67. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +16 -16
  68. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +364 -14
  69. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +2 -5
  70. package/dist/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +4 -4
@@ -6,6 +6,7 @@ import baseTSSUtils from '../baseTSSUtils';
6
6
  import { KeychainsTriplet } from '../../../baseCoin';
7
7
  import { EncryptionVersion, IRequestTracer } from '../../../../api';
8
8
  import { EnvironmentName } from '../../../environments';
9
+ import type { EddsaKeyGenCallbacks } from '../../../wallet/iWallets';
9
10
  /**
10
11
  * Utility functions for TSS work flows.
11
12
  */
@@ -59,6 +60,14 @@ export declare class EddsaUtils extends baseTSSUtils<KeyShare> {
59
60
  webauthnInfo?: WebauthnKeyEncryptionInfo;
60
61
  encryptionVersion?: EncryptionVersion;
61
62
  }): Promise<KeychainsTriplet>;
63
+ /**
64
+ * Creates EdDSA TSS keychains using external signer callbacks instead of a passphrase.
65
+ * The external signer holds all private key material and pre-encrypts shares to BitGo's GPG key.
66
+ */
67
+ createKeychainsWithExternalSigner(params: {
68
+ enterprise: string;
69
+ callbacks: EddsaKeyGenCallbacks;
70
+ }): Promise<KeychainsTriplet>;
62
71
  createCommitmentShareFromTxRequest(params: {
63
72
  txRequest: TxRequest;
64
73
  prv: string;
@@ -1 +1 @@
1
- {"version":3,"file":"eddsa.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/eddsa/eddsa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eddsa.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/eddsa/eddsa.ts"],"names":[],"mappings":"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"}
@@ -156,7 +156,7 @@ class EddsaUtils extends baseTSSUtils_1.default {
156
156
  userKeychainParams.encryptedPrv = await encryptionSession.encrypt(JSON.stringify(userSigningMaterial));
157
157
  }
158
158
  else {
159
- userKeychainParams.encryptedPrv = await this.bitgo.encryptAsync({
159
+ userKeychainParams.encryptedPrv = await this.bitgo.encrypt({
160
160
  input: JSON.stringify(userSigningMaterial),
161
161
  password: passphrase,
162
162
  encryptionVersion,
@@ -169,7 +169,7 @@ class EddsaUtils extends baseTSSUtils_1.default {
169
169
  userKeychainParams.webauthnInfo = {
170
170
  otpDeviceId: webauthnInfo.otpDeviceId,
171
171
  prfSalt: webauthnInfo.prfSalt,
172
- encryptedPrv: await this.bitgo.encryptAsync({
172
+ encryptedPrv: await this.bitgo.encrypt({
173
173
  input: JSON.stringify(userSigningMaterial),
174
174
  password: webauthnInfo.passphrase,
175
175
  encryptionVersion,
@@ -237,7 +237,7 @@ class EddsaUtils extends baseTSSUtils_1.default {
237
237
  params.encryptedPrv = await encryptionSession.encrypt(prv);
238
238
  }
239
239
  else {
240
- params.encryptedPrv = await this.bitgo.encryptAsync({ input: prv, password: passphrase, encryptionVersion });
240
+ params.encryptedPrv = await this.bitgo.encrypt({ input: prv, password: passphrase, encryptionVersion });
241
241
  }
242
242
  }
243
243
  return await this.baseCoin.keychains().createBackup(params);
@@ -340,6 +340,58 @@ class EddsaUtils extends baseTSSUtils_1.default {
340
340
  encryptionSession?.destroy();
341
341
  }
342
342
  }
343
+ /**
344
+ * Creates EdDSA TSS keychains using external signer callbacks instead of a passphrase.
345
+ * The external signer holds all private key material and pre-encrypts shares to BitGo's GPG key.
346
+ */
347
+ async createKeychainsWithExternalSigner(params) {
348
+ const { enterprise, callbacks } = params;
349
+ const bitgoGpgPubKey = (await (0, opengpgUtils_1.getBitgoGpgPubKey)(this.bitgo)).mpcV1;
350
+ if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
351
+ (0, assert_1.default)((0, bitgoPubKeys_1.isBitgoMpcPubKey)(bitgoGpgPubKey.armor(), 'mpcv1'), 'Invalid BitGo GPG public key');
352
+ }
353
+ const { userGpgPublicKey, backupGpgPublicKey, userToBitgoKeyShare, backupToBitgoKeyShare, userState, backupState, backupToUserCounterPartyKeyShare, } = await callbacks.initializeCallback({ enterprise, bitgoPublicGpgKey: bitgoGpgPubKey.armor() });
354
+ // Create BitGo keychain with pre-encrypted shares from the external signer
355
+ const bitgoKeychain = await this.baseCoin.keychains().add({
356
+ keyType: 'tss',
357
+ source: 'bitgo',
358
+ keyShares: [
359
+ { from: 'user', to: 'bitgo', ...userToBitgoKeyShare },
360
+ { from: 'backup', to: 'bitgo', ...backupToBitgoKeyShare },
361
+ ],
362
+ userGPGPublicKey: userGpgPublicKey,
363
+ backupGPGPublicKey: backupGpgPublicKey,
364
+ enterprise,
365
+ });
366
+ // Finalize runs sequentially: user finalize produces a counterparty key share that backup finalize consumes.
367
+ const coin = this.baseCoin.getChain();
368
+ const userResult = await callbacks.finalizeCallback({
369
+ source: 'user',
370
+ coin,
371
+ bitgoKeychain,
372
+ counterPartyGPGKey: backupGpgPublicKey,
373
+ counterPartyKeyShare: backupToUserCounterPartyKeyShare,
374
+ state: userState,
375
+ });
376
+ (0, assert_1.default)(userResult.counterpartyKeyShare, 'User finalize did not produce a counterparty key share');
377
+ const backupResult = await callbacks.finalizeCallback({
378
+ source: 'backup',
379
+ coin,
380
+ bitgoKeychain,
381
+ counterPartyGPGKey: userGpgPublicKey,
382
+ counterPartyKeyShare: userResult.counterpartyKeyShare,
383
+ state: backupState,
384
+ });
385
+ (0, assert_1.default)(bitgoKeychain.commonKeychain, 'BitGo keychain missing commonKeychain');
386
+ assert_1.default.strictEqual(userResult.commonKeychain, bitgoKeychain.commonKeychain, 'User common keychain does not match BitGo');
387
+ assert_1.default.strictEqual(backupResult.commonKeychain, bitgoKeychain.commonKeychain, 'Backup common keychain does not match BitGo');
388
+ const { commonKeychain } = bitgoKeychain;
389
+ const [userKeychain, backupKeychain] = await Promise.all([
390
+ this.baseCoin.keychains().add({ source: 'user', keyType: 'tss', commonKeychain }),
391
+ this.baseCoin.keychains().add({ source: 'backup', keyType: 'tss', commonKeychain }),
392
+ ]);
393
+ return { userKeychain, backupKeychain, bitgoKeychain };
394
+ }
343
395
  async createCommitmentShareFromTxRequest(params) {
344
396
  const bitgoIndex = tss_2.ShareKeyPosition.BITGO;
345
397
  const { txRequest, prv } = params;
@@ -375,7 +427,7 @@ class EddsaUtils extends baseTSSUtils_1.default {
375
427
  }
376
428
  }
377
429
  else {
378
- encryptedRShare = await this.bitgo.encryptAsync({
430
+ encryptedRShare = await this.bitgo.encrypt({
379
431
  input: stringifiedRShare,
380
432
  password: params.walletPassphrase,
381
433
  encryptionVersion: 1,
@@ -386,19 +438,10 @@ class EddsaUtils extends baseTSSUtils_1.default {
386
438
  }
387
439
  async createRShareFromTxRequest(params) {
388
440
  const { walletPassphrase, encryptedUserToBitgoRShare } = params;
389
- let decryptedRShare;
390
- if ((0, baseTypes_1.isV2Envelope)(encryptedUserToBitgoRShare.share)) {
391
- decryptedRShare = await this.bitgo.decryptAsync({
392
- input: encryptedUserToBitgoRShare.share,
393
- password: walletPassphrase,
394
- });
395
- }
396
- else {
397
- decryptedRShare = this.bitgo.decrypt({
398
- input: encryptedUserToBitgoRShare.share,
399
- password: walletPassphrase,
400
- });
401
- }
441
+ const decryptedRShare = await this.bitgo.decrypt({
442
+ input: encryptedUserToBitgoRShare.share,
443
+ password: walletPassphrase,
444
+ });
402
445
  const rShare = JSON.parse(decryptedRShare);
403
446
  (0, assert_1.default)(rShare.xShare, 'Unable to find xShare in decryptedRShare');
404
447
  (0, assert_1.default)(rShare.rShares, 'Unable to find rShares in decryptedRShare');
@@ -576,4 +619,4 @@ exports.EddsaUtils = EddsaUtils;
576
619
  * @deprecated - use EddsaUtils
577
620
  */
578
621
  exports.TssUtils = EddsaUtils;
579
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VkZHNhL2VkZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsb0RBQTRCO0FBQzVCLGlEQUFtQztBQUNuQywwRUFBMkU7QUFFM0Usb0RBQWlFO0FBQ2pFLHFEQUEwRztBQUMxRyxzQ0FTc0I7QUFDdEIsNENBa0JzQjtBQUN0Qiw0Q0FBMEQ7QUFFMUQsbUVBQTJDO0FBQzNDLGlDQUF3QztBQUV4QyxnREFBK0Q7QUFDL0Qsb0RBQXdEO0FBRXhELDREQUFpRTtBQUVqRSxxQ0FBa0M7QUFFbEM7O0dBRUc7QUFFSCxNQUFhLFVBQVcsU0FBUSxzQkFBc0I7SUFDcEQsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixVQUFrQixFQUNsQixZQUFvQixFQUNwQixhQUF1QixFQUN2QixjQUFzQixFQUN0QixhQUFvQixFQUNwQixxQkFHQztRQUVELElBQUEsZ0JBQU0sRUFBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckMsSUFBQSxnQkFBTSxFQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRWhELE1BQU0sV0FBVyxHQUFHLHFCQUFxQjtZQUN2QyxDQUFDLENBQUMsTUFBTSxJQUFBLGlCQUFPLEVBQUM7Z0JBQ1osVUFBVSxFQUFFLElBQUEsbUNBQW9CLEVBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7YUFDdkcsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBQSxnQ0FBaUIsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFaEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxF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TCxJQUFJLEVBQUUsOEJBQWtCLENBQUMsSUFBSTtZQUM3QixFQUFFLEVBQUUsOEJBQWtCLENBQUMsS0FBSztZQUM1QixLQUFLLEVBQUUsZUFBZTtZQUN0QixJQUFJLEVBQUUsb0NBQXdCLENBQUMsaUJBQWlCO1NBQ2pELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFsd0JELGdDQWt3QkM7QUFDRDs7R0FFRztBQUNVLFFBQUEsUUFBUSxHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgRWRkc2EsIHsgR1NoYXJlLCBTaWduU2hhcmUgfSBmcm9tICcuLi8uLi8uLi8uLi9hY2NvdW50LWxpYi9tcGMvdHNzJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgQ3JlYXRlQmFja3VwT3B0aW9ucywgS2V5Y2hhaW4sIFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8gfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyB2ZXJpZnlXYWxsZXRTaWduYXR1cmUgfSBmcm9tICcuLi8uLi8uLi90c3MvZWRkc2EvZWRkc2EnO1xuaW1wb3J0IHsgY3JlYXRlU2hhcmVQcm9vZiwgZW5jcnlwdFRleHQsIGdlbmVyYXRlR1BHS2V5UGFpciwgZ2V0Qml0Z29HcGdQdWJLZXkgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVXNlclNpZ25TaGFyZSxcbiAgY3JlYXRlVXNlclRvQml0R29HU2hhcmUsXG4gIGdldEJpdGdvVG9Vc2VyUlNoYXJlLFxuICBnZXRUeFJlcXVlc3QsXG4gIG9mZmVyVXNlclRvQml0Z29SU2hhcmUsXG4gIHNlbmRVc2VyVG9CaXRnb0dTaGFyZSxcbiAgU2hhcmVLZXlQb3NpdGlvbixcbiAgU2lnbmluZ01hdGVyaWFsLFxufSBmcm9tICcuLi8uLi8uLi90c3MnO1xuaW1wb3J0IHtcbiAgQ29tbWl0bWVudFNoYXJlUmVjb3JkLFxuICBDb21taXRtZW50VHlwZSxcbiAgQ3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkLFxuICBFbmNyeXB0ZWRTaWduZXJTaGFyZVR5cGUsXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVTaGFyZVJlY29yZCxcbiAgU2lnbmF0dXJlU2hhcmVUeXBlLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgVFNTUGFyYW1zV2l0aFBydixcbiAgVHNzU2lnblR4UmVxdWVzdFBhcmFtc1dpdGhQcnYsXG4gIFRzc1R4UmVjaXBpZW50U291cmNlLFxuICBUeFJlcXVlc3QsXG4gIFVuc2lnbmVkVHJhbnNhY3Rpb25Uc3MsXG4gIGlzVjJFbnZlbG9wZSxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IEludmFsaWRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IENyZWF0ZUVkZHNhQml0R29LZXljaGFpblBhcmFtcywgQ3JlYXRlRWRkc2FLZXljaGFpblBhcmFtcywgS2V5U2hhcmUsIFlTaGFyZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IGJhc2VUU1NVdGlscyBmcm9tICcuLi9iYXNlVFNTVXRpbHMnO1xuaW1wb3J0IHsgQmFzZUVkZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IGV4Y2hhbmdlRWRkc2FDb21taXRtZW50cyB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgRWQyNTUxOUJpcDMySGRUcmVlIH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uLCBJUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uLy4uLy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBnZXRCaXRnb01wY0dwZ1B1YktleSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9iaXRnb1B1YktleXMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnROYW1lIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzJztcbmltcG9ydCB7IHJlYWRLZXkgfSBmcm9tICdvcGVucGdwJztcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgVFNTIHdvcmsgZmxvd3MuXG4gKi9cblxuZXhwb3J0IGNsYXNzIEVkZHNhVXRpbHMgZXh0ZW5kcyBiYXNlVFNTVXRpbHM8S2V5U2hhcmU+IHtcbiAgYXN5bmMgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlcyhcbiAgICB1c2VyR3BnUHViOiBzdHJpbmcsXG4gICAgYmFja3VwR3BnUHViOiBzdHJpbmcsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgZGVjcnlwdGVkU2hhcmU6IHN0cmluZyxcbiAgICB2ZXJpZmllckluZGV4OiAxIHwgMixcbiAgICB1c2VIYXJkY29kZWRCaXRHb0tleXM/OiB7XG4gICAgICBlbnY6IEVudmlyb25tZW50TmFtZTtcbiAgICAgIHB1YktleVR5cGU6ICduaXRybycgfCAnb25wcmVtJztcbiAgICB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKTtcbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi53YWxsZXRIU01HUEdQdWJsaWNLZXlTaWdzKTtcblxuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gdXNlSGFyZGNvZGVkQml0R29LZXlzXG4gICAgICA/IGF3YWl0IHJlYWRLZXkoe1xuICAgICAgICAgIGFybW9yZWRLZXk6IGdldEJpdGdvTXBjR3BnUHViS2V5KHVzZUhhcmRjb2RlZEJpdEdvS2V5cy5lbnYsIHVzZUhhcmRjb2RlZEJpdEdvS2V5cy5wdWJLZXlUeXBlLCAnbXBjdjEnKSxcbiAgICAgICAgfSlcbiAgICAgIDogKGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pKS5tcGNWMTtcblxuICAgIGNvbnN0IHVzZXJLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnUHViIH0pO1xuICAgIGNvbnN0IHVzZXJLZXlJZCA9IHVzZXJLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG5cbiAgICBjb25zdCBiYWNrdXBLZXlQdWIgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiYWNrdXBHcGdQdWIgfSk7XG4gICAgY29uc3QgYmFja3VwS2V5SWQgPSBiYWNrdXBLZXlQdWIua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCk7XG5cbiAgICBjb25zdCB3YWxsZXRTaWduYXR1cmVzID0gYXdhaXQgb3BlbnBncC5yZWFkS2V5cyh7IGFybW9yZWRLZXlzOiBiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MgfSk7XG4gICAgaWYgKHdhbGxldFNpZ25hdHVyZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgd2FsbGV0IHNpZ25hdHVyZXMnKTtcbiAgICB9XG5cbiAgICBpZiAodXNlcktleUlkICE9PSB3YWxsZXRTaWduYXR1cmVzWzBdLmtleVBhY2tldC5nZXRGaW5nZXJwcmludCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGZpcnN0IHdhbGxldCBzaWduYXR1cmUncyBmaW5nZXJwcmludCBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgdXNlciBncGcga2V5J3MgZmluZ2VycHJpbnRgKTtcbiAgICB9XG5cbiAgICBpZiAoYmFja3VwS2V5SWQgIT09IHdhbGxldFNpZ25hdHVyZXNbMV0ua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgc2Vjb25kIHdhbGxldCBzaWduYXR1cmUncyBmaW5nZXJwcmludCBkb2VzIG5vdCBtYXRjaCBwYXNzZWQgYmFja3VwIGdwZyBrZXkncyBmaW5nZXJwcmludGApO1xuICAgIH1cblxuICAgIGF3YWl0IHZlcmlmeVdhbGxldFNpZ25hdHVyZSh7XG4gICAgICB3YWxsZXRTaWduYXR1cmU6IHdhbGxldFNpZ25hdHVyZXNbMF0sXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHVzZXJLZXlJZCxcbiAgICAgIGJhY2t1cEtleUlkLFxuICAgICAgYml0Z29QdWI6IGJpdGdvR3BnS2V5LFxuICAgICAgZGVjcnlwdGVkU2hhcmUsXG4gICAgICB2ZXJpZmllckluZGV4LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1sxXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEtleWNoYWluIGNvbnRhaW5pbmcgdGhlIFVzZXIncyBUU1Mgc2lnbmluZyBtYXRlcmlhbHMuXG4gICAqIFdlIG5lZWQgdG8gaGF2ZSB0aGUgcGFzc3BocmFzZSBiZSBvcHRpb25hbCB0byBhbGxvdyBmb3IgdGhlIGNsaWVudCB0byBzdG9yZSB0aGVpciBiYWNrdXAga2V5IG9uIHRoZWlyIHByZW1pc2VzXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyR3BnS2V5IC0gZXBoZW1lcmFsIEdQRyBrZXkgdG8gZW5jcnlwdCAvIGRlY3J5cHQgc2Vuc2l0dmUgZGF0YSBleGNoYW5nZWQgYmV0d2VlbiB1c2VyIGFuZCBzZXJ2ZXJcbiAgICogQHBhcmFtIHVzZXJLZXlTaGFyZSAtIHVzZXIncyBUU1Mga2V5IHNoYXJlXG4gICAqIEBwYXJhbSBiYWNrdXBLZXlTaGFyZSAtIGJhY2t1cCdzIFRTUyBrZXkgc2hhcmVcbiAgICogQHBhcmFtIGJpdGdvS2V5Y2hhaW4gLSBwcmV2aW91c2x5IGNyZWF0ZWQgQml0R28ga2V5Y2hhaW47IG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHVzZXIgYW5kIGJhY2t1cCBrZXkgc2hhcmVzXG4gICAqIEBwYXJhbSBbcGFzc3BocmFzZV0gLSBvcHRpb25hbCB3YWxsZXQgcGFzc3BocmFzZSB1c2VkIHRvIGVuY3J5cHQgdXNlcidzIHNpZ25pbmcgbWF0ZXJpYWxzXG4gICAqIEBwYXJhbSBbb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXSAtIG9wdGlvbmFsIGVuY3J5cHRpb24gY29kZSBuZWVkZWQgZm9yIHdhbGxldCBwYXNzd29yZCByZXNldCBmb3IgaG90IHdhbGxldHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVVzZXJLZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZSxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgd2ViYXV0aG5JbmZvLFxuICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgIGVudGVycHJpc2UsXG4gIH06IENyZWF0ZUVkZHNhS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgRWRkc2EuaW5pdGlhbGl6ZSgpO1xuICAgIGNvbnN0IGJpdGdvS2V5U2hhcmVzID0gYml0Z29LZXljaGFpbi5rZXlTaGFyZXM7XG4gICAgaWYgKCFiaXRnb0tleVNoYXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIGtleSBzaGFyZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvVXNlclNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZCgoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiaXRnbycgJiYga2V5U2hhcmUudG8gPT09ICd1c2VyJyk7XG4gICAgaWYgKCFiaXRHb1RvVXNlclNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gdG8gVXNlciBrZXkgc2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvVXNlclByaXZhdGVTaGFyZSA9IGF3YWl0IHRoaXMuZGVjcnlwdFByaXZhdGVTaGFyZShiaXRHb1RvVXNlclNoYXJlLnByaXZhdGVTaGFyZSwgdXNlckdwZ0tleSk7XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVdhbGxldFNpZ25hdHVyZXMoXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgYml0R29Ub1VzZXJQcml2YXRlU2hhcmUsXG4gICAgICAxXG4gICAgKTtcblxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyOiBZU2hhcmUgPSB7XG4gICAgICBpOiAxLFxuICAgICAgajogMyxcbiAgICAgIHk6IGJpdEdvVG9Vc2VyU2hhcmUucHVibGljU2hhcmUuc2xpY2UoMCwgNjQpLFxuICAgICAgdjogYml0R29Ub1VzZXJTaGFyZS52c3NQcm9vZixcbiAgICAgIHU6IGJpdEdvVG9Vc2VyUHJpdmF0ZVNoYXJlLnNsaWNlKDAsIDY0KSxcbiAgICAgIGNoYWluY29kZTogYml0R29Ub1VzZXJQcml2YXRlU2hhcmUuc2xpY2UoNjQpLFxuICAgIH07XG5cbiAgICBjb25zdCBiaXRHb1RvQmFja3VwU2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ2JhY2t1cCcpO1xuICAgIGlmIChiaXRHb1RvQmFja3VwU2hhcmUpIHtcbiAgICAgIGFzc2VydChiaXRHb1RvQmFja3VwU2hhcmUudnNzUHJvb2YgPT09IGJpdEdvVG9Vc2VyU2hhcmUudnNzUHJvb2YsICdWU1MgcHJvb2ZzIHRvIHVzZXIgYW5kIGJhY2t1cCBkbyBub3QgbWF0Y2gnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKEJHLTQ3MTcwKTogdXNlIHRzcy5jcmVhdGVDb21iaW5lZEtleSBoZWxwZXIgd2hlbiBzaWduYXR1cmVzIGFyZSBzdXBwb3J0ZWRcbiAgICBjb25zdCB1c2VyQ29tYmluZWQgPSBNUEMua2V5Q29tYmluZSh1c2VyS2V5U2hhcmUudVNoYXJlLCBbYmFja3VwS2V5U2hhcmUueVNoYXJlc1sxXSwgYml0Z29Ub1VzZXJdKTtcbiAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IHVzZXJDb21iaW5lZC5wU2hhcmUueSArIHVzZXJDb21iaW5lZC5wU2hhcmUuY2hhaW5jb2RlO1xuICAgIGlmIChjb21tb25LZXljaGFpbiAhPT0gYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHVzZXIga2V5Y2hhaW4gLSBjb21tb25LZXljaGFpbnMgZG8gbm90IG1hdGNoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWw6IFNpZ25pbmdNYXRlcmlhbCA9IHtcbiAgICAgIHVTaGFyZTogdXNlcktleVNoYXJlLnVTaGFyZSxcbiAgICAgIGJpdGdvWVNoYXJlOiBiaXRnb1RvVXNlcixcbiAgICAgIGJhY2t1cFlTaGFyZTogYmFja3VwS2V5U2hhcmUueVNoYXJlc1sxXSxcbiAgICB9O1xuXG4gICAgY29uc3QgdXNlcktleWNoYWluUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcbiAgICBpZiAocGFzc3BocmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZW5jcnlwdGlvblNlc3Npb24pIHtcbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zLmVuY3J5cHRlZFBydiA9IGF3YWl0IGVuY3J5cHRpb25TZXNzaW9uLmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkodXNlclNpZ25pbmdNYXRlcmlhbCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zLmVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkodXNlclNpZ25pbmdNYXRlcmlhbCksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2ViYXV0aG5JbmZvICYmIHVzZXJLZXljaGFpblBhcmFtcy5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIC8vIFNlbmQgdGhlIHBhc3NrZXkgYXMgYHdlYmF1dGhuSW5mb2A7IHRoZSBkZXByZWNhdGVkIGB3ZWJhdXRobkRldmljZXNgIGFycmF5IGlzIGlnbm9yZWQgYnkgUE9TVCAva2V5LlxuICAgICAgYXNzZXJ0KGVudGVycHJpc2UsICdlbnRlcnByaXNlIGlzIHJlcXVpcmVkIHRvIGF0dGFjaCBhIHdlYmF1dGhuIGRldmljZSB0byB0aGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgdXNlcktleWNoYWluUGFyYW1zLndlYmF1dGhuSW5mbyA9IHtcbiAgICAgICAgb3RwRGV2aWNlSWQ6IHdlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgcHJmU2FsdDogd2ViYXV0aG5JbmZvLnByZlNhbHQsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICAgIGlucHV0OiBKU09OLnN0cmluZ2lmeSh1c2VyU2lnbmluZ01hdGVyaWFsKSxcbiAgICAgICAgICBwYXNzd29yZDogd2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICBlbnRlcnByaXNlSWQ6IGVudGVycHJpc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBLZXljaGFpbiBjb250YWluaW5nIHRoZSBCYWNrdXAgcGFydHkncyBUU1Mgc2lnbmluZyBtYXRlcmlhbHMuXG4gICAqIFdlIG5lZWQgdG8gaGF2ZSB0aGUgcGFzc3BocmFzZSBiZSBvcHRpb25hbCB0byBhbGxvdyBmb3IgdGhlIGNsaWVudCB0byBzdG9yZSB0aGVpciBiYWNrdXAga2V5IG9uIHRoZWlyIHByZW1pc2VzXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyR3BnS2V5IC0gZXBoZW1lcmFsIEdQRyBrZXkgdG8gZW5jcnlwdCAvIGRlY3J5cHQgc2Vuc2l0dmUgZGF0YSBleGNoYW5nZWQgYmV0d2VlbiB1c2VyIGFuZCBzZXJ2ZXJcbiAgICogQHBhcmFtIHVzZXJLZXlTaGFyZSAtIFVzZXIncyBUU1MgS2V5c2hhcmVcbiAgICogQHBhcmFtIGJhY2t1cEdwZ0tleSAtIGVwaGVtZXJhbCBHUEcga2V5IHRvIGVuY3J5cHQgLyBkZWNyeXB0IHNlbnNpdHZlIGRhdGEgZXhjaGFuZ2VkIGJldHdlZW4gYmFja3VwIGFuZCBzZXJ2ZXJcbiAgICogQHBhcmFtIGJhY2t1cEtleVNoYXJlIC0gQmFja3VwJ3MgVFNTIEtleXNoYXJlXG4gICAqIEBwYXJhbSBiaXRnb0tleWNoYWluIC0gcHJldmlvdXNseSBjcmVhdGVkIEJpdEdvIGtleWNoYWluOyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB1c2VyIGFuZCBiYWNrdXAga2V5IHNoYXJlc1xuICAgKiBAcGFyYW0gW3Bhc3NwaHJhc2VdIC0gb3B0aW9uYWwgd2FsbGV0IHBhc3NwaHJhc2UgdXNlZCB0byBlbmNyeXB0IHVzZXIncyBzaWduaW5nIG1hdGVyaWFsc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQmFja3VwS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluLFxuICAgIHBhc3NwaHJhc2UsXG4gICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgZW5jcnlwdGlvblZlcnNpb24sXG4gIH06IENyZWF0ZUVkZHNhS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgRWRkc2EuaW5pdGlhbGl6ZSgpO1xuICAgIGNvbnN0IGJpdGdvS2V5U2hhcmVzID0gYml0Z29LZXljaGFpbi5rZXlTaGFyZXM7XG4gICAgaWYgKCFiaXRnb0tleVNoYXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJpdGdvIGtleXNoYXJlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdEdvVG9CYWNrdXBTaGFyZSA9IGJpdGdvS2V5U2hhcmVzLmZpbmQoKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSAnYmFja3VwJyk7XG4gICAgaWYgKCFiaXRHb1RvQmFja3VwU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyB0byBVc2VyIGtleSBzaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdEdvVG9CYWNrdXBQcml2YXRlU2hhcmUgPSBhd2FpdCB0aGlzLmRlY3J5cHRQcml2YXRlU2hhcmUoYml0R29Ub0JhY2t1cFNoYXJlLnByaXZhdGVTaGFyZSwgYmFja3VwR3BnS2V5KTtcblxuICAgIGF3YWl0IHRoaXMudmVyaWZ5V2FsbGV0U2lnbmF0dXJlcyhcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBiaXRHb1RvQmFja3VwUHJpdmF0ZVNoYXJlLFxuICAgICAgMlxuICAgICk7XG5cbiAgICBjb25zdCBiaXRnb1RvQmFja3VwOiBZU2hhcmUgPSB7XG4gICAgICBpOiAyLFxuICAgICAgajogMyxcbiAgICAgIHk6IGJpdEdvVG9CYWNrdXBTaGFyZS5wdWJsaWNTaGFyZS5zbGljZSgwLCA2NCksXG4gICAgICB2OiBiaXRHb1RvQmFja3VwU2hhcmUudnNzUHJvb2YsXG4gICAgICB1OiBiaXRHb1RvQmFja3VwUHJpdmF0ZVNoYXJlLnNsaWNlKDAsIDY0KSxcbiAgICAgIGNoYWluY29kZTogYml0R29Ub0JhY2t1cFByaXZhdGVTaGFyZS5zbGljZSg2NCksXG4gICAgfTtcblxuICAgIGNvbnN0IGJpdEdvVG9Vc2VyU2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ3VzZXInKTtcbiAgICBpZiAoYml0R29Ub1VzZXJTaGFyZSkge1xuICAgICAgYXNzZXJ0KGJpdEdvVG9Vc2VyU2hhcmUudnNzUHJvb2YgPT09IGJpdEdvVG9CYWNrdXBTaGFyZS52c3NQcm9vZiwgJ1ZTUyBwcm9vZnMgdG8gdXNlciBhbmQgYmFja3VwIGRvIG5vdCBtYXRjaCcpO1xuICAgIH1cblxuICAgIC8vIFRPRE8oQkctNDcxNzApOiB1c2UgdHNzLmNyZWF0ZUNvbWJpbmVkS2V5IGhlbHBlciB3aGVuIHNpZ25hdHVyZXMgYXJlIHN1cHBvcnRlZFxuICAgIGNvbnN0IGJhY2t1cENvbWJpbmVkID0gTVBDLmtleUNvbWJpbmUoYmFja3VwS2V5U2hhcmUudVNoYXJlLCBbdXNlcktleVNoYXJlLnlTaGFyZXNbMl0sIGJpdGdvVG9CYWNrdXBdKTtcbiAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IGJhY2t1cENvbWJpbmVkLnBTaGFyZS55ICsgYmFja3VwQ29tYmluZWQucFNoYXJlLmNoYWluY29kZTtcbiAgICBpZiAoY29tbW9uS2V5Y2hhaW4gIT09IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBiYWNrdXAga2V5Y2hhaW4gLSBjb21tb25LZXljaGFpbnMgZG8gbm90IG1hdGNoLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2t1cFNpZ25pbmdNYXRlcmlhbDogU2lnbmluZ01hdGVyaWFsID0ge1xuICAgICAgdVNoYXJlOiBiYWNrdXBLZXlTaGFyZS51U2hhcmUsXG4gICAgICBiaXRnb1lTaGFyZTogYml0Z29Ub0JhY2t1cCxcbiAgICAgIHVzZXJZU2hhcmU6IHVzZXJLZXlTaGFyZS55U2hhcmVzWzJdLFxuICAgIH07XG4gICAgY29uc3QgcHJ2ID0gSlNPTi5zdHJpbmdpZnkoYmFja3VwU2lnbmluZ01hdGVyaWFsKTtcblxuICAgIGNvbnN0IHBhcmFtczogQ3JlYXRlQmFja3VwT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgfTtcblxuICAgIGlmIChwYXNzcGhyYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbmNyeXB0aW9uU2Vzc2lvbikge1xuICAgICAgICBwYXJhbXMuZW5jcnlwdGVkUHJ2ID0gYXdhaXQgZW5jcnlwdGlvblNlc3Npb24uZW5jcnlwdChwcnYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zLmVuY3J5cHRlZFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHsgaW5wdXQ6IHBydiwgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsIGVuY3J5cHRpb25WZXJzaW9uIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJhY2t1cChwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBLZXljaGFpbiBjb250YWluaW5nIEJpdEdvJ3MgVFNTIHNpZ25pbmcgbWF0ZXJpYWxzLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckdwZ0tleSAtIGVwaGVtZXJhbCBHUEcga2V5IHRvIGVuY3J5cHQgLyBkZWNyeXB0IHNlbnNpdHZlIGRhdGEgZXhjaGFuZ2VkIGJldHdlZW4gdXNlciBhbmQgc2VydmVyXG4gICAqIEBwYXJhbSB1c2VyS2V5U2hhcmUgLSB1c2VyJ3MgVFNTIGtleSBzaGFyZVxuICAgKiBAcGFyYW0gYmFja3VwS2V5U2hhcmUgLSBiYWNrdXAncyBUU1Mga2V5IHNoYXJlXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlIC0gZW50ZXJwcmlzZSBhc3NvY2lhdGVkIHRvIHRoZSB3YWxsZXRcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJpdGdvS2V5Y2hhaW4oe1xuICAgIHVzZXJHcGdLZXksXG4gICAgYmFja3VwR3BnS2V5LFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBlbnRlcnByaXNlLFxuICB9OiBDcmVhdGVFZGRzYUJpdEdvS2V5Y2hhaW5QYXJhbXMpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgLy8gVE9ETyhCRy00NzE3MCk6IHVzZSB0c3MuZW5jcnlwdFlTaGFyZSBoZWxwZXIgd2hlbiBzaWduYXR1cmVzIGFyZSBzdXBwb3J0ZWRcbiAgICBjb25zdCB1c2VyVG9CaXRnb1B1YmxpY1NoYXJlID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICBCdWZmZXIuZnJvbSh1c2VyS2V5U2hhcmUudVNoYXJlLnksICdoZXgnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJLZXlTaGFyZS51U2hhcmUuY2hhaW5jb2RlLCAnaGV4JyksXG4gICAgXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHVzZXJUb0JpdGdvUHJpdmF0ZVNoYXJlID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICBCdWZmZXIuZnJvbSh1c2VyS2V5U2hhcmUueVNoYXJlc1szXS51LCAnaGV4JyksXG4gICAgICBCdWZmZXIuZnJvbSh1c2VyS2V5U2hhcmUueVNoYXJlc1szXS5jaGFpbmNvZGUsICdoZXgnKSxcbiAgICBdKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdXNlclRvQml0Z29LZXlTaGFyZSA9IHtcbiAgICAgIHB1YmxpY1NoYXJlOiB1c2VyVG9CaXRnb1B1YmxpY1NoYXJlLFxuICAgICAgcHJpdmF0ZVNoYXJlOiB1c2VyVG9CaXRnb1ByaXZhdGVTaGFyZSxcbiAgICAgIHByaXZhdGVTaGFyZVByb29mOiBhd2FpdCBjcmVhdGVTaGFyZVByb29mKHVzZXJHcGdLZXkucHJpdmF0ZUtleSwgdXNlclRvQml0Z29Qcml2YXRlU2hhcmUuc2xpY2UoMCwgNjQpLCAnZWRkc2EnKSxcbiAgICAgIHZzc1Byb29mOiB1c2VyS2V5U2hhcmUueVNoYXJlc1szXS52LFxuICAgIH07XG5cbiAgICBjb25zdCBiYWNrdXBUb0JpdGdvUHVibGljU2hhcmUgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIEJ1ZmZlci5mcm9tKGJhY2t1cEtleVNoYXJlLnVTaGFyZS55LCAnaGV4JyksXG4gICAgICBCdWZmZXIuZnJvbShiYWNrdXBLZXlTaGFyZS51U2hhcmUuY2hhaW5jb2RlLCAnaGV4JyksXG4gICAgXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29Qcml2YXRlU2hhcmUgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIEJ1ZmZlci5mcm9tKGJhY2t1cEtleVNoYXJlLnlTaGFyZXNbM10udSwgJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20oYmFja3VwS2V5U2hhcmUueVNoYXJlc1szXS5jaGFpbmNvZGUsICdoZXgnKSxcbiAgICBdKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgYmFja3VwVG9CaXRnb0tleVNoYXJlID0ge1xuICAgICAgcHVibGljU2hhcmU6IGJhY2t1cFRvQml0Z29QdWJsaWNTaGFyZSxcbiAgICAgIHByaXZhdGVTaGFyZTogYmFja3VwVG9CaXRnb1ByaXZhdGVTaGFyZSxcbiAgICAgIHByaXZhdGVTaGFyZVByb29mOiBhd2FpdCBjcmVhdGVTaGFyZVByb29mKFxuICAgICAgICBiYWNrdXBHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgYmFja3VwVG9CaXRnb1ByaXZhdGVTaGFyZS5zbGljZSgwLCA2NCksXG4gICAgICAgICdlZGRzYSdcbiAgICAgICksXG4gICAgICB2c3NQcm9vZjogYmFja3VwS2V5U2hhcmUueVNoYXJlc1szXS52LFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVCaXRnb0tleWNoYWluSW5XUChcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICBiYWNrdXBHcGdLZXksXG4gICAgICB1c2VyVG9CaXRnb0tleVNoYXJlLFxuICAgICAgYmFja3VwVG9CaXRnb0tleVNoYXJlLFxuICAgICAgJ3RzcycsXG4gICAgICBlbnRlcnByaXNlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIFVzZXIsIEJhY2t1cCwgYW5kIEJpdEdvIFRTUyBLZXljaGFpbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMucGFzc3BocmFzZSAtIHBhc3NwaHJhc2UgdXNlZCB0byBlbmNyeXB0IHNpZ25pbmcgbWF0ZXJpYWxzIGNyZWF0ZWQgZm9yIFVzZXIgYW5kIEJhY2t1cFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZT86IHN0cmluZztcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmc7XG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbztcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uO1xuICB9KTogUHJvbWlzZTxLZXljaGFpbnNUcmlwbGV0PiB7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgRWRkc2EuaW5pdGlhbGl6ZSgpO1xuICAgIGNvbnN0IG0gPSAyO1xuICAgIGNvbnN0IG4gPSAzO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gTVBDLmtleVNoYXJlKDEsIG0sIG4pO1xuICAgIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gTVBDLmtleVNoYXJlKDIsIG0sIG4pO1xuXG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG4gICAgY29uc3QgYmFja3VwR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcblxuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmNyZWF0ZUJpdGdvS2V5Y2hhaW4oe1xuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uU2Vzc2lvbiA9XG4gICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24gPT09IDIgJiYgcGFyYW1zLnBhc3NwaHJhc2VcbiAgICAgICAgPyBhd2FpdCB0aGlzLmJpdGdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHBhcmFtcy5wYXNzcGhyYXNlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuY3JlYXRlVXNlcktleWNoYWluKHtcbiAgICAgICAgdXNlckdwZ0tleSxcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiYWNrdXBHcGdLZXksXG4gICAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICB3ZWJhdXRobkluZm86IHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVCYWNrdXBLZXljaGFpbih7XG4gICAgICAgIHVzZXJHcGdLZXksXG4gICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgICAgcGFzc3BocmFzZTogcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluUHJvbWlzZSwgYmFja3VwS2V5Y2hhaW5Qcm9taXNlXSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbmNyeXB0aW9uU2Vzc2lvbj8uZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNvbW1pdG1lbnRTaGFyZUZyb21UeFJlcXVlc3QocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvR3BnUHViS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgdXNlclRvQml0Z29Db21taXRtZW50OiBDb21taXRtZW50U2hhcmVSZWNvcmQ7XG4gICAgZW5jcnlwdGVkU2lnbmVyU2hhcmU6IEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkO1xuICAgIGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlOiBFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZDtcbiAgfT4ge1xuICAgIGNvbnN0IGJpdGdvSW5kZXggPSBTaGFyZUtleVBvc2l0aW9uLkJJVEdPO1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0LCBwcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0ID0gdHhSZXF1ZXN0O1xuXG4gICAgY29uc3QgaGRUcmVlID0gYXdhaXQgRWQyNTUxOUJpcDMySGRUcmVlLmluaXRpYWxpemUoKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFZGRzYS5pbml0aWFsaXplKGhkVHJlZSk7XG5cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBydik7XG4gICAgaWYgKCF1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cFlTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5IC0gbWlzc2luZyBiYWNrdXBZU2hhcmUnKTtcbiAgICB9XG5cbiAgICBhc3NlcnQodHhSZXF1ZXN0UmVzb2x2ZWQudHJhbnNhY3Rpb25zIHx8IHR4UmVxdWVzdFJlc29sdmVkLnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnXG4gICAgICAgID8gdHhSZXF1ZXN0UmVzb2x2ZWQudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4XG4gICAgICAgIDogdHhSZXF1ZXN0UmVzb2x2ZWQudW5zaWduZWRUeHNbMF07XG5cbiAgICBjb25zdCBzaWduaW5nS2V5ID0gTVBDLmtleURlcml2ZShcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwudVNoYXJlLFxuICAgICAgW3VzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29ZU2hhcmUsIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwWVNoYXJlXSxcbiAgICAgIHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odW5zaWduZWRUeC5zaWduYWJsZUhleCwgJ2hleCcpO1xuXG4gICAgY29uc3QgdXNlclNpZ25TaGFyZSA9IGF3YWl0IGNyZWF0ZVVzZXJTaWduU2hhcmUoc2lnbmFibGVQYXlsb2FkLCBzaWduaW5nS2V5LnBTaGFyZSk7XG4gICAgY29uc3QgY29tbWl0bWVudCA9IHVzZXJTaWduU2hhcmUuclNoYXJlc1tiaXRnb0luZGV4XT8uY29tbWl0bWVudDtcbiAgICBhc3NlcnQoY29tbWl0bWVudCwgJ1VuYWJsZSB0byBmaW5kIGNvbW1pdG1lbnQgaW4gdXNlclNpZ25TaGFyZScpO1xuICAgIGNvbnN0IHVzZXJUb0JpdGdvQ29tbWl0bWVudCA9IHRoaXMuY3JlYXRlVXNlclRvQml0Z29Db21taXRtZW50U2hhcmUoY29tbWl0bWVudCk7XG5cbiAgICBjb25zdCBzaWduZXJTaGFyZSA9IHNpZ25pbmdLZXkueVNoYXJlc1tiaXRnb0luZGV4XS51ICsgc2lnbmluZ0tleS55U2hhcmVzW2JpdGdvSW5kZXhdLmNoYWluY29kZTtcblxuICAgIGNvbnN0IHVzZXJUb0JpdGdvRW5jcnlwdGVkU2lnbmVyU2hhcmUgPSBhd2FpdCBlbmNyeXB0VGV4dChcbiAgICAgIHNpZ25lclNoYXJlLFxuICAgICAgYXdhaXQgb3BlbnBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcGFyYW1zLmJpdGdvR3BnUHViS2V5IH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gdGhpcy5jcmVhdGVVc2VyVG9CaXRnb0VuY3J5cHRlZFNpZ25lclNoYXJlKHVzZXJUb0JpdGdvRW5jcnlwdGVkU2lnbmVyU2hhcmUpO1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkUlNoYXJlID0gSlNPTi5zdHJpbmdpZnkodXNlclNpZ25TaGFyZSk7XG4gICAgbGV0IGVuY3J5cHRlZFJTaGFyZTogc3RyaW5nO1xuICAgIGlmIChwYXJhbXMuZW5jcnlwdGVkUHJ2ICYmIGlzVjJFbnZlbG9wZShwYXJhbXMuZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5jcnlwdGVkUlNoYXJlID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHN0cmluZ2lmaWVkUlNoYXJlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbmNyeXB0ZWRSU2hhcmUgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgIGlucHV0OiBzdHJpbmdpZmllZFJTaGFyZSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyVG9CaXRnb1JTaGFyZSA9IHRoaXMuY3JlYXRlVXNlclRvQml0Z29FbmNyeXB0ZWRSU2hhcmUoZW5jcnlwdGVkUlNoYXJlKTtcblxuICAgIHJldHVybiB7IHVzZXJUb0JpdGdvQ29tbWl0bWVudCwgZW5jcnlwdGVkU2lnbmVyU2hhcmUsIGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlIH07XG4gIH1cblxuICBhc3luYyBjcmVhdGVSU2hhcmVGcm9tVHhSZXF1ZXN0KHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyVG9CaXRnb1JTaGFyZTogRW5jcnlwdGVkU2lnbmVyU2hhcmVSZWNvcmQ7XG4gIH0pOiBQcm9taXNlPHsgclNoYXJlOiBTaWduU2hhcmUgfT4ge1xuICAgIGNvbnN0IHsgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlclRvQml0Z29SU2hhcmUgfSA9IHBhcmFtcztcblxuICAgIGxldCBkZWNyeXB0ZWRSU2hhcmU6IHN0cmluZztcbiAgICBpZiAoaXNWMkVudmVsb3BlKGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlLnNoYXJlKSkge1xuICAgICAgZGVjcnlwdGVkUlNoYXJlID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0QXN5bmMoe1xuICAgICAgICBpbnB1dDogZW5jcnlwdGVkVXNlclRvQml0Z29SU2hhcmUuc2hhcmUsXG4gICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY3J5cHRlZFJTaGFyZSA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIGlucHV0OiBlbmNyeXB0ZWRVc2VyVG9CaXRnb1JTaGFyZS5zaGFyZSxcbiAgICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgclNoYXJlID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSU2hhcmUpO1xuICAgIGFzc2VydChyU2hhcmUueFNoYXJlLCAnVW5hYmxlIHRvIGZpbmQgeFNoYXJlIGluIGRlY3J5cHRlZFJTaGFyZScpO1xuICAgIGFzc2VydChyU2hhcmUuclNoYXJlcywgJ1VuYWJsZSB0byBmaW5kIHJTaGFyZXMgaW4gZGVjcnlwdGVkUlNoYXJlJyk7XG5cbiAgICByZXR1cm4geyByU2hhcmUgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUdTaGFyZUZyb21UeFJlcXVlc3QocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBzdHJpbmcgfCBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgYml0Z29Ub1VzZXJSU2hhcmU6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIHVzZXJUb0JpdGdvUlNoYXJlOiBTaWduU2hhcmU7XG4gICAgYml0Z29Ub1VzZXJDb21taXRtZW50OiBDb21taXRtZW50U2hhcmVSZWNvcmQ7XG4gIH0pOiBQcm9taXNlPEdTaGFyZT4ge1xuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuXG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHBydiwgYml0Z29Ub1VzZXJDb21taXRtZW50LCBiaXRnb1RvVXNlclJTaGFyZSwgdXNlclRvQml0Z29SU2hhcmUgfSA9IHBhcmFtcztcblxuICAgIGlmICh0eXBlb2YgdHhSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbDogU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwcnYpO1xuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBZU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwWVNoYXJlJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0KHR4UmVxdWVzdFJlc29sdmVkLnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZFR4cywgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnKTtcbiAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLmFwaVZlcnNpb24gPT09ICdmdWxsJ1xuICAgICAgICA/IHR4UmVxdWVzdFJlc29sdmVkLnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeFxuICAgICAgICA6IHR4UmVxdWVzdFJlc29sdmVkLnVuc2lnbmVkVHhzWzBdO1xuXG4gICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odW5zaWduZWRUeC5zaWduYWJsZUhleCwgJ2hleCcpO1xuXG4gICAgY29uc3QgdXNlclRvQml0R29HU2hhcmUgPSBhd2FpdCBjcmVhdGVVc2VyVG9CaXRHb0dTaGFyZShcbiAgICAgIHVzZXJUb0JpdGdvUlNoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJSU2hhcmUsXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cFlTaGFyZSxcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29ZU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBiaXRnb1RvVXNlckNvbW1pdG1lbnRcbiAgICApO1xuICAgIHJldHVybiB1c2VyVG9CaXRHb0dTaGFyZTtcbiAgfVxuXG4gIGFzeW5jIHNpZ25FZGRzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgdHhSZXF1ZXN0OiBzdHJpbmcgfCBUeFJlcXVlc3QsXG4gICAgZXh0ZXJuYWxTaWduZXJDb21taXRtZW50R2VuZXJhdG9yOiBDdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyUlNoYXJlR2VuZXJhdG9yOiBDdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJHU2hhcmVHZW5lcmF0b3I6IEN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICByZXFJZD86IElSZXF1ZXN0VHJhY2VyXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdFJlc29sdmVkOiBUeFJlcXVlc3Q7XG4gICAgbGV0IHR4UmVxdWVzdElkOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QsIHJlcUlkKTtcbiAgICAgIHR4UmVxdWVzdElkID0gdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gdHhSZXF1ZXN0O1xuICAgICAgdHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhcGlWZXJzaW9uIH0gPSB0eFJlcXVlc3RSZXNvbHZlZDtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhmYWxzZSwgcmVxSWQsIHR4UmVxdWVzdFJlc29sdmVkLmVudGVycHJpc2VJZCk7XG5cbiAgICBjb25zdCB7IHVzZXJUb0JpdGdvQ29tbWl0bWVudCwgZW5jcnlwdGVkU2lnbmVyU2hhcmUsIGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlIH0gPVxuICAgICAgYXdhaXQgZXh0ZXJuYWxTaWduZXJDb21taXRtZW50R2VuZXJhdG9yKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RSZXNvbHZlZCwgYml0Z29HcGdQdWJLZXk6IGJpdGdvR3BnS2V5LmFybW9yKCkgfSk7XG5cbiAgICBjb25zdCB7IGNvbW1pdG1lbnRTaGFyZTogYml0Z29Ub1VzZXJDb21taXRtZW50IH0gPSBhd2FpdCBleGNoYW5nZUVkZHNhQ29tbWl0bWVudHMoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgdXNlclRvQml0Z29Db21taXRtZW50LFxuICAgICAgZW5jcnlwdGVkU2lnbmVyU2hhcmUsXG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgY29uc3QgeyByU2hhcmUgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyUlNoYXJlR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0UmVzb2x2ZWQsXG4gICAgICBlbmNyeXB0ZWRVc2VyVG9CaXRnb1JTaGFyZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IG9mZmVyVXNlclRvQml0Z29SU2hhcmUoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgclNoYXJlLFxuICAgICAgZW5jcnlwdGVkU2lnbmVyU2hhcmUuc2hhcmUsXG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcmVxSWRcbiAgICApO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUlNoYXJlID0gYXdhaXQgZ2V0Qml0Z29Ub1VzZXJSU2hhcmUodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQsIHJlcUlkKTtcbiAgICBjb25zdCBnU2lnblNoYXJlVHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdFJlc29sdmVkLFxuICAgICAgYml0Z29Ub1VzZXJSU2hhcmU6IGJpdGdvVG9Vc2VyUlNoYXJlLFxuICAgICAgdXNlclRvQml0Z29SU2hhcmU6IHJTaGFyZSxcbiAgICAgIGJpdGdvVG9Vc2VyQ29tbWl0bWVudCxcbiAgICB9O1xuICAgIGNvbnN0IGdTaGFyZSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyR1NoYXJlR2VuZXJhdG9yKGdTaWduU2hhcmVUcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgYXdhaXQgc2VuZFVzZXJUb0JpdGdvR1NoYXJlKHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdElkLCBnU2hhcmUsIGFwaVZlcnNpb24sIHJlcUlkKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdElkLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqXG4gICBAcGFyYW0gcGFyYW1zIC0gcGFyYW1ldGVycyBmb3Igc2lnbmluZyB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdChwYXJhbXM6IFRzc1NpZ25UeFJlcXVlc3RQYXJhbXNXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNpZ25SZXF1ZXN0QmFzZShcbiAgICBwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYgfCBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGVcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICBsZXQgdHhSZXF1ZXN0UmVzb2x2ZWQ6IFR4UmVxdWVzdDtcbiAgICBsZXQgdHhSZXF1ZXN0SWQ6IHN0cmluZztcblxuICAgIGNvbnN0IHsgdHhSZXF1ZXN0LCBwcnYgfSA9IHBhcmFtcztcblxuICAgIGlmIChcbiAgICAgICdyZWNpcGllbnRTb3VyY2UnIGluIHBhcmFtcyAmJlxuICAgICAgcGFyYW1zLnJlY2lwaWVudFNvdXJjZSA9PT0gVHNzVHhSZWNpcGllbnRTb3VyY2UuRXhwbGljaXQgJiZcbiAgICAgICFwYXJhbXMudHhQYXJhbXM/LnJlY2lwaWVudHM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAncmVjaXBpZW50U291cmNlIFwiZXhwbGljaXRcIiByZXF1aXJlcyB0eFBhcmFtcy5yZWNpcGllbnRzIHdpdGggYXQgbGVhc3Qgb25lIHJlY2lwaWVudC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHhSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpO1xuICAgICAgdHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgICB0eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCBoZFRyZWUgPSBhd2FpdCBFZDI1NTE5QmlwMzJIZFRyZWUuaW5pdGlhbGl6ZSgpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoaGRUcmVlKTtcblxuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWw6IFNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAoIXVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwWVNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBrZXkgLSBtaXNzaW5nIGJhY2t1cFlTaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXBpVmVyc2lvbiB9ID0gdHhSZXF1ZXN0UmVzb2x2ZWQ7XG4gICAgbGV0IHVuc2lnbmVkVHg6IFVuc2lnbmVkVHJhbnNhY3Rpb25Uc3M7XG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICB0eFJlcXVlc3RSZXNvbHZlZC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0UmVzb2x2ZWQudW5zaWduZWRUeHMsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICAgKTtcbiAgICAgIHVuc2lnbmVkVHggPVxuICAgICAgICBhcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3RSZXNvbHZlZC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZFR4c1swXTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0UmVzb2x2ZWQubWVzc2FnZXM/Lmxlbmd0aCwgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHR4UmVxdWVzdCBmb3IgbWVzc2FnZSBzaWduaW5nJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdHhSZXF1ZXN0UmVzb2x2ZWQubWVzc2FnZXNbMF07XG4gICAgICB1bnNpZ25lZFR4ID0ge1xuICAgICAgICBzaWduYWJsZUhleDogbWVzc2FnZS5tZXNzYWdlRW5jb2RlZCB8fCAnJyxcbiAgICAgICAgc2VyaWFsaXplZFR4SGV4OiBtZXNzYWdlLm1lc3NhZ2VCcm9hZGNhc3RhYmxlIHx8ICcnLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aDogbWVzc2FnZS5kZXJpdmF0aW9uUGF0aCB8fCAnbS8wJyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcmVxdWVzdCB0eXBlOiAke3JlcXVlc3RUeXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25pbmdLZXkgPSBNUEMua2V5RGVyaXZlKFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC51U2hhcmUsXG4gICAgICBbdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb1lTaGFyZSwgdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBZU2hhcmVdLFxuICAgICAgdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG5cbiAgICBjb25zdCB1c2VyU2lnblNoYXJlID0gYXdhaXQgY3JlYXRlVXNlclNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIHNpZ25pbmdLZXkucFNoYXJlKTtcblxuICAgIGNvbnN0IGJpdGdvSW5kZXggPSBTaGFyZUtleVBvc2l0aW9uLkJJVEdPO1xuICAgIGNvbnN0IHNpZ25lclNoYXJlID0gc2lnbmluZ0tleS55U2hhcmVzW2JpdGdvSW5kZXhdLnUgKyBzaWduaW5nS2V5LnlTaGFyZXNbYml0Z29JbmRleF0uY2hhaW5jb2RlO1xuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKGZhbHNlLCBwYXJhbXMucmVxSWQsIHR4UmVxdWVzdFJlc29sdmVkLmVudGVycHJpc2VJZCk7XG4gICAgY29uc3QgdXNlclRvQml0Z29FbmNyeXB0ZWRTaWduZXJTaGFyZSA9IGF3YWl0IGVuY3J5cHRUZXh0KHNpZ25lclNoYXJlLCBiaXRnb0dwZ0tleSk7XG5cbiAgICBjb25zdCB1c2VyVG9CaXRnb0NvbW1pdG1lbnQgPSB1c2VyU2lnblNoYXJlLnJTaGFyZXNbYml0Z29JbmRleF0uY29tbWl0bWVudDtcbiAgICBhc3NlcnQodXNlclRvQml0Z29Db21taXRtZW50LCAnTWlzc2luZyB1c2VyVG9CaXRnb0NvbW1pdG1lbnQgY29tbWl0bWVudCcpO1xuXG4gICAgY29uc3QgY29tbWl0bWVudFNoYXJlID0gdGhpcy5jcmVhdGVVc2VyVG9CaXRnb0NvbW1pdG1lbnRTaGFyZSh1c2VyVG9CaXRnb0NvbW1pdG1lbnQpO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gdGhpcy5jcmVhdGVVc2VyVG9CaXRnb0VuY3J5cHRlZFNpZ25lclNoYXJlKHVzZXJUb0JpdGdvRW5jcnlwdGVkU2lnbmVyU2hhcmUpO1xuXG4gICAgY29uc3QgeyBjb21taXRtZW50U2hhcmU6IGJpdGdvVG9Vc2VyQ29tbWl0bWVudCB9ID0gYXdhaXQgZXhjaGFuZ2VFZGRzYUNvbW1pdG1lbnRzKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIGNvbW1pdG1lbnRTaGFyZSxcbiAgICAgIGVuY3J5cHRlZFNpZ25lclNoYXJlLFxuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICBhd2FpdCBvZmZlclVzZXJUb0JpdGdvUlNoYXJlKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIHVzZXJTaWduU2hhcmUsXG4gICAgICB1c2VyVG9CaXRnb0VuY3J5cHRlZFNpZ25lclNoYXJlLFxuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBhcmFtcy5yZXFJZCxcbiAgICAgIHJlcXVlc3RUeXBlXG4gICAgKTtcblxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUlNoYXJlID0gYXdhaXQgZ2V0Qml0Z29Ub1VzZXJSU2hhcmUoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgcGFyYW1zLnJlcUlkLFxuICAgICAgcmVxdWVzdFR5cGVcbiAgICApO1xuXG4gICAgY29uc3QgdXNlclRvQml0R29HU2hhcmUgPSBhd2FpdCBjcmVhdGVVc2VyVG9CaXRHb0dTaGFyZShcbiAgICAgIHVzZXJTaWduU2hhcmUsXG4gICAgICBiaXRnb1RvVXNlclJTaGFyZSxcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwWVNoYXJlLFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb1lTaGFyZSxcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCxcbiAgICAgIGJpdGdvVG9Vc2VyQ29tbWl0bWVudFxuICAgICk7XG5cbiAgICBhd2FpdCBzZW5kVXNlclRvQml0Z29HU2hhcmUoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgdXNlclRvQml0R29HU2hhcmUsXG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGFyYW1zLnJlcUlkLFxuICAgICAgcmVxdWVzdFR5cGVcbiAgICApO1xuXG4gICAgcmV0dXJuIGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1vblB1YiBwb3J0aW9uIG9mIHRoZSBjb21tb25LZXljaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1vbktleWNoYWluXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGNvbW1vbktleWNoYWluOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBCYXNlRWRkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW4pO1xuICB9XG5cbiAgY3JlYXRlVXNlclRvQml0Z29Db21taXRtZW50U2hhcmUoY29tbWl0bWVudDogc3RyaW5nKTogQ29tbWl0bWVudFNoYXJlUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgc2hhcmU6IGNvbW1pdG1lbnQsXG4gICAgICB0eXBlOiBDb21taXRtZW50VHlwZS5DT01NSVRNRU5ULFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVVc2VyVG9CaXRnb0VuY3J5cHRlZFNpZ25lclNoYXJlKGVuY3J5cHRlZFNpZ25lclNoYXJlOiBzdHJpbmcpOiBFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgIHNoYXJlOiBlbmNyeXB0ZWRTaWduZXJTaGFyZSxcbiAgICAgIHR5cGU6IEVuY3J5cHRlZFNpZ25lclNoYXJlVHlwZS5FTkNSWVBURURfU0lHTkVSX1NIQVJFLFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVVc2VyVG9CaXRnb0VuY3J5cHRlZFJTaGFyZShlbmNyeXB0ZWRSU2hhcmU6IHN0cmluZyk6IEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgc2hhcmU6IGVuY3J5cHRlZFJTaGFyZSxcbiAgICAgIHR5cGU6IEVuY3J5cHRlZFNpZ25lclNoYXJlVHlwZS5FTkNSWVBURURfUl9TSEFSRSxcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIC0gdXNlIEVkZHNhVXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFRzc1V0aWxzID0gRWRkc2FVdGlscztcbiJdfQ==
622
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VkZHNhL2VkZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsb0RBQTRCO0FBQzVCLGlEQUFtQztBQUNuQywwRUFBMkU7QUFFM0Usb0RBQWlFO0FBQ2pFLHFEQUEwRztBQUMxRyxzQ0FTc0I7QUFDdEIsNENBa0JzQjtBQUN0Qiw0Q0FBMEQ7QUFFMUQsbUVBQTJDO0FBQzNDLGlDQUF3QztBQUV4QyxnREFBK0Q7QUFDL0Qsb0RBQXdEO0FBRXhELDREQUFvSDtBQUVwSCxxQ0FBa0M7QUFHbEM7O0dBRUc7QUFFSCxNQUFhLFVBQVcsU0FBUSxzQkFBc0I7SUFDcEQsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixVQUFrQixFQUNsQixZQUFvQixFQUNwQixhQUF1QixFQUN2QixjQUFzQixFQUN0QixhQUFvQixFQUNwQixxQkFHQztRQUVELElBQUEsZ0JBQU0sRUFBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckMsSUFBQSxnQkFBTSxFQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRWhELE1BQU0sV0FBVyxHQUFHLHFCQUFxQjtZQUN2QyxDQUFDLENBQUMsTUFBTSxJQUFBLGlCQUFPLEVBQUM7Z0JBQ1osVUFBVSxFQUFFLElBQUEsbUNBQW9CLEVBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7YUFDdkcsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBQSxnQ0FBaUIsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFaEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsVUFBVSxF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O1FBQ3RELE9BQU87WUFDTCxJQUFJLEVBQUUsOEJBQWtCLENBQUMsSUFBSTtZQUM3QixFQUFFLEVBQUUsOEJBQWtCLENBQUMsS0FBSztZQUM1QixLQUFLLEVBQUUsZUFBZTtZQUN0QixJQUFJLEVBQUUsb0NBQXdCLENBQUMsaUJBQWlCO1NBQ2pELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUExMEJELGdDQTAwQkM7QUFDRDs7R0FFRztBQUNVLFFBQUEsUUFBUSxHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIG9wZW5wZ3AgZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgRWRkc2EsIHsgR1NoYXJlLCBTaWduU2hhcmUgfSBmcm9tICcuLi8uLi8uLi8uLi9hY2NvdW50LWxpYi9tcGMvdHNzJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgQ3JlYXRlQmFja3VwT3B0aW9ucywgS2V5Y2hhaW4sIFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8gfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyB2ZXJpZnlXYWxsZXRTaWduYXR1cmUgfSBmcm9tICcuLi8uLi8uLi90c3MvZWRkc2EvZWRkc2EnO1xuaW1wb3J0IHsgY3JlYXRlU2hhcmVQcm9vZiwgZW5jcnlwdFRleHQsIGdlbmVyYXRlR1BHS2V5UGFpciwgZ2V0Qml0Z29HcGdQdWJLZXkgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlVXNlclNpZ25TaGFyZSxcbiAgY3JlYXRlVXNlclRvQml0R29HU2hhcmUsXG4gIGdldEJpdGdvVG9Vc2VyUlNoYXJlLFxuICBnZXRUeFJlcXVlc3QsXG4gIG9mZmVyVXNlclRvQml0Z29SU2hhcmUsXG4gIHNlbmRVc2VyVG9CaXRnb0dTaGFyZSxcbiAgU2hhcmVLZXlQb3NpdGlvbixcbiAgU2lnbmluZ01hdGVyaWFsLFxufSBmcm9tICcuLi8uLi8uLi90c3MnO1xuaW1wb3J0IHtcbiAgQ29tbWl0bWVudFNoYXJlUmVjb3JkLFxuICBDb21taXRtZW50VHlwZSxcbiAgQ3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkLFxuICBFbmNyeXB0ZWRTaWduZXJTaGFyZVR5cGUsXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVTaGFyZVJlY29yZCxcbiAgU2lnbmF0dXJlU2hhcmVUeXBlLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgVFNTUGFyYW1zV2l0aFBydixcbiAgVHNzU2lnblR4UmVxdWVzdFBhcmFtc1dpdGhQcnYsXG4gIFRzc1R4UmVjaXBpZW50U291cmNlLFxuICBUeFJlcXVlc3QsXG4gIFVuc2lnbmVkVHJhbnNhY3Rpb25Uc3MsXG4gIGlzVjJFbnZlbG9wZSxcbn0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IEludmFsaWRUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IENyZWF0ZUVkZHNhQml0R29LZXljaGFpblBhcmFtcywgQ3JlYXRlRWRkc2FLZXljaGFpblBhcmFtcywgS2V5U2hhcmUsIFlTaGFyZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IGJhc2VUU1NVdGlscyBmcm9tICcuLi9iYXNlVFNTVXRpbHMnO1xuaW1wb3J0IHsgQmFzZUVkZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IGV4Y2hhbmdlRWRkc2FDb21taXRtZW50cyB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgRWQyNTUxOUJpcDMySGRUcmVlIH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEVuY3J5cHRpb25WZXJzaW9uLCBJUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uLy4uLy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnLCBnZXRCaXRnb01wY0dwZ1B1YktleSwgaXNCaXRnb01wY1B1YktleSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9iaXRnb1B1YktleXMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnROYW1lIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzJztcbmltcG9ydCB7IHJlYWRLZXkgfSBmcm9tICdvcGVucGdwJztcbmltcG9ydCB0eXBlIHsgRWRkc2FLZXlHZW5DYWxsYmFja3MgfSBmcm9tICcuLi8uLi8uLi93YWxsZXQvaVdhbGxldHMnO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBUU1Mgd29yayBmbG93cy5cbiAqL1xuXG5leHBvcnQgY2xhc3MgRWRkc2FVdGlscyBleHRlbmRzIGJhc2VUU1NVdGlsczxLZXlTaGFyZT4ge1xuICBhc3luYyB2ZXJpZnlXYWxsZXRTaWduYXR1cmVzKFxuICAgIHVzZXJHcGdQdWI6IHN0cmluZyxcbiAgICBiYWNrdXBHcGdQdWI6IHN0cmluZyxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBkZWNyeXB0ZWRTaGFyZTogc3RyaW5nLFxuICAgIHZlcmlmaWVySW5kZXg6IDEgfCAyLFxuICAgIHVzZUhhcmRjb2RlZEJpdEdvS2V5cz86IHtcbiAgICAgIGVudjogRW52aXJvbm1lbnROYW1lO1xuICAgICAgcHViS2V5VHlwZTogJ25pdHJvJyB8ICdvbnByZW0nO1xuICAgIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIGFzc2VydChiaXRnb0tleWNoYWluLndhbGxldEhTTUdQR1B1YmxpY0tleVNpZ3MpO1xuXG4gICAgY29uc3QgYml0Z29HcGdLZXkgPSB1c2VIYXJkY29kZWRCaXRHb0tleXNcbiAgICAgID8gYXdhaXQgcmVhZEtleSh7XG4gICAgICAgICAgYXJtb3JlZEtleTogZ2V0Qml0Z29NcGNHcGdQdWJLZXkodXNlSGFyZGNvZGVkQml0R29LZXlzLmVudiwgdXNlSGFyZGNvZGVkQml0R29LZXlzLnB1YktleVR5cGUsICdtcGN2MScpLFxuICAgICAgICB9KVxuICAgICAgOiAoYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbykpLm1wY1YxO1xuXG4gICAgY29uc3QgdXNlcktleVB1YiA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdQdWIgfSk7XG4gICAgY29uc3QgdXNlcktleUlkID0gdXNlcktleVB1Yi5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKTtcblxuICAgIGNvbnN0IGJhY2t1cEtleVB1YiA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJhY2t1cEdwZ1B1YiB9KTtcbiAgICBjb25zdCBiYWNrdXBLZXlJZCA9IGJhY2t1cEtleVB1Yi5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKTtcblxuICAgIGNvbnN0IHdhbGxldFNpZ25hdHVyZXMgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXlzKHsgYXJtb3JlZEtleXM6IGJpdGdvS2V5Y2hhaW4ud2FsbGV0SFNNR1BHUHVibGljS2V5U2lncyB9KTtcbiAgICBpZiAod2FsbGV0U2lnbmF0dXJlcy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB3YWxsZXQgc2lnbmF0dXJlcycpO1xuICAgIH1cblxuICAgIGlmICh1c2VyS2V5SWQgIT09IHdhbGxldFNpZ25hdHVyZXNbMF0ua2V5UGFja2V0LmdldEZpbmdlcnByaW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmlyc3Qgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCB1c2VyIGdwZyBrZXkncyBmaW5nZXJwcmludGApO1xuICAgIH1cblxuICAgIGlmIChiYWNrdXBLZXlJZCAhPT0gd2FsbGV0U2lnbmF0dXJlc1sxXS5rZXlQYWNrZXQuZ2V0RmluZ2VycHJpbnQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBzZWNvbmQgd2FsbGV0IHNpZ25hdHVyZSdzIGZpbmdlcnByaW50IGRvZXMgbm90IG1hdGNoIHBhc3NlZCBiYWNrdXAgZ3BnIGtleSdzIGZpbmdlcnByaW50YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdmVyaWZ5V2FsbGV0U2lnbmF0dXJlKHtcbiAgICAgIHdhbGxldFNpZ25hdHVyZTogd2FsbGV0U2lnbmF0dXJlc1swXSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgdXNlcktleUlkLFxuICAgICAgYmFja3VwS2V5SWQsXG4gICAgICBiaXRnb1B1YjogYml0Z29HcGdLZXksXG4gICAgICBkZWNyeXB0ZWRTaGFyZSxcbiAgICAgIHZlcmlmaWVySW5kZXgsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB2ZXJpZnlXYWxsZXRTaWduYXR1cmUoe1xuICAgICAgd2FsbGV0U2lnbmF0dXJlOiB3YWxsZXRTaWduYXR1cmVzWzFdLFxuICAgICAgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyS2V5SWQsXG4gICAgICBiYWNrdXBLZXlJZCxcbiAgICAgIGJpdGdvUHViOiBiaXRnb0dwZ0tleSxcbiAgICAgIGRlY3J5cHRlZFNoYXJlLFxuICAgICAgdmVyaWZpZXJJbmRleCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgS2V5Y2hhaW4gY29udGFpbmluZyB0aGUgVXNlcidzIFRTUyBzaWduaW5nIG1hdGVyaWFscy5cbiAgICogV2UgbmVlZCB0byBoYXZlIHRoZSBwYXNzcGhyYXNlIGJlIG9wdGlvbmFsIHRvIGFsbG93IGZvciB0aGUgY2xpZW50IHRvIHN0b3JlIHRoZWlyIGJhY2t1cCBrZXkgb24gdGhlaXIgcHJlbWlzZXNcbiAgICpcbiAgICogQHBhcmFtIHVzZXJHcGdLZXkgLSBlcGhlbWVyYWwgR1BHIGtleSB0byBlbmNyeXB0IC8gZGVjcnlwdCBzZW5zaXR2ZSBkYXRhIGV4Y2hhbmdlZCBiZXR3ZWVuIHVzZXIgYW5kIHNlcnZlclxuICAgKiBAcGFyYW0gdXNlcktleVNoYXJlIC0gdXNlcidzIFRTUyBrZXkgc2hhcmVcbiAgICogQHBhcmFtIGJhY2t1cEtleVNoYXJlIC0gYmFja3VwJ3MgVFNTIGtleSBzaGFyZVxuICAgKiBAcGFyYW0gYml0Z29LZXljaGFpbiAtIHByZXZpb3VzbHkgY3JlYXRlZCBCaXRHbyBrZXljaGFpbjsgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXNcbiAgICogQHBhcmFtIFtwYXNzcGhyYXNlXSAtIG9wdGlvbmFsIHdhbGxldCBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCB1c2VyJ3Mgc2lnbmluZyBtYXRlcmlhbHNcbiAgICogQHBhcmFtIFtvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVdIC0gb3B0aW9uYWwgZW5jcnlwdGlvbiBjb2RlIG5lZWRlZCBmb3Igd2FsbGV0IHBhc3N3b3JkIHJlc2V0IGZvciBob3Qgd2FsbGV0c1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlVXNlcktleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbixcbiAgICBwYXNzcGhyYXNlLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICB3ZWJhdXRobkluZm8sXG4gICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgZW50ZXJwcmlzZSxcbiAgfTogQ3JlYXRlRWRkc2FLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFZGRzYS5pbml0aWFsaXplKCk7XG4gICAgY29uc3QgYml0Z29LZXlTaGFyZXMgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcztcbiAgICBpZiAoIWJpdGdvS2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28ga2V5IHNoYXJlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdEdvVG9Vc2VyU2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ3VzZXInKTtcbiAgICBpZiAoIWJpdEdvVG9Vc2VyU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyB0byBVc2VyIGtleSBzaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdEdvVG9Vc2VyUHJpdmF0ZVNoYXJlID0gYXdhaXQgdGhpcy5kZWNyeXB0UHJpdmF0ZVNoYXJlKGJpdEdvVG9Vc2VyU2hhcmUucHJpdmF0ZVNoYXJlLCB1c2VyR3BnS2V5KTtcblxuICAgIGF3YWl0IHRoaXMudmVyaWZ5V2FsbGV0U2lnbmF0dXJlcyhcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBiaXRHb1RvVXNlclByaXZhdGVTaGFyZSxcbiAgICAgIDFcbiAgICApO1xuXG4gICAgY29uc3QgYml0Z29Ub1VzZXI6IFlTaGFyZSA9IHtcbiAgICAgIGk6IDEsXG4gICAgICBqOiAzLFxuICAgICAgeTogYml0R29Ub1VzZXJTaGFyZS5wdWJsaWNTaGFyZS5zbGljZSgwLCA2NCksXG4gICAgICB2OiBiaXRHb1RvVXNlclNoYXJlLnZzc1Byb29mLFxuICAgICAgdTogYml0R29Ub1VzZXJQcml2YXRlU2hhcmUuc2xpY2UoMCwgNjQpLFxuICAgICAgY2hhaW5jb2RlOiBiaXRHb1RvVXNlclByaXZhdGVTaGFyZS5zbGljZSg2NCksXG4gICAgfTtcblxuICAgIGNvbnN0IGJpdEdvVG9CYWNrdXBTaGFyZSA9IGJpdGdvS2V5U2hhcmVzLmZpbmQoKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSAnYmFja3VwJyk7XG4gICAgaWYgKGJpdEdvVG9CYWNrdXBTaGFyZSkge1xuICAgICAgYXNzZXJ0KGJpdEdvVG9CYWNrdXBTaGFyZS52c3NQcm9vZiA9PT0gYml0R29Ub1VzZXJTaGFyZS52c3NQcm9vZiwgJ1ZTUyBwcm9vZnMgdG8gdXNlciBhbmQgYmFja3VwIGRvIG5vdCBtYXRjaCcpO1xuICAgIH1cblxuICAgIC8vIFRPRE8oQkctNDcxNzApOiB1c2UgdHNzLmNyZWF0ZUNvbWJpbmVkS2V5IGhlbHBlciB3aGVuIHNpZ25hdHVyZXMgYXJlIHN1cHBvcnRlZFxuICAgIGNvbnN0IHVzZXJDb21iaW5lZCA9IE1QQy5rZXlDb21iaW5lKHVzZXJLZXlTaGFyZS51U2hhcmUsIFtiYWNrdXBLZXlTaGFyZS55U2hhcmVzWzFdLCBiaXRnb1RvVXNlcl0pO1xuICAgIGNvbnN0IGNvbW1vbktleWNoYWluID0gdXNlckNvbWJpbmVkLnBTaGFyZS55ICsgdXNlckNvbWJpbmVkLnBTaGFyZS5jaGFpbmNvZGU7XG4gICAgaWYgKGNvbW1vbktleWNoYWluICE9PSBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgdXNlciBrZXljaGFpbiAtIGNvbW1vbktleWNoYWlucyBkbyBub3QgbWF0Y2guJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbDogU2lnbmluZ01hdGVyaWFsID0ge1xuICAgICAgdVNoYXJlOiB1c2VyS2V5U2hhcmUudVNoYXJlLFxuICAgICAgYml0Z29ZU2hhcmU6IGJpdGdvVG9Vc2VyLFxuICAgICAgYmFja3VwWVNoYXJlOiBiYWNrdXBLZXlTaGFyZS55U2hhcmVzWzFdLFxuICAgIH07XG5cbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5QYXJhbXM6IEFkZEtleWNoYWluT3B0aW9ucyA9IHtcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICB9O1xuICAgIGlmIChwYXNzcGhyYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbmNyeXB0aW9uU2Vzc2lvbikge1xuICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMuZW5jcnlwdGVkUHJ2ID0gYXdhaXQgZW5jcnlwdGlvblNlc3Npb24uZW5jcnlwdChKU09OLnN0cmluZ2lmeSh1c2VyU2lnbmluZ01hdGVyaWFsKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VyS2V5Y2hhaW5QYXJhbXMuZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkodXNlclNpZ25pbmdNYXRlcmlhbCksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAod2ViYXV0aG5JbmZvICYmIHVzZXJLZXljaGFpblBhcmFtcy5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIC8vIFNlbmQgdGhlIHBhc3NrZXkgYXMgYHdlYmF1dGhuSW5mb2A7IHRoZSBkZXByZWNhdGVkIGB3ZWJhdXRobkRldmljZXNgIGFycmF5IGlzIGlnbm9yZWQgYnkgUE9TVCAva2V5LlxuICAgICAgYXNzZXJ0KGVudGVycHJpc2UsICdlbnRlcnByaXNlIGlzIHJlcXVpcmVkIHRvIGF0dGFjaCBhIHdlYmF1dGhuIGRldmljZSB0byB0aGUgdXNlciBrZXljaGFpbicpO1xuICAgICAgdXNlcktleWNoYWluUGFyYW1zLndlYmF1dGhuSW5mbyA9IHtcbiAgICAgICAgb3RwRGV2aWNlSWQ6IHdlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgcHJmU2FsdDogd2ViYXV0aG5JbmZvLnByZlNhbHQsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogSlNPTi5zdHJpbmdpZnkodXNlclNpZ25pbmdNYXRlcmlhbCksXG4gICAgICAgICAgcGFzc3dvcmQ6IHdlYmF1dGhuSW5mby5wYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KSxcbiAgICAgICAgZW50ZXJwcmlzZUlkOiBlbnRlcnByaXNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQodXNlcktleWNoYWluUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgS2V5Y2hhaW4gY29udGFpbmluZyB0aGUgQmFja3VwIHBhcnR5J3MgVFNTIHNpZ25pbmcgbWF0ZXJpYWxzLlxuICAgKiBXZSBuZWVkIHRvIGhhdmUgdGhlIHBhc3NwaHJhc2UgYmUgb3B0aW9uYWwgdG8gYWxsb3cgZm9yIHRoZSBjbGllbnQgdG8gc3RvcmUgdGhlaXIgYmFja3VwIGtleSBvbiB0aGVpciBwcmVtaXNlc1xuICAgKlxuICAgKiBAcGFyYW0gdXNlckdwZ0tleSAtIGVwaGVtZXJhbCBHUEcga2V5IHRvIGVuY3J5cHQgLyBkZWNyeXB0IHNlbnNpdHZlIGRhdGEgZXhjaGFuZ2VkIGJldHdlZW4gdXNlciBhbmQgc2VydmVyXG4gICAqIEBwYXJhbSB1c2VyS2V5U2hhcmUgLSBVc2VyJ3MgVFNTIEtleXNoYXJlXG4gICAqIEBwYXJhbSBiYWNrdXBHcGdLZXkgLSBlcGhlbWVyYWwgR1BHIGtleSB0byBlbmNyeXB0IC8gZGVjcnlwdCBzZW5zaXR2ZSBkYXRhIGV4Y2hhbmdlZCBiZXR3ZWVuIGJhY2t1cCBhbmQgc2VydmVyXG4gICAqIEBwYXJhbSBiYWNrdXBLZXlTaGFyZSAtIEJhY2t1cCdzIFRTUyBLZXlzaGFyZVxuICAgKiBAcGFyYW0gYml0Z29LZXljaGFpbiAtIHByZXZpb3VzbHkgY3JlYXRlZCBCaXRHbyBrZXljaGFpbjsgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXNcbiAgICogQHBhcmFtIFtwYXNzcGhyYXNlXSAtIG9wdGlvbmFsIHdhbGxldCBwYXNzcGhyYXNlIHVzZWQgdG8gZW5jcnlwdCB1c2VyJ3Mgc2lnbmluZyBtYXRlcmlhbHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUJhY2t1cEtleWNoYWluKHtcbiAgICB1c2VyR3BnS2V5LFxuICAgIGJhY2t1cEdwZ0tleSxcbiAgICB1c2VyS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbixcbiAgICBwYXNzcGhyYXNlLFxuICAgIGVuY3J5cHRpb25TZXNzaW9uLFxuICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICB9OiBDcmVhdGVFZGRzYUtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoKTtcbiAgICBjb25zdCBiaXRnb0tleVNoYXJlcyA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzO1xuICAgIGlmICghYml0Z29LZXlTaGFyZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiaXRnbyBrZXlzaGFyZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvQmFja3VwU2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ2JhY2t1cCcpO1xuICAgIGlmICghYml0R29Ub0JhY2t1cFNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gdG8gVXNlciBrZXkgc2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRHb1RvQmFja3VwUHJpdmF0ZVNoYXJlID0gYXdhaXQgdGhpcy5kZWNyeXB0UHJpdmF0ZVNoYXJlKGJpdEdvVG9CYWNrdXBTaGFyZS5wcml2YXRlU2hhcmUsIGJhY2t1cEdwZ0tleSk7XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVdhbGxldFNpZ25hdHVyZXMoXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgYml0R29Ub0JhY2t1cFByaXZhdGVTaGFyZSxcbiAgICAgIDJcbiAgICApO1xuXG4gICAgY29uc3QgYml0Z29Ub0JhY2t1cDogWVNoYXJlID0ge1xuICAgICAgaTogMixcbiAgICAgIGo6IDMsXG4gICAgICB5OiBiaXRHb1RvQmFja3VwU2hhcmUucHVibGljU2hhcmUuc2xpY2UoMCwgNjQpLFxuICAgICAgdjogYml0R29Ub0JhY2t1cFNoYXJlLnZzc1Byb29mLFxuICAgICAgdTogYml0R29Ub0JhY2t1cFByaXZhdGVTaGFyZS5zbGljZSgwLCA2NCksXG4gICAgICBjaGFpbmNvZGU6IGJpdEdvVG9CYWNrdXBQcml2YXRlU2hhcmUuc2xpY2UoNjQpLFxuICAgIH07XG5cbiAgICBjb25zdCBiaXRHb1RvVXNlclNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZCgoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiaXRnbycgJiYga2V5U2hhcmUudG8gPT09ICd1c2VyJyk7XG4gICAgaWYgKGJpdEdvVG9Vc2VyU2hhcmUpIHtcbiAgICAgIGFzc2VydChiaXRHb1RvVXNlclNoYXJlLnZzc1Byb29mID09PSBiaXRHb1RvQmFja3VwU2hhcmUudnNzUHJvb2YsICdWU1MgcHJvb2ZzIHRvIHVzZXIgYW5kIGJhY2t1cCBkbyBub3QgbWF0Y2gnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKEJHLTQ3MTcwKTogdXNlIHRzcy5jcmVhdGVDb21iaW5lZEtleSBoZWxwZXIgd2hlbiBzaWduYXR1cmVzIGFyZSBzdXBwb3J0ZWRcbiAgICBjb25zdCBiYWNrdXBDb21iaW5lZCA9IE1QQy5rZXlDb21iaW5lKGJhY2t1cEtleVNoYXJlLnVTaGFyZSwgW3VzZXJLZXlTaGFyZS55U2hhcmVzWzJdLCBiaXRnb1RvQmFja3VwXSk7XG4gICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPSBiYWNrdXBDb21iaW5lZC5wU2hhcmUueSArIGJhY2t1cENvbWJpbmVkLnBTaGFyZS5jaGFpbmNvZGU7XG4gICAgaWYgKGNvbW1vbktleWNoYWluICE9PSBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYmFja3VwIGtleWNoYWluIC0gY29tbW9uS2V5Y2hhaW5zIGRvIG5vdCBtYXRjaC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYWNrdXBTaWduaW5nTWF0ZXJpYWw6IFNpZ25pbmdNYXRlcmlhbCA9IHtcbiAgICAgIHVTaGFyZTogYmFja3VwS2V5U2hhcmUudVNoYXJlLFxuICAgICAgYml0Z29ZU2hhcmU6IGJpdGdvVG9CYWNrdXAsXG4gICAgICB1c2VyWVNoYXJlOiB1c2VyS2V5U2hhcmUueVNoYXJlc1syXSxcbiAgICB9O1xuICAgIGNvbnN0IHBydiA9IEpTT04uc3RyaW5naWZ5KGJhY2t1cFNpZ25pbmdNYXRlcmlhbCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IENyZWF0ZUJhY2t1cE9wdGlvbnMgPSB7XG4gICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAga2V5VHlwZTogJ3RzcycsXG4gICAgICBjb21tb25LZXljaGFpbjogYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgIHBydjogcHJ2LFxuICAgIH07XG5cbiAgICBpZiAocGFzc3BocmFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZW5jcnlwdGlvblNlc3Npb24pIHtcbiAgICAgICAgcGFyYW1zLmVuY3J5cHRlZFBydiA9IGF3YWl0IGVuY3J5cHRpb25TZXNzaW9uLmVuY3J5cHQocHJ2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5lbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogcHJ2LCBwYXNzd29yZDogcGFzc3BocmFzZSwgZW5jcnlwdGlvblZlcnNpb24gfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuY3JlYXRlQmFja3VwKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIEtleWNoYWluIGNvbnRhaW5pbmcgQml0R28ncyBUU1Mgc2lnbmluZyBtYXRlcmlhbHMuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyR3BnS2V5IC0gZXBoZW1lcmFsIEdQRyBrZXkgdG8gZW5jcnlwdCAvIGRlY3J5cHQgc2Vuc2l0dmUgZGF0YSBleGNoYW5nZWQgYmV0d2VlbiB1c2VyIGFuZCBzZXJ2ZXJcbiAgICogQHBhcmFtIHVzZXJLZXlTaGFyZSAtIHVzZXIncyBUU1Mga2V5IHNoYXJlXG4gICAqIEBwYXJhbSBiYWNrdXBLZXlTaGFyZSAtIGJhY2t1cCdzIFRTUyBrZXkgc2hhcmVcbiAgICogQHBhcmFtIGVudGVycHJpc2UgLSBlbnRlcnByaXNlIGFzc29jaWF0ZWQgdG8gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQml0Z29LZXljaGFpbih7XG4gICAgdXNlckdwZ0tleSxcbiAgICBiYWNrdXBHcGdLZXksXG4gICAgdXNlcktleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlLFxuICAgIGVudGVycHJpc2UsXG4gIH06IENyZWF0ZUVkZHNhQml0R29LZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICAvLyBUT0RPKEJHLTQ3MTcwKTogdXNlIHRzcy5lbmNyeXB0WVNoYXJlIGhlbHBlciB3aGVuIHNpZ25hdHVyZXMgYXJlIHN1cHBvcnRlZFxuICAgIGNvbnN0IHVzZXJUb0JpdGdvUHVibGljU2hhcmUgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJLZXlTaGFyZS51U2hhcmUueSwgJ2hleCcpLFxuICAgICAgQnVmZmVyLmZyb20odXNlcktleVNoYXJlLnVTaGFyZS5jaGFpbmNvZGUsICdoZXgnKSxcbiAgICBdKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdXNlclRvQml0Z29Qcml2YXRlU2hhcmUgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJLZXlTaGFyZS55U2hhcmVzWzNdLnUsICdoZXgnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKHVzZXJLZXlTaGFyZS55U2hhcmVzWzNdLmNoYWluY29kZSwgJ2hleCcpLFxuICAgIF0pLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCB1c2VyVG9CaXRnb0tleVNoYXJlID0ge1xuICAgICAgcHVibGljU2hhcmU6IHVzZXJUb0JpdGdvUHVibGljU2hhcmUsXG4gICAgICBwcml2YXRlU2hhcmU6IHVzZXJUb0JpdGdvUHJpdmF0ZVNoYXJlLFxuICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGF3YWl0IGNyZWF0ZVNoYXJlUHJvb2YodXNlckdwZ0tleS5wcml2YXRlS2V5LCB1c2VyVG9CaXRnb1ByaXZhdGVTaGFyZS5zbGljZSgwLCA2NCksICdlZGRzYScpLFxuICAgICAgdnNzUHJvb2Y6IHVzZXJLZXlTaGFyZS55U2hhcmVzWzNdLnYsXG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2t1cFRvQml0Z29QdWJsaWNTaGFyZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20oYmFja3VwS2V5U2hhcmUudVNoYXJlLnksICdoZXgnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKGJhY2t1cEtleVNoYXJlLnVTaGFyZS5jaGFpbmNvZGUsICdoZXgnKSxcbiAgICBdKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgYmFja3VwVG9CaXRnb1ByaXZhdGVTaGFyZSA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20oYmFja3VwS2V5U2hhcmUueVNoYXJlc1szXS51LCAnaGV4JyksXG4gICAgICBCdWZmZXIuZnJvbShiYWNrdXBLZXlTaGFyZS55U2hhcmVzWzNdLmNoYWluY29kZSwgJ2hleCcpLFxuICAgIF0pLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBiYWNrdXBUb0JpdGdvS2V5U2hhcmUgPSB7XG4gICAgICBwdWJsaWNTaGFyZTogYmFja3VwVG9CaXRnb1B1YmxpY1NoYXJlLFxuICAgICAgcHJpdmF0ZVNoYXJlOiBiYWNrdXBUb0JpdGdvUHJpdmF0ZVNoYXJlLFxuICAgICAgcHJpdmF0ZVNoYXJlUHJvb2Y6IGF3YWl0IGNyZWF0ZVNoYXJlUHJvb2YoXG4gICAgICAgIGJhY2t1cEdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBiYWNrdXBUb0JpdGdvUHJpdmF0ZVNoYXJlLnNsaWNlKDAsIDY0KSxcbiAgICAgICAgJ2VkZHNhJ1xuICAgICAgKSxcbiAgICAgIHZzc1Byb29mOiBiYWNrdXBLZXlTaGFyZS55U2hhcmVzWzNdLnYsXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZUJpdGdvS2V5Y2hhaW5JbldQKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgIHVzZXJUb0JpdGdvS2V5U2hhcmUsXG4gICAgICBiYWNrdXBUb0JpdGdvS2V5U2hhcmUsXG4gICAgICAndHNzJyxcbiAgICAgIGVudGVycHJpc2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgVXNlciwgQmFja3VwLCBhbmQgQml0R28gVFNTIEtleWNoYWlucy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy5wYXNzcGhyYXNlIC0gcGFzc3BocmFzZSB1c2VkIHRvIGVuY3J5cHQgc2lnbmluZyBtYXRlcmlhbHMgY3JlYXRlZCBmb3IgVXNlciBhbmQgQmFja3VwXG4gICAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnMocGFyYW1zOiB7XG4gICAgcGFzc3BocmFzZT86IHN0cmluZztcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZztcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvO1xuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb247XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFZGRzYS5pbml0aWFsaXplKCk7XG4gICAgY29uc3QgbSA9IDI7XG4gICAgY29uc3QgbiA9IDM7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBNUEMua2V5U2hhcmUoMSwgbSwgbik7XG4gICAgY29uc3QgYmFja3VwS2V5U2hhcmUgPSBNUEMua2V5U2hhcmUoMiwgbSwgbik7XG5cbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcbiAgICBjb25zdCBiYWNrdXBHcGdLZXkgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ3NlY3AyNTZrMScpO1xuXG4gICAgY29uc3QgYml0Z29LZXljaGFpbiA9IGF3YWl0IHRoaXMuY3JlYXRlQml0Z29LZXljaGFpbih7XG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwR3BnS2V5LFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBlbnRlcnByaXNlOiBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25TZXNzaW9uID1cbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMiAmJiBwYXJhbXMucGFzc3BocmFzZVxuICAgICAgICA/IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFyYW1zLnBhc3NwaHJhc2UpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVVc2VyS2V5Y2hhaW4oe1xuICAgICAgICB1c2VyR3BnS2V5LFxuICAgICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICAgIGJhY2t1cEdwZ0tleSxcbiAgICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIHdlYmF1dGhuSW5mbzogcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSB0aGlzLmNyZWF0ZUJhY2t1cEtleWNoYWluKHtcbiAgICAgICAgdXNlckdwZ0tleSxcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiYWNrdXBHcGdLZXksXG4gICAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgICAgZW5jcnlwdGlvblNlc3Npb24sXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IFt1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluXSA9IGF3YWl0IFByb21pc2UuYWxsKFt1c2VyS2V5Y2hhaW5Qcm9taXNlLCBiYWNrdXBLZXljaGFpblByb21pc2VdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcktleWNoYWluLFxuICAgICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuY3J5cHRpb25TZXNzaW9uPy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgRWREU0EgVFNTIGtleWNoYWlucyB1c2luZyBleHRlcm5hbCBzaWduZXIgY2FsbGJhY2tzIGluc3RlYWQgb2YgYSBwYXNzcGhyYXNlLlxuICAgKiBUaGUgZXh0ZXJuYWwgc2lnbmVyIGhvbGRzIGFsbCBwcml2YXRlIGtleSBtYXRlcmlhbCBhbmQgcHJlLWVuY3J5cHRzIHNoYXJlcyB0byBCaXRHbydzIEdQRyBrZXkuXG4gICAqL1xuICBhc3luYyBjcmVhdGVLZXljaGFpbnNXaXRoRXh0ZXJuYWxTaWduZXIocGFyYW1zOiB7XG4gICAgZW50ZXJwcmlzZTogc3RyaW5nO1xuICAgIGNhbGxiYWNrczogRWRkc2FLZXlHZW5DYWxsYmFja3M7XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCB7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGJpdGdvR3BnUHViS2V5ID0gKGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pKS5tcGNWMTtcblxuICAgIGlmIChlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnKHRoaXMuYml0Z28uZ2V0RW52KCkpKSB7XG4gICAgICBhc3NlcnQoaXNCaXRnb01wY1B1YktleShiaXRnb0dwZ1B1YktleS5hcm1vcigpLCAnbXBjdjEnKSwgJ0ludmFsaWQgQml0R28gR1BHIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgdXNlclRvQml0Z29LZXlTaGFyZSxcbiAgICAgIGJhY2t1cFRvQml0Z29LZXlTaGFyZSxcbiAgICAgIHVzZXJTdGF0ZSxcbiAgICAgIGJhY2t1cFN0YXRlLFxuICAgICAgYmFja3VwVG9Vc2VyQ291bnRlclBhcnR5S2V5U2hhcmUsXG4gICAgfSA9IGF3YWl0IGNhbGxiYWNrcy5pbml0aWFsaXplQ2FsbGJhY2soeyBlbnRlcnByaXNlLCBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29HcGdQdWJLZXkuYXJtb3IoKSB9KTtcblxuICAgIC8vIENyZWF0ZSBCaXRHbyBrZXljaGFpbiB3aXRoIHByZS1lbmNyeXB0ZWQgc2hhcmVzIGZyb20gdGhlIGV4dGVybmFsIHNpZ25lclxuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7XG4gICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgIGtleVNoYXJlczogW1xuICAgICAgICB7IGZyb206ICd1c2VyJywgdG86ICdiaXRnbycsIC4uLnVzZXJUb0JpdGdvS2V5U2hhcmUgfSxcbiAgICAgICAgeyBmcm9tOiAnYmFja3VwJywgdG86ICdiaXRnbycsIC4uLmJhY2t1cFRvQml0Z29LZXlTaGFyZSB9LFxuICAgICAgXSxcbiAgICAgIHVzZXJHUEdQdWJsaWNLZXk6IHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHUEdQdWJsaWNLZXk6IGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgfSk7XG5cbiAgICAvLyBGaW5hbGl6ZSBydW5zIHNlcXVlbnRpYWxseTogdXNlciBmaW5hbGl6ZSBwcm9kdWNlcyBhIGNvdW50ZXJwYXJ0eSBrZXkgc2hhcmUgdGhhdCBiYWNrdXAgZmluYWxpemUgY29uc3VtZXMuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKTtcbiAgICBjb25zdCB1c2VyUmVzdWx0ID0gYXdhaXQgY2FsbGJhY2tzLmZpbmFsaXplQ2FsbGJhY2soe1xuICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICBjb2luLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIGNvdW50ZXJQYXJ0eUdQR0tleTogYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgY291bnRlclBhcnR5S2V5U2hhcmU6IGJhY2t1cFRvVXNlckNvdW50ZXJQYXJ0eUtleVNoYXJlLFxuICAgICAgc3RhdGU6IHVzZXJTdGF0ZSxcbiAgICB9KTtcbiAgICBhc3NlcnQodXNlclJlc3VsdC5jb3VudGVycGFydHlLZXlTaGFyZSwgJ1VzZXIgZmluYWxpemUgZGlkIG5vdCBwcm9kdWNlIGEgY291bnRlcnBhcnR5IGtleSBzaGFyZScpO1xuXG4gICAgY29uc3QgYmFja3VwUmVzdWx0ID0gYXdhaXQgY2FsbGJhY2tzLmZpbmFsaXplQ2FsbGJhY2soe1xuICAgICAgc291cmNlOiAnYmFja3VwJyxcbiAgICAgIGNvaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgY291bnRlclBhcnR5R1BHS2V5OiB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgY291bnRlclBhcnR5S2V5U2hhcmU6IHVzZXJSZXN1bHQuY291bnRlcnBhcnR5S2V5U2hhcmUsXG4gICAgICBzdGF0ZTogYmFja3VwU3RhdGUsXG4gICAgfSk7XG5cbiAgICBhc3NlcnQoYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbiwgJ0JpdEdvIGtleWNoYWluIG1pc3NpbmcgY29tbW9uS2V5Y2hhaW4nKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICB1c2VyUmVzdWx0LmNvbW1vbktleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgICdVc2VyIGNvbW1vbiBrZXljaGFpbiBkb2VzIG5vdCBtYXRjaCBCaXRHbydcbiAgICApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgIGJhY2t1cFJlc3VsdC5jb21tb25LZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4sXG4gICAgICAnQmFja3VwIGNvbW1vbiBrZXljaGFpbiBkb2VzIG5vdCBtYXRjaCBCaXRHbydcbiAgICApO1xuXG4gICAgY29uc3QgeyBjb21tb25LZXljaGFpbiB9ID0gYml0Z29LZXljaGFpbjtcbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7IHNvdXJjZTogJ3VzZXInLCBrZXlUeXBlOiAndHNzJywgY29tbW9uS2V5Y2hhaW4gfSksXG4gICAgICB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh7IHNvdXJjZTogJ2JhY2t1cCcsIGtleVR5cGU6ICd0c3MnLCBjb21tb25LZXljaGFpbiB9KSxcbiAgICBdKTtcblxuICAgIHJldHVybiB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNvbW1pdG1lbnRTaGFyZUZyb21UeFJlcXVlc3QocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvR3BnUHViS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgdXNlclRvQml0Z29Db21taXRtZW50OiBDb21taXRtZW50U2hhcmVSZWNvcmQ7XG4gICAgZW5jcnlwdGVkU2lnbmVyU2hhcmU6IEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkO1xuICAgIGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlOiBFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZDtcbiAgfT4ge1xuICAgIGNvbnN0IGJpdGdvSW5kZXggPSBTaGFyZUtleVBvc2l0aW9uLkJJVEdPO1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0LCBwcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0ID0gdHhSZXF1ZXN0O1xuXG4gICAgY29uc3QgaGRUcmVlID0gYXdhaXQgRWQyNTUxOUJpcDMySGRUcmVlLmluaXRpYWxpemUoKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFZGRzYS5pbml0aWFsaXplKGhkVHJlZSk7XG5cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHBydik7XG4gICAgaWYgKCF1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cFlTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5IC0gbWlzc2luZyBiYWNrdXBZU2hhcmUnKTtcbiAgICB9XG5cbiAgICBhc3NlcnQodHhSZXF1ZXN0UmVzb2x2ZWQudHJhbnNhY3Rpb25zIHx8IHR4UmVxdWVzdFJlc29sdmVkLnVuc2lnbmVkVHhzLCAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCcpO1xuICAgIGNvbnN0IHVuc2lnbmVkVHggPVxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnXG4gICAgICAgID8gdHhSZXF1ZXN0UmVzb2x2ZWQudHJhbnNhY3Rpb25zIVswXS51bnNpZ25lZFR4XG4gICAgICAgIDogdHhSZXF1ZXN0UmVzb2x2ZWQudW5zaWduZWRUeHNbMF07XG5cbiAgICBjb25zdCBzaWduaW5nS2V5ID0gTVBDLmtleURlcml2ZShcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwudVNoYXJlLFxuICAgICAgW3VzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29ZU2hhcmUsIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwWVNoYXJlXSxcbiAgICAgIHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGhcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odW5zaWduZWRUeC5zaWduYWJsZUhleCwgJ2hleCcpO1xuXG4gICAgY29uc3QgdXNlclNpZ25TaGFyZSA9IGF3YWl0IGNyZWF0ZVVzZXJTaWduU2hhcmUoc2lnbmFibGVQYXlsb2FkLCBzaWduaW5nS2V5LnBTaGFyZSk7XG4gICAgY29uc3QgY29tbWl0bWVudCA9IHVzZXJTaWduU2hhcmUuclNoYXJlc1tiaXRnb0luZGV4XT8uY29tbWl0bWVudDtcbiAgICBhc3NlcnQoY29tbWl0bWVudCwgJ1VuYWJsZSB0byBmaW5kIGNvbW1pdG1lbnQgaW4gdXNlclNpZ25TaGFyZScpO1xuICAgIGNvbnN0IHVzZXJUb0JpdGdvQ29tbWl0bWVudCA9IHRoaXMuY3JlYXRlVXNlclRvQml0Z29Db21taXRtZW50U2hhcmUoY29tbWl0bWVudCk7XG5cbiAgICBjb25zdCBzaWduZXJTaGFyZSA9IHNpZ25pbmdLZXkueVNoYXJlc1tiaXRnb0luZGV4XS51ICsgc2lnbmluZ0tleS55U2hhcmVzW2JpdGdvSW5kZXhdLmNoYWluY29kZTtcblxuICAgIGNvbnN0IHVzZXJUb0JpdGdvRW5jcnlwdGVkU2lnbmVyU2hhcmUgPSBhd2FpdCBlbmNyeXB0VGV4dChcbiAgICAgIHNpZ25lclNoYXJlLFxuICAgICAgYXdhaXQgb3BlbnBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogcGFyYW1zLmJpdGdvR3BnUHViS2V5IH0pXG4gICAgKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gdGhpcy5jcmVhdGVVc2VyVG9CaXRnb0VuY3J5cHRlZFNpZ25lclNoYXJlKHVzZXJUb0JpdGdvRW5jcnlwdGVkU2lnbmVyU2hhcmUpO1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkUlNoYXJlID0gSlNPTi5zdHJpbmdpZnkodXNlclNpZ25TaGFyZSk7XG4gICAgbGV0IGVuY3J5cHRlZFJTaGFyZTogc3RyaW5nO1xuICAgIGlmIChwYXJhbXMuZW5jcnlwdGVkUHJ2ICYmIGlzVjJFbnZlbG9wZShwYXJhbXMuZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24ocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5jcnlwdGVkUlNoYXJlID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KHN0cmluZ2lmaWVkUlNoYXJlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlc3Npb24uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbmNyeXB0ZWRSU2hhcmUgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICBpbnB1dDogc3RyaW5naWZpZWRSU2hhcmUsXG4gICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZW5jcnlwdGVkVXNlclRvQml0Z29SU2hhcmUgPSB0aGlzLmNyZWF0ZVVzZXJUb0JpdGdvRW5jcnlwdGVkUlNoYXJlKGVuY3J5cHRlZFJTaGFyZSk7XG5cbiAgICByZXR1cm4geyB1c2VyVG9CaXRnb0NvbW1pdG1lbnQsIGVuY3J5cHRlZFNpZ25lclNoYXJlLCBlbmNyeXB0ZWRVc2VyVG9CaXRnb1JTaGFyZSB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUlNoYXJlRnJvbVR4UmVxdWVzdChwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlclRvQml0Z29SU2hhcmU6IEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkO1xuICB9KTogUHJvbWlzZTx7IHJTaGFyZTogU2lnblNoYXJlIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRSU2hhcmUgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgaW5wdXQ6IGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlLnNoYXJlLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG4gICAgY29uc3QgclNoYXJlID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSU2hhcmUpO1xuICAgIGFzc2VydChyU2hhcmUueFNoYXJlLCAnVW5hYmxlIHRvIGZpbmQgeFNoYXJlIGluIGRlY3J5cHRlZFJTaGFyZScpO1xuICAgIGFzc2VydChyU2hhcmUuclNoYXJlcywgJ1VuYWJsZSB0byBmaW5kIHJTaGFyZXMgaW4gZGVjcnlwdGVkUlNoYXJlJyk7XG5cbiAgICByZXR1cm4geyByU2hhcmUgfTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUdTaGFyZUZyb21UeFJlcXVlc3QocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBzdHJpbmcgfCBUeFJlcXVlc3Q7XG4gICAgcHJ2OiBzdHJpbmc7XG4gICAgYml0Z29Ub1VzZXJSU2hhcmU6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIHVzZXJUb0JpdGdvUlNoYXJlOiBTaWduU2hhcmU7XG4gICAgYml0Z29Ub1VzZXJDb21taXRtZW50OiBDb21taXRtZW50U2hhcmVSZWNvcmQ7XG4gIH0pOiBQcm9taXNlPEdTaGFyZT4ge1xuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuXG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHBydiwgYml0Z29Ub1VzZXJDb21taXRtZW50LCBiaXRnb1RvVXNlclJTaGFyZSwgdXNlclRvQml0Z29SU2hhcmUgfSA9IHBhcmFtcztcblxuICAgIGlmICh0eXBlb2YgdHhSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNpZ25pbmdNYXRlcmlhbDogU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShwcnYpO1xuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBZU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwWVNoYXJlJyk7XG4gICAgfVxuXG4gICAgYXNzZXJ0KHR4UmVxdWVzdFJlc29sdmVkLnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZFR4cywgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnKTtcbiAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLmFwaVZlcnNpb24gPT09ICdmdWxsJ1xuICAgICAgICA/IHR4UmVxdWVzdFJlc29sdmVkLnRyYW5zYWN0aW9ucyFbMF0udW5zaWduZWRUeFxuICAgICAgICA6IHR4UmVxdWVzdFJlc29sdmVkLnVuc2lnbmVkVHhzWzBdO1xuXG4gICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odW5zaWduZWRUeC5zaWduYWJsZUhleCwgJ2hleCcpO1xuXG4gICAgY29uc3QgdXNlclRvQml0R29HU2hhcmUgPSBhd2FpdCBjcmVhdGVVc2VyVG9CaXRHb0dTaGFyZShcbiAgICAgIHVzZXJUb0JpdGdvUlNoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJSU2hhcmUsXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLmJhY2t1cFlTaGFyZSxcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwuYml0Z29ZU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWQsXG4gICAgICBiaXRnb1RvVXNlckNvbW1pdG1lbnRcbiAgICApO1xuICAgIHJldHVybiB1c2VyVG9CaXRHb0dTaGFyZTtcbiAgfVxuXG4gIGFzeW5jIHNpZ25FZGRzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgdHhSZXF1ZXN0OiBzdHJpbmcgfCBUeFJlcXVlc3QsXG4gICAgZXh0ZXJuYWxTaWduZXJDb21taXRtZW50R2VuZXJhdG9yOiBDdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyUlNoYXJlR2VuZXJhdG9yOiBDdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJHU2hhcmVHZW5lcmF0b3I6IEN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICByZXFJZD86IElSZXF1ZXN0VHJhY2VyXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdFJlc29sdmVkOiBUeFJlcXVlc3Q7XG4gICAgbGV0IHR4UmVxdWVzdElkOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QsIHJlcUlkKTtcbiAgICAgIHR4UmVxdWVzdElkID0gdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gdHhSZXF1ZXN0O1xuICAgICAgdHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhcGlWZXJzaW9uIH0gPSB0eFJlcXVlc3RSZXNvbHZlZDtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IHRoaXMucGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhmYWxzZSwgcmVxSWQsIHR4UmVxdWVzdFJlc29sdmVkLmVudGVycHJpc2VJZCk7XG5cbiAgICBjb25zdCB7IHVzZXJUb0JpdGdvQ29tbWl0bWVudCwgZW5jcnlwdGVkU2lnbmVyU2hhcmUsIGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlIH0gPVxuICAgICAgYXdhaXQgZXh0ZXJuYWxTaWduZXJDb21taXRtZW50R2VuZXJhdG9yKHsgdHhSZXF1ZXN0OiB0eFJlcXVlc3RSZXNvbHZlZCwgYml0Z29HcGdQdWJLZXk6IGJpdGdvR3BnS2V5LmFybW9yKCkgfSk7XG5cbiAgICBjb25zdCB7IGNvbW1pdG1lbnRTaGFyZTogYml0Z29Ub1VzZXJDb21taXRtZW50IH0gPSBhd2FpdCBleGNoYW5nZUVkZHNhQ29tbWl0bWVudHMoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgdXNlclRvQml0Z29Db21taXRtZW50LFxuICAgICAgZW5jcnlwdGVkU2lnbmVyU2hhcmUsXG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgY29uc3QgeyByU2hhcmUgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyUlNoYXJlR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0UmVzb2x2ZWQsXG4gICAgICBlbmNyeXB0ZWRVc2VyVG9CaXRnb1JTaGFyZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IG9mZmVyVXNlclRvQml0Z29SU2hhcmUoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgclNoYXJlLFxuICAgICAgZW5jcnlwdGVkU2lnbmVyU2hhcmUuc2hhcmUsXG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcmVxSWRcbiAgICApO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUlNoYXJlID0gYXdhaXQgZ2V0Qml0Z29Ub1VzZXJSU2hhcmUodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQsIHJlcUlkKTtcbiAgICBjb25zdCBnU2lnblNoYXJlVHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdFJlc29sdmVkLFxuICAgICAgYml0Z29Ub1VzZXJSU2hhcmU6IGJpdGdvVG9Vc2VyUlNoYXJlLFxuICAgICAgdXNlclRvQml0Z29SU2hhcmU6IHJTaGFyZSxcbiAgICAgIGJpdGdvVG9Vc2VyQ29tbWl0bWVudCxcbiAgICB9O1xuICAgIGNvbnN0IGdTaGFyZSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyR1NoYXJlR2VuZXJhdG9yKGdTaWduU2hhcmVUcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgYXdhaXQgc2VuZFVzZXJUb0JpdGdvR1NoYXJlKHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdElkLCBnU2hhcmUsIGFwaVZlcnNpb24sIHJlcUlkKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdElkLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqXG4gICBAcGFyYW0gcGFyYW1zIC0gcGFyYW1ldGVycyBmb3Igc2lnbmluZyB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdChwYXJhbXM6IFRzc1NpZ25UeFJlcXVlc3RQYXJhbXNXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNpZ25SZXF1ZXN0QmFzZShcbiAgICBwYXJhbXM6IFRTU1BhcmFtc1dpdGhQcnYgfCBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGVcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICBsZXQgdHhSZXF1ZXN0UmVzb2x2ZWQ6IFR4UmVxdWVzdDtcbiAgICBsZXQgdHhSZXF1ZXN0SWQ6IHN0cmluZztcblxuICAgIGNvbnN0IHsgdHhSZXF1ZXN0LCBwcnYgfSA9IHBhcmFtcztcblxuICAgIGlmIChcbiAgICAgICdyZWNpcGllbnRTb3VyY2UnIGluIHBhcmFtcyAmJlxuICAgICAgcGFyYW1zLnJlY2lwaWVudFNvdXJjZSA9PT0gVHNzVHhSZWNpcGllbnRTb3VyY2UuRXhwbGljaXQgJiZcbiAgICAgICFwYXJhbXMudHhQYXJhbXM/LnJlY2lwaWVudHM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAncmVjaXBpZW50U291cmNlIFwiZXhwbGljaXRcIiByZXF1aXJlcyB0eFBhcmFtcy5yZWNpcGllbnRzIHdpdGggYXQgbGVhc3Qgb25lIHJlY2lwaWVudC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHhSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0LCBwYXJhbXMucmVxSWQpO1xuICAgICAgdHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgICB0eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCBoZFRyZWUgPSBhd2FpdCBFZDI1NTE5QmlwMzJIZFRyZWUuaW5pdGlhbGl6ZSgpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVkZHNhLmluaXRpYWxpemUoaGRUcmVlKTtcblxuICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWw6IFNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAoIXVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwWVNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBrZXkgLSBtaXNzaW5nIGJhY2t1cFlTaGFyZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYXBpVmVyc2lvbiB9ID0gdHhSZXF1ZXN0UmVzb2x2ZWQ7XG4gICAgbGV0IHVuc2lnbmVkVHg6IFVuc2lnbmVkVHJhbnNhY3Rpb25Uc3M7XG4gICAgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCkge1xuICAgICAgYXNzZXJ0KFxuICAgICAgICB0eFJlcXVlc3RSZXNvbHZlZC50cmFuc2FjdGlvbnMgfHwgdHhSZXF1ZXN0UmVzb2x2ZWQudW5zaWduZWRUeHMsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICAgKTtcbiAgICAgIHVuc2lnbmVkVHggPVxuICAgICAgICBhcGlWZXJzaW9uID09PSAnZnVsbCcgPyB0eFJlcXVlc3RSZXNvbHZlZC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZFR4c1swXTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0UmVzb2x2ZWQubWVzc2FnZXM/Lmxlbmd0aCwgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHR4UmVxdWVzdCBmb3IgbWVzc2FnZSBzaWduaW5nJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdHhSZXF1ZXN0UmVzb2x2ZWQubWVzc2FnZXNbMF07XG4gICAgICB1bnNpZ25lZFR4ID0ge1xuICAgICAgICBzaWduYWJsZUhleDogbWVzc2FnZS5tZXNzYWdlRW5jb2RlZCB8fCAnJyxcbiAgICAgICAgc2VyaWFsaXplZFR4SGV4OiBtZXNzYWdlLm1lc3NhZ2VCcm9hZGNhc3RhYmxlIHx8ICcnLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aDogbWVzc2FnZS5kZXJpdmF0aW9uUGF0aCB8fCAnbS8wJyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcmVxdWVzdCB0eXBlOiAke3JlcXVlc3RUeXBlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25pbmdLZXkgPSBNUEMua2V5RGVyaXZlKFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC51U2hhcmUsXG4gICAgICBbdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb1lTaGFyZSwgdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBZU2hhcmVdLFxuICAgICAgdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG5cbiAgICBjb25zdCB1c2VyU2lnblNoYXJlID0gYXdhaXQgY3JlYXRlVXNlclNpZ25TaGFyZShzaWduYWJsZVBheWxvYWQsIHNpZ25pbmdLZXkucFNoYXJlKTtcblxuICAgIGNvbnN0IGJpdGdvSW5kZXggPSBTaGFyZUtleVBvc2l0aW9uLkJJVEdPO1xuICAgIGNvbnN0IHNpZ25lclNoYXJlID0gc2lnbmluZ0tleS55U2hhcmVzW2JpdGdvSW5kZXhdLnUgKyBzaWduaW5nS2V5LnlTaGFyZXNbYml0Z29JbmRleF0uY2hhaW5jb2RlO1xuICAgIGNvbnN0IGJpdGdvR3BnS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKGZhbHNlLCBwYXJhbXMucmVxSWQsIHR4UmVxdWVzdFJlc29sdmVkLmVudGVycHJpc2VJZCk7XG4gICAgY29uc3QgdXNlclRvQml0Z29FbmNyeXB0ZWRTaWduZXJTaGFyZSA9IGF3YWl0IGVuY3J5cHRUZXh0KHNpZ25lclNoYXJlLCBiaXRnb0dwZ0tleSk7XG5cbiAgICBjb25zdCB1c2VyVG9CaXRnb0NvbW1pdG1lbnQgPSB1c2VyU2lnblNoYXJlLnJTaGFyZXNbYml0Z29JbmRleF0uY29tbWl0bWVudDtcbiAgICBhc3NlcnQodXNlclRvQml0Z29Db21taXRtZW50LCAnTWlzc2luZyB1c2VyVG9CaXRnb0NvbW1pdG1lbnQgY29tbWl0bWVudCcpO1xuXG4gICAgY29uc3QgY29tbWl0bWVudFNoYXJlID0gdGhpcy5jcmVhdGVVc2VyVG9CaXRnb0NvbW1pdG1lbnRTaGFyZSh1c2VyVG9CaXRnb0NvbW1pdG1lbnQpO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gdGhpcy5jcmVhdGVVc2VyVG9CaXRnb0VuY3J5cHRlZFNpZ25lclNoYXJlKHVzZXJUb0JpdGdvRW5jcnlwdGVkU2lnbmVyU2hhcmUpO1xuXG4gICAgY29uc3QgeyBjb21taXRtZW50U2hhcmU6IGJpdGdvVG9Vc2VyQ29tbWl0bWVudCB9ID0gYXdhaXQgZXhjaGFuZ2VFZGRzYUNvbW1pdG1lbnRzKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIGNvbW1pdG1lbnRTaGFyZSxcbiAgICAgIGVuY3J5cHRlZFNpZ25lclNoYXJlLFxuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICBhd2FpdCBvZmZlclVzZXJUb0JpdGdvUlNoYXJlKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIHVzZXJTaWduU2hhcmUsXG4gICAgICB1c2VyVG9CaXRnb0VuY3J5cHRlZFNpZ25lclNoYXJlLFxuICAgICAgYXBpVmVyc2lvbixcbiAgICAgIHBhcmFtcy5yZXFJZCxcbiAgICAgIHJlcXVlc3RUeXBlXG4gICAgKTtcblxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyUlNoYXJlID0gYXdhaXQgZ2V0Qml0Z29Ub1VzZXJSU2hhcmUoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgcGFyYW1zLnJlcUlkLFxuICAgICAgcmVxdWVzdFR5cGVcbiAgICApO1xuXG4gICAgY29uc3QgdXNlclRvQml0R29HU2hhcmUgPSBhd2FpdCBjcmVhdGVVc2VyVG9CaXRHb0dTaGFyZShcbiAgICAgIHVzZXJTaWduU2hhcmUsXG4gICAgICBiaXRnb1RvVXNlclJTaGFyZSxcbiAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwuYmFja3VwWVNoYXJlLFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC5iaXRnb1lTaGFyZSxcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCxcbiAgICAgIGJpdGdvVG9Vc2VyQ29tbWl0bWVudFxuICAgICk7XG5cbiAgICBhd2FpdCBzZW5kVXNlclRvQml0Z29HU2hhcmUoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgdXNlclRvQml0R29HU2hhcmUsXG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcGFyYW1zLnJlcUlkLFxuICAgICAgcmVxdWVzdFR5cGVcbiAgICApO1xuXG4gICAgcmV0dXJuIGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1vblB1YiBwb3J0aW9uIG9mIHRoZSBjb21tb25LZXljaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1vbktleWNoYWluXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGNvbW1vbktleWNoYWluOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBCYXNlRWRkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW4pO1xuICB9XG5cbiAgY3JlYXRlVXNlclRvQml0Z29Db21taXRtZW50U2hhcmUoY29tbWl0bWVudDogc3RyaW5nKTogQ29tbWl0bWVudFNoYXJlUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgc2hhcmU6IGNvbW1pdG1lbnQsXG4gICAgICB0eXBlOiBDb21taXRtZW50VHlwZS5DT01NSVRNRU5ULFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVVc2VyVG9CaXRnb0VuY3J5cHRlZFNpZ25lclNoYXJlKGVuY3J5cHRlZFNpZ25lclNoYXJlOiBzdHJpbmcpOiBFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgIHNoYXJlOiBlbmNyeXB0ZWRTaWduZXJTaGFyZSxcbiAgICAgIHR5cGU6IEVuY3J5cHRlZFNpZ25lclNoYXJlVHlwZS5FTkNSWVBURURfU0lHTkVSX1NIQVJFLFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVVc2VyVG9CaXRnb0VuY3J5cHRlZFJTaGFyZShlbmNyeXB0ZWRSU2hhcmU6IHN0cmluZyk6IEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgc2hhcmU6IGVuY3J5cHRlZFJTaGFyZSxcbiAgICAgIHR5cGU6IEVuY3J5cHRlZFNpZ25lclNoYXJlVHlwZS5FTkNSWVBURURfUl9TSEFSRSxcbiAgICB9O1xuICB9XG59XG4vKipcbiAqIEBkZXByZWNhdGVkIC0gdXNlIEVkZHNhVXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFRzc1V0aWxzID0gRWRkc2FVdGlscztcbiJdfQ==
@@ -98,7 +98,7 @@ export declare class EddsaMPCv2Utils extends BaseEddsaUtils {
98
98
  * @param encryptedKeyShare encrypted user or backup keycard
99
99
  * @param walletPassphrase passphrase used to encrypt the keycard
100
100
  * @param bitgo optional BitGoBase instance; when provided, decrypts via
101
- * bitgo.decryptAsync (supports both v1 SJCL and v2 Argon2id envelopes);
101
+ * bitgo.decrypt (supports both v1 SJCL and v2 Argon2id envelopes);
102
102
  * when absent, falls back to sjcl.decrypt (v1 only)
103
103
  */
104
104
  export declare function isEddsaMpcV1SigningMaterial(encryptedKeyShare: string, walletPassphrase: string, bitgo?: BitGoBase): Promise<boolean>;
@@ -122,13 +122,13 @@ export declare function getEddsaMpcV2RecoveryKeySharesFromReducedKey(encryptedUs
122
122
  * Ed25519 signature against the public key derived from the common keychain.
123
123
  *
124
124
  * @param message raw bytes to sign
125
- * @param derivationPath BIP-32-style derivation path, e.g. `"m/0/0"`
125
+ * @param derivationPath BIP-32-style derivation path, e.g. `"m/0"`
126
126
  * @param userKeyShare opaque MPS signing key-share bytes for the user party
127
127
  * @param backupKeyShare opaque MPS signing key-share bytes for the backup party
128
128
  * @param commonKeyChain 128-hex-char string: 32-byte pub + 32-byte rootChainCode
129
129
  * @returns 64-byte Ed25519 signature Buffer
130
130
  */
131
- export declare function signRecoveryEddsaMPCv2(message: Buffer, derivationPath: string, userKeyShare: Buffer, backupKeyShare: Buffer, commonKeyChain: string): Buffer;
131
+ export declare function signRecoveryEddsaMPCv2(message: Buffer, derivationPath: string, userKeyShare: Buffer, backupKeyShare: Buffer, commonKeyChain: string): Promise<Buffer>;
132
132
  export declare const EddsaMPCv2RecoveryFunctions: {
133
133
  isEddsaMpcV1SigningMaterial: typeof isEddsaMpcV1SigningMaterial;
134
134
  getEddsaMpcV2RecoveryKeySharesFromReducedKey: typeof getEddsaMpcV2RecoveryKeySharesFromReducedKey;
@@ -1 +1 @@
1
- {"version":3,"file":"eddsaMPCv2.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/eddsa/eddsaMPCv2.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eddsaMPCv2.d.ts","sourceRoot":"","sources":["../../../../../../src/bitgo/utils/tss/eddsa/eddsaMPCv2.ts"],"names":[],"mappings":"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"}