@bitgo-beta/utxo-lib 8.0.3-beta.31 → 8.0.3-beta.310

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 (85) hide show
  1. package/README.md +19 -16
  2. package/dist/src/address.js +5 -5
  3. package/dist/src/addressFormat.js +9 -9
  4. package/dist/src/bitgo/Musig2.js +19 -19
  5. package/dist/src/bitgo/PsbtUtil.d.ts +8 -7
  6. package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -1
  7. package/dist/src/bitgo/PsbtUtil.js +18 -3
  8. package/dist/src/bitgo/Unspent.js +3 -3
  9. package/dist/src/bitgo/UtxoPsbt.d.ts +19 -4
  10. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
  11. package/dist/src/bitgo/UtxoPsbt.js +174 -110
  12. package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
  13. package/dist/src/bitgo/UtxoTransaction.js +9 -9
  14. package/dist/src/bitgo/bitcoincash/address.js +6 -6
  15. package/dist/src/bitgo/bitcoincash/index.js +6 -2
  16. package/dist/src/bitgo/dash/DashTransaction.js +3 -3
  17. package/dist/src/bitgo/dash/index.js +6 -2
  18. package/dist/src/bitgo/index.d.ts +9 -0
  19. package/dist/src/bitgo/index.d.ts.map +1 -1
  20. package/dist/src/bitgo/index.js +9 -3
  21. package/dist/src/bitgo/legacysafe/index.d.ts +15 -0
  22. package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
  23. package/dist/src/bitgo/legacysafe/index.js +61 -0
  24. package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
  25. package/dist/src/bitgo/litecoin/index.js +6 -2
  26. package/dist/src/bitgo/outputScripts.d.ts +1 -0
  27. package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
  28. package/dist/src/bitgo/outputScripts.js +29 -14
  29. package/dist/src/bitgo/parseInput.js +6 -6
  30. package/dist/src/bitgo/psbt/fromHalfSigned.js +5 -5
  31. package/dist/src/bitgo/signature.d.ts +2 -2
  32. package/dist/src/bitgo/signature.d.ts.map +1 -1
  33. package/dist/src/bitgo/signature.js +24 -9
  34. package/dist/src/bitgo/transaction.d.ts +18 -3
  35. package/dist/src/bitgo/transaction.d.ts.map +1 -1
  36. package/dist/src/bitgo/transaction.js +18 -16
  37. package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
  38. package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
  39. package/dist/src/bitgo/transactionAmounts.js +33 -0
  40. package/dist/src/bitgo/types.d.ts +7 -0
  41. package/dist/src/bitgo/types.d.ts.map +1 -1
  42. package/dist/src/bitgo/types.js +11 -2
  43. package/dist/src/bitgo/wallet/Psbt.d.ts +28 -8
  44. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
  45. package/dist/src/bitgo/wallet/Psbt.js +110 -29
  46. package/dist/src/bitgo/wallet/Unspent.d.ts +23 -13
  47. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
  48. package/dist/src/bitgo/wallet/Unspent.js +62 -53
  49. package/dist/src/bitgo/wallet/WalletOutput.d.ts +17 -1
  50. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
  51. package/dist/src/bitgo/wallet/WalletOutput.js +68 -27
  52. package/dist/src/bitgo/wallet/WalletScripts.js +2 -2
  53. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +4 -4
  54. package/dist/src/bitgo/wallet/index.js +6 -2
  55. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
  56. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
  57. package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +87 -0
  58. package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +26 -0
  59. package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
  60. package/dist/src/bitgo/wallet/psbt/RootNodes.js +116 -0
  61. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -1
  62. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
  63. package/dist/src/bitgo/zcash/ZcashPsbt.js +5 -14
  64. package/dist/src/bitgo/zcash/ZcashTransaction.js +15 -15
  65. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +4 -4
  66. package/dist/src/bitgo/zcash/address.js +3 -3
  67. package/dist/src/bitgo/zcash/hashZip0244.js +3 -3
  68. package/dist/src/bitgo/zcash/index.js +6 -2
  69. package/dist/src/index.js +6 -2
  70. package/dist/src/noble_ecc.d.ts +7 -7
  71. package/dist/src/noble_ecc.d.ts.map +1 -1
  72. package/dist/src/noble_ecc.js +4 -4
  73. package/dist/src/testutil/index.js +6 -2
  74. package/dist/src/testutil/keys.d.ts +3 -0
  75. package/dist/src/testutil/keys.d.ts.map +1 -1
  76. package/dist/src/testutil/keys.js +18 -3
  77. package/dist/src/testutil/mock.d.ts.map +1 -1
  78. package/dist/src/testutil/mock.js +19 -17
  79. package/dist/src/testutil/psbt.d.ts +27 -6
  80. package/dist/src/testutil/psbt.d.ts.map +1 -1
  81. package/dist/src/testutil/psbt.js +40 -29
  82. package/dist/src/testutil/transaction.d.ts +14 -5
  83. package/dist/src/testutil/transaction.d.ts.map +1 -1
  84. package/dist/src/testutil/transaction.js +20 -20
  85. package/package.json +8 -8
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UtxoPsbt = void 0;
4
+ const assert = require("assert");
4
5
  const bip174_1 = require("bip174");
5
6
  const utils_1 = require("bip174/src/lib/utils");
6
7
  const bufferutils_1 = require("bitcoinjs-lib/src/bufferutils");
@@ -18,12 +19,35 @@ const Musig2_1 = require("./Musig2");
18
19
  const types_1 = require("./types");
19
20
  const taproot_1 = require("../taproot");
20
21
  const PsbtUtil_1 = require("./PsbtUtil");
21
- const defaultSignatureParams = {
22
- deterministic: false,
23
- sighashTypes: [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL],
24
- };
25
- function toSignatureParams(v) {
26
- return Array.isArray(v) ? toSignatureParams({ sighashTypes: v }) : { ...defaultSignatureParams, ...v };
22
+ function defaultSighashTypes() {
23
+ return [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL];
24
+ }
25
+ function addForkIdToSighashesIfNeeded(network, sighashTypes) {
26
+ switch ((0, __1.getMainnet)(network)) {
27
+ case __1.networks.bitcoincash:
28
+ case __1.networks.bitcoinsv:
29
+ case __1.networks.bitcoingold:
30
+ case __1.networks.ecash:
31
+ return [...sighashTypes, ...sighashTypes.map((s) => s | UtxoTransaction_1.UtxoTransaction.SIGHASH_FORKID)];
32
+ default:
33
+ return sighashTypes;
34
+ }
35
+ }
36
+ function toSignatureParams(network, v) {
37
+ if (Array.isArray(v))
38
+ return toSignatureParams(network, { sighashTypes: v });
39
+ const defaultSignatureParams = { deterministic: false, sighashTypes: defaultSighashTypes() };
40
+ const ret = { ...defaultSignatureParams, ...v };
41
+ ret.sighashTypes = addForkIdToSighashesIfNeeded(network, ret.sighashTypes);
42
+ return ret;
43
+ }
44
+ /**
45
+ * @param a
46
+ * @param b
47
+ * @returns true if the two public keys are equal ignoring the y coordinate.
48
+ */
49
+ function equalPublicKeyIgnoreY(a, b) {
50
+ return (0, outputScripts_1.toXOnlyPublicKey)(a).equals((0, outputScripts_1.toXOnlyPublicKey)(b));
27
51
  }
28
52
  // TODO: upstream does `checkInputsForPartialSigs` before doing things like
29
53
  // `setVersion`. Our inputs could have tapscriptsigs (or in future tapkeysigs)
@@ -57,10 +81,11 @@ class UtxoPsbt extends __1.Psbt {
57
81
  /**
58
82
  * @param parent - Parent key. Matched with `bip32Derivations` using `fingerprint` property.
59
83
  * @param bip32Derivations - possible derivations for input or output
84
+ * @param ignoreY - when true, ignore the y coordinate when matching public keys
60
85
  * @return derived bip32 node if matching derivation is found, undefined if none is found
61
86
  * @throws Error if more than one match is found
62
87
  */
63
- static deriveKeyPair(parent, bip32Derivations) {
88
+ static deriveKeyPair(parent, bip32Derivations, { ignoreY }) {
64
89
  const matchingDerivations = bip32Derivations.filter((bipDv) => {
65
90
  return bipDv.masterFingerprint.equals(parent.fingerprint);
66
91
  });
@@ -73,17 +98,37 @@ class UtxoPsbt extends __1.Psbt {
73
98
  }
74
99
  const [derivation] = matchingDerivations;
75
100
  const node = parent.derivePath(derivation.path);
76
- if (!derivation.pubkey.equals(node.publicKey) && !derivation.pubkey.equals(outputScripts_1.toXOnlyPublicKey(node.publicKey))) {
77
- throw new Error('pubkey did not match bip32Derivation');
101
+ if (!node.publicKey.equals(derivation.pubkey)) {
102
+ if (!ignoreY || !equalPublicKeyIgnoreY(node.publicKey, derivation.pubkey)) {
103
+ throw new Error('pubkey did not match bip32Derivation');
104
+ }
78
105
  }
79
106
  return node;
80
107
  }
108
+ static deriveKeyPairForInput(bip32, input) {
109
+ var _a, _b, _c, _d;
110
+ return ((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)
111
+ ? (_b = UtxoPsbt.deriveKeyPair(bip32, input.tapBip32Derivation, { ignoreY: true })) === null || _b === void 0 ? void 0 : _b.publicKey
112
+ : ((_c = input.bip32Derivation) === null || _c === void 0 ? void 0 : _c.length)
113
+ ? (_d = UtxoPsbt.deriveKeyPair(bip32, input.bip32Derivation, { ignoreY: false })) === null || _d === void 0 ? void 0 : _d.publicKey
114
+ : bip32 === null || bip32 === void 0 ? void 0 : bip32.publicKey;
115
+ }
81
116
  get network() {
82
117
  return this.tx.network;
83
118
  }
84
119
  toHex() {
85
120
  return this.toBuffer().toString('hex');
86
121
  }
122
+ /**
123
+ * It is expensive to attempt to compute every output address using psbt.txOutputs[outputIndex]
124
+ * to then just get the script. Here, we are doing the same thing as what txOutputs() does in
125
+ * bitcoinjs-lib, but without iterating over each output.
126
+ * @param outputIndex
127
+ * @returns output script at the given index
128
+ */
129
+ getOutputScript(outputIndex) {
130
+ return this.__CACHE.__TX.outs[outputIndex].script;
131
+ }
87
132
  getNonWitnessPreviousTxids() {
88
133
  const txInputs = this.txInputs; // These are somewhat costly to extract
89
134
  const txidSet = new Set();
@@ -91,8 +136,8 @@ class UtxoPsbt extends __1.Psbt {
91
136
  if (!input.witnessUtxo) {
92
137
  throw new Error('Must have witness UTXO for all inputs');
93
138
  }
94
- if (!scriptTypes_1.isSegwit(input.witnessUtxo.script, input.redeemScript)) {
95
- txidSet.add(Unspent_1.getOutputIdForInput(txInputs[index]).txid);
139
+ if (!(0, scriptTypes_1.isSegwit)(input.witnessUtxo.script, input.redeemScript)) {
140
+ txidSet.add((0, Unspent_1.getOutputIdForInput)(txInputs[index]).txid);
96
141
  }
97
142
  });
98
143
  return [...txidSet];
@@ -103,8 +148,8 @@ class UtxoPsbt extends __1.Psbt {
103
148
  if (!input.witnessUtxo) {
104
149
  throw new Error('Must have witness UTXO for all inputs');
105
150
  }
106
- if (!scriptTypes_1.isSegwit(input.witnessUtxo.script, input.redeemScript)) {
107
- const { txid } = Unspent_1.getOutputIdForInput(txInputs[index]);
151
+ if (!(0, scriptTypes_1.isSegwit)(input.witnessUtxo.script, input.redeemScript)) {
152
+ const { txid } = (0, Unspent_1.getOutputIdForInput)(txInputs[index]);
108
153
  if (txBufs[txid] === undefined) {
109
154
  throw new Error('Not all required previous transactions provided');
110
155
  }
@@ -118,7 +163,7 @@ class UtxoPsbt extends __1.Psbt {
118
163
  throw new Error(`Transaction has ${transaction.ins.length} inputs, but ${prevOutputs.length} previous outputs provided`);
119
164
  }
120
165
  const clonedTransaction = transaction.clone();
121
- const updates = fromHalfSigned_1.unsign(clonedTransaction, prevOutputs);
166
+ const updates = (0, fromHalfSigned_1.unsign)(clonedTransaction, prevOutputs);
122
167
  const psbtBase = new bip174_1.Psbt(new __1.PsbtTransaction({ tx: clonedTransaction }));
123
168
  clonedTransaction.ins.forEach(() => psbtBase.inputs.push({ unknownKeyVals: [] }));
124
169
  clonedTransaction.outs.forEach(() => psbtBase.outputs.push({ unknownKeyVals: [] }));
@@ -152,7 +197,7 @@ class UtxoPsbt extends __1.Psbt {
152
197
  */
153
198
  isTaprootKeyPathInput(inputIndex) {
154
199
  var _a, _b, _c;
155
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
200
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
156
201
  return (!!input.tapInternalKey &&
157
202
  !!input.tapMerkleRoot &&
158
203
  !(((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) ||
@@ -165,7 +210,7 @@ class UtxoPsbt extends __1.Psbt {
165
210
  */
166
211
  isTaprootScriptPathInput(inputIndex) {
167
212
  var _a;
168
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
213
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
169
214
  return (!!((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) &&
170
215
  !(this.getProprietaryKeyVals(inputIndex, {
171
216
  identifier: PsbtUtil_1.PSBT_PROPRIETARY_IDENTIFIER,
@@ -185,10 +230,10 @@ class UtxoPsbt extends __1.Psbt {
185
230
  */
186
231
  isTaprootInput(inputIndex) {
187
232
  var _a, _b, _c;
188
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
233
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
189
234
  const isP2TR = (script) => {
190
235
  try {
191
- taproot_1.getTaprootOutputKey(script);
236
+ (0, taproot_1.getTaprootOutputKey)(script);
192
237
  return true;
193
238
  }
194
239
  catch (e) {
@@ -214,24 +259,24 @@ class UtxoPsbt extends __1.Psbt {
214
259
  }).length ||
215
260
  (input.witnessUtxo && isP2TR(input.witnessUtxo.script)));
216
261
  }
262
+ isMultisigTaprootScript(script) {
263
+ try {
264
+ (0, parseInput_1.parsePubScript2Of3)(script, 'taprootScriptPathSpend');
265
+ return true;
266
+ }
267
+ catch (e) {
268
+ return false;
269
+ }
270
+ }
217
271
  /**
218
272
  * Mostly copied from bitcoinjs-lib/ts_src/psbt.ts
219
273
  */
220
274
  finalizeAllInputs() {
221
- const isMultisigTaprootScript = (script) => {
222
- try {
223
- parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend');
224
- return true;
225
- }
226
- catch (e) {
227
- return false;
228
- }
229
- };
230
- utils_1.checkForInput(this.data.inputs, 0); // making sure we have at least one
275
+ (0, utils_1.checkForInput)(this.data.inputs, 0); // making sure we have at least one
231
276
  this.data.inputs.map((input, idx) => {
232
277
  var _a;
233
278
  if ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) {
234
- return isMultisigTaprootScript(input.tapLeafScript[0].script)
279
+ return this.isMultisigTaprootScript(input.tapLeafScript[0].script)
235
280
  ? this.finalizeTaprootInput(idx)
236
281
  : this.finalizeTapInputWithSingleLeafScriptAndSignature(idx);
237
282
  }
@@ -244,20 +289,27 @@ class UtxoPsbt extends __1.Psbt {
244
289
  }
245
290
  finalizeTaprootInput(inputIndex) {
246
291
  var _a, _b;
247
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
292
+ const sanitizeSignature = (sig) => {
293
+ const sighashType = sig.length === 64 ? __1.Transaction.SIGHASH_DEFAULT : sig.readUInt8(sig.length - 1);
294
+ const inputSighashType = input.sighashType === undefined ? __1.Transaction.SIGHASH_DEFAULT : input.sighashType;
295
+ assert(sighashType === inputSighashType, 'signature sighash does not match input sighash type');
296
+ // TODO BTC-663 This should be fixed in platform. This is just a workaround fix.
297
+ return sighashType === __1.Transaction.SIGHASH_DEFAULT && sig.length === 65 ? sig.slice(0, 64) : sig;
298
+ };
299
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
248
300
  // witness = control-block script first-sig second-sig
249
301
  if (((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) !== 1) {
250
302
  throw new Error('Only one leaf script supported for finalizing');
251
303
  }
252
304
  const { controlBlock, script } = input.tapLeafScript[0];
253
305
  const witness = [script, controlBlock];
254
- const [pubkey1, pubkey2] = parseInput_1.parsePubScript2Of3(script, 'taprootScriptPathSpend').publicKeys;
306
+ const [pubkey1, pubkey2] = (0, parseInput_1.parsePubScript2Of3)(script, 'taprootScriptPathSpend').publicKeys;
255
307
  for (const pk of [pubkey1, pubkey2]) {
256
- const sig = (_b = input.tapScriptSig) === null || _b === void 0 ? void 0 : _b.find(({ pubkey }) => pubkey.equals(pk));
308
+ const sig = (_b = input.tapScriptSig) === null || _b === void 0 ? void 0 : _b.find(({ pubkey }) => equalPublicKeyIgnoreY(pk, pubkey));
257
309
  if (!sig) {
258
310
  throw new Error('Could not find signatures in Script Sig.');
259
311
  }
260
- witness.unshift(sig.signature);
312
+ witness.unshift(sanitizeSignature(sig.signature));
261
313
  }
262
314
  const witnessLength = witness.reduce((s, b) => s + b.length + bufferutils_1.varuint.encodingLength(b.length), 1);
263
315
  const bufferWriter = bufferutils_1.BufferWriter.withCapacity(witnessLength);
@@ -272,14 +324,14 @@ class UtxoPsbt extends __1.Psbt {
272
324
  * IMPORTANT: Always call validate* function before finalizing.
273
325
  */
274
326
  finalizeTaprootMusig2Input(inputIndex) {
275
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
276
- const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(input);
327
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
328
+ const partialSigs = (0, Musig2_1.parsePsbtMusig2PartialSigs)(input);
277
329
  if ((partialSigs === null || partialSigs === void 0 ? void 0 : partialSigs.length) !== 2) {
278
330
  throw new Error(`invalid number of partial signatures ${partialSigs ? partialSigs.length : 0} to finalize`);
279
331
  }
280
- const { partialSigs: pSigs, sigHashType } = Musig2_1.getSigHashTypeFromSigs(partialSigs);
332
+ const { partialSigs: pSigs, sigHashType } = (0, Musig2_1.getSigHashTypeFromSigs)(partialSigs);
281
333
  const { sessionKey } = this.getMusig2SessionKey(inputIndex, sigHashType);
282
- const aggSig = Musig2_1.musig2AggregateSigs(pSigs.map((pSig) => pSig.partialSig), sessionKey);
334
+ const aggSig = (0, Musig2_1.musig2AggregateSigs)(pSigs.map((pSig) => pSig.partialSig), sessionKey);
283
335
  const sig = sigHashType === __1.Transaction.SIGHASH_DEFAULT ? aggSig : Buffer.concat([aggSig, Buffer.of(sigHashType)]);
284
336
  // single signature with 64/65 bytes size is script witness for key path spend
285
337
  const bufferWriter = bufferutils_1.BufferWriter.withCapacity(1 + bufferutils_1.varuint.encodingLength(sig.length) + sig.length);
@@ -293,7 +345,7 @@ class UtxoPsbt extends __1.Psbt {
293
345
  }
294
346
  finalizeTapInputWithSingleLeafScriptAndSignature(inputIndex) {
295
347
  var _a, _b;
296
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
348
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
297
349
  if (((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) !== 1) {
298
350
  throw new Error('Only one leaf script supported for finalizing');
299
351
  }
@@ -318,7 +370,7 @@ class UtxoPsbt extends __1.Psbt {
318
370
  * validator.
319
371
  */
320
372
  validateSignaturesOfAllInputs() {
321
- utils_1.checkForInput(this.data.inputs, 0); // making sure we have at least one
373
+ (0, utils_1.checkForInput)(this.data.inputs, 0); // making sure we have at least one
322
374
  const results = this.data.inputs.map((input, idx) => {
323
375
  return this.validateSignaturesOfInputCommon(idx);
324
376
  });
@@ -328,13 +380,8 @@ class UtxoPsbt extends __1.Psbt {
328
380
  * @returns true iff any matching valid signature is found for a derived pub key from given HD key pair.
329
381
  */
330
382
  validateSignaturesOfInputHD(inputIndex, hdKeyPair) {
331
- var _a, _b, _c, _d;
332
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
333
- const pubKey = ((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)
334
- ? (_b = UtxoPsbt.deriveKeyPair(hdKeyPair, input.tapBip32Derivation)) === null || _b === void 0 ? void 0 : _b.publicKey
335
- : ((_c = input.bip32Derivation) === null || _c === void 0 ? void 0 : _c.length)
336
- ? (_d = UtxoPsbt.deriveKeyPair(hdKeyPair, input.bip32Derivation)) === null || _d === void 0 ? void 0 : _d.publicKey
337
- : undefined;
383
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
384
+ const pubKey = UtxoPsbt.deriveKeyPairForInput(hdKeyPair, input);
338
385
  if (!pubKey) {
339
386
  throw new Error('can not derive from HD key pair');
340
387
  }
@@ -362,14 +409,14 @@ class UtxoPsbt extends __1.Psbt {
362
409
  }
363
410
  }
364
411
  getMusig2SessionKey(inputIndex, sigHashType) {
365
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
412
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
366
413
  if (!input.tapInternalKey || !input.tapMerkleRoot) {
367
414
  throw new Error('both tapInternalKey and tapMerkleRoot are required');
368
415
  }
369
416
  const participants = this.getMusig2Participants(inputIndex, input.tapInternalKey, input.tapMerkleRoot);
370
417
  const nonces = this.getMusig2Nonces(inputIndex, participants);
371
418
  const { hash } = this.getTaprootHashForSig(inputIndex, [sigHashType]);
372
- const sessionKey = Musig2_1.createMusig2SigningSession({
419
+ const sessionKey = (0, Musig2_1.createMusig2SigningSession)({
373
420
  pubNonces: [nonces[0].pubNonce, nonces[1].pubNonce],
374
421
  pubKeys: participants.participantPubKeys,
375
422
  txHash: hash,
@@ -380,44 +427,44 @@ class UtxoPsbt extends __1.Psbt {
380
427
  }
381
428
  /**
382
429
  * @returns true for following cases.
383
- * If valid musig2 partial signatures exists for both 2 keys, it will also verifies aggregated sig
430
+ * If valid musig2 partial signatures exists for both 2 keys, it will also verify aggregated sig
384
431
  * for aggregated tweaked key (output key), otherwise only verifies partial sig.
385
432
  * If pubkey is passed in input, it will check sig only for that pubkey,
386
433
  * if no sig exits for such key, throws error.
387
434
  * For invalid state of input data, it will throw errors.
388
435
  */
389
436
  validateTaprootMusig2SignaturesOfInput(inputIndex, pubkey) {
390
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
391
- const partialSigs = Musig2_1.parsePsbtMusig2PartialSigs(input);
437
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
438
+ const partialSigs = (0, Musig2_1.parsePsbtMusig2PartialSigs)(input);
392
439
  if (!partialSigs) {
393
440
  throw new Error(`No signatures to validate`);
394
441
  }
395
442
  let myPartialSigs = partialSigs;
396
443
  if (pubkey) {
397
- outputScripts_1.checkPlainPublicKey(pubkey);
398
- myPartialSigs = partialSigs.filter((kv) => kv.participantPubKey.equals(pubkey));
444
+ myPartialSigs = partialSigs.filter((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, pubkey));
399
445
  if ((myPartialSigs === null || myPartialSigs === void 0 ? void 0 : myPartialSigs.length) < 1) {
400
446
  throw new Error('No signatures for this pubkey');
401
447
  }
402
448
  }
403
- const { partialSigs: mySigs, sigHashType } = Musig2_1.getSigHashTypeFromSigs(myPartialSigs);
449
+ const { partialSigs: mySigs, sigHashType } = (0, Musig2_1.getSigHashTypeFromSigs)(myPartialSigs);
404
450
  const { participants, nonces, hash, sessionKey } = this.getMusig2SessionKey(inputIndex, sigHashType);
405
451
  const results = mySigs.map((mySig) => {
406
- const myNonce = nonces.find((kv) => kv.participantPubKey.equals(mySig.participantPubKey));
452
+ const myNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, mySig.participantPubKey));
407
453
  if (!myNonce) {
408
454
  throw new Error('Found no pub nonce for pubkey');
409
455
  }
410
- return Musig2_1.musig2PartialSigVerify(mySig.partialSig, mySig.participantPubKey, myNonce.pubNonce, sessionKey);
456
+ return (0, Musig2_1.musig2PartialSigVerify)(mySig.partialSig, mySig.participantPubKey, myNonce.pubNonce, sessionKey);
411
457
  });
412
458
  // For valid single sig or 1 or 2 failure sigs, no need to validate aggregated sig. So skip.
413
459
  const result = results.every((res) => res);
414
460
  if (!result || mySigs.length < 2) {
415
461
  return result;
416
462
  }
417
- const aggSig = Musig2_1.musig2AggregateSigs(mySigs.map((mySig) => mySig.partialSig), sessionKey);
463
+ const aggSig = (0, Musig2_1.musig2AggregateSigs)(mySigs.map((mySig) => mySig.partialSig), sessionKey);
418
464
  return __1.ecc.verifySchnorr(hash, participants.tapOutputKey, aggSig);
419
465
  }
420
466
  validateTaprootSignaturesOfInput(inputIndex, pubkey) {
467
+ var _a, _b;
421
468
  const input = this.data.inputs[inputIndex];
422
469
  const tapSigs = (input || {}).tapScriptSig;
423
470
  if (!input || !tapSigs || tapSigs.length < 1) {
@@ -425,8 +472,7 @@ class UtxoPsbt extends __1.Psbt {
425
472
  }
426
473
  let mySigs;
427
474
  if (pubkey) {
428
- const xOnlyPubkey = outputScripts_1.toXOnlyPublicKey(pubkey);
429
- mySigs = tapSigs.filter((sig) => sig.pubkey.equals(xOnlyPubkey));
475
+ mySigs = tapSigs.filter((sig) => equalPublicKeyIgnoreY(sig.pubkey, pubkey));
430
476
  if (mySigs.length < 1) {
431
477
  throw new Error('No signatures for this pubkey');
432
478
  }
@@ -435,8 +481,16 @@ class UtxoPsbt extends __1.Psbt {
435
481
  mySigs = tapSigs;
436
482
  }
437
483
  const results = [];
484
+ assert(((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) === 1, `single tapLeafScript is expected. Got ${(_b = input.tapLeafScript) === null || _b === void 0 ? void 0 : _b.length}`);
485
+ const [tapLeafScript] = input.tapLeafScript;
486
+ const pubKeys = this.isMultisigTaprootScript(tapLeafScript.script)
487
+ ? (0, parseInput_1.parsePubScript2Of3)(tapLeafScript.script, 'taprootScriptPathSpend').publicKeys
488
+ : undefined;
438
489
  for (const pSig of mySigs) {
439
490
  const { signature, leafHash, pubkey } = pSig;
491
+ if (pubKeys) {
492
+ assert(pubKeys.find((pk) => pubkey.equals(pk)), 'public key not found in tap leaf script');
493
+ }
440
494
  let sigHashType;
441
495
  let sig;
442
496
  if (signature.length === 65) {
@@ -460,26 +514,21 @@ class UtxoPsbt extends __1.Psbt {
460
514
  */
461
515
  getSignatureValidationArray(inputIndex, { rootNodes } = {}) {
462
516
  var _a, _b;
463
- if (!rootNodes && (!((_a = this.data.globalMap.globalXpub) === null || _a === void 0 ? void 0 : _a.length) || !types_1.isTriple(this.data.globalMap.globalXpub))) {
517
+ if (!rootNodes && (!((_a = this.data.globalMap.globalXpub) === null || _a === void 0 ? void 0 : _a.length) || !(0, types_1.isTriple)(this.data.globalMap.globalXpub))) {
464
518
  throw new Error('Cannot get signature validation array without 3 global xpubs');
465
519
  }
466
520
  const bip32s = rootNodes
467
521
  ? rootNodes
468
- : (_b = this.data.globalMap.globalXpub) === null || _b === void 0 ? void 0 : _b.map((xpub) => bip32_1.BIP32Factory(__1.ecc).fromBase58(bs58check.encode(xpub.extendedPubkey)));
522
+ : (_b = this.data.globalMap.globalXpub) === null || _b === void 0 ? void 0 : _b.map((xpub) => (0, bip32_1.BIP32Factory)(__1.ecc).fromBase58(bs58check.encode(xpub.extendedPubkey)));
469
523
  if (!bip32s) {
470
524
  throw new Error('either globalMap or rootNodes is required');
471
525
  }
472
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
473
- if (!PsbtUtil_1.getPsbtInputSignatureCount(input)) {
526
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
527
+ if (!(0, PsbtUtil_1.getPsbtInputSignatureCount)(input)) {
474
528
  return [false, false, false];
475
529
  }
476
530
  return bip32s.map((bip32) => {
477
- var _a, _b, _c, _d;
478
- const pubKey = ((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)
479
- ? (_b = UtxoPsbt.deriveKeyPair(bip32, input.tapBip32Derivation)) === null || _b === void 0 ? void 0 : _b.publicKey
480
- : ((_c = input.bip32Derivation) === null || _c === void 0 ? void 0 : _c.length)
481
- ? (_d = UtxoPsbt.deriveKeyPair(bip32, input.bip32Derivation)) === null || _d === void 0 ? void 0 : _d.publicKey
482
- : bip32 === null || bip32 === void 0 ? void 0 : bip32.publicKey;
531
+ const pubKey = UtxoPsbt.deriveKeyPairForInput(bip32, input);
483
532
  if (!pubKey) {
484
533
  return false;
485
534
  }
@@ -498,11 +547,11 @@ class UtxoPsbt extends __1.Psbt {
498
547
  /**
499
548
  * Mostly copied from bitcoinjs-lib/ts_src/psbt.ts
500
549
  */
501
- signAllInputsHD(hdKeyPair, params = defaultSignatureParams) {
550
+ signAllInputsHD(hdKeyPair, params) {
502
551
  if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) {
503
552
  throw new Error('Need HDSigner to sign input');
504
553
  }
505
- const { sighashTypes, deterministic } = toSignatureParams(params);
554
+ const { sighashTypes, deterministic } = toSignatureParams(this.network, params);
506
555
  const results = [];
507
556
  for (let i = 0; i < this.data.inputs.length; i++) {
508
557
  try {
@@ -529,7 +578,7 @@ class UtxoPsbt extends __1.Psbt {
529
578
  if (!hdKeyPair || !hdKeyPair.publicKey || !hdKeyPair.fingerprint) {
530
579
  throw new Error('Need HDSigner to sign input');
531
580
  }
532
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
581
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
533
582
  if (!input.tapBip32Derivation || input.tapBip32Derivation.length === 0) {
534
583
  throw new Error('Need tapBip32Derivation to sign Taproot with HD');
535
584
  }
@@ -545,7 +594,7 @@ class UtxoPsbt extends __1.Psbt {
545
594
  }
546
595
  function getDerivedNode(bipDv) {
547
596
  const node = hdKeyPair.derivePath(bipDv.path);
548
- if (!bipDv.pubkey.equals(node.publicKey.slice(1))) {
597
+ if (!equalPublicKeyIgnoreY(bipDv.pubkey, node.publicKey)) {
549
598
  throw new Error('pubkey did not match tapBip32Derivation');
550
599
  }
551
600
  return node;
@@ -572,8 +621,12 @@ class UtxoPsbt extends __1.Psbt {
572
621
  }
573
622
  return this;
574
623
  }
575
- signInputHD(inputIndex, hdKeyPair, params = defaultSignatureParams) {
576
- const { sighashTypes, deterministic } = toSignatureParams(params);
624
+ signInput(inputIndex, keyPair, sighashTypes) {
625
+ const { sighashTypes: sighashForNetwork } = toSignatureParams(this.network, sighashTypes);
626
+ return super.signInput(inputIndex, keyPair, sighashForNetwork);
627
+ }
628
+ signInputHD(inputIndex, hdKeyPair, params) {
629
+ const { sighashTypes, deterministic } = toSignatureParams(this.network, params);
577
630
  if (this.isTaprootInput(inputIndex)) {
578
631
  return this.signTaprootInputHD(inputIndex, hdKeyPair, { sighashTypes, deterministic });
579
632
  }
@@ -582,19 +635,19 @@ class UtxoPsbt extends __1.Psbt {
582
635
  }
583
636
  }
584
637
  getMusig2Participants(inputIndex, tapInternalKey, tapMerkleRoot) {
585
- const participantsKeyValData = Musig2_1.parsePsbtMusig2Participants(this.data.inputs[inputIndex]);
638
+ const participantsKeyValData = (0, Musig2_1.parsePsbtMusig2Participants)(this.data.inputs[inputIndex]);
586
639
  if (!participantsKeyValData) {
587
640
  throw new Error(`Found 0 matching participant key value instead of 1`);
588
641
  }
589
- Musig2_1.assertPsbtMusig2Participants(participantsKeyValData, tapInternalKey, tapMerkleRoot);
642
+ (0, Musig2_1.assertPsbtMusig2Participants)(participantsKeyValData, tapInternalKey, tapMerkleRoot);
590
643
  return participantsKeyValData;
591
644
  }
592
645
  getMusig2Nonces(inputIndex, participantsKeyValData) {
593
- const noncesKeyValsData = Musig2_1.parsePsbtMusig2Nonces(this.data.inputs[inputIndex]);
594
- if (!noncesKeyValsData || !types_1.isTuple(noncesKeyValsData)) {
646
+ const noncesKeyValsData = (0, Musig2_1.parsePsbtMusig2Nonces)(this.data.inputs[inputIndex]);
647
+ if (!noncesKeyValsData || !(0, types_1.isTuple)(noncesKeyValsData)) {
595
648
  throw new Error(`Found ${(noncesKeyValsData === null || noncesKeyValsData === void 0 ? void 0 : noncesKeyValsData.length) ? noncesKeyValsData.length : 0} matching nonce key value instead of 2`);
596
649
  }
597
- Musig2_1.assertPsbtMusig2Nonces(noncesKeyValsData, participantsKeyValData);
650
+ (0, Musig2_1.assertPsbtMusig2Nonces)(noncesKeyValsData, participantsKeyValData);
598
651
  return noncesKeyValsData;
599
652
  }
600
653
  /**
@@ -617,7 +670,7 @@ class UtxoPsbt extends __1.Psbt {
617
670
  // Retrieve and check that we have two participant nonces
618
671
  const participants = this.getMusig2Participants(inputIndex, input.tapInternalKey, input.tapMerkleRoot);
619
672
  const { tapOutputKey, participantPubKeys } = participants;
620
- const signerPubKey = participantPubKeys.find((pubKey) => pubKey.equals(signer.publicKey));
673
+ const signerPubKey = participantPubKeys.find((pubKey) => equalPublicKeyIgnoreY(pubKey, signer.publicKey));
621
674
  if (!signerPubKey) {
622
675
  throw new Error('signer pub key should match one of participant pub keys');
623
676
  }
@@ -625,14 +678,14 @@ class UtxoPsbt extends __1.Psbt {
625
678
  const { hash, sighashType } = this.getTaprootHashForSig(inputIndex, sighashTypes);
626
679
  let partialSig;
627
680
  if (deterministic) {
628
- if (!signerPubKey.equals(participantPubKeys[1])) {
681
+ if (!equalPublicKeyIgnoreY(signerPubKey, participantPubKeys[1])) {
629
682
  throw new Error('can only add a deterministic signature on the cosigner');
630
683
  }
631
- const firstSignerNonce = nonces.find((n) => n.participantPubKey.equals(participantPubKeys[0]));
684
+ const firstSignerNonce = nonces.find((n) => equalPublicKeyIgnoreY(n.participantPubKey, participantPubKeys[0]));
632
685
  if (!firstSignerNonce) {
633
686
  throw new Error('could not find the user nonce');
634
687
  }
635
- partialSig = Musig2_1.musig2DeterministicSign({
688
+ partialSig = (0, Musig2_1.musig2DeterministicSign)({
636
689
  privateKey: signer.privateKey,
637
690
  otherNonce: firstSignerNonce.pubNonce,
638
691
  publicKeys: participantPubKeys,
@@ -642,23 +695,23 @@ class UtxoPsbt extends __1.Psbt {
642
695
  }).sig;
643
696
  }
644
697
  else {
645
- const sessionKey = Musig2_1.createMusig2SigningSession({
698
+ const sessionKey = (0, Musig2_1.createMusig2SigningSession)({
646
699
  pubNonces: [nonces[0].pubNonce, nonces[1].pubNonce],
647
700
  pubKeys: participantPubKeys,
648
701
  txHash: hash,
649
702
  internalPubKey: input.tapInternalKey,
650
703
  tapTreeRoot: input.tapMerkleRoot,
651
704
  });
652
- const signerNonce = nonces.find((kv) => kv.participantPubKey.equals(signerPubKey));
705
+ const signerNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, signerPubKey));
653
706
  if (!signerNonce) {
654
707
  throw new Error('pubNonce is missing. retry signing process');
655
708
  }
656
- partialSig = Musig2_1.musig2PartialSign(signer.privateKey, signerNonce.pubNonce, sessionKey, this.nonceStore);
709
+ partialSig = (0, Musig2_1.musig2PartialSign)(signer.privateKey, signerNonce.pubNonce, sessionKey, this.nonceStore);
657
710
  }
658
711
  if (sighashType !== __1.Transaction.SIGHASH_DEFAULT) {
659
712
  partialSig = Buffer.concat([partialSig, Buffer.of(sighashType)]);
660
713
  }
661
- const sig = Musig2_1.encodePsbtMusig2PartialSig({
714
+ const sig = (0, Musig2_1.encodePsbtMusig2PartialSig)({
662
715
  participantPubKey: signerPubKey,
663
716
  tapOutputKey,
664
717
  partialSig: partialSig,
@@ -668,16 +721,20 @@ class UtxoPsbt extends __1.Psbt {
668
721
  }
669
722
  signTaprootInput(inputIndex, signer, leafHashes, sighashTypes = [__1.Transaction.SIGHASH_DEFAULT, __1.Transaction.SIGHASH_ALL]) {
670
723
  var _a;
671
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
724
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
672
725
  // Figure out if this is script path or not, if not, tweak the private key
673
726
  if (!((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length)) {
674
727
  throw new Error('tapLeafScript is required for p2tr script path');
675
728
  }
676
- const pubkey = outputScripts_1.toXOnlyPublicKey(signer.publicKey);
729
+ const pubkey = (0, outputScripts_1.toXOnlyPublicKey)(signer.publicKey);
677
730
  if (input.tapLeafScript.length !== 1) {
678
731
  throw new Error('Only one leaf script supported for signing');
679
732
  }
680
- const tapLeafScript = input.tapLeafScript[0];
733
+ const [tapLeafScript] = input.tapLeafScript;
734
+ if (this.isMultisigTaprootScript(tapLeafScript.script)) {
735
+ const pubKeys = (0, parseInput_1.parsePubScript2Of3)(tapLeafScript.script, 'taprootScriptPathSpend').publicKeys;
736
+ assert(pubKeys.find((pk) => pubkey.equals(pk)), 'public key not found in tap leaf script');
737
+ }
681
738
  const parsedControlBlock = __1.taproot.parseControlBlock(__1.ecc, tapLeafScript.controlBlock);
682
739
  const { leafVersion } = parsedControlBlock;
683
740
  if (leafVersion !== tapLeafScript.leafVersion) {
@@ -705,7 +762,7 @@ class UtxoPsbt extends __1.Psbt {
705
762
  }
706
763
  getTaprootOutputScript(inputIndex) {
707
764
  var _a;
708
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
765
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
709
766
  if ((_a = input.tapLeafScript) === null || _a === void 0 ? void 0 : _a.length) {
710
767
  return __1.taproot.createTaprootOutputScript({
711
768
  controlBlock: input.tapLeafScript[0].controlBlock,
@@ -768,7 +825,7 @@ class UtxoPsbt extends __1.Psbt {
768
825
  */
769
826
  addProprietaryKeyValToInput(inputIndex, keyValueData) {
770
827
  return this.addUnknownKeyValToInput(inputIndex, {
771
- key: proprietaryKeyVal_1.encodeProprietaryKey(keyValueData.key),
828
+ key: (0, proprietaryKeyVal_1.encodeProprietaryKey)(keyValueData.key),
772
829
  value: keyValueData.value,
773
830
  });
774
831
  }
@@ -778,8 +835,8 @@ class UtxoPsbt extends __1.Psbt {
778
835
  */
779
836
  addOrUpdateProprietaryKeyValToInput(inputIndex, keyValueData) {
780
837
  var _a;
781
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
782
- const key = proprietaryKeyVal_1.encodeProprietaryKey(keyValueData.key);
838
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
839
+ const key = (0, proprietaryKeyVal_1.encodeProprietaryKey)(keyValueData.key);
783
840
  const { value } = keyValueData;
784
841
  if ((_a = input.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.length) {
785
842
  const ukvIndex = input.unknownKeyVals.findIndex((ukv) => ukv.key.equals(key));
@@ -799,8 +856,8 @@ class UtxoPsbt extends __1.Psbt {
799
856
  * Default identifierEncoding is utf-8 for identifier.
800
857
  */
801
858
  getProprietaryKeyVals(inputIndex, keySearch) {
802
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
803
- return PsbtUtil_1.getPsbtInputProprietaryKeyVals(input, keySearch);
859
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
860
+ return (0, PsbtUtil_1.getPsbtInputProprietaryKeyVals)(input, keySearch);
804
861
  }
805
862
  /**
806
863
  * To delete any data from proprietary key value.
@@ -808,7 +865,7 @@ class UtxoPsbt extends __1.Psbt {
808
865
  */
809
866
  deleteProprietaryKeyVals(inputIndex, keysToDelete) {
810
867
  var _a;
811
- const input = utils_1.checkForInput(this.data.inputs, inputIndex);
868
+ const input = (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
812
869
  if (!((_a = input.unknownKeyVals) === null || _a === void 0 ? void 0 : _a.length)) {
813
870
  return this;
814
871
  }
@@ -816,7 +873,7 @@ class UtxoPsbt extends __1.Psbt {
816
873
  throw new Error('invalid proprietary key search filter combination. subtype is required');
817
874
  }
818
875
  input.unknownKeyVals = input.unknownKeyVals.filter((keyValue, i) => {
819
- const key = proprietaryKeyVal_1.decodeProprietaryKey(keyValue.key);
876
+ const key = (0, proprietaryKeyVal_1.decodeProprietaryKey)(keyValue.key);
820
877
  return !(keysToDelete === undefined ||
821
878
  (keysToDelete.identifier === key.identifier &&
822
879
  (keysToDelete.subtype === undefined ||
@@ -838,7 +895,7 @@ class UtxoPsbt extends __1.Psbt {
838
895
  if (!((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)) {
839
896
  throw new Error('tapBip32Derivation is required to create nonce');
840
897
  }
841
- const derived = UtxoPsbt.deriveKeyPair(keyPair, input.tapBip32Derivation);
898
+ const derived = UtxoPsbt.deriveKeyPair(keyPair, input.tapBip32Derivation, { ignoreY: true });
842
899
  if (!derived) {
843
900
  throw new Error('No bip32Derivation masterFingerprint matched the HD keyPair fingerprint');
844
901
  }
@@ -848,13 +905,13 @@ class UtxoPsbt extends __1.Psbt {
848
905
  if (!derivedKeyPair.privateKey) {
849
906
  throw new Error('privateKey is required to create nonce');
850
907
  }
851
- const participants = Musig2_1.parsePsbtMusig2Participants(input);
908
+ const participants = (0, Musig2_1.parsePsbtMusig2Participants)(input);
852
909
  if (!participants) {
853
910
  throw new Error(`Found 0 matching participant key value instead of 1`);
854
911
  }
855
- Musig2_1.assertPsbtMusig2Participants(participants, input.tapInternalKey, input.tapMerkleRoot);
912
+ (0, Musig2_1.assertPsbtMusig2Participants)(participants, input.tapInternalKey, input.tapMerkleRoot);
856
913
  const { tapOutputKey, participantPubKeys } = participants;
857
- const participantPubKey = participantPubKeys.find((pubKey) => pubKey.equals(derivedKeyPair.publicKey));
914
+ const participantPubKey = participantPubKeys.find((pubKey) => equalPublicKeyIgnoreY(pubKey, derivedKeyPair.publicKey));
858
915
  if (!Buffer.isBuffer(participantPubKey)) {
859
916
  throw new Error('participant plain pub key should match one bip32Derivation plain pub key');
860
917
  }
@@ -865,21 +922,21 @@ class UtxoPsbt extends __1.Psbt {
865
922
  throw new Error('Cannot add extra entropy when generating a deterministic nonce');
866
923
  }
867
924
  // There must be only 2 participant pubKeys if it got to this point
868
- if (!participantPubKey.equals(participantPubKeys[1])) {
925
+ if (!equalPublicKeyIgnoreY(participantPubKey, participantPubKeys[1])) {
869
926
  throw new Error(`Only the cosigner's nonce can be set deterministically`);
870
927
  }
871
- const nonces = Musig2_1.parsePsbtMusig2Nonces(input);
928
+ const nonces = (0, Musig2_1.parsePsbtMusig2Nonces)(input);
872
929
  if (!nonces) {
873
930
  throw new Error(`No nonces found on input #${inputIndex}`);
874
931
  }
875
932
  if (nonces.length > 2) {
876
933
  throw new Error(`Cannot have more than 2 nonces`);
877
934
  }
878
- const firstSignerNonce = nonces.find((kv) => kv.participantPubKey.equals(participantPubKeys[0]));
935
+ const firstSignerNonce = nonces.find((kv) => equalPublicKeyIgnoreY(kv.participantPubKey, participantPubKeys[0]));
879
936
  if (!firstSignerNonce) {
880
937
  throw new Error('signer nonce must be set if cosigner nonce is to be derived deterministically');
881
938
  }
882
- pubNonce = Musig2_1.createMusig2DeterministicNonce({
939
+ pubNonce = (0, Musig2_1.createMusig2DeterministicNonce)({
883
940
  privateKey: derivedKeyPair.privateKey,
884
941
  otherNonce: firstSignerNonce.pubNonce,
885
942
  publicKeys: participantPubKeys,
@@ -906,7 +963,7 @@ class UtxoPsbt extends __1.Psbt {
906
963
  return;
907
964
  }
908
965
  const nonce = this.createMusig2NonceForInput(index, keyPair, keyType, params);
909
- this.addOrUpdateProprietaryKeyValToInput(index, Musig2_1.encodePsbtMusig2PubNonce(nonce));
966
+ this.addOrUpdateProprietaryKeyValToInput(index, (0, Musig2_1.encodePsbtMusig2PubNonce)(nonce));
910
967
  });
911
968
  return this;
912
969
  }
@@ -934,7 +991,7 @@ class UtxoPsbt extends __1.Psbt {
934
991
  * @param deterministic If true, set the cosigner nonce deterministically
935
992
  */
936
993
  setInputMusig2NonceHD(inputIndex, keyPair, params = { deterministic: false }) {
937
- utils_1.checkForInput(this.data.inputs, inputIndex);
994
+ (0, utils_1.checkForInput)(this.data.inputs, inputIndex);
938
995
  return this.setMusig2NoncesInner(keyPair, 'root', inputIndex, params);
939
996
  }
940
997
  /**
@@ -962,6 +1019,13 @@ class UtxoPsbt extends __1.Psbt {
962
1019
  clone() {
963
1020
  return super.clone();
964
1021
  }
1022
+ extractTransaction(disableFeeCheck = true) {
1023
+ const tx = super.extractTransaction(disableFeeCheck);
1024
+ if (tx instanceof UtxoTransaction_1.UtxoTransaction) {
1025
+ return tx;
1026
+ }
1027
+ throw new Error('extractTransaction did not return instace of UtxoTransaction');
1028
+ }
965
1029
  }
966
1030
  exports.UtxoPsbt = UtxoPsbt;
967
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXR4b1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vVXR4b1BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTBDO0FBTzFDLGdEQUFxRDtBQUNyRCwrREFBc0U7QUFFdEUsaUNBQXFEO0FBQ3JELHVDQUF1QztBQUN2Qyx3RUFBOEY7QUFFOUYsMEJBQTZHO0FBQzdHLHVEQUFvRDtBQUNwRCx1Q0FBZ0Q7QUFDaEQsb0RBQThDO0FBQzlDLDBEQUErQztBQUMvQyxtREFBd0U7QUFDeEUsNkNBQWtEO0FBQ2xELHFDQWtCa0I7QUFDbEIsbUNBQTJEO0FBQzNELHdDQUFpRDtBQUNqRCx5Q0FPb0I7QUFZcEIsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixhQUFhLEVBQUUsS0FBSztJQUNwQixZQUFZLEVBQUUsQ0FBQyxlQUFXLENBQUMsZUFBZSxFQUFFLGVBQVcsQ0FBQyxXQUFXLENBQUM7Q0FDckUsQ0FBQztBQUVGLFNBQVMsaUJBQWlCLENBQUMsQ0FBc0M7SUFDL0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUN6RyxDQUFDO0FBb0RELDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsaUVBQWlFO0FBQ2pFLE1BQWEsUUFBdUUsU0FBUSxRQUFJO0lBQWhHOztRQUNVLGVBQVUsR0FBRyxJQUFJLHlCQUFnQixFQUFFLENBQUM7SUFxbEM5QyxDQUFDO0lBbmxDVyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBYyxFQUFFLE9BQWdCO1FBQ3JFLE9BQU8saUNBQWUsQ0FBQyxVQUFVLENBQVMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBYyxFQUFFLElBQWU7UUFDL0MsT0FBTyxJQUFJLFFBQVEsQ0FDakIsSUFBSSxFQUNKLElBQUksSUFBSSxJQUFJLGFBQVEsQ0FBQyxJQUFJLG1CQUFlLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxpQ0FBZSxDQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWMsRUFBRSxJQUFjO1FBQzlDLE1BQU0scUJBQXFCLEdBQTBCLENBQUMsTUFBYyxFQUFnQixFQUFFO1lBQ3BGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELE9BQU8sSUFBSSxtQkFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxhQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsRUFBRTtZQUNsRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1NBQzVDLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLGtGQUFrRjtRQUNsRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVksRUFBRSxJQUFjO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQXNCLEVBQUUsZ0JBQW1DO1FBQzlFLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDNUQsT0FBTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUU7WUFDL0IsdUJBQXVCO1lBQ3ZCLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQ2IscURBQXFELE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUNyRixtQkFBbUIsQ0FBQyxNQUN0QixFQUFFLENBQ0gsQ0FBQztTQUNIO1FBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLG1CQUFtQixDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUM1RyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCwwQkFBMEI7UUFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxDQUFDLHNCQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUMzRCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBOEI7UUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHVDQUF1QztRQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQzthQUMxRDtZQUNELElBQUksQ0FBQyxzQkFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDM0QsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLDZCQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztpQkFDcEU7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxXQUFvQyxFQUFFLFdBQStCO1FBQzFGLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNqRCxNQUFNLElBQUksS0FBSyxDQUNiLG1CQUFtQixXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sZ0JBQWdCLFdBQVcsQ0FBQyxNQUFNLDRCQUE0QixDQUN4RyxDQUFDO1NBQ0g7UUFDRCxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyx1QkFBTSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXZELE1BQU0sUUFBUSxHQUFHLElBQUksYUFBUSxDQUFDLElBQUksbUJBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV6RSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkgsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFUyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQWdCO1FBQzlDLE9BQU8sSUFBSSxpQ0FBZSxDQUFTLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFjLEVBQUU7UUFDZCxPQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQThCLENBQUMsRUFBUSxDQUFDO0lBQ3RFLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxRQUFpQjtRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7WUFDakMsSUFBSSxDQUFBLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsTUFBTSxLQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUksTUFBQSxLQUFLLENBQUMsVUFBVSwwQ0FBRSxNQUFNLENBQUEsRUFBRTtnQkFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksYUFBYSxzQkFBc0IsQ0FBQyxDQUFDO2FBQ25GO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQUMsVUFBa0I7O1FBQ3RDLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYztZQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWE7WUFDckIsQ0FBQyxDQUNDLENBQUEsTUFBQSxLQUFLLENBQUMsYUFBYSwwQ0FBRSxNQUFNO2lCQUMzQixNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLE1BQU0sQ0FBQTtpQkFDMUIsTUFBQSxLQUFLLENBQUMsa0JBQWtCLDBDQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUMzRCxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsd0JBQXdCLENBQUMsVUFBa0I7O1FBQ3pDLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUNMLENBQUMsQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGFBQWEsMENBQUUsTUFBTSxDQUFBO1lBQzdCLENBQUMsQ0FDQyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFO2dCQUNyQyxVQUFVLEVBQUUsc0NBQTJCO2dCQUN2QyxPQUFPLEVBQUUsZ0NBQXFCLENBQUMsMkJBQTJCO2FBQzNELENBQUMsQ0FBQyxNQUFNO2dCQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7b0JBQ3JDLFVBQVUsRUFBRSxzQ0FBMkI7b0JBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQyxnQkFBZ0I7aUJBQ2hELENBQUMsQ0FBQyxNQUFNO2dCQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7b0JBQ3JDLFVBQVUsRUFBRSxzQ0FBMkI7b0JBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQyxrQkFBa0I7aUJBQ2xELENBQUMsQ0FBQyxNQUFNLENBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLFVBQWtCOztRQUMvQixNQUFNLEtBQUssR0FBRyxxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBYyxFQUFXLEVBQUU7WUFDekMsSUFBSTtnQkFDRiw2QkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUM7UUFDRixPQUFPLENBQUMsQ0FBQyxDQUNQLEtBQUssQ0FBQyxjQUFjO1lBQ3BCLEtBQUssQ0FBQyxhQUFhO2FBQ25CLE1BQUEsS0FBSyxDQUFDLGFBQWEsMENBQUUsTUFBTSxDQUFBO2FBQzNCLE1BQUEsS0FBSyxDQUFDLGtCQUFrQiwwQ0FBRSxNQUFNLENBQUE7YUFDaEMsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxNQUFNLENBQUE7WUFDMUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRTtnQkFDckMsVUFBVSxFQUFFLHNDQUEyQjtnQkFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLDJCQUEyQjthQUMzRCxDQUFDLENBQUMsTUFBTTtZQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3JDLFVBQVUsRUFBRSxzQ0FBMkI7Z0JBQ3ZDLE9BQU8sRUFBRSxnQ0FBcUIsQ0FBQyxnQkFBZ0I7YUFDaEQsQ0FBQyxDQUFDLE1BQU07WUFDVCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFO2dCQUNyQyxVQUFVLEVBQUUsc0NBQTJCO2dCQUN2QyxPQUFPLEVBQUUsZ0NBQXFCLENBQUMsa0JBQWtCO2FBQ2xELENBQUMsQ0FBQyxNQUFNO1lBQ1QsQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ3hELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUI7UUFDZixNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBYyxFQUFXLEVBQUU7WUFDMUQsSUFBSTtnQkFDRiwrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztnQkFDckQsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7UUFDSCxDQUFDLENBQUM7UUFDRixxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTs7WUFDbEMsSUFBSSxNQUFBLEtBQUssQ0FBQyxhQUFhLDBDQUFFLE1BQU0sRUFBRTtnQkFDL0IsT0FBTyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDM0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsR0FBRyxDQUFDLENBQUM7YUFDaEU7aUJBQU0sSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsVUFBa0I7O1FBQ3JDLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsc0RBQXNEO1FBQ3RELElBQUksQ0FBQSxNQUFBLEtBQUssQ0FBQyxhQUFhLDBDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFhLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsK0JBQWtCLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLENBQUMsVUFBVSxDQUFDO1FBQzNGLEtBQUssTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDbkMsTUFBTSxHQUFHLEdBQUcsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDN0Q7WUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNoQztRQUVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxxQkFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkcsTUFBTSxZQUFZLEdBQUcsMEJBQVksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCwwQkFBMEIsQ0FBQyxVQUFrQjtRQUMzQyxNQUFNLEtBQUssR0FBRyxxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLG1DQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsTUFBTSxNQUFLLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDN0c7UUFDRCxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRywrQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUV6RSxNQUFNLE1BQU0sR0FBRyw0QkFBbUIsQ0FDaEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUNwQyxVQUFVLENBQ1gsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHLFdBQVcsS0FBSyxlQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkgsOEVBQThFO1FBQzlFLE1BQU0sWUFBWSxHQUFHLDBCQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxxQkFBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLEVBQUUsVUFBVSxFQUFFLHNDQUEyQixFQUFFLENBQUMsQ0FBQztRQUN2RixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnREFBZ0QsQ0FBQyxVQUFrQjs7UUFDakUsTUFBTSxLQUFLLEdBQUcscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUEsTUFBQSxLQUFLLENBQUMsYUFBYSwwQ0FBRSxNQUFNLE1BQUssQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztTQUNsRTtRQUNELElBQUksQ0FBQSxNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFhLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxxQkFBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkcsTUFBTSxZQUFZLEdBQUcsMEJBQVksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw2QkFBNkI7UUFDM0IscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQztRQUN2RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7T0FFRztJQUNILDJCQUEyQixDQUFDLFVBQWtCLEVBQUUsU0FBeUI7O1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsQ0FBQSxNQUFBLEtBQUssQ0FBQyxrQkFBa0IsMENBQUUsTUFBTTtZQUM3QyxDQUFDLENBQUMsTUFBQSxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsMENBQUUsU0FBUztZQUN4RSxDQUFDLENBQUMsQ0FBQSxNQUFBLEtBQUssQ0FBQyxlQUFlLDBDQUFFLE1BQU07Z0JBQy9CLENBQUMsQ0FBQyxNQUFBLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsMENBQUUsU0FBUztnQkFDckUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDcEQ7UUFDRCxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsK0JBQStCLENBQUMsVUFBa0IsRUFBRSxNQUFlO1FBQ2pFLElBQUk7WUFDRixJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDN0MsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ2xFO2lCQUFNLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNqRCxPQUFPLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDeEU7WUFDRCxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN0RztRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osZ0ZBQWdGO1lBQ2hGLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSywrQkFBK0IsRUFBRTtnQkFDbkQsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELE1BQU0sR0FBRyxDQUFDO1NBQ1g7SUFDSCxDQUFDO0lBRU8sbUJBQW1CLENBQ3pCLFVBQWtCLEVBQ2xCLFdBQW1CO1FBT25CLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztTQUN2RTtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkcsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFOUQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXRFLE1BQU0sVUFBVSxHQUFHLG1DQUEwQixDQUFDO1lBQzVDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUNuRCxPQUFPLEVBQUUsWUFBWSxDQUFDLGtCQUFrQjtZQUN4QyxNQUFNLEVBQUUsSUFBSTtZQUNaLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztZQUNwQyxXQUFXLEVBQUUsS0FBSyxDQUFDLGFBQWE7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsc0NBQXNDLENBQUMsVUFBa0IsRUFBRSxNQUFlO1FBQ3hFLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxXQUFXLEdBQUcsbUNBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDOUM7UUFFRCxJQUFJLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxNQUFNLEVBQUU7WUFDVixtQ0FBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixhQUFhLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsTUFBTSxJQUFHLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2FBQ2xEO1NBQ0Y7UUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRywrQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuRixNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVyRyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTywrQkFBc0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FBQyxDQUFDO1FBRUgsNEZBQTRGO1FBQzVGLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUVELE1BQU0sTUFBTSxHQUFHLDRCQUFtQixDQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQ3ZDLFVBQVUsQ0FDWCxDQUFDO1FBRUYsT0FBTyxPQUFNLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxnQ0FBZ0MsQ0FBQyxVQUFrQixFQUFFLE1BQWU7UUFDbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sV0FBVyxHQUFHLGdDQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUNsRDtTQUNGO2FBQU07WUFDTCxNQUFNLEdBQUcsT0FBTyxDQUFDO1NBQ2xCO1FBQ0QsTUFBTSxPQUFPLEdBQWMsRUFBRSxDQUFDO1FBRTlCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO1lBQ3pCLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztZQUM3QyxJQUFJLFdBQW1CLENBQUM7WUFDeEIsSUFBSSxHQUFXLENBQUM7WUFDaEIsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtnQkFDM0IsV0FBVyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUIsR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNMLFdBQVcsR0FBRyxlQUFXLENBQUMsZUFBZSxDQUFDO2dCQUMxQyxHQUFHLEdBQUcsU0FBUyxDQUFDO2FBQ2pCO1lBQ0QsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCwyQkFBMkIsQ0FDekIsVUFBa0IsRUFDbEIsRUFBRSxTQUFTLEtBQTZDLEVBQUU7O1FBRTFELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLDBDQUFFLE1BQU0sQ0FBQSxJQUFJLENBQUMsZ0JBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQ3hHLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztTQUNqRjtRQUVELE1BQU0sTUFBTSxHQUFHLFNBQVM7WUFDdEIsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLDBDQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzNDLG9CQUFZLENBQUMsT0FBTSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQ3ZFLENBQUM7UUFFTixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBRUQsTUFBTSxLQUFLLEdBQUcscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMscUNBQTBCLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDOUI7UUFFRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7WUFDMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQSxNQUFBLEtBQUssQ0FBQyxrQkFBa0IsMENBQUUsTUFBTTtnQkFDN0MsQ0FBQyxDQUFDLE1BQUEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLDBDQUFFLFNBQVM7Z0JBQ3BFLENBQUMsQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGVBQWUsMENBQUUsTUFBTTtvQkFDL0IsQ0FBQyxDQUFDLE1BQUEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQywwQ0FBRSxTQUFTO29CQUNqRSxDQUFDLENBQUMsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFNBQVMsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNYLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJO2dCQUNGLE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNqRTtZQUFDLE9BQU8sR0FBRyxFQUFFO2dCQUNaLGdGQUFnRjtnQkFDaEYsSUFBSSxHQUFHLENBQUMsT0FBTyxLQUFLLCtCQUErQixFQUFFO29CQUNuRCxPQUFPLEtBQUssQ0FBQztpQkFDZDtnQkFDRCxNQUFNLEdBQUcsQ0FBQzthQUNYO1FBQ0gsQ0FBQyxDQUFvQixDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FDYixTQUFrRCxFQUNsRCxTQUE4QyxzQkFBc0I7UUFFcEUsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO1lBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNoRDtRQUNELE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEUsTUFBTSxPQUFPLEdBQWMsRUFBRSxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEQsSUFBSTtnQkFDRixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDaEUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNwQjtZQUFDLE9BQU8sR0FBRyxFQUFFO2dCQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDckI7U0FDRjtRQUNELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7U0FDMUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUNoQixVQUFrQixFQUNsQixTQUFrRCxFQUNsRCxFQUFFLFlBQVksR0FBRyxDQUFDLGVBQVcsQ0FBQyxlQUFlLEVBQUUsZUFBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxLQUFLLEVBQUUsR0FBRyxFQUFFOztRQUVyRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDeEM7UUFDRCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7WUFDaEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxLQUFLLEdBQUcscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztTQUNwRTtRQUNELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxrQkFBa0I7YUFDM0MsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDYixJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUN6RCxPQUFPLEtBQUssQ0FBQzthQUNkO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUF5QixDQUFDO1FBQzlDLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1NBQ3BHO1FBRUQsU0FBUyxjQUFjLENBQUMsS0FBeUI7WUFDL0MsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQzthQUM1RDtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksTUFBQSxLQUFLLENBQUMsYUFBYSwwQ0FBRSxNQUFNLEVBQUU7WUFDL0IsTUFBTSxPQUFPLEdBQW9CLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDM0QsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLEVBQUU7b0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztpQkFDbEU7Z0JBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xELENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUNsSDthQUFNLElBQUksTUFBQSxLQUFLLENBQUMsY0FBYywwQ0FBRSxNQUFNLEVBQUU7WUFDdkMsTUFBTSxPQUFPLEdBQW1CLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7aUJBQy9EO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQy9HO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVyxDQUNULFVBQWtCLEVBQ2xCLFNBQWtELEVBQ2xELFNBQThDLHNCQUFzQjtRQUVwRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDeEY7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQy9EO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFVBQWtCLEVBQUUsY0FBc0IsRUFBRSxhQUFxQjtRQUM3RixNQUFNLHNCQUFzQixHQUFHLG9DQUEyQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztTQUN4RTtRQUNELHFDQUE0QixDQUFDLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNwRixPQUFPLHNCQUFzQixDQUFDO0lBQ2hDLENBQUM7SUFFTyxlQUFlLENBQUMsVUFBa0IsRUFBRSxzQkFBOEM7UUFDeEYsTUFBTSxpQkFBaUIsR0FBRyw4QkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGVBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQ2IsU0FBUyxDQUFBLGlCQUFpQixhQUFqQixpQkFBaUIsdUJBQWpCLGlCQUFpQixDQUFFLE1BQU0sRUFBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHdDQUF3QyxDQUMxRyxDQUFDO1NBQ0g7UUFDRCwrQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsc0JBQXNCLENBQ3BCLFVBQWtCLEVBQ2xCLE1BQW9CLEVBQ3BCLEVBQUUsWUFBWSxHQUFHLENBQUMsZUFBVyxDQUFDLGVBQWUsRUFBRSxlQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsYUFBYSxHQUFHLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFFckcsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDL0M7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQseURBQXlEO1FBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkcsTUFBTSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7U0FDNUU7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5RCxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFbEYsSUFBSSxVQUFrQixDQUFDO1FBQ3ZCLElBQUksYUFBYSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQzthQUMzRTtZQUVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0YsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7YUFDbEQ7WUFFRCxVQUFVLEdBQUcsZ0NBQXVCLENBQUM7Z0JBQ25DLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtnQkFDN0IsVUFBVSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7Z0JBQ3JDLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztnQkFDcEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNoQyxJQUFJO2FBQ0wsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNSO2FBQU07WUFDTCxNQUFNLFVBQVUsR0FBRyxtQ0FBMEIsQ0FBQztnQkFDNUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUNuRCxPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixNQUFNLEVBQUUsSUFBSTtnQkFDWixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7Z0JBQ3BDLFdBQVcsRUFBRSxLQUFLLENBQUMsYUFBYTthQUNqQyxDQUFDLENBQUM7WUFFSCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsVUFBVSxHQUFHLDBCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3RHO1FBRUQsSUFBSSxXQUFXLEtBQUssZUFBVyxDQUFDLGVBQWUsRUFBRTtZQUMvQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsRTtRQUVELE1BQU0sR0FBRyxHQUFHLG1DQUEwQixDQUFDO1lBQ3JDLGlCQUFpQixFQUFFLFlBQVk7WUFDL0IsWUFBWTtZQUNaLFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0JBQWdCLENBQ2QsVUFBa0IsRUFDbEIsTUFBcUIsRUFDckIsVUFBb0IsRUFDcEIsZUFBeUIsQ0FBQyxlQUFXLENBQUMsZUFBZSxFQUFFLGVBQVcsQ0FBQyxXQUFXLENBQUM7O1FBRS9FLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGFBQWEsMENBQUUsTUFBTSxDQUFBLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsTUFBTSxNQUFNLEdBQUcsZ0NBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztTQUMvRDtRQUNELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxrQkFBa0IsR0FBRyxXQUFPLENBQUMsaUJBQWlCLENBQUMsT0FBTSxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6RixNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsa0JBQWtCLENBQUM7UUFDM0MsSUFBSSxXQUFXLEtBQUssYUFBYSxDQUFDLFdBQVcsRUFBRTtZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7U0FDeEU7UUFDRCxNQUFNLFFBQVEsR0FBRyxXQUFPLENBQUMsY0FBYyxDQUFDLE9BQU0sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNqRjtRQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUYsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLFdBQVcsS0FBSyxlQUFXLENBQUMsZUFBZSxFQUFFO1lBQy9DLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFO1lBQ2hDLFlBQVksRUFBRTtnQkFDWjtvQkFDRSxNQUFNO29CQUNOLFNBQVM7b0JBQ1QsUUFBUTtpQkFDVDthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsVUFBa0I7O1FBQy9DLE1BQU0sS0FBSyxHQUFHLHFCQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUQsSUFBSSxNQUFBLEtBQUssQ0FBQyxhQUFhLDBDQUFFLE1BQU0sRUFBRTtZQUMvQixPQUFPLFdBQU8sQ0FBQyx5QkFBeUIsQ0FBQztnQkFDdkMsWUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWTtnQkFDakQsVUFBVSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTthQUMxQyxDQUFDLENBQUM7U0FDSjthQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3RELE9BQU8sV0FBTyxDQUFDLHlCQUF5QixDQUFDO2dCQUN2QyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7Z0JBQ3BDLFdBQVcsRUFBRSxLQUFLLENBQUMsYUFBYTthQUNqQyxDQUFDLENBQUM7U0FDSjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sb0JBQW9CLENBQzFCLFVBQWtCLEVBQ2xCLFlBQXVCLEVBQ3ZCLFFBQWlCO1FBS2pCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUN4QztRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsSUFBSSxlQUFXLENBQUMsZUFBZSxDQUFDO1FBQzVGLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQ2IsaUVBQWlFO2dCQUMvRCwwREFBMEQsV0FBVyxFQUFFLENBQzFFLENBQUM7U0FDSDtRQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyx1Q0FBdUM7UUFDdkUsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxPQUFPLENBQUM7WUFDWixJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUU7Z0JBQ3hCLHNGQUFzRjtnQkFDdEYsTUFBTSxnQkFBZ0IsR0FBSSxJQUFJLENBQUMsV0FBK0IsQ0FBQyxxQkFBcUIsQ0FDbEYsS0FBSyxDQUFDLGNBQWMsRUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQ2hCLENBQUM7Z0JBRUYsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDckMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRTVDLDJGQUEyRjtnQkFDM0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsa0RBQWtELENBQUMsQ0FBQztpQkFDMUc7Z0JBRUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDdkMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUMvQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7Z0JBQzVCLE9BQU8sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQzthQUN2RDtZQUNELGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFVBQVUsZ0RBQWdELENBQUMsQ0FBQztTQUMxRztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hHLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJCQUEyQixDQUFDLFVBQWtCLEVBQUUsWUFBaUM7UUFDL0UsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO1lBQzlDLEdBQUcsRUFBRSx3Q0FBb0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1lBQzNDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUNBQW1DLENBQUMsVUFBa0IsRUFBRSxZQUFpQzs7UUFDdkYsTUFBTSxLQUFLLEdBQUcscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxNQUFNLEdBQUcsR0FBRyx3Q0FBb0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksQ0FBQztRQUMvQixJQUFJLE1BQUEsS0FBSyxDQUFDLGNBQWMsMENBQUUsTUFBTSxFQUFFO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNqQixLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUNoRCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFO1lBQ3ZDLEdBQUc7WUFDSCxLQUFLO1NBQ04sQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCLENBQUMsVUFBa0IsRUFBRSxTQUFnQztRQUN4RSxNQUFNLEtBQUssR0FBRyxxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELE9BQU8seUNBQThCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0IsQ0FBQyxVQUFrQixFQUFFLFlBQW1DOztRQUM5RSxNQUFNLEtBQUssR0FBRyxxQkFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGNBQWMsMENBQUUsTUFBTSxDQUFBLEVBQUU7WUFDakMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9GLE1BQU0sSUFBSSxLQUFLLENBQUMsd0VBQXdFLENBQUMsQ0FBQztTQUMzRjtRQUNELEtBQUssQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakUsTUFBTSxHQUFHLEdBQUcsd0NBQW9CLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sQ0FBQyxDQUNOLFlBQVksS0FBSyxTQUFTO2dCQUMxQixDQUFDLFlBQVksQ0FBQyxVQUFVLEtBQUssR0FBRyxDQUFDLFVBQVU7b0JBQ3pDLENBQUMsWUFBWSxDQUFDLE9BQU8sS0FBSyxTQUFTO3dCQUNqQyxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUFDLE9BQU87NEJBQ25DLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDOUYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8seUJBQXlCLENBQy9CLFVBQWtCLEVBQ2xCLE9BQXVCLEVBQ3ZCLE9BQTJCLEVBQzNCLFNBQTBELEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRTtRQUVsRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxNQUFNLGlCQUFpQixHQUFHLEdBQW1CLEVBQUU7O1lBQzdDLElBQUksQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLGtCQUFrQiwwQ0FBRSxNQUFNLENBQUEsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDWixNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUM7YUFDNUY7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDMUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsTUFBTSxZQUFZLEdBQUcsb0NBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7U0FDeEU7UUFDRCxxQ0FBNEIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEYsTUFBTSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxHQUFHLFlBQVksQ0FBQztRQUUxRCxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2RyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsMEVBQTBFLENBQUMsQ0FBQztTQUM3RjtRQUVELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFdkQsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUN4QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQzthQUNuRjtZQUNELG1FQUFtRTtZQUNuRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQzthQUMzRTtZQUNELE1BQU0sTUFBTSxHQUFHLDhCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsVUFBVSxFQUFFLENBQUMsQ0FBQzthQUM1RDtZQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQzthQUNuRDtZQUNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakcsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLCtFQUErRSxDQUFDLENBQUM7YUFDbEc7WUFFRCxRQUFRLEdBQUcsdUNBQThCLENBQUM7Z0JBQ3hDLFVBQVUsRUFBRSxjQUFjLENBQUMsVUFBVTtnQkFDckMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7Z0JBQ3JDLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztnQkFDcEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNoQyxJQUFJO2FBQ0wsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUMvQixjQUFjLENBQUMsVUFBVSxFQUN6QixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLElBQUksRUFDSixNQUFNLENBQUMsU0FBUyxDQUNqQixDQUNGLENBQUM7U0FDSDtRQUVELE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVPLG9CQUFvQixDQUMxQixPQUF1QixFQUN2QixPQUEyQixFQUMzQixVQUFtQixFQUNuQixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7WUFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsTUFBTSxZQUFZLEdBQUcsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEMsT0FBTzthQUNSO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxLQUFLLEVBQUUsaUNBQXdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILG1CQUFtQixDQUNqQixVQUFrQixFQUNsQixjQUE4QixFQUM5QixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILHFCQUFxQixDQUNuQixVQUFrQixFQUNsQixPQUF1QixFQUN2QixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYscUJBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHVCQUF1QixDQUNyQixPQUF1QixFQUN2QixTQUEwRCxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUU7UUFFbEYsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCx5QkFBeUIsQ0FDdkIsT0FBdUIsRUFDdkIsU0FBMEQsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFO1FBRWxGLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFVLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBdGxDRCw0QkFzbENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHNidCBhcyBQc2J0QmFzZSB9IGZyb20gJ2JpcDE3NCc7XG5pbXBvcnQge1xuICBCaXAzMkRlcml2YXRpb24sXG4gIFRhcEJpcDMyRGVyaXZhdGlvbixcbiAgVHJhbnNhY3Rpb24gYXMgSVRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkZyb21CdWZmZXIsXG59IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgY2hlY2tGb3JJbnB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3V0aWxzJztcbmltcG9ydCB7IEJ1ZmZlcldyaXRlciwgdmFydWludCB9IGZyb20gJ2JpdGNvaW5qcy1saWIvc3JjL2J1ZmZlcnV0aWxzJztcbmltcG9ydCB7IFNlc3Npb25LZXkgfSBmcm9tICdAYnJhbmRvbmJsYWNrL211c2lnJztcbmltcG9ydCB7IEJJUDMyRmFjdG9yeSwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdiaXAzMic7XG5pbXBvcnQgKiBhcyBiczU4Y2hlY2sgZnJvbSAnYnM1OGNoZWNrJztcbmltcG9ydCB7IGRlY29kZVByb3ByaWV0YXJ5S2V5LCBlbmNvZGVQcm9wcmlldGFyeUtleSB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL3Byb3ByaWV0YXJ5S2V5VmFsJztcblxuaW1wb3J0IHsgdGFwcm9vdCwgSERTaWduZXIsIFBzYnQsIFBzYnRUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb24sIFR4T3V0cHV0LCBOZXR3b3JrLCBlY2MgYXMgZWNjTGliIH0gZnJvbSAnLi4nO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uIH0gZnJvbSAnLi9VdHhvVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgZ2V0T3V0cHV0SWRGb3JJbnB1dCB9IGZyb20gJy4vVW5zcGVudCc7XG5pbXBvcnQgeyBpc1NlZ3dpdCB9IGZyb20gJy4vcHNidC9zY3JpcHRUeXBlcyc7XG5pbXBvcnQgeyB1bnNpZ24gfSBmcm9tICcuL3BzYnQvZnJvbUhhbGZTaWduZWQnO1xuaW1wb3J0IHsgY2hlY2tQbGFpblB1YmxpY0tleSwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBwYXJzZVB1YlNjcmlwdDJPZjMgfSBmcm9tICcuL3BhcnNlSW5wdXQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24sXG4gIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnLFxuICBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2UsXG4gIG11c2lnMlBhcnRpYWxTaWduLFxuICBwYXJzZVBzYnRNdXNpZzJOb25jZXMsXG4gIHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgUHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgYXNzZXJ0UHNidE11c2lnMk5vbmNlcyxcbiAgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyxcbiAgTXVzaWcyTm9uY2VTdG9yZSxcbiAgUHNidE11c2lnMlB1Yk5vbmNlLFxuICBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyxcbiAgbXVzaWcyUGFydGlhbFNpZ1ZlcmlmeSxcbiAgbXVzaWcyQWdncmVnYXRlU2lncyxcbiAgZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyxcbiAgbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24sXG4gIGNyZWF0ZU11c2lnMkRldGVybWluaXN0aWNOb25jZSxcbn0gZnJvbSAnLi9NdXNpZzInO1xuaW1wb3J0IHsgaXNUcmlwbGUsIGlzVHVwbGUsIFRyaXBsZSwgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldFRhcHJvb3RPdXRwdXRLZXkgfSBmcm9tICcuLi90YXByb290JztcbmltcG9ydCB7XG4gIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyxcbiAgZ2V0UHNidElucHV0U2lnbmF0dXJlQ291bnQsXG4gIFByb3ByaWV0YXJ5S2V5U2VhcmNoLFxuICBQcm9wcmlldGFyeUtleVN1YnR5cGUsXG4gIFByb3ByaWV0YXJ5S2V5VmFsdWUsXG4gIFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbn0gZnJvbSAnLi9Qc2J0VXRpbCc7XG5cbnR5cGUgU2lnbmF0dXJlUGFyYW1zID0ge1xuICAvKiogV2hlbiB0cnVlLCBhbmQgYWRkIHRoZSBzZWNvbmQgKGxhc3QpIG5vbmNlIGFuZCBzaWduYXR1cmUgZm9yIGEgdGFwcm9vdCBrZXlcbiAgICogcGF0aCBzcGVuZCBkZXRlcm1pbmlzdGljYWxseS4gVGhyb3dzIGFuIGVycm9yIGlmIGRvbmUgZm9yIHRoZSBmaXJzdCBub25jZS9zaWduYXR1cmVcbiAgICogb2YgYSB0YXByb290IGtleXBhdGggc3BlbmQuIElnbm9yZSBmb3IgYWxsIG90aGVyIGlucHV0IHR5cGVzLlxuICAgKi9cbiAgZGV0ZXJtaW5pc3RpYzogYm9vbGVhbjtcbiAgLyoqIEFsbG93ZWQgc2lnaGFzaCB0eXBlcyAqL1xuICBzaWdoYXNoVHlwZXM6IG51bWJlcltdO1xufTtcblxuY29uc3QgZGVmYXVsdFNpZ25hdHVyZVBhcmFtcyA9IHtcbiAgZGV0ZXJtaW5pc3RpYzogZmFsc2UsXG4gIHNpZ2hhc2hUeXBlczogW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLFxufTtcblxuZnVuY3Rpb24gdG9TaWduYXR1cmVQYXJhbXModjogUGFydGlhbDxTaWduYXR1cmVQYXJhbXM+IHwgbnVtYmVyW10pOiBTaWduYXR1cmVQYXJhbXMge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KSA/IHRvU2lnbmF0dXJlUGFyYW1zKHsgc2lnaGFzaFR5cGVzOiB2IH0pIDogeyAuLi5kZWZhdWx0U2lnbmF0dXJlUGFyYW1zLCAuLi52IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSERUYXByb290U2lnbmVyIGV4dGVuZHMgSERTaWduZXIge1xuICAvKipcbiAgICogVGhlIHBhdGggc3RyaW5nIG11c3QgbWF0Y2ggL15tKFxcL1xcZCsnPykrJC9cbiAgICogZXguIG0vNDQnLzAnLzAnLzEvMjMgbGV2ZWxzIHdpdGggJyBtdXN0IGJlIGhhcmQgZGVyaXZhdGlvbnNcbiAgICovXG4gIGRlcml2ZVBhdGgocGF0aDogc3RyaW5nKTogSERUYXByb290U2lnbmVyO1xuICAvKipcbiAgICogSW5wdXQgaGFzaCAodGhlIFwibWVzc2FnZSBkaWdlc3RcIikgZm9yIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtXG4gICAqIFJldHVybiBhIDY0IGJ5dGUgc2lnbmF0dXJlICgzMiBieXRlIHIgYW5kIDMyIGJ5dGUgcyBpbiB0aGF0IG9yZGVyKVxuICAgKi9cbiAgc2lnblNjaG5vcnIoaGFzaDogQnVmZmVyKTogQnVmZmVyO1xufVxuXG4vKipcbiAqIEhEIHNpZ25lciBvYmplY3QgZm9yIHRhcHJvb3QgcDJ0ciBtdXNpZzIga2V5IHBhdGggc2lnblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhEVGFwcm9vdE11c2lnMlNpZ25lciBleHRlbmRzIEhEU2lnbmVyIHtcbiAgLyoqXG4gICAqIE11c2lnMiByZXF1aXJlcyBzaWduZXIncyAzMi1ieXRlcyBwcml2YXRlIGtleSB0byBiZSBwYXNzZWQgdG8gaXQuXG4gICAqL1xuICBwcml2YXRlS2V5OiBCdWZmZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHN0cmluZyBtdXN0IG1hdGNoIC9ebShcXC9cXGQrJz8pKyQvXG4gICAqIGV4LiBtLzQ0Jy8wJy8wJy8xLzIzIGxldmVscyB3aXRoICcgbXVzdCBiZSBoYXJkIGRlcml2YXRpb25zXG4gICAqL1xuICBkZXJpdmVQYXRoKHBhdGg6IHN0cmluZyk6IEhEVGFwcm9vdE11c2lnMlNpZ25lcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hub3JyU2lnbmVyIHtcbiAgcHVibGljS2V5OiBCdWZmZXI7XG4gIHNpZ25TY2hub3JyKGhhc2g6IEJ1ZmZlcik6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNdXNpZzJTaWduZXIge1xuICBwdWJsaWNLZXk6IEJ1ZmZlcjtcbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcHJvb3RTaWduZXIge1xuICBsZWFmSGFzaGVzOiBCdWZmZXJbXTtcbiAgc2lnbmVyOiBTY2hub3JyU2lnbmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBzYnRPcHRzIHtcbiAgbmV0d29yazogTmV0d29yaztcbiAgbWF4aW11bUZlZVJhdGU/OiBudW1iZXI7IC8vIFtzYXQvYnl0ZV1cbiAgYmlwMzJQYXRoc0Fic29sdXRlPzogYm9vbGVhbjtcbn1cblxuLy8gVE9ETzogdXBzdHJlYW0gZG9lcyBgY2hlY2tJbnB1dHNGb3JQYXJ0aWFsU2lnc2AgYmVmb3JlIGRvaW5nIHRoaW5ncyBsaWtlXG4vLyBgc2V0VmVyc2lvbmAuIE91ciBpbnB1dHMgY291bGQgaGF2ZSB0YXBzY3JpcHRzaWdzIChvciBpbiBmdXR1cmUgdGFwa2V5c2lncylcbi8vIGFuZCBub3QgZmFpbCB0aGF0IGNoZWNrLiBEbyB3ZSB3YW50IHRvIGRvIGFueXRoaW5nIGFib3V0IHRoYXQ/XG5leHBvcnQgY2xhc3MgVXR4b1BzYnQ8VHggZXh0ZW5kcyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiA9IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+PiBleHRlbmRzIFBzYnQge1xuICBwcml2YXRlIG5vbmNlU3RvcmUgPSBuZXcgTXVzaWcyTm9uY2VTdG9yZSgpO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyKGJ1ZmZlcjogQnVmZmVyLCBuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBVdHhvVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcjxiaWdpbnQ+KGJ1ZmZlciwgZmFsc2UsICdiaWdpbnQnLCBuZXR3b3JrKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVQc2J0KG9wdHM6IFBzYnRPcHRzLCBkYXRhPzogUHNidEJhc2UpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIG5ldyBVdHhvUHNidChcbiAgICAgIG9wdHMsXG4gICAgICBkYXRhIHx8IG5ldyBQc2J0QmFzZShuZXcgUHNidFRyYW5zYWN0aW9uKHsgdHg6IG5ldyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PihvcHRzLm5ldHdvcmspIH0pKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUJ1ZmZlcihidWZmZXI6IEJ1ZmZlciwgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyOiBUcmFuc2FjdGlvbkZyb21CdWZmZXIgPSAoYnVmZmVyOiBCdWZmZXIpOiBJVHJhbnNhY3Rpb24gPT4ge1xuICAgICAgY29uc3QgdHggPSB0aGlzLnRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihidWZmZXIsIG9wdHMubmV0d29yayk7XG4gICAgICByZXR1cm4gbmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4IH0pO1xuICAgIH07XG4gICAgY29uc3QgcHNidEJhc2UgPSBQc2J0QmFzZS5mcm9tQnVmZmVyKGJ1ZmZlciwgdHJhbnNhY3Rpb25Gcm9tQnVmZmVyLCB7XG4gICAgICBiaXAzMlBhdGhzQWJzb2x1dGU6IG9wdHMuYmlwMzJQYXRoc0Fic29sdXRlLFxuICAgIH0pO1xuICAgIGNvbnN0IHBzYnQgPSB0aGlzLmNyZWF0ZVBzYnQob3B0cywgcHNidEJhc2UpO1xuICAgIC8vIFVwc3RyZWFtIGNoZWNrcyBmb3IgZHVwbGljYXRlIGlucHV0cyBoZXJlLCBidXQgaXQgc2VlbXMgdG8gYmUgb2YgZHViaW91cyB2YWx1ZS5cbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSGV4KGRhdGE6IHN0cmluZywgb3B0czogUHNidE9wdHMpOiBVdHhvUHNidCB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShkYXRhLCAnaGV4JyksIG9wdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXJlbnQgLSBQYXJlbnQga2V5LiBNYXRjaGVkIHdpdGggYGJpcDMyRGVyaXZhdGlvbnNgIHVzaW5nIGBmaW5nZXJwcmludGAgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBiaXAzMkRlcml2YXRpb25zIC0gcG9zc2libGUgZGVyaXZhdGlvbnMgZm9yIGlucHV0IG9yIG91dHB1dFxuICAgKiBAcmV0dXJuIGRlcml2ZWQgYmlwMzIgbm9kZSBpZiBtYXRjaGluZyBkZXJpdmF0aW9uIGlzIGZvdW5kLCB1bmRlZmluZWQgaWYgbm9uZSBpcyBmb3VuZFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmRcbiAgICovXG4gIHN0YXRpYyBkZXJpdmVLZXlQYWlyKHBhcmVudDogQklQMzJJbnRlcmZhY2UsIGJpcDMyRGVyaXZhdGlvbnM6IEJpcDMyRGVyaXZhdGlvbltdKTogQklQMzJJbnRlcmZhY2UgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1hdGNoaW5nRGVyaXZhdGlvbnMgPSBiaXAzMkRlcml2YXRpb25zLmZpbHRlcigoYmlwRHYpID0+IHtcbiAgICAgIHJldHVybiBiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMocGFyZW50LmZpbmdlcnByaW50KTtcbiAgICB9KTtcblxuICAgIGlmICghbWF0Y2hpbmdEZXJpdmF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIC8vIE5vIGZpbmdlcnByaW50IG1hdGNoXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0Rlcml2YXRpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbW9yZSB0aGFuIG9uZSBtYXRjaGluZyBkZXJpdmF0aW9uIGZvciBmaW5nZXJwcmludCAke3BhcmVudC5maW5nZXJwcmludC50b1N0cmluZygnaGV4Jyl9OiAke1xuICAgICAgICAgIG1hdGNoaW5nRGVyaXZhdGlvbnMubGVuZ3RoXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IFtkZXJpdmF0aW9uXSA9IG1hdGNoaW5nRGVyaXZhdGlvbnM7XG4gICAgY29uc3Qgbm9kZSA9IHBhcmVudC5kZXJpdmVQYXRoKGRlcml2YXRpb24ucGF0aCk7XG5cbiAgICBpZiAoIWRlcml2YXRpb24ucHVia2V5LmVxdWFscyhub2RlLnB1YmxpY0tleSkgJiYgIWRlcml2YXRpb24ucHVia2V5LmVxdWFscyh0b1hPbmx5UHVibGljS2V5KG5vZGUucHVibGljS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHVia2V5IGRpZCBub3QgbWF0Y2ggYmlwMzJEZXJpdmF0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBOZXR3b3JrIHtcbiAgICByZXR1cm4gdGhpcy50eC5uZXR3b3JrO1xuICB9XG5cbiAgdG9IZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIGdldE5vbldpdG5lc3NQcmV2aW91c1R4aWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIGNvbnN0IHR4aWRTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgaGF2ZSB3aXRuZXNzIFVUWE8gZm9yIGFsbCBpbnB1dHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTZWd3aXQoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0LCBpbnB1dC5yZWRlZW1TY3JpcHQpKSB7XG4gICAgICAgIHR4aWRTZXQuYWRkKGdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5kZXhdKS50eGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gWy4uLnR4aWRTZXRdO1xuICB9XG5cbiAgYWRkTm9uV2l0bmVzc1V0eG9zKHR4QnVmczogUmVjb3JkPHN0cmluZywgQnVmZmVyPik6IHRoaXMge1xuICAgIGNvbnN0IHR4SW5wdXRzID0gdGhpcy50eElucHV0czsgLy8gVGhlc2UgYXJlIHNvbWV3aGF0IGNvc3RseSB0byBleHRyYWN0XG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgd2l0bmVzcyBVVFhPIGZvciBhbGwgaW5wdXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2Vnd2l0KGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCwgaW5wdXQucmVkZWVtU2NyaXB0KSkge1xuICAgICAgICBjb25zdCB7IHR4aWQgfSA9IGdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5kZXhdKTtcbiAgICAgICAgaWYgKHR4QnVmc1t0eGlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYWxsIHJlcXVpcmVkIHByZXZpb3VzIHRyYW5zYWN0aW9ucyBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXQoaW5kZXgsIHsgbm9uV2l0bmVzc1V0eG86IHR4QnVmc1t0eGlkXSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+LCBwcmV2T3V0cHV0czogVHhPdXRwdXQ8YmlnaW50PltdKTogVXR4b1BzYnQge1xuICAgIGlmIChwcmV2T3V0cHV0cy5sZW5ndGggIT09IHRyYW5zYWN0aW9uLmlucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uIGhhcyAke3RyYW5zYWN0aW9uLmlucy5sZW5ndGh9IGlucHV0cywgYnV0ICR7cHJldk91dHB1dHMubGVuZ3RofSBwcmV2aW91cyBvdXRwdXRzIHByb3ZpZGVkYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY2xvbmVkVHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi5jbG9uZSgpO1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB1bnNpZ24oY2xvbmVkVHJhbnNhY3Rpb24sIHByZXZPdXRwdXRzKTtcblxuICAgIGNvbnN0IHBzYnRCYXNlID0gbmV3IFBzYnRCYXNlKG5ldyBQc2J0VHJhbnNhY3Rpb24oeyB0eDogY2xvbmVkVHJhbnNhY3Rpb24gfSkpO1xuICAgIGNsb25lZFRyYW5zYWN0aW9uLmlucy5mb3JFYWNoKCgpID0+IHBzYnRCYXNlLmlucHV0cy5wdXNoKHsgdW5rbm93bktleVZhbHM6IFtdIH0pKTtcbiAgICBjbG9uZWRUcmFuc2FjdGlvbi5vdXRzLmZvckVhY2goKCkgPT4gcHNidEJhc2Uub3V0cHV0cy5wdXNoKHsgdW5rbm93bktleVZhbHM6IFtdIH0pKTtcbiAgICBjb25zdCBwc2J0ID0gdGhpcy5jcmVhdGVQc2J0KHsgbmV0d29yazogdHJhbnNhY3Rpb24ubmV0d29yayB9LCBwc2J0QmFzZSk7XG5cbiAgICB1cGRhdGVzLmZvckVhY2goKHVwZGF0ZSwgaW5kZXgpID0+IHtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5kZXgsIHVwZGF0ZSk7XG4gICAgICBwc2J0LnVwZGF0ZUlucHV0KGluZGV4LCB7IHdpdG5lc3NVdHhvOiB7IHNjcmlwdDogcHJldk91dHB1dHNbaW5kZXhdLnNjcmlwdCwgdmFsdWU6IHByZXZPdXRwdXRzW2luZGV4XS52YWx1ZSB9IH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBnZXRVbnNpZ25lZFR4KCk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gdGhpcy50eC5jbG9uZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBuZXdUcmFuc2FjdGlvbihuZXR3b3JrOiBOZXR3b3JrKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiBuZXcgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4obmV0d29yayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHR4KCk6IFR4IHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YS5nbG9iYWxNYXAudW5zaWduZWRUeCBhcyBQc2J0VHJhbnNhY3Rpb24pLnR4IGFzIFR4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrRm9yU2lnbmF0dXJlcyhwcm9wTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fCBpbnB1dC50YXBLZXlTaWcgfHwgaW5wdXQucGFydGlhbFNpZz8ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vZGlmeSAke3Byb3BOYW1lID8/ICd0cmFuc2FjdGlvbid9IC0gc2lnbmF0dXJlcyBleGlzdC5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdCBrZXkgcGF0aC5cbiAgICogQ2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtaW5pbXVtIHJlcXVpcmVkIGtleSBwYXRoIGlucHV0IGZpZWxkcyBhbmQgYWJzZW5jZSBvZiBhbnkgc2NyaXB0IHBhdGggb25seSBpbnB1dCBmaWVsZHMuXG4gICAqL1xuICBpc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICAhIWlucHV0LnRhcEludGVybmFsS2V5ICYmXG4gICAgICAhIWlucHV0LnRhcE1lcmtsZVJvb3QgJiZcbiAgICAgICEoXG4gICAgICAgIGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCB8fFxuICAgICAgICBpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCB8fFxuICAgICAgICBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/LnNvbWUoKHYpID0+IHYubGVhZkhhc2hlcy5sZW5ndGgpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdCBzY3JpcHQgcGF0aC5cbiAgICogQ2hlY2tzIGZvciBwcmVzZW5jZSBvZiBtaW5pbXVtIHJlcXVpcmVkIHNjcmlwdCBwYXRoIGlucHV0IGZpZWxkcyBhbmQgYWJzZW5jZSBvZiBhbnkga2V5IHBhdGggb25seSBpbnB1dCBmaWVsZHMuXG4gICAqL1xuICBpc1RhcHJvb3RTY3JpcHRQYXRoSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiAoXG4gICAgICAhIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgICAgICB9KS5sZW5ndGggfHxcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BVQl9OT05DRSxcbiAgICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICAgICAgfSkubGVuZ3RoXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnB1dCBhdCBpbnB1dEluZGV4IGlzIGEgdGFwcm9vdFxuICAgKi9cbiAgaXNUYXByb290SW5wdXQoaW5wdXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IGlzUDJUUiA9IChzY3JpcHQ6IEJ1ZmZlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZ2V0VGFwcm9vdE91dHB1dEtleShzY3JpcHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuICEhKFxuICAgICAgaW5wdXQudGFwSW50ZXJuYWxLZXkgfHxcbiAgICAgIGlucHV0LnRhcE1lcmtsZVJvb3QgfHxcbiAgICAgIGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCB8fFxuICAgICAgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5sZW5ndGggfHxcbiAgICAgIGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgKGlucHV0LndpdG5lc3NVdHhvICYmIGlzUDJUUihpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICovXG4gIGZpbmFsaXplQWxsSW5wdXRzKCk6IHRoaXMge1xuICAgIGNvbnN0IGlzTXVsdGlzaWdUYXByb290U2NyaXB0ID0gKHNjcmlwdDogQnVmZmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCAwKTsgLy8gbWFraW5nIHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmVcbiAgICB0aGlzLmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gaXNNdWx0aXNpZ1RhcHJvb3RTY3JpcHQoaW5wdXQudGFwTGVhZlNjcmlwdFswXS5zY3JpcHQpXG4gICAgICAgICAgPyB0aGlzLmZpbmFsaXplVGFwcm9vdElucHV0KGlkeClcbiAgICAgICAgICA6IHRoaXMuZmluYWxpemVUYXBJbnB1dFdpdGhTaW5nbGVMZWFmU2NyaXB0QW5kU2lnbmF0dXJlKGlkeCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlkeCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemVUYXByb290TXVzaWcySW5wdXQoaWR4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplSW5wdXQoaWR4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwcm9vdElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICAvLyB3aXRuZXNzID0gY29udHJvbC1ibG9jayBzY3JpcHQgZmlyc3Qtc2lnIHNlY29uZC1zaWdcbiAgICBpZiAoaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3IgZmluYWxpemluZycpO1xuICAgIH1cbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH0gPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHdpdG5lc3M6IEJ1ZmZlcltdID0gW3NjcmlwdCwgY29udHJvbEJsb2NrXTtcbiAgICBjb25zdCBbcHVia2V5MSwgcHVia2V5Ml0gPSBwYXJzZVB1YlNjcmlwdDJPZjMoc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXM7XG4gICAgZm9yIChjb25zdCBwayBvZiBbcHVia2V5MSwgcHVia2V5Ml0pIHtcbiAgICAgIGNvbnN0IHNpZyA9IGlucHV0LnRhcFNjcmlwdFNpZz8uZmluZCgoeyBwdWJrZXkgfSkgPT4gcHVia2V5LmVxdWFscyhwaykpO1xuICAgICAgaWYgKCFzaWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBzaWduYXR1cmVzIGluIFNjcmlwdCBTaWcuJyk7XG4gICAgICB9XG4gICAgICB3aXRuZXNzLnVuc2hpZnQoc2lnLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2l0bmVzc0xlbmd0aCA9IHdpdG5lc3MucmVkdWNlKChzLCBiKSA9PiBzICsgYi5sZW5ndGggKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKGIubGVuZ3RoKSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KHdpdG5lc3NMZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcih3aXRuZXNzKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5hbGl6ZXMgYSB0YXByb290IG11c2lnMiBpbnB1dCBieSBhZ2dyZWdhdGluZyBhbGwgcGFydGlhbCBzaWdzLlxuICAgKiBJTVBPUlRBTlQ6IEFsd2F5cyBjYWxsIHZhbGlkYXRlKiBmdW5jdGlvbiBiZWZvcmUgZmluYWxpemluZy5cbiAgICovXG4gIGZpbmFsaXplVGFwcm9vdE11c2lnMklucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBwYXJ0aWFsU2lncyA9IHBhcnNlUHNidE11c2lnMlBhcnRpYWxTaWdzKGlucHV0KTtcbiAgICBpZiAocGFydGlhbFNpZ3M/Lmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG51bWJlciBvZiBwYXJ0aWFsIHNpZ25hdHVyZXMgJHtwYXJ0aWFsU2lncyA/IHBhcnRpYWxTaWdzLmxlbmd0aCA6IDB9IHRvIGZpbmFsaXplYCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFydGlhbFNpZ3M6IHBTaWdzLCBzaWdIYXNoVHlwZSB9ID0gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhwYXJ0aWFsU2lncyk7XG4gICAgY29uc3QgeyBzZXNzaW9uS2V5IH0gPSB0aGlzLmdldE11c2lnMlNlc3Npb25LZXkoaW5wdXRJbmRleCwgc2lnSGFzaFR5cGUpO1xuXG4gICAgY29uc3QgYWdnU2lnID0gbXVzaWcyQWdncmVnYXRlU2lncyhcbiAgICAgIHBTaWdzLm1hcCgocFNpZykgPT4gcFNpZy5wYXJ0aWFsU2lnKSxcbiAgICAgIHNlc3Npb25LZXlcbiAgICApO1xuXG4gICAgY29uc3Qgc2lnID0gc2lnSGFzaFR5cGUgPT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCA/IGFnZ1NpZyA6IEJ1ZmZlci5jb25jYXQoW2FnZ1NpZywgQnVmZmVyLm9mKHNpZ0hhc2hUeXBlKV0pO1xuXG4gICAgLy8gc2luZ2xlIHNpZ25hdHVyZSB3aXRoIDY0LzY1IGJ5dGVzIHNpemUgaXMgc2NyaXB0IHdpdG5lc3MgZm9yIGtleSBwYXRoIHNwZW5kXG4gICAgY29uc3QgYnVmZmVyV3JpdGVyID0gQnVmZmVyV3JpdGVyLndpdGhDYXBhY2l0eSgxICsgdmFydWludC5lbmNvZGluZ0xlbmd0aChzaWcubGVuZ3RoKSArIHNpZy5sZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcihbc2lnXSk7XG4gICAgY29uc3QgZmluYWxTY3JpcHRXaXRuZXNzID0gYnVmZmVyV3JpdGVyLmVuZCgpO1xuXG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgZmluYWxTY3JpcHRXaXRuZXNzIH0pO1xuICAgIHRoaXMuZGF0YS5jbGVhckZpbmFsaXplZElucHV0KGlucHV0SW5kZXgpO1xuICAgIC8vIGRlbGV0aW5nIG9ubHkgQml0R28gcHJvcHJpZXRhcnkga2V5IHZhbHVlcy5cbiAgICB0aGlzLmRlbGV0ZVByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7IGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwSW5wdXRXaXRoU2luZ2xlTGVhZlNjcmlwdEFuZFNpZ25hdHVyZShpbnB1dEluZGV4OiBudW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IG9uZSBsZWFmIHNjcmlwdCBzdXBwb3J0ZWQgZm9yIGZpbmFsaXppbmcnKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHNpZ25hdHVyZXMgaW4gU2NyaXB0IFNpZy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnRyb2xCbG9jaywgc2NyaXB0IH0gPSBpbnB1dC50YXBMZWFmU2NyaXB0WzBdO1xuICAgIGNvbnN0IHdpdG5lc3M6IEJ1ZmZlcltdID0gW2lucHV0LnRhcFNjcmlwdFNpZ1swXS5zaWduYXR1cmUsIHNjcmlwdCwgY29udHJvbEJsb2NrXTtcbiAgICBjb25zdCB3aXRuZXNzTGVuZ3RoID0gd2l0bmVzcy5yZWR1Y2UoKHMsIGIpID0+IHMgKyBiLmxlbmd0aCArIHZhcnVpbnQuZW5jb2RpbmdMZW5ndGgoYi5sZW5ndGgpLCAxKTtcblxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IEJ1ZmZlcldyaXRlci53aXRoQ2FwYWNpdHkod2l0bmVzc0xlbmd0aCk7XG4gICAgYnVmZmVyV3JpdGVyLndyaXRlVmVjdG9yKHdpdG5lc3MpO1xuICAgIGNvbnN0IGZpbmFsU2NyaXB0V2l0bmVzcyA9IGJ1ZmZlcldyaXRlci5lbmQoKTtcblxuICAgIHRoaXMuZGF0YS51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IGZpbmFsU2NyaXB0V2l0bmVzcyB9KTtcbiAgICB0aGlzLmRhdGEuY2xlYXJGaW5hbGl6ZWRJbnB1dChpbnB1dEluZGV4KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqXG4gICAqIFVubGlrZSB0aGUgZnVuY3Rpb24gaXQgb3ZlcnJpZGVzLCB0aGlzIGRvZXMgbm90IHRha2UgYSB2YWxpZGF0b3IuIEluIEJpdEdvXG4gICAqIGNvbnRleHQsIHdlIGtub3cgaG93IHdlIHdhbnQgdG8gdmFsaWRhdGUgc28gd2UganVzdCBoYXJkIGNvZGUgdGhlIHJpZ2h0XG4gICAqIHZhbGlkYXRvci5cbiAgICovXG4gIHZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCk6IGJvb2xlYW4ge1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgMCk7IC8vIG1ha2luZyBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lXG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZGF0YS5pbnB1dHMubWFwKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlkeCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKChmaW5hbCwgcmVzKSA9PiByZXMgJiYgZmluYWwsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWZmIGFueSBtYXRjaGluZyB2YWxpZCBzaWduYXR1cmUgaXMgZm91bmQgZm9yIGEgZGVyaXZlZCBwdWIga2V5IGZyb20gZ2l2ZW4gSEQga2V5IHBhaXIuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0SEQoaW5wdXRJbmRleDogbnVtYmVyLCBoZEtleVBhaXI6IEJJUDMySW50ZXJmYWNlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IHB1YktleSA9IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICA/IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXIoaGRLZXlQYWlyLCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24pPy5wdWJsaWNLZXlcbiAgICAgIDogaW5wdXQuYmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgID8gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihoZEtleVBhaXIsIGlucHV0LmJpcDMyRGVyaXZhdGlvbik/LnB1YmxpY0tleVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFwdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCBkZXJpdmUgZnJvbSBIRCBrZXkgcGFpcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXgsIHB1YktleSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgYW55IHZhbGlkIHNpZ25hdHVyZShzKSBhcmUgZm91bmQgZnJvbSBiaXAzMiBkYXRhIG9mIFBTQlQgb3IgZm9yIGdpdmVuIHB1YiBrZXkuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmlzVGFwcm9vdFNjcmlwdFBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBwdWJrZXkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhcHJvb3RNdXNpZzJTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBwdWJrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCAocCwgbSwgcykgPT4gZWNjTGliLnZlcmlmeShtLCBwLCBzLCB0cnVlKSwgcHVia2V5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyU2Vzc2lvbktleShcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnSGFzaFR5cGU6IG51bWJlclxuICApOiB7XG4gICAgcGFydGljaXBhbnRzOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzO1xuICAgIG5vbmNlczogVHVwbGU8UHNidE11c2lnMlB1Yk5vbmNlPjtcbiAgICBoYXNoOiBCdWZmZXI7XG4gICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgfSB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghaW5wdXQudGFwSW50ZXJuYWxLZXkgfHwgIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYm90aCB0YXBJbnRlcm5hbEtleSBhbmQgdGFwTWVya2xlUm9vdCBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSB0aGlzLmdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4LCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3Qgbm9uY2VzID0gdGhpcy5nZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleCwgcGFydGljaXBhbnRzKTtcblxuICAgIGNvbnN0IHsgaGFzaCB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBbc2lnSGFzaFR5cGVdKTtcblxuICAgIGNvbnN0IHNlc3Npb25LZXkgPSBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbih7XG4gICAgICBwdWJOb25jZXM6IFtub25jZXNbMF0ucHViTm9uY2UsIG5vbmNlc1sxXS5wdWJOb25jZV0sXG4gICAgICBwdWJLZXlzOiBwYXJ0aWNpcGFudHMucGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgdHhIYXNoOiBoYXNoLFxuICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcGFydGljaXBhbnRzLCBub25jZXMsIGhhc2gsIHNlc3Npb25LZXkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGZvciBmb2xsb3dpbmcgY2FzZXMuXG4gICAqIElmIHZhbGlkIG11c2lnMiBwYXJ0aWFsIHNpZ25hdHVyZXMgZXhpc3RzIGZvciBib3RoIDIga2V5cywgaXQgd2lsbCBhbHNvIHZlcmlmaWVzIGFnZ3JlZ2F0ZWQgc2lnXG4gICAqIGZvciBhZ2dyZWdhdGVkIHR3ZWFrZWQga2V5IChvdXRwdXQga2V5KSwgb3RoZXJ3aXNlIG9ubHkgdmVyaWZpZXMgcGFydGlhbCBzaWcuXG4gICAqIElmIHB1YmtleSBpcyBwYXNzZWQgaW4gaW5wdXQsIGl0IHdpbGwgY2hlY2sgc2lnIG9ubHkgZm9yIHRoYXQgcHVia2V5LFxuICAgKiBpZiBubyBzaWcgZXhpdHMgZm9yIHN1Y2gga2V5LCB0aHJvd3MgZXJyb3IuXG4gICAqIEZvciBpbnZhbGlkIHN0YXRlIG9mIGlucHV0IGRhdGEsIGl0IHdpbGwgdGhyb3cgZXJyb3JzLlxuICAgKi9cbiAgdmFsaWRhdGVUYXByb290TXVzaWcyU2lnbmF0dXJlc09mSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBwdWJrZXk/OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3QgcGFydGlhbFNpZ3MgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dCk7XG4gICAgaWYgKCFwYXJ0aWFsU2lncykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzaWduYXR1cmVzIHRvIHZhbGlkYXRlYCk7XG4gICAgfVxuXG4gICAgbGV0IG15UGFydGlhbFNpZ3MgPSBwYXJ0aWFsU2lncztcbiAgICBpZiAocHVia2V5KSB7XG4gICAgICBjaGVja1BsYWluUHVibGljS2V5KHB1YmtleSk7XG4gICAgICBteVBhcnRpYWxTaWdzID0gcGFydGlhbFNpZ3MuZmlsdGVyKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHB1YmtleSkpO1xuICAgICAgaWYgKG15UGFydGlhbFNpZ3M/Lmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgcGFydGlhbFNpZ3M6IG15U2lncywgc2lnSGFzaFR5cGUgfSA9IGdldFNpZ0hhc2hUeXBlRnJvbVNpZ3MobXlQYXJ0aWFsU2lncyk7XG4gICAgY29uc3QgeyBwYXJ0aWNpcGFudHMsIG5vbmNlcywgaGFzaCwgc2Vzc2lvbktleSB9ID0gdGhpcy5nZXRNdXNpZzJTZXNzaW9uS2V5KGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBteVNpZ3MubWFwKChteVNpZykgPT4ge1xuICAgICAgY29uc3QgbXlOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKG15U2lnLnBhcnRpY2lwYW50UHViS2V5KSk7XG4gICAgICBpZiAoIW15Tm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBubyBwdWIgbm9uY2UgZm9yIHB1YmtleScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG11c2lnMlBhcnRpYWxTaWdWZXJpZnkobXlTaWcucGFydGlhbFNpZywgbXlTaWcucGFydGljaXBhbnRQdWJLZXksIG15Tm9uY2UucHViTm9uY2UsIHNlc3Npb25LZXkpO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yIHZhbGlkIHNpbmdsZSBzaWcgb3IgMSBvciAyIGZhaWx1cmUgc2lncywgbm8gbmVlZCB0byB2YWxpZGF0ZSBhZ2dyZWdhdGVkIHNpZy4gU28gc2tpcC5cbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzLmV2ZXJ5KChyZXMpID0+IHJlcyk7XG4gICAgaWYgKCFyZXN1bHQgfHwgbXlTaWdzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgYWdnU2lnID0gbXVzaWcyQWdncmVnYXRlU2lncyhcbiAgICAgIG15U2lncy5tYXAoKG15U2lnKSA9PiBteVNpZy5wYXJ0aWFsU2lnKSxcbiAgICAgIHNlc3Npb25LZXlcbiAgICApO1xuXG4gICAgcmV0dXJuIGVjY0xpYi52ZXJpZnlTY2hub3JyKGhhc2gsIHBhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIGFnZ1NpZyk7XG4gIH1cblxuICB2YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIHB1YmtleT86IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBjb25zdCB0YXBTaWdzID0gKGlucHV0IHx8IHt9KS50YXBTY3JpcHRTaWc7XG4gICAgaWYgKCFpbnB1dCB8fCAhdGFwU2lncyB8fCB0YXBTaWdzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2lnbmF0dXJlcyB0byB2YWxpZGF0ZScpO1xuICAgIH1cbiAgICBsZXQgbXlTaWdzO1xuICAgIGlmIChwdWJrZXkpIHtcbiAgICAgIGNvbnN0IHhPbmx5UHVia2V5ID0gdG9YT25seVB1YmxpY0tleShwdWJrZXkpO1xuICAgICAgbXlTaWdzID0gdGFwU2lncy5maWx0ZXIoKHNpZykgPT4gc2lnLnB1YmtleS5lcXVhbHMoeE9ubHlQdWJrZXkpKTtcbiAgICAgIGlmIChteVNpZ3MubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG15U2lncyA9IHRhcFNpZ3M7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGJvb2xlYW5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBwU2lnIG9mIG15U2lncykge1xuICAgICAgY29uc3QgeyBzaWduYXR1cmUsIGxlYWZIYXNoLCBwdWJrZXkgfSA9IHBTaWc7XG4gICAgICBsZXQgc2lnSGFzaFR5cGU6IG51bWJlcjtcbiAgICAgIGxldCBzaWc6IEJ1ZmZlcjtcbiAgICAgIGlmIChzaWduYXR1cmUubGVuZ3RoID09PSA2NSkge1xuICAgICAgICBzaWdIYXNoVHlwZSA9IHNpZ25hdHVyZVs2NF07XG4gICAgICAgIHNpZyA9IHNpZ25hdHVyZS5zbGljZSgwLCA2NCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWdIYXNoVHlwZSA9IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVDtcbiAgICAgICAgc2lnID0gc2lnbmF0dXJlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIFtzaWdIYXNoVHlwZV0sIGxlYWZIYXNoKTtcbiAgICAgIHJlc3VsdHMucHVzaChlY2NMaWIudmVyaWZ5U2Nobm9ycihoYXNoLCBwdWJrZXksIHNpZykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzKSA9PiByZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4XG4gICAqIEBwYXJhbSByb290Tm9kZXMgb3B0aW9uYWwgaW5wdXQgcm9vdCBiaXAzMiBub2RlcyB0byB2ZXJpZnkgd2l0aC4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBnbG9iYWxYcHViIHdpbGwgYmUgdXNlZC5cbiAgICogQHJldHVybiBhcnJheSBvZiBib29sZWFuIHZhbHVlcy4gVHJ1ZSB3aGVuIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gYHB1YmxpY0tleXNgIGhhcyBzaWduZWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBJZiBubyBzaWduYXR1cmUgaW4gdGhlIHR4IG9yIG5vIHB1YmxpYyBrZXkgbWF0Y2hpbmcgc2lnbmF0dXJlLCB0aGUgdmFsaWRhdGlvbiBpcyBjb25zaWRlcmVkIGFzIGZhbHNlLlxuICAgKi9cbiAgZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICB7IHJvb3ROb2RlcyB9OiB7IHJvb3ROb2Rlcz86IFRyaXBsZTxCSVAzMkludGVyZmFjZT4gfSA9IHt9XG4gICk6IFRyaXBsZTxib29sZWFuPiB7XG4gICAgaWYgKCFyb290Tm9kZXMgJiYgKCF0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWI/Lmxlbmd0aCB8fCAhaXNUcmlwbGUodGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBzaWduYXR1cmUgdmFsaWRhdGlvbiBhcnJheSB3aXRob3V0IDMgZ2xvYmFsIHhwdWJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlwMzJzID0gcm9vdE5vZGVzXG4gICAgICA/IHJvb3ROb2Rlc1xuICAgICAgOiB0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWI/Lm1hcCgoeHB1YikgPT5cbiAgICAgICAgICBCSVAzMkZhY3RvcnkoZWNjTGliKS5mcm9tQmFzZTU4KGJzNThjaGVjay5lbmNvZGUoeHB1Yi5leHRlbmRlZFB1YmtleSkpXG4gICAgICAgICk7XG5cbiAgICBpZiAoIWJpcDMycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlaXRoZXIgZ2xvYmFsTWFwIG9yIHJvb3ROb2RlcyBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0KSkge1xuICAgICAgcmV0dXJuIFtmYWxzZSwgZmFsc2UsIGZhbHNlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmlwMzJzLm1hcCgoYmlwMzIpID0+IHtcbiAgICAgIGNvbnN0IHB1YktleSA9IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICAgID8gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihiaXAzMiwgaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uKT8ucHVibGljS2V5XG4gICAgICAgIDogaW5wdXQuYmlwMzJEZXJpdmF0aW9uPy5sZW5ndGhcbiAgICAgICAgPyBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGJpcDMyLCBpbnB1dC5iaXAzMkRlcml2YXRpb24pPy5wdWJsaWNLZXlcbiAgICAgICAgOiBiaXAzMj8ucHVibGljS2V5O1xuICAgICAgaWYgKCFwdWJLZXkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbnB1dEluZGV4LCBwdWJLZXkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSkgYXMgVHJpcGxlPGJvb2xlYW4+O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqL1xuICBzaWduQWxsSW5wdXRzSEQoXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgcGFyYW1zOiBudW1iZXJbXSB8IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPiA9IGRlZmF1bHRTaWduYXR1cmVQYXJhbXNcbiAgKTogdGhpcyB7XG4gICAgaWYgKCFoZEtleVBhaXIgfHwgIWhkS2V5UGFpci5wdWJsaWNLZXkgfHwgIWhkS2V5UGFpci5maW5nZXJwcmludCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIEhEU2lnbmVyIHRvIHNpZ24gaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc2lnbklucHV0SEQoaSwgaGRLZXlQYWlyLCB7IHNpZ2hhc2hUeXBlcywgZGV0ZXJtaW5pc3RpYyB9KTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHRydWUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZXN1bHRzLmV2ZXJ5KCh2KSA9PiAhdikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gaW5wdXRzIHdlcmUgc2lnbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzOnNpZ25JbnB1dEhEXG4gICAqL1xuICBzaWduVGFwcm9vdElucHV0SEQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGhkS2V5UGFpcjogSERUYXByb290U2lnbmVyIHwgSERUYXByb290TXVzaWcyU2lnbmVyLFxuICAgIHsgc2lnaGFzaFR5cGVzID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLCBkZXRlcm1pbmlzdGljID0gZmFsc2UgfSA9IHt9XG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IGlucHV0Jyk7XG4gICAgfVxuICAgIGlmICghaGRLZXlQYWlyIHx8ICFoZEtleVBhaXIucHVibGljS2V5IHx8ICFoZEtleVBhaXIuZmluZ2VycHJpbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBIRFNpZ25lciB0byBzaWduIGlucHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbiB8fCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgdGFwQmlwMzJEZXJpdmF0aW9uIHRvIHNpZ24gVGFwcm9vdCB3aXRoIEhEJyk7XG4gICAgfVxuICAgIGNvbnN0IG15RGVyaXZhdGlvbnMgPSBpbnB1dC50YXBCaXAzMkRlcml2YXRpb25cbiAgICAgIC5tYXAoKGJpcER2KSA9PiB7XG4gICAgICAgIGlmIChiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMoaGRLZXlQYWlyLmZpbmdlcnByaW50KSkge1xuICAgICAgICAgIHJldHVybiBiaXBEdjtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHYpID0+ICEhdikgYXMgVGFwQmlwMzJEZXJpdmF0aW9uW107XG4gICAgaWYgKG15RGVyaXZhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCB0byBtYXRjaCB0aGUgSERTaWduZXIgZmluZ2VycHJpbnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREZXJpdmVkTm9kZShiaXBEdjogVGFwQmlwMzJEZXJpdmF0aW9uKTogSERUYXByb290TXVzaWcyU2lnbmVyIHwgSERUYXByb290U2lnbmVyIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBoZEtleVBhaXIuZGVyaXZlUGF0aChiaXBEdi5wYXRoKTtcbiAgICAgIGlmICghYmlwRHYucHVia2V5LmVxdWFscyhub2RlLnB1YmxpY0tleS5zbGljZSgxKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJrZXkgZGlkIG5vdCBtYXRjaCB0YXBCaXAzMkRlcml2YXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNpZ25lcnM6IFRhcHJvb3RTaWduZXJbXSA9IG15RGVyaXZhdGlvbnMubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBjb25zdCBzaWduZXIgPSBnZXREZXJpdmVkTm9kZShiaXBEdik7XG4gICAgICAgIGlmICghKCdzaWduU2Nobm9ycicgaW4gc2lnbmVyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnblNjaG5vcnIgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gc2lnbiBwMnRyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc2lnbmVyLCBsZWFmSGFzaGVzOiBiaXBEdi5sZWFmSGFzaGVzIH07XG4gICAgICB9KTtcbiAgICAgIHNpZ25lcnMuZm9yRWFjaCgoeyBzaWduZXIsIGxlYWZIYXNoZXMgfSkgPT4gdGhpcy5zaWduVGFwcm9vdElucHV0KGlucHV0SW5kZXgsIHNpZ25lciwgbGVhZkhhc2hlcywgc2lnaGFzaFR5cGVzKSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleT8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzaWduZXJzOiBNdXNpZzJTaWduZXJbXSA9IG15RGVyaXZhdGlvbnMubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBjb25zdCBzaWduZXIgPSBnZXREZXJpdmVkTm9kZShiaXBEdik7XG4gICAgICAgIGlmICghKCdwcml2YXRlS2V5JyBpbiBzaWduZXIpIHx8ICFzaWduZXIucHJpdmF0ZUtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZUtleSBpcyByZXF1aXJlZCB0byBzaWduIHAydHIgbXVzaWcyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpZ25lcjtcbiAgICAgIH0pO1xuICAgICAgc2lnbmVycy5mb3JFYWNoKChzaWduZXIpID0+IHRoaXMuc2lnblRhcHJvb3RNdXNpZzJJbnB1dChpbnB1dEluZGV4LCBzaWduZXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduSW5wdXRIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgcGFyYW1zOiBudW1iZXJbXSB8IFBhcnRpYWw8U2lnbmF0dXJlUGFyYW1zPiA9IGRlZmF1bHRTaWduYXR1cmVQYXJhbXNcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHBhcmFtcyk7XG4gICAgaWYgKHRoaXMuaXNUYXByb290SW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UYXByb290SW5wdXRIRChpbnB1dEluZGV4LCBoZEtleVBhaXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIuc2lnbklucHV0SEQoaW5wdXRJbmRleCwgaGRLZXlQYWlyLCBzaWdoYXNoVHlwZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0SW5kZXg6IG51bWJlciwgdGFwSW50ZXJuYWxLZXk6IEJ1ZmZlciwgdGFwTWVya2xlUm9vdDogQnVmZmVyKSB7XG4gICAgY29uc3QgcGFydGljaXBhbnRzS2V5VmFsRGF0YSA9IHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyh0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdKTtcbiAgICBpZiAoIXBhcnRpY2lwYW50c0tleVZhbERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgMCBtYXRjaGluZyBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxYCk7XG4gICAgfVxuICAgIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzS2V5VmFsRGF0YSwgdGFwSW50ZXJuYWxLZXksIHRhcE1lcmtsZVJvb3QpO1xuICAgIHJldHVybiBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleDogbnVtYmVyLCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzKSB7XG4gICAgY29uc3Qgbm9uY2VzS2V5VmFsc0RhdGEgPSBwYXJzZVBzYnRNdXNpZzJOb25jZXModGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XSk7XG4gICAgaWYgKCFub25jZXNLZXlWYWxzRGF0YSB8fCAhaXNUdXBsZShub25jZXNLZXlWYWxzRGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZvdW5kICR7bm9uY2VzS2V5VmFsc0RhdGE/Lmxlbmd0aCA/IG5vbmNlc0tleVZhbHNEYXRhLmxlbmd0aCA6IDB9IG1hdGNoaW5nIG5vbmNlIGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDJgXG4gICAgICApO1xuICAgIH1cbiAgICBhc3NlcnRQc2J0TXVzaWcyTm9uY2VzKG5vbmNlc0tleVZhbHNEYXRhLCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhKTtcbiAgICByZXR1cm4gbm9uY2VzS2V5VmFsc0RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgcDJ0ciBtdXNpZzIga2V5IHBhdGggaW5wdXQgd2l0aCAyIGFnZ3JlZ2F0ZWQga2V5cy5cbiAgICpcbiAgICogTm90ZTogT25seSBjYW4gc2lnbiBkZXRlcm1pbmlzdGljYWxseSBhcyB0aGUgY29zaWduZXJcbiAgICogQHBhcmFtIGlucHV0SW5kZXhcbiAgICogQHBhcmFtIHNpZ25lciAtIFhZIHB1YmxpYyBrZXkgYW5kIHByaXZhdGUga2V5IGFyZSByZXF1aXJlZFxuICAgKiBAcGFyYW0gc2lnaGFzaFR5cGVzXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNpZ24gdGhlIG11c2lnIGlucHV0IGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzaWduVGFwcm9vdE11c2lnMklucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWduZXI6IE11c2lnMlNpZ25lcixcbiAgICB7IHNpZ2hhc2hUeXBlcyA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXSwgZGV0ZXJtaW5pc3RpYyA9IGZhbHNlIH0gPSB7fVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgbXVzaWcyIGlucHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdO1xuXG4gICAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSB8fCAhaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGlucHV0IGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBSZXRyaWV2ZSBhbmQgY2hlY2sgdGhhdCB3ZSBoYXZlIHR3byBwYXJ0aWNpcGFudCBub25jZXNcbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSB0aGlzLmdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4LCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3QgeyB0YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50UHViS2V5cyB9ID0gcGFydGljaXBhbnRzO1xuICAgIGNvbnN0IHNpZ25lclB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+IHB1YktleS5lcXVhbHMoc2lnbmVyLnB1YmxpY0tleSkpO1xuICAgIGlmICghc2lnbmVyUHViS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lciBwdWIga2V5IHNob3VsZCBtYXRjaCBvbmUgb2YgcGFydGljaXBhbnQgcHViIGtleXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBub25jZXMgPSB0aGlzLmdldE11c2lnMk5vbmNlcyhpbnB1dEluZGV4LCBwYXJ0aWNpcGFudHMpO1xuICAgIGNvbnN0IHsgaGFzaCwgc2lnaGFzaFR5cGUgfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgc2lnaGFzaFR5cGVzKTtcblxuICAgIGxldCBwYXJ0aWFsU2lnOiBCdWZmZXI7XG4gICAgaWYgKGRldGVybWluaXN0aWMpIHtcbiAgICAgIGlmICghc2lnbmVyUHViS2V5LmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG9ubHkgYWRkIGEgZGV0ZXJtaW5pc3RpYyBzaWduYXR1cmUgb24gdGhlIGNvc2lnbmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0U2lnbmVyTm9uY2UgPSBub25jZXMuZmluZCgobikgPT4gbi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMocGFydGljaXBhbnRQdWJLZXlzWzBdKSk7XG4gICAgICBpZiAoIWZpcnN0U2lnbmVyTm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgZmluZCB0aGUgdXNlciBub25jZScpO1xuICAgICAgfVxuXG4gICAgICBwYXJ0aWFsU2lnID0gbXVzaWcyRGV0ZXJtaW5pc3RpY1NpZ24oe1xuICAgICAgICBwcml2YXRlS2V5OiBzaWduZXIucHJpdmF0ZUtleSxcbiAgICAgICAgb3RoZXJOb25jZTogZmlyc3RTaWduZXJOb25jZS5wdWJOb25jZSxcbiAgICAgICAgcHVibGljS2V5czogcGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgICBoYXNoLFxuICAgICAgfSkuc2lnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXNzaW9uS2V5ID0gY3JlYXRlTXVzaWcyU2lnbmluZ1Nlc3Npb24oe1xuICAgICAgICBwdWJOb25jZXM6IFtub25jZXNbMF0ucHViTm9uY2UsIG5vbmNlc1sxXS5wdWJOb25jZV0sXG4gICAgICAgIHB1YktleXM6IHBhcnRpY2lwYW50UHViS2V5cyxcbiAgICAgICAgdHhIYXNoOiBoYXNoLFxuICAgICAgICBpbnRlcm5hbFB1YktleTogaW5wdXQudGFwSW50ZXJuYWxLZXksXG4gICAgICAgIHRhcFRyZWVSb290OiBpbnB1dC50YXBNZXJrbGVSb290LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpZ25lck5vbmNlID0gbm9uY2VzLmZpbmQoKGt2KSA9PiBrdi5wYXJ0aWNpcGFudFB1YktleS5lcXVhbHMoc2lnbmVyUHViS2V5KSk7XG4gICAgICBpZiAoIXNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHViTm9uY2UgaXMgbWlzc2luZy4gcmV0cnkgc2lnbmluZyBwcm9jZXNzJyk7XG4gICAgICB9XG4gICAgICBwYXJ0aWFsU2lnID0gbXVzaWcyUGFydGlhbFNpZ24oc2lnbmVyLnByaXZhdGVLZXksIHNpZ25lck5vbmNlLnB1Yk5vbmNlLCBzZXNzaW9uS2V5LCB0aGlzLm5vbmNlU3RvcmUpO1xuICAgIH1cblxuICAgIGlmIChzaWdoYXNoVHlwZSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICBwYXJ0aWFsU2lnID0gQnVmZmVyLmNvbmNhdChbcGFydGlhbFNpZywgQnVmZmVyLm9mKHNpZ2hhc2hUeXBlKV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZyA9IGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHtcbiAgICAgIHBhcnRpY2lwYW50UHViS2V5OiBzaWduZXJQdWJLZXksXG4gICAgICB0YXBPdXRwdXRLZXksXG4gICAgICBwYXJ0aWFsU2lnOiBwYXJ0aWFsU2lnLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHNpZyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduVGFwcm9vdElucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWduZXI6IFNjaG5vcnJTaWduZXIsXG4gICAgbGVhZkhhc2hlczogQnVmZmVyW10sXG4gICAgc2lnaGFzaFR5cGVzOiBudW1iZXJbXSA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXVxuICApOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgLy8gRmlndXJlIG91dCBpZiB0aGlzIGlzIHNjcmlwdCBwYXRoIG9yIG5vdCwgaWYgbm90LCB0d2VhayB0aGUgcHJpdmF0ZSBrZXlcbiAgICBpZiAoIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBMZWFmU2NyaXB0IGlzIHJlcXVpcmVkIGZvciBwMnRyIHNjcmlwdCBwYXRoJyk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmtleSA9IHRvWE9ubHlQdWJsaWNLZXkoc2lnbmVyLnB1YmxpY0tleSk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3Igc2lnbmluZycpO1xuICAgIH1cbiAgICBjb25zdCB0YXBMZWFmU2NyaXB0ID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXTtcbiAgICBjb25zdCBwYXJzZWRDb250cm9sQmxvY2sgPSB0YXByb290LnBhcnNlQ29udHJvbEJsb2NrKGVjY0xpYiwgdGFwTGVhZlNjcmlwdC5jb250cm9sQmxvY2spO1xuICAgIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IHBhcnNlZENvbnRyb2xCbG9jaztcbiAgICBpZiAobGVhZlZlcnNpb24gIT09IHRhcExlYWZTY3JpcHQubGVhZlZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFwIHNjcmlwdCBsZWFmIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBjb250cm9sIGJsb2NrJyk7XG4gICAgfVxuICAgIGNvbnN0IGxlYWZIYXNoID0gdGFwcm9vdC5nZXRUYXBsZWFmSGFzaChlY2NMaWIsIHBhcnNlZENvbnRyb2xCbG9jaywgdGFwTGVhZlNjcmlwdC5zY3JpcHQpO1xuICAgIGlmICghbGVhZkhhc2hlcy5maW5kKChsKSA9PiBsLmVxdWFscyhsZWFmSGFzaCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZ25lciBjYW5ub3Qgc2lnbiBmb3IgbGVhZiBoYXNoICR7bGVhZkhhc2gudG9TdHJpbmcoJ2hleCcpfWApO1xuICAgIH1cbiAgICBjb25zdCB7IGhhc2gsIHNpZ2hhc2hUeXBlIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIHNpZ2hhc2hUeXBlcywgbGVhZkhhc2gpO1xuICAgIGxldCBzaWduYXR1cmUgPSBzaWduZXIuc2lnblNjaG5vcnIoaGFzaCk7XG4gICAgaWYgKHNpZ2hhc2hUeXBlICE9PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQpIHtcbiAgICAgIHNpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW3NpZ25hdHVyZSwgQnVmZmVyLm9mKHNpZ2hhc2hUeXBlKV0pO1xuICAgIH1cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAgdGFwU2NyaXB0U2lnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwdWJrZXksXG4gICAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICAgIGxlYWZIYXNoLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFwcm9vdE91dHB1dFNjcmlwdChpbnB1dEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRhcHJvb3QuY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7XG4gICAgICAgIGNvbnRyb2xCbG9jazogaW5wdXQudGFwTGVhZlNjcmlwdFswXS5jb250cm9sQmxvY2ssXG4gICAgICAgIGxlYWZTY3JpcHQ6IGlucHV0LnRhcExlYWZTY3JpcHRbMF0uc2NyaXB0LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleSAmJiBpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICByZXR1cm4gdGFwcm9vdC5jcmVhdGVUYXByb290T3V0cHV0U2NyaXB0KHtcbiAgICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgICB0YXB0cmVlUm9vdDogaW5wdXQudGFwTWVya2xlUm9vdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFwcm9vdEhhc2hGb3JTaWcoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ2hhc2hUeXBlcz86IG51bWJlcltdLFxuICAgIGxlYWZIYXNoPzogQnVmZmVyXG4gICk6IHtcbiAgICBoYXNoOiBCdWZmZXI7XG4gICAgc2lnaGFzaFR5cGU6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLmlzVGFwcm9vdElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3Qgc2lnaGFzaFR5cGUgPSB0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdLnNpZ2hhc2hUeXBlIHx8IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVDtcbiAgICBpZiAoc2lnaGFzaFR5cGVzICYmIHNpZ2hhc2hUeXBlcy5pbmRleE9mKHNpZ2hhc2hUeXBlKSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNpZ2hhc2ggdHlwZSBpcyBub3QgYWxsb3dlZC4gUmV0cnkgdGhlIHNpZ24gbWV0aG9kIHBhc3NpbmcgdGhlIGAgK1xuICAgICAgICAgIGBzaWdoYXNoVHlwZXMgYXJyYXkgb2Ygd2hpdGVsaXN0ZWQgdHlwZXMuIFNpZ2hhc2ggdHlwZTogJHtzaWdoYXNoVHlwZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB0eElucHV0cyA9IHRoaXMudHhJbnB1dHM7IC8vIFRoZXNlIGFyZSBzb21ld2hhdCBjb3N0bHkgdG8gZXh0cmFjdFxuICAgIGNvbnN0IHByZXZvdXRTY3JpcHRzOiBCdWZmZXJbXSA9IFtdO1xuICAgIGNvbnN0IHByZXZvdXRWYWx1ZXM6IGJpZ2ludFtdID0gW107XG5cbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICBsZXQgcHJldm91dDtcbiAgICAgIGlmIChpbnB1dC5ub25XaXRuZXNzVXR4bykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNvdWxkIGJlIGNvc3RseSwgZWl0aGVyIGNhY2hlIGl0IGhlcmUsIG9yIGZpbmQgYSB3YXkgdG8gc2hhcmUgd2l0aCBzdXBlclxuICAgICAgICBjb25zdCBub25XaXRuZXNzVXR4b1R4ID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFV0eG9Qc2J0KS50cmFuc2FjdGlvbkZyb21CdWZmZXIoXG4gICAgICAgICAgaW5wdXQubm9uV2l0bmVzc1V0eG8sXG4gICAgICAgICAgdGhpcy50eC5uZXR3b3JrXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJldm91dEhhc2ggPSB0eElucHV0c1tpXS5oYXNoO1xuICAgICAgICBjb25zdCB1dHhvSGFzaCA9IG5vbldpdG5lc3NVdHhvVHguZ2V0SGFzaCgpO1xuXG4gICAgICAgIC8vIElmIGEgbm9uLXdpdG5lc3MgVVRYTyBpcyBwcm92aWRlZCwgaXRzIGhhc2ggbXVzdCBtYXRjaCB0aGUgaGFzaCBzcGVjaWZpZWQgaW4gdGhlIHByZXZvdXRcbiAgICAgICAgaWYgKCFwcmV2b3V0SGFzaC5lcXVhbHModXR4b0hhc2gpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb24td2l0bmVzcyBVVFhPIGhhc2ggZm9yIGlucHV0ICMke2l9IGRvZXNuJ3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2b3V0SW5kZXggPSB0eElucHV0c1tpXS5pbmRleDtcbiAgICAgICAgcHJldm91dCA9IG5vbldpdG5lc3NVdHhvVHgub3V0c1twcmV2b3V0SW5kZXhdO1xuICAgICAgfSBlbHNlIGlmIChpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICBwcmV2b3V0ID0gaW5wdXQud2l0bmVzc1V0eG87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgYSBVdHhvIGlucHV0IGl0ZW0gZm9yIHNpZ25pbmcnKTtcbiAgICAgIH1cbiAgICAgIHByZXZvdXRTY3JpcHRzLnB1c2gocHJldm91dC5zY3JpcHQpO1xuICAgICAgcHJldm91dFZhbHVlcy5wdXNoKHByZXZvdXQudmFsdWUpO1xuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dFNjcmlwdCA9IHRoaXMuZ2V0VGFwcm9vdE91dHB1dFNjcmlwdChpbnB1dEluZGV4KTtcbiAgICBpZiAoIW91dHB1dFNjcmlwdC5lcXVhbHMocHJldm91dFNjcmlwdHNbaW5wdXRJbmRleF0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFdpdG5lc3Mgc2NyaXB0IGZvciBpbnB1dCAjJHtpbnB1dEluZGV4fSBkb2Vzbid0IG1hdGNoIHRoZSBzY3JpcHRQdWJLZXkgaW4gdGhlIHByZXZvdXRgKTtcbiAgICB9XG4gICAgY29uc3QgaGFzaCA9IHRoaXMudHguaGFzaEZvcldpdG5lc3NWMShpbnB1dEluZGV4LCBwcmV2b3V0U2NyaXB0cywgcHJldm91dFZhbHVlcywgc2lnaGFzaFR5cGUsIGxlYWZIYXNoKTtcbiAgICByZXR1cm4geyBoYXNoLCBzaWdoYXNoVHlwZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHBhaXIgdG8gUFNCVCBpbnB1dC5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBhZGRQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlWYWx1ZURhdGE6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRVbmtub3duS2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBrZXk6IGVuY29kZVByb3ByaWV0YXJ5S2V5KGtleVZhbHVlRGF0YS5rZXkpLFxuICAgICAgdmFsdWU6IGtleVZhbHVlRGF0YS52YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG9yIHVwZGF0ZXMgKGlmIGV4aXN0cykgcHJvcHJpZXRhcnkga2V5IHZhbHVlIHBhaXIgdG8gUFNCVCBpbnB1dC5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBhZGRPclVwZGF0ZVByb3ByaWV0YXJ5S2V5VmFsVG9JbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIGtleVZhbHVlRGF0YTogUHJvcHJpZXRhcnlLZXlWYWx1ZSk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBrZXkgPSBlbmNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZURhdGEua2V5KTtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBrZXlWYWx1ZURhdGE7XG4gICAgaWYgKGlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVrdkluZGV4ID0gaW5wdXQudW5rbm93bktleVZhbHMuZmluZEluZGV4KCh1a3YpID0+IHVrdi5rZXkuZXF1YWxzKGtleSkpO1xuICAgICAgaWYgKHVrdkluZGV4ID4gLTEpIHtcbiAgICAgICAgaW5wdXQudW5rbm93bktleVZhbHNbdWt2SW5kZXhdID0geyBrZXksIHZhbHVlIH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZFVua25vd25LZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIHNlYXJjaCBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBhZ2FpbnN0IGtleWRhdGEuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXg6IG51bWJlciwga2V5U2VhcmNoPzogUHJvcHJpZXRhcnlLZXlTZWFyY2gpOiBQcm9wcmlldGFyeUtleVZhbHVlW10ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICByZXR1cm4gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0LCBrZXlTZWFyY2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGRlbGV0ZSBhbnkgZGF0YSBmcm9tIHByb3ByaWV0YXJ5IGtleSB2YWx1ZS5cbiAgICogRGVmYXVsdCBpZGVudGlmaWVyRW5jb2RpbmcgaXMgdXRmLTggZm9yIGlkZW50aWZpZXIuXG4gICAqL1xuICBkZWxldGVQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlzVG9EZWxldGU/OiBQcm9wcmlldGFyeUtleVNlYXJjaCk6IHRoaXMge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWlucHV0LnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoa2V5c1RvRGVsZXRlICYmIGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgJiYgQnVmZmVyLmlzQnVmZmVyKGtleXNUb0RlbGV0ZS5rZXlkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByb3ByaWV0YXJ5IGtleSBzZWFyY2ggZmlsdGVyIGNvbWJpbmF0aW9uLiBzdWJ0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlucHV0LnVua25vd25LZXlWYWxzID0gaW5wdXQudW5rbm93bktleVZhbHMuZmlsdGVyKChrZXlWYWx1ZSwgaSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZGVjb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWUua2V5KTtcbiAgICAgIHJldHVybiAhKFxuICAgICAgICBrZXlzVG9EZWxldGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAoa2V5c1RvRGVsZXRlLmlkZW50aWZpZXIgPT09IGtleS5pZGVudGlmaWVyICYmXG4gICAgICAgICAgKGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0ga2V5LnN1YnR5cGUgJiZcbiAgICAgICAgICAgICAgKCFCdWZmZXIuaXNCdWZmZXIoa2V5c1RvRGVsZXRlLmtleWRhdGEpIHx8IGtleXNUb0RlbGV0ZS5rZXlkYXRhLmVxdWFscyhrZXkua2V5ZGF0YSkpKSkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNdXNpZzJOb25jZUZvcklucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBrZXlQYWlyOiBCSVAzMkludGVyZmFjZSxcbiAgICBrZXlUeXBlOiAncm9vdCcgfCAnZGVyaXZlZCcsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiBQc2J0TXVzaWcyUHViTm9uY2Uge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEludGVybmFsS2V5IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgIH1cbiAgICBpZiAoIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGFwTWVya2xlUm9vdCBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICB9XG4gICAgY29uc3QgZ2V0RGVyaXZlZEtleVBhaXIgPSAoKTogQklQMzJJbnRlcmZhY2UgPT4ge1xuICAgICAgaWYgKCFpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcEJpcDMyRGVyaXZhdGlvbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGtleVBhaXIsIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbik7XG4gICAgICBpZiAoIWRlcml2ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBiaXAzMkRlcml2YXRpb24gbWFzdGVyRmluZ2VycHJpbnQgbWF0Y2hlZCB0aGUgSEQga2V5UGFpciBmaW5nZXJwcmludCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlcml2ZWQ7XG4gICAgfTtcbiAgICBjb25zdCBkZXJpdmVkS2V5UGFpciA9IGtleVR5cGUgPT09ICdyb290JyA/IGdldERlcml2ZWRLZXlQYWlyKCkgOiBrZXlQYWlyO1xuICAgIGlmICghZGVyaXZlZEtleVBhaXIucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcml2YXRlS2V5IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBub25jZScpO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXQpO1xuICAgIGlmICghcGFydGljaXBhbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIDAgbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICAgIH1cbiAgICBhc3NlcnRQc2J0TXVzaWcyUGFydGljaXBhbnRzKHBhcnRpY2lwYW50cywgaW5wdXQudGFwSW50ZXJuYWxLZXksIGlucHV0LnRhcE1lcmtsZVJvb3QpO1xuICAgIGNvbnN0IHsgdGFwT3V0cHV0S2V5LCBwYXJ0aWNpcGFudFB1YktleXMgfSA9IHBhcnRpY2lwYW50cztcblxuICAgIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5ID0gcGFydGljaXBhbnRQdWJLZXlzLmZpbmQoKHB1YktleSkgPT4gcHViS2V5LmVxdWFscyhkZXJpdmVkS2V5UGFpci5wdWJsaWNLZXkpKTtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihwYXJ0aWNpcGFudFB1YktleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFydGljaXBhbnQgcGxhaW4gcHViIGtleSBzaG91bGQgbWF0Y2ggb25lIGJpcDMyRGVyaXZhdGlvbiBwbGFpbiBwdWIga2V5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgpO1xuXG4gICAgbGV0IHB1Yk5vbmNlOiBCdWZmZXI7XG4gICAgaWYgKHBhcmFtcy5kZXRlcm1pbmlzdGljKSB7XG4gICAgICBpZiAocGFyYW1zLnNlc3Npb25JZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgZXh0cmEgZW50cm9weSB3aGVuIGdlbmVyYXRpbmcgYSBkZXRlcm1pbmlzdGljIG5vbmNlJyk7XG4gICAgICB9XG4gICAgICAvLyBUaGVyZSBtdXN0IGJlIG9ubHkgMiBwYXJ0aWNpcGFudCBwdWJLZXlzIGlmIGl0IGdvdCB0byB0aGlzIHBvaW50XG4gICAgICBpZiAoIXBhcnRpY2lwYW50UHViS2V5LmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT25seSB0aGUgY29zaWduZXIncyBub25jZSBjYW4gYmUgc2V0IGRldGVybWluaXN0aWNhbGx5YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBub25jZXMgPSBwYXJzZVBzYnRNdXNpZzJOb25jZXMoaW5wdXQpO1xuICAgICAgaWYgKCFub25jZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBub25jZXMgZm91bmQgb24gaW5wdXQgIyR7aW5wdXRJbmRleH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChub25jZXMubGVuZ3RoID4gMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYXZlIG1vcmUgdGhhbiAyIG5vbmNlc2ApO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3RTaWduZXJOb25jZSA9IG5vbmNlcy5maW5kKChrdikgPT4ga3YucGFydGljaXBhbnRQdWJLZXkuZXF1YWxzKHBhcnRpY2lwYW50UHViS2V5c1swXSkpO1xuICAgICAgaWYgKCFmaXJzdFNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVyIG5vbmNlIG11c3QgYmUgc2V0IGlmIGNvc2lnbmVyIG5vbmNlIGlzIHRvIGJlIGRlcml2ZWQgZGV0ZXJtaW5pc3RpY2FsbHknKTtcbiAgICAgIH1cblxuICAgICAgcHViTm9uY2UgPSBjcmVhdGVNdXNpZzJEZXRlcm1pbmlzdGljTm9uY2Uoe1xuICAgICAgICBwcml2YXRlS2V5OiBkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5LFxuICAgICAgICBvdGhlck5vbmNlOiBmaXJzdFNpZ25lck5vbmNlLnB1Yk5vbmNlLFxuICAgICAgICBwdWJsaWNLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHViTm9uY2UgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgdGhpcy5ub25jZVN0b3JlLmNyZWF0ZU11c2lnMk5vbmNlKFxuICAgICAgICAgIGRlcml2ZWRLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgICAgICAgdGFwT3V0cHV0S2V5LFxuICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgcGFyYW1zLnNlc3Npb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXksIHB1Yk5vbmNlIH07XG4gIH1cblxuICBwcml2YXRlIHNldE11c2lnMk5vbmNlc0lubmVyKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIGtleVR5cGU6ICdyb290JyB8ICdkZXJpdmVkJyxcbiAgICBpbnB1dEluZGV4PzogbnVtYmVyLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgaWYgKGtleVBhaXIuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGUga2V5IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIocGFyYW1zLnNlc3Npb25JZCkgJiYgcGFyYW1zLnNlc3Npb25JZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtwYXJhbXMuc2Vzc2lvbklkLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dEluZGV4ZXMgPSBpbnB1dEluZGV4ID09PSB1bmRlZmluZWQgPyBbLi4uQXJyYXkodGhpcy5pbnB1dENvdW50KS5rZXlzKCldIDogW2lucHV0SW5kZXhdO1xuICAgIGlucHV0SW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbmRleCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9uY2UgPSB0aGlzLmNyZWF0ZU11c2lnMk5vbmNlRm9ySW5wdXQoaW5kZXgsIGtleVBhaXIsIGtleVR5cGUsIHBhcmFtcyk7XG4gICAgICB0aGlzLmFkZE9yVXBkYXRlUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGluZGV4LCBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2Uobm9uY2UpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIHRhcHJvb3Qga2V5IHBhdGggaW5wdXQgYXQgaW5wdXRJbmRleC5cbiAgICogSWYgaW5wdXQgaXMgbm90IGEgdGFwcm9vdCBrZXkgcGF0aCwgbm8gYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCBpbnB1dCBpbmRleFxuICAgKiBAcGFyYW0ga2V5UGFpciBkZXJpdmVkIGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgT3B0aW9uYWwgZXh0cmEgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKiBAcGFyYW0gZGV0ZXJtaW5pc3RpYyBJZiB0cnVlLCBzZXQgdGhlIGNvc2lnbmVyIG5vbmNlIGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzZXRJbnB1dE11c2lnMk5vbmNlKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmVkS2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihkZXJpdmVkS2V5UGFpciwgJ2Rlcml2ZWQnLCBpbnB1dEluZGV4LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdVNpZzIgbm9uY2UgdG8gdGFwcm9vdCBrZXkgcGF0aCBpbnB1dCBhdCBpbnB1dEluZGV4LlxuICAgKiBJZiBpbnB1dCBpcyBub3QgYSB0YXByb290IGtleSBwYXRoLCBubyBhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIEhEIHJvb3Qga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNldCB0aGUgY29zaWduZXIgbm9uY2UgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICovXG4gIHNldElucHV0TXVzaWcyTm9uY2VIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiB0aGlzLnNldE11c2lnMk5vbmNlc0lubmVyKGtleVBhaXIsICdyb290JywgaW5wdXRJbmRleCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIGFsbCB0YXByb290IGtleSBwYXRoIGlucHV0cy4gT3RoZXIgaW5wdXRzIHdpbGwgYmUgc2tpcHBlZC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgZGVyaXZlZCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICovXG4gIHNldEFsbElucHV0c011c2lnMk5vbmNlKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ2Rlcml2ZWQnLCB1bmRlZmluZWQsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byBhbGwgdGFwcm9vdCBrZXkgcGF0aCBpbnB1dHMuIE90aGVyIGlucHV0cyB3aWxsIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIEhEIHJvb3Qga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBzZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ3Jvb3QnLCB1bmRlZmluZWQsIHBhcmFtcyk7XG4gIH1cblxuICBjbG9uZSgpOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuY2xvbmUoKSBhcyB0aGlzO1xuICB9XG59XG4iXX0=
1031
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXR4b1BzYnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vVXR4b1BzYnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWlDO0FBQ2pDLG1DQUEwQztBQVExQyxnREFBcUQ7QUFDckQsK0RBQXNFO0FBRXRFLGlDQUFxRDtBQUNyRCx1Q0FBdUM7QUFDdkMsd0VBQThGO0FBRTlGLDBCQVlZO0FBQ1osdURBQW9EO0FBQ3BELHVDQUFnRDtBQUNoRCxvREFBOEM7QUFDOUMsMERBQStDO0FBQy9DLG1EQUFtRDtBQUNuRCw2Q0FBa0Q7QUFDbEQscUNBa0JrQjtBQUNsQixtQ0FBMkQ7QUFDM0Qsd0NBQWlEO0FBQ2pELHlDQU9vQjtBQVlwQixTQUFTLG1CQUFtQjtJQUMxQixPQUFPLENBQUMsZUFBVyxDQUFDLGVBQWUsRUFBRSxlQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsT0FBZ0IsRUFBRSxZQUFzQjtJQUM1RSxRQUFRLElBQUEsY0FBVSxFQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzNCLEtBQUssWUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMxQixLQUFLLFlBQVEsQ0FBQyxTQUFTLENBQUM7UUFDeEIsS0FBSyxZQUFRLENBQUMsV0FBVyxDQUFDO1FBQzFCLEtBQUssWUFBUSxDQUFDLEtBQUs7WUFDakIsT0FBTyxDQUFDLEdBQUcsWUFBWSxFQUFFLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGlDQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUMzRjtZQUNFLE9BQU8sWUFBWSxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsT0FBZ0IsRUFBRSxDQUF1QztJQUNsRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxpQkFB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O0lBQ2xGLENBQUM7Q0FDRjtBQWxwQ0QsNEJBa3BDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgUHNidCBhcyBQc2J0QmFzZSB9IGZyb20gJ2JpcDE3NCc7XG5pbXBvcnQge1xuICBCaXAzMkRlcml2YXRpb24sXG4gIFBzYnRJbnB1dCxcbiAgVGFwQmlwMzJEZXJpdmF0aW9uLFxuICBUcmFuc2FjdGlvbiBhcyBJVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uRnJvbUJ1ZmZlcixcbn0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBjaGVja0ZvcklucHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgQnVmZmVyV3JpdGVyLCB2YXJ1aW50IH0gZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvYnVmZmVydXRpbHMnO1xuaW1wb3J0IHsgU2Vzc2lvbktleSB9IGZyb20gJ0BicmFuZG9uYmxhY2svbXVzaWcnO1xuaW1wb3J0IHsgQklQMzJGYWN0b3J5LCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCAqIGFzIGJzNThjaGVjayBmcm9tICdiczU4Y2hlY2snO1xuaW1wb3J0IHsgZGVjb2RlUHJvcHJpZXRhcnlLZXksIGVuY29kZVByb3ByaWV0YXJ5S2V5IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvcHJvcHJpZXRhcnlLZXlWYWwnO1xuXG5pbXBvcnQge1xuICB0YXByb290LFxuICBIRFNpZ25lcixcbiAgU2lnbmVyLFxuICBQc2J0LFxuICBQc2J0VHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uLFxuICBUeE91dHB1dCxcbiAgTmV0d29yayxcbiAgZWNjIGFzIGVjY0xpYixcbiAgZ2V0TWFpbm5ldCxcbiAgbmV0d29ya3MsXG59IGZyb20gJy4uJztcbmltcG9ydCB7IFV0eG9UcmFuc2FjdGlvbiB9IGZyb20gJy4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IGdldE91dHB1dElkRm9ySW5wdXQgfSBmcm9tICcuL1Vuc3BlbnQnO1xuaW1wb3J0IHsgaXNTZWd3aXQgfSBmcm9tICcuL3BzYnQvc2NyaXB0VHlwZXMnO1xuaW1wb3J0IHsgdW5zaWduIH0gZnJvbSAnLi9wc2J0L2Zyb21IYWxmU2lnbmVkJztcbmltcG9ydCB7IHRvWE9ubHlQdWJsaWNLZXkgfSBmcm9tICcuL291dHB1dFNjcmlwdHMnO1xuaW1wb3J0IHsgcGFyc2VQdWJTY3JpcHQyT2YzIH0gZnJvbSAnLi9wYXJzZUlucHV0JztcbmltcG9ydCB7XG4gIGNyZWF0ZU11c2lnMlNpZ25pbmdTZXNzaW9uLFxuICBlbmNvZGVQc2J0TXVzaWcyUGFydGlhbFNpZyxcbiAgZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlLFxuICBtdXNpZzJQYXJ0aWFsU2lnbixcbiAgcGFyc2VQc2J0TXVzaWcyTm9uY2VzLFxuICBwYXJzZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHMsXG4gIFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMsXG4gIGFzc2VydFBzYnRNdXNpZzJOb25jZXMsXG4gIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMsXG4gIE11c2lnMk5vbmNlU3RvcmUsXG4gIFBzYnRNdXNpZzJQdWJOb25jZSxcbiAgcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MsXG4gIG11c2lnMlBhcnRpYWxTaWdWZXJpZnksXG4gIG11c2lnMkFnZ3JlZ2F0ZVNpZ3MsXG4gIGdldFNpZ0hhc2hUeXBlRnJvbVNpZ3MsXG4gIG11c2lnMkRldGVybWluaXN0aWNTaWduLFxuICBjcmVhdGVNdXNpZzJEZXRlcm1pbmlzdGljTm9uY2UsXG59IGZyb20gJy4vTXVzaWcyJztcbmltcG9ydCB7IGlzVHJpcGxlLCBpc1R1cGxlLCBUcmlwbGUsIFR1cGxlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRUYXByb290T3V0cHV0S2V5IH0gZnJvbSAnLi4vdGFwcm9vdCc7XG5pbXBvcnQge1xuICBnZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMsXG4gIGdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50LFxuICBQcm9wcmlldGFyeUtleVNlYXJjaCxcbiAgUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLFxuICBQcm9wcmlldGFyeUtleVZhbHVlLFxuICBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG59IGZyb20gJy4vUHNidFV0aWwnO1xuXG50eXBlIFNpZ25hdHVyZVBhcmFtcyA9IHtcbiAgLyoqIFdoZW4gdHJ1ZSwgYW5kIGFkZCB0aGUgc2Vjb25kIChsYXN0KSBub25jZSBhbmQgc2lnbmF0dXJlIGZvciBhIHRhcHJvb3Qga2V5XG4gICAqIHBhdGggc3BlbmQgZGV0ZXJtaW5pc3RpY2FsbHkuIFRocm93cyBhbiBlcnJvciBpZiBkb25lIGZvciB0aGUgZmlyc3Qgbm9uY2Uvc2lnbmF0dXJlXG4gICAqIG9mIGEgdGFwcm9vdCBrZXlwYXRoIHNwZW5kLiBJZ25vcmUgZm9yIGFsbCBvdGhlciBpbnB1dCB0eXBlcy5cbiAgICovXG4gIGRldGVybWluaXN0aWM6IGJvb2xlYW47XG4gIC8qKiBBbGxvd2VkIHNpZ2hhc2ggdHlwZXMgKi9cbiAgc2lnaGFzaFR5cGVzOiBudW1iZXJbXTtcbn07XG5cbmZ1bmN0aW9uIGRlZmF1bHRTaWdoYXNoVHlwZXMoKTogbnVtYmVyW10ge1xuICByZXR1cm4gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdO1xufVxuXG5mdW5jdGlvbiBhZGRGb3JrSWRUb1NpZ2hhc2hlc0lmTmVlZGVkKG5ldHdvcms6IE5ldHdvcmssIHNpZ2hhc2hUeXBlczogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIHN3aXRjaCAoZ2V0TWFpbm5ldChuZXR3b3JrKSkge1xuICAgIGNhc2UgbmV0d29ya3MuYml0Y29pbmNhc2g6XG4gICAgY2FzZSBuZXR3b3Jrcy5iaXRjb2luc3Y6XG4gICAgY2FzZSBuZXR3b3Jrcy5iaXRjb2luZ29sZDpcbiAgICBjYXNlIG5ldHdvcmtzLmVjYXNoOlxuICAgICAgcmV0dXJuIFsuLi5zaWdoYXNoVHlwZXMsIC4uLnNpZ2hhc2hUeXBlcy5tYXAoKHMpID0+IHMgfCBVdHhvVHJhbnNhY3Rpb24uU0lHSEFTSF9GT1JLSUQpXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHNpZ2hhc2hUeXBlcztcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1NpZ25hdHVyZVBhcmFtcyhuZXR3b3JrOiBOZXR3b3JrLCB2PzogUGFydGlhbDxTaWduYXR1cmVQYXJhbXM+IHwgbnVtYmVyW10pOiBTaWduYXR1cmVQYXJhbXMge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2KSkgcmV0dXJuIHRvU2lnbmF0dXJlUGFyYW1zKG5ldHdvcmssIHsgc2lnaGFzaFR5cGVzOiB2IH0pO1xuICBjb25zdCBkZWZhdWx0U2lnbmF0dXJlUGFyYW1zID0geyBkZXRlcm1pbmlzdGljOiBmYWxzZSwgc2lnaGFzaFR5cGVzOiBkZWZhdWx0U2lnaGFzaFR5cGVzKCkgfTtcbiAgY29uc3QgcmV0ID0geyAuLi5kZWZhdWx0U2lnbmF0dXJlUGFyYW1zLCAuLi52IH07XG4gIHJldC5zaWdoYXNoVHlwZXMgPSBhZGRGb3JrSWRUb1NpZ2hhc2hlc0lmTmVlZGVkKG5ldHdvcmssIHJldC5zaWdoYXNoVHlwZXMpO1xuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEBwYXJhbSBhXG4gKiBAcGFyYW0gYlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIHB1YmxpYyBrZXlzIGFyZSBlcXVhbCBpZ25vcmluZyB0aGUgeSBjb29yZGluYXRlLlxuICovXG5mdW5jdGlvbiBlcXVhbFB1YmxpY0tleUlnbm9yZVkoYTogQnVmZmVyLCBiOiBCdWZmZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvWE9ubHlQdWJsaWNLZXkoYSkuZXF1YWxzKHRvWE9ubHlQdWJsaWNLZXkoYikpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhEVGFwcm9vdFNpZ25lciBleHRlbmRzIEhEU2lnbmVyIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHN0cmluZyBtdXN0IG1hdGNoIC9ebShcXC9cXGQrJz8pKyQvXG4gICAqIGV4LiBtLzQ0Jy8wJy8wJy8xLzIzIGxldmVscyB3aXRoICcgbXVzdCBiZSBoYXJkIGRlcml2YXRpb25zXG4gICAqL1xuICBkZXJpdmVQYXRoKHBhdGg6IHN0cmluZyk6IEhEVGFwcm9vdFNpZ25lcjtcbiAgLyoqXG4gICAqIElucHV0IGhhc2ggKHRoZSBcIm1lc3NhZ2UgZGlnZXN0XCIpIGZvciB0aGUgc2lnbmF0dXJlIGFsZ29yaXRobVxuICAgKiBSZXR1cm4gYSA2NCBieXRlIHNpZ25hdHVyZSAoMzIgYnl0ZSByIGFuZCAzMiBieXRlIHMgaW4gdGhhdCBvcmRlcilcbiAgICovXG4gIHNpZ25TY2hub3JyKGhhc2g6IEJ1ZmZlcik6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBIRCBzaWduZXIgb2JqZWN0IGZvciB0YXByb290IHAydHIgbXVzaWcyIGtleSBwYXRoIHNpZ25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIRFRhcHJvb3RNdXNpZzJTaWduZXIgZXh0ZW5kcyBIRFNpZ25lciB7XG4gIC8qKlxuICAgKiBNdXNpZzIgcmVxdWlyZXMgc2lnbmVyJ3MgMzItYnl0ZXMgcHJpdmF0ZSBrZXkgdG8gYmUgcGFzc2VkIHRvIGl0LlxuICAgKi9cbiAgcHJpdmF0ZUtleTogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBzdHJpbmcgbXVzdCBtYXRjaCAvXm0oXFwvXFxkKyc/KSskL1xuICAgKiBleC4gbS80NCcvMCcvMCcvMS8yMyBsZXZlbHMgd2l0aCAnIG11c3QgYmUgaGFyZCBkZXJpdmF0aW9uc1xuICAgKi9cbiAgZGVyaXZlUGF0aChwYXRoOiBzdHJpbmcpOiBIRFRhcHJvb3RNdXNpZzJTaWduZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nobm9yclNpZ25lciB7XG4gIHB1YmxpY0tleTogQnVmZmVyO1xuICBzaWduU2Nobm9ycihoYXNoOiBCdWZmZXIpOiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVzaWcyU2lnbmVyIHtcbiAgcHVibGljS2V5OiBCdWZmZXI7XG4gIHByaXZhdGVLZXk6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXByb290U2lnbmVyIHtcbiAgbGVhZkhhc2hlczogQnVmZmVyW107XG4gIHNpZ25lcjogU2Nobm9yclNpZ25lcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQc2J0T3B0cyB7XG4gIG5ldHdvcms6IE5ldHdvcms7XG4gIG1heGltdW1GZWVSYXRlPzogbnVtYmVyOyAvLyBbc2F0L2J5dGVdXG4gIGJpcDMyUGF0aHNBYnNvbHV0ZT86IGJvb2xlYW47XG59XG5cbi8vIFRPRE86IHVwc3RyZWFtIGRvZXMgYGNoZWNrSW5wdXRzRm9yUGFydGlhbFNpZ3NgIGJlZm9yZSBkb2luZyB0aGluZ3MgbGlrZVxuLy8gYHNldFZlcnNpb25gLiBPdXIgaW5wdXRzIGNvdWxkIGhhdmUgdGFwc2NyaXB0c2lncyAob3IgaW4gZnV0dXJlIHRhcGtleXNpZ3MpXG4vLyBhbmQgbm90IGZhaWwgdGhhdCBjaGVjay4gRG8gd2Ugd2FudCB0byBkbyBhbnl0aGluZyBhYm91dCB0aGF0P1xuZXhwb3J0IGNsYXNzIFV0eG9Qc2J0PFR4IGV4dGVuZHMgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4gPSBVdHhvVHJhbnNhY3Rpb248YmlnaW50Pj4gZXh0ZW5kcyBQc2J0IHtcbiAgcHJpdmF0ZSBub25jZVN0b3JlID0gbmV3IE11c2lnMk5vbmNlU3RvcmUoKTtcblxuICBwcm90ZWN0ZWQgc3RhdGljIHRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihidWZmZXI6IEJ1ZmZlciwgbmV0d29yazogTmV0d29yayk6IFV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+IHtcbiAgICByZXR1cm4gVXR4b1RyYW5zYWN0aW9uLmZyb21CdWZmZXI8YmlnaW50PihidWZmZXIsIGZhbHNlLCAnYmlnaW50JywgbmV0d29yayk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUHNidChvcHRzOiBQc2J0T3B0cywgZGF0YT86IFBzYnRCYXNlKTogVXR4b1BzYnQge1xuICAgIHJldHVybiBuZXcgVXR4b1BzYnQoXG4gICAgICBvcHRzLFxuICAgICAgZGF0YSB8fCBuZXcgUHNidEJhc2UobmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4OiBuZXcgVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ob3B0cy5uZXR3b3JrKSB9KSlcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGZyb21CdWZmZXIoYnVmZmVyOiBCdWZmZXIsIG9wdHM6IFBzYnRPcHRzKTogVXR4b1BzYnQge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uRnJvbUJ1ZmZlcjogVHJhbnNhY3Rpb25Gcm9tQnVmZmVyID0gKGJ1ZmZlcjogQnVmZmVyKTogSVRyYW5zYWN0aW9uID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gdGhpcy50cmFuc2FjdGlvbkZyb21CdWZmZXIoYnVmZmVyLCBvcHRzLm5ldHdvcmspO1xuICAgICAgcmV0dXJuIG5ldyBQc2J0VHJhbnNhY3Rpb24oeyB0eCB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHBzYnRCYXNlID0gUHNidEJhc2UuZnJvbUJ1ZmZlcihidWZmZXIsIHRyYW5zYWN0aW9uRnJvbUJ1ZmZlciwge1xuICAgICAgYmlwMzJQYXRoc0Fic29sdXRlOiBvcHRzLmJpcDMyUGF0aHNBYnNvbHV0ZSxcbiAgICB9KTtcbiAgICBjb25zdCBwc2J0ID0gdGhpcy5jcmVhdGVQc2J0KG9wdHMsIHBzYnRCYXNlKTtcbiAgICAvLyBVcHN0cmVhbSBjaGVja3MgZm9yIGR1cGxpY2F0ZSBpbnB1dHMgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIG9mIGR1YmlvdXMgdmFsdWUuXG4gICAgcmV0dXJuIHBzYnQ7XG4gIH1cblxuICBzdGF0aWMgZnJvbUhleChkYXRhOiBzdHJpbmcsIG9wdHM6IFBzYnRPcHRzKTogVXR4b1BzYnQge1xuICAgIHJldHVybiB0aGlzLmZyb21CdWZmZXIoQnVmZmVyLmZyb20oZGF0YSwgJ2hleCcpLCBvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGFyZW50IC0gUGFyZW50IGtleS4gTWF0Y2hlZCB3aXRoIGBiaXAzMkRlcml2YXRpb25zYCB1c2luZyBgZmluZ2VycHJpbnRgIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gYmlwMzJEZXJpdmF0aW9ucyAtIHBvc3NpYmxlIGRlcml2YXRpb25zIGZvciBpbnB1dCBvciBvdXRwdXRcbiAgICogQHBhcmFtIGlnbm9yZVkgLSB3aGVuIHRydWUsIGlnbm9yZSB0aGUgeSBjb29yZGluYXRlIHdoZW4gbWF0Y2hpbmcgcHVibGljIGtleXNcbiAgICogQHJldHVybiBkZXJpdmVkIGJpcDMyIG5vZGUgaWYgbWF0Y2hpbmcgZGVyaXZhdGlvbiBpcyBmb3VuZCwgdW5kZWZpbmVkIGlmIG5vbmUgaXMgZm91bmRcbiAgICogQHRocm93cyBFcnJvciBpZiBtb3JlIHRoYW4gb25lIG1hdGNoIGlzIGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZGVyaXZlS2V5UGFpcihcbiAgICBwYXJlbnQ6IEJJUDMySW50ZXJmYWNlLFxuICAgIGJpcDMyRGVyaXZhdGlvbnM6IEJpcDMyRGVyaXZhdGlvbltdLFxuICAgIHsgaWdub3JlWSB9OiB7IGlnbm9yZVk6IGJvb2xlYW4gfVxuICApOiBCSVAzMkludGVyZmFjZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWF0Y2hpbmdEZXJpdmF0aW9ucyA9IGJpcDMyRGVyaXZhdGlvbnMuZmlsdGVyKChiaXBEdikgPT4ge1xuICAgICAgcmV0dXJuIGJpcER2Lm1hc3RlckZpbmdlcnByaW50LmVxdWFscyhwYXJlbnQuZmluZ2VycHJpbnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKCFtYXRjaGluZ0Rlcml2YXRpb25zLmxlbmd0aCkge1xuICAgICAgLy8gTm8gZmluZ2VycHJpbnQgbWF0Y2hcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoaW5nRGVyaXZhdGlvbnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBtb3JlIHRoYW4gb25lIG1hdGNoaW5nIGRlcml2YXRpb24gZm9yIGZpbmdlcnByaW50ICR7cGFyZW50LmZpbmdlcnByaW50LnRvU3RyaW5nKCdoZXgnKX06ICR7XG4gICAgICAgICAgbWF0Y2hpbmdEZXJpdmF0aW9ucy5sZW5ndGhcbiAgICAgICAgfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgW2Rlcml2YXRpb25dID0gbWF0Y2hpbmdEZXJpdmF0aW9ucztcbiAgICBjb25zdCBub2RlID0gcGFyZW50LmRlcml2ZVBhdGgoZGVyaXZhdGlvbi5wYXRoKTtcblxuICAgIGlmICghbm9kZS5wdWJsaWNLZXkuZXF1YWxzKGRlcml2YXRpb24ucHVia2V5KSkge1xuICAgICAgaWYgKCFpZ25vcmVZIHx8ICFlcXVhbFB1YmxpY0tleUlnbm9yZVkobm9kZS5wdWJsaWNLZXksIGRlcml2YXRpb24ucHVia2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YmtleSBkaWQgbm90IG1hdGNoIGJpcDMyRGVyaXZhdGlvbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgc3RhdGljIGRlcml2ZUtleVBhaXJGb3JJbnB1dChiaXAzMjogQklQMzJJbnRlcmZhY2UsIGlucHV0OiBQc2J0SW5wdXQpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/Lmxlbmd0aFxuICAgICAgPyBVdHhvUHNidC5kZXJpdmVLZXlQYWlyKGJpcDMyLCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24sIHsgaWdub3JlWTogdHJ1ZSB9KT8ucHVibGljS2V5XG4gICAgICA6IGlucHV0LmJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoXG4gICAgICA/IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXIoYmlwMzIsIGlucHV0LmJpcDMyRGVyaXZhdGlvbiwgeyBpZ25vcmVZOiBmYWxzZSB9KT8ucHVibGljS2V5XG4gICAgICA6IGJpcDMyPy5wdWJsaWNLZXk7XG4gIH1cblxuICBnZXQgbmV0d29yaygpOiBOZXR3b3JrIHtcbiAgICByZXR1cm4gdGhpcy50eC5uZXR3b3JrO1xuICB9XG5cbiAgdG9IZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBpcyBleHBlbnNpdmUgdG8gYXR0ZW1wdCB0byBjb21wdXRlIGV2ZXJ5IG91dHB1dCBhZGRyZXNzIHVzaW5nIHBzYnQudHhPdXRwdXRzW291dHB1dEluZGV4XVxuICAgKiB0byB0aGVuIGp1c3QgZ2V0IHRoZSBzY3JpcHQuIEhlcmUsIHdlIGFyZSBkb2luZyB0aGUgc2FtZSB0aGluZyBhcyB3aGF0IHR4T3V0cHV0cygpIGRvZXMgaW5cbiAgICogYml0Y29pbmpzLWxpYiwgYnV0IHdpdGhvdXQgaXRlcmF0aW5nIG92ZXIgZWFjaCBvdXRwdXQuXG4gICAqIEBwYXJhbSBvdXRwdXRJbmRleFxuICAgKiBAcmV0dXJucyBvdXRwdXQgc2NyaXB0IGF0IHRoZSBnaXZlbiBpbmRleFxuICAgKi9cbiAgZ2V0T3V0cHV0U2NyaXB0KG91dHB1dEluZGV4OiBudW1iZXIpOiBCdWZmZXIge1xuICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9fQ0FDSEUuX19UWC5vdXRzW291dHB1dEluZGV4XS5zY3JpcHQgYXMgQnVmZmVyO1xuICB9XG5cbiAgZ2V0Tm9uV2l0bmVzc1ByZXZpb3VzVHhpZHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHR4SW5wdXRzID0gdGhpcy50eElucHV0czsgLy8gVGhlc2UgYXJlIHNvbWV3aGF0IGNvc3RseSB0byBleHRyYWN0XG4gICAgY29uc3QgdHhpZFNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRoaXMuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIWlucHV0LndpdG5lc3NVdHhvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBoYXZlIHdpdG5lc3MgVVRYTyBmb3IgYWxsIGlucHV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1NlZ3dpdChpbnB1dC53aXRuZXNzVXR4by5zY3JpcHQsIGlucHV0LnJlZGVlbVNjcmlwdCkpIHtcbiAgICAgICAgdHhpZFNldC5hZGQoZ2V0T3V0cHV0SWRGb3JJbnB1dCh0eElucHV0c1tpbmRleF0pLnR4aWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbLi4udHhpZFNldF07XG4gIH1cblxuICBhZGROb25XaXRuZXNzVXR4b3ModHhCdWZzOiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+KTogdGhpcyB7XG4gICAgY29uc3QgdHhJbnB1dHMgPSB0aGlzLnR4SW5wdXRzOyAvLyBUaGVzZSBhcmUgc29tZXdoYXQgY29zdGx5IHRvIGV4dHJhY3RcbiAgICB0aGlzLmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpbnB1dC53aXRuZXNzVXR4bykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgaGF2ZSB3aXRuZXNzIFVUWE8gZm9yIGFsbCBpbnB1dHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNTZWd3aXQoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0LCBpbnB1dC5yZWRlZW1TY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IHsgdHhpZCB9ID0gZ2V0T3V0cHV0SWRGb3JJbnB1dCh0eElucHV0c1tpbmRleF0pO1xuICAgICAgICBpZiAodHhCdWZzW3R4aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhbGwgcmVxdWlyZWQgcHJldmlvdXMgdHJhbnNhY3Rpb25zIHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dChpbmRleCwgeyBub25XaXRuZXNzVXR4bzogdHhCdWZzW3R4aWRdIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RhdGljIGZyb21UcmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sIHByZXZPdXRwdXRzOiBUeE91dHB1dDxiaWdpbnQ+W10pOiBVdHhvUHNidCB7XG4gICAgaWYgKHByZXZPdXRwdXRzLmxlbmd0aCAhPT0gdHJhbnNhY3Rpb24uaW5zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNhY3Rpb24gaGFzICR7dHJhbnNhY3Rpb24uaW5zLmxlbmd0aH0gaW5wdXRzLCBidXQgJHtwcmV2T3V0cHV0cy5sZW5ndGh9IHByZXZpb3VzIG91dHB1dHMgcHJvdmlkZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjbG9uZWRUcmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uLmNsb25lKCk7XG4gICAgY29uc3QgdXBkYXRlcyA9IHVuc2lnbihjbG9uZWRUcmFuc2FjdGlvbiwgcHJldk91dHB1dHMpO1xuXG4gICAgY29uc3QgcHNidEJhc2UgPSBuZXcgUHNidEJhc2UobmV3IFBzYnRUcmFuc2FjdGlvbih7IHR4OiBjbG9uZWRUcmFuc2FjdGlvbiB9KSk7XG4gICAgY2xvbmVkVHJhbnNhY3Rpb24uaW5zLmZvckVhY2goKCkgPT4gcHNidEJhc2UuaW5wdXRzLnB1c2goeyB1bmtub3duS2V5VmFsczogW10gfSkpO1xuICAgIGNsb25lZFRyYW5zYWN0aW9uLm91dHMuZm9yRWFjaCgoKSA9PiBwc2J0QmFzZS5vdXRwdXRzLnB1c2goeyB1bmtub3duS2V5VmFsczogW10gfSkpO1xuICAgIGNvbnN0IHBzYnQgPSB0aGlzLmNyZWF0ZVBzYnQoeyBuZXR3b3JrOiB0cmFuc2FjdGlvbi5uZXR3b3JrIH0sIHBzYnRCYXNlKTtcblxuICAgIHVwZGF0ZXMuZm9yRWFjaCgodXBkYXRlLCBpbmRleCkgPT4ge1xuICAgICAgcHNidC51cGRhdGVJbnB1dChpbmRleCwgdXBkYXRlKTtcbiAgICAgIHBzYnQudXBkYXRlSW5wdXQoaW5kZXgsIHsgd2l0bmVzc1V0eG86IHsgc2NyaXB0OiBwcmV2T3V0cHV0c1tpbmRleF0uc2NyaXB0LCB2YWx1ZTogcHJldk91dHB1dHNbaW5kZXhdLnZhbHVlIH0gfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIGdldFVuc2lnbmVkVHgoKTogVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4ge1xuICAgIHJldHVybiB0aGlzLnR4LmNsb25lKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIG5ld1RyYW5zYWN0aW9uKG5ldHdvcms6IE5ldHdvcmspOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gICAgcmV0dXJuIG5ldyBVdHhvVHJhbnNhY3Rpb248YmlnaW50PihuZXR3b3JrKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHgoKTogVHgge1xuICAgIHJldHVybiAodGhpcy5kYXRhLmdsb2JhbE1hcC51bnNpZ25lZFR4IGFzIFBzYnRUcmFuc2FjdGlvbikudHggYXMgVHg7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tGb3JTaWduYXR1cmVzKHByb3BOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgaWYgKGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoIHx8IGlucHV0LnRhcEtleVNpZyB8fCBpbnB1dC5wYXJ0aWFsU2lnPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbW9kaWZ5ICR7cHJvcE5hbWUgPz8gJ3RyYW5zYWN0aW9uJ30gLSBzaWduYXR1cmVzIGV4aXN0LmApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGF0IGlucHV0SW5kZXggaXMgYSB0YXByb290IGtleSBwYXRoLlxuICAgKiBDaGVja3MgZm9yIHByZXNlbmNlIG9mIG1pbmltdW0gcmVxdWlyZWQga2V5IHBhdGggaW5wdXQgZmllbGRzIGFuZCBhYnNlbmNlIG9mIGFueSBzY3JpcHQgcGF0aCBvbmx5IGlucHV0IGZpZWxkcy5cbiAgICovXG4gIGlzVGFwcm9vdEtleVBhdGhJbnB1dChpbnB1dEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgcmV0dXJuIChcbiAgICAgICEhaW5wdXQudGFwSW50ZXJuYWxLZXkgJiZcbiAgICAgICEhaW5wdXQudGFwTWVya2xlUm9vdCAmJlxuICAgICAgIShcbiAgICAgICAgaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoIHx8XG4gICAgICAgIGlucHV0LnRhcFNjcmlwdFNpZz8ubGVuZ3RoIHx8XG4gICAgICAgIGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8uc29tZSgodikgPT4gdi5sZWFmSGFzaGVzLmxlbmd0aClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGF0IGlucHV0SW5kZXggaXMgYSB0YXByb290IHNjcmlwdCBwYXRoLlxuICAgKiBDaGVja3MgZm9yIHByZXNlbmNlIG9mIG1pbmltdW0gcmVxdWlyZWQgc2NyaXB0IHBhdGggaW5wdXQgZmllbGRzIGFuZCBhYnNlbmNlIG9mIGFueSBrZXkgcGF0aCBvbmx5IGlucHV0IGZpZWxkcy5cbiAgICovXG4gIGlzVGFwcm9vdFNjcmlwdFBhdGhJbnB1dChpbnB1dEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgcmV0dXJuIChcbiAgICAgICEhaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoICYmXG4gICAgICAhKFxuICAgICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gICAgICAgIH0pLmxlbmd0aCB8fFxuICAgICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICAgICAgICB9KS5sZW5ndGggfHxcbiAgICAgICAgdGhpcy5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwge1xuICAgICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICAgICAgICB9KS5sZW5ndGhcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGlucHV0IGF0IGlucHV0SW5kZXggaXMgYSB0YXByb290XG4gICAqL1xuICBpc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3QgaXNQMlRSID0gKHNjcmlwdDogQnVmZmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBnZXRUYXByb290T3V0cHV0S2V5KHNjcmlwdCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gISEoXG4gICAgICBpbnB1dC50YXBJbnRlcm5hbEtleSB8fFxuICAgICAgaW5wdXQudGFwTWVya2xlUm9vdCB8fFxuICAgICAgaW5wdXQudGFwTGVhZlNjcmlwdD8ubGVuZ3RoIHx8XG4gICAgICBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24/Lmxlbmd0aCB8fFxuICAgICAgaW5wdXQudGFwU2NyaXB0U2lnPy5sZW5ndGggfHxcbiAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTLFxuICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICB0aGlzLmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgICAgIGlkZW50aWZpZXI6IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAgICB9KS5sZW5ndGggfHxcbiAgICAgIHRoaXMuZ2V0UHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXgsIHtcbiAgICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgICBzdWJ0eXBlOiBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQUxfU0lHLFxuICAgICAgfSkubGVuZ3RoIHx8XG4gICAgICAoaW5wdXQud2l0bmVzc1V0eG8gJiYgaXNQMlRSKGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNNdWx0aXNpZ1RhcHJvb3RTY3JpcHQoc2NyaXB0OiBCdWZmZXIpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcGFyc2VQdWJTY3JpcHQyT2YzKHNjcmlwdCwgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHNcbiAgICovXG4gIGZpbmFsaXplQWxsSW5wdXRzKCk6IHRoaXMge1xuICAgIGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgMCk7IC8vIG1ha2luZyBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lXG4gICAgdGhpcy5kYXRhLmlucHV0cy5tYXAoKGlucHV0LCBpZHgpID0+IHtcbiAgICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNNdWx0aXNpZ1RhcHJvb3RTY3JpcHQoaW5wdXQudGFwTGVhZlNjcmlwdFswXS5zY3JpcHQpXG4gICAgICAgICAgPyB0aGlzLmZpbmFsaXplVGFwcm9vdElucHV0KGlkeClcbiAgICAgICAgICA6IHRoaXMuZmluYWxpemVUYXBJbnB1dFdpdGhTaW5nbGVMZWFmU2NyaXB0QW5kU2lnbmF0dXJlKGlkeCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYXByb290S2V5UGF0aElucHV0KGlkeCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemVUYXByb290TXVzaWcySW5wdXQoaWR4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplSW5wdXQoaWR4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZpbmFsaXplVGFwcm9vdElucHV0KGlucHV0SW5kZXg6IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IHNhbml0aXplU2lnbmF0dXJlID0gKHNpZzogQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBzaWdoYXNoVHlwZSA9IHNpZy5sZW5ndGggPT09IDY0ID8gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUIDogc2lnLnJlYWRVSW50OChzaWcubGVuZ3RoIC0gMSk7XG4gICAgICBjb25zdCBpbnB1dFNpZ2hhc2hUeXBlID0gaW5wdXQuc2lnaGFzaFR5cGUgPT09IHVuZGVmaW5lZCA/IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCA6IGlucHV0LnNpZ2hhc2hUeXBlO1xuICAgICAgYXNzZXJ0KHNpZ2hhc2hUeXBlID09PSBpbnB1dFNpZ2hhc2hUeXBlLCAnc2lnbmF0dXJlIHNpZ2hhc2ggZG9lcyBub3QgbWF0Y2ggaW5wdXQgc2lnaGFzaCB0eXBlJyk7XG4gICAgICAvLyBUT0RPIEJUQy02NjMgVGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gcGxhdGZvcm0uIFRoaXMgaXMganVzdCBhIHdvcmthcm91bmQgZml4LlxuICAgICAgcmV0dXJuIHNpZ2hhc2hUeXBlID09PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgJiYgc2lnLmxlbmd0aCA9PT0gNjUgPyBzaWcuc2xpY2UoMCwgNjQpIDogc2lnO1xuICAgIH07XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIC8vIHdpdG5lc3MgPSBjb250cm9sLWJsb2NrIHNjcmlwdCBmaXJzdC1zaWcgc2Vjb25kLXNpZ1xuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBvbmUgbGVhZiBzY3JpcHQgc3VwcG9ydGVkIGZvciBmaW5hbGl6aW5nJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgY29udHJvbEJsb2NrLCBzY3JpcHQgfSA9IGlucHV0LnRhcExlYWZTY3JpcHRbMF07XG4gICAgY29uc3Qgd2l0bmVzczogQnVmZmVyW10gPSBbc2NyaXB0LCBjb250cm9sQmxvY2tdO1xuICAgIGNvbnN0IFtwdWJrZXkxLCBwdWJrZXkyXSA9IHBhcnNlUHViU2NyaXB0Mk9mMyhzY3JpcHQsICd0YXByb290U2NyaXB0UGF0aFNwZW5kJykucHVibGljS2V5cztcbiAgICBmb3IgKGNvbnN0IHBrIG9mIFtwdWJrZXkxLCBwdWJrZXkyXSkge1xuICAgICAgY29uc3Qgc2lnID0gaW5wdXQudGFwU2NyaXB0U2lnPy5maW5kKCh7IHB1YmtleSB9KSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkocGssIHB1YmtleSkpO1xuICAgICAgaWYgKCFzaWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBzaWduYXR1cmVzIGluIFNjcmlwdCBTaWcuJyk7XG4gICAgICB9XG4gICAgICB3aXRuZXNzLnVuc2hpZnQoc2FuaXRpemVTaWduYXR1cmUoc2lnLnNpZ25hdHVyZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpdG5lc3NMZW5ndGggPSB3aXRuZXNzLnJlZHVjZSgocywgYikgPT4gcyArIGIubGVuZ3RoICsgdmFydWludC5lbmNvZGluZ0xlbmd0aChiLmxlbmd0aCksIDEpO1xuXG4gICAgY29uc3QgYnVmZmVyV3JpdGVyID0gQnVmZmVyV3JpdGVyLndpdGhDYXBhY2l0eSh3aXRuZXNzTGVuZ3RoKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVWZWN0b3Iod2l0bmVzcyk7XG4gICAgY29uc3QgZmluYWxTY3JpcHRXaXRuZXNzID0gYnVmZmVyV3JpdGVyLmVuZCgpO1xuXG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHsgZmluYWxTY3JpcHRXaXRuZXNzIH0pO1xuICAgIHRoaXMuZGF0YS5jbGVhckZpbmFsaXplZElucHV0KGlucHV0SW5kZXgpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmluYWxpemVzIGEgdGFwcm9vdCBtdXNpZzIgaW5wdXQgYnkgYWdncmVnYXRpbmcgYWxsIHBhcnRpYWwgc2lncy5cbiAgICogSU1QT1JUQU5UOiBBbHdheXMgY2FsbCB2YWxpZGF0ZSogZnVuY3Rpb24gYmVmb3JlIGZpbmFsaXppbmcuXG4gICAqL1xuICBmaW5hbGl6ZVRhcHJvb3RNdXNpZzJJbnB1dChpbnB1dEluZGV4OiBudW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3QgcGFydGlhbFNpZ3MgPSBwYXJzZVBzYnRNdXNpZzJQYXJ0aWFsU2lncyhpbnB1dCk7XG4gICAgaWYgKHBhcnRpYWxTaWdzPy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBudW1iZXIgb2YgcGFydGlhbCBzaWduYXR1cmVzICR7cGFydGlhbFNpZ3MgPyBwYXJ0aWFsU2lncy5sZW5ndGggOiAwfSB0byBmaW5hbGl6ZWApO1xuICAgIH1cbiAgICBjb25zdCB7IHBhcnRpYWxTaWdzOiBwU2lncywgc2lnSGFzaFR5cGUgfSA9IGdldFNpZ0hhc2hUeXBlRnJvbVNpZ3MocGFydGlhbFNpZ3MpO1xuICAgIGNvbnN0IHsgc2Vzc2lvbktleSB9ID0gdGhpcy5nZXRNdXNpZzJTZXNzaW9uS2V5KGlucHV0SW5kZXgsIHNpZ0hhc2hUeXBlKTtcblxuICAgIGNvbnN0IGFnZ1NpZyA9IG11c2lnMkFnZ3JlZ2F0ZVNpZ3MoXG4gICAgICBwU2lncy5tYXAoKHBTaWcpID0+IHBTaWcucGFydGlhbFNpZyksXG4gICAgICBzZXNzaW9uS2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHNpZyA9IHNpZ0hhc2hUeXBlID09PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgPyBhZ2dTaWcgOiBCdWZmZXIuY29uY2F0KFthZ2dTaWcsIEJ1ZmZlci5vZihzaWdIYXNoVHlwZSldKTtcblxuICAgIC8vIHNpbmdsZSBzaWduYXR1cmUgd2l0aCA2NC82NSBieXRlcyBzaXplIGlzIHNjcmlwdCB3aXRuZXNzIGZvciBrZXkgcGF0aCBzcGVuZFxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IEJ1ZmZlcldyaXRlci53aXRoQ2FwYWNpdHkoMSArIHZhcnVpbnQuZW5jb2RpbmdMZW5ndGgoc2lnLmxlbmd0aCkgKyBzaWcubGVuZ3RoKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVWZWN0b3IoW3NpZ10pO1xuICAgIGNvbnN0IGZpbmFsU2NyaXB0V2l0bmVzcyA9IGJ1ZmZlcldyaXRlci5lbmQoKTtcblxuICAgIHRoaXMuZGF0YS51cGRhdGVJbnB1dChpbnB1dEluZGV4LCB7IGZpbmFsU2NyaXB0V2l0bmVzcyB9KTtcbiAgICB0aGlzLmRhdGEuY2xlYXJGaW5hbGl6ZWRJbnB1dChpbnB1dEluZGV4KTtcbiAgICAvLyBkZWxldGluZyBvbmx5IEJpdEdvIHByb3ByaWV0YXJ5IGtleSB2YWx1ZXMuXG4gICAgdGhpcy5kZWxldGVQcm9wcmlldGFyeUtleVZhbHMoaW5wdXRJbmRleCwgeyBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmaW5hbGl6ZVRhcElucHV0V2l0aFNpbmdsZUxlYWZTY3JpcHRBbmRTaWduYXR1cmUoaW5wdXRJbmRleDogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT25seSBvbmUgbGVhZiBzY3JpcHQgc3VwcG9ydGVkIGZvciBmaW5hbGl6aW5nJyk7XG4gICAgfVxuICAgIGlmIChpbnB1dC50YXBTY3JpcHRTaWc/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBzaWduYXR1cmVzIGluIFNjcmlwdCBTaWcuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250cm9sQmxvY2ssIHNjcmlwdCB9ID0gaW5wdXQudGFwTGVhZlNjcmlwdFswXTtcbiAgICBjb25zdCB3aXRuZXNzOiBCdWZmZXJbXSA9IFtpbnB1dC50YXBTY3JpcHRTaWdbMF0uc2lnbmF0dXJlLCBzY3JpcHQsIGNvbnRyb2xCbG9ja107XG4gICAgY29uc3Qgd2l0bmVzc0xlbmd0aCA9IHdpdG5lc3MucmVkdWNlKChzLCBiKSA9PiBzICsgYi5sZW5ndGggKyB2YXJ1aW50LmVuY29kaW5nTGVuZ3RoKGIubGVuZ3RoKSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBCdWZmZXJXcml0ZXIud2l0aENhcGFjaXR5KHdpdG5lc3NMZW5ndGgpO1xuICAgIGJ1ZmZlcldyaXRlci53cml0ZVZlY3Rvcih3aXRuZXNzKTtcbiAgICBjb25zdCBmaW5hbFNjcmlwdFdpdG5lc3MgPSBidWZmZXJXcml0ZXIuZW5kKCk7XG5cbiAgICB0aGlzLmRhdGEudXBkYXRlSW5wdXQoaW5wdXRJbmRleCwgeyBmaW5hbFNjcmlwdFdpdG5lc3MgfSk7XG4gICAgdGhpcy5kYXRhLmNsZWFyRmluYWxpemVkSW5wdXQoaW5wdXRJbmRleCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3N0bHkgY29waWVkIGZyb20gYml0Y29pbmpzLWxpYi90c19zcmMvcHNidC50c1xuICAgKlxuICAgKiBVbmxpa2UgdGhlIGZ1bmN0aW9uIGl0IG92ZXJyaWRlcywgdGhpcyBkb2VzIG5vdCB0YWtlIGEgdmFsaWRhdG9yLiBJbiBCaXRHb1xuICAgKiBjb250ZXh0LCB3ZSBrbm93IGhvdyB3ZSB3YW50IHRvIHZhbGlkYXRlIHNvIHdlIGp1c3QgaGFyZCBjb2RlIHRoZSByaWdodFxuICAgKiB2YWxpZGF0b3IuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZkFsbElucHV0cygpOiBib29sZWFuIHtcbiAgICBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIDApOyAvLyBtYWtpbmcgc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZVxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmRhdGEuaW5wdXRzLm1hcCgoaW5wdXQsIGlkeCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpZHgpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzLnJlZHVjZSgoZmluYWwsIHJlcykgPT4gcmVzICYmIGZpbmFsLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmZiBhbnkgbWF0Y2hpbmcgdmFsaWQgc2lnbmF0dXJlIGlzIGZvdW5kIGZvciBhIGRlcml2ZWQgcHViIGtleSBmcm9tIGdpdmVuIEhEIGtleSBwYWlyLlxuICAgKi9cbiAgdmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dEhEKGlucHV0SW5kZXg6IG51bWJlciwgaGRLZXlQYWlyOiBCSVAzMkludGVyZmFjZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBjb25zdCBwdWJLZXkgPSBVdHhvUHNidC5kZXJpdmVLZXlQYWlyRm9ySW5wdXQoaGRLZXlQYWlyLCBpbnB1dCk7XG4gICAgaWYgKCFwdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCBkZXJpdmUgZnJvbSBIRCBrZXkgcGFpcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXgsIHB1YktleSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZmYgYW55IHZhbGlkIHNpZ25hdHVyZShzKSBhcmUgZm91bmQgZnJvbSBiaXAzMiBkYXRhIG9mIFBTQlQgb3IgZm9yIGdpdmVuIHB1YiBrZXkuXG4gICAqL1xuICB2YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmlzVGFwcm9vdFNjcmlwdFBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBwdWJrZXkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRhcHJvb3RNdXNpZzJTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCBwdWJrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4LCAocCwgbSwgcykgPT4gZWNjTGliLnZlcmlmeShtLCBwLCBzLCB0cnVlKSwgcHVia2V5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdObyBzaWduYXR1cmVzIGZvciB0aGlzIHB1YmtleScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TXVzaWcyU2Vzc2lvbktleShcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgc2lnSGFzaFR5cGU6IG51bWJlclxuICApOiB7XG4gICAgcGFydGljaXBhbnRzOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzO1xuICAgIG5vbmNlczogVHVwbGU8UHNidE11c2lnMlB1Yk5vbmNlPjtcbiAgICBoYXNoOiBCdWZmZXI7XG4gICAgc2Vzc2lvbktleTogU2Vzc2lvbktleTtcbiAgfSB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghaW5wdXQudGFwSW50ZXJuYWxLZXkgfHwgIWlucHV0LnRhcE1lcmtsZVJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYm90aCB0YXBJbnRlcm5hbEtleSBhbmQgdGFwTWVya2xlUm9vdCBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSB0aGlzLmdldE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dEluZGV4LCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3Qgbm9uY2VzID0gdGhpcy5nZXRNdXNpZzJOb25jZXMoaW5wdXRJbmRleCwgcGFydGljaXBhbnRzKTtcblxuICAgIGNvbnN0IHsgaGFzaCB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBbc2lnSGFzaFR5cGVdKTtcblxuICAgIGNvbnN0IHNlc3Npb25LZXkgPSBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbih7XG4gICAgICBwdWJOb25jZXM6IFtub25jZXNbMF0ucHViTm9uY2UsIG5vbmNlc1sxXS5wdWJOb25jZV0sXG4gICAgICBwdWJLZXlzOiBwYXJ0aWNpcGFudHMucGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgdHhIYXNoOiBoYXNoLFxuICAgICAgaW50ZXJuYWxQdWJLZXk6IGlucHV0LnRhcEludGVybmFsS2V5LFxuICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcGFydGljaXBhbnRzLCBub25jZXMsIGhhc2gsIHNlc3Npb25LZXkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGZvciBmb2xsb3dpbmcgY2FzZXMuXG4gICAqIElmIHZhbGlkIG11c2lnMiBwYXJ0aWFsIHNpZ25hdHVyZXMgZXhpc3RzIGZvciBib3RoIDIga2V5cywgaXQgd2lsbCBhbHNvIHZlcmlmeSBhZ2dyZWdhdGVkIHNpZ1xuICAgKiBmb3IgYWdncmVnYXRlZCB0d2Vha2VkIGtleSAob3V0cHV0IGtleSksIG90aGVyd2lzZSBvbmx5IHZlcmlmaWVzIHBhcnRpYWwgc2lnLlxuICAgKiBJZiBwdWJrZXkgaXMgcGFzc2VkIGluIGlucHV0LCBpdCB3aWxsIGNoZWNrIHNpZyBvbmx5IGZvciB0aGF0IHB1YmtleSxcbiAgICogaWYgbm8gc2lnIGV4aXRzIGZvciBzdWNoIGtleSwgdGhyb3dzIGVycm9yLlxuICAgKiBGb3IgaW52YWxpZCBzdGF0ZSBvZiBpbnB1dCBkYXRhLCBpdCB3aWxsIHRocm93IGVycm9ycy5cbiAgICovXG4gIHZhbGlkYXRlVGFwcm9vdE11c2lnMlNpZ25hdHVyZXNPZklucHV0KGlucHV0SW5kZXg6IG51bWJlciwgcHVia2V5PzogQnVmZmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGNvbnN0IHBhcnRpYWxTaWdzID0gcGFyc2VQc2J0TXVzaWcyUGFydGlhbFNpZ3MoaW5wdXQpO1xuICAgIGlmICghcGFydGlhbFNpZ3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc2lnbmF0dXJlcyB0byB2YWxpZGF0ZWApO1xuICAgIH1cblxuICAgIGxldCBteVBhcnRpYWxTaWdzID0gcGFydGlhbFNpZ3M7XG4gICAgaWYgKHB1YmtleSkge1xuICAgICAgbXlQYXJ0aWFsU2lncyA9IHBhcnRpYWxTaWdzLmZpbHRlcigoa3YpID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShrdi5wYXJ0aWNpcGFudFB1YktleSwgcHVia2V5KSk7XG4gICAgICBpZiAobXlQYXJ0aWFsU2lncz8ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYXJ0aWFsU2lnczogbXlTaWdzLCBzaWdIYXNoVHlwZSB9ID0gZ2V0U2lnSGFzaFR5cGVGcm9tU2lncyhteVBhcnRpYWxTaWdzKTtcbiAgICBjb25zdCB7IHBhcnRpY2lwYW50cywgbm9uY2VzLCBoYXNoLCBzZXNzaW9uS2V5IH0gPSB0aGlzLmdldE11c2lnMlNlc3Npb25LZXkoaW5wdXRJbmRleCwgc2lnSGFzaFR5cGUpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IG15U2lncy5tYXAoKG15U2lnKSA9PiB7XG4gICAgICBjb25zdCBteU5vbmNlID0gbm9uY2VzLmZpbmQoKGt2KSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkoa3YucGFydGljaXBhbnRQdWJLZXksIG15U2lnLnBhcnRpY2lwYW50UHViS2V5KSk7XG4gICAgICBpZiAoIW15Tm9uY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBubyBwdWIgbm9uY2UgZm9yIHB1YmtleScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG11c2lnMlBhcnRpYWxTaWdWZXJpZnkobXlTaWcucGFydGlhbFNpZywgbXlTaWcucGFydGljaXBhbnRQdWJLZXksIG15Tm9uY2UucHViTm9uY2UsIHNlc3Npb25LZXkpO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yIHZhbGlkIHNpbmdsZSBzaWcgb3IgMSBvciAyIGZhaWx1cmUgc2lncywgbm8gbmVlZCB0byB2YWxpZGF0ZSBhZ2dyZWdhdGVkIHNpZy4gU28gc2tpcC5cbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzLmV2ZXJ5KChyZXMpID0+IHJlcyk7XG4gICAgaWYgKCFyZXN1bHQgfHwgbXlTaWdzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgYWdnU2lnID0gbXVzaWcyQWdncmVnYXRlU2lncyhcbiAgICAgIG15U2lncy5tYXAoKG15U2lnKSA9PiBteVNpZy5wYXJ0aWFsU2lnKSxcbiAgICAgIHNlc3Npb25LZXlcbiAgICApO1xuXG4gICAgcmV0dXJuIGVjY0xpYi52ZXJpZnlTY2hub3JyKGhhc2gsIHBhcnRpY2lwYW50cy50YXBPdXRwdXRLZXksIGFnZ1NpZyk7XG4gIH1cblxuICB2YWxpZGF0ZVRhcHJvb3RTaWduYXR1cmVzT2ZJbnB1dChpbnB1dEluZGV4OiBudW1iZXIsIHB1YmtleT86IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XTtcbiAgICBjb25zdCB0YXBTaWdzID0gKGlucHV0IHx8IHt9KS50YXBTY3JpcHRTaWc7XG4gICAgaWYgKCFpbnB1dCB8fCAhdGFwU2lncyB8fCB0YXBTaWdzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2lnbmF0dXJlcyB0byB2YWxpZGF0ZScpO1xuICAgIH1cbiAgICBsZXQgbXlTaWdzO1xuICAgIGlmIChwdWJrZXkpIHtcbiAgICAgIG15U2lncyA9IHRhcFNpZ3MuZmlsdGVyKChzaWcpID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShzaWcucHVia2V5LCBwdWJrZXkpKTtcbiAgICAgIGlmIChteVNpZ3MubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG15U2lncyA9IHRhcFNpZ3M7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHM6IGJvb2xlYW5bXSA9IFtdO1xuXG4gICAgYXNzZXJ0KGlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCA9PT0gMSwgYHNpbmdsZSB0YXBMZWFmU2NyaXB0IGlzIGV4cGVjdGVkLiBHb3QgJHtpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGh9YCk7XG4gICAgY29uc3QgW3RhcExlYWZTY3JpcHRdID0gaW5wdXQudGFwTGVhZlNjcmlwdDtcbiAgICBjb25zdCBwdWJLZXlzID0gdGhpcy5pc011bHRpc2lnVGFwcm9vdFNjcmlwdCh0YXBMZWFmU2NyaXB0LnNjcmlwdClcbiAgICAgID8gcGFyc2VQdWJTY3JpcHQyT2YzKHRhcExlYWZTY3JpcHQuc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXNcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBwU2lnIG9mIG15U2lncykge1xuICAgICAgY29uc3QgeyBzaWduYXR1cmUsIGxlYWZIYXNoLCBwdWJrZXkgfSA9IHBTaWc7XG4gICAgICBpZiAocHViS2V5cykge1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgcHViS2V5cy5maW5kKChwaykgPT4gcHVia2V5LmVxdWFscyhwaykpLFxuICAgICAgICAgICdwdWJsaWMga2V5IG5vdCBmb3VuZCBpbiB0YXAgbGVhZiBzY3JpcHQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgc2lnSGFzaFR5cGU6IG51bWJlcjtcbiAgICAgIGxldCBzaWc6IEJ1ZmZlcjtcbiAgICAgIGlmIChzaWduYXR1cmUubGVuZ3RoID09PSA2NSkge1xuICAgICAgICBzaWdIYXNoVHlwZSA9IHNpZ25hdHVyZVs2NF07XG4gICAgICAgIHNpZyA9IHNpZ25hdHVyZS5zbGljZSgwLCA2NCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWdIYXNoVHlwZSA9IFRyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVDtcbiAgICAgICAgc2lnID0gc2lnbmF0dXJlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBoYXNoIH0gPSB0aGlzLmdldFRhcHJvb3RIYXNoRm9yU2lnKGlucHV0SW5kZXgsIFtzaWdIYXNoVHlwZV0sIGxlYWZIYXNoKTtcbiAgICAgIHJlc3VsdHMucHVzaChlY2NMaWIudmVyaWZ5U2Nobm9ycihoYXNoLCBwdWJrZXksIHNpZykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzKSA9PiByZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4XG4gICAqIEBwYXJhbSByb290Tm9kZXMgb3B0aW9uYWwgaW5wdXQgcm9vdCBiaXAzMiBub2RlcyB0byB2ZXJpZnkgd2l0aC4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBnbG9iYWxYcHViIHdpbGwgYmUgdXNlZC5cbiAgICogQHJldHVybiBhcnJheSBvZiBib29sZWFuIHZhbHVlcy4gVHJ1ZSB3aGVuIGNvcnJlc3BvbmRpbmcgaW5kZXggaW4gYHB1YmxpY0tleXNgIGhhcyBzaWduZWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBJZiBubyBzaWduYXR1cmUgaW4gdGhlIHR4IG9yIG5vIHB1YmxpYyBrZXkgbWF0Y2hpbmcgc2lnbmF0dXJlLCB0aGUgdmFsaWRhdGlvbiBpcyBjb25zaWRlcmVkIGFzIGZhbHNlLlxuICAgKi9cbiAgZ2V0U2lnbmF0dXJlVmFsaWRhdGlvbkFycmF5KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICB7IHJvb3ROb2RlcyB9OiB7IHJvb3ROb2Rlcz86IFRyaXBsZTxCSVAzMkludGVyZmFjZT4gfSA9IHt9XG4gICk6IFRyaXBsZTxib29sZWFuPiB7XG4gICAgaWYgKCFyb290Tm9kZXMgJiYgKCF0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWI/Lmxlbmd0aCB8fCAhaXNUcmlwbGUodGhpcy5kYXRhLmdsb2JhbE1hcC5nbG9iYWxYcHViKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBzaWduYXR1cmUgdmFsaWRhdGlvbiBhcnJheSB3aXRob3V0IDMgZ2xvYmFsIHhwdWJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYmlwMzJzID0gcm9vdE5vZGVzXG4gICAgICA/IHJvb3ROb2Rlc1xuICAgICAgOiB0aGlzLmRhdGEuZ2xvYmFsTWFwLmdsb2JhbFhwdWI/Lm1hcCgoeHB1YikgPT5cbiAgICAgICAgICBCSVAzMkZhY3RvcnkoZWNjTGliKS5mcm9tQmFzZTU4KGJzNThjaGVjay5lbmNvZGUoeHB1Yi5leHRlbmRlZFB1YmtleSkpXG4gICAgICAgICk7XG5cbiAgICBpZiAoIWJpcDMycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlaXRoZXIgZ2xvYmFsTWFwIG9yIHJvb3ROb2RlcyBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gY2hlY2tGb3JJbnB1dCh0aGlzLmRhdGEuaW5wdXRzLCBpbnB1dEluZGV4KTtcbiAgICBpZiAoIWdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0KSkge1xuICAgICAgcmV0dXJuIFtmYWxzZSwgZmFsc2UsIGZhbHNlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmlwMzJzLm1hcCgoYmlwMzIpID0+IHtcbiAgICAgIGNvbnN0IHB1YktleSA9IFV0eG9Qc2J0LmRlcml2ZUtleVBhaXJGb3JJbnB1dChiaXAzMiwgaW5wdXQpO1xuICAgICAgaWYgKCFwdWJLZXkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbnB1dEluZGV4LCBwdWJLZXkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIE5vdCBhbiBlbGVnYW50IHNvbHV0aW9uLiBNaWdodCBuZWVkIHVwc3RyZWFtIGNoYW5nZXMgbGlrZSBjdXN0b20gZXJyb3IgdHlwZXMuXG4gICAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ05vIHNpZ25hdHVyZXMgZm9yIHRoaXMgcHVia2V5Jykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfSkgYXMgVHJpcGxlPGJvb2xlYW4+O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3RseSBjb3BpZWQgZnJvbSBiaXRjb2luanMtbGliL3RzX3NyYy9wc2J0LnRzXG4gICAqL1xuICBzaWduQWxsSW5wdXRzSEQoXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgcGFyYW1zPzogbnVtYmVyW10gfCBQYXJ0aWFsPFNpZ25hdHVyZVBhcmFtcz5cbiAgKTogdGhpcyB7XG4gICAgaWYgKCFoZEtleVBhaXIgfHwgIWhkS2V5UGFpci5wdWJsaWNLZXkgfHwgIWhkS2V5UGFpci5maW5nZXJwcmludCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIEhEU2lnbmVyIHRvIHNpZ24gaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHRoaXMubmV0d29yaywgcGFyYW1zKTtcblxuICAgIGNvbnN0IHJlc3VsdHM6IGJvb2xlYW5bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhLmlucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zaWduSW5wdXRIRChpLCBoZEtleVBhaXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pO1xuICAgICAgICByZXN1bHRzLnB1c2godHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3VsdHMuZXZlcnkoKHYpID0+ICF2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBpbnB1dHMgd2VyZSBzaWduZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTW9zdGx5IGNvcGllZCBmcm9tIGJpdGNvaW5qcy1saWIvdHNfc3JjL3BzYnQudHM6c2lnbklucHV0SERcbiAgICovXG4gIHNpZ25UYXByb290SW5wdXRIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgeyBzaWdoYXNoVHlwZXMgPSBbVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxULCBUcmFuc2FjdGlvbi5TSUdIQVNIX0FMTF0sIGRldGVybWluaXN0aWMgPSBmYWxzZSB9ID0ge31cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmlzVGFwcm9vdElucHV0KGlucHV0SW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhIHRhcHJvb3QgaW5wdXQnKTtcbiAgICB9XG4gICAgaWYgKCFoZEtleVBhaXIgfHwgIWhkS2V5UGFpci5wdWJsaWNLZXkgfHwgIWhkS2V5UGFpci5maW5nZXJwcmludCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIEhEU2lnbmVyIHRvIHNpZ24gaW5wdXQnKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmICghaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uIHx8IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCB0YXBCaXAzMkRlcml2YXRpb24gdG8gc2lnbiBUYXByb290IHdpdGggSEQnKTtcbiAgICB9XG4gICAgY29uc3QgbXlEZXJpdmF0aW9ucyA9IGlucHV0LnRhcEJpcDMyRGVyaXZhdGlvblxuICAgICAgLm1hcCgoYmlwRHYpID0+IHtcbiAgICAgICAgaWYgKGJpcER2Lm1hc3RlckZpbmdlcnByaW50LmVxdWFscyhoZEtleVBhaXIuZmluZ2VycHJpbnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGJpcER2O1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigodikgPT4gISF2KSBhcyBUYXBCaXAzMkRlcml2YXRpb25bXTtcbiAgICBpZiAobXlEZXJpdmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBvbmUgdGFwQmlwMzJEZXJpdmF0aW9uIG1hc3RlckZpbmdlcnByaW50IHRvIG1hdGNoIHRoZSBIRFNpZ25lciBmaW5nZXJwcmludCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERlcml2ZWROb2RlKGJpcER2OiBUYXBCaXAzMkRlcml2YXRpb24pOiBIRFRhcHJvb3RNdXNpZzJTaWduZXIgfCBIRFRhcHJvb3RTaWduZXIge1xuICAgICAgY29uc3Qgbm9kZSA9IGhkS2V5UGFpci5kZXJpdmVQYXRoKGJpcER2LnBhdGgpO1xuICAgICAgaWYgKCFlcXVhbFB1YmxpY0tleUlnbm9yZVkoYmlwRHYucHVia2V5LCBub2RlLnB1YmxpY0tleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJrZXkgZGlkIG5vdCBtYXRjaCB0YXBCaXAzMkRlcml2YXRpb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNpZ25lcnM6IFRhcHJvb3RTaWduZXJbXSA9IG15RGVyaXZhdGlvbnMubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBjb25zdCBzaWduZXIgPSBnZXREZXJpdmVkTm9kZShiaXBEdik7XG4gICAgICAgIGlmICghKCdzaWduU2Nobm9ycicgaW4gc2lnbmVyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnblNjaG5vcnIgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gc2lnbiBwMnRyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc2lnbmVyLCBsZWFmSGFzaGVzOiBiaXBEdi5sZWFmSGFzaGVzIH07XG4gICAgICB9KTtcbiAgICAgIHNpZ25lcnMuZm9yRWFjaCgoeyBzaWduZXIsIGxlYWZIYXNoZXMgfSkgPT4gdGhpcy5zaWduVGFwcm9vdElucHV0KGlucHV0SW5kZXgsIHNpZ25lciwgbGVhZkhhc2hlcywgc2lnaGFzaFR5cGVzKSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC50YXBJbnRlcm5hbEtleT8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzaWduZXJzOiBNdXNpZzJTaWduZXJbXSA9IG15RGVyaXZhdGlvbnMubWFwKChiaXBEdikgPT4ge1xuICAgICAgICBjb25zdCBzaWduZXIgPSBnZXREZXJpdmVkTm9kZShiaXBEdik7XG4gICAgICAgIGlmICghKCdwcml2YXRlS2V5JyBpbiBzaWduZXIpIHx8ICFzaWduZXIucHJpdmF0ZUtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZUtleSBpcyByZXF1aXJlZCB0byBzaWduIHAydHIgbXVzaWcyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpZ25lcjtcbiAgICAgIH0pO1xuICAgICAgc2lnbmVycy5mb3JFYWNoKChzaWduZXIpID0+IHRoaXMuc2lnblRhcHJvb3RNdXNpZzJJbnB1dChpbnB1dEluZGV4LCBzaWduZXIsIHsgc2lnaGFzaFR5cGVzLCBkZXRlcm1pbmlzdGljIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlQYWlyOiBTaWduZXIsIHNpZ2hhc2hUeXBlcz86IG51bWJlcltdKTogdGhpcyB7XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXM6IHNpZ2hhc2hGb3JOZXR3b3JrIH0gPSB0b1NpZ25hdHVyZVBhcmFtcyh0aGlzLm5ldHdvcmssIHNpZ2hhc2hUeXBlcyk7XG4gICAgcmV0dXJuIHN1cGVyLnNpZ25JbnB1dChpbnB1dEluZGV4LCBrZXlQYWlyLCBzaWdoYXNoRm9yTmV0d29yayk7XG4gIH1cblxuICBzaWduSW5wdXRIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgaGRLZXlQYWlyOiBIRFRhcHJvb3RTaWduZXIgfCBIRFRhcHJvb3RNdXNpZzJTaWduZXIsXG4gICAgcGFyYW1zPzogbnVtYmVyW10gfCBQYXJ0aWFsPFNpZ25hdHVyZVBhcmFtcz5cbiAgKTogdGhpcyB7XG4gICAgY29uc3QgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSA9IHRvU2lnbmF0dXJlUGFyYW1zKHRoaXMubmV0d29yaywgcGFyYW1zKTtcbiAgICBpZiAodGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRhcHJvb3RJbnB1dEhEKGlucHV0SW5kZXgsIGhkS2V5UGFpciwgeyBzaWdoYXNoVHlwZXMsIGRldGVybWluaXN0aWMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdXBlci5zaWduSW5wdXRIRChpbnB1dEluZGV4LCBoZEtleVBhaXIsIHNpZ2hhc2hUeXBlcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRNdXNpZzJQYXJ0aWNpcGFudHMoaW5wdXRJbmRleDogbnVtYmVyLCB0YXBJbnRlcm5hbEtleTogQnVmZmVyLCB0YXBNZXJrbGVSb290OiBCdWZmZXIpIHtcbiAgICBjb25zdCBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhID0gcGFyc2VQc2J0TXVzaWcyUGFydGljaXBhbnRzKHRoaXMuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF0pO1xuICAgIGlmICghcGFydGljaXBhbnRzS2V5VmFsRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCAwIG1hdGNoaW5nIHBhcnRpY2lwYW50IGtleSB2YWx1ZSBpbnN0ZWFkIG9mIDFgKTtcbiAgICB9XG4gICAgYXNzZXJ0UHNidE11c2lnMlBhcnRpY2lwYW50cyhwYXJ0aWNpcGFudHNLZXlWYWxEYXRhLCB0YXBJbnRlcm5hbEtleSwgdGFwTWVya2xlUm9vdCk7XG4gICAgcmV0dXJuIHBhcnRpY2lwYW50c0tleVZhbERhdGE7XG4gIH1cblxuICBwcml2YXRlIGdldE11c2lnMk5vbmNlcyhpbnB1dEluZGV4OiBudW1iZXIsIHBhcnRpY2lwYW50c0tleVZhbERhdGE6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMpIHtcbiAgICBjb25zdCBub25jZXNLZXlWYWxzRGF0YSA9IHBhcnNlUHNidE11c2lnMk5vbmNlcyh0aGlzLmRhdGEuaW5wdXRzW2lucHV0SW5kZXhdKTtcbiAgICBpZiAoIW5vbmNlc0tleVZhbHNEYXRhIHx8ICFpc1R1cGxlKG5vbmNlc0tleVZhbHNEYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRm91bmQgJHtub25jZXNLZXlWYWxzRGF0YT8ubGVuZ3RoID8gbm9uY2VzS2V5VmFsc0RhdGEubGVuZ3RoIDogMH0gbWF0Y2hpbmcgbm9uY2Uga2V5IHZhbHVlIGluc3RlYWQgb2YgMmBcbiAgICAgICk7XG4gICAgfVxuICAgIGFzc2VydFBzYnRNdXNpZzJOb25jZXMobm9uY2VzS2V5VmFsc0RhdGEsIHBhcnRpY2lwYW50c0tleVZhbERhdGEpO1xuICAgIHJldHVybiBub25jZXNLZXlWYWxzRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBwMnRyIG11c2lnMiBrZXkgcGF0aCBpbnB1dCB3aXRoIDIgYWdncmVnYXRlZCBrZXlzLlxuICAgKlxuICAgKiBOb3RlOiBPbmx5IGNhbiBzaWduIGRldGVybWluaXN0aWNhbGx5IGFzIHRoZSBjb3NpZ25lclxuICAgKiBAcGFyYW0gaW5wdXRJbmRleFxuICAgKiBAcGFyYW0gc2lnbmVyIC0gWFkgcHVibGljIGtleSBhbmQgcHJpdmF0ZSBrZXkgYXJlIHJlcXVpcmVkXG4gICAqIEBwYXJhbSBzaWdoYXNoVHlwZXNcbiAgICogQHBhcmFtIGRldGVybWluaXN0aWMgSWYgdHJ1ZSwgc2lnbiB0aGUgbXVzaWcgaW5wdXQgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICovXG4gIHNpZ25UYXByb290TXVzaWcySW5wdXQoXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIHNpZ25lcjogTXVzaWcyU2lnbmVyLFxuICAgIHsgc2lnaGFzaFR5cGVzID0gW1RyYW5zYWN0aW9uLlNJR0hBU0hfREVGQVVMVCwgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTExdLCBkZXRlcm1pbmlzdGljID0gZmFsc2UgfSA9IHt9XG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RLZXlQYXRoSW5wdXQoaW5wdXRJbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGEgdGFwcm9vdCBtdXNpZzIgaW5wdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF07XG5cbiAgICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5IHx8ICFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgaW5wdXQgZGF0YScpO1xuICAgIH1cblxuICAgIC8vIFJldHJpZXZlIGFuZCBjaGVjayB0aGF0IHdlIGhhdmUgdHdvIHBhcnRpY2lwYW50IG5vbmNlc1xuICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHRoaXMuZ2V0TXVzaWcyUGFydGljaXBhbnRzKGlucHV0SW5kZXgsIGlucHV0LnRhcEludGVybmFsS2V5LCBpbnB1dC50YXBNZXJrbGVSb290KTtcbiAgICBjb25zdCB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXlzIH0gPSBwYXJ0aWNpcGFudHM7XG4gICAgY29uc3Qgc2lnbmVyUHViS2V5ID0gcGFydGljaXBhbnRQdWJLZXlzLmZpbmQoKHB1YktleSkgPT4gZXF1YWxQdWJsaWNLZXlJZ25vcmVZKHB1YktleSwgc2lnbmVyLnB1YmxpY0tleSkpO1xuICAgIGlmICghc2lnbmVyUHViS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lciBwdWIga2V5IHNob3VsZCBtYXRjaCBvbmUgb2YgcGFydGljaXBhbnQgcHViIGtleXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBub25jZXMgPSB0aGlzLmdldE11c2lnMk5vbmNlcyhpbnB1dEluZGV4LCBwYXJ0aWNpcGFudHMpO1xuICAgIGNvbnN0IHsgaGFzaCwgc2lnaGFzaFR5cGUgfSA9IHRoaXMuZ2V0VGFwcm9vdEhhc2hGb3JTaWcoaW5wdXRJbmRleCwgc2lnaGFzaFR5cGVzKTtcblxuICAgIGxldCBwYXJ0aWFsU2lnOiBCdWZmZXI7XG4gICAgaWYgKGRldGVybWluaXN0aWMpIHtcbiAgICAgIGlmICghZXF1YWxQdWJsaWNLZXlJZ25vcmVZKHNpZ25lclB1YktleSwgcGFydGljaXBhbnRQdWJLZXlzWzFdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBvbmx5IGFkZCBhIGRldGVybWluaXN0aWMgc2lnbmF0dXJlIG9uIHRoZSBjb3NpZ25lcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdFNpZ25lck5vbmNlID0gbm9uY2VzLmZpbmQoKG4pID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShuLnBhcnRpY2lwYW50UHViS2V5LCBwYXJ0aWNpcGFudFB1YktleXNbMF0pKTtcbiAgICAgIGlmICghZmlyc3RTaWduZXJOb25jZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIHRoZSB1c2VyIG5vbmNlJyk7XG4gICAgICB9XG5cbiAgICAgIHBhcnRpYWxTaWcgPSBtdXNpZzJEZXRlcm1pbmlzdGljU2lnbih7XG4gICAgICAgIHByaXZhdGVLZXk6IHNpZ25lci5wcml2YXRlS2V5LFxuICAgICAgICBvdGhlck5vbmNlOiBmaXJzdFNpZ25lck5vbmNlLnB1Yk5vbmNlLFxuICAgICAgICBwdWJsaWNLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICAgIGhhc2gsXG4gICAgICB9KS5zaWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlc3Npb25LZXkgPSBjcmVhdGVNdXNpZzJTaWduaW5nU2Vzc2lvbih7XG4gICAgICAgIHB1Yk5vbmNlczogW25vbmNlc1swXS5wdWJOb25jZSwgbm9uY2VzWzFdLnB1Yk5vbmNlXSxcbiAgICAgICAgcHViS2V5czogcGFydGljaXBhbnRQdWJLZXlzLFxuICAgICAgICB0eEhhc2g6IGhhc2gsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2lnbmVyTm9uY2UgPSBub25jZXMuZmluZCgoa3YpID0+IGVxdWFsUHVibGljS2V5SWdub3JlWShrdi5wYXJ0aWNpcGFudFB1YktleSwgc2lnbmVyUHViS2V5KSk7XG4gICAgICBpZiAoIXNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHViTm9uY2UgaXMgbWlzc2luZy4gcmV0cnkgc2lnbmluZyBwcm9jZXNzJyk7XG4gICAgICB9XG4gICAgICBwYXJ0aWFsU2lnID0gbXVzaWcyUGFydGlhbFNpZ24oc2lnbmVyLnByaXZhdGVLZXksIHNpZ25lck5vbmNlLnB1Yk5vbmNlLCBzZXNzaW9uS2V5LCB0aGlzLm5vbmNlU3RvcmUpO1xuICAgIH1cblxuICAgIGlmIChzaWdoYXNoVHlwZSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICBwYXJ0aWFsU2lnID0gQnVmZmVyLmNvbmNhdChbcGFydGlhbFNpZywgQnVmZmVyLm9mKHNpZ2hhc2hUeXBlKV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZyA9IGVuY29kZVBzYnRNdXNpZzJQYXJ0aWFsU2lnKHtcbiAgICAgIHBhcnRpY2lwYW50UHViS2V5OiBzaWduZXJQdWJLZXksXG4gICAgICB0YXBPdXRwdXRLZXksXG4gICAgICBwYXJ0aWFsU2lnOiBwYXJ0aWFsU2lnLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIHNpZyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzaWduVGFwcm9vdElucHV0KFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWduZXI6IFNjaG5vcnJTaWduZXIsXG4gICAgbGVhZkhhc2hlczogQnVmZmVyW10sXG4gICAgc2lnaGFzaFR5cGVzOiBudW1iZXJbXSA9IFtUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQsIFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMXVxuICApOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgLy8gRmlndXJlIG91dCBpZiB0aGlzIGlzIHNjcmlwdCBwYXRoIG9yIG5vdCwgaWYgbm90LCB0d2VhayB0aGUgcHJpdmF0ZSBrZXlcbiAgICBpZiAoIWlucHV0LnRhcExlYWZTY3JpcHQ/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBMZWFmU2NyaXB0IGlzIHJlcXVpcmVkIGZvciBwMnRyIHNjcmlwdCBwYXRoJyk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmtleSA9IHRvWE9ubHlQdWJsaWNLZXkoc2lnbmVyLnB1YmxpY0tleSk7XG4gICAgaWYgKGlucHV0LnRhcExlYWZTY3JpcHQubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgb25lIGxlYWYgc2NyaXB0IHN1cHBvcnRlZCBmb3Igc2lnbmluZycpO1xuICAgIH1cbiAgICBjb25zdCBbdGFwTGVhZlNjcmlwdF0gPSBpbnB1dC50YXBMZWFmU2NyaXB0O1xuXG4gICAgaWYgKHRoaXMuaXNNdWx0aXNpZ1RhcHJvb3RTY3JpcHQodGFwTGVhZlNjcmlwdC5zY3JpcHQpKSB7XG4gICAgICBjb25zdCBwdWJLZXlzID0gcGFyc2VQdWJTY3JpcHQyT2YzKHRhcExlYWZTY3JpcHQuc2NyaXB0LCAndGFwcm9vdFNjcmlwdFBhdGhTcGVuZCcpLnB1YmxpY0tleXM7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIHB1YktleXMuZmluZCgocGspID0+IHB1YmtleS5lcXVhbHMocGspKSxcbiAgICAgICAgJ3B1YmxpYyBrZXkgbm90IGZvdW5kIGluIHRhcCBsZWFmIHNjcmlwdCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkQ29udHJvbEJsb2NrID0gdGFwcm9vdC5wYXJzZUNvbnRyb2xCbG9jayhlY2NMaWIsIHRhcExlYWZTY3JpcHQuY29udHJvbEJsb2NrKTtcbiAgICBjb25zdCB7IGxlYWZWZXJzaW9uIH0gPSBwYXJzZWRDb250cm9sQmxvY2s7XG4gICAgaWYgKGxlYWZWZXJzaW9uICE9PSB0YXBMZWFmU2NyaXB0LmxlYWZWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcCBzY3JpcHQgbGVhZiB2ZXJzaW9uIG1pc21hdGNoIHdpdGggY29udHJvbCBibG9jaycpO1xuICAgIH1cbiAgICBjb25zdCBsZWFmSGFzaCA9IHRhcHJvb3QuZ2V0VGFwbGVhZkhhc2goZWNjTGliLCBwYXJzZWRDb250cm9sQmxvY2ssIHRhcExlYWZTY3JpcHQuc2NyaXB0KTtcbiAgICBpZiAoIWxlYWZIYXNoZXMuZmluZCgobCkgPT4gbC5lcXVhbHMobGVhZkhhc2gpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaWduZXIgY2Fubm90IHNpZ24gZm9yIGxlYWYgaGFzaCAke2xlYWZIYXNoLnRvU3RyaW5nKCdoZXgnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgeyBoYXNoLCBzaWdoYXNoVHlwZSB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4LCBzaWdoYXNoVHlwZXMsIGxlYWZIYXNoKTtcbiAgICBsZXQgc2lnbmF0dXJlID0gc2lnbmVyLnNpZ25TY2hub3JyKGhhc2gpO1xuICAgIGlmIChzaWdoYXNoVHlwZSAhPT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICBzaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtzaWduYXR1cmUsIEJ1ZmZlci5vZihzaWdoYXNoVHlwZSldKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhLnVwZGF0ZUlucHV0KGlucHV0SW5kZXgsIHtcbiAgICAgIHRhcFNjcmlwdFNpZzogW1xuICAgICAgICB7XG4gICAgICAgICAgcHVia2V5LFxuICAgICAgICAgIHNpZ25hdHVyZSxcbiAgICAgICAgICBsZWFmSGFzaCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIGdldFRhcHJvb3RPdXRwdXRTY3JpcHQoaW5wdXRJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIGlmIChpbnB1dC50YXBMZWFmU2NyaXB0Py5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0YXByb290LmNyZWF0ZVRhcHJvb3RPdXRwdXRTY3JpcHQoe1xuICAgICAgICBjb250cm9sQmxvY2s6IGlucHV0LnRhcExlYWZTY3JpcHRbMF0uY29udHJvbEJsb2NrLFxuICAgICAgICBsZWFmU2NyaXB0OiBpbnB1dC50YXBMZWFmU2NyaXB0WzBdLnNjcmlwdCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQudGFwSW50ZXJuYWxLZXkgJiYgaW5wdXQudGFwTWVya2xlUm9vdCkge1xuICAgICAgcmV0dXJuIHRhcHJvb3QuY3JlYXRlVGFwcm9vdE91dHB1dFNjcmlwdCh7XG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwdHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IGlucHV0Jyk7XG4gIH1cblxuICBwcml2YXRlIGdldFRhcHJvb3RIYXNoRm9yU2lnKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBzaWdoYXNoVHlwZXM/OiBudW1iZXJbXSxcbiAgICBsZWFmSGFzaD86IEJ1ZmZlclxuICApOiB7XG4gICAgaGFzaDogQnVmZmVyO1xuICAgIHNpZ2hhc2hUeXBlOiBudW1iZXI7XG4gIH0ge1xuICAgIGlmICghdGhpcy5pc1RhcHJvb3RJbnB1dChpbnB1dEluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgYSB0YXByb290IGlucHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ2hhc2hUeXBlID0gdGhpcy5kYXRhLmlucHV0c1tpbnB1dEluZGV4XS5zaWdoYXNoVHlwZSB8fCBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQ7XG4gICAgaWYgKHNpZ2hhc2hUeXBlcyAmJiBzaWdoYXNoVHlwZXMuaW5kZXhPZihzaWdoYXNoVHlwZSkgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTaWdoYXNoIHR5cGUgaXMgbm90IGFsbG93ZWQuIFJldHJ5IHRoZSBzaWduIG1ldGhvZCBwYXNzaW5nIHRoZSBgICtcbiAgICAgICAgICBgc2lnaGFzaFR5cGVzIGFycmF5IG9mIHdoaXRlbGlzdGVkIHR5cGVzLiBTaWdoYXNoIHR5cGU6ICR7c2lnaGFzaFR5cGV9YFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdHhJbnB1dHMgPSB0aGlzLnR4SW5wdXRzOyAvLyBUaGVzZSBhcmUgc29tZXdoYXQgY29zdGx5IHRvIGV4dHJhY3RcbiAgICBjb25zdCBwcmV2b3V0U2NyaXB0czogQnVmZmVyW10gPSBbXTtcbiAgICBjb25zdCBwcmV2b3V0VmFsdWVzOiBiaWdpbnRbXSA9IFtdO1xuXG4gICAgdGhpcy5kYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgICAgbGV0IHByZXZvdXQ7XG4gICAgICBpZiAoaW5wdXQubm9uV2l0bmVzc1V0eG8pIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjb3VsZCBiZSBjb3N0bHksIGVpdGhlciBjYWNoZSBpdCBoZXJlLCBvciBmaW5kIGEgd2F5IHRvIHNoYXJlIHdpdGggc3VwZXJcbiAgICAgICAgY29uc3Qgbm9uV2l0bmVzc1V0eG9UeCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVdHhvUHNidCkudHJhbnNhY3Rpb25Gcm9tQnVmZmVyKFxuICAgICAgICAgIGlucHV0Lm5vbldpdG5lc3NVdHhvLFxuICAgICAgICAgIHRoaXMudHgubmV0d29ya1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByZXZvdXRIYXNoID0gdHhJbnB1dHNbaV0uaGFzaDtcbiAgICAgICAgY29uc3QgdXR4b0hhc2ggPSBub25XaXRuZXNzVXR4b1R4LmdldEhhc2goKTtcblxuICAgICAgICAvLyBJZiBhIG5vbi13aXRuZXNzIFVUWE8gaXMgcHJvdmlkZWQsIGl0cyBoYXNoIG11c3QgbWF0Y2ggdGhlIGhhc2ggc3BlY2lmaWVkIGluIHRoZSBwcmV2b3V0XG4gICAgICAgIGlmICghcHJldm91dEhhc2guZXF1YWxzKHV0eG9IYXNoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9uLXdpdG5lc3MgVVRYTyBoYXNoIGZvciBpbnB1dCAjJHtpfSBkb2Vzbid0IG1hdGNoIHRoZSBoYXNoIHNwZWNpZmllZCBpbiB0aGUgcHJldm91dGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldm91dEluZGV4ID0gdHhJbnB1dHNbaV0uaW5kZXg7XG4gICAgICAgIHByZXZvdXQgPSBub25XaXRuZXNzVXR4b1R4Lm91dHNbcHJldm91dEluZGV4XTtcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQud2l0bmVzc1V0eG8pIHtcbiAgICAgICAgcHJldm91dCA9IGlucHV0LndpdG5lc3NVdHhvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIGEgVXR4byBpbnB1dCBpdGVtIGZvciBzaWduaW5nJyk7XG4gICAgICB9XG4gICAgICBwcmV2b3V0U2NyaXB0cy5wdXNoKHByZXZvdXQuc2NyaXB0KTtcbiAgICAgIHByZXZvdXRWYWx1ZXMucHVzaChwcmV2b3V0LnZhbHVlKTtcbiAgICB9KTtcbiAgICBjb25zdCBvdXRwdXRTY3JpcHQgPSB0aGlzLmdldFRhcHJvb3RPdXRwdXRTY3JpcHQoaW5wdXRJbmRleCk7XG4gICAgaWYgKCFvdXRwdXRTY3JpcHQuZXF1YWxzKHByZXZvdXRTY3JpcHRzW2lucHV0SW5kZXhdKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaXRuZXNzIHNjcmlwdCBmb3IgaW5wdXQgIyR7aW5wdXRJbmRleH0gZG9lc24ndCBtYXRjaCB0aGUgc2NyaXB0UHViS2V5IGluIHRoZSBwcmV2b3V0YCk7XG4gICAgfVxuICAgIGNvbnN0IGhhc2ggPSB0aGlzLnR4Lmhhc2hGb3JXaXRuZXNzVjEoaW5wdXRJbmRleCwgcHJldm91dFNjcmlwdHMsIHByZXZvdXRWYWx1ZXMsIHNpZ2hhc2hUeXBlLCBsZWFmSGFzaCk7XG4gICAgcmV0dXJuIHsgaGFzaCwgc2lnaGFzaFR5cGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBwYWlyIHRvIFBTQlQgaW5wdXQuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXg6IG51bWJlciwga2V5VmFsdWVEYXRhOiBQcm9wcmlldGFyeUtleVZhbHVlKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVW5rbm93bktleVZhbFRvSW5wdXQoaW5wdXRJbmRleCwge1xuICAgICAga2V5OiBlbmNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZURhdGEua2V5KSxcbiAgICAgIHZhbHVlOiBrZXlWYWx1ZURhdGEudmFsdWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBvciB1cGRhdGVzIChpZiBleGlzdHMpIHByb3ByaWV0YXJ5IGtleSB2YWx1ZSBwYWlyIHRvIFBTQlQgaW5wdXQuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgYWRkT3JVcGRhdGVQcm9wcmlldGFyeUtleVZhbFRvSW5wdXQoaW5wdXRJbmRleDogbnVtYmVyLCBrZXlWYWx1ZURhdGE6IFByb3ByaWV0YXJ5S2V5VmFsdWUpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgY29uc3Qga2V5ID0gZW5jb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWVEYXRhLmtleSk7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0ga2V5VmFsdWVEYXRhO1xuICAgIGlmIChpbnB1dC51bmtub3duS2V5VmFscz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1a3ZJbmRleCA9IGlucHV0LnVua25vd25LZXlWYWxzLmZpbmRJbmRleCgodWt2KSA9PiB1a3Yua2V5LmVxdWFscyhrZXkpKTtcbiAgICAgIGlmICh1a3ZJbmRleCA+IC0xKSB7XG4gICAgICAgIGlucHV0LnVua25vd25LZXlWYWxzW3VrdkluZGV4XSA9IHsga2V5LCB2YWx1ZSB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRVbmtub3duS2V5VmFsVG9JbnB1dChpbnB1dEluZGV4LCB7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBzZWFyY2ggYW55IGRhdGEgZnJvbSBwcm9wcmlldGFyeSBrZXkgdmFsdWUgYWdhaW5zdCBrZXlkYXRhLlxuICAgKiBEZWZhdWx0IGlkZW50aWZpZXJFbmNvZGluZyBpcyB1dGYtOCBmb3IgaWRlbnRpZmllci5cbiAgICovXG4gIGdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4OiBudW1iZXIsIGtleVNlYXJjaD86IFByb3ByaWV0YXJ5S2V5U2VhcmNoKTogUHJvcHJpZXRhcnlLZXlWYWx1ZVtdIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgcmV0dXJuIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwga2V5U2VhcmNoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBkZWxldGUgYW55IGRhdGEgZnJvbSBwcm9wcmlldGFyeSBrZXkgdmFsdWUuXG4gICAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICAgKi9cbiAgZGVsZXRlUHJvcHJpZXRhcnlLZXlWYWxzKGlucHV0SW5kZXg6IG51bWJlciwga2V5c1RvRGVsZXRlPzogUHJvcHJpZXRhcnlLZXlTZWFyY2gpOiB0aGlzIHtcbiAgICBjb25zdCBpbnB1dCA9IGNoZWNrRm9ySW5wdXQodGhpcy5kYXRhLmlucHV0cywgaW5wdXRJbmRleCk7XG4gICAgaWYgKCFpbnB1dC51bmtub3duS2V5VmFscz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKGtleXNUb0RlbGV0ZSAmJiBrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0gdW5kZWZpbmVkICYmIEJ1ZmZlci5pc0J1ZmZlcihrZXlzVG9EZWxldGUua2V5ZGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcm9wcmlldGFyeSBrZXkgc2VhcmNoIGZpbHRlciBjb21iaW5hdGlvbi4gc3VidHlwZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpbnB1dC51bmtub3duS2V5VmFscyA9IGlucHV0LnVua25vd25LZXlWYWxzLmZpbHRlcigoa2V5VmFsdWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGRlY29kZVByb3ByaWV0YXJ5S2V5KGtleVZhbHVlLmtleSk7XG4gICAgICByZXR1cm4gIShcbiAgICAgICAga2V5c1RvRGVsZXRlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgKGtleXNUb0RlbGV0ZS5pZGVudGlmaWVyID09PSBrZXkuaWRlbnRpZmllciAmJlxuICAgICAgICAgIChrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoa2V5c1RvRGVsZXRlLnN1YnR5cGUgPT09IGtleS5zdWJ0eXBlICYmXG4gICAgICAgICAgICAgICghQnVmZmVyLmlzQnVmZmVyKGtleXNUb0RlbGV0ZS5rZXlkYXRhKSB8fCBrZXlzVG9EZWxldGUua2V5ZGF0YS5lcXVhbHMoa2V5LmtleWRhdGEpKSkpKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTXVzaWcyTm9uY2VGb3JJbnB1dChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAga2V5VHlwZTogJ3Jvb3QnIHwgJ2Rlcml2ZWQnLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogUHNidE11c2lnMlB1Yk5vbmNlIHtcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZGF0YS5pbnB1dHNbaW5wdXRJbmRleF07XG4gICAgaWYgKCFpbnB1dC50YXBJbnRlcm5hbEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBJbnRlcm5hbEtleSBpcyByZXF1aXJlZCB0byBjcmVhdGUgbm9uY2UnKTtcbiAgICB9XG4gICAgaWYgKCFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcE1lcmtsZVJvb3QgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGNvbnN0IGdldERlcml2ZWRLZXlQYWlyID0gKCk6IEJJUDMySW50ZXJmYWNlID0+IHtcbiAgICAgIGlmICghaW5wdXQudGFwQmlwMzJEZXJpdmF0aW9uPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXBCaXAzMkRlcml2YXRpb24gaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG5vbmNlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXJpdmVkID0gVXR4b1BzYnQuZGVyaXZlS2V5UGFpcihrZXlQYWlyLCBpbnB1dC50YXBCaXAzMkRlcml2YXRpb24sIHsgaWdub3JlWTogdHJ1ZSB9KTtcbiAgICAgIGlmICghZGVyaXZlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCBtYXRjaGVkIHRoZSBIRCBrZXlQYWlyIGZpbmdlcnByaW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVyaXZlZDtcbiAgICB9O1xuICAgIGNvbnN0IGRlcml2ZWRLZXlQYWlyID0ga2V5VHlwZSA9PT0gJ3Jvb3QnID8gZ2V0RGVyaXZlZEtleVBhaXIoKSA6IGtleVBhaXI7XG4gICAgaWYgKCFkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGVLZXkgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHBhcnNlUHNidE11c2lnMlBhcnRpY2lwYW50cyhpbnB1dCk7XG4gICAgaWYgKCFwYXJ0aWNpcGFudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgMCBtYXRjaGluZyBwYXJ0aWNpcGFudCBrZXkgdmFsdWUgaW5zdGVhZCBvZiAxYCk7XG4gICAgfVxuICAgIGFzc2VydFBzYnRNdXNpZzJQYXJ0aWNpcGFudHMocGFydGljaXBhbnRzLCBpbnB1dC50YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gICAgY29uc3QgeyB0YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50UHViS2V5cyB9ID0gcGFydGljaXBhbnRzO1xuXG4gICAgY29uc3QgcGFydGljaXBhbnRQdWJLZXkgPSBwYXJ0aWNpcGFudFB1YktleXMuZmluZCgocHViS2V5KSA9PlxuICAgICAgZXF1YWxQdWJsaWNLZXlJZ25vcmVZKHB1YktleSwgZGVyaXZlZEtleVBhaXIucHVibGljS2V5KVxuICAgICk7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIocGFydGljaXBhbnRQdWJLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnRpY2lwYW50IHBsYWluIHB1YiBrZXkgc2hvdWxkIG1hdGNoIG9uZSBiaXAzMkRlcml2YXRpb24gcGxhaW4gcHViIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaGFzaCB9ID0gdGhpcy5nZXRUYXByb290SGFzaEZvclNpZyhpbnB1dEluZGV4KTtcblxuICAgIGxldCBwdWJOb25jZTogQnVmZmVyO1xuICAgIGlmIChwYXJhbXMuZGV0ZXJtaW5pc3RpYykge1xuICAgICAgaWYgKHBhcmFtcy5zZXNzaW9uSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGV4dHJhIGVudHJvcHkgd2hlbiBnZW5lcmF0aW5nIGEgZGV0ZXJtaW5pc3RpYyBub25jZScpO1xuICAgICAgfVxuICAgICAgLy8gVGhlcmUgbXVzdCBiZSBvbmx5IDIgcGFydGljaXBhbnQgcHViS2V5cyBpZiBpdCBnb3QgdG8gdGhpcyBwb2ludFxuICAgICAgaWYgKCFlcXVhbFB1YmxpY0tleUlnbm9yZVkocGFydGljaXBhbnRQdWJLZXksIHBhcnRpY2lwYW50UHViS2V5c1sxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPbmx5IHRoZSBjb3NpZ25lcidzIG5vbmNlIGNhbiBiZSBzZXQgZGV0ZXJtaW5pc3RpY2FsbHlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vbmNlcyA9IHBhcnNlUHNidE11c2lnMk5vbmNlcyhpbnB1dCk7XG4gICAgICBpZiAoIW5vbmNlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG5vbmNlcyBmb3VuZCBvbiBpbnB1dCAjJHtpbnB1dEluZGV4fWApO1xuICAgICAgfVxuICAgICAgaWYgKG5vbmNlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGhhdmUgbW9yZSB0aGFuIDIgbm9uY2VzYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaXJzdFNpZ25lck5vbmNlID0gbm9uY2VzLmZpbmQoKGt2KSA9PiBlcXVhbFB1YmxpY0tleUlnbm9yZVkoa3YucGFydGljaXBhbnRQdWJLZXksIHBhcnRpY2lwYW50UHViS2V5c1swXSkpO1xuICAgICAgaWYgKCFmaXJzdFNpZ25lck5vbmNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVyIG5vbmNlIG11c3QgYmUgc2V0IGlmIGNvc2lnbmVyIG5vbmNlIGlzIHRvIGJlIGRlcml2ZWQgZGV0ZXJtaW5pc3RpY2FsbHknKTtcbiAgICAgIH1cblxuICAgICAgcHViTm9uY2UgPSBjcmVhdGVNdXNpZzJEZXRlcm1pbmlzdGljTm9uY2Uoe1xuICAgICAgICBwcml2YXRlS2V5OiBkZXJpdmVkS2V5UGFpci5wcml2YXRlS2V5LFxuICAgICAgICBvdGhlck5vbmNlOiBmaXJzdFNpZ25lck5vbmNlLnB1Yk5vbmNlLFxuICAgICAgICBwdWJsaWNLZXlzOiBwYXJ0aWNpcGFudFB1YktleXMsXG4gICAgICAgIGludGVybmFsUHViS2V5OiBpbnB1dC50YXBJbnRlcm5hbEtleSxcbiAgICAgICAgdGFwVHJlZVJvb3Q6IGlucHV0LnRhcE1lcmtsZVJvb3QsXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHViTm9uY2UgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgdGhpcy5ub25jZVN0b3JlLmNyZWF0ZU11c2lnMk5vbmNlKFxuICAgICAgICAgIGRlcml2ZWRLZXlQYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgICAgICAgdGFwT3V0cHV0S2V5LFxuICAgICAgICAgIGhhc2gsXG4gICAgICAgICAgcGFyYW1zLnNlc3Npb25JZFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRhcE91dHB1dEtleSwgcGFydGljaXBhbnRQdWJLZXksIHB1Yk5vbmNlIH07XG4gIH1cblxuICBwcml2YXRlIHNldE11c2lnMk5vbmNlc0lubmVyKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIGtleVR5cGU6ICdyb290JyB8ICdkZXJpdmVkJyxcbiAgICBpbnB1dEluZGV4PzogbnVtYmVyLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgaWYgKGtleVBhaXIuaXNOZXV0ZXJlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ByaXZhdGUga2V5IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gICAgfVxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIocGFyYW1zLnNlc3Npb25JZCkgJiYgcGFyYW1zLnNlc3Npb25JZC5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtwYXJhbXMuc2Vzc2lvbklkLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dEluZGV4ZXMgPSBpbnB1dEluZGV4ID09PSB1bmRlZmluZWQgPyBbLi4uQXJyYXkodGhpcy5pbnB1dENvdW50KS5rZXlzKCldIDogW2lucHV0SW5kZXhdO1xuICAgIGlucHV0SW5kZXhlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzVGFwcm9vdEtleVBhdGhJbnB1dChpbmRleCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9uY2UgPSB0aGlzLmNyZWF0ZU11c2lnMk5vbmNlRm9ySW5wdXQoaW5kZXgsIGtleVBhaXIsIGtleVR5cGUsIHBhcmFtcyk7XG4gICAgICB0aGlzLmFkZE9yVXBkYXRlUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGluZGV4LCBlbmNvZGVQc2J0TXVzaWcyUHViTm9uY2Uobm9uY2UpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIHRhcHJvb3Qga2V5IHBhdGggaW5wdXQgYXQgaW5wdXRJbmRleC5cbiAgICogSWYgaW5wdXQgaXMgbm90IGEgdGFwcm9vdCBrZXkgcGF0aCwgbm8gYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRJbmRleCBpbnB1dCBpbmRleFxuICAgKiBAcGFyYW0ga2V5UGFpciBkZXJpdmVkIGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgT3B0aW9uYWwgZXh0cmEgZW50cm9weS4gSWYgcHJvdmlkZWQgaXQgbXVzdCBlaXRoZXIgYmUgYSBjb3VudGVyIHVuaXF1ZSB0byB0aGlzIHNlY3JldCBrZXksXG4gICAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICAgKiBAcGFyYW0gZGV0ZXJtaW5pc3RpYyBJZiB0cnVlLCBzZXQgdGhlIGNvc2lnbmVyIG5vbmNlIGRldGVybWluaXN0aWNhbGx5XG4gICAqL1xuICBzZXRJbnB1dE11c2lnMk5vbmNlKFxuICAgIGlucHV0SW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmVkS2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5zZXRNdXNpZzJOb25jZXNJbm5lcihkZXJpdmVkS2V5UGFpciwgJ2Rlcml2ZWQnLCBpbnB1dEluZGV4LCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbmQgc2V0cyBNdVNpZzIgbm9uY2UgdG8gdGFwcm9vdCBrZXkgcGF0aCBpbnB1dCBhdCBpbnB1dEluZGV4LlxuICAgKiBJZiBpbnB1dCBpcyBub3QgYSB0YXByb290IGtleSBwYXRoLCBubyBhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIEhEIHJvb3Qga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqIEBwYXJhbSBkZXRlcm1pbmlzdGljIElmIHRydWUsIHNldCB0aGUgY29zaWduZXIgbm9uY2UgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICovXG4gIHNldElucHV0TXVzaWcyTm9uY2VIRChcbiAgICBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAga2V5UGFpcjogQklQMzJJbnRlcmZhY2UsXG4gICAgcGFyYW1zOiB7IHNlc3Npb25JZD86IEJ1ZmZlcjsgZGV0ZXJtaW5pc3RpYz86IGJvb2xlYW4gfSA9IHsgZGV0ZXJtaW5pc3RpYzogZmFsc2UgfVxuICApOiB0aGlzIHtcbiAgICBjaGVja0ZvcklucHV0KHRoaXMuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICAgIHJldHVybiB0aGlzLnNldE11c2lnMk5vbmNlc0lubmVyKGtleVBhaXIsICdyb290JywgaW5wdXRJbmRleCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW5kIHNldHMgTXVTaWcyIG5vbmNlIHRvIGFsbCB0YXByb290IGtleSBwYXRoIGlucHV0cy4gT3RoZXIgaW5wdXRzIHdpbGwgYmUgc2tpcHBlZC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0SW5kZXggaW5wdXQgaW5kZXhcbiAgICogQHBhcmFtIGtleVBhaXIgZGVyaXZlZCBrZXkgcGFpclxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIE9wdGlvbmFsIGV4dHJhIGVudHJvcHkuIElmIHByb3ZpZGVkIGl0IG11c3QgZWl0aGVyIGJlIGEgY291bnRlciB1bmlxdWUgdG8gdGhpcyBzZWNyZXQga2V5LFxuICAgKiAoY29udmVydGVkIHRvIGFuIGFycmF5IG9mIDMyIGJ5dGVzKSwgb3IgMzIgdW5pZm9ybWx5IHJhbmRvbSBieXRlcy5cbiAgICovXG4gIHNldEFsbElucHV0c011c2lnMk5vbmNlKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ2Rlcml2ZWQnLCB1bmRlZmluZWQsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuZCBzZXRzIE11U2lnMiBub25jZSB0byBhbGwgdGFwcm9vdCBrZXkgcGF0aCBpbnB1dHMuIE90aGVyIGlucHV0cyB3aWxsIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dEluZGV4IGlucHV0IGluZGV4XG4gICAqIEBwYXJhbSBrZXlQYWlyIEhEIHJvb3Qga2V5IHBhaXJcbiAgICogQHBhcmFtIHNlc3Npb25JZCBPcHRpb25hbCBleHRyYSBlbnRyb3B5LiBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAgICogKGNvbnZlcnRlZCB0byBhbiBhcnJheSBvZiAzMiBieXRlcyksIG9yIDMyIHVuaWZvcm1seSByYW5kb20gYnl0ZXMuXG4gICAqL1xuICBzZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKFxuICAgIGtleVBhaXI6IEJJUDMySW50ZXJmYWNlLFxuICAgIHBhcmFtczogeyBzZXNzaW9uSWQ/OiBCdWZmZXI7IGRldGVybWluaXN0aWM/OiBib29sZWFuIH0gPSB7IGRldGVybWluaXN0aWM6IGZhbHNlIH1cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TXVzaWcyTm9uY2VzSW5uZXIoa2V5UGFpciwgJ3Jvb3QnLCB1bmRlZmluZWQsIHBhcmFtcyk7XG4gIH1cblxuICBjbG9uZSgpOiB0aGlzIHtcbiAgICByZXR1cm4gc3VwZXIuY2xvbmUoKSBhcyB0aGlzO1xuICB9XG5cbiAgZXh0cmFjdFRyYW5zYWN0aW9uKGRpc2FibGVGZWVDaGVjayA9IHRydWUpOiBVdHhvVHJhbnNhY3Rpb248YmlnaW50PiB7XG4gICAgY29uc3QgdHggPSBzdXBlci5leHRyYWN0VHJhbnNhY3Rpb24oZGlzYWJsZUZlZUNoZWNrKTtcbiAgICBpZiAodHggaW5zdGFuY2VvZiBVdHhvVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybiB0eDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHRyYWN0VHJhbnNhY3Rpb24gZGlkIG5vdCByZXR1cm4gaW5zdGFjZSBvZiBVdHhvVHJhbnNhY3Rpb24nKTtcbiAgfVxufVxuIl19