@bitgo-beta/abstract-cosmos 1.0.1-beta.185 → 1.0.1-beta.1850

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/resources/MsgCompiled.d.ts +1212 -0
  2. package/dist/resources/MsgCompiled.js +2761 -0
  3. package/dist/resources/ProposalCompiled.d.ts +314 -0
  4. package/dist/resources/ProposalCompiled.js +1090 -0
  5. package/dist/src/cosmosCoin.d.ts +62 -7
  6. package/dist/src/cosmosCoin.d.ts.map +1 -1
  7. package/dist/src/cosmosCoin.js +325 -148
  8. package/dist/src/index.js +6 -2
  9. package/dist/src/lib/ContractCallBuilder.d.ts +5 -5
  10. package/dist/src/lib/ContractCallBuilder.d.ts.map +1 -1
  11. package/dist/src/lib/ContractCallBuilder.js +54 -7
  12. package/dist/src/lib/StakingActivateBuilder.d.ts +3 -3
  13. package/dist/src/lib/StakingActivateBuilder.d.ts.map +1 -1
  14. package/dist/src/lib/StakingActivateBuilder.js +35 -2
  15. package/dist/src/lib/StakingDeactivateBuilder.d.ts +3 -3
  16. package/dist/src/lib/StakingDeactivateBuilder.d.ts.map +1 -1
  17. package/dist/src/lib/StakingDeactivateBuilder.js +35 -2
  18. package/dist/src/lib/StakingRedelegateBuilder.d.ts +13 -0
  19. package/dist/src/lib/StakingRedelegateBuilder.d.ts.map +1 -0
  20. package/dist/src/lib/StakingRedelegateBuilder.js +61 -0
  21. package/dist/src/lib/StakingWithdrawRewardsBuilder.d.ts +3 -3
  22. package/dist/src/lib/StakingWithdrawRewardsBuilder.d.ts.map +1 -1
  23. package/dist/src/lib/StakingWithdrawRewardsBuilder.js +35 -2
  24. package/dist/src/lib/constants.d.ts +4 -0
  25. package/dist/src/lib/constants.d.ts.map +1 -1
  26. package/dist/src/lib/constants.js +6 -2
  27. package/dist/src/lib/iface.d.ts +36 -8
  28. package/dist/src/lib/iface.d.ts.map +1 -1
  29. package/dist/src/lib/iface.js +3 -3
  30. package/dist/src/lib/index.d.ts +1 -0
  31. package/dist/src/lib/index.d.ts.map +1 -1
  32. package/dist/src/lib/index.js +32 -4
  33. package/dist/src/lib/keyPair.js +9 -10
  34. package/dist/src/lib/protobuf-init.d.ts +9 -0
  35. package/dist/src/lib/protobuf-init.d.ts.map +1 -0
  36. package/dist/src/lib/protobuf-init.js +25 -0
  37. package/dist/src/lib/transaction.d.ts +8 -9
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +60 -16
  40. package/dist/src/lib/transactionBuilder.d.ts +25 -15
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilder.js +33 -8
  43. package/dist/src/lib/transferBuilder.d.ts +3 -3
  44. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  45. package/dist/src/lib/transferBuilder.js +35 -2
  46. package/dist/src/lib/utils.d.ts +84 -17
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +337 -40
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +17 -12
  51. package/.eslintignore +0 -5
  52. package/.mocharc.yml +0 -8
  53. package/CHANGELOG.md +0 -283
@@ -1,4 +1,40 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
2
38
  Object.defineProperty(exports, "__esModule", { value: true });
3
39
  exports.CosmosUtils = void 0;
4
40
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
@@ -6,16 +42,24 @@ const amino_1 = require("@cosmjs/amino");
6
42
  const encoding_1 = require("@cosmjs/encoding");
7
43
  const proto_signing_1 = require("@cosmjs/proto-signing");
8
44
  const stargate_1 = require("@cosmjs/stargate");
9
- const bignumber_js_1 = require("bignumber.js");
45
+ const statics_1 = require("@bitgo-beta/statics");
46
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
10
47
  const tx_1 = require("cosmjs-types/cosmos/tx/v1beta1/tx");
11
48
  const tx_2 = require("cosmjs-types/cosmwasm/wasm/v1/tx");
12
49
  const crypto_1 = require("crypto");
13
- const constants = require("./constants");
50
+ const constants = __importStar(require("./constants"));
14
51
  const keyPair_1 = require("./keyPair");
52
+ const protobuf_init_1 = require("./protobuf-init");
53
+ const { MsgCompiled, ProposalCompiled } = (0, protobuf_init_1.initializeProtobufModules)();
54
+ const { MsgSend } = MsgCompiled.types;
55
+ const { MsgSubmitProposal, MsgVote } = ProposalCompiled.cosmos.group.v1;
15
56
  class CosmosUtils {
16
57
  constructor() {
17
58
  this.registry = new proto_signing_1.Registry([...stargate_1.defaultRegistryTypes]);
18
59
  this.registry.register(constants.executeContractMsgTypeUrl, tx_2.MsgExecuteContract);
60
+ this.registry.register('/types.MsgSend', MsgSend);
61
+ this.registry.register(constants.groupProposalMsgTypeUrl, MsgSubmitProposal);
62
+ this.registry.register(constants.groupVoteMsgTypeUrl, MsgVote);
19
63
  }
20
64
  /** @inheritdoc */
21
65
  isValidBlockId(hash) {
@@ -53,7 +97,7 @@ class CosmosUtils {
53
97
  * Checks if transaction hash is in valid black2b format
54
98
  */
55
99
  validateBlake2b(hash) {
56
- if ((hash === null || hash === void 0 ? void 0 : hash.length) !== 64) {
100
+ if (hash?.length !== 64) {
57
101
  return false;
58
102
  }
59
103
  return hash.match(/^[a-zA-Z0-9]+$/) !== null;
@@ -91,7 +135,7 @@ class CosmosUtils {
91
135
  */
92
136
  getDecodedTxFromRawBase64(txRaw) {
93
137
  try {
94
- return proto_signing_1.decodeTxRaw(encoding_1.fromBase64(txRaw));
138
+ return (0, proto_signing_1.decodeTxRaw)((0, encoding_1.fromBase64)(txRaw));
95
139
  }
96
140
  catch (e) {
97
141
  throw new sdk_core_1.ParseTransactionError('Error decoding TxRaw base64 encoded string: ' + e.message);
@@ -137,11 +181,14 @@ class CosmosUtils {
137
181
  * @returns {FeeData} fee data
138
182
  */
139
183
  getGasBudgetFromDecodedTx(decodedTx) {
140
- var _a, _b;
141
- return {
142
- amount: (_a = decodedTx.authInfo.fee) === null || _a === void 0 ? void 0 : _a.amount,
143
- gasLimit: Number((_b = decodedTx.authInfo.fee) === null || _b === void 0 ? void 0 : _b.gasLimit),
184
+ const feeData = {
185
+ amount: decodedTx.authInfo.fee?.amount,
186
+ gasLimit: Number(decodedTx.authInfo.fee?.gasLimit),
144
187
  };
188
+ if (decodedTx.authInfo.fee?.granter) {
189
+ feeData.feeGranter = decodedTx.authInfo.fee.granter;
190
+ }
191
+ return feeData;
145
192
  }
146
193
  /**
147
194
  * Returns the publicKey from the decoded transaction
@@ -149,10 +196,9 @@ class CosmosUtils {
149
196
  * @returns {string | undefined} publicKey in hex format if it exists, undefined otherwise
150
197
  */
151
198
  getPublicKeyFromDecodedTx(decodedTx) {
152
- var _a, _b, _c, _d;
153
- const publicKeyUInt8Array = (_b = (_a = decodedTx.authInfo.signerInfos) === null || _a === void 0 ? void 0 : _a[0].publicKey) === null || _b === void 0 ? void 0 : _b.value;
199
+ const publicKeyUInt8Array = decodedTx.authInfo.signerInfos?.[0].publicKey?.value;
154
200
  if (publicKeyUInt8Array) {
155
- return encoding_1.toHex(encoding_1.fromBase64((_d = proto_signing_1.decodePubkey((_c = decodedTx.authInfo.signerInfos) === null || _c === void 0 ? void 0 : _c[0].publicKey)) === null || _d === void 0 ? void 0 : _d.value));
201
+ return (0, encoding_1.toHex)((0, encoding_1.fromBase64)((0, proto_signing_1.decodePubkey)(decodedTx.authInfo.signerInfos?.[0].publicKey)?.value));
156
202
  }
157
203
  return undefined;
158
204
  }
@@ -192,6 +238,25 @@ class CosmosUtils {
192
238
  };
193
239
  });
194
240
  }
241
+ /**
242
+ * Returns the array of MessageData[] from the decoded transaction
243
+ * @param {DecodedTxRaw} decodedTx
244
+ * @returns {MessageData[]} Redelegate transaction message data
245
+ */
246
+ getRedelegateMessageDataFromDecodedTx(decodedTx) {
247
+ return decodedTx.body.messages.map((message) => {
248
+ const value = this.registry.decode(message);
249
+ return {
250
+ value: {
251
+ delegatorAddress: value.delegatorAddress,
252
+ validatorSrcAddress: value.validatorSrcAddress,
253
+ validatorDstAddress: value.validatorDstAddress,
254
+ amount: value.amount,
255
+ },
256
+ typeUrl: message.typeUrl,
257
+ };
258
+ });
259
+ }
195
260
  /**
196
261
  * Returns the array of MessageData[] from the decoded transaction
197
262
  * @param {DecodedTxRaw} decodedTx
@@ -226,6 +291,27 @@ class CosmosUtils {
226
291
  };
227
292
  });
228
293
  }
294
+ /**
295
+ * Get a cosmos chain address from its equivalent hex
296
+ * @param {string} prefix
297
+ * @param {string} addressHex
298
+ * @returns {string}
299
+ */
300
+ getCosmosLikeAddressFromHex(prefix, addressHex) {
301
+ if (addressHex.indexOf('0x') === 0) {
302
+ addressHex = addressHex.slice(2);
303
+ }
304
+ return (0, encoding_1.toBech32)(prefix, (0, encoding_1.fromHex)(addressHex));
305
+ }
306
+ /**
307
+ * Get a EVM chain address from its equivalent hex
308
+ * @param {string} prefix
309
+ * @param {string} addressHex
310
+ * @returns {string}
311
+ */
312
+ getEvmLikeAddressFromCosmos(cosmosLikeAddress) {
313
+ return '0x' + (0, encoding_1.toHex)((0, encoding_1.fromBech32)(cosmosLikeAddress).data);
314
+ }
229
315
  /**
230
316
  * Returns the array of MessageData[] from the decoded transaction
231
317
  * @param {DecodedTxRaw} decodedTx
@@ -233,18 +319,39 @@ class CosmosUtils {
233
319
  */
234
320
  getExecuteContractMessageDataFromDecodedTx(decodedTx) {
235
321
  return decodedTx.body.messages.map((message) => {
236
- const value = this.registry.decode(message);
237
- return {
238
- value: {
239
- sender: value.sender,
240
- contract: value.contract,
241
- msg: value.msg,
242
- funds: value.funds,
243
- },
244
- typeUrl: message.typeUrl,
245
- };
322
+ if (message.typeUrl !== constants.groupProposalMsgTypeUrl && message.typeUrl !== constants.groupVoteMsgTypeUrl) {
323
+ try {
324
+ const value = this.registry.decode(message);
325
+ return {
326
+ value: {
327
+ sender: value.sender,
328
+ contract: value.contract,
329
+ msg: value.msg,
330
+ funds: value.funds,
331
+ },
332
+ typeUrl: message.typeUrl,
333
+ };
334
+ }
335
+ catch (error) {
336
+ throw new sdk_core_1.ParseTransactionError(`Error decoding execute contract message: ${error.message}`);
337
+ }
338
+ }
339
+ else {
340
+ return {
341
+ value: message.value,
342
+ typeUrl: message.typeUrl,
343
+ };
344
+ }
246
345
  });
247
346
  }
347
+ /**
348
+ * Returns the array of MessageData[] from the decoded transaction
349
+ * @param {DecodedTxRaw} decodedTx
350
+ * @returns {MessageData[]} Custom transaction message data
351
+ */
352
+ getCustomMessageDataFromDecodedTx(decodedTx) {
353
+ throw new sdk_core_1.NotSupported('Custom message data not supported');
354
+ }
248
355
  /**
249
356
  * Determines bitgo transaction type based on cosmos proto type url
250
357
  * @param {string} typeUrl
@@ -254,6 +361,8 @@ class CosmosUtils {
254
361
  switch (typeUrl) {
255
362
  case constants.sendMsgTypeUrl:
256
363
  return sdk_core_1.TransactionType.Send;
364
+ case constants.sendMsgType:
365
+ return sdk_core_1.TransactionType.Send;
257
366
  case constants.delegateMsgTypeUrl:
258
367
  return sdk_core_1.TransactionType.StakingActivate;
259
368
  case constants.undelegateMsgTypeUrl:
@@ -262,6 +371,12 @@ class CosmosUtils {
262
371
  return sdk_core_1.TransactionType.StakingWithdraw;
263
372
  case constants.executeContractMsgTypeUrl:
264
373
  return sdk_core_1.TransactionType.ContractCall;
374
+ case constants.groupProposalMsgTypeUrl:
375
+ return sdk_core_1.TransactionType.ContractCall;
376
+ case constants.groupVoteMsgTypeUrl:
377
+ return sdk_core_1.TransactionType.ContractCall;
378
+ case constants.redelegateTypeUrl:
379
+ return sdk_core_1.TransactionType.StakingRedelegate;
265
380
  default:
266
381
  return undefined;
267
382
  }
@@ -273,7 +388,44 @@ class CosmosUtils {
273
388
  * @returns {Any} pubkey encoded as protobuf `Any`
274
389
  */
275
390
  getEncodedPubkey(pubkey) {
276
- return proto_signing_1.encodePubkey(amino_1.encodeSecp256k1Pubkey(encoding_1.fromHex(pubkey)));
391
+ return (0, proto_signing_1.encodePubkey)((0, amino_1.encodeSecp256k1Pubkey)((0, encoding_1.fromHex)(pubkey)));
392
+ }
393
+ /**
394
+ * Gets the send messages used in the final step of encoding a transaction. This allows for any final processing needed.
395
+ * @param {CosmosLikeTransaction} cosmosLikeTransaction transaction to get send messages from
396
+ * @returns {Any[]} processed send messages
397
+ */
398
+ getSendMessagesForEncodingTx(cosmosLikeTransaction) {
399
+ return cosmosLikeTransaction.sendMessages.map((msg) => {
400
+ if (msg.value instanceof Uint8Array) {
401
+ if (msg.typeUrl === constants.groupProposalMsgTypeUrl || msg.typeUrl === constants.groupVoteMsgTypeUrl) {
402
+ // For group proposal/vote messages, the pre-encoded bytes contain the full message
403
+ try {
404
+ const decoded = this.registry.decode({ typeUrl: msg.typeUrl, value: msg.value });
405
+ return {
406
+ typeUrl: msg.typeUrl,
407
+ value: decoded,
408
+ };
409
+ }
410
+ catch (error) {
411
+ // If decoding fails, fall back to returning the bytes directly
412
+ return {
413
+ typeUrl: msg.typeUrl,
414
+ value: msg.value,
415
+ };
416
+ }
417
+ }
418
+ else {
419
+ return {
420
+ typeUrl: msg.typeUrl,
421
+ value: msg.value,
422
+ };
423
+ }
424
+ }
425
+ else {
426
+ return msg;
427
+ }
428
+ });
277
429
  }
278
430
  /**
279
431
  * Creates a txRaw from an cosmos like transaction @see CosmosLikeTransaction
@@ -286,7 +438,7 @@ class CosmosUtils {
286
438
  throw new Error('publicKey is required to create a txRaw');
287
439
  }
288
440
  const encodedPublicKey = this.getEncodedPubkey(cosmosLikeTransaction.publicKey);
289
- const messages = cosmosLikeTransaction.sendMessages;
441
+ const messages = this.getSendMessagesForEncodingTx(cosmosLikeTransaction);
290
442
  let txBodyValue;
291
443
  if (cosmosLikeTransaction.memo) {
292
444
  txBodyValue = {
@@ -301,7 +453,7 @@ class CosmosUtils {
301
453
  }
302
454
  const txBodyBytes = this.registry.encodeTxBody(txBodyValue);
303
455
  const sequence = cosmosLikeTransaction.sequence;
304
- const authInfoBytes = proto_signing_1.makeAuthInfoBytes([{ pubkey: encodedPublicKey, sequence }], cosmosLikeTransaction.gasBudget.amount, cosmosLikeTransaction.gasBudget.gasLimit, undefined, undefined, undefined);
456
+ const authInfoBytes = (0, proto_signing_1.makeAuthInfoBytes)([{ pubkey: encodedPublicKey, sequence }], cosmosLikeTransaction.gasBudget.amount, cosmosLikeTransaction.gasBudget.gasLimit, cosmosLikeTransaction.gasBudget.feeGranter || undefined, undefined, undefined);
305
457
  return tx_1.TxRaw.fromPartial({
306
458
  bodyBytes: txBodyBytes,
307
459
  authInfoBytes: authInfoBytes,
@@ -315,11 +467,11 @@ class CosmosUtils {
315
467
  * @returns {TxRaw} Signed raw transaction
316
468
  */
317
469
  createSignedTxRaw(publicKeyHex, signatureHex, unsignedTx) {
318
- const stdSignature = amino_1.encodeSecp256k1Signature(encoding_1.fromHex(publicKeyHex), encoding_1.fromHex(signatureHex));
470
+ const stdSignature = (0, amino_1.encodeSecp256k1Signature)((0, encoding_1.fromHex)(publicKeyHex), (0, encoding_1.fromHex)(signatureHex));
319
471
  return tx_1.TxRaw.fromPartial({
320
472
  bodyBytes: unsignedTx.bodyBytes,
321
473
  authInfoBytes: unsignedTx.authInfoBytes,
322
- signatures: [encoding_1.fromBase64(stdSignature.signature)],
474
+ signatures: [(0, encoding_1.fromBase64)(stdSignature.signature)],
323
475
  });
324
476
  }
325
477
  /**
@@ -365,7 +517,7 @@ class CosmosUtils {
365
517
  throw new Error('cosmosLikeTransaction is required to create a sign doc');
366
518
  }
367
519
  const txRaw = this.createTxRawFromCosmosLikeTransaction(cosmosLikeTransaction);
368
- return proto_signing_1.makeSignDoc(txRaw.bodyBytes, txRaw.authInfoBytes, chainId, accountNumber);
520
+ return (0, proto_signing_1.makeSignDoc)(txRaw.bodyBytes, txRaw.authInfoBytes, chainId, accountNumber);
369
521
  }
370
522
  /**
371
523
  * Returns whether or not the string is a valid hex
@@ -417,6 +569,33 @@ class CosmosUtils {
417
569
  }
418
570
  this.validateAmount(delegateMessage.amount);
419
571
  }
572
+ /**
573
+ * Validates the RedelegateMessage
574
+ * @param {DelegateOrUndelegeteMessage} redelegateMessage - The RedelegateMessage to validate.
575
+ * @throws {InvalidTransactionError} Throws an error if the validatorSrcAddress, validatorDstAddress, delegatorAddress, or amount is invalid or missing.
576
+ */
577
+ validateRedelegateMessage(redelegateMessage) {
578
+ this.isObjPropertyNull(redelegateMessage, ['validatorSrcAddress', 'validatorDstAddress', 'delegatorAddress']);
579
+ if (!this.isValidValidatorAddress(redelegateMessage.validatorSrcAddress)) {
580
+ throw new sdk_core_1.InvalidTransactionError(`Invalid RedelegateMessage validatorSrcAddress: ` + redelegateMessage.validatorSrcAddress);
581
+ }
582
+ if (!this.isValidValidatorAddress(redelegateMessage.validatorDstAddress)) {
583
+ throw new sdk_core_1.InvalidTransactionError(`Invalid RedelegateMessage validatorDstAddress: ` + redelegateMessage.validatorDstAddress);
584
+ }
585
+ if (!this.isValidAddress(redelegateMessage.delegatorAddress)) {
586
+ throw new sdk_core_1.InvalidTransactionError(`Invalid DelegateOrUndelegeteMessage delegatorAddress: ` + redelegateMessage.delegatorAddress);
587
+ }
588
+ this.validateAmount(redelegateMessage.amount);
589
+ }
590
+ /**
591
+ * Validates the CustomMessage
592
+ * @param {CustomMessage} customMessage - The CustomMessage to validate.
593
+ * @throws {InvalidTransactionError} Throws an error if the custom message is invalid or missing required fields.
594
+ * @throws {NotSupported} Throws an error if the custom message data is not supported.
595
+ */
596
+ validateCustomMessage(customMessage) {
597
+ throw new sdk_core_1.NotSupported('Custom message data not supported');
598
+ }
420
599
  /**
421
600
  * Validates the MessageData
422
601
  * @param {MessageData} messageData - The MessageData to validate.
@@ -448,10 +627,24 @@ class CosmosUtils {
448
627
  break;
449
628
  }
450
629
  case sdk_core_1.TransactionType.ContractCall: {
630
+ if (messageData.value instanceof Uint8Array) {
631
+ //TODO: Add validation for pre-encoded contract call messages
632
+ break;
633
+ }
451
634
  const value = messageData.value;
452
635
  this.validateExecuteContractMessage(value, sdk_core_1.TransactionType.ContractCall);
453
636
  break;
454
637
  }
638
+ case sdk_core_1.TransactionType.StakingRedelegate: {
639
+ const value = messageData.value;
640
+ this.validateRedelegateMessage(value);
641
+ break;
642
+ }
643
+ case sdk_core_1.TransactionType.CustomTx: {
644
+ const value = messageData.value;
645
+ this.validateCustomMessage(value);
646
+ break;
647
+ }
455
648
  default:
456
649
  throw new sdk_core_1.InvalidTransactionError(`Invalid MessageData TypeUrl is not supported: ` + messageData.typeUrl);
457
650
  }
@@ -513,7 +706,7 @@ class CosmosUtils {
513
706
  authInfoBytes: unsignedTx.authInfoBytes,
514
707
  signatures: [signature],
515
708
  });
516
- hash = crypto_1.createHash('sha256')
709
+ hash = (0, crypto_1.createHash)('sha256')
517
710
  .update(tx_1.TxRaw.encode(signedTx).finish())
518
711
  .digest()
519
712
  .toString('hex')
@@ -528,7 +721,6 @@ class CosmosUtils {
528
721
  * @returns {CosmosLikeTransaction} Deserialized cosmosLikeTransaction
529
722
  */
530
723
  deserializeTransaction(rawTx) {
531
- var _a, _b;
532
724
  const decodedTx = this.getDecodedTxFromRawBase64(rawTx);
533
725
  const typeUrl = this.getTypeUrlFromDecodedTx(decodedTx);
534
726
  const type = this.getTransactionTypeFromTypeUrl(typeUrl);
@@ -545,14 +737,20 @@ class CosmosUtils {
545
737
  else if (type === sdk_core_1.TransactionType.ContractCall) {
546
738
  sendMessageData = this.getExecuteContractMessageDataFromDecodedTx(decodedTx);
547
739
  }
740
+ else if (type === sdk_core_1.TransactionType.StakingRedelegate) {
741
+ sendMessageData = this.getRedelegateMessageDataFromDecodedTx(decodedTx);
742
+ }
743
+ else if (type === sdk_core_1.TransactionType.CustomTx) {
744
+ sendMessageData = this.getCustomMessageDataFromDecodedTx(decodedTx);
745
+ }
548
746
  else {
549
747
  throw new Error('Transaction type not supported: ' + typeUrl);
550
748
  }
551
749
  const sequence = this.getSequenceFromDecodedTx(decodedTx);
552
750
  const gasBudget = this.getGasBudgetFromDecodedTx(decodedTx);
553
751
  const publicKey = this.getPublicKeyFromDecodedTx(decodedTx);
554
- const signature = ((_a = decodedTx.signatures) === null || _a === void 0 ? void 0 : _a[0]) !== undefined ? Buffer.from(decodedTx.signatures[0]) : undefined;
555
- return this.createTransactionWithHash(sequence, sendMessageData, gasBudget, publicKey, signature, (_b = decodedTx.body) === null || _b === void 0 ? void 0 : _b.memo);
752
+ const signature = decodedTx.signatures?.[0] !== undefined ? Buffer.from(decodedTx.signatures[0]) : undefined;
753
+ return this.createTransactionWithHash(sequence, sendMessageData, gasBudget, publicKey, signature, decodedTx.body?.memo);
556
754
  }
557
755
  /**
558
756
  * Validates an array of coin amounts.
@@ -624,7 +822,7 @@ class CosmosUtils {
624
822
  */
625
823
  isValidBech32AddressMatchingRegex(address, regExp) {
626
824
  try {
627
- encoding_1.fromBech32(address);
825
+ (0, encoding_1.fromBech32)(address);
628
826
  }
629
827
  catch (e) {
630
828
  return false;
@@ -638,14 +836,18 @@ class CosmosUtils {
638
836
  * @returns true if memo id is valid
639
837
  */
640
838
  isValidMemoId(memoId) {
641
- let memoIdNumber;
642
- try {
643
- memoIdNumber = new bignumber_js_1.default(memoId);
644
- }
645
- catch (e) {
839
+ // Allow alphanumeric memo IDs (including uppercase and lowercase letters)
840
+ const alphanumericRegex = /^[0-9a-zA-Z]+$/;
841
+ // Check if the memoId is alphanumeric
842
+ if (!alphanumericRegex.test(memoId)) {
646
843
  return false;
647
844
  }
648
- return memoIdNumber.gte(0) && memoIdNumber.isInteger();
845
+ // If the memoId is purely numeric, ensure it is a positive integer
846
+ if (/^\d+$/.test(memoId)) {
847
+ const memoIdNumber = new bignumber_js_1.default(memoId);
848
+ return memoIdNumber.gte(0) && memoIdNumber.isInteger();
849
+ }
850
+ return true;
649
851
  }
650
852
  /**
651
853
  * Validates if the address matches with regex @see accountAddressRegex
@@ -696,10 +898,105 @@ class CosmosUtils {
696
898
  * @returns {Hash} The hash function
697
899
  */
698
900
  getHashFunction() {
699
- return crypto_1.createHash('sha256');
901
+ return (0, crypto_1.createHash)('sha256');
902
+ }
903
+ getTokenDenomsUsingCoinFamily(coinFamily) {
904
+ // using set to remove duplicates as denom can be same on testnet and mainnet for a few tokens
905
+ return [
906
+ ...new Set(statics_1.coins
907
+ .filter((coin) => coin.family.toLowerCase() === coinFamily.toLowerCase() && coin.isToken && coin.denom !== undefined)
908
+ .map((coin) => coin.denom)),
909
+ ];
910
+ }
911
+ /**
912
+ * Checks if an ExecuteContractMessage's msg field contains a group proposal.
913
+ * @param {ExecuteContractMessage} message - The execute contract message to check
914
+ * @returns {boolean} true if the msg decodes to a group proposal
915
+ */
916
+ isGroupProposal(message) {
917
+ if (!message.msg || message.msg.length === 0) {
918
+ return false;
919
+ }
920
+ const result = this.decodeMsg(message.msg);
921
+ return result.typeUrl === constants.groupProposalMsgTypeUrl;
922
+ }
923
+ /**
924
+ * Checks if an ExecuteContractMessage's msg field contains a group vote.
925
+ * @param {ExecuteContractMessage} message - The execute contract message to check
926
+ * @returns {boolean} true if the msg decodes to a group vote
927
+ */
928
+ isGroupVote(message) {
929
+ if (!message.msg || message.msg.length === 0) {
930
+ return false;
931
+ }
932
+ const result = this.decodeMsg(message.msg);
933
+ return result.typeUrl === constants.groupVoteMsgTypeUrl;
934
+ }
935
+ /**
936
+ * Decodes a protobuf message and determines its type.
937
+ *
938
+ * @param data - Message data as base64 string or Uint8Array
939
+ * @returns Decoded message result with typeUrl if successfully identified
940
+ */
941
+ decodeMsg(data) {
942
+ try {
943
+ const messageBytes = typeof data === 'string' ? Buffer.from(data, 'base64') : data;
944
+ try {
945
+ const proposal = MsgSubmitProposal.decode(messageBytes);
946
+ if (proposal.groupPolicyAddress &&
947
+ typeof proposal.groupPolicyAddress === 'string' &&
948
+ (this.isValidAddress(proposal.groupPolicyAddress) ||
949
+ this.isValidContractAddress(proposal.groupPolicyAddress) ||
950
+ this.isValidValidatorAddress(proposal.groupPolicyAddress)) &&
951
+ proposal.groupPolicyAddress.length > 0 &&
952
+ Array.isArray(proposal.proposers) &&
953
+ proposal.proposers.length > 0) {
954
+ return { typeUrl: constants.groupProposalMsgTypeUrl };
955
+ }
956
+ }
957
+ catch {
958
+ // Not a group proposal
959
+ }
960
+ try {
961
+ const vote = MsgVote.decode(messageBytes);
962
+ if (vote.voter &&
963
+ typeof vote.voter === 'string' &&
964
+ this.isValidAddress(vote.voter) &&
965
+ vote.voter.length > 0 &&
966
+ vote.proposalId !== undefined &&
967
+ vote.proposalId !== null) {
968
+ return { typeUrl: constants.groupVoteMsgTypeUrl };
969
+ }
970
+ }
971
+ catch {
972
+ // Not a group vote
973
+ }
974
+ try {
975
+ const executeMsg = tx_2.MsgExecuteContract.decode(messageBytes);
976
+ if (executeMsg.sender &&
977
+ typeof executeMsg.sender === 'string' &&
978
+ executeMsg.sender.length > 0 &&
979
+ executeMsg.contract &&
980
+ typeof executeMsg.contract === 'string' &&
981
+ executeMsg.contract.length > 0 &&
982
+ executeMsg.msg instanceof Uint8Array &&
983
+ executeMsg.msg.length > 0) {
984
+ return { typeUrl: constants.executeContractMsgTypeUrl };
985
+ }
986
+ }
987
+ catch {
988
+ // Not an execute contract message
989
+ }
990
+ return { error: 'Unable to decode message as any known type' };
991
+ }
992
+ catch (error) {
993
+ return {
994
+ error: error instanceof Error ? error.message : 'Failed to decode message',
995
+ };
996
+ }
700
997
  }
701
998
  }
702
999
  exports.CosmosUtils = CosmosUtils;
703
1000
  const utils = new CosmosUtils();
704
1001
  exports.default = utils;
705
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQU04QjtBQUM5Qix5Q0FBZ0Y7QUFDaEYsK0NBQTBFO0FBQzFFLHlEQVMrQjtBQUMvQiwrQ0FBOEQ7QUFDOUQsK0NBQXFDO0FBQ3JDLDBEQUFtRTtBQUVuRSx5REFBc0U7QUFFdEUsbUNBQTBDO0FBQzFDLHlDQUF5QztBQVV6Qyx1Q0FBcUQ7QUFFckQsTUFBYSxXQUFXO0lBR3RCO1FBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHdCQUFRLENBQUMsQ0FBQyxHQUFHLCtCQUFvQixDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMseUJBQXlCLEVBQUUsdUJBQWtCLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsSUFBSTtZQUNGLElBQUksdUJBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFBQyxNQUFNO1lBQ04sT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsZ0JBQWdCLENBQUMsR0FBVztRQUMxQixJQUFJO1lBQ0YsSUFBSSx1QkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUFDLE1BQU07WUFDTixPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixnQkFBZ0IsQ0FB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QUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDdkUsTUFBTSxJQUFJLGtDQUF1QixDQUFDLG1EQUFtRCxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzRztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDM0QsTUFBTSxJQUFJLGtDQUF1QixDQUFDLGlEQUFpRCxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2RztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxzQ0FBc0MsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekY7UUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sbUJBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFsd0JELGtDQWt3QkM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRWhDLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VVdGlscyxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBlbmNvZGVTZWNwMjU2azFQdWJrZXksIGVuY29kZVNlY3AyNTZrMVNpZ25hdHVyZSB9IGZyb20gJ0Bjb3NtanMvYW1pbm8nO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCwgZnJvbUJlY2gzMiwgZnJvbUhleCwgdG9IZXggfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCB7XG4gIERlY29kZWRUeFJhdyxcbiAgRW5jb2RlT2JqZWN0LFxuICBSZWdpc3RyeSxcbiAgZGVjb2RlUHVia2V5LFxuICBkZWNvZGVUeFJhdyxcbiAgZW5jb2RlUHVia2V5LFxuICBtYWtlQXV0aEluZm9CeXRlcyxcbiAgbWFrZVNpZ25Eb2MsXG59IGZyb20gJ0Bjb3NtanMvcHJvdG8tc2lnbmluZyc7XG5pbXBvcnQgeyBDb2luLCBkZWZhdWx0UmVnaXN0cnlUeXBlcyB9IGZyb20gJ0Bjb3NtanMvc3RhcmdhdGUnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgU2lnbkRvYywgVHhSYXcgfSBmcm9tICdjb3NtanMtdHlwZXMvY29zbW9zL3R4L3YxYmV0YTEvdHgnO1xuaW1wb3J0IHsgQW55IH0gZnJvbSAnY29zbWpzLXR5cGVzL2dvb2dsZS9wcm90b2J1Zi9hbnknO1xuaW1wb3J0IHsgTXNnRXhlY3V0ZUNvbnRyYWN0IH0gZnJvbSAnY29zbWpzLXR5cGVzL2Nvc213YXNtL3dhc20vdjEvdHgnO1xuXG5pbXBvcnQgeyBIYXNoLCBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24sXG4gIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSxcbiAgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSxcbiAgRmVlRGF0YSxcbiAgTWVzc2FnZURhdGEsXG4gIFNlbmRNZXNzYWdlLFxuICBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IENvc21vc0tleVBhaXIgYXMgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5cbmV4cG9ydCBjbGFzcyBDb3Ntb3NVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIHByaXZhdGUgcmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeShbLi4uZGVmYXVsdFJlZ2lzdHJ5VHlwZXNdKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy5leGVjdXRlQ29udHJhY3RNc2dUeXBlVXJsLCBNc2dFeGVjdXRlQ29udHJhY3QpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQmxha2UyYihoYXNoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBuZXcgS2V5UGFpcih7IHBydjoga2V5IH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRQdWJsaWNLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IGtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRTaWduYXR1cmUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVCbGFrZTJiKHR4SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0cmFuc2FjdGlvbiBoYXNoIGlzIGluIHZhbGlkIGJsYWNrMmIgZm9ybWF0XG4gICAqL1xuICB2YWxpZGF0ZUJsYWtlMmIoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGhhc2g/Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2gubWF0Y2goL15bYS16QS1aMC05XSskLykgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW1vdW50cyBhcmUgaW4gcmFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYW1vdW50cyAtIHRoZSBhbW91bnRzIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFtb3VudHMoYW1vdW50czogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGFtb3VudCBvZiBhbW91bnRzKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZEFtb3VudChhbW91bnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW1vdW50IGlzIGluIHJhbmdlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFtb3VudChhbW91bnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgICBpZiAoIWJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSB8fCBiaWdOdW1iZXJBbW91bnQuaXNMZXNzVGhhbk9yRXF1YWxUbygwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHJhdyB0eCBkYXRhIGludG8gbWVzc2FnZXMsIHNpZ25pbmcgaW5mbywgYW5kIGZlZSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eEhleCAtIHJhdyBiYXNlNjQgdHhcbiAgICogQHJldHVybnMge0RlY29kZWRUeFJhd30gRGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgZ2V0RGVjb2RlZFR4RnJvbVJhd0Jhc2U2NCh0eFJhdzogc3RyaW5nKTogRGVjb2RlZFR4UmF3IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGRlY29kZVR4UmF3KGZyb21CYXNlNjQodHhSYXcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFcnJvciBkZWNvZGluZyBUeFJhdyBiYXNlNjQgZW5jb2RlZCBzdHJpbmc6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBtZXNzYWdlcyBpbiB0aGUgYm9keSBvZiB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtFbmNvZGVPYmplY3RbXX0gbWVzc2FnZXMgYWxvbmcgd2l0aCB0eXBlIHVybFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbmNvZGVkTWVzc2FnZXNGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogRW5jb2RlT2JqZWN0W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIHR4biBzZXF1ZW5jZSBpcyB2YWxpZCBvciBub3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlXG4gICAqL1xuICB2YWxpZGF0ZVNlcXVlbmNlKHNlcXVlbmNlOiBudW1iZXIpIHtcbiAgICBpZiAoc2VxdWVuY2UgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgc2VxdWVuY2U6IGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSBhIERlY29kZWRUeFJhdyBBdXRoSW5mbyBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHNlcXVlbmNlXG4gICAqL1xuICBnZXRTZXF1ZW5jZUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBudW1iZXIge1xuICAgIHJldHVybiBOdW1iZXIoZGVjb2RlZFR4LmF1dGhJbmZvLnNpZ25lckluZm9zWzBdLnNlcXVlbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxscyB0aGUgdHlwZVVybCBmcm9tIHRoZSBlbmNvZGVkIG1lc3NhZ2Ugb2YgYSBEZWNvZGVkVHhSYXdcbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBjb3Ntb3MgcHJvdG8gdHlwZSB1cmxcbiAgICovXG4gIGdldFR5cGVVcmxGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogc3RyaW5nIHtcbiAgICBjb25zdCBlbmNvZGVkTWVzc2FnZSA9IHRoaXMuZ2V0RW5jb2RlZE1lc3NhZ2VzRnJvbURlY29kZWRUeChkZWNvZGVkVHgpWzBdO1xuICAgIHJldHVybiBlbmNvZGVkTWVzc2FnZS50eXBlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZlZSBkYXRhIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7RmVlRGF0YX0gZmVlIGRhdGFcbiAgICovXG4gIGdldEdhc0J1ZGdldEZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBGZWVEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW1vdW50OiBkZWNvZGVkVHguYXV0aEluZm8uZmVlPy5hbW91bnQgYXMgQ29pbltdLFxuICAgICAgZ2FzTGltaXQ6IE51bWJlcihkZWNvZGVkVHguYXV0aEluZm8uZmVlPy5nYXNMaW1pdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNLZXkgZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IHB1YmxpY0tleSBpbiBoZXggZm9ybWF0IGlmIGl0IGV4aXN0cywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgZ2V0UHVibGljS2V5RnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcHVibGljS2V5VUludDhBcnJheSA9IGRlY29kZWRUeC5hdXRoSW5mby5zaWduZXJJbmZvcz8uWzBdLnB1YmxpY0tleT8udmFsdWU7XG4gICAgaWYgKHB1YmxpY0tleVVJbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiB0b0hleChmcm9tQmFzZTY0KGRlY29kZVB1YmtleShkZWNvZGVkVHguYXV0aEluZm8uc2lnbmVySW5mb3M/LlswXS5wdWJsaWNLZXkpPy52YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBTZW5kIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFNlbmRNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBNZXNzYWdlRGF0YVtdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBmcm9tQWRkcmVzczogdmFsdWUuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgdG9BZGRyZXNzOiB2YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB2YWx1ZS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgTWVzc2FnZURhdGFbXSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge01lc3NhZ2VEYXRhW119IERlbGVnYXRlIG9mIHVuZGVsZWdhdGUgdHJhbnNhY3Rpb24gbWVzc2FnZSBkYXRhXG4gICAqL1xuICBnZXREZWxlZ2F0ZU9yVW5kZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhW10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGRlbGVnYXRvckFkZHJlc3M6IHZhbHVlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogdmFsdWUudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0V2l0aGRyYXdSZXdhcmRzTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGFbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZGVsZWdhdG9yQWRkcmVzczogdmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBEZWxlZ2F0ZSBvZiB1bmRlbGVnYXRlIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0V2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGFbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZGVsZWdhdG9yQWRkcmVzczogdmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBFeGVjdXRlIGNvbnRyYWN0IHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0RXhlY3V0ZUNvbnRyYWN0TWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGFbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgc2VuZGVyOiB2YWx1ZS5zZW5kZXIsXG4gICAgICAgICAgY29udHJhY3Q6IHZhbHVlLmNvbnRyYWN0LFxuICAgICAgICAgIG1zZzogdmFsdWUubXNnLFxuICAgICAgICAgIGZ1bmRzOiB2YWx1ZS5mdW5kcyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGJpdGdvIHRyYW5zYWN0aW9uIHR5cGUgYmFzZWQgb24gY29zbW9zIHByb3RvIHR5cGUgdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlVXJsXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvblR5cGUgfCB1bmRlZmluZWR9IFRyYW5zYWN0aW9uVHlwZSBpZiB1cmwgaXMgc3VwcG9ydGVkIGVsc2UgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRUcmFuc2FjdGlvblR5cGVGcm9tVHlwZVVybCh0eXBlVXJsOiBzdHJpbmcpOiBUcmFuc2FjdGlvblR5cGUgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAodHlwZVVybCkge1xuICAgICAgY2FzZSBjb25zdGFudHMuc2VuZE1zZ1R5cGVVcmw6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgIGNhc2UgY29uc3RhbnRzLmRlbGVnYXRlTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU7XG4gICAgICBjYXNlIGNvbnN0YW50cy51bmRlbGVnYXRlTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLndpdGhkcmF3RGVsZWdhdG9yUmV3YXJkTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gICAgICBjYXNlIGNvbnN0YW50cy5leGVjdXRlQ29udHJhY3RNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgaGV4IGVuY29kZWQgcHVia2V5LCBjb252ZXJ0cyBpdCB0byB0aGUgQW1pbm8gSlNPTiByZXByZXNlbnRhdGlvbiAodHlwZS92YWx1ZSB3cmFwcGVyKVxuICAgKiBhbmQgcmV0dXJucyBpdCBhcyBwcm90b2J1ZiBgQW55YFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHVia2V5IGhleCBlbmNvZGVkIGNvbXByZXNzZWQgc2VjcDI1NmsxIHB1YmxpYyBrZXlcbiAgICogQHJldHVybnMge0FueX0gcHVia2V5IGVuY29kZWQgYXMgcHJvdG9idWYgYEFueWBcbiAgICovXG4gIGdldEVuY29kZWRQdWJrZXkocHVia2V5OiBzdHJpbmcpOiBBbnkge1xuICAgIHJldHVybiBlbmNvZGVQdWJrZXkoZW5jb2RlU2VjcDI1NmsxUHVia2V5KGZyb21IZXgocHVia2V5KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0eFJhdyBmcm9tIGFuIGNvc21vcyBsaWtlIHRyYW5zYWN0aW9uIEBzZWUgQ29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEBQcmVjb25kaXRpb24gY29zbW9zTGlrZVRyYW5zYWN0aW9uLnB1YmxpY0tleSBtdXN0IGJlIGRlZmluZWRcbiAgICogQHBhcmFtIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IGNvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7VHhSYXd9IFVuc2lnbmVkIHJhdyB0cmFuc2FjdGlvblxuICAgKi9cbiAgY3JlYXRlVHhSYXdGcm9tQ29zbW9zTGlrZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUcmFuc2FjdGlvbjogQ29zbW9zTGlrZVRyYW5zYWN0aW9uKTogVHhSYXcge1xuICAgIGlmICghY29zbW9zTGlrZVRyYW5zYWN0aW9uLnB1YmxpY0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJsaWNLZXkgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgdHhSYXcnKTtcbiAgICB9XG4gICAgY29uc3QgZW5jb2RlZFB1YmxpY0tleTogQW55ID0gdGhpcy5nZXRFbmNvZGVkUHVia2V5KGNvc21vc0xpa2VUcmFuc2FjdGlvbi5wdWJsaWNLZXkpO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gY29zbW9zTGlrZVRyYW5zYWN0aW9uLnNlbmRNZXNzYWdlcyBhcyB1bmtub3duIGFzIEFueVtdO1xuICAgIGxldCB0eEJvZHlWYWx1ZTtcbiAgICBpZiAoY29zbW9zTGlrZVRyYW5zYWN0aW9uLm1lbW8pIHtcbiAgICAgIHR4Qm9keVZhbHVlID0ge1xuICAgICAgICBtZW1vOiBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24ubWVtbyxcbiAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhCb2R5VmFsdWUgPSB7XG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHhCb2R5Qnl0ZXMgPSB0aGlzLnJlZ2lzdHJ5LmVuY29kZVR4Qm9keSh0eEJvZHlWYWx1ZSk7XG4gICAgY29uc3Qgc2VxdWVuY2UgPSBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uc2VxdWVuY2U7XG4gICAgY29uc3QgYXV0aEluZm9CeXRlcyA9IG1ha2VBdXRoSW5mb0J5dGVzKFxuICAgICAgW3sgcHVia2V5OiBlbmNvZGVkUHVibGljS2V5LCBzZXF1ZW5jZSB9XSxcbiAgICAgIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5nYXNCdWRnZXQuYW1vdW50LFxuICAgICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uLmdhc0J1ZGdldC5nYXNMaW1pdCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgcmV0dXJuIFR4UmF3LmZyb21QYXJ0aWFsKHtcbiAgICAgIGJvZHlCeXRlczogdHhCb2R5Qnl0ZXMsXG4gICAgICBhdXRoSW5mb0J5dGVzOiBhdXRoSW5mb0J5dGVzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgYSBzaWduYXR1cmUgaW50byBhIHR4UmF3XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNLZXlIZXggcHVibGljS2V5IGluIGhleCBlbmNvZGVkIHN0cmluZyBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZUhleCBzaWduYXR1cmUgaW4gaGV4IGVuY29kZWQgc3RyaW5nIGZvcm1hdFxuICAgKiBAcGFyYW0ge1R4UmF3fSB1bnNpZ25lZFR4IHJhdyB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7VHhSYXd9IFNpZ25lZCByYXcgdHJhbnNhY3Rpb25cbiAgICovXG4gIGNyZWF0ZVNpZ25lZFR4UmF3KFxuICAgIHB1YmxpY0tleUhleDogc3RyaW5nLFxuICAgIHNpZ25hdHVyZUhleDogc3RyaW5nLFxuICAgIHVuc2lnbmVkVHg6IHsgYm9keUJ5dGVzOiBVaW50OEFycmF5OyBhdXRoSW5mb0J5dGVzOiBVaW50OEFycmF5IH1cbiAgKTogVHhSYXcge1xuICAgIGNvbnN0IHN0ZFNpZ25hdHVyZSA9IGVuY29kZVNlY3AyNTZrMVNpZ25hdHVyZShmcm9tSGV4KHB1YmxpY0tleUhleCksIGZyb21IZXgoc2lnbmF0dXJlSGV4KSk7XG4gICAgcmV0dXJuIFR4UmF3LmZyb21QYXJ0aWFsKHtcbiAgICAgIGJvZHlCeXRlczogdW5zaWduZWRUeC5ib2R5Qnl0ZXMsXG4gICAgICBhdXRoSW5mb0J5dGVzOiB1bnNpZ25lZFR4LmF1dGhJbmZvQnl0ZXMsXG4gICAgICBzaWduYXR1cmVzOiBbZnJvbUJhc2U2NChzdGRTaWduYXR1cmUuc2lnbmF0dXJlKV0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBhIHJhdyB0cmFuc2FjdGlvbiBpbnRvIGEgRGVjb2RlZFR4UmF3IGFuZCBjaGVja3MgaWYgaXQgaGFzIG5vbiBlbXB0eSBzaWduYXR1cmVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0cmFuc2FjdGlvbiBpcyBzaWduZWQgZWxzZSBmYWxzZVxuICAgKi9cbiAgaXNTaWduZWRSYXdUeChyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVjb2RlZFR4ID0gdGhpcy5nZXREZWNvZGVkVHhGcm9tUmF3QmFzZTY0KHJhd1RyYW5zYWN0aW9uKTtcbiAgICBpZiAoZGVjb2RlZFR4LnNpZ25hdHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBwcm90b2NvbCBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBwdWJsaWNLZXkgLSB0aGUgIHB1YmxpYyBrZXkgdG8gYmUgdmFsaWRhdGVkXG4gICAqL1xuICB2YWxpZGF0ZVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChwdWJsaWNLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YmxpY0tleSB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgUHVibGljIEtleWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2lnbiBkb2MgZnJvbSBhbiBjb3Ntb3MgbGlrZSB0cmFuc2FjdGlvbiBAc2VlIENvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAUHJlY29uZGl0aW9uIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5hY2NvdW50TnVtYmVyIGFuZCBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uY2hhaW5JZCBtdXN0IGJlIGRlZmluZWRcbiAgICogQHBhcmFtIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IGNvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7U2lnbkRvY30gc2lnbiBkb2NcbiAgICovXG4gIGNyZWF0ZVNpZ25Eb2MoXG4gICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24sXG4gICAgYWNjb3VudE51bWJlcjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNoYWluSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBTaWduRG9jIHtcbiAgICBpZiAoIWFjY291bnROdW1iZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWNjb3VudE51bWJlciBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSBzaWduIGRvYycpO1xuICAgIH1cbiAgICBpZiAoIWNoYWluSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2hhaW5JZCBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSBzaWduIGRvYycpO1xuICAgIH1cbiAgICBpZiAoIWNvc21vc0xpa2VUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3Ntb3NMaWtlVHJhbnNhY3Rpb24gaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgc2lnbiBkb2MnKTtcbiAgICB9XG4gICAgY29uc3QgdHhSYXcgPSB0aGlzLmNyZWF0ZVR4UmF3RnJvbUNvc21vc0xpa2VUcmFuc2FjdGlvbihjb3Ntb3NMaWtlVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBtYWtlU2lnbkRvYyh0eFJhdy5ib2R5Qnl0ZXMsIHR4UmF3LmF1dGhJbmZvQnl0ZXMsIGNoYWluSWQsIGFjY291bnROdW1iZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGhleFxuICAgKiBAcGFyYW0gaGV4U3RyaW5nIC0gaGV4IHN0cmluZyBmb3JtYXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgc3RyaW5nIGlzIGhleCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc1ZhbGlkSGV4U3RyaW5nKGhleFN0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eWzAtOUEtRmEtZl0qJC8udGVzdChoZXhTdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZVxuICAgKiBAcGFyYW0ge1dpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2V9IHdpdGhkcmF3UmV3YXJkc01lc3NhZ2UgLSBUaGUgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgdmFsaWRhdG9yQWRkcmVzcyBvciBkZWxlZ2F0b3JBZGRyZXNzIGlzIGludmFsaWQgb3IgbWlzc2luZy5cbiAgICovXG4gIHZhbGlkYXRlV2l0aGRyYXdSZXdhcmRzTWVzc2FnZSh3aXRoZHJhd1Jld2FyZHNNZXNzYWdlOiBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlKSB7XG4gICAgaWYgKFxuICAgICAgIXdpdGhkcmF3UmV3YXJkc01lc3NhZ2UudmFsaWRhdG9yQWRkcmVzcyB8fFxuICAgICAgIXRoaXMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3Mod2l0aGRyYXdSZXdhcmRzTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlIHZhbGlkYXRvckFkZHJlc3M6IGAgKyB3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghd2l0aGRyYXdSZXdhcmRzTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHdpdGhkcmF3UmV3YXJkc01lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSBkZWxlZ2F0b3JBZGRyZXNzOiBgICsgd2l0aGRyYXdSZXdhcmRzTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyBpbiBhbiBvYmplY3QgYXJlIG1pc3Npbmcgb3IgbnVsbC5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGtleXMgLSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBrZXlzIHRvIGNoZWNrLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgYXJlIG1pc3Npbmcgb3IgbnVsbC5cbiAgICovXG4gIGlzT2JqUHJvcGVydHlOdWxsKG9iajogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwga2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChvYmpba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBudWxsIHZhbHVlIGZvciBwcm9wZXJ0eSAke2tleX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2VcbiAgICogQHBhcmFtIHtEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2V9IGRlbGVnYXRlTWVzc2FnZSAtIFRoZSBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHZhbGlkYXRvckFkZHJlc3MsIGRlbGVnYXRvckFkZHJlc3MsIG9yIGFtb3VudCBpcyBpbnZhbGlkIG9yIG1pc3NpbmcuXG4gICAqL1xuICB2YWxpZGF0ZURlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZShkZWxlZ2F0ZU1lc3NhZ2U6IERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSkge1xuICAgIHRoaXMuaXNPYmpQcm9wZXJ0eU51bGwoZGVsZWdhdGVNZXNzYWdlLCBbJ3ZhbGlkYXRvckFkZHJlc3MnLCAnZGVsZWdhdG9yQWRkcmVzcyddKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlIHZhbGlkYXRvckFkZHJlc3M6IGAgKyBkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKGRlbGVnYXRlTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UgZGVsZWdhdG9yQWRkcmVzczogYCArIGRlbGVnYXRlTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlQW1vdW50KGRlbGVnYXRlTWVzc2FnZS5hbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgTWVzc2FnZURhdGFcbiAgICogQHBhcmFtIHtNZXNzYWdlRGF0YX0gbWVzc2FnZURhdGEgLSBUaGUgTWVzc2FnZURhdGEgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIG1lc3NhZ2VEYXRhIGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuXG4gICAqL1xuICB2YWxpZGF0ZU1lc3NhZ2VEYXRhKG1lc3NhZ2VEYXRhOiBNZXNzYWdlRGF0YSk6IHZvaWQge1xuICAgIGlmIChtZXNzYWdlRGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgTWVzc2FnZURhdGE6IHVuZGVmaW5lZGApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZURhdGEudHlwZVVybCA9PSBudWxsIHx8IHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwobWVzc2FnZURhdGEudHlwZVVybCkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIE1lc3NhZ2VEYXRhIHR5cGV1cmw6IGAgKyBtZXNzYWdlRGF0YS50eXBlVXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tVHlwZVVybChtZXNzYWdlRGF0YS50eXBlVXJsKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXNzYWdlRGF0YS52YWx1ZSBhcyBTZW5kTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVNlbmRNZXNzYWdlKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZToge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZURlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZURhdGEudmFsdWUgYXMgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVdpdGhkcmF3UmV3YXJkc01lc3NhZ2UodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbDoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2U7XG4gICAgICAgIHRoaXMudmFsaWRhdGVFeGVjdXRlQ29udHJhY3RNZXNzYWdlKHZhbHVlLCBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgTWVzc2FnZURhdGEgVHlwZVVybCBpcyBub3Qgc3VwcG9ydGVkOiBgICsgbWVzc2FnZURhdGEudHlwZVVybCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgQ29zbW9zLWxpa2UgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7Q29zbW9zTGlrZVRyYW5zYWN0aW9ufSB0eCAtIFRoZSB0cmFuc2FjdGlvbiB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgaW52YWxpZCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy5cbiAgICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHg6IENvc21vc0xpa2VUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVTZXF1ZW5jZSh0eC5zZXF1ZW5jZSk7XG4gICAgdGhpcy52YWxpZGF0ZUdhc0J1ZGdldCh0eC5nYXNCdWRnZXQpO1xuICAgIHRoaXMudmFsaWRhdGVQdWJsaWNLZXkodHgucHVibGljS2V5KTtcbiAgICBpZiAodHguc2VuZE1lc3NhZ2VzID09PSB1bmRlZmluZWQgfHwgdHguc2VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtZXNzYWdlcyBpcyByZXF1aXJlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eC5zZW5kTWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSkgPT4gdGhpcy52YWxpZGF0ZU1lc3NhZ2VEYXRhKG1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENvc21vcy1saWtlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2VxdWVuY2UgLSBUaGUgc2VuZGVyIGFkZHJlc3Mgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7TWVzc2FnZURhdGFbXX0gbWVzc2FnZXMgLSBUaGUgYXJyYXkgb2YgbWVzc2FnZSBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7RmVlRGF0YX0gZ2FzQnVkZ2V0IC0gVGhlIGZlZSBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcHVibGljS2V5XSAtIFRoZSBwdWJsaWMga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VuZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lbW9dIC0gVGhlIG1lbW8gZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gUmV0dXJucyB0aGUgY3JlYXRlZCBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbi5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgY3JlYXRlZCB0cmFuc2FjdGlvbiBpcyBpbnZhbGlkLlxuICAgKi9cbiAgY3JlYXRlVHJhbnNhY3Rpb24oXG4gICAgc2VxdWVuY2U6IG51bWJlcixcbiAgICBtZXNzYWdlczogTWVzc2FnZURhdGFbXSxcbiAgICBnYXNCdWRnZXQ6IEZlZURhdGEsXG4gICAgcHVibGljS2V5Pzogc3RyaW5nLFxuICAgIG1lbW8/OiBzdHJpbmdcbiAgKTogQ29zbW9zTGlrZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBjb3Ntb3NMaWtlVHhuID0ge1xuICAgICAgc2VxdWVuY2U6IHNlcXVlbmNlLFxuICAgICAgc2VuZE1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICAgIGdhc0J1ZGdldDogZ2FzQnVkZ2V0LFxuICAgICAgcHVibGljS2V5OiBwdWJsaWNLZXksXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH07XG4gICAgdGhpcy52YWxpZGF0ZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUeG4pO1xuICAgIHJldHVybiBjb3Ntb3NMaWtlVHhuO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbiB3aXRoIGEgaGFzaC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlIC0gVGhlIHNlbmRlciBhZGRyZXNzIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge01lc3NhZ2VEYXRhW119IG1lc3NhZ2VzIC0gVGhlIGFycmF5IG9mIG1lc3NhZ2UgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0ZlZURhdGF9IGdhc0J1ZGdldCAtIFRoZSBmZWUgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3B1YmxpY0tleV0gLSBUaGUgcHVibGljIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW3NpZ25hdHVyZV0gLSBUaGUgc2lnbmF0dXJlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVtb10gLSBUaGUgbWVtbyBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7Q29zbW9zTGlrZVRyYW5zYWN0aW9ufSBSZXR1cm5zIHRoZSBjcmVhdGVkIENvc21vcy1saWtlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGhhc2ggYW5kIHNpZ25hdHVyZSBpZiBwcm92aWRlZC5cbiAgICovXG4gIGNyZWF0ZVRyYW5zYWN0aW9uV2l0aEhhc2goXG4gICAgc2VxdWVuY2U6IG51bWJlcixcbiAgICBtZXNzYWdlczogTWVzc2FnZURhdGFbXSxcbiAgICBnYXNCdWRnZXQ6IEZlZURhdGEsXG4gICAgcHVibGljS2V5Pzogc3RyaW5nLFxuICAgIHNpZ25hdHVyZT86IEJ1ZmZlcixcbiAgICBtZW1vPzogc3RyaW5nXG4gICk6IENvc21vc0xpa2VUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgY29zbW9zTGlrZVR4biA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24oc2VxdWVuY2UsIG1lc3NhZ2VzLCBnYXNCdWRnZXQsIHB1YmxpY0tleSwgbWVtbyk7XG4gICAgbGV0IGhhc2ggPSBjb25zdGFudHMuVU5BVkFJTEFCTEVfVEVYVDtcbiAgICBpZiAoc2lnbmF0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSB0aGlzLmNyZWF0ZVR4UmF3RnJvbUNvc21vc0xpa2VUcmFuc2FjdGlvbihjb3Ntb3NMaWtlVHhuKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gVHhSYXcuZnJvbVBhcnRpYWwoe1xuICAgICAgICBib2R5Qnl0ZXM6IHVuc2lnbmVkVHguYm9keUJ5dGVzLFxuICAgICAgICBhdXRoSW5mb0J5dGVzOiB1bnNpZ25lZFR4LmF1dGhJbmZvQnl0ZXMsXG4gICAgICAgIHNpZ25hdHVyZXM6IFtzaWduYXR1cmVdLFxuICAgICAgfSk7XG4gICAgICBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgICAgLnVwZGF0ZShUeFJhdy5lbmNvZGUoc2lnbmVkVHgpLmZpbmlzaCgpKVxuICAgICAgICAuZGlnZXN0KClcbiAgICAgICAgLnRvU3RyaW5nKCdoZXgnKVxuICAgICAgICAudG9Mb2NhbGVVcHBlckNhc2UoJ2VuLVVTJyk7XG4gICAgICByZXR1cm4geyAuLi5jb3Ntb3NMaWtlVHhuLCBoYXNoOiBoYXNoLCBzaWduYXR1cmU6IHNpZ25hdHVyZSB9O1xuICAgIH1cbiAgICByZXR1cm4geyAuLi5jb3Ntb3NMaWtlVHhuLCBoYXNoOiBoYXNoIH07XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIGJhc2U2NCBlbm9jZGVkIHJhdyB0cmFuc2FjdGlvbiBzdHJpbmcgaW50byBAc2VlIENvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3VHggYmFzZTY0IGVub2NkZWQgcmF3IHRyYW5zYWN0aW9uIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7Q29zbW9zTGlrZVRyYW5zYWN0aW9ufSBEZXNlcmlhbGl6ZWQgY29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqL1xuICBkZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKHJhd1R4OiBzdHJpbmcpOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGRlY29kZWRUeCA9IHRoaXMuZ2V0RGVjb2RlZFR4RnJvbVJhd0Jhc2U2NChyYXdUeCk7XG4gICAgY29uc3QgdHlwZVVybCA9IHRoaXMuZ2V0VHlwZVVybEZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICBjb25zdCB0eXBlOiBUcmFuc2FjdGlvblR5cGUgfCB1bmRlZmluZWQgPSB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZUZyb21UeXBlVXJsKHR5cGVVcmwpO1xuICAgIGxldCBzZW5kTWVzc2FnZURhdGE6IE1lc3NhZ2VEYXRhW107XG4gICAgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKSB7XG4gICAgICBzZW5kTWVzc2FnZURhdGEgPSB0aGlzLmdldFNlbmRNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUgfHwgdHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlKSB7XG4gICAgICBzZW5kTWVzc2FnZURhdGEgPSB0aGlzLmdldERlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KSB7XG4gICAgICBzZW5kTWVzc2FnZURhdGEgPSB0aGlzLmdldFdpdGhkcmF3UmV3YXJkc01lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCkge1xuICAgICAgc2VuZE1lc3NhZ2VEYXRhID0gdGhpcy5nZXRFeGVjdXRlQ29udHJhY3RNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyB0eXBlVXJsKTtcbiAgICB9XG4gICAgY29uc3Qgc2VxdWVuY2UgPSB0aGlzLmdldFNlcXVlbmNlRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIGNvbnN0IGdhc0J1ZGdldCA9IHRoaXMuZ2V0R2FzQnVkZ2V0RnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IHRoaXMuZ2V0UHVibGljS2V5RnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGRlY29kZWRUeC5zaWduYXR1cmVzPy5bMF0gIT09IHVuZGVmaW5lZCA/IEJ1ZmZlci5mcm9tKGRlY29kZWRUeC5zaWduYXR1cmVzWzBdKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbldpdGhIYXNoKFxuICAgICAgc2VxdWVuY2UsXG4gICAgICBzZW5kTWVzc2FnZURhdGEsXG4gICAgICBnYXNCdWRnZXQsXG4gICAgICBwdWJsaWNLZXksXG4gICAgICBzaWduYXR1cmUsXG4gICAgICBkZWNvZGVkVHguYm9keT8ubWVtb1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuIGFycmF5IG9mIGNvaW4gYW1vdW50cy5cbiAgICogQHBhcmFtIHtDb2luW119IGFtb3VudEFycmF5IC0gVGhlIGFycmF5IG9mIGNvaW4gYW1vdW50cyB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSAtIG9wdGlvbmFsIGZpZWxkIGZvciB0cmFuc2FjdGlvbiB0eXBlXG4gICAqL1xuICB2YWxpZGF0ZUFtb3VudERhdGEoYW1vdW50QXJyYXk6IENvaW5bXSwgdHJhbnNhY3Rpb25UeXBlPzogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgYW1vdW50QXJyYXkuZm9yRWFjaCgoY29pbkFtb3VudCkgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZUFtb3VudChjb2luQW1vdW50LCB0cmFuc2FjdGlvblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgZ2FzIGxpbWl0IGFuZCBnYXMgYW1vdW50IGZvciBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0ZlZURhdGF9IGdhc0J1ZGdldCAtIFRoZSBnYXMgYnVkZ2V0IHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBnYXMgYnVkZ2V0IGlzIGludmFsaWQuXG4gICAqL1xuICB2YWxpZGF0ZUdhc0J1ZGdldChnYXNCdWRnZXQ6IEZlZURhdGEpOiB2b2lkIHtcbiAgICBpZiAoZ2FzQnVkZ2V0Lmdhc0xpbWl0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBnYXMgbGltaXQgJyArIGdhc0J1ZGdldC5nYXNMaW1pdCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVBbW91bnREYXRhKGdhc0J1ZGdldC5hbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHNlbmQgbWVzc2FnZSBmb3IgYSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtTZW5kTWVzc2FnZX0gc2VuZE1lc3NhZ2UgLSBUaGUgc2VuZCBtZXNzYWdlIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzZW5kIG1lc3NhZ2UgaXMgaW52YWxpZC5cbiAgICovXG4gIHZhbGlkYXRlU2VuZE1lc3NhZ2Uoc2VuZE1lc3NhZ2U6IFNlbmRNZXNzYWdlKSB7XG4gICAgaWYgKCFzZW5kTWVzc2FnZS50b0FkZHJlc3MgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3Moc2VuZE1lc3NhZ2UudG9BZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIFNlbmRNZXNzYWdlIHRvQWRkcmVzczogYCArIHNlbmRNZXNzYWdlLnRvQWRkcmVzcyk7XG4gICAgfVxuICAgIGlmICghc2VuZE1lc3NhZ2UuZnJvbUFkZHJlc3MgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3Moc2VuZE1lc3NhZ2UuZnJvbUFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgU2VuZE1lc3NhZ2UgZnJvbUFkZHJlc3M6IGAgKyBzZW5kTWVzc2FnZS5mcm9tQWRkcmVzcyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVBbW91bnREYXRhKHNlbmRNZXNzYWdlLmFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgY29pbiBhbW91bnQuXG4gICAqIEBwYXJhbSB7Q29pbn0gYW1vdW50IC0gVGhlIGNvaW4gYW1vdW50IHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIC0gb3B0aW9uYWwgZmllbGQgZm9yIHRyYW5zYWN0aW9uIHR5cGVcbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgY29pbiBhbW91bnQgaXMgaW52YWxpZC5cbiAgICovXG4gIHZhbGlkYXRlQW1vdW50KGFtb3VudDogQ29pbiwgdHJhbnNhY3Rpb25UeXBlPzogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ3ZhbGlkYXRlQW1vdW50IG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGNvc21vcyBsaWtlIEJlY2gzMiBhZGRyZXNzIG1hdGNoZXMgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIGFuZFxuICAgKiB2YWxpZGF0ZXMgbWVtb0lkIGlmIHByZXNlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ0V4cCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgdGhlIHJvb3QgYWRkcmVzcyBhZ2FpbnN0IGFmdGVyIHRyaW1taW5nIHRoZSBtZW1vSWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRDb3Ntb3NMaWtlQWRkcmVzc1dpdGhNZW1vSWQoYWRkcmVzczogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgYWRkcmVzcyAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhZGRyZXNzQXJyYXkgPSBhZGRyZXNzLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgIGlmIChcbiAgICAgICFbMSwgMl0uaW5jbHVkZXMoYWRkcmVzc0FycmF5Lmxlbmd0aCkgfHwgLy8gc2hvdWxkIGhhdmUgYXQgbW9zdCBvbmUgb2NjdXJyZW5jZSBvZiAnbWVtb0lkPSdcbiAgICAgICF0aGlzLmlzVmFsaWRCZWNoMzJBZGRyZXNzTWF0Y2hpbmdSZWdleChhZGRyZXNzQXJyYXlbMF0sIHJlZ0V4cCkgfHxcbiAgICAgIChhZGRyZXNzQXJyYXlbMV0gJiYgIXRoaXMuaXNWYWxpZE1lbW9JZChhZGRyZXNzQXJyYXlbMV0pKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYWRkcmVzcyBpcyB2YWxpZCBCZWNoMzIgYW5kIG1hdGNoZXMgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdFeHAgUmVndWxhciBleHByZXNzaW9uIHRvIHZhbGlkYXRlIHRoZSBhZGRyZXNzIGFnYWluc3RcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRCZWNoMzJBZGRyZXNzTWF0Y2hpbmdSZWdleChhZGRyZXNzOiBzdHJpbmcsIHJlZ0V4cDogUmVnRXhwKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGZyb21CZWNoMzIoYWRkcmVzcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcmVnRXhwLnRlc3QoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgbWVtbyBpZCBpcyB2YWxpZFxuICAgKlxuICAgKiBAcGFyYW0gbWVtb0lkIG1lbW8gaWRcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBtZW1vIGlkIGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkTWVtb0lkKG1lbW9JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IG1lbW9JZE51bWJlcjogQmlnTnVtYmVyO1xuICAgIHRyeSB7XG4gICAgICBtZW1vSWROdW1iZXIgPSBuZXcgQmlnTnVtYmVyKG1lbW9JZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWVtb0lkTnVtYmVyLmd0ZSgwKSAmJiBtZW1vSWROdW1iZXIuaXNJbnRlZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBhZGRyZXNzIG1hdGNoZXMgd2l0aCByZWdleCBAc2VlIGFjY291bnRBZGRyZXNzUmVnZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZFZhbGlkYXRvckFkZHJlc3Mgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBhZGRyZXNzIG1hdGNoZXMgd2l0aCByZWdleCBAc2VlIGFjY291bnRBZGRyZXNzUmVnZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZEFkZHJlc3Mgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBhZGRyZXNzIG1hdGNoZXMgd2l0aCByZWdleCBAc2VlIGNvbnRyYWN0QWRkcmVzc1JlZ2V4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZENvbnRyYWN0QWRkcmVzcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBleGVjdXRlIGNvbnRyYWN0IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtFeGVjdXRlQ29udHJhY3RNZXNzYWdlfSBtZXNzYWdlIC0gVGhlIGV4ZWN1dGUgY29udHJhY3QgbWVzc2FnZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIC0gb3B0aW9uYWwgZmllbGQgZm9yIHRyYW5zYWN0aW9uIHR5cGVcbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgbWVzc2FnZSBpcyBpbnZhbGlkXG4gICAqL1xuICB2YWxpZGF0ZUV4ZWN1dGVDb250cmFjdE1lc3NhZ2UobWVzc2FnZTogRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSwgdHJhbnNhY3Rpb25UeXBlPzogVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgaWYgKCFtZXNzYWdlLmNvbnRyYWN0IHx8ICF0aGlzLmlzVmFsaWRDb250cmFjdEFkZHJlc3MobWVzc2FnZS5jb250cmFjdCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBFeGVjdXRlQ29udHJhY3RNZXNzYWdlIGNvbnRyYWN0IGFkZHJlc3M6IGAgKyBtZXNzYWdlLmNvbnRyYWN0KTtcbiAgICB9XG4gICAgaWYgKCFtZXNzYWdlLnNlbmRlciB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhtZXNzYWdlLnNlbmRlcikpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBFeGVjdXRlQ29udHJhY3RNZXNzYWdlIHNlbmRlciBhZGRyZXNzOiBgICsgbWVzc2FnZS5zZW5kZXIpO1xuICAgIH1cbiAgICBpZiAoIW1lc3NhZ2UubXNnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSBtc2c6IGAgKyBtZXNzYWdlLm1zZyk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLmZ1bmRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQW1vdW50RGF0YShtZXNzYWdlLmZ1bmRzLCB0cmFuc2FjdGlvblR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29pbiBzcGVjaWZpYyBoYXNoIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtIYXNofSBUaGUgaGFzaCBmdW5jdGlvblxuICAgKi9cbiAgZ2V0SGFzaEZ1bmN0aW9uKCk6IEhhc2gge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBDb3Ntb3NVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==
1002
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQU84QjtBQUM5Qix5Q0FBZ0Y7QUFDaEYsK0NBQW9GO0FBQ3BGLHlEQVMrQjtBQUMvQiwrQ0FBOEQ7QUFDOUQsaURBQTRDO0FBQzVDLGdFQUFxQztBQUNyQywwREFBbUU7QUFFbkUseURBQXNFO0FBQ3RFLG1DQUEwQztBQUMxQyx1REFBeUM7QUFXekMsdUNBQXFEO0FBQ3JELG1EQUE0RDtBQUU1RCxNQUFNLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsSUFBQSx5Q0FBeUIsR0FBRSxDQUFDO0FBQ3RFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO0FBQ3RDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUV4RSxNQUFhLFdBQVc7SUFHdEI7UUFDRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksd0JBQVEsQ0FBQyxDQUFDLEdBQUcsK0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsRUFBRSx1QkFBa0IsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJ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QUMsTUFBTSxDQUFDO2dCQUNQLGtDQUFrQztZQUNwQyxDQUFDO1lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSw0Q0FBNEMsRUFBRSxDQUFDO1FBQ2pFLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTztnQkFDTCxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsMEJBQTBCO2FBQzNFLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBOWhDRCxrQ0E4aENDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUVoQyxrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlVXRpbHMsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBOb3RJbXBsZW1lbnRlZEVycm9yLFxuICBOb3RTdXBwb3J0ZWQsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBlbmNvZGVTZWNwMjU2azFQdWJrZXksIGVuY29kZVNlY3AyNTZrMVNpZ25hdHVyZSB9IGZyb20gJ0Bjb3NtanMvYW1pbm8nO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCwgZnJvbUJlY2gzMiwgZnJvbUhleCwgdG9CZWNoMzIsIHRvSGV4IH0gZnJvbSAnQGNvc21qcy9lbmNvZGluZyc7XG5pbXBvcnQge1xuICBEZWNvZGVkVHhSYXcsXG4gIGRlY29kZVB1YmtleSxcbiAgZGVjb2RlVHhSYXcsXG4gIEVuY29kZU9iamVjdCxcbiAgZW5jb2RlUHVia2V5LFxuICBtYWtlQXV0aEluZm9CeXRlcyxcbiAgbWFrZVNpZ25Eb2MsXG4gIFJlZ2lzdHJ5LFxufSBmcm9tICdAY29zbWpzL3Byb3RvLXNpZ25pbmcnO1xuaW1wb3J0IHsgQ29pbiwgZGVmYXVsdFJlZ2lzdHJ5VHlwZXMgfSBmcm9tICdAY29zbWpzL3N0YXJnYXRlJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBTaWduRG9jLCBUeFJhdyB9IGZyb20gJ2Nvc21qcy10eXBlcy9jb3Ntb3MvdHgvdjFiZXRhMS90eCc7XG5pbXBvcnQgeyBBbnkgfSBmcm9tICdjb3NtanMtdHlwZXMvZ29vZ2xlL3Byb3RvYnVmL2FueSc7XG5pbXBvcnQgeyBNc2dFeGVjdXRlQ29udHJhY3QgfSBmcm9tICdjb3NtanMtdHlwZXMvY29zbXdhc20vd2FzbS92MS90eCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24sXG4gIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSxcbiAgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSxcbiAgRmVlRGF0YSxcbiAgTWVzc2FnZURhdGEsXG4gIFJlZGVsZWdhdGVNZXNzYWdlLFxuICBTZW5kTWVzc2FnZSxcbiAgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBDb3Ntb3NLZXlQYWlyIGFzIEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZVByb3RvYnVmTW9kdWxlcyB9IGZyb20gJy4vcHJvdG9idWYtaW5pdCc7XG5cbmNvbnN0IHsgTXNnQ29tcGlsZWQsIFByb3Bvc2FsQ29tcGlsZWQgfSA9IGluaXRpYWxpemVQcm90b2J1Zk1vZHVsZXMoKTtcbmNvbnN0IHsgTXNnU2VuZCB9ID0gTXNnQ29tcGlsZWQudHlwZXM7XG5jb25zdCB7IE1zZ1N1Ym1pdFByb3Bvc2FsLCBNc2dWb3RlIH0gPSBQcm9wb3NhbENvbXBpbGVkLmNvc21vcy5ncm91cC52MTtcblxuZXhwb3J0IGNsYXNzIENvc21vc1V0aWxzPEN1c3RvbU1lc3NhZ2UgPSBuZXZlcj4gaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICBwcm90ZWN0ZWQgcmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeShbLi4uZGVmYXVsdFJlZ2lzdHJ5VHlwZXNdKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy5leGVjdXRlQ29udHJhY3RNc2dUeXBlVXJsLCBNc2dFeGVjdXRlQ29udHJhY3QpO1xuICAgIHRoaXMucmVnaXN0cnkucmVnaXN0ZXIoJy90eXBlcy5Nc2dTZW5kJywgTXNnU2VuZCk7XG4gICAgdGhpcy5yZWdpc3RyeS5yZWdpc3Rlcihjb25zdGFudHMuZ3JvdXBQcm9wb3NhbE1zZ1R5cGVVcmwsIE1zZ1N1Ym1pdFByb3Bvc2FsKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy5ncm91cFZvdGVNc2dUeXBlVXJsLCBNc2dWb3RlKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUJsYWtlMmIoaGFzaCk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBrZXkgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdpc1ZhbGlkU2lnbmF0dXJlIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQmxha2UyYih0eElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdHJhbnNhY3Rpb24gaGFzaCBpcyBpbiB2YWxpZCBibGFjazJiIGZvcm1hdFxuICAgKi9cbiAgdmFsaWRhdGVCbGFrZTJiKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChoYXNoPy5sZW5ndGggIT09IDY0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBoYXNoLm1hdGNoKC9eW2EtekEtWjAtOV0rJC8pICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB3aGV0aGVyIGFtb3VudHMgYXJlIGluIHJhbmdlXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGFtb3VudHMgLSB0aGUgYW1vdW50cyB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRBbW91bnRzKGFtb3VudHM6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBhbW91bnQgb2YgYW1vdW50cykge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRBbW91bnQoYW1vdW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB3aGV0aGVyIGFtb3VudCBpcyBpbiByYW5nZVxuICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRBbW91bnQoYW1vdW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gICAgaWYgKCFiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgfHwgYmlnTnVtYmVyQW1vdW50LmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyByYXcgdHggZGF0YSBpbnRvIG1lc3NhZ2VzLCBzaWduaW5nIGluZm8sIGFuZCBmZWUgZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHhIZXggLSByYXcgYmFzZTY0IHR4XG4gICAqIEByZXR1cm5zIHtEZWNvZGVkVHhSYXd9IERlY29kZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGdldERlY29kZWRUeEZyb21SYXdCYXNlNjQodHhSYXc6IHN0cmluZyk6IERlY29kZWRUeFJhdyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBkZWNvZGVUeFJhdyhmcm9tQmFzZTY0KHR4UmF3KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRXJyb3IgZGVjb2RpbmcgVHhSYXcgYmFzZTY0IGVuY29kZWQgc3RyaW5nOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgbWVzc2FnZXMgaW4gdGhlIGJvZHkgb2YgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7RW5jb2RlT2JqZWN0W119IG1lc3NhZ2VzIGFsb25nIHdpdGggdHlwZSB1cmxcbiAgICovXG4gIHByaXZhdGUgZ2V0RW5jb2RlZE1lc3NhZ2VzRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IEVuY29kZU9iamVjdFtdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSB0eG4gc2VxdWVuY2UgaXMgdmFsaWQgb3Igbm90XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZXF1ZW5jZVxuICAgKi9cbiAgdmFsaWRhdGVTZXF1ZW5jZShzZXF1ZW5jZTogbnVtYmVyKSB7XG4gICAgaWYgKHNlcXVlbmNlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHNlcXVlbmNlOiBsZXNzIHRoYW4gemVybycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxscyB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gYSBEZWNvZGVkVHhSYXcgQXV0aEluZm8gcHJvcGVydHlcbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBzZXF1ZW5jZVxuICAgKi9cbiAgZ2V0U2VxdWVuY2VGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogbnVtYmVyIHtcbiAgICByZXR1cm4gTnVtYmVyKGRlY29kZWRUeC5hdXRoSW5mby5zaWduZXJJbmZvc1swXS5zZXF1ZW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogUHVsbHMgdGhlIHR5cGVVcmwgZnJvbSB0aGUgZW5jb2RlZCBtZXNzYWdlIG9mIGEgRGVjb2RlZFR4UmF3XG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge3N0cmluZ30gY29zbW9zIHByb3RvIHR5cGUgdXJsXG4gICAqL1xuICBnZXRUeXBlVXJsRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IHN0cmluZyB7XG4gICAgY29uc3QgZW5jb2RlZE1lc3NhZ2UgPSB0aGlzLmdldEVuY29kZWRNZXNzYWdlc0Zyb21EZWNvZGVkVHgoZGVjb2RlZFR4KVswXTtcbiAgICByZXR1cm4gZW5jb2RlZE1lc3NhZ2UudHlwZVVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmZWUgZGF0YSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge0ZlZURhdGF9IGZlZSBkYXRhXG4gICAqL1xuICBnZXRHYXNCdWRnZXRGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogRmVlRGF0YSB7XG4gICAgY29uc3QgZmVlRGF0YTogRmVlRGF0YSA9IHtcbiAgICAgIGFtb3VudDogZGVjb2RlZFR4LmF1dGhJbmZvLmZlZT8uYW1vdW50IGFzIENvaW5bXSxcbiAgICAgIGdhc0xpbWl0OiBOdW1iZXIoZGVjb2RlZFR4LmF1dGhJbmZvLmZlZT8uZ2FzTGltaXQpLFxuICAgIH07XG4gICAgaWYgKGRlY29kZWRUeC5hdXRoSW5mby5mZWU/LmdyYW50ZXIpIHtcbiAgICAgIGZlZURhdGEuZmVlR3JhbnRlciA9IGRlY29kZWRUeC5hdXRoSW5mby5mZWUuZ3JhbnRlcjtcbiAgICB9XG4gICAgcmV0dXJuIGZlZURhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHVibGljS2V5IGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBwdWJsaWNLZXkgaW4gaGV4IGZvcm1hdCBpZiBpdCBleGlzdHMsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgICovXG4gIGdldFB1YmxpY0tleUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHB1YmxpY0tleVVJbnQ4QXJyYXkgPSBkZWNvZGVkVHguYXV0aEluZm8uc2lnbmVySW5mb3M/LlswXS5wdWJsaWNLZXk/LnZhbHVlO1xuICAgIGlmIChwdWJsaWNLZXlVSW50OEFycmF5KSB7XG4gICAgICByZXR1cm4gdG9IZXgoZnJvbUJhc2U2NChkZWNvZGVQdWJrZXkoZGVjb2RlZFR4LmF1dGhJbmZvLnNpZ25lckluZm9zPy5bMF0ucHVibGljS2V5KT8udmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gU2VuZCB0cmFuc2FjdGlvbiBtZXNzYWdlIGRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBnZXRTZW5kTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGE8Q3VzdG9tTWVzc2FnZT5bXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZnJvbUFkZHJlc3M6IHZhbHVlLmZyb21BZGRyZXNzLFxuICAgICAgICAgIHRvQWRkcmVzczogdmFsdWUudG9BZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdmFsdWUuYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBEZWxlZ2F0ZSBvZiB1bmRlbGVnYXRlIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0RGVsZWdhdGVPclVuZGVsZWdhdGVNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBNZXNzYWdlRGF0YTxDdXN0b21NZXNzYWdlPltdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBkZWxlZ2F0b3JBZGRyZXNzOiB2YWx1ZS5kZWxlZ2F0b3JBZGRyZXNzLFxuICAgICAgICAgIHZhbGlkYXRvckFkZHJlc3M6IHZhbHVlLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB2YWx1ZS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgTWVzc2FnZURhdGFbXSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge01lc3NhZ2VEYXRhW119IFJlZGVsZWdhdGUgdHJhbnNhY3Rpb24gbWVzc2FnZSBkYXRhXG4gICAqL1xuICBnZXRSZWRlbGVnYXRlTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGE8Q3VzdG9tTWVzc2FnZT5bXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZGVsZWdhdG9yQWRkcmVzczogdmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JTcmNBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JTcmNBZGRyZXNzLFxuICAgICAgICAgIHZhbGlkYXRvckRzdEFkZHJlc3M6IHZhbHVlLnZhbGlkYXRvckRzdEFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB2YWx1ZS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgTWVzc2FnZURhdGFbXSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge01lc3NhZ2VEYXRhW119IFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkcyB0cmFuc2FjdGlvbiBtZXNzYWdlIGRhdGFcbiAgICovXG4gIGdldFdpdGhkcmF3UmV3YXJkc01lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhPEN1c3RvbU1lc3NhZ2U+W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGRlbGVnYXRvckFkZHJlc3M6IHZhbHVlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogdmFsdWUudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gRGVsZWdhdGUgb2YgdW5kZWxlZ2F0ZSB0cmFuc2FjdGlvbiBtZXNzYWdlIGRhdGFcbiAgICovXG4gIGdldFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhPEN1c3RvbU1lc3NhZ2U+W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGRlbGVnYXRvckFkZHJlc3M6IHZhbHVlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogdmFsdWUudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjb3Ntb3MgY2hhaW4gYWRkcmVzcyBmcm9tIGl0cyBlcXVpdmFsZW50IGhleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzSGV4XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRDb3Ntb3NMaWtlQWRkcmVzc0Zyb21IZXgocHJlZml4OiBzdHJpbmcsIGFkZHJlc3NIZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGFkZHJlc3NIZXguaW5kZXhPZignMHgnKSA9PT0gMCkge1xuICAgICAgYWRkcmVzc0hleCA9IGFkZHJlc3NIZXguc2xpY2UoMik7XG4gICAgfVxuICAgIHJldHVybiB0b0JlY2gzMihwcmVmaXgsIGZyb21IZXgoYWRkcmVzc0hleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIEVWTSBjaGFpbiBhZGRyZXNzIGZyb20gaXRzIGVxdWl2YWxlbnQgaGV4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NIZXhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldEV2bUxpa2VBZGRyZXNzRnJvbUNvc21vcyhjb3Ntb3NMaWtlQWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJzB4JyArIHRvSGV4KGZyb21CZWNoMzIoY29zbW9zTGlrZUFkZHJlc3MpLmRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBFeGVjdXRlIGNvbnRyYWN0IHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0RXhlY3V0ZUNvbnRyYWN0TWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGE8Q3VzdG9tTWVzc2FnZT5bXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2UudHlwZVVybCAhPT0gY29uc3RhbnRzLmdyb3VwUHJvcG9zYWxNc2dUeXBlVXJsICYmIG1lc3NhZ2UudHlwZVVybCAhPT0gY29uc3RhbnRzLmdyb3VwVm90ZU1zZ1R5cGVVcmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBzZW5kZXI6IHZhbHVlLnNlbmRlcixcbiAgICAgICAgICAgICAgY29udHJhY3Q6IHZhbHVlLmNvbnRyYWN0LFxuICAgICAgICAgICAgICBtc2c6IHZhbHVlLm1zZyxcbiAgICAgICAgICAgICAgZnVuZHM6IHZhbHVlLmZ1bmRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYEVycm9yIGRlY29kaW5nIGV4ZWN1dGUgY29udHJhY3QgbWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiBtZXNzYWdlLnZhbHVlLFxuICAgICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgICAgfSBhcyBNZXNzYWdlRGF0YTxDdXN0b21NZXNzYWdlPjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gQ3VzdG9tIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0Q3VzdG9tTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGE8Q3VzdG9tTWVzc2FnZT5bXSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnQ3VzdG9tIG1lc3NhZ2UgZGF0YSBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBiaXRnbyB0cmFuc2FjdGlvbiB0eXBlIGJhc2VkIG9uIGNvc21vcyBwcm90byB0eXBlIHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVVybFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlIHwgdW5kZWZpbmVkfSBUcmFuc2FjdGlvblR5cGUgaWYgdXJsIGlzIHN1cHBvcnRlZCBlbHNlIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwodHlwZVVybDogc3RyaW5nKTogVHJhbnNhY3Rpb25UeXBlIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKHR5cGVVcmwpIHtcbiAgICAgIGNhc2UgY29uc3RhbnRzLnNlbmRNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICBjYXNlIGNvbnN0YW50cy5zZW5kTXNnVHlwZTpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgICAgY2FzZSBjb25zdGFudHMuZGVsZWdhdGVNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLnVuZGVsZWdhdGVNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICAgICAgY2FzZSBjb25zdGFudHMud2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdztcbiAgICAgIGNhc2UgY29uc3RhbnRzLmV4ZWN1dGVDb250cmFjdE1zZ1R5cGVVcmw6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICAgICAgY2FzZSBjb25zdGFudHMuZ3JvdXBQcm9wb3NhbE1zZ1R5cGVVcmw6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICAgICAgY2FzZSBjb25zdGFudHMuZ3JvdXBWb3RlTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGw7XG4gICAgICBjYXNlIGNvbnN0YW50cy5yZWRlbGVnYXRlVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nUmVkZWxlZ2F0ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgaGV4IGVuY29kZWQgcHVia2V5LCBjb252ZXJ0cyBpdCB0byB0aGUgQW1pbm8gSlNPTiByZXByZXNlbnRhdGlvbiAodHlwZS92YWx1ZSB3cmFwcGVyKVxuICAgKiBhbmQgcmV0dXJucyBpdCBhcyBwcm90b2J1ZiBgQW55YFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHVia2V5IGhleCBlbmNvZGVkIGNvbXByZXNzZWQgc2VjcDI1NmsxIHB1YmxpYyBrZXlcbiAgICogQHJldHVybnMge0FueX0gcHVia2V5IGVuY29kZWQgYXMgcHJvdG9idWYgYEFueWBcbiAgICovXG4gIGdldEVuY29kZWRQdWJrZXkocHVia2V5OiBzdHJpbmcpOiBBbnkge1xuICAgIHJldHVybiBlbmNvZGVQdWJrZXkoZW5jb2RlU2VjcDI1NmsxUHVia2V5KGZyb21IZXgocHVia2V5KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNlbmQgbWVzc2FnZXMgdXNlZCBpbiB0aGUgZmluYWwgc3RlcCBvZiBlbmNvZGluZyBhIHRyYW5zYWN0aW9uLiBUaGlzIGFsbG93cyBmb3IgYW55IGZpbmFsIHByb2Nlc3NpbmcgbmVlZGVkLlxuICAgKiBAcGFyYW0ge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gY29zbW9zTGlrZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uIHRvIGdldCBzZW5kIG1lc3NhZ2VzIGZyb21cbiAgICogQHJldHVybnMge0FueVtdfSBwcm9jZXNzZWQgc2VuZCBtZXNzYWdlc1xuICAgKi9cbiAgZ2V0U2VuZE1lc3NhZ2VzRm9yRW5jb2RpbmdUeChjb3Ntb3NMaWtlVHJhbnNhY3Rpb246IENvc21vc0xpa2VUcmFuc2FjdGlvbjxDdXN0b21NZXNzYWdlPik6IEFueVtdIHtcbiAgICByZXR1cm4gY29zbW9zTGlrZVRyYW5zYWN0aW9uLnNlbmRNZXNzYWdlcy5tYXAoKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy52YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgaWYgKG1zZy50eXBlVXJsID09PSBjb25zdGFudHMuZ3JvdXBQcm9wb3NhbE1zZ1R5cGVVcmwgfHwgbXNnLnR5cGVVcmwgPT09IGNvbnN0YW50cy5ncm91cFZvdGVNc2dUeXBlVXJsKSB7XG4gICAgICAgICAgLy8gRm9yIGdyb3VwIHByb3Bvc2FsL3ZvdGUgbWVzc2FnZXMsIHRoZSBwcmUtZW5jb2RlZCBieXRlcyBjb250YWluIHRoZSBmdWxsIG1lc3NhZ2VcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGVjb2RlZCA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKHsgdHlwZVVybDogbXNnLnR5cGVVcmwsIHZhbHVlOiBtc2cudmFsdWUgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0eXBlVXJsOiBtc2cudHlwZVVybCxcbiAgICAgICAgICAgICAgdmFsdWU6IGRlY29kZWQsXG4gICAgICAgICAgICB9IGFzIEFueTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gSWYgZGVjb2RpbmcgZmFpbHMsIGZhbGwgYmFjayB0byByZXR1cm5pbmcgdGhlIGJ5dGVzIGRpcmVjdGx5XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB0eXBlVXJsOiBtc2cudHlwZVVybCxcbiAgICAgICAgICAgICAgdmFsdWU6IG1zZy52YWx1ZSxcbiAgICAgICAgICAgIH0gYXMgQW55O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZVVybDogbXNnLnR5cGVVcmwsXG4gICAgICAgICAgICB2YWx1ZTogbXNnLnZhbHVlLFxuICAgICAgICAgIH0gYXMgQW55O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbXNnIGFzIHVua25vd24gYXMgQW55O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0eFJhdyBmcm9tIGFuIGNvc21vcyBsaWtlIHRyYW5zYWN0aW9uIEBzZWUgQ29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEBQcmVjb25kaXRpb24gY29zbW9zTGlrZVRyYW5zYWN0aW9uLnB1YmxpY0tleSBtdXN0IGJlIGRlZmluZWRcbiAgICogQHBhcmFtIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IGNvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7VHhSYXd9IFVuc2lnbmVkIHJhdyB0cmFuc2FjdGlvblxuICAgKi9cbiAgY3JlYXRlVHhSYXdGcm9tQ29zbW9zTGlrZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUcmFuc2FjdGlvbjogQ29zbW9zTGlrZVRyYW5zYWN0aW9uPEN1c3RvbU1lc3NhZ2U+KTogVHhSYXcge1xuICAgIGlmICghY29zbW9zTGlrZVRyYW5zYWN0aW9uLnB1YmxpY0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJsaWNLZXkgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgdHhSYXcnKTtcbiAgICB9XG4gICAgY29uc3QgZW5jb2RlZFB1YmxpY0tleTogQW55ID0gdGhpcy5nZXRFbmNvZGVkUHVia2V5KGNvc21vc0xpa2VUcmFuc2FjdGlvbi5wdWJsaWNLZXkpO1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gdGhpcy5nZXRTZW5kTWVzc2FnZXNGb3JFbmNvZGluZ1R4KGNvc21vc0xpa2VUcmFuc2FjdGlvbik7XG4gICAgbGV0IHR4Qm9keVZhbHVlO1xuICAgIGlmIChjb3Ntb3NMaWtlVHJhbnNhY3Rpb24ubWVtbykge1xuICAgICAgdHhCb2R5VmFsdWUgPSB7XG4gICAgICAgIG1lbW86IGNvc21vc0xpa2VUcmFuc2FjdGlvbi5tZW1vLFxuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXMsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0eEJvZHlWYWx1ZSA9IHtcbiAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0eEJvZHlCeXRlcyA9IHRoaXMucmVnaXN0cnkuZW5jb2RlVHhCb2R5KHR4Qm9keVZhbHVlKTtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IGNvc21vc0xpa2VUcmFuc2FjdGlvbi5zZXF1ZW5jZTtcbiAgICBjb25zdCBhdXRoSW5mb0J5dGVzID0gbWFrZUF1dGhJbmZvQnl0ZXMoXG4gICAgICBbeyBwdWJrZXk6IGVuY29kZWRQdWJsaWNLZXksIHNlcXVlbmNlIH1dLFxuICAgICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uLmdhc0J1ZGdldC5hbW91bnQsXG4gICAgICBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uZ2FzQnVkZ2V0Lmdhc0xpbWl0LFxuICAgICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uLmdhc0J1ZGdldC5mZWVHcmFudGVyIHx8IHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZFxuICAgICk7XG4gICAgcmV0dXJuIFR4UmF3LmZyb21QYXJ0aWFsKHtcbiAgICAgIGJvZHlCeXRlczogdHhCb2R5Qnl0ZXMsXG4gICAgICBhdXRoSW5mb0J5dGVzOiBhdXRoSW5mb0J5dGVzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZXMgYSBzaWduYXR1cmUgaW50byBhIHR4UmF3XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNLZXlIZXggcHVibGljS2V5IGluIGhleCBlbmNvZGVkIHN0cmluZyBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZUhleCBzaWduYXR1cmUgaW4gaGV4IGVuY29kZWQgc3RyaW5nIGZvcm1hdFxuICAgKiBAcGFyYW0ge1R4UmF3fSB1bnNpZ25lZFR4IHJhdyB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7VHhSYXd9IFNpZ25lZCByYXcgdHJhbnNhY3Rpb25cbiAgICovXG4gIGNyZWF0ZVNpZ25lZFR4UmF3KFxuICAgIHB1YmxpY0tleUhleDogc3RyaW5nLFxuICAgIHNpZ25hdHVyZUhleDogc3RyaW5nLFxuICAgIHVuc2lnbmVkVHg6IHsgYm9keUJ5dGVzOiBVaW50OEFycmF5OyBhdXRoSW5mb0J5dGVzOiBVaW50OEFycmF5IH1cbiAgKTogVHhSYXcge1xuICAgIGNvbnN0IHN0ZFNpZ25hdHVyZSA9IGVuY29kZVNlY3AyNTZrMVNpZ25hdHVyZShmcm9tSGV4KHB1YmxpY0tleUhleCksIGZyb21IZXgoc2lnbmF0dXJlSGV4KSk7XG4gICAgcmV0dXJuIFR4UmF3LmZyb21QYXJ0aWFsKHtcbiAgICAgIGJvZHlCeXRlczogdW5zaWduZWRUeC5ib2R5Qnl0ZXMsXG4gICAgICBhdXRoSW5mb0J5dGVzOiB1bnNpZ25lZFR4LmF1dGhJbmZvQnl0ZXMsXG4gICAgICBzaWduYXR1cmVzOiBbZnJvbUJhc2U2NChzdGRTaWduYXR1cmUuc2lnbmF0dXJlKV0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBhIHJhdyB0cmFuc2FjdGlvbiBpbnRvIGEgRGVjb2RlZFR4UmF3IGFuZCBjaGVja3MgaWYgaXQgaGFzIG5vbiBlbXB0eSBzaWduYXR1cmVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0cmFuc2FjdGlvbiBpcyBzaWduZWQgZWxzZSBmYWxzZVxuICAgKi9cbiAgaXNTaWduZWRSYXdUeChyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVjb2RlZFR4ID0gdGhpcy5nZXREZWNvZGVkVHhGcm9tUmF3QmFzZTY0KHJhd1RyYW5zYWN0aW9uKTtcbiAgICBpZiAoZGVjb2RlZFR4LnNpZ25hdHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBwcm90b2NvbCBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBwdWJsaWNLZXkgLSB0aGUgIHB1YmxpYyBrZXkgdG8gYmUgdmFsaWRhdGVkXG4gICAqL1xuICB2YWxpZGF0ZVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChwdWJsaWNLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IHB1YmxpY0tleSB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgUHVibGljIEtleWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2lnbiBkb2MgZnJvbSBhbiBjb3Ntb3MgbGlrZSB0cmFuc2FjdGlvbiBAc2VlIENvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAUHJlY29uZGl0aW9uIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5hY2NvdW50TnVtYmVyIGFuZCBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uY2hhaW5JZCBtdXN0IGJlIGRlZmluZWRcbiAgICogQHBhcmFtIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IGNvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7U2lnbkRvY30gc2lnbiBkb2NcbiAgICovXG4gIGNyZWF0ZVNpZ25Eb2MoXG4gICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb248Q3VzdG9tTWVzc2FnZT4sXG4gICAgYWNjb3VudE51bWJlcjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGNoYWluSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBTaWduRG9jIHtcbiAgICBpZiAoIWFjY291bnROdW1iZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWNjb3VudE51bWJlciBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSBzaWduIGRvYycpO1xuICAgIH1cbiAgICBpZiAoIWNoYWluSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2hhaW5JZCBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSBzaWduIGRvYycpO1xuICAgIH1cbiAgICBpZiAoIWNvc21vc0xpa2VUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3Ntb3NMaWtlVHJhbnNhY3Rpb24gaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgc2lnbiBkb2MnKTtcbiAgICB9XG4gICAgY29uc3QgdHhSYXcgPSB0aGlzLmNyZWF0ZVR4UmF3RnJvbUNvc21vc0xpa2VUcmFuc2FjdGlvbihjb3Ntb3NMaWtlVHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBtYWtlU2lnbkRvYyh0eFJhdy5ib2R5Qnl0ZXMsIHR4UmF3LmF1dGhJbmZvQnl0ZXMsIGNoYWluSWQsIGFjY291bnROdW1iZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGhleFxuICAgKiBAcGFyYW0gaGV4U3RyaW5nIC0gaGV4IHN0cmluZyBmb3JtYXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgc3RyaW5nIGlzIGhleCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc1ZhbGlkSGV4U3RyaW5nKGhleFN0cmluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eWzAtOUEtRmEtZl0qJC8udGVzdChoZXhTdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZVxuICAgKiBAcGFyYW0ge1dpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2V9IHdpdGhkcmF3UmV3YXJkc01lc3NhZ2UgLSBUaGUgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgdmFsaWRhdG9yQWRkcmVzcyBvciBkZWxlZ2F0b3JBZGRyZXNzIGlzIGludmFsaWQgb3IgbWlzc2luZy5cbiAgICovXG4gIHZhbGlkYXRlV2l0aGRyYXdSZXdhcmRzTWVzc2FnZSh3aXRoZHJhd1Jld2FyZHNNZXNzYWdlOiBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlKSB7XG4gICAgaWYgKFxuICAgICAgIXdpdGhkcmF3UmV3YXJkc01lc3NhZ2UudmFsaWRhdG9yQWRkcmVzcyB8fFxuICAgICAgIXRoaXMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3Mod2l0aGRyYXdSZXdhcmRzTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlIHZhbGlkYXRvckFkZHJlc3M6IGAgKyB3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghd2l0aGRyYXdSZXdhcmRzTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHdpdGhkcmF3UmV3YXJkc01lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSBkZWxlZ2F0b3JBZGRyZXNzOiBgICsgd2l0aGRyYXdSZXdhcmRzTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyBpbiBhbiBvYmplY3QgYXJlIG1pc3Npbmcgb3IgbnVsbC5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGtleXMgLSBBbiBhcnJheSBvZiBwcm9wZXJ0eSBrZXlzIHRvIGNoZWNrLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgYXJlIG1pc3Npbmcgb3IgbnVsbC5cbiAgICovXG4gIGlzT2JqUHJvcGVydHlOdWxsKG9iajogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwga2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChvYmpba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBudWxsIHZhbHVlIGZvciBwcm9wZXJ0eSAke2tleX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2VcbiAgICogQHBhcmFtIHtEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2V9IGRlbGVnYXRlTWVzc2FnZSAtIFRoZSBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHZhbGlkYXRvckFkZHJlc3MsIGRlbGVnYXRvckFkZHJlc3MsIG9yIGFtb3VudCBpcyBpbnZhbGlkIG9yIG1pc3NpbmcuXG4gICAqL1xuICB2YWxpZGF0ZURlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZShkZWxlZ2F0ZU1lc3NhZ2U6IERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSkge1xuICAgIHRoaXMuaXNPYmpQcm9wZXJ0eU51bGwoZGVsZWdhdGVNZXNzYWdlLCBbJ3ZhbGlkYXRvckFkZHJlc3MnLCAnZGVsZWdhdG9yQWRkcmVzcyddKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlIHZhbGlkYXRvckFkZHJlc3M6IGAgKyBkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKGRlbGVnYXRlTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UgZGVsZWdhdG9yQWRkcmVzczogYCArIGRlbGVnYXRlTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlQW1vdW50KGRlbGVnYXRlTWVzc2FnZS5hbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgUmVkZWxlZ2F0ZU1lc3NhZ2VcbiAgICogQHBhcmFtIHtEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2V9IHJlZGVsZWdhdGVNZXNzYWdlIC0gVGhlIFJlZGVsZWdhdGVNZXNzYWdlIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB2YWxpZGF0b3JTcmNBZGRyZXNzLCB2YWxpZGF0b3JEc3RBZGRyZXNzLCBkZWxlZ2F0b3JBZGRyZXNzLCBvciBhbW91bnQgaXMgaW52YWxpZCBvciBtaXNzaW5nLlxuICAgKi9cbiAgdmFsaWRhdGVSZWRlbGVnYXRlTWVzc2FnZShyZWRlbGVnYXRlTWVzc2FnZTogUmVkZWxlZ2F0ZU1lc3NhZ2UpIHtcbiAgICB0aGlzLmlzT2JqUHJvcGVydHlOdWxsKHJlZGVsZWdhdGVNZXNzYWdlLCBbJ3ZhbGlkYXRvclNyY0FkZHJlc3MnLCAndmFsaWRhdG9yRHN0QWRkcmVzcycsICdkZWxlZ2F0b3JBZGRyZXNzJ10pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKHJlZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvclNyY0FkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFJlZGVsZWdhdGVNZXNzYWdlIHZhbGlkYXRvclNyY0FkZHJlc3M6IGAgKyByZWRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JTcmNBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MocmVkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yRHN0QWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgUmVkZWxlZ2F0ZU1lc3NhZ2UgdmFsaWRhdG9yRHN0QWRkcmVzczogYCArIHJlZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvckRzdEFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhyZWRlbGVnYXRlTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UgZGVsZWdhdG9yQWRkcmVzczogYCArIHJlZGVsZWdhdGVNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVBbW91bnQocmVkZWxlZ2F0ZU1lc3NhZ2UuYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIEN1c3RvbU1lc3NhZ2VcbiAgICogQHBhcmFtIHtDdXN0b21NZXNzYWdlfSBjdXN0b21NZXNzYWdlIC0gVGhlIEN1c3RvbU1lc3NhZ2UgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGN1c3RvbSBtZXNzYWdlIGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuXG4gICAqIEB0aHJvd3Mge05vdFN1cHBvcnRlZH0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjdXN0b20gbWVzc2FnZSBkYXRhIGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuICB2YWxpZGF0ZUN1c3RvbU1lc3NhZ2UoY3VzdG9tTWVzc2FnZTogQ3VzdG9tTWVzc2FnZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0N1c3RvbSBtZXNzYWdlIGRhdGEgbm90IHN1cHBvcnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgTWVzc2FnZURhdGFcbiAgICogQHBhcmFtIHtNZXNzYWdlRGF0YX0gbWVzc2FnZURhdGEgLSBUaGUgTWVzc2FnZURhdGEgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIG1lc3NhZ2VEYXRhIGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuXG4gICAqL1xuICB2YWxpZGF0ZU1lc3NhZ2VEYXRhKG1lc3NhZ2VEYXRhOiBNZXNzYWdlRGF0YTxDdXN0b21NZXNzYWdlPik6IHZvaWQge1xuICAgIGlmIChtZXNzYWdlRGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgTWVzc2FnZURhdGE6IHVuZGVmaW5lZGApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZURhdGEudHlwZVVybCA9PSBudWxsIHx8IHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwobWVzc2FnZURhdGEudHlwZVVybCkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIE1lc3NhZ2VEYXRhIHR5cGV1cmw6IGAgKyBtZXNzYWdlRGF0YS50eXBlVXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tVHlwZVVybChtZXNzYWdlRGF0YS50eXBlVXJsKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXNzYWdlRGF0YS52YWx1ZSBhcyBTZW5kTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVNlbmRNZXNzYWdlKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZToge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZURlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZURhdGEudmFsdWUgYXMgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVdpdGhkcmF3UmV3YXJkc01lc3NhZ2UodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbDoge1xuICAgICAgICBpZiAobWVzc2FnZURhdGEudmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgLy9UT0RPOiBBZGQgdmFsaWRhdGlvbiBmb3IgcHJlLWVuY29kZWQgY29udHJhY3QgY2FsbCBtZXNzYWdlc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZURhdGEudmFsdWUgYXMgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUV4ZWN1dGVDb250cmFjdE1lc3NhZ2UodmFsdWUsIFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdSZWRlbGVnYXRlOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZURhdGEudmFsdWUgYXMgUmVkZWxlZ2F0ZU1lc3NhZ2U7XG4gICAgICAgIHRoaXMudmFsaWRhdGVSZWRlbGVnYXRlTWVzc2FnZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg6IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXNzYWdlRGF0YS52YWx1ZSBhcyBDdXN0b21NZXNzYWdlO1xuICAgICAgICB0aGlzLnZhbGlkYXRlQ3VzdG9tTWVzc2FnZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIE1lc3NhZ2VEYXRhIFR5cGVVcmwgaXMgbm90IHN1cHBvcnRlZDogYCArIG1lc3NhZ2VEYXRhLnR5cGVVcmwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIENvc21vcy1saWtlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gdHggLSBUaGUgdHJhbnNhY3Rpb24gdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuXG4gICAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHR4OiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb248Q3VzdG9tTWVzc2FnZT4pOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlU2VxdWVuY2UodHguc2VxdWVuY2UpO1xuICAgIHRoaXMudmFsaWRhdGVHYXNCdWRnZXQodHguZ2FzQnVkZ2V0KTtcbiAgICB0aGlzLnZhbGlkYXRlUHVibGljS2V5KHR4LnB1YmxpY0tleSk7XG4gICAgaWYgKHR4LnNlbmRNZXNzYWdlcyA9PT0gdW5kZWZpbmVkIHx8IHR4LnNlbmRNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWVzc2FnZXMgaXMgcmVxdWlyZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHguc2VuZE1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UpID0+IHRoaXMudmFsaWRhdGVNZXNzYWdlRGF0YShtZXNzYWdlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlIC0gVGhlIHNlbmRlciBhZGRyZXNzIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge01lc3NhZ2VEYXRhW119IG1lc3NhZ2VzIC0gVGhlIGFycmF5IG9mIG1lc3NhZ2UgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0ZlZURhdGF9IGdhc0J1ZGdldCAtIFRoZSBmZWUgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3B1YmxpY0tleV0gLSBUaGUgcHVibGljIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZW1vXSAtIFRoZSBtZW1vIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IFJldHVybnMgdGhlIGNyZWF0ZWQgQ29zbW9zLWxpa2UgdHJhbnNhY3Rpb24uXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNyZWF0ZWQgdHJhbnNhY3Rpb24gaXMgaW52YWxpZC5cbiAgICovXG4gIGNyZWF0ZVRyYW5zYWN0aW9uKFxuICAgIHNlcXVlbmNlOiBudW1iZXIsXG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VEYXRhPEN1c3RvbU1lc3NhZ2U+W10sXG4gICAgZ2FzQnVkZ2V0OiBGZWVEYXRhLFxuICAgIHB1YmxpY0tleT86IHN0cmluZyxcbiAgICBtZW1vPzogc3RyaW5nXG4gICk6IENvc21vc0xpa2VUcmFuc2FjdGlvbjxDdXN0b21NZXNzYWdlPiB7XG4gICAgY29uc3QgY29zbW9zTGlrZVR4biA9IHtcbiAgICAgIHNlcXVlbmNlOiBzZXF1ZW5jZSxcbiAgICAgIHNlbmRNZXNzYWdlczogbWVzc2FnZXMsXG4gICAgICBnYXNCdWRnZXQ6IGdhc0J1ZGdldCxcbiAgICAgIHB1YmxpY0tleTogcHVibGljS2V5LFxuICAgICAgbWVtbzogbWVtbyxcbiAgICB9O1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbihjb3Ntb3NMaWtlVHhuKTtcbiAgICByZXR1cm4gY29zbW9zTGlrZVR4bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ29zbW9zLWxpa2UgdHJhbnNhY3Rpb24gd2l0aCBhIGhhc2guXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZXF1ZW5jZSAtIFRoZSBzZW5kZXIgYWRkcmVzcyBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtNZXNzYWdlRGF0YVtdfSBtZXNzYWdlcyAtIFRoZSBhcnJheSBvZiBtZXNzYWdlIGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtGZWVEYXRhfSBnYXNCdWRnZXQgLSBUaGUgZmVlIGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwdWJsaWNLZXldIC0gVGhlIHB1YmxpYyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtzaWduYXR1cmVdIC0gVGhlIHNpZ25hdHVyZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lbW9dIC0gVGhlIG1lbW8gZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gUmV0dXJucyB0aGUgY3JlYXRlZCBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBoYXNoIGFuZCBzaWduYXR1cmUgaWYgcHJvdmlkZWQuXG4gICAqL1xuICBjcmVhdGVUcmFuc2FjdGlvbldpdGhIYXNoKFxuICAgIHNlcXVlbmNlOiBudW1iZXIsXG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VEYXRhPEN1c3RvbU1lc3NhZ2U+W10sXG4gICAgZ2FzQnVkZ2V0OiBGZWVEYXRhLFxuICAgIHB1YmxpY0tleT86IHN0cmluZyxcbiAgICBzaWduYXR1cmU/OiBCdWZmZXIsXG4gICAgbWVtbz86IHN0cmluZ1xuICApOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb248Q3VzdG9tTWVzc2FnZT4ge1xuICAgIGNvbnN0IGNvc21vc0xpa2VUeG4gPSB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHNlcXVlbmNlLCBtZXNzYWdlcywgZ2FzQnVkZ2V0LCBwdWJsaWNLZXksIG1lbW8pO1xuICAgIGxldCBoYXNoID0gY29uc3RhbnRzLlVOQVZBSUxBQkxFX1RFWFQ7XG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gdGhpcy5jcmVhdGVUeFJhd0Zyb21Db3Ntb3NMaWtlVHJhbnNhY3Rpb24oY29zbW9zTGlrZVR4bik7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IFR4UmF3LmZyb21QYXJ0aWFsKHtcbiAgICAgICAgYm9keUJ5dGVzOiB1bnNpZ25lZFR4LmJvZHlCeXRlcyxcbiAgICAgICAgYXV0aEluZm9CeXRlczogdW5zaWduZWRUeC5hdXRoSW5mb0J5dGVzLFxuICAgICAgICBzaWduYXR1cmVzOiBbc2lnbmF0dXJlXSxcbiAgICAgIH0pO1xuICAgICAgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAgIC51cGRhdGUoVHhSYXcuZW5jb2RlKHNpZ25lZFR4KS5maW5pc2goKSlcbiAgICAgICAgLmRpZ2VzdCgpXG4gICAgICAgIC50b1N0cmluZygnaGV4JylcbiAgICAgICAgLnRvTG9jYWxlVXBwZXJDYXNlKCdlbi1VUycpO1xuICAgICAgcmV0dXJuIHsgLi4uY29zbW9zTGlrZVR4biwgaGFzaDogaGFzaCwgc2lnbmF0dXJlOiBzaWduYXR1cmUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uY29zbW9zTGlrZVR4biwgaGFzaDogaGFzaCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBiYXNlNjQgZW5vY2RlZCByYXcgdHJhbnNhY3Rpb24gc3RyaW5nIGludG8gQHNlZSBDb3Ntb3NMaWtlVHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1R4IGJhc2U2NCBlbm9jZGVkIHJhdyB0cmFuc2FjdGlvbiBzdHJpbmdcbiAgICogQHJldHVybnMge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gRGVzZXJpYWxpemVkIGNvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKi9cbiAgZGVzZXJpYWxpemVUcmFuc2FjdGlvbihyYXdUeDogc3RyaW5nKTogQ29zbW9zTGlrZVRyYW5zYWN0aW9uPEN1c3RvbU1lc3NhZ2U+IHtcbiAgICBjb25zdCBkZWNvZGVkVHggPSB0aGlzLmdldERlY29kZWRUeEZyb21SYXdCYXNlNjQocmF3VHgpO1xuICAgIGNvbnN0IHR5cGVVcmwgPSB0aGlzLmdldFR5cGVVcmxGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgY29uc3QgdHlwZTogVHJhbnNhY3Rpb25UeXBlIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tVHlwZVVybCh0eXBlVXJsKTtcbiAgICBsZXQgc2VuZE1lc3NhZ2VEYXRhOiBNZXNzYWdlRGF0YTxDdXN0b21NZXNzYWdlPltdO1xuICAgIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgICAgc2VuZE1lc3NhZ2VEYXRhID0gdGhpcy5nZXRTZW5kTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlIHx8IHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSkge1xuICAgICAgc2VuZE1lc3NhZ2VEYXRhID0gdGhpcy5nZXREZWxlZ2F0ZU9yVW5kZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdykge1xuICAgICAgc2VuZE1lc3NhZ2VEYXRhID0gdGhpcy5nZXRXaXRoZHJhd1Jld2FyZHNNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0RXhlY3V0ZUNvbnRyYWN0TWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1JlZGVsZWdhdGUpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0UmVkZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KSB7XG4gICAgICBzZW5kTWVzc2FnZURhdGEgPSB0aGlzLmdldEN1c3RvbU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIHR5cGVVcmwpO1xuICAgIH1cbiAgICBjb25zdCBzZXF1ZW5jZSA9IHRoaXMuZ2V0U2VxdWVuY2VGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgY29uc3QgZ2FzQnVkZ2V0ID0gdGhpcy5nZXRHYXNCdWRnZXRGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgY29uc3QgcHVibGljS2V5ID0gdGhpcy5nZXRQdWJsaWNLZXlGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gZGVjb2RlZFR4LnNpZ25hdHVyZXM/LlswXSAhPT0gdW5kZWZpbmVkID8gQnVmZmVyLmZyb20oZGVjb2RlZFR4LnNpZ25hdHVyZXNbMF0pIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uV2l0aEhhc2goXG4gICAgICBzZXF1ZW5jZSxcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSxcbiAgICAgIGdhc0J1ZGdldCxcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIHNpZ25hdHVyZSxcbiAgICAgIGRlY29kZWRUeC5ib2R5Py5tZW1vXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gYXJyYXkgb2YgY29pbiBhbW91bnRzLlxuICAgKiBAcGFyYW0ge0NvaW5bXX0gYW1vdW50QXJyYXkgLSBUaGUgYXJyYXkgb2YgY29pbiBhbW91bnRzIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIC0gb3B0aW9uYWwgZmllbGQgZm9yIHRyYW5zYWN0aW9uIHR5cGVcbiAgICovXG4gIHZhbGlkYXRlQW1vdW50RGF0YShhbW91bnRBcnJheTogQ29pbltdLCB0cmFuc2FjdGlvblR5cGU/OiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBhbW91bnRBcnJheS5mb3JFYWNoKChjb2luQW1vdW50KSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlQW1vdW50KGNvaW5BbW91bnQsIHRyYW5zYWN0aW9uVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBnYXMgbGltaXQgYW5kIGdhcyBhbW91bnQgZm9yIGEgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7RmVlRGF0YX0gZ2FzQnVkZ2V0IC0gVGhlIGdhcyBidWRnZXQgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGdhcyBidWRnZXQgaXMgaW52YWxpZC5cbiAgICovXG4gIHZhbGlkYXRlR2FzQnVkZ2V0KGdhc0J1ZGdldDogRmVlRGF0YSk6IHZvaWQge1xuICAgIGlmIChnYXNCdWRnZXQuZ2FzTGltaXQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGdhcyBsaW1pdCAnICsgZ2FzQnVkZ2V0Lmdhc0xpbWl0KTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudERhdGEoZ2FzQnVkZ2V0LmFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgc2VuZCBtZXNzYWdlIGZvciBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge1NlbmRNZXNzYWdlfSBzZW5kTWVzc2FnZSAtIFRoZSBzZW5kIG1lc3NhZ2UgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNlbmQgbWVzc2FnZSBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGVTZW5kTWVzc2FnZShzZW5kTWVzc2FnZTogU2VuZE1lc3NhZ2UpIHtcbiAgICBpZiAoIXNlbmRNZXNzYWdlLnRvQWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhzZW5kTWVzc2FnZS50b0FkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgU2VuZE1lc3NhZ2UgdG9BZGRyZXNzOiBgICsgc2VuZE1lc3NhZ2UudG9BZGRyZXNzKTtcbiAgICB9XG4gICAgaWYgKCFzZW5kTWVzc2FnZS5mcm9tQWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhzZW5kTWVzc2FnZS5mcm9tQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBTZW5kTWVzc2FnZSBmcm9tQWRkcmVzczogYCArIHNlbmRNZXNzYWdlLmZyb21BZGRyZXNzKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudERhdGEoc2VuZE1lc3NhZ2UuYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBjb2luIGFtb3VudC5cbiAgICogQHBhcmFtIHtDb2lufSBhbW91bnQgLSBUaGUgY29pbiBhbW91bnQgdG8gdmFsaWRhdGUuXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgLSBvcHRpb25hbCBmaWVsZCBmb3IgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjb2luIGFtb3VudCBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBDb2luLCB0cmFuc2FjdGlvblR5cGU/OiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigndmFsaWRhdGVBbW91bnQgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgY29zbW9zIGxpa2UgQmVjaDMyIGFkZHJlc3MgbWF0Y2hlcyBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gYW5kXG4gICAqIHZhbGlkYXRlcyBtZW1vSWQgaWYgcHJlc2VudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnRXhwIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byB2YWxpZGF0ZSB0aGUgcm9vdCBhZGRyZXNzIGFnYWluc3QgYWZ0ZXIgdHJpbW1pbmcgdGhlIG1lbW9JZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZENvc21vc0xpa2VBZGRyZXNzV2l0aE1lbW9JZChhZGRyZXNzOiBzdHJpbmcsIHJlZ0V4cDogUmVnRXhwKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBhZGRyZXNzICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFkZHJlc3NBcnJheSA9IGFkZHJlc3Muc3BsaXQoJz9tZW1vSWQ9Jyk7XG4gICAgaWYgKFxuICAgICAgIVsxLCAyXS5pbmNsdWRlcyhhZGRyZXNzQXJyYXkubGVuZ3RoKSB8fCAvLyBzaG91bGQgaGF2ZSBhdCBtb3N0IG9uZSBvY2N1cnJlbmNlIG9mICdtZW1vSWQ9J1xuICAgICAgIXRoaXMuaXNWYWxpZEJlY2gzMkFkZHJlc3NNYXRjaGluZ1JlZ2V4KGFkZHJlc3NBcnJheVswXSwgcmVnRXhwKSB8fFxuICAgICAgKGFkZHJlc3NBcnJheVsxXSAmJiAhdGhpcy5pc1ZhbGlkTWVtb0lkKGFkZHJlc3NBcnJheVsxXSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhZGRyZXNzIGlzIHZhbGlkIEJlY2gzMiBhbmQgbWF0Y2hlcyBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ0V4cCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgdGhlIGFkZHJlc3MgYWdhaW5zdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZEJlY2gzMkFkZHJlc3NNYXRjaGluZ1JlZ2V4KGFkZHJlc3M6IHN0cmluZywgcmVnRXhwOiBSZWdFeHApOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgZnJvbUJlY2gzMihhZGRyZXNzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiByZWdFeHAudGVzdChhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBtZW1vIGlkIGlzIHZhbGlkXG4gICAqXG4gICAqIEBwYXJhbSBtZW1vSWQgbWVtbyBpZFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG1lbW8gaWQgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRNZW1vSWQobWVtb0lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBBbGxvdyBhbHBoYW51bWVyaWMgbWVtbyBJRHMgKGluY2x1ZGluZyB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSBsZXR0ZXJzKVxuICAgIGNvbnN0IGFscGhhbnVtZXJpY1JlZ2V4ID0gL15bMC05YS16QS1aXSskLztcblxuICAgIC8vIENoZWNrIGlmIHRoZSBtZW1vSWQgaXMgYWxwaGFudW1lcmljXG4gICAgaWYgKCFhbHBoYW51bWVyaWNSZWdleC50ZXN0KG1lbW9JZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbWVtb0lkIGlzIHB1cmVseSBudW1lcmljLCBlbnN1cmUgaXQgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyXG4gICAgaWYgKC9eXFxkKyQvLnRlc3QobWVtb0lkKSkge1xuICAgICAgY29uc3QgbWVtb0lkTnVtYmVyID0gbmV3IEJpZ051bWJlcihtZW1vSWQpO1xuICAgICAgcmV0dXJuIG1lbW9JZE51bWJlci5ndGUoMCkgJiYgbWVtb0lkTnVtYmVyLmlzSW50ZWdlcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgYWRkcmVzcyBtYXRjaGVzIHdpdGggcmVnZXggQHNlZSBhY2NvdW50QWRkcmVzc1JlZ2V4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRWYWxpZGF0b3JBZGRyZXNzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgYWRkcmVzcyBtYXRjaGVzIHdpdGggcmVnZXggQHNlZSBhY2NvdW50QWRkcmVzc1JlZ2V4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRBZGRyZXNzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBpZiB0aGUgYWRkcmVzcyBtYXRjaGVzIHdpdGggcmVnZXggQHNlZSBjb250cmFjdEFkZHJlc3NSZWdleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRDb250cmFjdEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRDb250cmFjdEFkZHJlc3Mgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgZXhlY3V0ZSBjb250cmFjdCBtZXNzYWdlXG4gICAqIEBwYXJhbSB7RXhlY3V0ZUNvbnRyYWN0TWVzc2FnZX0gbWVzc2FnZSAtIFRoZSBleGVjdXRlIGNvbnRyYWN0IG1lc3NhZ2UgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSAtIG9wdGlvbmFsIGZpZWxkIGZvciB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIG1lc3NhZ2UgaXMgaW52YWxpZFxuICAgKi9cbiAgdmFsaWRhdGVFeGVjdXRlQ29udHJhY3RNZXNzYWdlKG1lc3NhZ2U6IEV4ZWN1dGVDb250cmFjdE1lc3NhZ2UsIHRyYW5zYWN0aW9uVHlwZT86IFRyYW5zYWN0aW9uVHlwZSkge1xuICAgIGlmICghbWVzc2FnZS5jb250cmFjdCB8fCAhdGhpcy5pc1ZhbGlkQ29udHJhY3RBZGRyZXNzKG1lc3NhZ2UuY29udHJhY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSBjb250cmFjdCBhZGRyZXNzOiBgICsgbWVzc2FnZS5jb250cmFjdCk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZS5zZW5kZXIgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3MobWVzc2FnZS5zZW5kZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSBzZW5kZXIgYWRkcmVzczogYCArIG1lc3NhZ2Uuc2VuZGVyKTtcbiAgICB9XG4gICAgaWYgKCFtZXNzYWdlLm1zZykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2UgbXNnOiBgICsgbWVzc2FnZS5tc2cpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5mdW5kcykge1xuICAgICAgdGhpcy52YWxpZGF0ZUFtb3VudERhdGEobWVzc2FnZS5mdW5kcywgdHJhbnNhY3Rpb25UeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvaW4gc3BlY2lmaWMgaGFzaCBmdW5jdGlvblxuICAgKiBAcmV0dXJucyB7SGFzaH0gVGhlIGhhc2ggZnVuY3Rpb25cbiAgICovXG4gIGdldEhhc2hGdW5jdGlvbigpOiBIYXNoIHtcbiAgICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2Jyk7XG4gIH1cblxuICBnZXRUb2tlbkRlbm9tc1VzaW5nQ29pbkZhbWlseShjb2luRmFtaWx5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgLy8gdXNpbmcgc2V0IHRvIHJlbW92ZSBkdXBsaWNhdGVzIGFzIGRlbm9tIGNhbiBiZSBzYW1lIG9uIHRlc3RuZXQgYW5kIG1haW5uZXQgZm9yIGEgZmV3IHRva2Vuc1xuICAgIHJldHVybiBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICBjb2luc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoY29pbikgPT4gY29pbi5mYW1pbHkudG9Mb3dlckNhc2UoKSA9PT0gY29pbkZhbWlseS50b0xvd2VyQ2FzZSgpICYmIGNvaW4uaXNUb2tlbiAmJiBjb2luLmRlbm9tICE9PSB1bmRlZmluZWRcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcCgoY29pbikgPT4gY29pbi5kZW5vbSBhcyBzdHJpbmcpXG4gICAgICApLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2UncyBtc2cgZmllbGQgY29udGFpbnMgYSBncm91cCBwcm9wb3NhbC5cbiAgICogQHBhcmFtIHtFeGVjdXRlQ29udHJhY3RNZXNzYWdlfSBtZXNzYWdlIC0gVGhlIGV4ZWN1dGUgY29udHJhY3QgbWVzc2FnZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgbXNnIGRlY29kZXMgdG8gYSBncm91cCBwcm9wb3NhbFxuICAgKi9cbiAgaXNHcm91cFByb3Bvc2FsKG1lc3NhZ2U6IEV4ZWN1dGVDb250cmFjdE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICBpZiAoIW1lc3NhZ2UubXNnIHx8IG1lc3NhZ2UubXNnLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmRlY29kZU1zZyhtZXNzYWdlLm1zZyk7XG4gICAgcmV0dXJuIHJlc3VsdC50eXBlVXJsID09PSBjb25zdGFudHMuZ3JvdXBQcm9wb3NhbE1zZ1R5cGVVcmw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2UncyBtc2cgZmllbGQgY29udGFpbnMgYSBncm91cCB2b3RlLlxuICAgKiBAcGFyYW0ge0V4ZWN1dGVDb250cmFjdE1lc3NhZ2V9IG1lc3NhZ2UgLSBUaGUgZXhlY3V0ZSBjb250cmFjdCBtZXNzYWdlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBtc2cgZGVjb2RlcyB0byBhIGdyb3VwIHZvdGVcbiAgICovXG4gIGlzR3JvdXBWb3RlKG1lc3NhZ2U6IEV4ZWN1dGVDb250cmFjdE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICBpZiAoIW1lc3NhZ2UubXNnIHx8IG1lc3NhZ2UubXNnLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmRlY29kZU1zZyhtZXNzYWdlLm1zZyk7XG4gICAgcmV0dXJuIHJlc3VsdC50eXBlVXJsID09PSBjb25zdGFudHMuZ3JvdXBWb3RlTXNnVHlwZVVybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgcHJvdG9idWYgbWVzc2FnZSBhbmQgZGV0ZXJtaW5lcyBpdHMgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBNZXNzYWdlIGRhdGEgYXMgYmFzZTY0IHN0cmluZyBvciBVaW50OEFycmF5XG4gICAqIEByZXR1cm5zIERlY29kZWQgbWVzc2FnZSByZXN1bHQgd2l0aCB0eXBlVXJsIGlmIHN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkXG4gICAqL1xuICBkZWNvZGVNc2coZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSk6IHsgdHlwZVVybD86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VCeXRlcyA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKSA6IGRhdGE7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb3Bvc2FsID0gTXNnU3VibWl0UHJvcG9zYWwuZGVjb2RlKG1lc3NhZ2VCeXRlcyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wb3NhbC5ncm91cFBvbGljeUFkZHJlc3MgJiZcbiAgICAgICAgICB0eXBlb2YgcHJvcG9zYWwuZ3JvdXBQb2xpY3lBZGRyZXNzID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICh0aGlzLmlzVmFsaWRBZGRyZXNzKHByb3Bvc2FsLmdyb3VwUG9saWN5QWRkcmVzcykgfHxcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhwcm9wb3NhbC5ncm91cFBvbGljeUFkZHJlc3MpIHx8XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKHByb3Bvc2FsLmdyb3VwUG9saWN5QWRkcmVzcykpICYmXG4gICAgICAgICAgcHJvcG9zYWwuZ3JvdXBQb2xpY3lBZGRyZXNzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBBcnJheS5pc0FycmF5KHByb3Bvc2FsLnByb3Bvc2VycykgJiZcbiAgICAgICAgICBwcm9wb3NhbC5wcm9wb3NlcnMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4geyB0eXBlVXJsOiBjb25zdGFudHMuZ3JvdXBQcm9wb3NhbE1zZ1R5cGVVcmwgfTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vdCBhIGdyb3VwIHByb3Bvc2FsXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZvdGUgPSBNc2dWb3RlLmRlY29kZShtZXNzYWdlQnl0ZXMpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdm90ZS52b3RlciAmJlxuICAgICAgICAgIHR5cGVvZiB2b3RlLnZvdGVyID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIHRoaXMuaXNWYWxpZEFkZHJlc3Modm90ZS52b3RlcikgJiZcbiAgICAgICAgICB2b3RlLnZvdGVyLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB2b3RlLnByb3Bvc2FsSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIHZvdGUucHJvcG9zYWxJZCAhPT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4geyB0eXBlVXJsOiBjb25zdGFudHMuZ3JvdXBWb3RlTXNnVHlwZVVybCB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IGEgZ3JvdXAgdm90ZVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBleGVjdXRlTXNnID0gTXNnRXhlY3V0ZUNvbnRyYWN0LmRlY29kZShtZXNzYWdlQnl0ZXMpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhlY3V0ZU1zZy5zZW5kZXIgJiZcbiAgICAgICAgICB0eXBlb2YgZXhlY3V0ZU1zZy5zZW5kZXIgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgZXhlY3V0ZU1zZy5zZW5kZXIubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIGV4ZWN1dGVNc2cuY29udHJhY3QgJiZcbiAgICAgICAgICB0eXBlb2YgZXhlY3V0ZU1zZy5jb250cmFjdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBleGVjdXRlTXNnLmNvbnRyYWN0Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBleGVjdXRlTXNnLm1zZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiZcbiAgICAgICAgICBleGVjdXRlTXNnLm1zZy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB7IHR5cGVVcmw6IGNvbnN0YW50cy5leGVjdXRlQ29udHJhY3RNc2dUeXBlVXJsIH07XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBOb3QgYW4gZXhlY3V0ZSBjb250cmFjdCBtZXNzYWdlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGVycm9yOiAnVW5hYmxlIHRvIGRlY29kZSBtZXNzYWdlIGFzIGFueSBrbm93biB0eXBlJyB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIGRlY29kZSBtZXNzYWdlJyxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IENvc21vc1V0aWxzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuIl19