@bitgo-beta/abstract-cosmos 1.0.1-beta.21 → 1.0.1-beta.2100

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 (54) 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 +87 -9
  6. package/dist/src/cosmosCoin.d.ts.map +1 -1
  7. package/dist/src/cosmosCoin.js +424 -43
  8. package/dist/src/index.js +6 -2
  9. package/dist/src/lib/ContractCallBuilder.d.ts +13 -0
  10. package/dist/src/lib/ContractCallBuilder.d.ts.map +1 -0
  11. package/dist/src/lib/ContractCallBuilder.js +75 -0
  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 +6 -0
  25. package/dist/src/lib/constants.d.ts.map +1 -1
  26. package/dist/src/lib/constants.js +8 -2
  27. package/dist/src/lib/iface.d.ts +71 -7
  28. package/dist/src/lib/iface.d.ts.map +1 -1
  29. package/dist/src/lib/iface.js +18 -1
  30. package/dist/src/lib/index.d.ts +2 -0
  31. package/dist/src/lib/index.d.ts.map +1 -1
  32. package/dist/src/lib/index.js +34 -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 +151 -70
  40. package/dist/src/lib/transactionBuilder.d.ts +28 -17
  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 +143 -18
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +452 -31
  49. package/dist/tsconfig.tsbuildinfo +1 -10990
  50. package/package.json +17 -11
  51. package/.eslintignore +0 -5
  52. package/.mocharc.yml +0 -8
  53. package/CHANGELOG.md +0 -17
  54. package/LICENSE +0 -191
@@ -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,14 +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
- const crypto = require("crypto");
12
- const constants = require("./constants");
48
+ const tx_2 = require("cosmjs-types/cosmwasm/wasm/v1/tx");
49
+ const crypto_1 = require("crypto");
50
+ const constants = __importStar(require("./constants"));
13
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;
14
56
  class CosmosUtils {
15
57
  constructor() {
16
58
  this.registry = new proto_signing_1.Registry([...stargate_1.defaultRegistryTypes]);
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);
17
63
  }
18
64
  /** @inheritdoc */
19
65
  isValidBlockId(hash) {
@@ -51,7 +97,7 @@ class CosmosUtils {
51
97
  * Checks if transaction hash is in valid black2b format
52
98
  */
53
99
  validateBlake2b(hash) {
54
- if ((hash === null || hash === void 0 ? void 0 : hash.length) !== 64) {
100
+ if (hash?.length !== 64) {
55
101
  return false;
56
102
  }
57
103
  return hash.match(/^[a-zA-Z0-9]+$/) !== null;
@@ -89,7 +135,7 @@ class CosmosUtils {
89
135
  */
90
136
  getDecodedTxFromRawBase64(txRaw) {
91
137
  try {
92
- return proto_signing_1.decodeTxRaw(encoding_1.fromBase64(txRaw));
138
+ return (0, proto_signing_1.decodeTxRaw)((0, encoding_1.fromBase64)(txRaw));
93
139
  }
94
140
  catch (e) {
95
141
  throw new sdk_core_1.ParseTransactionError('Error decoding TxRaw base64 encoded string: ' + e.message);
@@ -135,11 +181,14 @@ class CosmosUtils {
135
181
  * @returns {FeeData} fee data
136
182
  */
137
183
  getGasBudgetFromDecodedTx(decodedTx) {
138
- var _a, _b;
139
- return {
140
- amount: (_a = decodedTx.authInfo.fee) === null || _a === void 0 ? void 0 : _a.amount,
141
- 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),
142
187
  };
188
+ if (decodedTx.authInfo.fee?.granter) {
189
+ feeData.feeGranter = decodedTx.authInfo.fee.granter;
190
+ }
191
+ return feeData;
143
192
  }
144
193
  /**
145
194
  * Returns the publicKey from the decoded transaction
@@ -147,10 +196,9 @@ class CosmosUtils {
147
196
  * @returns {string | undefined} publicKey in hex format if it exists, undefined otherwise
148
197
  */
149
198
  getPublicKeyFromDecodedTx(decodedTx) {
150
- var _a, _b, _c, _d;
151
- 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;
152
200
  if (publicKeyUInt8Array) {
153
- 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));
154
202
  }
155
203
  return undefined;
156
204
  }
@@ -190,6 +238,25 @@ class CosmosUtils {
190
238
  };
191
239
  });
192
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
+ }
193
260
  /**
194
261
  * Returns the array of MessageData[] from the decoded transaction
195
262
  * @param {DecodedTxRaw} decodedTx
@@ -224,6 +291,67 @@ class CosmosUtils {
224
291
  };
225
292
  });
226
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
+ }
315
+ /**
316
+ * Returns the array of MessageData[] from the decoded transaction
317
+ * @param {DecodedTxRaw} decodedTx
318
+ * @returns {MessageData[]} Execute contract transaction message data
319
+ */
320
+ getExecuteContractMessageDataFromDecodedTx(decodedTx) {
321
+ return decodedTx.body.messages.map((message) => {
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
+ }
345
+ });
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
+ }
227
355
  /**
228
356
  * Determines bitgo transaction type based on cosmos proto type url
229
357
  * @param {string} typeUrl
@@ -233,16 +361,72 @@ class CosmosUtils {
233
361
  switch (typeUrl) {
234
362
  case constants.sendMsgTypeUrl:
235
363
  return sdk_core_1.TransactionType.Send;
364
+ case constants.sendMsgType:
365
+ return sdk_core_1.TransactionType.Send;
236
366
  case constants.delegateMsgTypeUrl:
237
367
  return sdk_core_1.TransactionType.StakingActivate;
238
368
  case constants.undelegateMsgTypeUrl:
239
369
  return sdk_core_1.TransactionType.StakingDeactivate;
240
370
  case constants.withdrawDelegatorRewardMsgTypeUrl:
241
371
  return sdk_core_1.TransactionType.StakingWithdraw;
372
+ case constants.executeContractMsgTypeUrl:
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;
242
380
  default:
243
381
  return undefined;
244
382
  }
245
383
  }
384
+ /**
385
+ * Takes a hex encoded pubkey, converts it to the Amino JSON representation (type/value wrapper)
386
+ * and returns it as protobuf `Any`
387
+ * @param {string} pubkey hex encoded compressed secp256k1 public key
388
+ * @returns {Any} pubkey encoded as protobuf `Any`
389
+ */
390
+ getEncodedPubkey(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
+ });
429
+ }
246
430
  /**
247
431
  * Creates a txRaw from an cosmos like transaction @see CosmosLikeTransaction
248
432
  * @Precondition cosmosLikeTransaction.publicKey must be defined
@@ -253,8 +437,8 @@ class CosmosUtils {
253
437
  if (!cosmosLikeTransaction.publicKey) {
254
438
  throw new Error('publicKey is required to create a txRaw');
255
439
  }
256
- const encodedPublicKey = proto_signing_1.encodePubkey(amino_1.encodeSecp256k1Pubkey(encoding_1.fromHex(cosmosLikeTransaction.publicKey)));
257
- const messages = cosmosLikeTransaction.sendMessages;
440
+ const encodedPublicKey = this.getEncodedPubkey(cosmosLikeTransaction.publicKey);
441
+ const messages = this.getSendMessagesForEncodingTx(cosmosLikeTransaction);
258
442
  let txBodyValue;
259
443
  if (cosmosLikeTransaction.memo) {
260
444
  txBodyValue = {
@@ -269,7 +453,7 @@ class CosmosUtils {
269
453
  }
270
454
  const txBodyBytes = this.registry.encodeTxBody(txBodyValue);
271
455
  const sequence = cosmosLikeTransaction.sequence;
272
- 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);
273
457
  return tx_1.TxRaw.fromPartial({
274
458
  bodyBytes: txBodyBytes,
275
459
  authInfoBytes: authInfoBytes,
@@ -283,11 +467,11 @@ class CosmosUtils {
283
467
  * @returns {TxRaw} Signed raw transaction
284
468
  */
285
469
  createSignedTxRaw(publicKeyHex, signatureHex, unsignedTx) {
286
- 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));
287
471
  return tx_1.TxRaw.fromPartial({
288
472
  bodyBytes: unsignedTx.bodyBytes,
289
473
  authInfoBytes: unsignedTx.authInfoBytes,
290
- signatures: [encoding_1.fromBase64(stdSignature.signature)],
474
+ signatures: [(0, encoding_1.fromBase64)(stdSignature.signature)],
291
475
  });
292
476
  }
293
477
  /**
@@ -333,7 +517,7 @@ class CosmosUtils {
333
517
  throw new Error('cosmosLikeTransaction is required to create a sign doc');
334
518
  }
335
519
  const txRaw = this.createTxRawFromCosmosLikeTransaction(cosmosLikeTransaction);
336
- return proto_signing_1.makeSignDoc(txRaw.bodyBytes, txRaw.authInfoBytes, chainId, accountNumber);
520
+ return (0, proto_signing_1.makeSignDoc)(txRaw.bodyBytes, txRaw.authInfoBytes, chainId, accountNumber);
337
521
  }
338
522
  /**
339
523
  * Returns whether or not the string is a valid hex
@@ -385,6 +569,33 @@ class CosmosUtils {
385
569
  }
386
570
  this.validateAmount(delegateMessage.amount);
387
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
+ }
388
599
  /**
389
600
  * Validates the MessageData
390
601
  * @param {MessageData} messageData - The MessageData to validate.
@@ -401,19 +612,37 @@ class CosmosUtils {
401
612
  switch (type) {
402
613
  case sdk_core_1.TransactionType.Send: {
403
614
  const value = messageData.value;
404
- this.isObjPropertyNull(value, ['toAddress', 'fromAddress']);
615
+ this.validateSendMessage(value);
405
616
  break;
406
617
  }
407
618
  case sdk_core_1.TransactionType.StakingActivate:
408
619
  case sdk_core_1.TransactionType.StakingDeactivate: {
409
620
  const value = messageData.value;
410
- this.isObjPropertyNull(value, ['validatorAddress', 'delegatorAddress']);
411
- this.validateAmount(value.amount);
621
+ this.validateDelegateOrUndelegateMessage(value);
412
622
  break;
413
623
  }
414
624
  case sdk_core_1.TransactionType.StakingWithdraw: {
415
625
  const value = messageData.value;
416
- this.isObjPropertyNull(value, ['validatorAddress', 'delegatorAddress']);
626
+ this.validateWithdrawRewardsMessage(value);
627
+ break;
628
+ }
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
+ }
634
+ const value = messageData.value;
635
+ this.validateExecuteContractMessage(value, sdk_core_1.TransactionType.ContractCall);
636
+ break;
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);
417
646
  break;
418
647
  }
419
648
  default:
@@ -477,8 +706,7 @@ class CosmosUtils {
477
706
  authInfoBytes: unsignedTx.authInfoBytes,
478
707
  signatures: [signature],
479
708
  });
480
- hash = crypto
481
- .createHash('sha256')
709
+ hash = (0, crypto_1.createHash)('sha256')
482
710
  .update(tx_1.TxRaw.encode(signedTx).finish())
483
711
  .digest()
484
712
  .toString('hex')
@@ -493,7 +721,6 @@ class CosmosUtils {
493
721
  * @returns {CosmosLikeTransaction} Deserialized cosmosLikeTransaction
494
722
  */
495
723
  deserializeTransaction(rawTx) {
496
- var _a, _b;
497
724
  const decodedTx = this.getDecodedTxFromRawBase64(rawTx);
498
725
  const typeUrl = this.getTypeUrlFromDecodedTx(decodedTx);
499
726
  const type = this.getTransactionTypeFromTypeUrl(typeUrl);
@@ -507,22 +734,32 @@ class CosmosUtils {
507
734
  else if (type === sdk_core_1.TransactionType.StakingWithdraw) {
508
735
  sendMessageData = this.getWithdrawRewardsMessageDataFromDecodedTx(decodedTx);
509
736
  }
737
+ else if (type === sdk_core_1.TransactionType.ContractCall) {
738
+ sendMessageData = this.getExecuteContractMessageDataFromDecodedTx(decodedTx);
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
+ }
510
746
  else {
511
747
  throw new Error('Transaction type not supported: ' + typeUrl);
512
748
  }
513
749
  const sequence = this.getSequenceFromDecodedTx(decodedTx);
514
750
  const gasBudget = this.getGasBudgetFromDecodedTx(decodedTx);
515
751
  const publicKey = this.getPublicKeyFromDecodedTx(decodedTx);
516
- const signature = ((_a = decodedTx.signatures) === null || _a === void 0 ? void 0 : _a[0]) !== undefined ? Buffer.from(decodedTx.signatures[0]) : undefined;
517
- 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);
518
754
  }
519
755
  /**
520
756
  * Validates an array of coin amounts.
521
757
  * @param {Coin[]} amountArray - The array of coin amounts to validate.
758
+ * @param {TransactionType} transactionType - optional field for transaction type
522
759
  */
523
- validateAmountData(amountArray) {
760
+ validateAmountData(amountArray, transactionType) {
524
761
  amountArray.forEach((coinAmount) => {
525
- this.validateAmount(coinAmount);
762
+ this.validateAmount(coinAmount, transactionType);
526
763
  });
527
764
  }
528
765
  /**
@@ -553,11 +790,65 @@ class CosmosUtils {
553
790
  /**
554
791
  * Validates a coin amount.
555
792
  * @param {Coin} amount - The coin amount to validate.
793
+ * @param {TransactionType} transactionType - optional field for transaction type
556
794
  * @throws {InvalidTransactionError} Throws an error if the coin amount is invalid.
557
795
  */
558
- validateAmount(amount) {
796
+ validateAmount(amount, transactionType) {
559
797
  throw new sdk_core_1.NotImplementedError('validateAmount not implemented');
560
798
  }
799
+ /**
800
+ * Checks if a cosmos like Bech32 address matches given regular expression and
801
+ * validates memoId if present
802
+ * @param {string} address
803
+ * @param {RegExp} regExp Regular expression to validate the root address against after trimming the memoId
804
+ * @returns {boolean} true if address is valid
805
+ */
806
+ isValidCosmosLikeAddressWithMemoId(address, regExp) {
807
+ if (typeof address !== 'string')
808
+ return false;
809
+ const addressArray = address.split('?memoId=');
810
+ if (![1, 2].includes(addressArray.length) || // should have at most one occurrence of 'memoId='
811
+ !this.isValidBech32AddressMatchingRegex(addressArray[0], regExp) ||
812
+ (addressArray[1] && !this.isValidMemoId(addressArray[1]))) {
813
+ return false;
814
+ }
815
+ return true;
816
+ }
817
+ /**
818
+ * Checks if address is valid Bech32 and matches given regular expression
819
+ * @param {string} address
820
+ * @param {RegExp} regExp Regular expression to validate the address against
821
+ * @returns {boolean} true if address is valid
822
+ */
823
+ isValidBech32AddressMatchingRegex(address, regExp) {
824
+ try {
825
+ (0, encoding_1.fromBech32)(address);
826
+ }
827
+ catch (e) {
828
+ return false;
829
+ }
830
+ return regExp.test(address);
831
+ }
832
+ /**
833
+ * Return boolean indicating whether a memo id is valid
834
+ *
835
+ * @param memoId memo id
836
+ * @returns true if memo id is valid
837
+ */
838
+ isValidMemoId(memoId) {
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)) {
843
+ return false;
844
+ }
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;
851
+ }
561
852
  /**
562
853
  * Validates if the address matches with regex @see accountAddressRegex
563
854
  * @param {string} address
@@ -574,8 +865,138 @@ class CosmosUtils {
574
865
  isValidAddress(address) {
575
866
  throw new sdk_core_1.NotImplementedError('isValidAddress not implemented');
576
867
  }
868
+ /**
869
+ * Validates if the address matches with regex @see contractAddressRegex
870
+ * @param {string} address
871
+ * @returns {boolean} - the validation result
872
+ */
873
+ isValidContractAddress(address) {
874
+ throw new sdk_core_1.NotImplementedError('isValidContractAddress not implemented');
875
+ }
876
+ /**
877
+ * Validates a execute contract message
878
+ * @param {ExecuteContractMessage} message - The execute contract message to validate
879
+ * @param {TransactionType} transactionType - optional field for transaction type
880
+ * @throws {InvalidTransactionError} Throws an error if the message is invalid
881
+ */
882
+ validateExecuteContractMessage(message, transactionType) {
883
+ if (!message.contract || !this.isValidContractAddress(message.contract)) {
884
+ throw new sdk_core_1.InvalidTransactionError(`Invalid ExecuteContractMessage contract address: ` + message.contract);
885
+ }
886
+ if (!message.sender || !this.isValidAddress(message.sender)) {
887
+ throw new sdk_core_1.InvalidTransactionError(`Invalid ExecuteContractMessage sender address: ` + message.sender);
888
+ }
889
+ if (!message.msg) {
890
+ throw new sdk_core_1.InvalidTransactionError(`Invalid ExecuteContractMessage msg: ` + message.msg);
891
+ }
892
+ if (message.funds) {
893
+ this.validateAmountData(message.funds, transactionType);
894
+ }
895
+ }
896
+ /**
897
+ * Get coin specific hash function
898
+ * @returns {Hash} The hash function
899
+ */
900
+ getHashFunction() {
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
+ }
997
+ }
577
998
  }
578
999
  exports.CosmosUtils = CosmosUtils;
579
1000
  const utils = new CosmosUtils();
580
1001
  exports.default = utils;
581
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQU04QjtBQUM5Qix5Q0FBZ0Y7QUFDaEYsK0NBQThEO0FBQzlELHlEQVMrQjtBQUMvQiwrQ0FBOEQ7QUFDOUQsK0NBQXFDO0FBQ3JDLDBEQUFtRTtBQUduRSxpQ0FBaUM7QUFDakMseUNBQXlDO0FBU3pDLHVDQUFxRDtBQUVyRCxNQUFhLFdBQVc7SUFBeEI7UUFDVSxhQUFRLEdBQUcsSUFBSSx3QkFBUSxDQUFDLENBQUMsR0FBRywrQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUE0bkI3RCxDQUFDO0lBMW5CQyxrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsR0FBVztRQUMzQixJQUFJO1lBQ0YsSUFBSSx1QkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUFDLE1BQU07WUFDTixPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixnQkFBZ0IsQ0FBQyxHQUFXO1FBQzFCLElBQUk7WUFDRixJQUFJLHVCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQUMsTUFBTTtZQUNOLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLFNBQWlCO1FBQ2hDLE1BQU0sSUFBSSw4QkFBbUIsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsb0JBQW9CLENBQUMsSUFBWTtRQUMvQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLElBQVk7UUFDMUIsSUFBSSxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxNQUFNLE1BQUssRUFBRSxFQUFFO1lBQ3ZCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE9BQWlCO1FBQzlCLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMvQixPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLE1BQWM7UUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxzQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLElBQUksZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzFFLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gseUJBQXlCLENBQUMsS0FBYTtRQUNyQyxJQUFJO1lBQ0YsT0FBTywyQkFBVyxDQUFDLHFCQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN2QztRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDhDQUE4QyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3RjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssK0JBQStCLENBQUMsU0FBdUI7UUFDN0QsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx3QkFBd0IsQ0FBQyxTQUF1QjtRQUM5QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHVCQUF1QixDQUFDLFNBQXVCO1FBQzdDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx5QkFBeUIsQ0FBQyxTQUF1Qjs7UUFDL0MsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFBLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRywwQ0FBRSxNQUFnQjtZQUNoRCxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQUEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLDBDQUFFLFFBQVEsQ0FBQztTQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx5QkFBeUIsQ0FBQyxTQUF1Qjs7UUFDL0MsTUFBTSxtQkFBbUIsR0FBRyxNQUFBLE1BQUEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLDBDQUFHLENBQUMsRUFBRSxTQUFTLDBDQUFFLEtBQUssQ0FBQztRQUNqRixJQUFJLG1CQUFtQixFQUFFO1lBQ3ZCLE9BQU8sZ0JBQUssQ0FBQyxxQkFBVSxDQUFDLE1BQUEsNEJBQVksQ0FBQyxNQUFBLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVywwQ0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLDBDQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDOUY7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLCtCQUErQixDQUFDLFNBQXVCO1FBQy9ELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUMsT0FBTztnQkFDTCxLQUFLLEVBQUU7b0JBQ0wsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtpQkFDckI7Z0JBQ0QsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2FBQ3pCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsK0NBQStDLENBQUMsU0FBdUI7UUFDckUsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxPQUFPO2dCQUNMLEtBQUssRUFBRTtvQkFDTCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO29CQUN4QyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO29CQUN4QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07aUJBQ3JCO2dCQUNELE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTzthQUN6QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDBDQUEwQyxDQUFDLFNBQXVCO1FBQ2hFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUMsT0FBTztnQkFDTCxLQUFLLEVBQUU7b0JBQ0wsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtvQkFDeEMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtpQkFDekM7Z0JBQ0QsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2FBQ3pCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbURBQW1ELENBQUMsU0FBdUI7UUFDekUsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxPQUFPO2dCQUNMLEtBQUssRUFBRTtvQkFDTCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO29CQUN4QyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO2lCQUN6QztnQkFDRCxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87YUFDekIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCw2QkFBNkIsQ0FBQyxPQUFlO1FBQzNDLFFBQVEsT0FBTyxFQUFFO1lBQ2YsS0FBSyxTQUFTLENBQUMsY0FBYztnQkFDM0IsT0FBTywwQkFBZSxDQUFDLElBQUksQ0FBQztZQUM5QixLQUFLLFNBQVMsQ0FBQyxrQkFBa0I7Z0JBQy9CLE9BQU8sMEJBQWUsQ0FBQyxlQUFlLENBQUM7WUFDekMsS0FBSyxTQUFTLENBQUMsb0JBQW9CO2dCQUNqQyxPQUFPLDBCQUFlLENBQUMsaUJBQWlCLENBQUM7WUFDM0MsS0FBSyxTQUFTLENBQUMsaUNBQWlDO2dCQUM5QyxPQUFPLDBCQUFlLENBQUMsZUFBZSxDQUFDO1lBQ3pDO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsb0NBQW9DLENBQUMscUJBQTRDO1FBQy9FLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsTUFBTSxnQkFBZ0IsR0FBUSw0QkFBWSxDQUFDLDZCQUFxQixDQUFDLGtCQUFPLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVHLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLFlBQWdDLENBQUM7UUFDeEUsSUFBSSxXQUFXLENBQUM7UUFDaEIsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUU7WUFDOUIsV0FBVyxHQUFHO2dCQUNaLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxJQUFJO2dCQUNoQyxRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDO1NBQ0g7YUFBTTtZQUNMLFdBQVcsR0FBRztnQkFDWixRQUFRLEVBQUUsUUFBUTthQUNuQixDQUFDO1NBQ0g7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RCxNQUFNLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxRQUFRLENBQUM7UUFDaEQsTUFBTSxhQUFhLEdBQUcsaUNBQWlCLENBQ3JDLENBQUMsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFDeEMscUJBQXFCLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFDdEMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFDeEMsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLENBQ1YsQ0FBQztRQUNGLE9BQU8sVUFBSyxDQUFDLFdBQVcsQ0FBQztZQUN2QixTQUFTLEVBQUUsV0FBVztZQUN0QixhQUFhLEVBQUUsYUFBYTtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsaUJBQWlCLENBQ2YsWUFBb0IsRUFDcEIsWUFBb0IsRUFDcEIsVUFBZ0U7UUFFaEUsTUFBTSxZQUFZLEdBQUcsZ0NBQXdCLENBQUMsa0JBQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxrQkFBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDNUYsT0FBTyxVQUFLLENBQUMsV0FBVyxDQUFDO1lBQ3ZCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztZQUMvQixhQUFhLEVBQUUsVUFBVSxDQUFDLGFBQWE7WUFDdkMsVUFBVSxFQUFFLENBQUMscUJBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDakQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsY0FBc0I7UUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxTQUE2QjtRQUM3QyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDM0IsSUFBSTtnQkFDRixJQUFJLHVCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQzthQUNqQztZQUFDLE1BQU07Z0JBQ04sTUFBTSxJQUFJLGtDQUF1QixDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDekQ7U0FDRjtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FDWCxxQkFBNEMsRUFDNUMsYUFBaUMsRUFDakMsT0FBMkI7UUFFM0IsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDbkU7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztTQUMzRTtRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sMkJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCw4QkFBOEIsQ0FBQyxzQkFBdUQ7UUFDcEYsSUFDRSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQjtZQUN4QyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUN0RTtZQUNBLE1BQU0sSUFBSSxrQ0FBdUIsQ0FDL0IsNERBQTRELEdBQUcsc0JBQXNCLENBQUMsZ0JBQWdCLENBQ3ZHLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUM3RyxNQUFNLElBQUksa0NBQXVCLENBQy9CLDREQUE0RCxHQUFHLHNCQUFzQixDQUFDLGdCQUFnQixDQUN2RyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxpQkFBaUIsQ0FBQyxHQUEyQixFQUFFLElBQW1CO1FBQ2hFLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUM5RDtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQ0FBbUMsQ0FBQyxlQUE0QztRQUM5RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBRWxGLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDbkUsTUFBTSxJQUFJLGtDQUF1QixDQUMvQix3REFBd0QsR0FBRyxlQUFlLENBQUMsZ0JBQWdCLENBQzVGLENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQzFELE1BQU0sSUFBSSxrQ0FBdUIsQ0FDL0Isd0RBQXdELEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUM1RixDQUFDO1NBQ0g7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFdBQXdCO1FBQzFDLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtZQUN2QixNQUFNLElBQUksa0NBQXVCLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNyRTtRQUNELElBQUksV0FBVyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLDZCQUE2QixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDbEcsTUFBTSxJQUFJLGtDQUF1QixDQUFDLCtCQUErQixHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxRjtRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckUsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLDBCQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFvQixDQUFDO2dCQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQzVELE1BQU07YUFDUDtZQUNELEtBQUssMEJBQWUsQ0FBQyxlQUFlLENBQUM7WUFDckMsS0FBSywwQkFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFvQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEMsTUFBTTthQUNQO1lBQ0QsS0FBSywwQkFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBd0MsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztnQkFDeEUsTUFBTTthQUNQO1lBQ0Q7Z0JBQ0UsTUFBTSxJQUFJLGtDQUF1QixDQUFDLGdEQUFnRCxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3RztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsRUFBeUI7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsSUFBSSxFQUFFLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakUsTUFBTSxJQUFJLGtDQUF1QixDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDaEY7YUFBTTtZQUNMLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUN6RTtJQUNILENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxpQkFBaUIsQ0FDZixRQUFnQixFQUNoQixRQUF1QixFQUN2QixTQUFrQixFQUNsQixTQUFrQixFQUNsQixJQUFhO1FBRWIsTUFBTSxhQUFhLEdBQUc7WUFDcEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLFFBQVE7WUFDdEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCx5QkFBeUIsQ0FDdkIsUUFBZ0IsRUFDaEIsUUFBdUIsRUFDdkIsU0FBa0IsRUFDbEIsU0FBa0IsRUFDbEIsU0FBa0IsRUFDbEIsSUFBYTtRQUViLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0YsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1FBQ3RDLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUMzQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0NBQW9DLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDNUUsTUFBTSxRQUFRLEdBQUcsVUFBSyxDQUFDLFdBQVcsQ0FBQztnQkFDakMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO2dCQUMvQixhQUFhLEVBQUUsVUFBVSxDQUFDLGFBQWE7Z0JBQ3ZDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBQzthQUN4QixDQUFDLENBQUM7WUFDSCxJQUFJLEdBQUcsTUFBTTtpQkFDVixVQUFVLENBQUMsUUFBUSxDQUFDO2lCQUNwQixNQUFNLENBQUMsVUFBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQkFDdkMsTUFBTSxFQUFFO2lCQUNSLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQ2YsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsT0FBTyxFQUFFLEdBQUcsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxFQUFFLEdBQUcsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHNCQUFzQixDQUFDLEtBQWE7O1FBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLEdBQWdDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RixJQUFJLGVBQThCLENBQUM7UUFDbkMsSUFBSSxJQUFJLEtBQUssMEJBQWUsQ0FBQyxJQUFJLEVBQUU7WUFDakMsZUFBZSxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNuRTthQUFNLElBQUksSUFBSSxLQUFLLDBCQUFlLENBQUMsZUFBZSxJQUFJLElBQUksS0FBSywwQkFBZSxDQUFDLGlCQUFpQixFQUFFO1lBQ2pHLGVBQWUsR0FBRyxJQUFJLENBQUMsK0NBQStDLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkY7YUFBTSxJQUFJLElBQUksS0FBSywwQkFBZSxDQUFDLGVBQWUsRUFBRTtZQUNuRCxlQUFlLEdBQUcsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzlFO2FBQU07WUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1NBQy9EO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsTUFBTSxTQUFTLEdBQUcsQ0FBQSxNQUFBLFNBQVMsQ0FBQyxVQUFVLDBDQUFHLENBQUMsQ0FBQyxNQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3RyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FDbkMsUUFBUSxFQUNSLGVBQWUsRUFDZixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxNQUFBLFNBQVMsQ0FBQyxJQUFJLDBDQUFFLElBQUksQ0FDckIsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0IsQ0FBQyxXQUFtQjtRQUNwQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsU0FBa0I7UUFDbEMsSUFBSSxTQUFTLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRTtZQUMzQixNQUFNLElBQUksa0NBQXVCLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzlFO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFdBQXdCO1FBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDekUsTUFBTSxJQUFJLGtDQUF1QixDQUFDLGlDQUFpQyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM5RjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0UsTUFBTSxJQUFJLGtDQUF1QixDQUFDLG1DQUFtQyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNsRztRQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsTUFBWTtRQUN6QixNQUFNLElBQUksOEJBQW1CLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHVCQUF1QixDQUFDLE9BQWU7UUFDckMsTUFBTSxJQUFJLDhCQUFtQixDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsT0FBZTtRQUM1QixNQUFNLElBQUksOEJBQW1CLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0NBQ0Y7QUE3bkJELGtDQTZuQkM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRWhDLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VVdGlscyxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBlbmNvZGVTZWNwMjU2azFQdWJrZXksIGVuY29kZVNlY3AyNTZrMVNpZ25hdHVyZSB9IGZyb20gJ0Bjb3NtanMvYW1pbm8nO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCwgZnJvbUhleCwgdG9IZXggfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCB7XG4gIERlY29kZWRUeFJhdyxcbiAgRW5jb2RlT2JqZWN0LFxuICBSZWdpc3RyeSxcbiAgZGVjb2RlUHVia2V5LFxuICBkZWNvZGVUeFJhdyxcbiAgZW5jb2RlUHVia2V5LFxuICBtYWtlQXV0aEluZm9CeXRlcyxcbiAgbWFrZVNpZ25Eb2MsXG59IGZyb20gJ0Bjb3NtanMvcHJvdG8tc2lnbmluZyc7XG5pbXBvcnQgeyBDb2luLCBkZWZhdWx0UmVnaXN0cnlUeXBlcyB9IGZyb20gJ0Bjb3NtanMvc3RhcmdhdGUnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgU2lnbkRvYywgVHhSYXcgfSBmcm9tICdjb3NtanMtdHlwZXMvY29zbW9zL3R4L3YxYmV0YTEvdHgnO1xuaW1wb3J0IHsgQW55IH0gZnJvbSAnY29zbWpzLXR5cGVzL2dvb2dsZS9wcm90b2J1Zi9hbnknO1xuXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24sXG4gIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSxcbiAgRmVlRGF0YSxcbiAgTWVzc2FnZURhdGEsXG4gIFNlbmRNZXNzYWdlLFxuICBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IENvc21vc0tleVBhaXIgYXMgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5cbmV4cG9ydCBjbGFzcyBDb3Ntb3NVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIHByaXZhdGUgcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoWy4uLmRlZmF1bHRSZWdpc3RyeVR5cGVzXSk7XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQmxha2UyYihoYXNoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBuZXcgS2V5UGFpcih7IHBydjoga2V5IH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRQdWJsaWNLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IGtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRTaWduYXR1cmUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVCbGFrZTJiKHR4SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0cmFuc2FjdGlvbiBoYXNoIGlzIGluIHZhbGlkIGJsYWNrMmIgZm9ybWF0XG4gICAqL1xuICB2YWxpZGF0ZUJsYWtlMmIoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGhhc2g/Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2gubWF0Y2goL15bYS16QS1aMC05XSskLykgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW1vdW50cyBhcmUgaW4gcmFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYW1vdW50cyAtIHRoZSBhbW91bnRzIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFtb3VudHMoYW1vdW50czogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGFtb3VudCBvZiBhbW91bnRzKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZEFtb3VudChhbW91bnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW1vdW50IGlzIGluIHJhbmdlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFtb3VudChhbW91bnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgICBpZiAoIWJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSB8fCBiaWdOdW1iZXJBbW91bnQuaXNMZXNzVGhhbk9yRXF1YWxUbygwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHJhdyB0eCBkYXRhIGludG8gbWVzc2FnZXMsIHNpZ25pbmcgaW5mbywgYW5kIGZlZSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eEhleCAtIHJhdyBiYXNlNjQgdHhcbiAgICogQHJldHVybnMge0RlY29kZWRUeFJhd30gRGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgZ2V0RGVjb2RlZFR4RnJvbVJhd0Jhc2U2NCh0eFJhdzogc3RyaW5nKTogRGVjb2RlZFR4UmF3IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGRlY29kZVR4UmF3KGZyb21CYXNlNjQodHhSYXcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFcnJvciBkZWNvZGluZyBUeFJhdyBiYXNlNjQgZW5jb2RlZCBzdHJpbmc6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBtZXNzYWdlcyBpbiB0aGUgYm9keSBvZiB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtFbmNvZGVPYmplY3RbXX0gbWVzc2FnZXMgYWxvbmcgd2l0aCB0eXBlIHVybFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbmNvZGVkTWVzc2FnZXNGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogRW5jb2RlT2JqZWN0W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIHR4biBzZXF1ZW5jZSBpcyB2YWxpZCBvciBub3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlXG4gICAqL1xuICB2YWxpZGF0ZVNlcXVlbmNlKHNlcXVlbmNlOiBudW1iZXIpIHtcbiAgICBpZiAoc2VxdWVuY2UgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgc2VxdWVuY2U6IGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSBhIERlY29kZWRUeFJhdyBBdXRoSW5mbyBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHNlcXVlbmNlXG4gICAqL1xuICBnZXRTZXF1ZW5jZUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBudW1iZXIge1xuICAgIHJldHVybiBOdW1iZXIoZGVjb2RlZFR4LmF1dGhJbmZvLnNpZ25lckluZm9zWzBdLnNlcXVlbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxscyB0aGUgdHlwZVVybCBmcm9tIHRoZSBlbmNvZGVkIG1lc3NhZ2Ugb2YgYSBEZWNvZGVkVHhSYXdcbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBjb3Ntb3MgcHJvdG8gdHlwZSB1cmxcbiAgICovXG4gIGdldFR5cGVVcmxGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogc3RyaW5nIHtcbiAgICBjb25zdCBlbmNvZGVkTWVzc2FnZSA9IHRoaXMuZ2V0RW5jb2RlZE1lc3NhZ2VzRnJvbURlY29kZWRUeChkZWNvZGVkVHgpWzBdO1xuICAgIHJldHVybiBlbmNvZGVkTWVzc2FnZS50eXBlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZlZSBkYXRhIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7RmVlRGF0YX0gZmVlIGRhdGFcbiAgICovXG4gIGdldEdhc0J1ZGdldEZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBGZWVEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW1vdW50OiBkZWNvZGVkVHguYXV0aEluZm8uZmVlPy5hbW91bnQgYXMgQ29pbltdLFxuICAgICAgZ2FzTGltaXQ6IE51bWJlcihkZWNvZGVkVHguYXV0aEluZm8uZmVlPy5nYXNMaW1pdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNLZXkgZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IHB1YmxpY0tleSBpbiBoZXggZm9ybWF0IGlmIGl0IGV4aXN0cywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgZ2V0UHVibGljS2V5RnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcHVibGljS2V5VUludDhBcnJheSA9IGRlY29kZWRUeC5hdXRoSW5mby5zaWduZXJJbmZvcz8uWzBdLnB1YmxpY0tleT8udmFsdWU7XG4gICAgaWYgKHB1YmxpY0tleVVJbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiB0b0hleChmcm9tQmFzZTY0KGRlY29kZVB1YmtleShkZWNvZGVkVHguYXV0aEluZm8uc2lnbmVySW5mb3M/LlswXS5wdWJsaWNLZXkpPy52YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBTZW5kIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFNlbmRNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBNZXNzYWdlRGF0YVtdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBmcm9tQWRkcmVzczogdmFsdWUuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgdG9BZGRyZXNzOiB2YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB2YWx1ZS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgTWVzc2FnZURhdGFbXSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge01lc3NhZ2VEYXRhW119IERlbGVnYXRlIG9mIHVuZGVsZWdhdGUgdHJhbnNhY3Rpb24gbWVzc2FnZSBkYXRhXG4gICAqL1xuICBnZXREZWxlZ2F0ZU9yVW5kZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhW10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGRlbGVnYXRvckFkZHJlc3M6IHZhbHVlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogdmFsdWUudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0V2l0aGRyYXdSZXdhcmRzTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGFbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZGVsZWdhdG9yQWRkcmVzczogdmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBEZWxlZ2F0ZSBvZiB1bmRlbGVnYXRlIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0V2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGFbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZGVsZWdhdG9yQWRkcmVzczogdmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgYml0Z28gdHJhbnNhY3Rpb24gdHlwZSBiYXNlZCBvbiBjb3Ntb3MgcHJvdG8gdHlwZSB1cmxcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVVcmxcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZH0gVHJhbnNhY3Rpb25UeXBlIGlmIHVybCBpcyBzdXBwb3J0ZWQgZWxzZSB1bmRlZmluZWRcbiAgICovXG4gIGdldFRyYW5zYWN0aW9uVHlwZUZyb21UeXBlVXJsKHR5cGVVcmw6IHN0cmluZyk6IFRyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlVXJsKSB7XG4gICAgICBjYXNlIGNvbnN0YW50cy5zZW5kTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgICAgY2FzZSBjb25zdGFudHMuZGVsZWdhdGVNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLnVuZGVsZWdhdGVNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICAgICAgY2FzZSBjb25zdGFudHMud2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0eFJhdyBmcm9tIGFuIGNvc21vcyBsaWtlIHRyYW5zYWN0aW9uIEBzZWUgQ29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEBQcmVjb25kaXRpb24gY29zbW9zTGlrZVRyYW5zYWN0aW9uLnB1YmxpY0tleSBtdXN0IGJlIGRlZmluZWRcbiAgICogQHBhcmFtIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IGNvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7VHhSYXd9IFVuc2lnbmVkIHJhdyB0cmFuc2FjdGlvblxuICAgKi9cbiAgY3JlYXRlVHhSYXdGcm9tQ29zbW9zTGlrZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUcmFuc2FjdGlvbjogQ29zbW9zTGlrZVRyYW5zYWN0aW9uKTogVHhSYXcge1xuICAgIGlmICghY29zbW9zTGlrZVRyYW5zYWN0aW9uLnB1YmxpY0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJsaWNLZXkgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgdHhSYXcnKTtcbiAgICB9XG4gICAgY29uc3QgZW5jb2RlZFB1YmxpY0tleTogQW55ID0gZW5jb2RlUHVia2V5KGVuY29kZVNlY3AyNTZrMVB1YmtleShmcm9tSGV4KGNvc21vc0xpa2VUcmFuc2FjdGlvbi5wdWJsaWNLZXkpKSk7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uc2VuZE1lc3NhZ2VzIGFzIHVua25vd24gYXMgQW55W107XG4gICAgbGV0IHR4Qm9keVZhbHVlO1xuICAgIGlmIChjb3Ntb3NMaWtlVHJhbnNhY3Rpb24ubWVtbykge1xuICAgICAgdHhCb2R5VmFsdWUgPSB7XG4gICAgICAgIG1lbW86IGNvc21vc0xpa2VUcmFuc2FjdGlvbi5tZW1vLFxuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXMsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0eEJvZHlWYWx1ZSA9IHtcbiAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0eEJvZHlCeXRlcyA9IHRoaXMucmVnaXN0cnkuZW5jb2RlVHhCb2R5KHR4Qm9keVZhbHVlKTtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IGNvc21vc0xpa2VUcmFuc2FjdGlvbi5zZXF1ZW5jZTtcbiAgICBjb25zdCBhdXRoSW5mb0J5dGVzID0gbWFrZUF1dGhJbmZvQnl0ZXMoXG4gICAgICBbeyBwdWJrZXk6IGVuY29kZWRQdWJsaWNLZXksIHNlcXVlbmNlIH1dLFxuICAgICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uLmdhc0J1ZGdldC5hbW91bnQsXG4gICAgICBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uZ2FzQnVkZ2V0Lmdhc0xpbWl0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkXG4gICAgKTtcbiAgICByZXR1cm4gVHhSYXcuZnJvbVBhcnRpYWwoe1xuICAgICAgYm9keUJ5dGVzOiB0eEJvZHlCeXRlcyxcbiAgICAgIGF1dGhJbmZvQnl0ZXM6IGF1dGhJbmZvQnl0ZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlcyBhIHNpZ25hdHVyZSBpbnRvIGEgdHhSYXdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY0tleUhleCBwdWJsaWNLZXkgaW4gaGV4IGVuY29kZWQgc3RyaW5nIGZvcm1hdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlSGV4IHNpZ25hdHVyZSBpbiBoZXggZW5jb2RlZCBzdHJpbmcgZm9ybWF0XG4gICAqIEBwYXJhbSB7VHhSYXd9IHVuc2lnbmVkVHggcmF3IHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtUeFJhd30gU2lnbmVkIHJhdyB0cmFuc2FjdGlvblxuICAgKi9cbiAgY3JlYXRlU2lnbmVkVHhSYXcoXG4gICAgcHVibGljS2V5SGV4OiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlSGV4OiBzdHJpbmcsXG4gICAgdW5zaWduZWRUeDogeyBib2R5Qnl0ZXM6IFVpbnQ4QXJyYXk7IGF1dGhJbmZvQnl0ZXM6IFVpbnQ4QXJyYXkgfVxuICApOiBUeFJhdyB7XG4gICAgY29uc3Qgc3RkU2lnbmF0dXJlID0gZW5jb2RlU2VjcDI1NmsxU2lnbmF0dXJlKGZyb21IZXgocHVibGljS2V5SGV4KSwgZnJvbUhleChzaWduYXR1cmVIZXgpKTtcbiAgICByZXR1cm4gVHhSYXcuZnJvbVBhcnRpYWwoe1xuICAgICAgYm9keUJ5dGVzOiB1bnNpZ25lZFR4LmJvZHlCeXRlcyxcbiAgICAgIGF1dGhJbmZvQnl0ZXM6IHVuc2lnbmVkVHguYXV0aEluZm9CeXRlcyxcbiAgICAgIHNpZ25hdHVyZXM6IFtmcm9tQmFzZTY0KHN0ZFNpZ25hdHVyZS5zaWduYXR1cmUpXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgcmF3IHRyYW5zYWN0aW9uIGludG8gYSBEZWNvZGVkVHhSYXcgYW5kIGNoZWNrcyBpZiBpdCBoYXMgbm9uIGVtcHR5IHNpZ25hdHVyZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRyYW5zYWN0aW9uIGlzIHNpZ25lZCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc1NpZ25lZFJhd1R4KHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkZWNvZGVkVHggPSB0aGlzLmdldERlY29kZWRUeEZyb21SYXdCYXNlNjQocmF3VHJhbnNhY3Rpb24pO1xuICAgIGlmIChkZWNvZGVkVHguc2lnbmF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHByb3RvY29sIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHB1YmxpY0tleSAtIHRoZSAgcHVibGljIGtleSB0byBiZSB2YWxpZGF0ZWRcbiAgICovXG4gIHZhbGlkYXRlUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHB1YmxpY0tleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogcHVibGljS2V5IH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBQdWJsaWMgS2V5YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzaWduIGRvYyBmcm9tIGFuIGNvc21vcyBsaWtlIHRyYW5zYWN0aW9uIEBzZWUgQ29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEBQcmVjb25kaXRpb24gY29zbW9zTGlrZVRyYW5zYWN0aW9uLmFjY291bnROdW1iZXIgYW5kIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5jaGFpbklkIG11c3QgYmUgZGVmaW5lZFxuICAgKiBAcGFyYW0ge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gY29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtTaWduRG9jfSBzaWduIGRvY1xuICAgKi9cbiAgY3JlYXRlU2lnbkRvYyhcbiAgICBjb3Ntb3NMaWtlVHJhbnNhY3Rpb246IENvc21vc0xpa2VUcmFuc2FjdGlvbixcbiAgICBhY2NvdW50TnVtYmVyOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY2hhaW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFNpZ25Eb2Mge1xuICAgIGlmICghYWNjb3VudE51bWJlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhY2NvdW50TnVtYmVyIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHNpZ24gZG9jJyk7XG4gICAgfVxuICAgIGlmICghY2hhaW5JZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFpbklkIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHNpZ24gZG9jJyk7XG4gICAgfVxuICAgIGlmICghY29zbW9zTGlrZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nvc21vc0xpa2VUcmFuc2FjdGlvbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSBzaWduIGRvYycpO1xuICAgIH1cbiAgICBjb25zdCB0eFJhdyA9IHRoaXMuY3JlYXRlVHhSYXdGcm9tQ29zbW9zTGlrZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUcmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIG1ha2VTaWduRG9jKHR4UmF3LmJvZHlCeXRlcywgdHhSYXcuYXV0aEluZm9CeXRlcywgY2hhaW5JZCwgYWNjb3VudE51bWJlcik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaGV4XG4gICAqIEBwYXJhbSBoZXhTdHJpbmcgLSBoZXggc3RyaW5nIGZvcm1hdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBzdHJpbmcgaXMgaGV4IGVsc2UgZmFsc2VcbiAgICovXG4gIGlzVmFsaWRIZXhTdHJpbmcoaGV4U3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bMC05QS1GYS1mXSokLy50ZXN0KGhleFN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlXG4gICAqIEBwYXJhbSB7V2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZX0gd2l0aGRyYXdSZXdhcmRzTWVzc2FnZSAtIFRoZSBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB2YWxpZGF0b3JBZGRyZXNzIG9yIGRlbGVnYXRvckFkZHJlc3MgaXMgaW52YWxpZCBvciBtaXNzaW5nLlxuICAgKi9cbiAgdmFsaWRhdGVXaXRoZHJhd1Jld2FyZHNNZXNzYWdlKHdpdGhkcmF3UmV3YXJkc01lc3NhZ2U6IFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UpIHtcbiAgICBpZiAoXG4gICAgICAhd2l0aGRyYXdSZXdhcmRzTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzIHx8XG4gICAgICAhdGhpcy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyh3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3MpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UgdmFsaWRhdG9yQWRkcmVzczogYCArIHdpdGhkcmF3UmV3YXJkc01lc3NhZ2UudmFsaWRhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3MgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3Mod2l0aGRyYXdSZXdhcmRzTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlIGRlbGVnYXRvckFkZHJlc3M6IGAgKyB3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdCBhcmUgbWlzc2luZyBvciBudWxsLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gVGhlIG9iamVjdCB0byBjaGVjay5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0ga2V5cyAtIEFuIGFycmF5IG9mIHByb3BlcnR5IGtleXMgdG8gY2hlY2suXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgYW55IG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyBhcmUgbWlzc2luZyBvciBudWxsLlxuICAgKi9cbiAgaXNPYmpQcm9wZXJ0eU51bGwob2JqOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBrZXlzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKG9ialtrZXldID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIG51bGwgdmFsdWUgZm9yIHByb3BlcnR5ICR7a2V5fWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZVxuICAgKiBAcGFyYW0ge0RlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZX0gZGVsZWdhdGVNZXNzYWdlIC0gVGhlIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgdmFsaWRhdG9yQWRkcmVzcywgZGVsZWdhdG9yQWRkcmVzcywgb3IgYW1vdW50IGlzIGludmFsaWQgb3IgbWlzc2luZy5cbiAgICovXG4gIHZhbGlkYXRlRGVsZWdhdGVPclVuZGVsZWdhdGVNZXNzYWdlKGRlbGVnYXRlTWVzc2FnZTogRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlKSB7XG4gICAgdGhpcy5pc09ialByb3BlcnR5TnVsbChkZWxlZ2F0ZU1lc3NhZ2UsIFsndmFsaWRhdG9yQWRkcmVzcycsICdkZWxlZ2F0b3JBZGRyZXNzJ10pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKGRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UgdmFsaWRhdG9yQWRkcmVzczogYCArIGRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoZGVsZWdhdGVNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSBkZWxlZ2F0b3JBZGRyZXNzOiBgICsgZGVsZWdhdGVNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVBbW91bnQoZGVsZWdhdGVNZXNzYWdlLmFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBNZXNzYWdlRGF0YVxuICAgKiBAcGFyYW0ge01lc3NhZ2VEYXRhfSBtZXNzYWdlRGF0YSAtIFRoZSBNZXNzYWdlRGF0YSB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgbWVzc2FnZURhdGEgaXMgaW52YWxpZCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy5cbiAgICovXG4gIHZhbGlkYXRlTWVzc2FnZURhdGEobWVzc2FnZURhdGE6IE1lc3NhZ2VEYXRhKTogdm9pZCB7XG4gICAgaWYgKG1lc3NhZ2VEYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBNZXNzYWdlRGF0YTogdW5kZWZpbmVkYCk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlRGF0YS50eXBlVXJsID09IG51bGwgfHwgdGhpcy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tVHlwZVVybChtZXNzYWdlRGF0YS50eXBlVXJsKSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgTWVzc2FnZURhdGEgdHlwZXVybDogYCArIG1lc3NhZ2VEYXRhLnR5cGVVcmwpO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZUZyb21UeXBlVXJsKG1lc3NhZ2VEYXRhLnR5cGVVcmwpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIFNlbmRNZXNzYWdlO1xuICAgICAgICB0aGlzLmlzT2JqUHJvcGVydHlOdWxsKHZhbHVlLCBbJ3RvQWRkcmVzcycsICdmcm9tQWRkcmVzcyddKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZToge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZTtcbiAgICAgICAgdGhpcy5pc09ialByb3BlcnR5TnVsbCh2YWx1ZSwgWyd2YWxpZGF0b3JBZGRyZXNzJywgJ2RlbGVnYXRvckFkZHJlc3MnXSk7XG4gICAgICAgIHRoaXMudmFsaWRhdGVBbW91bnQodmFsdWUuYW1vdW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXNzYWdlRGF0YS52YWx1ZSBhcyBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlO1xuICAgICAgICB0aGlzLmlzT2JqUHJvcGVydHlOdWxsKHZhbHVlLCBbJ3ZhbGlkYXRvckFkZHJlc3MnLCAnZGVsZWdhdG9yQWRkcmVzcyddKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgTWVzc2FnZURhdGEgVHlwZVVybCBpcyBub3Qgc3VwcG9ydGVkOiBgICsgbWVzc2FnZURhdGEudHlwZVVybCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgQ29zbW9zLWxpa2UgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7Q29zbW9zTGlrZVRyYW5zYWN0aW9ufSB0eCAtIFRoZSB0cmFuc2FjdGlvbiB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgaW52YWxpZCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy5cbiAgICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHg6IENvc21vc0xpa2VUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVTZXF1ZW5jZSh0eC5zZXF1ZW5jZSk7XG4gICAgdGhpcy52YWxpZGF0ZUdhc0J1ZGdldCh0eC5nYXNCdWRnZXQpO1xuICAgIHRoaXMudmFsaWRhdGVQdWJsaWNLZXkodHgucHVibGljS2V5KTtcbiAgICBpZiAodHguc2VuZE1lc3NhZ2VzID09PSB1bmRlZmluZWQgfHwgdHguc2VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtZXNzYWdlcyBpcyByZXF1aXJlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eC5zZW5kTWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSkgPT4gdGhpcy52YWxpZGF0ZU1lc3NhZ2VEYXRhKG1lc3NhZ2UpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENvc21vcy1saWtlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2VxdWVuY2UgLSBUaGUgc2VuZGVyIGFkZHJlc3Mgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7TWVzc2FnZURhdGFbXX0gbWVzc2FnZXMgLSBUaGUgYXJyYXkgb2YgbWVzc2FnZSBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7RmVlRGF0YX0gZ2FzQnVkZ2V0IC0gVGhlIGZlZSBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcHVibGljS2V5XSAtIFRoZSBwdWJsaWMga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VuZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lbW9dIC0gVGhlIG1lbW8gZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gUmV0dXJucyB0aGUgY3JlYXRlZCBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbi5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgY3JlYXRlZCB0cmFuc2FjdGlvbiBpcyBpbnZhbGlkLlxuICAgKi9cbiAgY3JlYXRlVHJhbnNhY3Rpb24oXG4gICAgc2VxdWVuY2U6IG51bWJlcixcbiAgICBtZXNzYWdlczogTWVzc2FnZURhdGFbXSxcbiAgICBnYXNCdWRnZXQ6IEZlZURhdGEsXG4gICAgcHVibGljS2V5Pzogc3RyaW5nLFxuICAgIG1lbW8/OiBzdHJpbmdcbiAgKTogQ29zbW9zTGlrZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBjb3Ntb3NMaWtlVHhuID0ge1xuICAgICAgc2VxdWVuY2U6IHNlcXVlbmNlLFxuICAgICAgc2VuZE1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICAgIGdhc0J1ZGdldDogZ2FzQnVkZ2V0LFxuICAgICAgcHVibGljS2V5OiBwdWJsaWNLZXksXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH07XG4gICAgdGhpcy52YWxpZGF0ZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUeG4pO1xuICAgIHJldHVybiBjb3Ntb3NMaWtlVHhuO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbiB3aXRoIGEgaGFzaC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlIC0gVGhlIHNlbmRlciBhZGRyZXNzIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge01lc3NhZ2VEYXRhW119IG1lc3NhZ2VzIC0gVGhlIGFycmF5IG9mIG1lc3NhZ2UgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0ZlZURhdGF9IGdhc0J1ZGdldCAtIFRoZSBmZWUgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3B1YmxpY0tleV0gLSBUaGUgcHVibGljIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW3NpZ25hdHVyZV0gLSBUaGUgc2lnbmF0dXJlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVtb10gLSBUaGUgbWVtbyBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7Q29zbW9zTGlrZVRyYW5zYWN0aW9ufSBSZXR1cm5zIHRoZSBjcmVhdGVkIENvc21vcy1saWtlIHRyYW5zYWN0aW9uIHdpdGggdGhlIGhhc2ggYW5kIHNpZ25hdHVyZSBpZiBwcm92aWRlZC5cbiAgICovXG4gIGNyZWF0ZVRyYW5zYWN0aW9uV2l0aEhhc2goXG4gICAgc2VxdWVuY2U6IG51bWJlcixcbiAgICBtZXNzYWdlczogTWVzc2FnZURhdGFbXSxcbiAgICBnYXNCdWRnZXQ6IEZlZURhdGEsXG4gICAgcHVibGljS2V5Pzogc3RyaW5nLFxuICAgIHNpZ25hdHVyZT86IEJ1ZmZlcixcbiAgICBtZW1vPzogc3RyaW5nXG4gICk6IENvc21vc0xpa2VUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgY29zbW9zTGlrZVR4biA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24oc2VxdWVuY2UsIG1lc3NhZ2VzLCBnYXNCdWRnZXQsIHB1YmxpY0tleSwgbWVtbyk7XG4gICAgbGV0IGhhc2ggPSBjb25zdGFudHMuVU5BVkFJTEFCTEVfVEVYVDtcbiAgICBpZiAoc2lnbmF0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkVHggPSB0aGlzLmNyZWF0ZVR4UmF3RnJvbUNvc21vc0xpa2VUcmFuc2FjdGlvbihjb3Ntb3NMaWtlVHhuKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gVHhSYXcuZnJvbVBhcnRpYWwoe1xuICAgICAgICBib2R5Qnl0ZXM6IHVuc2lnbmVkVHguYm9keUJ5dGVzLFxuICAgICAgICBhdXRoSW5mb0J5dGVzOiB1bnNpZ25lZFR4LmF1dGhJbmZvQnl0ZXMsXG4gICAgICAgIHNpZ25hdHVyZXM6IFtzaWduYXR1cmVdLFxuICAgICAgfSk7XG4gICAgICBoYXNoID0gY3J5cHRvXG4gICAgICAgIC5jcmVhdGVIYXNoKCdzaGEyNTYnKVxuICAgICAgICAudXBkYXRlKFR4UmF3LmVuY29kZShzaWduZWRUeCkuZmluaXNoKCkpXG4gICAgICAgIC5kaWdlc3QoKVxuICAgICAgICAudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgIC50b0xvY2FsZVVwcGVyQ2FzZSgnZW4tVVMnKTtcbiAgICAgIHJldHVybiB7IC4uLmNvc21vc0xpa2VUeG4sIGhhc2g6IGhhc2gsIHNpZ25hdHVyZTogc2lnbmF0dXJlIH07XG4gICAgfVxuICAgIHJldHVybiB7IC4uLmNvc21vc0xpa2VUeG4sIGhhc2g6IGhhc2ggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgYmFzZTY0IGVub2NkZWQgcmF3IHRyYW5zYWN0aW9uIHN0cmluZyBpbnRvIEBzZWUgQ29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUeCBiYXNlNjQgZW5vY2RlZCByYXcgdHJhbnNhY3Rpb24gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IERlc2VyaWFsaXplZCBjb3Ntb3NMaWtlVHJhbnNhY3Rpb25cbiAgICovXG4gIGRlc2VyaWFsaXplVHJhbnNhY3Rpb24ocmF3VHg6IHN0cmluZyk6IENvc21vc0xpa2VUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgZGVjb2RlZFR4ID0gdGhpcy5nZXREZWNvZGVkVHhGcm9tUmF3QmFzZTY0KHJhd1R4KTtcbiAgICBjb25zdCB0eXBlVXJsID0gdGhpcy5nZXRUeXBlVXJsRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIGNvbnN0IHR5cGU6IFRyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwodHlwZVVybCk7XG4gICAgbGV0IHNlbmRNZXNzYWdlRGF0YTogTWVzc2FnZURhdGFbXTtcbiAgICBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0U2VuZE1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSB8fCB0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0RGVsZWdhdGVPclVuZGVsZWdhdGVNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0V2l0aGRyYXdSZXdhcmRzTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgdHlwZVVybCk7XG4gICAgfVxuICAgIGNvbnN0IHNlcXVlbmNlID0gdGhpcy5nZXRTZXF1ZW5jZUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICBjb25zdCBnYXNCdWRnZXQgPSB0aGlzLmdldEdhc0J1ZGdldEZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSB0aGlzLmdldFB1YmxpY0tleUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBkZWNvZGVkVHguc2lnbmF0dXJlcz8uWzBdICE9PSB1bmRlZmluZWQgPyBCdWZmZXIuZnJvbShkZWNvZGVkVHguc2lnbmF0dXJlc1swXSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25XaXRoSGFzaChcbiAgICAgIHNlcXVlbmNlLFxuICAgICAgc2VuZE1lc3NhZ2VEYXRhLFxuICAgICAgZ2FzQnVkZ2V0LFxuICAgICAgcHVibGljS2V5LFxuICAgICAgc2lnbmF0dXJlLFxuICAgICAgZGVjb2RlZFR4LmJvZHk/Lm1lbW9cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbiBhcnJheSBvZiBjb2luIGFtb3VudHMuXG4gICAqIEBwYXJhbSB7Q29pbltdfSBhbW91bnRBcnJheSAtIFRoZSBhcnJheSBvZiBjb2luIGFtb3VudHMgdG8gdmFsaWRhdGUuXG4gICAqL1xuICB2YWxpZGF0ZUFtb3VudERhdGEoYW1vdW50QXJyYXk6IENvaW5bXSk6IHZvaWQge1xuICAgIGFtb3VudEFycmF5LmZvckVhY2goKGNvaW5BbW91bnQpID0+IHtcbiAgICAgIHRoaXMudmFsaWRhdGVBbW91bnQoY29pbkFtb3VudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBnYXMgbGltaXQgYW5kIGdhcyBhbW91bnQgZm9yIGEgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7RmVlRGF0YX0gZ2FzQnVkZ2V0IC0gVGhlIGdhcyBidWRnZXQgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGdhcyBidWRnZXQgaXMgaW52YWxpZC5cbiAgICovXG4gIHZhbGlkYXRlR2FzQnVkZ2V0KGdhc0J1ZGdldDogRmVlRGF0YSk6IHZvaWQge1xuICAgIGlmIChnYXNCdWRnZXQuZ2FzTGltaXQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGdhcyBsaW1pdCAnICsgZ2FzQnVkZ2V0Lmdhc0xpbWl0KTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudERhdGEoZ2FzQnVkZ2V0LmFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgc2VuZCBtZXNzYWdlIGZvciBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge1NlbmRNZXNzYWdlfSBzZW5kTWVzc2FnZSAtIFRoZSBzZW5kIG1lc3NhZ2UgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNlbmQgbWVzc2FnZSBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGVTZW5kTWVzc2FnZShzZW5kTWVzc2FnZTogU2VuZE1lc3NhZ2UpIHtcbiAgICBpZiAoIXNlbmRNZXNzYWdlLnRvQWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhzZW5kTWVzc2FnZS50b0FkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgU2VuZE1lc3NhZ2UgdG9BZGRyZXNzOiBgICsgc2VuZE1lc3NhZ2UudG9BZGRyZXNzKTtcbiAgICB9XG4gICAgaWYgKCFzZW5kTWVzc2FnZS5mcm9tQWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhzZW5kTWVzc2FnZS5mcm9tQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBTZW5kTWVzc2FnZSBmcm9tQWRkcmVzczogYCArIHNlbmRNZXNzYWdlLmZyb21BZGRyZXNzKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudERhdGEoc2VuZE1lc3NhZ2UuYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBjb2luIGFtb3VudC5cbiAgICogQHBhcmFtIHtDb2lufSBhbW91bnQgLSBUaGUgY29pbiBhbW91bnQgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvaW4gYW1vdW50IGlzIGludmFsaWQuXG4gICAqL1xuICB2YWxpZGF0ZUFtb3VudChhbW91bnQ6IENvaW4pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigndmFsaWRhdGVBbW91bnQgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBhZGRyZXNzIG1hdGNoZXMgd2l0aCByZWdleCBAc2VlIGFjY291bnRBZGRyZXNzUmVnZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZFZhbGlkYXRvckFkZHJlc3Mgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBhZGRyZXNzIG1hdGNoZXMgd2l0aCByZWdleCBAc2VlIGFjY291bnRBZGRyZXNzUmVnZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZEFkZHJlc3Mgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgQ29zbW9zVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
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