@bitgo/sdk-core 2.0.0 → 2.3.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 (70) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +4 -2
  3. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  4. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +9 -5
  5. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +1 -0
  6. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  7. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  8. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +5 -5
  9. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  10. package/dist/src/bitgo/baseCoin/baseCoin.js +4 -4
  11. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +11 -3
  12. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  13. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  14. package/dist/src/bitgo/environments.d.ts +1 -0
  15. package/dist/src/bitgo/environments.d.ts.map +1 -1
  16. package/dist/src/bitgo/environments.js +6 -4
  17. package/dist/src/bitgo/keychain/iKeychains.d.ts +7 -6
  18. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  19. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  20. package/dist/src/bitgo/keychain/keychains.js +2 -1
  21. package/dist/src/bitgo/staking/iStakingWallet.d.ts +2 -0
  22. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  23. package/dist/src/bitgo/staking/iStakingWallet.js +1 -1
  24. package/dist/src/bitgo/staking/stakingWallet.d.ts +11 -2
  25. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  26. package/dist/src/bitgo/staking/stakingWallet.js +39 -14
  27. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +10 -1
  28. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  29. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +23 -5
  30. package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -5
  31. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  32. package/dist/src/bitgo/utils/mpcUtils.js +47 -16
  33. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +20 -4
  34. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  35. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +52 -4
  36. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +67 -11
  37. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  38. package/dist/src/bitgo/utils/tss/baseTypes.js +8 -2
  39. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +34 -5
  40. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  41. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +228 -25
  42. package/dist/src/bitgo/wallet/iWallet.d.ts +39 -13
  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 +2 -0
  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 +19 -16
  49. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  50. package/dist/src/bitgo/wallet/wallet.js +112 -30
  51. package/dist/src/bitgo/wallet/wallets.d.ts +1 -0
  52. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  53. package/dist/src/bitgo/wallet/wallets.js +9 -2
  54. package/dist/src/coins/fiateur.d.ts +1 -1
  55. package/dist/src/coins/fiateur.d.ts.map +1 -1
  56. package/dist/src/coins/fiateur.js +2 -2
  57. package/dist/src/coins/fiatgbp.d.ts +1 -1
  58. package/dist/src/coins/fiatgbp.d.ts.map +1 -1
  59. package/dist/src/coins/fiatgbp.js +2 -2
  60. package/dist/src/coins/fiatusd.d.ts +1 -1
  61. package/dist/src/coins/fiatusd.d.ts.map +1 -1
  62. package/dist/src/coins/fiatusd.js +2 -2
  63. package/dist/src/coins/ofc.d.ts +1 -1
  64. package/dist/src/coins/ofc.d.ts.map +1 -1
  65. package/dist/src/coins/ofc.js +2 -2
  66. package/dist/src/coins/susd.d.ts +1 -1
  67. package/dist/src/coins/susd.d.ts.map +1 -1
  68. package/dist/src/coins/susd.js +2 -2
  69. package/dist/tsconfig.tsbuildinfo +428 -316
  70. package/package.json +6 -5
@@ -1,10 +1,32 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
23
  };
5
24
  Object.defineProperty(exports, "__esModule", { value: true });
6
25
  exports.EcdsaUtils = void 0;
26
+ const bs58 = __importStar(require("bs58"));
7
27
  const tss_1 = require("../../../../account-lib/mpc/tss");
28
+ const util_1 = require("../../../../account-lib/mpc/util");
29
+ const openpgp = __importStar(require("openpgp"));
8
30
  const ecdsa_1 = __importDefault(require("../../../tss/ecdsa"));
9
31
  const baseTSSUtils_1 = __importDefault(require("../baseTSSUtils"));
10
32
  const baseTypes_1 = require("../baseTypes");
@@ -12,6 +34,8 @@ const common_1 = require("../../../tss/common");
12
34
  const types_1 = require("../../../tss/ecdsa/types");
13
35
  const opengpgUtils_1 = require("../../opengpgUtils");
14
36
  const assert_1 = __importDefault(require("assert"));
37
+ const utxo_lib_1 = require("@bitgo/utxo-lib");
38
+ const ecdsa_2 = require("../../../tss/ecdsa/ecdsa");
15
39
  const encryptNShare = ecdsa_1.default.encryptNShare;
16
40
  /** @inheritdoc */
17
41
  class EcdsaUtils extends baseTSSUtils_1.default {
@@ -33,17 +57,53 @@ class EcdsaUtils extends baseTSSUtils_1.default {
33
57
  }
34
58
  return this.bitgoPublicGpgKey;
35
59
  }
60
+ /**
61
+ * Gets the common public key from commonKeychain.
62
+ *
63
+ * @param {String} commonKeychain common key chain between n parties
64
+ * @returns {string} encoded public key
65
+ */
66
+ static getPublicKeyFromCommonKeychain(commonKeychain) {
67
+ if (commonKeychain.length !== 130) {
68
+ throw new Error(`Invalid commonKeychain length, expected 130, got ${commonKeychain.length}`);
69
+ }
70
+ const commonPubHexStr = commonKeychain.slice(0, 66);
71
+ return bs58.encode(Buffer.from(commonPubHexStr, 'hex'));
72
+ }
73
+ async finalizeBitgoHeldBackupKeyShare(keyId, commonKeychain, userKeyShare, bitgoKeychain) {
74
+ var _a;
75
+ const bitgoGpgKey = await this.getBitgoPublicGpgKey();
76
+ const encryptedUserToBackupShare = await encryptNShare(userKeyShare, 2, bitgoGpgKey.armor());
77
+ const bitgoToBackupKeyShare = (_a = bitgoKeychain.keyShares) === null || _a === void 0 ? void 0 : _a.find((keyShare) => keyShare.from === 'bitgo' && keyShare.to === 'backup');
78
+ assert_1.default(bitgoToBackupKeyShare);
79
+ return await this.bitgo
80
+ .put(this.baseCoin.url(`/krs/backupkeys/${keyId}`))
81
+ .send({
82
+ commonKeychain,
83
+ keyShares: [
84
+ {
85
+ from: 'user',
86
+ to: 'backup',
87
+ publicShare: userKeyShare.nShares[2].y,
88
+ privateShare: encryptedUserToBackupShare.encryptedPrivateShare,
89
+ },
90
+ bitgoToBackupKeyShare,
91
+ ],
92
+ })
93
+ .result();
94
+ }
36
95
  /** @inheritdoc */
37
96
  async createKeychains(params) {
38
97
  const MPC = new tss_1.Ecdsa();
39
98
  const m = 2;
40
99
  const n = 3;
41
100
  const userKeyShare = await MPC.keyShare(1, m, n);
42
- const backupKeyShare = await MPC.keyShare(2, m, n);
43
101
  const userGpgKey = await opengpgUtils_1.generateGPGKeyPair('secp256k1');
44
- const bitgoKeychain = await this.createBitgoKeychain(userGpgKey, userKeyShare, backupKeyShare, params.enterprise);
45
- const userKeychainPromise = this.createParticipantKeychain(userGpgKey, 1, userKeyShare, backupKeyShare, bitgoKeychain, params.passphrase, params.originalPasscodeEncryptionCode);
46
- const backupKeychainPromise = this.createParticipantKeychain(userGpgKey, 2, userKeyShare, backupKeyShare, bitgoKeychain, params.passphrase);
102
+ const isThirdPartyBackup = this.isValidThirdPartyBackupProvider(params.backupProvider);
103
+ const backupKeyShare = await this.createBackupKeyShares(isThirdPartyBackup, userGpgKey);
104
+ const bitgoKeychain = await this.createBitgoKeychain(userGpgKey, userKeyShare, backupKeyShare, params.enterprise, isThirdPartyBackup);
105
+ const userKeychainPromise = this.createUserKeychain(userGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, params.passphrase, params.originalPasscodeEncryptionCode, isThirdPartyBackup);
106
+ const backupKeychainPromise = this.createBackupKeychain(userGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, params.passphrase, params.backupProvider);
47
107
  const [userKeychain, backupKeychain] = await Promise.all([userKeychainPromise, backupKeychainPromise]);
48
108
  return {
49
109
  userKeychain,
@@ -51,18 +111,62 @@ class EcdsaUtils extends baseTSSUtils_1.default {
51
111
  bitgoKeychain,
52
112
  };
53
113
  }
54
- createUserKeychain(userGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode) {
55
- return this.createParticipantKeychain(userGpgKey, 1, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode);
114
+ /**
115
+ * If a third party backup is requested, it will create backup shares from
116
+ * a third party (BitGo as of now), otherwise the key shares will be client generated
117
+ */
118
+ async createBackupKeyShares(isThirdPartyBackup = false, userGpgPubKey) {
119
+ let backupKeyShare;
120
+ if (isThirdPartyBackup) {
121
+ const bitgoHeldBackupKeyShares = await this.createBitgoHeldBackupKeyShare(userGpgPubKey);
122
+ backupKeyShare = {
123
+ bitGoHeldKeyShares: bitgoHeldBackupKeyShares,
124
+ };
125
+ }
126
+ else {
127
+ const MPC = new tss_1.Ecdsa();
128
+ const m = 2;
129
+ const n = 3;
130
+ backupKeyShare = {
131
+ userHeldKeyShare: await MPC.keyShare(2, m, n),
132
+ };
133
+ }
134
+ return backupKeyShare;
135
+ }
136
+ createUserKeychain(userGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode, isThirdPartyBackup = false) {
137
+ var _a;
138
+ if (isThirdPartyBackup && ((_a = backupKeyShare.bitGoHeldKeyShares) === null || _a === void 0 ? void 0 : _a.keyShares)) {
139
+ return this.createUserKeychainFromThirdPartyBackup(userGpgKey, userKeyShare, backupKeyShare.bitGoHeldKeyShares.keyShares, bitgoKeychain, passphrase, originalPasscodeEncryptionCode);
140
+ }
141
+ assert_1.default(backupKeyShare.userHeldKeyShare);
142
+ return this.createParticipantKeychain(userGpgKey, 1, userKeyShare, backupKeyShare.userHeldKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode);
56
143
  }
57
- createBackupKeychain(userGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, passphrase) {
58
- return this.createParticipantKeychain(userGpgKey, 2, userKeyShare, backupKeyShare, bitgoKeychain, passphrase);
144
+ async createBackupKeychain(userGpgKey, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, backupProvider) {
145
+ var _a;
146
+ if (this.isValidThirdPartyBackupProvider(backupProvider) && ((_a = backupKeyShare.bitGoHeldKeyShares) === null || _a === void 0 ? void 0 : _a.keyShares)) {
147
+ assert_1.default(bitgoKeychain.commonKeychain);
148
+ const finalizedBackupKeyShare = await this.finalizeBitgoHeldBackupKeyShare(backupKeyShare.bitGoHeldKeyShares.id, bitgoKeychain.commonKeychain, userKeyShare, bitgoKeychain);
149
+ if (finalizedBackupKeyShare.commonKeychain !== bitgoKeychain.commonKeychain) {
150
+ throw new Error('Failed to create backup keychain - commonKeychains do not match.');
151
+ }
152
+ const backupKeyParams = {
153
+ source: 'backup',
154
+ keyType: 'tss',
155
+ commonKeychain: finalizedBackupKeyShare.commonKeychain,
156
+ provider: backupProvider !== null && backupProvider !== void 0 ? backupProvider : 'BitGoKRS',
157
+ };
158
+ return await this.baseCoin.keychains().createBackup(backupKeyParams);
159
+ }
160
+ assert_1.default(backupKeyShare.userHeldKeyShare);
161
+ assert_1.default(passphrase);
162
+ return this.createParticipantKeychain(userGpgKey, 2, userKeyShare, backupKeyShare.userHeldKeyShare, bitgoKeychain, passphrase);
59
163
  }
60
164
  /** @inheritdoc */
61
- async createBitgoKeychain(userGpgKey, userKeyShare, backupKeyShare, enterprise) {
165
+ async createBitgoKeychain(userGpgKey, userKeyShare, backupKeyShare, enterprise, isThirdPartyBackup = false) {
62
166
  const bitgoPublicGpgKey = await this.getBitgoPublicGpgKey();
63
167
  const recipientIndex = 3;
64
168
  const userToBitgoShare = await encryptNShare(userKeyShare, recipientIndex, bitgoPublicGpgKey.armor());
65
- const backupToBitgoShare = await encryptNShare(backupKeyShare, recipientIndex, bitgoPublicGpgKey.armor());
169
+ const backupToBitgoShare = await this.getBackupEncryptedNShare(backupKeyShare, recipientIndex, bitgoPublicGpgKey.armor(), isThirdPartyBackup);
66
170
  const createBitGoMPCParams = {
67
171
  keyType: 'tss',
68
172
  source: 'bitgo',
@@ -86,8 +190,88 @@ class EcdsaUtils extends baseTSSUtils_1.default {
86
190
  backupGPGPublicKey: userGpgKey.publicKey,
87
191
  enterprise: enterprise,
88
192
  };
89
- const keychains = await this.baseCoin.keychains().add(createBitGoMPCParams);
90
- return keychains;
193
+ return await this.baseCoin.keychains().add(createBitGoMPCParams);
194
+ }
195
+ /**
196
+ * This builds the relevant backup encryptedNShare based on whether the
197
+ * backup key is user or third party generated
198
+ * @param backupShare can either have key shares from the user or third party
199
+ * @param recipientIndex index of the party receiving the backup shares
200
+ * @param recipientGpgPublicArmor gpg armor of the party receiving the backup shares
201
+ * @param isThirdPartyBackup whether the backup is generated by third party
202
+ */
203
+ async getBackupEncryptedNShare(backupShare, recipientIndex, recipientGpgPublicArmor, isThirdPartyBackup = false) {
204
+ var _a;
205
+ let backupToBitgoShare;
206
+ if (isThirdPartyBackup && ((_a = backupShare.bitGoHeldKeyShares) === null || _a === void 0 ? void 0 : _a.keyShares)) {
207
+ const backupToOtherApiShare = backupShare.bitGoHeldKeyShares.keyShares.find((keyShare) => keyShare.from === 'backup' && keyShare.to === ecdsa_2.getParticipantFromIndex(recipientIndex));
208
+ if (!backupToOtherApiShare) {
209
+ throw new Error('Missing Backup to Bitgo key share');
210
+ }
211
+ // Since backup is from a third party, it is already encrypted
212
+ backupToBitgoShare = await ecdsa_2.buildNShareFromAPIKeyShare(backupToOtherApiShare);
213
+ }
214
+ else {
215
+ assert_1.default(backupShare.userHeldKeyShare);
216
+ backupToBitgoShare = await encryptNShare(backupShare.userHeldKeyShare, recipientIndex, recipientGpgPublicArmor);
217
+ }
218
+ return backupToBitgoShare;
219
+ }
220
+ /**
221
+ * This uses the backup key from a third party (bitgo in this case)
222
+ * to create the user keychain via WP.
223
+ */
224
+ async createUserKeychainFromThirdPartyBackup(userGpgKey, userKeyShare, backupKeyShares, bitgoKeychain, passphrase, originalPasscodeEncryptionCode) {
225
+ const bitgoKeyShares = bitgoKeychain.keyShares;
226
+ if (!bitgoKeyShares) {
227
+ throw new Error('Missing BitGo key shares');
228
+ }
229
+ if (!bitgoKeychain.commonKeychain) {
230
+ throw new Error(`Missing common key chain: ${bitgoKeychain.commonKeychain}`);
231
+ }
232
+ const bitGoToUserShare = bitgoKeyShares.find((keyShare) => keyShare.from === 'bitgo' && keyShare.to === 'user');
233
+ if (!bitGoToUserShare) {
234
+ throw new Error('Missing BitGo to User key share');
235
+ }
236
+ const backupToUserShare = backupKeyShares.find((keyShare) => keyShare.from === 'backup' && keyShare.to === 'user');
237
+ if (!backupToUserShare) {
238
+ throw new Error('Missing Backup to User key share');
239
+ }
240
+ const bitgoPublicGpgKey = await this.getBitgoPublicGpgKey();
241
+ const backupToUserNShare = await ecdsa_2.buildNShareFromAPIKeyShare(backupToUserShare);
242
+ const bitGoToUserNShare = await ecdsa_2.buildNShareFromAPIKeyShare(bitGoToUserShare);
243
+ const encryptedNShares = [
244
+ {
245
+ nShare: backupToUserNShare,
246
+ recipientPrivateArmor: userGpgKey.privateKey,
247
+ senderPublicArmor: bitgoPublicGpgKey.armor(),
248
+ isbs58Encoded: false,
249
+ },
250
+ {
251
+ nShare: bitGoToUserNShare,
252
+ recipientPrivateArmor: userGpgKey.privateKey,
253
+ senderPublicArmor: bitgoPublicGpgKey.armor(),
254
+ isbs58Encoded: false,
255
+ },
256
+ ];
257
+ const userCombinedKey = await ecdsa_1.default.createCombinedKey(userKeyShare, encryptedNShares, bitgoKeychain.commonKeychain);
258
+ if (userCombinedKey.commonKeychain !== bitgoKeychain.commonKeychain) {
259
+ throw new Error('Failed to create user keychain - commonKeychains do not match.');
260
+ }
261
+ const prv = JSON.stringify(userCombinedKey.signingMaterial);
262
+ const userKeychainParams = {
263
+ source: 'user',
264
+ keyType: 'tss',
265
+ commonKeychain: userCombinedKey.commonKeychain,
266
+ prv: prv,
267
+ encryptedPrv: this.bitgo.encrypt({
268
+ input: prv,
269
+ password: passphrase,
270
+ }),
271
+ originalPasscodeEncryptionCode,
272
+ };
273
+ const keychains = this.baseCoin.keychains();
274
+ return await keychains.add(userKeychainParams);
91
275
  }
92
276
  /** @inheritdoc */
93
277
  async createParticipantKeychain(userGpgKey, recipientIndex, userKeyShare, backupKeyShare, bitgoKeychain, passphrase, originalPasscodeEncryptionCode) {
@@ -98,24 +282,24 @@ class EcdsaUtils extends baseTSSUtils_1.default {
98
282
  if (!bitgoKeychain.commonKeychain) {
99
283
  throw new Error(`Missing common key chain: ${bitgoKeychain.commonKeychain}`);
100
284
  }
101
- let user;
285
+ let recipient;
102
286
  let keyShare;
103
287
  let otherShare;
104
288
  if (recipientIndex === 1) {
105
289
  keyShare = userKeyShare;
106
290
  otherShare = backupKeyShare;
107
- user = 'user';
291
+ recipient = 'user';
108
292
  }
109
293
  else if (recipientIndex === 2) {
110
294
  keyShare = backupKeyShare;
111
295
  otherShare = userKeyShare;
112
- user = 'backup';
296
+ recipient = 'backup';
113
297
  }
114
298
  else {
115
299
  throw new Error('Invalid user index');
116
300
  }
117
- const bitGoToUserShare = bitgoKeyShares.find((keyShare) => keyShare.from === 'bitgo' && keyShare.to === user);
118
- if (!bitGoToUserShare) {
301
+ const bitGoToRecipientShare = bitgoKeyShares.find((keyShare) => keyShare.from === 'bitgo' && keyShare.to === recipient);
302
+ if (!bitGoToRecipientShare) {
119
303
  throw new Error('Missing BitGo to User key share');
120
304
  }
121
305
  const bitgoPublicGpgKey = await this.getBitgoPublicGpgKey();
@@ -130,9 +314,9 @@ class EcdsaUtils extends baseTSSUtils_1.default {
130
314
  nShare: {
131
315
  i: recipientIndex,
132
316
  j: 3,
133
- publicShare: bitGoToUserShare.publicShare,
134
- encryptedPrivateShare: bitGoToUserShare.privateShare,
135
- n: bitGoToUserShare.n,
317
+ publicShare: bitGoToRecipientShare.publicShare,
318
+ encryptedPrivateShare: bitGoToRecipientShare.privateShare,
319
+ n: bitGoToRecipientShare.n,
136
320
  },
137
321
  recipientPrivateArmor: userGpgKey.privateKey,
138
322
  senderPublicArmor: bitgoPublicGpgKey.armor(),
@@ -142,7 +326,7 @@ class EcdsaUtils extends baseTSSUtils_1.default {
142
326
  const userCombinedKey = await ecdsa_1.default.createCombinedKey(keyShare, encryptedNShares, bitgoKeychain.commonKeychain);
143
327
  const prv = JSON.stringify(userCombinedKey.signingMaterial);
144
328
  const userKeychainParams = {
145
- source: user,
329
+ source: recipient,
146
330
  keyType: 'tss',
147
331
  commonKeychain: bitgoKeychain.commonKeychain,
148
332
  prv: prv,
@@ -188,10 +372,29 @@ class EcdsaUtils extends baseTSSUtils_1.default {
188
372
  userSigningMaterial.bitgoNShare,
189
373
  userSigningMaterial.backupNShare,
190
374
  ]);
375
+ const threshold = 2;
376
+ const numShares = 3;
377
+ const uShares = tss_1.Ecdsa.shamir.split(BigInt(userSigningMaterial.pShare.uu), threshold, numShares);
191
378
  const userSignShare = await ecdsa_1.default.createUserSignShare(signingKey.xShare, signingKey.yShares[3]);
192
- const signerShare = userSigningMaterial.bitgoNShare.u + userSigningMaterial.bitgoNShare.chaincode;
379
+ let u = util_1.bigIntToBufferBE(uShares[3], 32).toString('hex');
380
+ while (u.length < 64) {
381
+ u = '0' + u;
382
+ }
383
+ let chaincode = userSigningMaterial.bitgoNShare.chaincode;
384
+ while (chaincode.length < 64) {
385
+ chaincode = '0' + chaincode;
386
+ }
387
+ const signerShare = utxo_lib_1.bip32.fromPrivateKey(Buffer.from(u, 'hex'), Buffer.from(chaincode, 'hex')).toBase58();
193
388
  const bitgoGpgKey = await opengpgUtils_1.getBitgoGpgPubKey(this.bitgo);
194
- const encryptedSignerShare = await opengpgUtils_1.encryptText(signerShare, bitgoGpgKey);
389
+ const encryptedSignerShare = (await openpgp.encrypt({
390
+ message: await openpgp.createMessage({
391
+ text: signerShare,
392
+ }),
393
+ config: {
394
+ rejectCurves: new Set(),
395
+ },
396
+ encryptionKeys: [bitgoGpgKey],
397
+ }));
195
398
  const bitgoToUserAShare = (await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequestId, requestType, types_1.SendShareType.KShare, userSignShare.kShare, encryptedSignerShare));
196
399
  const userGammaAndMuShares = await ecdsa_1.default.createUserGammaAndMuShare(userSignShare.wShare, bitgoToUserAShare);
197
400
  const userOmicronAndDeltaShare = await ecdsa_1.default.createUserOmicronAndDeltaShare(userGammaAndMuShares.gShare);
@@ -200,7 +403,7 @@ class EcdsaUtils extends baseTSSUtils_1.default {
200
403
  const bitgoToUserDShare = (await ecdsa_1.default.sendShareToBitgo(this.bitgo, this.wallet.id(), txRequestId, requestType, types_1.SendShareType.MUShare, { muShare, dShare, i: muShare.i }));
201
404
  let signablePayload;
202
405
  if (requestType === baseTypes_1.RequestType.tx) {
203
- signablePayload = Buffer.from(txRequestResolved.transactions[0].unsignedTx.serializedTxHex, 'hex');
406
+ signablePayload = Buffer.from(txRequestResolved.transactions[0].unsignedTx.signableHex, 'hex');
204
407
  }
205
408
  else if (requestType === baseTypes_1.RequestType.message) {
206
409
  assert_1.default((_a = txRequestResolved.unsignedMessages) === null || _a === void 0 ? void 0 : _a[0]);
@@ -232,4 +435,4 @@ class EcdsaUtils extends baseTSSUtils_1.default {
232
435
  }
233
436
  }
234
437
  exports.EcdsaUtils = EcdsaUtils;
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlEQUErRDtBQUkvRCwrREFBb0U7QUFFcEUsbUVBQTJDO0FBRTNDLDRDQUFpRTtBQUNqRSxnREFBbUQ7QUFDbkQsb0RBQXlFO0FBQ3pFLHFEQUF3RjtBQUd4RixvREFBNEI7QUFFNUIsTUFBTSxhQUFhLEdBQUcsZUFBWSxDQUFDLGFBQWEsQ0FBQztBQUVqRCxrQkFBa0I7QUFDbEIsTUFBYSxVQUFXLFNBQVEsc0JBQXNCO0lBR3BELFlBQVksS0FBZ0IsRUFBRSxRQUFtQixFQUFFLE1BQWdCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBSHpCLHNCQUFpQixHQUE0QixTQUFTLENBQUM7UUFJN0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxnQ0FBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLGdDQUFnQztZQUNoQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2FBQ2xEO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFJckI7UUFDQyxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQUssRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVaLE1BQU0sWUFBWSxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sY0FBYyxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sVUFBVSxHQUFHLE1BQU0saUNBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFekQsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUN4RCxVQUFVLEVBQ1YsQ0FBQyxFQUNELFlBQVksRUFDWixjQUFjLEVBQ2QsYUFBYSxFQUNiLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyw4QkFBOEIsQ0FDdEMsQ0FBQztRQUNGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUMxRCxVQUFVLEVBQ1YsQ0FBQyxFQUNELFlBQVksRUFDWixjQUFjLEVBQ2QsYUFBYSxFQUNiLE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUM7UUFFRixNQUFNLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUV2RyxPQUFPO1lBQ0wsWUFBWTtZQUNaLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0IsQ0FDaEIsVUFBcUMsRUFDckMsWUFBc0IsRUFDdEIsY0FBd0IsRUFDeEIsYUFBdUIsRUFDdkIsVUFBa0IsRUFDbEIsOEJBQXNDO1FBRXRDLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUNuQyxVQUFVLEVBQ1YsQ0FBQyxFQUNELFlBQVksRUFDWixjQUFjLEVBQ2QsYUFBYSxFQUNiLFVBQVUsRUFDViw4QkFBOEIsQ0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFRCxvQkFBb0IsQ0FDbEIsVUFBcUMsRUFDckMsWUFBc0IsRUFDdEIsY0FBd0IsRUFDeEIsYUFBdUIsRUFDdkIsVUFBa0I7UUFFbEIsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsVUFBcUMsRUFDckMsWUFBc0IsRUFDdEIsY0FBd0IsRUFDeEIsVUFBbUI7UUFFbkIsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN6QixNQUFNLGdCQUFnQixHQUFHLE1BQU0sYUFBYSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUV0RyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sYUFBYSxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUUxRyxNQUFNLG9CQUFvQixHQUF1QjtZQUMvQyxPQUFPLEVBQUUsS0FBZ0I7WUFDekIsTUFBTSxFQUFFLE9BQU87WUFDZixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osRUFBRSxFQUFFLE9BQU87b0JBQ1gsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVc7b0JBQ3pDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxxQkFBcUI7b0JBQ3BELENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUN0QjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsUUFBUTtvQkFDZCxFQUFFLEVBQUUsT0FBTztvQkFDWCxXQUFXLEVBQUUsa0JBQWtCLENBQUMsV0FBVztvQkFDM0MsWUFBWSxFQUFFLGtCQUFrQixDQUFDLHFCQUFxQjtvQkFDdEQsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7aUJBQ3hCO2FBQ0Y7WUFDRCxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsU0FBUztZQUN0QyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsU0FBUztZQUN4QyxVQUFVLEVBQUUsVUFBVTtTQUN2QixDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsS0FBSyxDQUFDLHlCQUF5QixDQUM3QixVQUE2QyxFQUM3QyxjQUFzQixFQUN0QixZQUFzQixFQUN0QixjQUF3QixFQUN4QixhQUF1QixFQUN2QixVQUFrQixFQUNsQiw4QkFBdUM7UUFFdkMsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUMvQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUM3QztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQzlFO1FBRUQsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxRQUFrQixDQUFDO1FBQ3ZCLElBQUksVUFBb0IsQ0FBQztRQUN6QixJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsUUFBUSxHQUFHLFlBQVksQ0FBQztZQUN4QixVQUFVLEdBQUcsY0FBYyxDQUFDO1lBQzVCLElBQUksR0FBRyxNQUFNLENBQUM7U0FDZjthQUFNLElBQUksY0FBYyxLQUFLLENBQUMsRUFBRTtZQUMvQixRQUFRLEdBQUcsY0FBYyxDQUFDO1lBQzFCLFVBQVUsR0FBRyxZQUFZLENBQUM7WUFDMUIsSUFBSSxHQUFHLFFBQVEsQ0FBQztTQUNqQjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzlHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDcEQ7UUFFRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFNUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLGFBQWEsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRyxNQUFNLGdCQUFnQixHQUF3QjtZQUM1QztnQkFDRSxNQUFNLEVBQUUsaUJBQWlCO2dCQUN6QixxQkFBcUIsRUFBRSxVQUFVLENBQUMsVUFBVTtnQkFDNUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLFNBQVM7YUFDeEM7WUFDRDtnQkFDRSxNQUFNLEVBQUU7b0JBQ04sQ0FBQyxFQUFFLGNBQWM7b0JBQ2pCLENBQUMsRUFBRSxDQUFDO29CQUNKLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxXQUFXO29CQUN6QyxxQkFBcUIsRUFBRSxnQkFBZ0IsQ0FBQyxZQUFZO29CQUNwRCxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBRTtpQkFDdkI7Z0JBQ0QscUJBQXFCLEVBQUUsVUFBVSxDQUFDLFVBQVU7Z0JBQzVDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRTtnQkFDNUMsYUFBYSxFQUFFLEtBQUs7YUFDckI7U0FDRixDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsTUFBTSxlQUFZLENBQUMsaUJBQWlCLENBQzFELFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsYUFBYSxDQUFDLGNBQWMsQ0FDN0IsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzVELE1BQU0sa0JBQWtCLEdBQUc7WUFDekIsTUFBTSxFQUFFLElBQUk7WUFDWixPQUFPLEVBQUUsS0FBZ0I7WUFDekIsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjO1lBQzVDLEdBQUcsRUFBRSxHQUFHO1lBQ1IsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUMvQixLQUFLLEVBQUUsR0FBRztnQkFDVixRQUFRLEVBQUUsVUFBVTthQUNyQixDQUFDO1lBQ0YsOEJBQThCO1NBQy9CLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUNWLGNBQWMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNwSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFpQixFQUFFLFdBQXdCOztRQUN2RSxJQUFJLGlCQUE0QixDQUFDO1FBQ2pDLElBQUksV0FBbUIsQ0FBQztRQUV4QixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUVsQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNqQyxpQkFBaUIsR0FBRyxNQUFNLHFCQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2hGLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7U0FDN0M7YUFBTTtZQUNMLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztZQUM5QixXQUFXLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQztTQUNyQztRQUVELE1BQU0sbUJBQW1CLEdBQXFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUM1RDtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksV0FBSyxFQUFFLENBQUM7UUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUU7WUFDNUQsbUJBQW1CLENBQUMsV0FBVztZQUMvQixtQkFBbUIsQ0FBQyxZQUFZO1NBQ2pDLENBQUMsQ0FBQztRQUVILE1BQU0sYUFBYSxHQUFHLE1BQU0sZUFBWSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUNsRyxNQUFNLFdBQVcsR0FBRyxNQUFNLGdDQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sMEJBQVcsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFekUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQU0sZUFBWSxDQUFDLGdCQUFnQixDQUM1RCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQ2hCLFdBQVcsRUFDWCxXQUFXLEVBQ1gscUJBQWEsQ0FBQyxNQUFNLEVBQ3BCLGFBQWEsQ0FBQyxNQUFNLEVBQ3BCLG9CQUFvQixDQUNyQixDQUFXLENBQUM7UUFFYixNQUFNLG9CQUFvQixHQUFHLE1BQU0sZUFBWSxDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNuSCxNQUFNLHdCQUF3QixHQUFHLE1BQU0sZUFBWSxDQUFDLDhCQUE4QixDQUNoRixvQkFBb0IsQ0FBQyxNQUFzQixDQUM1QyxDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsT0FBUSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFDLE1BQU0sQ0FBQztRQUMvQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxlQUFZLENBQUMsZ0JBQWdCLENBQzVELElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFDaEIsV0FBVyxFQUNYLFdBQVcsRUFDWCxxQkFBYSxDQUFDLE9BQU8sRUFDckIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQ2xDLENBQVcsQ0FBQztRQUViLElBQUksZUFBZSxDQUFDO1FBRXBCLElBQUksV0FBVyxLQUFLLHVCQUFXLENBQUMsRUFBRSxFQUFFO1lBQ2xDLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3BHO2FBQU0sSUFBSSxXQUFXLEtBQUssdUJBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDOUMsZ0JBQU0sQ0FBQyxNQUFBLGlCQUFpQixDQUFDLGdCQUFnQiwwQ0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNyRjtRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sZUFBWSxDQUFDLHdCQUF3QixDQUM1RCx3QkFBd0IsQ0FBQyxNQUFNLEVBQy9CLGlCQUFpQixFQUNqQixlQUFlLENBQ2hCLENBQUM7UUFFRixNQUFNLGVBQVksQ0FBQyxnQkFBZ0IsQ0FDakMsSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUNoQixXQUFXLEVBQ1gsV0FBVyxFQUNYLHFCQUFhLENBQUMsTUFBTSxFQUNwQixVQUFVLENBQ1gsQ0FBQztRQUNGLE9BQU8sTUFBTSxxQkFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFpQjtRQUNuQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLHVCQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFpQjtRQUM3QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLHVCQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBaFZELGdDQWdWQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVDRFNBLCBFY2RzYSB9IGZyb20gJy4uLy4uLy4uLy4uL2FjY291bnQtbGliL21wYy90c3MnO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRLZXlQYWlyIH0gZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEtleWNoYWluLCBLZXlUeXBlIH0gZnJvbSAnLi4vLi4vLi4va2V5Y2hhaW4nO1xuaW1wb3J0IEVDRFNBTWV0aG9kcywgeyBFQ0RTQU1ldGhvZFR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VjZHNhJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCBiYXNlVFNTVXRpbHMgZnJvbSAnLi4vYmFzZVRTU1V0aWxzJztcbmltcG9ydCB7IERlY3J5cHRhYmxlTlNoYXJlLCBLZXlTaGFyZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUmVxdWVzdFR5cGUsIFRTU1BhcmFtcywgVHhSZXF1ZXN0IH0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgQVNoYXJlLCBEU2hhcmUsIFNlbmRTaGFyZVR5cGUgfSBmcm9tICcuLi8uLi8uLi90c3MvZWNkc2EvdHlwZXMnO1xuaW1wb3J0IHsgZW5jcnlwdFRleHQsIGdlbmVyYXRlR1BHS2V5UGFpciwgZ2V0Qml0Z29HcGdQdWJLZXkgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IElXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi93YWxsZXQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jb25zdCBlbmNyeXB0TlNoYXJlID0gRUNEU0FNZXRob2RzLmVuY3J5cHROU2hhcmU7XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGNsYXNzIEVjZHNhVXRpbHMgZXh0ZW5kcyBiYXNlVFNTVXRpbHM8S2V5U2hhcmU+IHtcbiAgcHJpdmF0ZSBiaXRnb1B1YmxpY0dwZ0tleTogb3BlbnBncC5LZXkgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbiwgd2FsbGV0PzogSVdhbGxldCkge1xuICAgIHN1cGVyKGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0KTtcbiAgICB0aGlzLnNldEJpdGdvR3BnUHViS2V5KGJpdGdvKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0Qml0Z29HcGdQdWJLZXkoYml0Z28pIHtcbiAgICB0aGlzLmJpdGdvUHVibGljR3BnS2V5ID0gYXdhaXQgZ2V0Qml0Z29HcGdQdWJLZXkoYml0Z28pO1xuICB9XG5cbiAgYXN5bmMgZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKTogUHJvbWlzZTxvcGVucGdwLktleT4ge1xuICAgIGlmICghdGhpcy5iaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgLy8gcmV0cnkgZ2V0dGluZyBiaXRnbydzIGdwZyBrZXlcbiAgICAgIGF3YWl0IHRoaXMuc2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgICBpZiAoIXRoaXMuYml0Z29QdWJsaWNHcGdLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBCaXRnbydzIGdwZyBrZXlcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29QdWJsaWNHcGdLZXk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgIGNvbnN0IG0gPSAyO1xuICAgIGNvbnN0IG4gPSAzO1xuXG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gYXdhaXQgTVBDLmtleVNoYXJlKDEsIG0sIG4pO1xuICAgIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gYXdhaXQgTVBDLmtleVNoYXJlKDIsIG0sIG4pO1xuXG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignc2VjcDI1NmsxJyk7XG5cbiAgICBjb25zdCBiaXRnb0tleWNoYWluID0gYXdhaXQgdGhpcy5jcmVhdGVCaXRnb0tleWNoYWluKHVzZXJHcGdLZXksIHVzZXJLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmUsIHBhcmFtcy5lbnRlcnByaXNlKTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIDEsXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICAyLFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFyYW1zLnBhc3NwaHJhc2VcbiAgICApO1xuXG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW3VzZXJLZXljaGFpblByb21pc2UsIGJhY2t1cEtleWNoYWluUHJvbWlzZV0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlVXNlcktleWNoYWluKFxuICAgIHVzZXJHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIDEsXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlXG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZUJhY2t1cEtleWNoYWluKFxuICAgIHVzZXJHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZTogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKHVzZXJHcGdLZXksIDIsIHVzZXJLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmUsIGJpdGdvS2V5Y2hhaW4sIHBhc3NwaHJhc2UpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUJpdGdvS2V5Y2hhaW4oXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKTtcbiAgICBjb25zdCByZWNpcGllbnRJbmRleCA9IDM7XG4gICAgY29uc3QgdXNlclRvQml0Z29TaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUodXNlcktleVNoYXJlLCByZWNpcGllbnRJbmRleCwgYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb0JpdGdvU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKGJhY2t1cEtleVNoYXJlLCByZWNpcGllbnRJbmRleCwgYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSk7XG5cbiAgICBjb25zdCBjcmVhdGVCaXRHb01QQ1BhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIHNvdXJjZTogJ2JpdGdvJyxcbiAgICAgIGtleVNoYXJlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICAgIHRvOiAnYml0Z28nLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiB1c2VyVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIHByaXZhdGVTaGFyZTogdXNlclRvQml0Z29TaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogdXNlclRvQml0Z29TaGFyZS5uLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZnJvbTogJ2JhY2t1cCcsXG4gICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgcHVibGljU2hhcmU6IGJhY2t1cFRvQml0Z29TaGFyZS5wdWJsaWNTaGFyZSxcbiAgICAgICAgICBwcml2YXRlU2hhcmU6IGJhY2t1cFRvQml0Z29TaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYmFja3VwVG9CaXRnb1NoYXJlLm4sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdXNlckdQR1B1YmxpY0tleTogdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBiYWNrdXBHUEdQdWJsaWNLZXk6IHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgZW50ZXJwcmlzZTogZW50ZXJwcmlzZSxcbiAgICB9O1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoY3JlYXRlQml0R29NUENQYXJhbXMpO1xuICAgIHJldHVybiBrZXljaGFpbnM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICB1c2VyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgcmVjaXBpZW50SW5kZXg6IG51bWJlcixcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBiaXRnb0tleVNoYXJlcyA9IGJpdGdvS2V5Y2hhaW4ua2V5U2hhcmVzO1xuICAgIGlmICghYml0Z29LZXlTaGFyZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBrZXkgc2hhcmVzJyk7XG4gICAgfVxuICAgIGlmICghYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGNvbW1vbiBrZXkgY2hhaW46ICR7Yml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbn1gKTtcbiAgICB9XG5cbiAgICBsZXQgdXNlcjogc3RyaW5nO1xuICAgIGxldCBrZXlTaGFyZTogS2V5U2hhcmU7XG4gICAgbGV0IG90aGVyU2hhcmU6IEtleVNoYXJlO1xuICAgIGlmIChyZWNpcGllbnRJbmRleCA9PT0gMSkge1xuICAgICAga2V5U2hhcmUgPSB1c2VyS2V5U2hhcmU7XG4gICAgICBvdGhlclNoYXJlID0gYmFja3VwS2V5U2hhcmU7XG4gICAgICB1c2VyID0gJ3VzZXInO1xuICAgIH0gZWxzZSBpZiAocmVjaXBpZW50SW5kZXggPT09IDIpIHtcbiAgICAgIGtleVNoYXJlID0gYmFja3VwS2V5U2hhcmU7XG4gICAgICBvdGhlclNoYXJlID0gdXNlcktleVNoYXJlO1xuICAgICAgdXNlciA9ICdiYWNrdXAnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlciBpbmRleCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdEdvVG9Vc2VyU2hhcmUgPSBiaXRnb0tleVNoYXJlcy5maW5kKChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gdXNlcik7XG4gICAgaWYgKCFiaXRHb1RvVXNlclNoYXJlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gdG8gVXNlciBrZXkgc2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKTtcblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlclNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShvdGhlclNoYXJlLCByZWNpcGllbnRJbmRleCwgdXNlckdwZ0tleS5wdWJsaWNLZXkpO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZXM6IERlY3J5cHRhYmxlTlNoYXJlW10gPSBbXG4gICAgICB7XG4gICAgICAgIG5TaGFyZTogYmFja3VwVG9Vc2VyU2hhcmUsXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuU2hhcmU6IHtcbiAgICAgICAgICBpOiByZWNpcGllbnRJbmRleCxcbiAgICAgICAgICBqOiAzLFxuICAgICAgICAgIHB1YmxpY1NoYXJlOiBiaXRHb1RvVXNlclNoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIGVuY3J5cHRlZFByaXZhdGVTaGFyZTogYml0R29Ub1VzZXJTaGFyZS5wcml2YXRlU2hhcmUsXG4gICAgICAgICAgbjogYml0R29Ub1VzZXJTaGFyZS5uISxcbiAgICAgICAgfSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgICBpc2JzNThFbmNvZGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IHVzZXJDb21iaW5lZEtleSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVDb21iaW5lZEtleShcbiAgICAgIGtleVNoYXJlLFxuICAgICAgZW5jcnlwdGVkTlNoYXJlcyxcbiAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW5cbiAgICApO1xuXG4gICAgY29uc3QgcHJ2ID0gSlNPTi5zdHJpbmdpZnkodXNlckNvbWJpbmVkS2V5LnNpZ25pbmdNYXRlcmlhbCk7XG4gICAgY29uc3QgdXNlcktleWNoYWluUGFyYW1zID0ge1xuICAgICAgc291cmNlOiB1c2VyLFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgfSksXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgIHJlY2lwaWVudEluZGV4ID09PSAxID8gYXdhaXQga2V5Y2hhaW5zLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpIDogYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBzaWduaW5nIGtleSwgdHhSZXF1ZXN0UmVzb2x2ZWQgYW5kIHR4UmVxdWVzdElkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHsgc3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEVDRFNBU2lnbmluZ1JlcXVlc3RCYXNlUmVzdWx0Pn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKHBhcmFtczogVFNTUGFyYW1zLCByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuICAgIGxldCB0eFJlcXVlc3RJZDogc3RyaW5nO1xuXG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHBydiB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QpO1xuICAgICAgdHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgICB0eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3Qgc2lnbmluZ0tleSA9IE1QQy5rZXlDb21iaW5lKHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsXG4gICAgXSk7XG5cbiAgICBjb25zdCB1c2VyU2lnblNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduU2hhcmUoc2lnbmluZ0tleS54U2hhcmUsIHNpZ25pbmdLZXkueVNoYXJlc1szXSk7XG4gICAgY29uc3Qgc2lnbmVyU2hhcmUgPSB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLnUgKyB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLmNoYWluY29kZTtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gYXdhaXQgZW5jcnlwdFRleHQoc2lnbmVyU2hhcmUsIGJpdGdvR3BnS2V5KTtcblxuICAgIGNvbnN0IGJpdGdvVG9Vc2VyQVNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5LU2hhcmUsXG4gICAgICB1c2VyU2lnblNoYXJlLmtTaGFyZSxcbiAgICAgIGVuY3J5cHRlZFNpZ25lclNoYXJlXG4gICAgKSkgYXMgQVNoYXJlO1xuXG4gICAgY29uc3QgdXNlckdhbW1hQW5kTXVTaGFyZXMgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlckdhbW1hQW5kTXVTaGFyZSh1c2VyU2lnblNoYXJlLndTaGFyZSwgYml0Z29Ub1VzZXJBU2hhcmUpO1xuICAgIGNvbnN0IHVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyT21pY3JvbkFuZERlbHRhU2hhcmUoXG4gICAgICB1c2VyR2FtbWFBbmRNdVNoYXJlcy5nU2hhcmUgYXMgRUNEU0EuR1NoYXJlXG4gICAgKTtcblxuICAgIGNvbnN0IG11U2hhcmUgPSB1c2VyR2FtbWFBbmRNdVNoYXJlcy5tdVNoYXJlITtcbiAgICBjb25zdCBkU2hhcmUgPSB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUuZFNoYXJlO1xuICAgIGNvbnN0IGJpdGdvVG9Vc2VyRFNoYXJlID0gKGF3YWl0IEVDRFNBTWV0aG9kcy5zZW5kU2hhcmVUb0JpdGdvKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMud2FsbGV0LmlkKCksXG4gICAgICB0eFJlcXVlc3RJZCxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgU2VuZFNoYXJlVHlwZS5NVVNoYXJlLFxuICAgICAgeyBtdVNoYXJlLCBkU2hhcmUsIGk6IG11U2hhcmUuaSB9XG4gICAgKSkgYXMgRFNoYXJlO1xuXG4gICAgbGV0IHNpZ25hYmxlUGF5bG9hZDtcblxuICAgIGlmIChyZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHgpIHtcbiAgICAgIHNpZ25hYmxlUGF5bG9hZCA9IEJ1ZmZlci5mcm9tKHR4UmVxdWVzdFJlc29sdmVkLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCwgJ2hleCcpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIGFzc2VydCh0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZE1lc3NhZ2VzPy5bMF0pO1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odHhSZXF1ZXN0UmVzb2x2ZWQudW5zaWduZWRNZXNzYWdlc1swXS5tZXNzYWdlLCAnaGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUub1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJEU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWRcbiAgICApO1xuXG4gICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLlNTaGFyZSxcbiAgICAgIHVzZXJTU2hhcmVcbiAgICApO1xuICAgIHJldHVybiBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXMpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLm1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
438
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IseURBQStEO0FBQy9ELDJEQUFvRTtBQUNwRSxpREFBbUM7QUFHbkMsK0RBQW9FO0FBRXBFLG1FQUEyQztBQUUzQyw0Q0FBMEc7QUFDMUcsZ0RBQW1EO0FBQ25ELG9EQUEwRjtBQUMxRixxREFBMkU7QUFHM0Usb0RBQTRCO0FBQzVCLDhDQUF3QztBQUN4QyxvREFBK0Y7QUFFL0YsTUFBTSxhQUFhLEdBQUcsZUFBWSxDQUFDLGFBQWEsQ0FBQztBQUVqRCxrQkFBa0I7QUFDbEIsTUFBYSxVQUFXLFNBQVEsc0JBQXNCO0lBR3BELFlBQVksS0FBZ0IsRUFBRSxRQUFtQixFQUFFLE1BQWdCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBSHpCLHNCQUFpQixHQUE0QixTQUFTLENBQUM7UUFJN0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxnQ0FBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLGdDQUFnQztZQUNoQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFD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QyxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQ2hCLFdBQVcsRUFDWCxXQUFXLEVBQ1gscUJBQWEsQ0FBQyxNQUFNLEVBQ3BCLFVBQVUsQ0FDWCxDQUFDO1FBQ0YsT0FBTyxNQUFNLHFCQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQWlCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsdUJBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLHVCQUF1QixDQUFDLE1BQWlCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsdUJBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0Y7QUEza0JELGdDQTJrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHsgRUNEU0EsIEVjZHNhIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWIvbXBjL3Rzcyc7XG5pbXBvcnQgeyBiaWdJbnRUb0J1ZmZlckJFIH0gZnJvbSAnLi4vLi4vLi4vLi4vYWNjb3VudC1saWIvbXBjL3V0aWwnO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRLZXlQYWlyIH0gZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBBZGRLZXljaGFpbk9wdGlvbnMsIEFwaUtleVNoYXJlLCBDcmVhdGVCYWNrdXBPcHRpb25zLCBLZXljaGFpbiwgS2V5VHlwZSB9IGZyb20gJy4uLy4uLy4uL2tleWNoYWluJztcbmltcG9ydCBFQ0RTQU1ldGhvZHMsIHsgRUNEU0FNZXRob2RUeXBlcyB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYSc7XG5pbXBvcnQgeyBJQmFzZUNvaW4sIEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQgYmFzZVRTU1V0aWxzIGZyb20gJy4uL2Jhc2VUU1NVdGlscyc7XG5pbXBvcnQgeyBEZWNyeXB0YWJsZU5TaGFyZSwgS2V5U2hhcmUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEJhY2t1cEtleVNoYXJlLCBCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZSwgUmVxdWVzdFR5cGUsIFRTU1BhcmFtcywgVHhSZXF1ZXN0IH0gZnJvbSAnLi4vYmFzZVR5cGVzJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgQVNoYXJlLCBEU2hhcmUsIEVuY3J5cHRlZE5TaGFyZSwgU2VuZFNoYXJlVHlwZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS90eXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdQR0tleVBhaXIsIGdldEJpdGdvR3BnUHViS2V5IH0gZnJvbSAnLi4vLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uLy4uLy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBJV2FsbGV0IH0gZnJvbSAnLi4vLi4vLi4vd2FsbGV0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlLCBnZXRQYXJ0aWNpcGFudEZyb21JbmRleCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lY2RzYS9lY2RzYSc7XG5cbmNvbnN0IGVuY3J5cHROU2hhcmUgPSBFQ0RTQU1ldGhvZHMuZW5jcnlwdE5TaGFyZTtcblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgY2xhc3MgRWNkc2FVdGlscyBleHRlbmRzIGJhc2VUU1NVdGlsczxLZXlTaGFyZT4ge1xuICBwcml2YXRlIGJpdGdvUHVibGljR3BnS2V5OiBvcGVucGdwLktleSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBiYXNlQ29pbjogSUJhc2VDb2luLCB3YWxsZXQ/OiBJV2FsbGV0KSB7XG4gICAgc3VwZXIoYml0Z28sIGJhc2VDb2luLCB3YWxsZXQpO1xuICAgIHRoaXMuc2V0Qml0Z29HcGdQdWJLZXkoYml0Z28pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRCaXRnb0dwZ1B1YktleShiaXRnbykge1xuICAgIHRoaXMuYml0Z29QdWJsaWNHcGdLZXkgPSBhd2FpdCBnZXRCaXRnb0dwZ1B1YktleShiaXRnbyk7XG4gIH1cblxuICBhc3luYyBnZXRCaXRnb1B1YmxpY0dwZ0tleSgpOiBQcm9taXNlPG9wZW5wZ3AuS2V5PiB7XG4gICAgaWYgKCF0aGlzLmJpdGdvUHVibGljR3BnS2V5KSB7XG4gICAgICAvLyByZXRyeSBnZXR0aW5nIGJpdGdvJ3MgZ3BnIGtleVxuICAgICAgYXdhaXQgdGhpcy5zZXRCaXRnb0dwZ1B1YktleSh0aGlzLmJpdGdvKTtcbiAgICAgIGlmICghdGhpcy5iaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IEJpdGdvJ3MgZ3BnIGtleVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb1B1YmxpY0dwZ0tleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjb21tb24gcHVibGljIGtleSBmcm9tIGNvbW1vbktleWNoYWluLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29tbW9uS2V5Y2hhaW4gY29tbW9uIGtleSBjaGFpbiBiZXR3ZWVuIG4gcGFydGllc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBlbmNvZGVkIHB1YmxpYyBrZXlcbiAgICovXG4gIHN0YXRpYyBnZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oY29tbW9uS2V5Y2hhaW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNvbW1vbktleWNoYWluLmxlbmd0aCAhPT0gMTMwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbW9uS2V5Y2hhaW4gbGVuZ3RoLCBleHBlY3RlZCAxMzAsIGdvdCAke2NvbW1vbktleWNoYWluLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgY29tbW9uUHViSGV4U3RyID0gY29tbW9uS2V5Y2hhaW4uc2xpY2UoMCwgNjYpO1xuICAgIHJldHVybiBiczU4LmVuY29kZShCdWZmZXIuZnJvbShjb21tb25QdWJIZXhTdHIsICdoZXgnKSk7XG4gIH1cblxuICBhc3luYyBmaW5hbGl6ZUJpdGdvSGVsZEJhY2t1cEtleVNoYXJlKFxuICAgIGtleUlkOiBzdHJpbmcsXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluXG4gICk6IFByb21pc2U8Qml0Z29IZWxkQmFja3VwS2V5U2hhcmU+IHtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUodXNlcktleVNoYXJlLCAyLCBiaXRnb0dwZ0tleS5hcm1vcigpKTtcbiAgICBjb25zdCBiaXRnb1RvQmFja3VwS2V5U2hhcmUgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcz8uZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gJ2JhY2t1cCdcbiAgICApO1xuICAgIGFzc2VydChiaXRnb1RvQmFja3VwS2V5U2hhcmUpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMuYmFzZUNvaW4udXJsKGAva3JzL2JhY2t1cGtleXMvJHtrZXlJZH1gKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGtleVNoYXJlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZyb206ICd1c2VyJyxcbiAgICAgICAgICAgIHRvOiAnYmFja3VwJyxcbiAgICAgICAgICAgIHB1YmxpY1NoYXJlOiB1c2VyS2V5U2hhcmUublNoYXJlc1syXS55LFxuICAgICAgICAgICAgcHJpdmF0ZVNoYXJlOiBlbmNyeXB0ZWRVc2VyVG9CYWNrdXBTaGFyZS5lbmNyeXB0ZWRQcml2YXRlU2hhcmUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBiaXRnb1RvQmFja3VwS2V5U2hhcmUsXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgYmFja3VwUHJvdmlkZXI/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCBtID0gMjtcbiAgICBjb25zdCBuID0gMztcblxuICAgIGNvbnN0IHVzZXJLZXlTaGFyZSA9IGF3YWl0IE1QQy5rZXlTaGFyZSgxLCBtLCBuKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdzZWNwMjU2azEnKTtcblxuICAgIGNvbnN0IGlzVGhpcmRQYXJ0eUJhY2t1cCA9IHRoaXMuaXNWYWxpZFRoaXJkUGFydHlCYWNrdXBQcm92aWRlcihwYXJhbXMuYmFja3VwUHJvdmlkZXIpO1xuICAgIGNvbnN0IGJhY2t1cEtleVNoYXJlID0gYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBLZXlTaGFyZXMoaXNUaGlyZFBhcnR5QmFja3VwLCB1c2VyR3BnS2V5KTtcblxuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmNyZWF0ZUJpdGdvS2V5Y2hhaW4oXG4gICAgICB1c2VyR3BnS2V5LFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIGlzVGhpcmRQYXJ0eUJhY2t1cFxuICAgICk7XG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuY3JlYXRlVXNlcktleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIGlzVGhpcmRQYXJ0eUJhY2t1cFxuICAgICk7XG4gICAgY29uc3QgYmFja3VwS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5jcmVhdGVCYWNrdXBLZXljaGFpbihcbiAgICAgIHVzZXJHcGdLZXksXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIHBhcmFtcy5iYWNrdXBQcm92aWRlclxuICAgICk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbdXNlcktleWNoYWluUHJvbWlzZSwgYmFja3VwS2V5Y2hhaW5Qcm9taXNlXSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSWYgYSB0aGlyZCBwYXJ0eSBiYWNrdXAgaXMgcmVxdWVzdGVkLCBpdCB3aWxsIGNyZWF0ZSBiYWNrdXAgc2hhcmVzIGZyb21cbiAgICogYSB0aGlyZCBwYXJ0eSAoQml0R28gYXMgb2Ygbm93KSwgb3RoZXJ3aXNlIHRoZSBrZXkgc2hhcmVzIHdpbGwgYmUgY2xpZW50IGdlbmVyYXRlZFxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQmFja3VwS2V5U2hhcmVzKFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlLFxuICAgIHVzZXJHcGdQdWJLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz5cbiAgKTogUHJvbWlzZTxCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGxldCBiYWNrdXBLZXlTaGFyZTogQmFja3VwS2V5U2hhcmU7XG4gICAgaWYgKGlzVGhpcmRQYXJ0eUJhY2t1cCkge1xuICAgICAgY29uc3QgYml0Z29IZWxkQmFja3VwS2V5U2hhcmVzID0gYXdhaXQgdGhpcy5jcmVhdGVCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZSh1c2VyR3BnUHViS2V5KTtcbiAgICAgIGJhY2t1cEtleVNoYXJlID0ge1xuICAgICAgICBiaXRHb0hlbGRLZXlTaGFyZXM6IGJpdGdvSGVsZEJhY2t1cEtleVNoYXJlcyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IE1QQyA9IG5ldyBFY2RzYSgpO1xuICAgICAgY29uc3QgbSA9IDI7XG4gICAgICBjb25zdCBuID0gMztcbiAgICAgIGJhY2t1cEtleVNoYXJlID0ge1xuICAgICAgICB1c2VySGVsZEtleVNoYXJlOiBhd2FpdCBNUEMua2V5U2hhcmUoMiwgbSwgbiksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYmFja3VwS2V5U2hhcmU7XG4gIH1cblxuICBjcmVhdGVVc2VyS2V5Y2hhaW4oXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlOiBCYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAoaXNUaGlyZFBhcnR5QmFja3VwICYmIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcz8ua2V5U2hhcmVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVVc2VyS2V5Y2hhaW5Gcm9tVGhpcmRQYXJ0eUJhY2t1cChcbiAgICAgICAgdXNlckdwZ0tleSxcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiYWNrdXBLZXlTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXMua2V5U2hhcmVzLFxuICAgICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgICBwYXNzcGhyYXNlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICAgICk7XG4gICAgfVxuICAgIGFzc2VydChiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIDEsXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQmFja3VwS2V5Y2hhaW4oXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlOiBCYWNrdXBLZXlTaGFyZSxcbiAgICBiaXRnb0tleWNoYWluOiBLZXljaGFpbixcbiAgICBwYXNzcGhyYXNlPzogc3RyaW5nLFxuICAgIGJhY2t1cFByb3ZpZGVyPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkVGhpcmRQYXJ0eUJhY2t1cFByb3ZpZGVyKGJhY2t1cFByb3ZpZGVyKSAmJiBiYWNrdXBLZXlTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXM/LmtleVNoYXJlcykge1xuICAgICAgYXNzZXJ0KGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgY29uc3QgZmluYWxpemVkQmFja3VwS2V5U2hhcmUgPSBhd2FpdCB0aGlzLmZpbmFsaXplQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAgICAgIGJhY2t1cEtleVNoYXJlLmJpdEdvSGVsZEtleVNoYXJlcy5pZCxcbiAgICAgICAgYml0Z29LZXljaGFpbi5jb21tb25LZXljaGFpbixcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBiaXRnb0tleWNoYWluXG4gICAgICApO1xuICAgICAgaWYgKGZpbmFsaXplZEJhY2t1cEtleVNoYXJlLmNvbW1vbktleWNoYWluICE9PSBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBiYWNrdXAga2V5Y2hhaW4gLSBjb21tb25LZXljaGFpbnMgZG8gbm90IG1hdGNoLicpO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwS2V5UGFyYW1zOiBDcmVhdGVCYWNrdXBPcHRpb25zID0ge1xuICAgICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAgICBrZXlUeXBlOiAndHNzJyxcbiAgICAgICAgY29tbW9uS2V5Y2hhaW46IGZpbmFsaXplZEJhY2t1cEtleVNoYXJlLmNvbW1vbktleWNoYWluLFxuICAgICAgICBwcm92aWRlcjogYmFja3VwUHJvdmlkZXIgPz8gJ0JpdEdvS1JTJyxcbiAgICAgIH07XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoYmFja3VwS2V5UGFyYW1zKTtcbiAgICB9XG4gICAgYXNzZXJ0KGJhY2t1cEtleVNoYXJlLnVzZXJIZWxkS2V5U2hhcmUpO1xuICAgIGFzc2VydChwYXNzcGhyYXNlKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgdXNlckdwZ0tleSxcbiAgICAgIDIsXG4gICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICBiYWNrdXBLZXlTaGFyZS51c2VySGVsZEtleVNoYXJlLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2VcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUJpdGdvS2V5Y2hhaW4oXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJhY2t1cEtleVNoYXJlOiBCYWNrdXBLZXlTaGFyZSxcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nLFxuICAgIGlzVGhpcmRQYXJ0eUJhY2t1cCA9IGZhbHNlXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKTtcbiAgICBjb25zdCByZWNpcGllbnRJbmRleCA9IDM7XG4gICAgY29uc3QgdXNlclRvQml0Z29TaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUodXNlcktleVNoYXJlLCByZWNpcGllbnRJbmRleCwgYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSk7XG5cbiAgICBjb25zdCBiYWNrdXBUb0JpdGdvU2hhcmUgPSBhd2FpdCB0aGlzLmdldEJhY2t1cEVuY3J5cHRlZE5TaGFyZShcbiAgICAgIGJhY2t1cEtleVNoYXJlLFxuICAgICAgcmVjaXBpZW50SW5kZXgsXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgICAgaXNUaGlyZFBhcnR5QmFja3VwXG4gICAgKTtcblxuICAgIGNvbnN0IGNyZWF0ZUJpdEdvTVBDUGFyYW1zOiBBZGRLZXljaGFpbk9wdGlvbnMgPSB7XG4gICAgICBrZXlUeXBlOiAndHNzJyBhcyBLZXlUeXBlLFxuICAgICAgc291cmNlOiAnYml0Z28nLFxuICAgICAga2V5U2hhcmVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiAndXNlcicsXG4gICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgcHVibGljU2hhcmU6IHVzZXJUb0JpdGdvU2hhcmUucHVibGljU2hhcmUsXG4gICAgICAgICAgcHJpdmF0ZVNoYXJlOiB1c2VyVG9CaXRnb1NoYXJlLmVuY3J5cHRlZFByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiB1c2VyVG9CaXRnb1NoYXJlLm4sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmcm9tOiAnYmFja3VwJyxcbiAgICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogYmFja3VwVG9CaXRnb1NoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIHByaXZhdGVTaGFyZTogYmFja3VwVG9CaXRnb1NoYXJlLmVuY3J5cHRlZFByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiBiYWNrdXBUb0JpdGdvU2hhcmUubixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB1c2VyR1BHUHVibGljS2V5OiB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdQR1B1YmxpY0tleTogdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICBlbnRlcnByaXNlOiBlbnRlcnByaXNlLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5hZGQoY3JlYXRlQml0R29NUENQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgYnVpbGRzIHRoZSByZWxldmFudCBiYWNrdXAgZW5jcnlwdGVkTlNoYXJlIGJhc2VkIG9uIHdoZXRoZXIgdGhlXG4gICAqIGJhY2t1cCBrZXkgaXMgdXNlciBvciB0aGlyZCBwYXJ0eSBnZW5lcmF0ZWRcbiAgICogQHBhcmFtIGJhY2t1cFNoYXJlIGNhbiBlaXRoZXIgaGF2ZSBrZXkgc2hhcmVzIGZyb20gdGhlIHVzZXIgb3IgdGhpcmQgcGFydHlcbiAgICogQHBhcmFtIHJlY2lwaWVudEluZGV4IGluZGV4IG9mIHRoZSBwYXJ0eSByZWNlaXZpbmcgdGhlIGJhY2t1cCBzaGFyZXNcbiAgICogQHBhcmFtIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yIGdwZyBhcm1vciBvZiB0aGUgcGFydHkgcmVjZWl2aW5nIHRoZSBiYWNrdXAgc2hhcmVzXG4gICAqIEBwYXJhbSBpc1RoaXJkUGFydHlCYWNrdXAgd2hldGhlciB0aGUgYmFja3VwIGlzIGdlbmVyYXRlZCBieSB0aGlyZCBwYXJ0eVxuICAgKi9cbiAgYXN5bmMgZ2V0QmFja3VwRW5jcnlwdGVkTlNoYXJlKFxuICAgIGJhY2t1cFNoYXJlOiBCYWNrdXBLZXlTaGFyZSxcbiAgICByZWNpcGllbnRJbmRleDogbnVtYmVyLFxuICAgIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yOiBzdHJpbmcsXG4gICAgaXNUaGlyZFBhcnR5QmFja3VwID0gZmFsc2VcbiAgKTogUHJvbWlzZTxFbmNyeXB0ZWROU2hhcmU+IHtcbiAgICBsZXQgYmFja3VwVG9CaXRnb1NoYXJlOiBFbmNyeXB0ZWROU2hhcmU7XG4gICAgaWYgKGlzVGhpcmRQYXJ0eUJhY2t1cCAmJiBiYWNrdXBTaGFyZS5iaXRHb0hlbGRLZXlTaGFyZXM/LmtleVNoYXJlcykge1xuICAgICAgY29uc3QgYmFja3VwVG9PdGhlckFwaVNoYXJlID0gYmFja3VwU2hhcmUuYml0R29IZWxkS2V5U2hhcmVzLmtleVNoYXJlcy5maW5kKFxuICAgICAgICAoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiYWNrdXAnICYmIGtleVNoYXJlLnRvID09PSBnZXRQYXJ0aWNpcGFudEZyb21JbmRleChyZWNpcGllbnRJbmRleClcbiAgICAgICk7XG4gICAgICBpZiAoIWJhY2t1cFRvT3RoZXJBcGlTaGFyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQmFja3VwIHRvIEJpdGdvIGtleSBzaGFyZScpO1xuICAgICAgfVxuICAgICAgLy8gU2luY2UgYmFja3VwIGlzIGZyb20gYSB0aGlyZCBwYXJ0eSwgaXQgaXMgYWxyZWFkeSBlbmNyeXB0ZWRcbiAgICAgIGJhY2t1cFRvQml0Z29TaGFyZSA9IGF3YWl0IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlKGJhY2t1cFRvT3RoZXJBcGlTaGFyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChiYWNrdXBTaGFyZS51c2VySGVsZEtleVNoYXJlKTtcbiAgICAgIGJhY2t1cFRvQml0Z29TaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoYmFja3VwU2hhcmUudXNlckhlbGRLZXlTaGFyZSwgcmVjaXBpZW50SW5kZXgsIHJlY2lwaWVudEdwZ1B1YmxpY0FybW9yKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhY2t1cFRvQml0Z29TaGFyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHVzZXMgdGhlIGJhY2t1cCBrZXkgZnJvbSBhIHRoaXJkIHBhcnR5IChiaXRnbyBpbiB0aGlzIGNhc2UpXG4gICAqIHRvIGNyZWF0ZSB0aGUgdXNlciBrZXljaGFpbiB2aWEgV1AuXG4gICAqL1xuICBhc3luYyBjcmVhdGVVc2VyS2V5Y2hhaW5Gcm9tVGhpcmRQYXJ0eUJhY2t1cChcbiAgICB1c2VyR3BnS2V5OiBvcGVucGdwLlNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgdXNlcktleVNoYXJlOiBLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZXM6IEFwaUtleVNoYXJlW10sXG4gICAgYml0Z29LZXljaGFpbjogS2V5Y2hhaW4sXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgY29uc3QgYml0Z29LZXlTaGFyZXMgPSBiaXRnb0tleWNoYWluLmtleVNoYXJlcztcbiAgICBpZiAoIWJpdGdvS2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28ga2V5IHNoYXJlcycpO1xuICAgIH1cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjb21tb24ga2V5IGNoYWluOiAke2JpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW59YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0R29Ub1VzZXJTaGFyZSA9IGJpdGdvS2V5U2hhcmVzLmZpbmQoKGtleVNoYXJlKSA9PiBrZXlTaGFyZS5mcm9tID09PSAnYml0Z28nICYmIGtleVNoYXJlLnRvID09PSAndXNlcicpO1xuICAgIGlmICghYml0R29Ub1VzZXJTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIHRvIFVzZXIga2V5IHNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFja3VwVG9Vc2VyU2hhcmUgPSBiYWNrdXBLZXlTaGFyZXMuZmluZCgoa2V5U2hhcmUpID0+IGtleVNoYXJlLmZyb20gPT09ICdiYWNrdXAnICYmIGtleVNoYXJlLnRvID09PSAndXNlcicpO1xuICAgIGlmICghYmFja3VwVG9Vc2VyU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCYWNrdXAgdG8gVXNlciBrZXkgc2hhcmUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKTtcblxuICAgIGNvbnN0IGJhY2t1cFRvVXNlck5TaGFyZSA9IGF3YWl0IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlKGJhY2t1cFRvVXNlclNoYXJlKTtcbiAgICBjb25zdCBiaXRHb1RvVXNlck5TaGFyZSA9IGF3YWl0IGJ1aWxkTlNoYXJlRnJvbUFQSUtleVNoYXJlKGJpdEdvVG9Vc2VyU2hhcmUpO1xuICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZXM6IERlY3J5cHRhYmxlTlNoYXJlW10gPSBbXG4gICAgICB7XG4gICAgICAgIG5TaGFyZTogYmFja3VwVG9Vc2VyTlNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksIC8vIHNpbmNlIGJpdGdvIGlzIGFjdGluZyBhcyBCYWNrdXAgS1JTIGZvciBub3dcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuU2hhcmU6IGJpdEdvVG9Vc2VyTlNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCksXG4gICAgICAgIGlzYnM1OEVuY29kZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgdXNlckNvbWJpbmVkS2V5ID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZUNvbWJpbmVkS2V5KFxuICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgZW5jcnlwdGVkTlNoYXJlcyxcbiAgICAgIGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW5cbiAgICApO1xuICAgIGlmICh1c2VyQ29tYmluZWRLZXkuY29tbW9uS2V5Y2hhaW4gIT09IGJpdGdvS2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGtleWNoYWluIC0gY29tbW9uS2V5Y2hhaW5zIGRvIG5vdCBtYXRjaC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcnYgPSBKU09OLnN0cmluZ2lmeSh1c2VyQ29tYmluZWRLZXkuc2lnbmluZ01hdGVyaWFsKTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW5QYXJhbXMgPSB7XG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsXG4gICAgICBjb21tb25LZXljaGFpbjogdXNlckNvbWJpbmVkS2V5LmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgfSksXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIGF3YWl0IGtleWNoYWlucy5hZGQodXNlcktleWNoYWluUGFyYW1zKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBjcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgIHVzZXJHcGdLZXk6IG9wZW5wZ3AuU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICByZWNpcGllbnRJbmRleDogbnVtYmVyLFxuICAgIHVzZXJLZXlTaGFyZTogS2V5U2hhcmUsXG4gICAgYmFja3VwS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGNvbnN0IGJpdGdvS2V5U2hhcmVzID0gYml0Z29LZXljaGFpbi5rZXlTaGFyZXM7XG4gICAgaWYgKCFiaXRnb0tleVNoYXJlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIGtleSBzaGFyZXMnKTtcbiAgICB9XG4gICAgaWYgKCFiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgY29tbW9uIGtleSBjaGFpbjogJHtiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWlufWApO1xuICAgIH1cblxuICAgIGxldCByZWNpcGllbnQ6IHN0cmluZztcbiAgICBsZXQga2V5U2hhcmU6IEtleVNoYXJlO1xuICAgIGxldCBvdGhlclNoYXJlOiBLZXlTaGFyZTtcbiAgICBpZiAocmVjaXBpZW50SW5kZXggPT09IDEpIHtcbiAgICAgIGtleVNoYXJlID0gdXNlcktleVNoYXJlO1xuICAgICAgb3RoZXJTaGFyZSA9IGJhY2t1cEtleVNoYXJlO1xuICAgICAgcmVjaXBpZW50ID0gJ3VzZXInO1xuICAgIH0gZWxzZSBpZiAocmVjaXBpZW50SW5kZXggPT09IDIpIHtcbiAgICAgIGtleVNoYXJlID0gYmFja3VwS2V5U2hhcmU7XG4gICAgICBvdGhlclNoYXJlID0gdXNlcktleVNoYXJlO1xuICAgICAgcmVjaXBpZW50ID0gJ2JhY2t1cCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0R29Ub1JlY2lwaWVudFNoYXJlID0gYml0Z29LZXlTaGFyZXMuZmluZChcbiAgICAgIChrZXlTaGFyZSkgPT4ga2V5U2hhcmUuZnJvbSA9PT0gJ2JpdGdvJyAmJiBrZXlTaGFyZS50byA9PT0gcmVjaXBpZW50XG4gICAgKTtcbiAgICBpZiAoIWJpdEdvVG9SZWNpcGllbnRTaGFyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIEJpdEdvIHRvIFVzZXIga2V5IHNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBhd2FpdCB0aGlzLmdldEJpdGdvUHVibGljR3BnS2V5KCk7XG5cbiAgICBjb25zdCBiYWNrdXBUb1VzZXJTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUob3RoZXJTaGFyZSwgcmVjaXBpZW50SW5kZXgsIHVzZXJHcGdLZXkucHVibGljS2V5KTtcbiAgICBjb25zdCBlbmNyeXB0ZWROU2hhcmVzOiBEZWNyeXB0YWJsZU5TaGFyZVtdID0gW1xuICAgICAge1xuICAgICAgICBuU2hhcmU6IGJhY2t1cFRvVXNlclNoYXJlLFxuICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgblNoYXJlOiB7XG4gICAgICAgICAgaTogcmVjaXBpZW50SW5kZXgsXG4gICAgICAgICAgajogMyxcbiAgICAgICAgICBwdWJsaWNTaGFyZTogYml0R29Ub1JlY2lwaWVudFNoYXJlLnB1YmxpY1NoYXJlLFxuICAgICAgICAgIGVuY3J5cHRlZFByaXZhdGVTaGFyZTogYml0R29Ub1JlY2lwaWVudFNoYXJlLnByaXZhdGVTaGFyZSxcbiAgICAgICAgICBuOiBiaXRHb1RvUmVjaXBpZW50U2hhcmUubiEsXG4gICAgICAgIH0sXG4gICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCB1c2VyQ29tYmluZWRLZXkgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICBrZXlTaGFyZSxcbiAgICAgIGVuY3J5cHRlZE5TaGFyZXMsXG4gICAgICBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluXG4gICAgKTtcblxuICAgIGNvbnN0IHBydiA9IEpTT04uc3RyaW5naWZ5KHVzZXJDb21iaW5lZEtleS5zaWduaW5nTWF0ZXJpYWwpO1xuICAgIGNvbnN0IHVzZXJLZXljaGFpblBhcmFtcyA9IHtcbiAgICAgIHNvdXJjZTogcmVjaXBpZW50LFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluOiBiaXRnb0tleWNoYWluLmNvbW1vbktleWNoYWluLFxuICAgICAgcHJ2OiBwcnYsXG4gICAgICBlbmNyeXB0ZWRQcnY6IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgIGlucHV0OiBwcnYsXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgfSksXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgIHJlY2lwaWVudEluZGV4ID09PSAxID8gYXdhaXQga2V5Y2hhaW5zLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpIDogYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBzaWduaW5nIGtleSwgdHhSZXF1ZXN0UmVzb2x2ZWQgYW5kIHR4UmVxdWVzdElkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3Qgb3IgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHsgc3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEVDRFNBU2lnbmluZ1JlcXVlc3RCYXNlUmVzdWx0Pn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlcXVlc3RCYXNlKHBhcmFtczogVFNTUGFyYW1zLCByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuICAgIGxldCB0eFJlcXVlc3RJZDogc3RyaW5nO1xuXG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHBydiB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QpO1xuICAgICAgdHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgICB0eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsOiBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UocHJ2KTtcbiAgICBpZiAodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuaSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXIga2V5Jyk7XG4gICAgfVxuICAgIGlmICghdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1c2VyIGtleSAtIG1pc3NpbmcgYmFja3VwTlNoYXJlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3Qgc2lnbmluZ0tleSA9IE1QQy5rZXlDb21iaW5lKHVzZXJTaWduaW5nTWF0ZXJpYWwucFNoYXJlLCBbXG4gICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLFxuICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbC5iYWNrdXBOU2hhcmUsXG4gICAgXSk7XG5cbiAgICBjb25zdCB0aHJlc2hvbGQgPSAyO1xuICAgIGNvbnN0IG51bVNoYXJlcyA9IDM7XG4gICAgY29uc3QgdVNoYXJlcyA9IEVjZHNhLnNoYW1pci5zcGxpdChCaWdJbnQodXNlclNpZ25pbmdNYXRlcmlhbC5wU2hhcmUudXUpLCB0aHJlc2hvbGQsIG51bVNoYXJlcyk7XG4gICAgY29uc3QgdXNlclNpZ25TaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnblNoYXJlKHNpZ25pbmdLZXkueFNoYXJlLCBzaWduaW5nS2V5LnlTaGFyZXNbM10pO1xuXG4gICAgbGV0IHUgPSBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbM10sIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgd2hpbGUgKHUubGVuZ3RoIDwgNjQpIHtcbiAgICAgIHUgPSAnMCcgKyB1O1xuICAgIH1cblxuICAgIGxldCBjaGFpbmNvZGUgPSB1c2VyU2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLmNoYWluY29kZTtcbiAgICB3aGlsZSAoY2hhaW5jb2RlLmxlbmd0aCA8IDY0KSB7XG4gICAgICBjaGFpbmNvZGUgPSAnMCcgKyBjaGFpbmNvZGU7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25lclNoYXJlID0gYmlwMzIuZnJvbVByaXZhdGVLZXkoQnVmZmVyLmZyb20odSwgJ2hleCcpLCBCdWZmZXIuZnJvbShjaGFpbmNvZGUsICdoZXgnKSkudG9CYXNlNTgoKTtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KHRoaXMuYml0Z28pO1xuICAgIGNvbnN0IGVuY3J5cHRlZFNpZ25lclNoYXJlID0gKGF3YWl0IG9wZW5wZ3AuZW5jcnlwdCh7XG4gICAgICBtZXNzYWdlOiBhd2FpdCBvcGVucGdwLmNyZWF0ZU1lc3NhZ2Uoe1xuICAgICAgICB0ZXh0OiBzaWduZXJTaGFyZSxcbiAgICAgIH0pLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25LZXlzOiBbYml0Z29HcGdLZXldLFxuICAgIH0pKSBhcyBzdHJpbmc7XG5cbiAgICBjb25zdCBiaXRnb1RvVXNlckFTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuS1NoYXJlLFxuICAgICAgdXNlclNpZ25TaGFyZS5rU2hhcmUsXG4gICAgICBlbmNyeXB0ZWRTaWduZXJTaGFyZVxuICAgICkpIGFzIEFTaGFyZTtcblxuICAgIGNvbnN0IHVzZXJHYW1tYUFuZE11U2hhcmVzID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJHYW1tYUFuZE11U2hhcmUodXNlclNpZ25TaGFyZS53U2hhcmUsIGJpdGdvVG9Vc2VyQVNoYXJlKTtcbiAgICBjb25zdCB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKFxuICAgICAgdXNlckdhbW1hQW5kTXVTaGFyZXMuZ1NoYXJlIGFzIEVDRFNBLkdTaGFyZVxuICAgICk7XG5cbiAgICBjb25zdCBtdVNoYXJlID0gdXNlckdhbW1hQW5kTXVTaGFyZXMubXVTaGFyZSE7XG4gICAgY29uc3QgZFNoYXJlID0gdXNlck9taWNyb25BbmREZWx0YVNoYXJlLmRTaGFyZTtcbiAgICBjb25zdCBiaXRnb1RvVXNlckRTaGFyZSA9IChhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLndhbGxldC5pZCgpLFxuICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIFNlbmRTaGFyZVR5cGUuTVVTaGFyZSxcbiAgICAgIHsgbXVTaGFyZSwgZFNoYXJlLCBpOiBtdVNoYXJlLmkgfVxuICAgICkpIGFzIERTaGFyZTtcblxuICAgIGxldCBzaWduYWJsZVBheWxvYWQ7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBzaWduYWJsZVBheWxvYWQgPSBCdWZmZXIuZnJvbSh0eFJlcXVlc3RSZXNvbHZlZC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zaWduYWJsZUhleCwgJ2hleCcpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIGFzc2VydCh0eFJlcXVlc3RSZXNvbHZlZC51bnNpZ25lZE1lc3NhZ2VzPy5bMF0pO1xuICAgICAgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odHhSZXF1ZXN0UmVzb2x2ZWQudW5zaWduZWRNZXNzYWdlc1swXS5tZXNzYWdlLCAnaGV4Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlclNTaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICB1c2VyT21pY3JvbkFuZERlbHRhU2hhcmUub1NoYXJlLFxuICAgICAgYml0Z29Ub1VzZXJEU2hhcmUsXG4gICAgICBzaWduYWJsZVBheWxvYWRcbiAgICApO1xuXG4gICAgYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy53YWxsZXQuaWQoKSxcbiAgICAgIHR4UmVxdWVzdElkLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICBTZW5kU2hhcmVUeXBlLlNTaGFyZSxcbiAgICAgIHVzZXJTU2hhcmVcbiAgICApO1xuICAgIHJldHVybiBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSB0cmFuc2FjdGlvbiBhc3NvY2lhdGVkIHRvIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgb2JqZWN0IG9yIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gZGVjcnlwdGVkIHByaXZhdGUga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucmVxSWQgLSByZXF1ZXN0IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IGZ1bGx5IHNpZ25lZCBUeFJlcXVlc3Qgb2JqZWN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS50eCk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0IG9iamVjdFxuICAgKi9cbiAgYXN5bmMgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXMpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHJldHVybiB0aGlzLnNpZ25SZXF1ZXN0QmFzZShwYXJhbXMsIFJlcXVlc3RUeXBlLm1lc3NhZ2UpO1xuICB9XG59XG4iXX0=