@bitgo-beta/sdk-coin-sui 3.0.3-beta.182 → 3.0.3-beta.1821

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 (196) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +7 -2
  4. package/dist/src/lib/compareTransactionBlocks.js +2 -3
  5. package/dist/src/lib/constants.d.ts +9 -2
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +18 -2
  8. package/dist/src/lib/customTransaction.js +3 -3
  9. package/dist/src/lib/customTransactionBuilder.js +5 -5
  10. package/dist/src/lib/iface.d.ts +80 -12
  11. package/dist/src/lib/iface.d.ts.map +1 -1
  12. package/dist/src/lib/iface.js +34 -5
  13. package/dist/src/lib/index.d.ts +6 -0
  14. package/dist/src/lib/index.d.ts.map +1 -1
  15. package/dist/src/lib/index.js +36 -10
  16. package/dist/src/lib/keyPair.js +24 -10
  17. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
  18. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  19. package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
  20. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
  21. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  22. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +44 -25
  23. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
  24. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  25. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
  26. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
  27. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
  28. package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
  29. package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
  30. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
  31. package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
  32. package/dist/src/lib/mystenlab/builder/index.js +6 -2
  33. package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
  34. package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
  35. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
  36. package/dist/src/lib/mystenlab/builder/utils.js +4 -4
  37. package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
  38. package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
  39. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
  40. package/dist/src/lib/mystenlab/framework/framework.js +22 -25
  41. package/dist/src/lib/mystenlab/framework/index.js +6 -2
  42. package/dist/src/lib/mystenlab/framework/sui-system-state.js +2 -2
  43. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
  44. package/dist/src/lib/mystenlab/types/coin.d.ts +13 -11
  45. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  46. package/dist/src/lib/mystenlab/types/coin.js +20 -19
  47. package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
  48. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
  49. package/dist/src/lib/mystenlab/types/common.js +22 -22
  50. package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
  51. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
  52. package/dist/src/lib/mystenlab/types/events.js +17 -17
  53. package/dist/src/lib/mystenlab/types/index.js +6 -2
  54. package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
  55. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
  56. package/dist/src/lib/mystenlab/types/normalized.js +41 -41
  57. package/dist/src/lib/mystenlab/types/objects.d.ts +51 -51
  58. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
  59. package/dist/src/lib/mystenlab/types/objects.js +96 -106
  60. package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
  61. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
  62. package/dist/src/lib/mystenlab/types/option.js +2 -3
  63. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
  64. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  65. package/dist/src/lib/mystenlab/types/sui-bcs.js +29 -5
  66. package/dist/src/lib/mystenlab/types/transactions.d.ts +625 -625
  67. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
  68. package/dist/src/lib/mystenlab/types/transactions.js +178 -194
  69. package/dist/src/lib/mystenlab/types/validator.d.ts +13 -13
  70. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
  71. package/dist/src/lib/mystenlab/types/validator.js +124 -124
  72. package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
  73. package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
  74. package/dist/src/lib/resources/walrusConfig.js +37 -0
  75. package/dist/src/lib/rpcClient.d.ts +5 -0
  76. package/dist/src/lib/rpcClient.d.ts.map +1 -0
  77. package/dist/src/lib/rpcClient.js +74 -0
  78. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  79. package/dist/src/lib/stakingBuilder.js +23 -7
  80. package/dist/src/lib/stakingTransaction.d.ts +0 -1
  81. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  82. package/dist/src/lib/stakingTransaction.js +26 -15
  83. package/dist/src/lib/tokenTransferBuilder.d.ts +66 -0
  84. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  85. package/dist/src/lib/tokenTransferBuilder.js +202 -0
  86. package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
  87. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  88. package/dist/src/lib/tokenTransferTransaction.js +272 -0
  89. package/dist/src/lib/transaction.d.ts +21 -4
  90. package/dist/src/lib/transaction.d.ts.map +1 -1
  91. package/dist/src/lib/transaction.js +129 -17
  92. package/dist/src/lib/transactionBuilder.d.ts +13 -4
  93. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  94. package/dist/src/lib/transactionBuilder.js +34 -4
  95. package/dist/src/lib/transactionBuilderFactory.d.ts +11 -2
  96. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  97. package/dist/src/lib/transactionBuilderFactory.js +32 -1
  98. package/dist/src/lib/transferBuilder.d.ts +58 -1
  99. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  100. package/dist/src/lib/transferBuilder.js +310 -24
  101. package/dist/src/lib/transferTransaction.d.ts +6 -1
  102. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  103. package/dist/src/lib/transferTransaction.js +129 -12
  104. package/dist/src/lib/unstakingBuilder.js +6 -6
  105. package/dist/src/lib/unstakingTransaction.d.ts +0 -1
  106. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
  107. package/dist/src/lib/unstakingTransaction.js +31 -17
  108. package/dist/src/lib/utils.d.ts +24 -3
  109. package/dist/src/lib/utils.d.ts.map +1 -1
  110. package/dist/src/lib/utils.js +254 -21
  111. package/dist/src/lib/walrusStakingBuilder.d.ts +66 -0
  112. package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
  113. package/dist/src/lib/walrusStakingBuilder.js +200 -0
  114. package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
  115. package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
  116. package/dist/src/lib/walrusStakingTransaction.js +269 -0
  117. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
  118. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
  119. package/dist/src/lib/walrusWithdrawStakeBuilder.js +173 -0
  120. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
  121. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
  122. package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
  123. package/dist/src/register.d.ts.map +1 -1
  124. package/dist/src/register.js +5 -1
  125. package/dist/src/sui.d.ts +46 -8
  126. package/dist/src/sui.d.ts.map +1 -1
  127. package/dist/src/sui.js +525 -37
  128. package/dist/src/suiToken.d.ts +22 -0
  129. package/dist/src/suiToken.d.ts.map +1 -0
  130. package/dist/src/suiToken.js +61 -0
  131. package/dist/src/tsui.js +1 -1
  132. package/dist/test/integration/index.d.ts +1 -0
  133. package/dist/test/integration/index.d.ts.map +1 -0
  134. package/dist/test/integration/index.js +1 -0
  135. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  136. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  137. package/dist/test/local_fullnode/RpcClient.js +111 -0
  138. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  139. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  140. package/dist/test/local_fullnode/faucet.js +17 -0
  141. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  142. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  143. package/dist/test/local_fullnode/transactions.js +190 -0
  144. package/dist/test/resources/sui.d.ts +458 -0
  145. package/dist/test/resources/sui.d.ts.map +1 -0
  146. package/dist/test/resources/sui.js +632 -0
  147. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  148. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  149. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  150. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  151. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  152. package/dist/test/unit/getBuilderFactory.js +10 -0
  153. package/dist/test/unit/keyPair.d.ts +2 -0
  154. package/dist/test/unit/keyPair.d.ts.map +1 -0
  155. package/dist/test/unit/keyPair.js +72 -0
  156. package/dist/test/unit/sui.d.ts +2 -0
  157. package/dist/test/unit/sui.d.ts.map +1 -0
  158. package/dist/test/unit/sui.js +2423 -0
  159. package/dist/test/unit/suiToken.d.ts +2 -0
  160. package/dist/test/unit/suiToken.d.ts.map +1 -0
  161. package/dist/test/unit/suiToken.js +39 -0
  162. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  163. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  164. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  165. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  166. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  167. package/dist/test/unit/transactionBuilder/stakingBuilder.js +152 -0
  168. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  169. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  170. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +255 -0
  171. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  172. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  173. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  174. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  175. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  176. package/dist/test/unit/transactionBuilder/transferBuilder.js +1055 -0
  177. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  178. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  179. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  180. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  181. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  182. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +162 -0
  183. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  184. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  185. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
  186. package/dist/test/unit/transferTransaction.d.ts +2 -0
  187. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  188. package/dist/test/unit/transferTransaction.js +94 -0
  189. package/dist/test/unit/utils.d.ts +2 -0
  190. package/dist/test/unit/utils.d.ts.map +1 -0
  191. package/dist/test/unit/utils.js +186 -0
  192. package/dist/tsconfig.tsbuildinfo +1 -0
  193. package/package.json +16 -12
  194. package/.eslintignore +0 -6
  195. package/.mocharc.yml +0 -7
  196. package/CHANGELOG.md +0 -420
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.IntentScope = exports.IntentVersion = exports.AppId = exports.Utils = exports.isImmOrOwnedObj = void 0;
6
+ exports.IntentScope = exports.IntentVersion = exports.AppId = exports.Utils = void 0;
7
+ exports.isImmOrOwnedObj = isImmOrOwnedObj;
7
8
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
9
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
10
  const constants_1 = require("./constants");
@@ -15,10 +16,13 @@ const types_1 = require("./mystenlab/types");
15
16
  const builder_1 = require("./mystenlab/builder");
16
17
  const keyPair_1 = require("./keyPair");
17
18
  const blake2b_1 = __importDefault(require("@bitgo-beta/blake2b"));
19
+ const TransactionDataBlock_1 = require("./mystenlab/builder/TransactionDataBlock");
20
+ const rpcClient_1 = require("./rpcClient");
21
+ const assert_1 = __importDefault(require("assert"));
22
+ const statics_1 = require("@bitgo-beta/statics");
18
23
  function isImmOrOwnedObj(obj) {
19
24
  return 'ImmOrOwned' in obj;
20
25
  }
21
- exports.isImmOrOwnedObj = isImmOrOwnedObj;
22
26
  class Utils {
23
27
  /** @inheritdoc */
24
28
  isValidBlockId(hash) {
@@ -30,7 +34,7 @@ class Utils {
30
34
  }
31
35
  /** @inheritdoc */
32
36
  isValidPublicKey(key) {
33
- return sdk_core_1.isValidEd25519PublicKey(key);
37
+ return (0, sdk_core_1.isValidEd25519PublicKey)(key);
34
38
  }
35
39
  /** @inheritdoc */
36
40
  isValidSignature(signature) {
@@ -48,9 +52,9 @@ class Utils {
48
52
  */
49
53
  isValidRawTransaction(rawTransaction) {
50
54
  try {
51
- const data = bcs_1.fromB64(rawTransaction);
55
+ const data = (0, bcs_1.fromB64)(rawTransaction);
52
56
  const deserialized = builder_1.builder.de('TransactionData', data);
53
- builder_1.builder.ser('TransactionData', deserialized, { maxSize: 1024 * 64 });
57
+ builder_1.builder.ser('TransactionData', deserialized, { maxSize: TransactionDataBlock_1.TRANSACTION_DATA_MAX_SIZE });
54
58
  return true;
55
59
  }
56
60
  catch (e) {
@@ -88,7 +92,7 @@ class Utils {
88
92
  * @param {string} fieldName Name of the field to validate, its needed to return which field is failing on case of error.
89
93
  */
90
94
  validateAddress(address, fieldName) {
91
- if (!address || !types_1.isValidSuiAddress(types_1.normalizeSuiAddress(address))) {
95
+ if (!address || !(0, types_1.isValidSuiAddress)((0, types_1.normalizeSuiAddress)(address))) {
92
96
  throw new sdk_core_1.BuildTransactionError(`Invalid or missing ${fieldName}, got: ${address}`);
93
97
  }
94
98
  }
@@ -124,7 +128,10 @@ class Utils {
124
128
  * @returns {boolean} - the validation result
125
129
  */
126
130
  isValidAmount(amount) {
127
- const bigNumberAmount = new bignumber_js_1.default(Number(amount));
131
+ // Build the BigNumber directly from the raw value. Wrapping in Number() first would
132
+ // truncate integers above 2^53 (e.g. large consolidation amounts in MIST), causing
133
+ // valid amounts to be mis-validated.
134
+ const bigNumberAmount = new bignumber_js_1.default(amount);
128
135
  if (!bigNumberAmount.isInteger() || bigNumberAmount.isLessThanOrEqualTo(0)) {
129
136
  return false;
130
137
  }
@@ -148,10 +155,15 @@ class Utils {
148
155
  getTransactionType(suiTransactionType) {
149
156
  switch (suiTransactionType) {
150
157
  case iface_1.SuiTransactionType.Transfer:
158
+ case iface_1.SuiTransactionType.TokenTransfer:
151
159
  return sdk_core_1.TransactionType.Send;
152
160
  case iface_1.SuiTransactionType.AddStake:
161
+ case iface_1.SuiTransactionType.WalrusStakeWithPool:
153
162
  return sdk_core_1.TransactionType.StakingAdd;
163
+ case iface_1.SuiTransactionType.WalrusRequestWithdrawStake:
164
+ return sdk_core_1.TransactionType.StakingDeactivate;
154
165
  case iface_1.SuiTransactionType.WithdrawStake:
166
+ case iface_1.SuiTransactionType.WalrusWithdrawStake:
155
167
  return sdk_core_1.TransactionType.StakingWithdraw;
156
168
  case iface_1.SuiTransactionType.CustomTx:
157
169
  return sdk_core_1.TransactionType.CustomTx;
@@ -166,8 +178,17 @@ class Utils {
166
178
  getSuiTransactionType(command) {
167
179
  switch (command.kind) {
168
180
  case 'SplitCoins':
181
+ if (command.coin.kind === 'GasCoin') {
182
+ return iface_1.SuiTransactionType.Transfer;
183
+ }
184
+ return iface_1.SuiTransactionType.TokenTransfer;
169
185
  case 'TransferObjects':
170
186
  return iface_1.SuiTransactionType.Transfer;
187
+ case 'MergeCoins':
188
+ if (command.destination.kind === 'GasCoin') {
189
+ return iface_1.SuiTransactionType.Transfer;
190
+ }
191
+ return iface_1.SuiTransactionType.TokenTransfer;
171
192
  case 'MoveCall':
172
193
  if (command.target.endsWith(iface_1.MethodNames.RequestAddStake)) {
173
194
  return iface_1.SuiTransactionType.AddStake;
@@ -179,6 +200,21 @@ class Utils {
179
200
  command.target.endsWith(iface_1.MethodNames.PublicTransfer)) {
180
201
  return iface_1.SuiTransactionType.CustomTx;
181
202
  }
203
+ else if (command.target.endsWith(iface_1.MethodNames.WalrusStakeWithPool)) {
204
+ return iface_1.SuiTransactionType.WalrusStakeWithPool;
205
+ }
206
+ else if (command.target.endsWith(iface_1.MethodNames.WalrusRequestWithdrawStake) ||
207
+ command.target.endsWith(iface_1.MethodNames.WalrusSplitStakedWal)) {
208
+ return iface_1.SuiTransactionType.WalrusRequestWithdrawStake;
209
+ }
210
+ else if (command.target.endsWith(iface_1.MethodNames.WalrusWithdrawStake)) {
211
+ return iface_1.SuiTransactionType.WalrusWithdrawStake;
212
+ }
213
+ else if (command.target.endsWith(iface_1.MethodNames.RedeemFunds)) {
214
+ // redeem_funds is a helper MoveCall used with BalanceWithdrawal to convert
215
+ // address balance into a Coin<T>; it co-exists with Transfer or TokenTransfer commands.
216
+ return iface_1.SuiTransactionType.Transfer;
217
+ }
182
218
  else {
183
219
  throw new sdk_core_1.InvalidTransactionError(`unsupported target method ${command.target}`);
184
220
  }
@@ -209,7 +245,11 @@ class Utils {
209
245
  destinations.push(this.getAddress(input));
210
246
  }
211
247
  });
212
- destinations.map((address, i) => {
248
+ // In Path 1b (sponsored, address-balance-only), after all recipient SplitCoins/TransferObjects
249
+ // there may be one extra TransferObjects that returns change to the sender. That transfer
250
+ // has no corresponding SplitCoins entry, so destinations.length may be splitResults.length+1.
251
+ // Limit the zip to splitResults.length so the change transfer is not counted as a recipient.
252
+ destinations.slice(0, splitResults.length).map((address, i) => {
213
253
  receipts.push({
214
254
  address: address,
215
255
  amount: splitResults[i].toString(),
@@ -224,7 +264,7 @@ class Utils {
224
264
  if (movingObject.kind === 'Input') {
225
265
  receipts.push({
226
266
  address: destination,
227
- amount: '0',
267
+ amount: '0', // set 0, not able to get amount merely from parsing
228
268
  data: 'unknown amount',
229
269
  });
230
270
  }
@@ -266,21 +306,83 @@ class Utils {
266
306
  };
267
307
  });
268
308
  }
309
+ getWalrusStakeWithPoolRequests(tx) {
310
+ const amounts = [];
311
+ const addresses = [];
312
+ tx.transactions.forEach((transaction, i) => {
313
+ if (transaction.kind === 'SplitCoins') {
314
+ const amountInputIdx = transaction.amounts[0].index;
315
+ amounts.push(utils.getAmount(tx.inputs[amountInputIdx]));
316
+ }
317
+ if (transaction.kind === 'MoveCall') {
318
+ const validatorAddressInputIdx = transaction.arguments[2]
319
+ .index;
320
+ const validatorAddress = utils.getAddress(tx.inputs[validatorAddressInputIdx]);
321
+ addresses.push(validatorAddress);
322
+ }
323
+ });
324
+ return addresses.map((address, index) => {
325
+ return {
326
+ validatorAddress: address,
327
+ amount: amounts[index],
328
+ };
329
+ });
330
+ }
331
+ isWalrusRequestWithdrawStakeTx(tx) {
332
+ return tx.transactions
333
+ .filter((transaction) => 'kind' in transaction && transaction.kind === 'MoveCall')
334
+ .some(({ target }) => target.endsWith('::staking::request_withdraw_stake'));
335
+ }
336
+ getWalrusWithdrawStakeRequests(tx) {
337
+ let amount = undefined;
338
+ let stakedWal;
339
+ let stakedWalInputIdx = -1;
340
+ // TS won't let us use filter
341
+ const moveCalls = [];
342
+ tx.transactions.forEach((transaction) => {
343
+ if (transaction.kind === 'MoveCall') {
344
+ moveCalls.push(transaction);
345
+ }
346
+ });
347
+ if (moveCalls.length === 1) {
348
+ // This is either request_withdraw full or withdraw full (either way, no amount)
349
+ stakedWalInputIdx = moveCalls[0].arguments[1].index;
350
+ }
351
+ else if (moveCalls.length === 2) {
352
+ // This is request_withdraw partial
353
+ const amountInputIdx = moveCalls[0].arguments[1].index;
354
+ amount = utils.getAmount(tx.inputs[amountInputIdx]);
355
+ stakedWalInputIdx = moveCalls[0].arguments[0].index;
356
+ }
357
+ else {
358
+ throw new sdk_core_1.InvalidTransactionError('Invalid number of MoveCall transactions');
359
+ }
360
+ let input = tx.inputs[stakedWalInputIdx];
361
+ if ('value' in input) {
362
+ input = input.value;
363
+ }
364
+ if ('Object' in input && isImmOrOwnedObj(input.Object)) {
365
+ stakedWal = utils.normalizeSuiObjectRef(input.Object.ImmOrOwned);
366
+ }
367
+ else {
368
+ throw new sdk_core_1.InvalidTransactionError(`Expected StakedWal object at input index ${stakedWalInputIdx}, found ${input}`);
369
+ }
370
+ return { amount, stakedWal };
371
+ }
269
372
  getAmount(input) {
270
- return sui_bcs_1.isPureArg(input)
373
+ return (0, sui_bcs_1.isPureArg)(input)
271
374
  ? builder_1.builder.de(bcs_1.BCS.U64, buffer_1.Buffer.from(new Uint16Array(input.Pure)).toString('base64'), 'base64')
272
375
  : input.value;
273
376
  }
274
377
  getAddress(input) {
275
- var _a;
276
378
  if (input.hasOwnProperty('value')) {
277
- return sui_bcs_1.isPureArg(input.value)
278
- ? types_1.normalizeSuiAddress(builder_1.builder.de(bcs_1.BCS.ADDRESS, buffer_1.Buffer.from(new Uint16Array((_a = input.value) === null || _a === void 0 ? void 0 : _a.Pure)).toString('base64'), 'base64'))
379
+ return (0, sui_bcs_1.isPureArg)(input.value)
380
+ ? (0, types_1.normalizeSuiAddress)(builder_1.builder.de(bcs_1.BCS.ADDRESS, buffer_1.Buffer.from(new Uint16Array(input.value?.Pure)).toString('base64'), 'base64'))
279
381
  : input.value;
280
382
  }
281
383
  else {
282
- return sui_bcs_1.isPureArg(input)
283
- ? types_1.normalizeSuiAddress(builder_1.builder.de(bcs_1.BCS.ADDRESS, buffer_1.Buffer.from(new Uint16Array(input.Pure)).toString('base64'), 'base64'))
384
+ return (0, sui_bcs_1.isPureArg)(input)
385
+ ? (0, types_1.normalizeSuiAddress)(builder_1.builder.de(bcs_1.BCS.ADDRESS, buffer_1.Buffer.from(new Uint16Array(input.Pure)).toString('base64'), 'base64'))
284
386
  : input.value;
285
387
  }
286
388
  }
@@ -291,7 +393,7 @@ class Utils {
291
393
  }
292
394
  normalizeSuiObjectRef(obj) {
293
395
  return {
294
- objectId: types_1.normalizeSuiObjectId(obj.objectId),
396
+ objectId: (0, types_1.normalizeSuiObjectId)(obj.objectId),
295
397
  version: Number(obj.version),
296
398
  digest: obj.digest,
297
399
  };
@@ -310,11 +412,142 @@ class Utils {
310
412
  const pubBuf = buffer_1.Buffer.from(publicKey, 'hex');
311
413
  tmp.set([keyPair_1.SIGNATURE_SCHEME_TO_FLAG['ED25519']]); // ED25519: 0x00,
312
414
  tmp.set(pubBuf, 1);
313
- return types_1.normalizeSuiAddress(blake2b_1.default(PUBLIC_KEY_SIZE)
415
+ return (0, types_1.normalizeSuiAddress)((0, blake2b_1.default)(PUBLIC_KEY_SIZE)
314
416
  .update(tmp)
315
417
  .digest('hex')
316
418
  .slice(0, constants_1.SUI_ADDRESS_LENGTH * 2));
317
419
  }
420
+ async getFeeEstimate(url, txHex) {
421
+ const result = await (0, rpcClient_1.makeRPC)(url, 'sui_dryRunTransactionBlock', [txHex]);
422
+ (0, assert_1.default)(result.effects);
423
+ (0, assert_1.default)(result.effects.gasUsed);
424
+ if (result.effects.status.status !== 'success') {
425
+ console.error(`Dry run failed, could not automatically determine a budget for txHex ${txHex}`);
426
+ throw new Error(`Failed to get fee estimate`);
427
+ }
428
+ const gasObject = result.effects.gasUsed;
429
+ const storageCost = new bignumber_js_1.default(gasObject.storageCost);
430
+ const computationCost = new bignumber_js_1.default(gasObject.computationCost);
431
+ const storageRebate = new bignumber_js_1.default(gasObject.storageRebate);
432
+ const netCost = computationCost.plus(storageCost).minus(storageRebate);
433
+ return netCost.comparedTo(computationCost) > 0 ? netCost : computationCost;
434
+ }
435
+ /**
436
+ * Returns the current epoch and chain identifier of the Sui network by making RPC calls to the provided URL.
437
+ * @param {string} url - The URL of the Sui network RPC endpoint.
438
+ * @returns {Promise<{ epoch: number; chainId: string }>} - The current epoch and chain identifier.
439
+ */
440
+ async getChainContext(url) {
441
+ const [systemState, genesisCheckpoint] = await Promise.all([
442
+ (0, rpcClient_1.makeRPC)(url, 'suix_getLatestSuiSystemState', []),
443
+ (0, rpcClient_1.makeRPC)(url, 'sui_getCheckpoint', ['0']),
444
+ ]);
445
+ return { epoch: Number(systemState.epoch), chainId: String(genesisCheckpoint.digest) };
446
+ }
447
+ async getBalance(url, owner, coinType) {
448
+ if (coinType === undefined) {
449
+ coinType = types_1.SUI_TYPE_ARG;
450
+ }
451
+ const result = await (0, rpcClient_1.makeRPC)(url, 'suix_getBalance', [owner, coinType]);
452
+ const totalBalance = (result.totalBalance ?? '0').toString();
453
+ const fundsInAddressBalance = (result.fundsInAddressBalance ?? '0').toString();
454
+ const coinObjectBalance = bignumber_js_1.default.max(0, new bignumber_js_1.default(totalBalance).minus(new bignumber_js_1.default(fundsInAddressBalance))).toString();
455
+ return {
456
+ totalBalance,
457
+ coinObjectBalance,
458
+ fundsInAddressBalance,
459
+ };
460
+ }
461
+ async getInputCoins(url, owner, coinType) {
462
+ if (coinType === undefined) {
463
+ coinType = types_1.SUI_TYPE_ARG;
464
+ }
465
+ let hasNextPage = true;
466
+ let cursor = undefined;
467
+ let params = [owner, coinType];
468
+ let data = [];
469
+ while (hasNextPage) {
470
+ if (cursor !== undefined) {
471
+ params = [owner, coinType, cursor];
472
+ }
473
+ try {
474
+ const result = await (0, rpcClient_1.makeRPC)(url, 'suix_getCoins', params);
475
+ data = data.concat(result.data);
476
+ hasNextPage = result.hasNextPage;
477
+ cursor = result.nextCursor;
478
+ }
479
+ catch (e) {
480
+ console.error(`Failed to get input coins from the node ${e}`);
481
+ throw new Error(`Failed to get input coins from the node.`);
482
+ }
483
+ }
484
+ return data
485
+ .filter((object) => object.balance !== undefined)
486
+ .map((object) => {
487
+ return {
488
+ coinType: object.coinType,
489
+ objectId: object.coinObjectId,
490
+ version: object.version,
491
+ digest: object.digest,
492
+ balance: new bignumber_js_1.default(object.balance),
493
+ };
494
+ });
495
+ }
496
+ async executeTransactionBlock(url, serializedTx, signatures) {
497
+ const reqType = 'WaitForEffectsCert';
498
+ const options = { showEffects: true };
499
+ const params = [serializedTx, signatures, options, reqType];
500
+ let result;
501
+ try {
502
+ result = await (0, rpcClient_1.makeRPC)(url, 'sui_executeTransactionBlock', params);
503
+ }
504
+ catch (e) {
505
+ throw new Error(`${e.message}`);
506
+ }
507
+ return result.digest;
508
+ }
509
+ validateNonNegativeNumber(defaultVal, errorMsg, inputVal) {
510
+ if (inputVal === undefined) {
511
+ return defaultVal;
512
+ }
513
+ let nonNegativeNum;
514
+ try {
515
+ nonNegativeNum = Number(inputVal);
516
+ }
517
+ catch (e) {
518
+ throw new Error(errorMsg);
519
+ }
520
+ if (isNaN(nonNegativeNum.valueOf()) || nonNegativeNum < 0) {
521
+ throw new Error(errorMsg);
522
+ }
523
+ return nonNegativeNum;
524
+ }
525
+ getSuiTokenFromAddress(packageId, network) {
526
+ const tokens = statics_1.coins.filter((coin) => {
527
+ return (coin instanceof statics_1.SuiCoin &&
528
+ coin.network.type === network.type &&
529
+ coin.packageId.toLowerCase() === packageId.toLowerCase());
530
+ });
531
+ const tokensArray = tokens.map((token) => token);
532
+ if (tokensArray.length >= 1) {
533
+ // there should never be two tokens with the same contract address, so we assert that here
534
+ (0, assert_1.default)(tokensArray.length === 1);
535
+ return tokensArray[0];
536
+ }
537
+ return undefined;
538
+ }
539
+ selectObjectsInDescOrderOfBalance(objs, limit) {
540
+ objs = objs.sort((a, b) => {
541
+ return b.balance.minus(a.balance).toNumber();
542
+ });
543
+ return objs.reduce((acc, obj) => {
544
+ if (limit.gt(0)) {
545
+ acc.push(obj);
546
+ limit = limit.minus(obj.balance);
547
+ }
548
+ return acc;
549
+ }, []);
550
+ }
318
551
  }
319
552
  exports.Utils = Utils;
320
553
  const utils = new Utils();
@@ -322,16 +555,16 @@ exports.default = utils;
322
555
  var AppId;
323
556
  (function (AppId) {
324
557
  AppId[AppId["Sui"] = 0] = "Sui";
325
- })(AppId = exports.AppId || (exports.AppId = {}));
558
+ })(AppId || (exports.AppId = AppId = {}));
326
559
  var IntentVersion;
327
560
  (function (IntentVersion) {
328
561
  IntentVersion[IntentVersion["V0"] = 0] = "V0";
329
- })(IntentVersion = exports.IntentVersion || (exports.IntentVersion = {}));
562
+ })(IntentVersion || (exports.IntentVersion = IntentVersion = {}));
330
563
  var IntentScope;
331
564
  (function (IntentScope) {
332
565
  IntentScope[IntentScope["TransactionData"] = 0] = "TransactionData";
333
566
  IntentScope[IntentScope["TransactionEffects"] = 1] = "TransactionEffects";
334
567
  IntentScope[IntentScope["CheckpointSummary"] = 2] = "CheckpointSummary";
335
568
  IntentScope[IntentScope["PersonalMessage"] = 3] = "PersonalMessage";
336
- })(IntentScope = exports.IntentScope || (exports.IntentScope = {}));
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVE4QjtBQUM5QixnRUFBcUM7QUFDckMsMkNBQWlEO0FBQ2pELHVEQUFzRDtBQUN0RCxxQ0FBMkM7QUFDM0MsbUNBU2lCO0FBQ2pCLG1DQUFnQztBQUNoQyw2Q0FNMkI7QUFDM0IsaURBTzZCO0FBQzdCLHVDQUFxRDtBQUNyRCxrRUFBMEM7QUFFMUMsU0FBZ0IsZUFBZSxDQUFDLEdBQTRCO0lBQzFELE9BQU8sWUFBWSxJQUFJLEdBQUcsQ0FBQztBQUM3QixDQUFDO0FBRkQsMENBRUM7QUFFRCxNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsZ0JBQWdCLENBQUMsR0FBVztRQUMxQixPQUFPLGtDQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsb0JBQW9CLENBQUMsSUFBWTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gscUJBQXFCLENBQUMsY0FBc0I7UUFDMUMsSUFBSTtZQUNGLE1BQU0sSUFBSSxHQUFHLGFBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNyQyxNQUFNLFlB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bGRUcmFuc2FjdGlvbkVycm9yLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXksXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IFNVSV9BRERSRVNTX0xFTkdUSCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGlzUHVyZUFyZyB9IGZyb20gJy4vbXlzdGVubGFiL3R5cGVzL3N1aS1iY3MnO1xuaW1wb3J0IHsgQkNTLCBmcm9tQjY0IH0gZnJvbSAnQG15c3Rlbi9iY3MnO1xuaW1wb3J0IHtcbiAgQ3VzdG9tUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24sXG4gIE1ldGhvZE5hbWVzLFxuICBSZXF1ZXN0QWRkU3Rha2UsXG4gIFN0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbixcbiAgU3VpVHJhbnNhY3Rpb24sXG4gIFN1aVRyYW5zYWN0aW9uVHlwZSxcbiAgVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbixcbiAgVW5zdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24sXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7XG4gIGlzVmFsaWRTdWlBZGRyZXNzLFxuICBub3JtYWxpemVTdWlBZGRyZXNzLFxuICBub3JtYWxpemVTdWlPYmplY3RJZCxcbiAgU3VpSnNvblZhbHVlLFxuICBTdWlPYmplY3RSZWYsXG59IGZyb20gJy4vbXlzdGVubGFiL3R5cGVzJztcbmltcG9ydCB7XG4gIGJ1aWxkZXIsXG4gIE1vdmVDYWxsVHJhbnNhY3Rpb24sXG4gIE9iamVjdENhbGxBcmcsXG4gIFNwbGl0Q29pbnNUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25CbG9ja0lucHV0LFxuICBUcmFuc2FjdGlvblR5cGUgYXMgVHJhbnNhY3Rpb25Db21tYW5kVHlwZSxcbn0gZnJvbSAnLi9teXN0ZW5sYWIvYnVpbGRlcic7XG5pbXBvcnQgeyBTSUdOQVRVUkVfU0NIRU1FX1RPX0ZMQUcgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IGJsYWtlMmIgZnJvbSAnQGJpdGdvLWJldGEvYmxha2UyYic7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ltbU9yT3duZWRPYmoob2JqOiBPYmplY3RDYWxsQXJnWydPYmplY3QnXSk6IG9iaiBpcyB7IEltbU9yT3duZWQ6IFN1aU9iamVjdFJlZiB9IHtcbiAgcmV0dXJuICdJbW1Pck93bmVkJyBpbiBvYmo7XG59XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiByYXcgdHJhbnNhY3Rpb24gY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSB0cmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nIGZvcm1hdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBmcm9tQjY0KHJhd1RyYW5zYWN0aW9uKTtcbiAgICAgIGNvbnN0IGRlc2VyaWFsaXplZCA9IGJ1aWxkZXIuZGUoJ1RyYW5zYWN0aW9uRGF0YScsIGRhdGEpO1xuICAgICAgYnVpbGRlci5zZXIoJ1RyYW5zYWN0aW9uRGF0YScsIGRlc2VyaWFsaXplZCwgeyBtYXhTaXplOiAxMDI0ICogNjQgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSByYXcgdHJhbnNhY3Rpb24gaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gVHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyAgZm9ybWF0XG4gICAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogVW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYWRkcmVzc2VzIHRvIGNoZWNrIGlmIGFsbCBleGlzdCBhbmQgYXJlIHZhbGlkIFN1aSBwdWJsaWMga2V5c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc2VzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHZhbGlkYXRlLCBpdHMgbmVlZGVkIHRvIHJldHVybiB3aGljaCBmaWVsZCBpcyBmYWlsaW5nIG9uIGNhc2Ugb2YgZXJyb3IuXG4gICAqL1xuICB2YWxpZGF0ZUFkZHJlc3NlcyhhZGRyZXNzZXM6IHN0cmluZ1tdLCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiBhZGRyZXNzZXMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MsIGZpZWxkTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhZGRyZXNzIHRvIGNoZWNrIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBTdWkgcHVibGljIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0byB2YWxpZGF0ZSwgaXRzIG5lZWRlZCB0byByZXR1cm4gd2hpY2ggZmllbGQgaXMgZmFpbGluZyBvbiBjYXNlIG9mIGVycm9yLlxuICAgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgIWlzVmFsaWRTdWlBZGRyZXNzKG5vcm1hbGl6ZVN1aUFkZHJlc3MoYWRkcmVzcykpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG9yIG1pc3NpbmcgJHtmaWVsZE5hbWV9LCBnb3Q6ICR7YWRkcmVzc31gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNIZXgoYWRkcmVzcykgJiYgdGhpcy5nZXRIZXhCeXRlTGVuZ3RoKGFkZHJlc3MpID09PSBTVUlfQUREUkVTU19MRU5HVEg7XG4gIH1cblxuICBpc0hleCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eKDB4fDBYKT9bYS1mQS1GMC05XSskLy50ZXN0KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggJSAyID09PSAwO1xuICB9XG5cbiAgZ2V0SGV4Qnl0ZUxlbmd0aCh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyByZXR1cm4gL14oMHh8MFgpLy50ZXN0KHZhbHVlKSA/ICh2YWx1ZS5sZW5ndGggLSAyKSAvIDIgOiB2YWx1ZS5sZW5ndGggLyAyO1xuICAgIHJldHVybiAvXigweHwwWCkvLnRlc3QodmFsdWUpID8gKHZhbHVlLmxlbmd0aCAtIDIpIC8gMiA6IHZhbHVlLmxlbmd0aCAvIDI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGFtb3VudHMgLSB0aGUgYW1vdW50cyB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRBbW91bnRzKGFtb3VudHM6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBhbW91bnQgb2YgYW1vdW50cykge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRBbW91bnQoYW1vdW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudFxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50cyAtIHRoZSBhbW91bnQgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihOdW1iZXIoYW1vdW50KSk7XG4gICAgaWYgKCFiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgfHwgYmlnTnVtYmVyQW1vdW50LmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBoZXggaWRzIChhZGRyZXNzZXMsIG9iamVjdCBpZHMpIHRvIGFsd2F5cyBjb250YWluIHRoZSAnMHgnIHByZWZpeC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICoqL1xuICBub3JtYWxpemVIZXhJZChpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaWQuc3RhcnRzV2l0aCgnMHgnKSA/IGlkIDogJzB4Jy5jb25jYXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFuc2FjdGlvbiB0eXBlIGJ5IGZ1bmN0aW9uIG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtNZXRob2ROYW1lc30gZmN0TmFtZVxuICAgKiBAcmV0dXJuIHtUcmFuc2FjdGlvblR5cGV9XG4gICAqL1xuICBnZXRUcmFuc2FjdGlvblR5cGUoc3VpVHJhbnNhY3Rpb25UeXBlOiBTdWlUcmFuc2FjdGlvblR5cGUpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHN3aXRjaCAoc3VpVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlcjpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2U6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZDtcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLldpdGhkcmF3U3Rha2U6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3O1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBTVUkgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge01ldGhvZE5hbWVzfSBmY3ROYW1lXG4gICAqIEByZXR1cm4ge1RyYW5zYWN0aW9uVHlwZX1cbiAgICovXG4gIGdldFN1aVRyYW5zYWN0aW9uVHlwZShjb21tYW5kOiBUcmFuc2FjdGlvbkNvbW1hbmRUeXBlKTogU3VpVHJhbnNhY3Rpb25UeXBlIHtcbiAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgY2FzZSAnU3BsaXRDb2lucyc6XG4gICAgICBjYXNlICdUcmFuc2Zlck9iamVjdHMnOlxuICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyO1xuICAgICAgY2FzZSAnTW92ZUNhbGwnOlxuICAgICAgICBpZiAoY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuUmVxdWVzdEFkZFN0YWtlKSkge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2U7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuUmVxdWVzdFdpdGhkcmF3U3Rha2UpKSB7XG4gICAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGNvbW1hbmQudGFyZ2V0LmVuZHNXaXRoKE1ldGhvZE5hbWVzLlN0YWtpbmdQb29sU3BsaXQpIHx8XG4gICAgICAgICAgY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuUHVibGljVHJhbnNmZXIpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGB1bnN1cHBvcnRlZCB0YXJnZXQgbWV0aG9kICR7Y29tbWFuZC50YXJnZXR9YCk7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24ga2luZCAke2NvbW1hbmQua2luZH1gKTtcbiAgICB9XG4gIH1cblxuICBnZXRSZWNpcGllbnRzKFxuICAgIHR4OiBTdWlUcmFuc2FjdGlvbjxcbiAgICAgIHwgVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvblxuICAgICAgfCBTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb25cbiAgICAgIHwgVW5zdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb25cbiAgICAgIHwgQ3VzdG9tUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb25cbiAgICA+XG4gICk6IFJlY2lwaWVudFtdIHtcbiAgICBjb25zdCByZWNlaXB0czogUmVjaXBpZW50W10gPSBbXTtcbiAgICBjb25zdCBzcGxpdFJlc3VsdHM6IG51bWJlcltdID0gW107XG4gICAgdHgudHgudHJhbnNhY3Rpb25zLmZvckVhY2goKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ua2luZCA9PT0gJ1NwbGl0Q29pbnMnKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdHJhbnNhY3Rpb24uYW1vdW50c1swXS5pbmRleDtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0eC50eC5pbnB1dHNbaW5kZXhdIGFzIGFueTtcbiAgICAgICAgc3BsaXRSZXN1bHRzLnB1c2godGhpcy5nZXRBbW91bnQoaW5wdXQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdNb3ZlQ2FsbCcgJiYgdHJhbnNhY3Rpb24udGFyZ2V0LmVuZHNXaXRoKE1ldGhvZE5hbWVzLlN0YWtpbmdQb29sU3BsaXQpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdHJhbnNhY3Rpb24uYXJndW1lbnRzWzFdLmluZGV4O1xuICAgICAgICBjb25zdCBpbnB1dCA9IHR4LnR4LmlucHV0c1tpbmRleF0gYXMgYW55O1xuICAgICAgICBzcGxpdFJlc3VsdHMucHVzaCh0aGlzLmdldEFtb3VudChpbnB1dCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVzdGluYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHR4LnR4LnRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdUcmFuc2Zlck9iamVjdHMnKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdHJhbnNhY3Rpb24uYWRkcmVzcy5pbmRleDtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0eC50eC5pbnB1dHNbaW5kZXhdIGFzIGFueTtcbiAgICAgICAgZGVzdGluYXRpb25zLnB1c2godGhpcy5nZXRBZGRyZXNzKGlucHV0KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZGVzdGluYXRpb25zLm1hcCgoYWRkcmVzcywgaSkgPT4ge1xuICAgICAgcmVjZWlwdHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogc3BsaXRSZXN1bHRzW2ldLnRvU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHR4LnR4LnRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdNb3ZlQ2FsbCcgJiYgdHJhbnNhY3Rpb24udGFyZ2V0LmVuZHNXaXRoKE1ldGhvZE5hbWVzLlB1YmxpY1RyYW5zZmVyKSkge1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkFyZyA9IHRyYW5zYWN0aW9uLmFyZ3VtZW50c1sxXTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25JbnB1dCA9IHR4LnR4LmlucHV0c1tkZXN0aW5hdGlvbkFyZy5pbmRleF0gYXMgYW55O1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZ2V0QWRkcmVzcyhkZXN0aW5hdGlvbklucHV0KTtcblxuICAgICAgICBjb25zdCBtb3ZpbmdPYmplY3QgPSB0cmFuc2FjdGlvbi5hcmd1bWVudHNbMF07XG4gICAgICAgIGlmIChtb3ZpbmdPYmplY3Qua2luZCA9PT0gJ0lucHV0Jykge1xuICAgICAgICAgIHJlY2VpcHRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogZGVzdGluYXRpb24sXG4gICAgICAgICAgICBhbW91bnQ6ICcwJywgLy8gc2V0IDAsIG5vdCBhYmxlIHRvIGdldCBhbW91bnQgbWVyZWx5IGZyb20gcGFyc2luZ1xuICAgICAgICAgICAgZGF0YTogJ3Vua25vd24gYW1vdW50JyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChtb3ZpbmdPYmplY3Qua2luZCA9PT0gJ1Jlc3VsdCcpIHtcbiAgICAgICAgICByZWNlaXB0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgYW1vdW50OiBzcGxpdFJlc3VsdHNbbW92aW5nT2JqZWN0LmluZGV4XS50b1N0cmluZygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVjZWlwdHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFkZCBzdGFraW5nIHJlcXVlc3RzXG4gICAqXG4gICAqIEBwYXJhbSB7U3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9ufSB0eDogc3Rha2luZyB0cmFuc2FjdGlvbiBvYmplY3RcbiAgICogQHJldHVybiB7UmVxdWVzdEFkZFN0YWtlW119ICBhZGQgc3Rha2luZyByZXF1ZXN0c1xuICAgKi9cbiAgZ2V0U3Rha2VSZXF1ZXN0cyh0eDogU3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9uKTogUmVxdWVzdEFkZFN0YWtlW10ge1xuICAgIGNvbnN0IGFtb3VudHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgYWRkcmVzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHR4LnRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbiwgaSkgPT4ge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdTcGxpdENvaW5zJykge1xuICAgICAgICBjb25zdCBhbW91bnRJbnB1dElkeCA9ICgodHJhbnNhY3Rpb24gYXMgU3BsaXRDb2luc1RyYW5zYWN0aW9uKS5hbW91bnRzWzBdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkuaW5kZXg7XG4gICAgICAgIGFtb3VudHMucHVzaCh1dGlscy5nZXRBbW91bnQodHguaW5wdXRzW2Ftb3VudElucHV0SWR4XSBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvbi5raW5kID09PSAnTW92ZUNhbGwnKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvckFkZHJlc3NJbnB1dElkeCA9ICgodHJhbnNhY3Rpb24gYXMgTW92ZUNhbGxUcmFuc2FjdGlvbikuYXJndW1lbnRzWzJdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dClcbiAgICAgICAgICAuaW5kZXg7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvckFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzKHR4LmlucHV0c1t2YWxpZGF0b3JBZGRyZXNzSW5wdXRJZHhdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCk7XG4gICAgICAgIGFkZHJlc3Nlcy5wdXNoKHZhbGlkYXRvckFkZHJlc3MpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhZGRyZXNzZXMubWFwKChhZGRyZXNzLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBhbW91bnRzW2luZGV4XSxcbiAgICAgIH0gYXMgUmVxdWVzdEFkZFN0YWtlO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0QW1vdW50KGlucHV0OiBTdWlKc29uVmFsdWUgfCBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpOiBudW1iZXIge1xuICAgIHJldHVybiBpc1B1cmVBcmcoaW5wdXQpXG4gICAgICA/IGJ1aWxkZXIuZGUoQkNTLlU2NCwgQnVmZmVyLmZyb20obmV3IFVpbnQxNkFycmF5KGlucHV0LlB1cmUpKS50b1N0cmluZygnYmFzZTY0JyksICdiYXNlNjQnKVxuICAgICAgOiAoaW5wdXQgYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KS52YWx1ZTtcbiAgfVxuXG4gIGdldEFkZHJlc3MoaW5wdXQ6IFRyYW5zYWN0aW9uQmxvY2tJbnB1dCk6IHN0cmluZyB7XG4gICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICByZXR1cm4gaXNQdXJlQXJnKGlucHV0LnZhbHVlKVxuICAgICAgICA/IG5vcm1hbGl6ZVN1aUFkZHJlc3MoXG4gICAgICAgICAgICBidWlsZGVyLmRlKEJDUy5BRERSRVNTLCBCdWZmZXIuZnJvbShuZXcgVWludDE2QXJyYXkoaW5wdXQudmFsdWU/LlB1cmUpKS50b1N0cmluZygnYmFzZTY0JyksICdiYXNlNjQnKVxuICAgICAgICAgIClcbiAgICAgICAgOiAoaW5wdXQgYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzUHVyZUFyZyhpbnB1dClcbiAgICAgICAgPyBub3JtYWxpemVTdWlBZGRyZXNzKFxuICAgICAgICAgICAgYnVpbGRlci5kZShCQ1MuQUREUkVTUywgQnVmZmVyLmZyb20obmV3IFVpbnQxNkFycmF5KGlucHV0LlB1cmUpKS50b1N0cmluZygnYmFzZTY0JyksICdiYXNlNjQnKVxuICAgICAgICAgIClcbiAgICAgICAgOiAoaW5wdXQgYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KS52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVDb2lucyhjb2luczogYW55W10pOiBTdWlPYmplY3RSZWZbXSB7XG4gICAgcmV0dXJuIGNvaW5zLm1hcCgoY29pbikgPT4ge1xuICAgICAgcmV0dXJuIHV0aWxzLm5vcm1hbGl6ZVN1aU9iamVjdFJlZihjb2luKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5vcm1hbGl6ZVN1aU9iamVjdFJlZihvYmo6IFN1aU9iamVjdFJlZik6IFN1aU9iamVjdFJlZiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9iamVjdElkOiBub3JtYWxpemVTdWlPYmplY3RJZChvYmoub2JqZWN0SWQpLFxuICAgICAgdmVyc2lvbjogTnVtYmVyKG9iai52ZXJzaW9uKSxcbiAgICAgIGRpZ2VzdDogb2JqLmRpZ2VzdCxcbiAgICB9O1xuICB9XG5cbiAgdHJhbnNhY3Rpb25JbnB1dCh0eXBlOiAnb2JqZWN0JyB8ICdwdXJlJywgaW5kZXggPSAwLCB2YWx1ZT86IHVua25vd24pOiBUcmFuc2FjdGlvbkJsb2NrSW5wdXQge1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiAnSW5wdXQnLFxuICAgICAgdmFsdWU6IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgPyBTdHJpbmcodmFsdWUpIDogdmFsdWUsXG4gICAgICBpbmRleCxcbiAgICAgIHR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIGdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBQVUJMSUNfS0VZX1NJWkUgPSAzMjtcbiAgICBjb25zdCB0bXAgPSBuZXcgVWludDhBcnJheShQVUJMSUNfS0VZX1NJWkUgKyAxKTtcbiAgICBjb25zdCBwdWJCdWYgPSBCdWZmZXIuZnJvbShwdWJsaWNLZXksICdoZXgnKTtcbiAgICB0bXAuc2V0KFtTSUdOQVRVUkVfU0NIRU1FX1RPX0ZMQUdbJ0VEMjU1MTknXV0pOyAvLyBFRDI1NTE5OiAweDAwLFxuICAgIHRtcC5zZXQocHViQnVmLCAxKTtcbiAgICByZXR1cm4gbm9ybWFsaXplU3VpQWRkcmVzcyhcbiAgICAgIGJsYWtlMmIoUFVCTElDX0tFWV9TSVpFKVxuICAgICAgICAudXBkYXRlKHRtcClcbiAgICAgICAgLmRpZ2VzdCgnaGV4JylcbiAgICAgICAgLnNsaWNlKDAsIFNVSV9BRERSRVNTX0xFTkdUSCAqIDIpXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG5cbmV4cG9ydCBlbnVtIEFwcElkIHtcbiAgU3VpID0gMCxcbn1cblxuZXhwb3J0IGVudW0gSW50ZW50VmVyc2lvbiB7XG4gIFYwID0gMCxcbn1cblxuZXhwb3J0IGVudW0gSW50ZW50U2NvcGUge1xuICBUcmFuc2FjdGlvbkRhdGEgPSAwLFxuICBUcmFuc2FjdGlvbkVmZmVjdHMgPSAxLFxuICBDaGVja3BvaW50U3VtbWFyeSA9IDIsXG4gIFBlcnNvbmFsTWVzc2FnZSA9IDMsXG59XG5cbmV4cG9ydCB0eXBlIEludGVudCA9IFtJbnRlbnRTY29wZSwgSW50ZW50VmVyc2lvbiwgQXBwSWRdO1xuIl19
569
+ })(IntentScope || (exports.IntentScope = IntentScope = {}));
570
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQW9EQSwwQ0FFQztBQXRERCxtREFROEI7QUFDOUIsZ0VBQXFDO0FBQ3JDLDJDQUFpRDtBQUNqRCx1REFBc0Q7QUFDdEQscUNBQTJDO0FBQzNDLG1DQWFpQjtBQUNqQixtQ0FBZ0M7QUFDaEMsNkNBTzJCO0FBQzNCLGlEQVE2QjtBQUM3Qix1Q0FBcUQ7QUFDckQsa0VBQTBDO0FBQzFDLG1GQUFxRjtBQUNyRiwyQ0FBc0M7QUFDdEMsb0RBQTRCO0FBQzVCLGlEQUFrRTtBQUVsRSxTQUFnQixlQUFlLENBQUMsR0FBNEI7SUFDMUQsT0FBTyxZQUFZLElBQUksR0FBRyxDQUFDO0FBQzdCLENBQUM7QUFFRCxNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsZ0JBQWdCLENBQUMsR0FBVztRQUMxQixPQUFPLElBQUEsa0NBQXVCLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxxQkFBcUIsQ0FBQyxjQUFzQjtRQUMxQyxJQUFJ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LENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLEVBQUUsRUFBcUIsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQS9qQkQsc0JBK2pCQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDMUIsa0JBQWUsS0FBSyxDQUFDO0FBRXJCLElBQVksS0FFWDtBQUZELFdBQVksS0FBSztJQUNmLCtCQUFPLENBQUE7QUFDVCxDQUFDLEVBRlcsS0FBSyxxQkFBTCxLQUFLLFFBRWhCO0FBRUQsSUFBWSxhQUVYO0FBRkQsV0FBWSxhQUFhO0lBQ3ZCLDZDQUFNLENBQUE7QUFDUixDQUFDLEVBRlcsYUFBYSw2QkFBYixhQUFhLFFBRXhCO0FBRUQsSUFBWSxXQUtYO0FBTEQsV0FBWSxXQUFXO0lBQ3JCLG1FQUFtQixDQUFBO0lBQ25CLHlFQUFzQixDQUFBO0lBQ3RCLHVFQUFxQixDQUFBO0lBQ3JCLG1FQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFMVyxXQUFXLDJCQUFYLFdBQVcsUUFLdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlVXRpbHMsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBTVUlfQUREUkVTU19MRU5HVEggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc1B1cmVBcmcgfSBmcm9tICcuL215c3RlbmxhYi90eXBlcy9zdWktYmNzJztcbmltcG9ydCB7IEJDUywgZnJvbUI2NCB9IGZyb20gJ0BteXN0ZW4vYmNzJztcbmltcG9ydCB7XG4gIE1ldGhvZE5hbWVzLFxuICBSZXF1ZXN0QWRkU3Rha2UsXG4gIFJlcXVlc3RXYWxydXNTdGFrZVdpdGhQb29sLFxuICBSZXF1ZXN0V2FscnVzV2l0aGRyYXdTdGFrZSxcbiAgU3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9uLFxuICBXYWxydXNTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24sXG4gIFdhbHJ1c1dpdGhkcmF3U3Rha2VQcm9ncmFtbWFibGVUcmFuc2FjdGlvbixcbiAgU3VpQmFsYW5jZUluZm8sXG4gIFN1aU9iamVjdEluZm8sXG4gIFN1aVByb2dyYW1tYWJsZVRyYW5zYWN0aW9uLFxuICBTdWlUcmFuc2FjdGlvbixcbiAgU3VpVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQge1xuICBpc1ZhbGlkU3VpQWRkcmVzcyxcbiAgbm9ybWFsaXplU3VpQWRkcmVzcyxcbiAgbm9ybWFsaXplU3VpT2JqZWN0SWQsXG4gIFNVSV9UWVBFX0FSRyxcbiAgU3VpSnNvblZhbHVlLFxuICBTdWlPYmplY3RSZWYsXG59IGZyb20gJy4vbXlzdGVubGFiL3R5cGVzJztcbmltcG9ydCB7XG4gIGJ1aWxkZXIsXG4gIE1lcmdlQ29pbnNUcmFuc2FjdGlvbixcbiAgTW92ZUNhbGxUcmFuc2FjdGlvbixcbiAgT2JqZWN0Q2FsbEFyZyxcbiAgU3BsaXRDb2luc1RyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkJsb2NrSW5wdXQsXG4gIFRyYW5zYWN0aW9uVHlwZSBhcyBUcmFuc2FjdGlvbkNvbW1hbmRUeXBlLFxufSBmcm9tICcuL215c3RlbmxhYi9idWlsZGVyJztcbmltcG9ydCB7IFNJR05BVFVSRV9TQ0hFTUVfVE9fRkxBRyB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgYmxha2UyYiBmcm9tICdAYml0Z28tYmV0YS9ibGFrZTJiJztcbmltcG9ydCB7IFRSQU5TQUNUSU9OX0RBVEFfTUFYX1NJWkUgfSBmcm9tICcuL215c3RlbmxhYi9idWlsZGVyL1RyYW5zYWN0aW9uRGF0YUJsb2NrJztcbmltcG9ydCB7IG1ha2VSUEMgfSBmcm9tICcuL3JwY0NsaWVudCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCYXNlTmV0d29yaywgY29pbnMsIFN1aUNvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW1tT3JPd25lZE9iaihvYmo6IE9iamVjdENhbGxBcmdbJ09iamVjdCddKTogb2JqIGlzIHsgSW1tT3JPd25lZDogU3VpT2JqZWN0UmVmIH0ge1xuICByZXR1cm4gJ0ltbU9yT3duZWQnIGluIG9iajtcbn1cblxuZXhwb3J0IGNsYXNzIFV0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5KGtleSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHJhdyB0cmFuc2FjdGlvbiBjYW4gYmUgZGVzZXJpYWxpemVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIHRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgZm9ybWF0XG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGZyb21CNjQocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gYnVpbGRlci5kZSgnVHJhbnNhY3Rpb25EYXRhJywgZGF0YSk7XG4gICAgICBidWlsZGVyLnNlcignVHJhbnNhY3Rpb25EYXRhJywgZGVzZXJpYWxpemVkLCB7IG1heFNpemU6IFRSQU5TQUNUSU9OX0RBVEFfTUFYX1NJWkUgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoZSByYXcgdHJhbnNhY3Rpb24gaGFzIGEgdmFsaWQgZm9ybWF0IGluIHRoZSBibG9ja2NoYWluIGNvbnRleHQsIHRocm93IG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uIC0gVHJhbnNhY3Rpb24gaW4gYmFzZTY0IHN0cmluZyAgZm9ybWF0XG4gICAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogVW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYWRkcmVzc2VzIHRvIGNoZWNrIGlmIGFsbCBleGlzdCBhbmQgYXJlIHZhbGlkIFN1aSBwdWJsaWMga2V5c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc2VzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lIE5hbWUgb2YgdGhlIGZpZWxkIHRvIHZhbGlkYXRlLCBpdHMgbmVlZGVkIHRvIHJldHVybiB3aGljaCBmaWVsZCBpcyBmYWlsaW5nIG9uIGNhc2Ugb2YgZXJyb3IuXG4gICAqL1xuICB2YWxpZGF0ZUFkZHJlc3NlcyhhZGRyZXNzZXM6IHN0cmluZ1tdLCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiBhZGRyZXNzZXMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MsIGZpZWxkTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhZGRyZXNzIHRvIGNoZWNrIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBTdWkgcHVibGljIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0byB2YWxpZGF0ZSwgaXRzIG5lZWRlZCB0byByZXR1cm4gd2hpY2ggZmllbGQgaXMgZmFpbGluZyBvbiBjYXNlIG9mIGVycm9yLlxuICAgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgIWlzVmFsaWRTdWlBZGRyZXNzKG5vcm1hbGl6ZVN1aUFkZHJlc3MoYWRkcmVzcykpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG9yIG1pc3NpbmcgJHtmaWVsZE5hbWV9LCBnb3Q6ICR7YWRkcmVzc31gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNIZXgoYWRkcmVzcykgJiYgdGhpcy5nZXRIZXhCeXRlTGVuZ3RoKGFkZHJlc3MpID09PSBTVUlfQUREUkVTU19MRU5HVEg7XG4gIH1cblxuICBpc0hleCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eKDB4fDBYKT9bYS1mQS1GMC05XSskLy50ZXN0KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggJSAyID09PSAwO1xuICB9XG5cbiAgZ2V0SGV4Qnl0ZUxlbmd0aCh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyByZXR1cm4gL14oMHh8MFgpLy50ZXN0KHZhbHVlKSA/ICh2YWx1ZS5sZW5ndGggLSAyKSAvIDIgOiB2YWx1ZS5sZW5ndGggLyAyO1xuICAgIHJldHVybiAvXigweHwwWCkvLnRlc3QodmFsdWUpID8gKHZhbHVlLmxlbmd0aCAtIDIpIC8gMiA6IHZhbHVlLmxlbmd0aCAvIDI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGFtb3VudHMgLSB0aGUgYW1vdW50cyB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRBbW91bnRzKGFtb3VudHM6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBhbW91bnQgb2YgYW1vdW50cykge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRBbW91bnQoYW1vdW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudFxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gYW1vdW50cyAtIHRoZSBhbW91bnQgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gQnVpbGQgdGhlIEJpZ051bWJlciBkaXJlY3RseSBmcm9tIHRoZSByYXcgdmFsdWUuIFdyYXBwaW5nIGluIE51bWJlcigpIGZpcnN0IHdvdWxkXG4gICAgLy8gdHJ1bmNhdGUgaW50ZWdlcnMgYWJvdmUgMl41MyAoZS5nLiBsYXJnZSBjb25zb2xpZGF0aW9uIGFtb3VudHMgaW4gTUlTVCksIGNhdXNpbmdcbiAgICAvLyB2YWxpZCBhbW91bnRzIHRvIGJlIG1pcy12YWxpZGF0ZWQuXG4gICAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICAgIGlmICghYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpIHx8IGJpZ051bWJlckFtb3VudC5pc0xlc3NUaGFuT3JFcXVhbFRvKDApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgaGV4IGlkcyAoYWRkcmVzc2VzLCBvYmplY3QgaWRzKSB0byBhbHdheXMgY29udGFpbiB0aGUgJzB4JyBwcmVmaXguXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqKi9cbiAgbm9ybWFsaXplSGV4SWQoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoJzB4JykgPyBpZCA6ICcweCcuY29uY2F0KGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gdHlwZSBieSBmdW5jdGlvbiBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7TWV0aG9kTmFtZXN9IGZjdE5hbWVcbiAgICogQHJldHVybiB7VHJhbnNhY3Rpb25UeXBlfVxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25UeXBlKHN1aVRyYW5zYWN0aW9uVHlwZTogU3VpVHJhbnNhY3Rpb25UeXBlKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICBzd2l0Y2ggKHN1aVRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXI6XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5Ub2tlblRyYW5zZmVyOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5BZGRTdGFrZTpcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1N0YWtlV2l0aFBvb2w6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZDtcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1JlcXVlc3RXaXRoZHJhd1N0YWtlOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuV2l0aGRyYXdTdGFrZTpcbiAgICAgIGNhc2UgU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1dpdGhkcmF3U3Rha2U6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3O1xuICAgICAgY2FzZSBTdWlUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBTVUkgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge01ldGhvZE5hbWVzfSBmY3ROYW1lXG4gICAqIEByZXR1cm4ge1RyYW5zYWN0aW9uVHlwZX1cbiAgICovXG4gIGdldFN1aVRyYW5zYWN0aW9uVHlwZShjb21tYW5kOiBUcmFuc2FjdGlvbkNvbW1hbmRUeXBlKTogU3VpVHJhbnNhY3Rpb25UeXBlIHtcbiAgICBzd2l0Y2ggKGNvbW1hbmQua2luZCkge1xuICAgICAgY2FzZSAnU3BsaXRDb2lucyc6XG4gICAgICAgIGlmICgoY29tbWFuZCBhcyBTcGxpdENvaW5zVHJhbnNhY3Rpb24pLmNvaW4ua2luZCA9PT0gJ0dhc0NvaW4nKSB7XG4gICAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLlRva2VuVHJhbnNmZXI7XG4gICAgICBjYXNlICdUcmFuc2Zlck9iamVjdHMnOlxuICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyO1xuICAgICAgY2FzZSAnTWVyZ2VDb2lucyc6XG4gICAgICAgIGlmICgoY29tbWFuZCBhcyBNZXJnZUNvaW5zVHJhbnNhY3Rpb24pLmRlc3RpbmF0aW9uLmtpbmQgPT09ICdHYXNDb2luJykge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5Ub2tlblRyYW5zZmVyO1xuICAgICAgY2FzZSAnTW92ZUNhbGwnOlxuICAgICAgICBpZiAoY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuUmVxdWVzdEFkZFN0YWtlKSkge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuQWRkU3Rha2U7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuUmVxdWVzdFdpdGhkcmF3U3Rha2UpKSB7XG4gICAgICAgICAgcmV0dXJuIFN1aVRyYW5zYWN0aW9uVHlwZS5XaXRoZHJhd1N0YWtlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGNvbW1hbmQudGFyZ2V0LmVuZHNXaXRoKE1ldGhvZE5hbWVzLlN0YWtpbmdQb29sU3BsaXQpIHx8XG4gICAgICAgICAgY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuUHVibGljVHJhbnNmZXIpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuV2FscnVzU3Rha2VXaXRoUG9vbCkpIHtcbiAgICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1N0YWtlV2l0aFBvb2w7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuV2FscnVzUmVxdWVzdFdpdGhkcmF3U3Rha2UpIHx8XG4gICAgICAgICAgY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuV2FscnVzU3BsaXRTdGFrZWRXYWwpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuV2FscnVzUmVxdWVzdFdpdGhkcmF3U3Rha2U7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuV2FscnVzV2l0aGRyYXdTdGFrZSkpIHtcbiAgICAgICAgICByZXR1cm4gU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1dpdGhkcmF3U3Rha2U7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuUmVkZWVtRnVuZHMpKSB7XG4gICAgICAgICAgLy8gcmVkZWVtX2Z1bmRzIGlzIGEgaGVscGVyIE1vdmVDYWxsIHVzZWQgd2l0aCBCYWxhbmNlV2l0aGRyYXdhbCB0byBjb252ZXJ0XG4gICAgICAgICAgLy8gYWRkcmVzcyBiYWxhbmNlIGludG8gYSBDb2luPFQ+OyBpdCBjby1leGlzdHMgd2l0aCBUcmFuc2ZlciBvciBUb2tlblRyYW5zZmVyIGNvbW1hbmRzLlxuICAgICAgICAgIHJldHVybiBTdWlUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGB1bnN1cHBvcnRlZCB0YXJnZXQgbWV0aG9kICR7Y29tbWFuZC50YXJnZXR9YCk7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24ga2luZCAke2NvbW1hbmQua2luZH1gKTtcbiAgICB9XG4gIH1cblxuICBnZXRSZWNpcGllbnRzKHR4OiBTdWlUcmFuc2FjdGlvbjxTdWlQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4pOiBSZWNpcGllbnRbXSB7XG4gICAgY29uc3QgcmVjZWlwdHM6IFJlY2lwaWVudFtdID0gW107XG4gICAgY29uc3Qgc3BsaXRSZXN1bHRzOiBudW1iZXJbXSA9IFtdO1xuICAgIHR4LnR4LnRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdTcGxpdENvaW5zJykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRyYW5zYWN0aW9uLmFtb3VudHNbMF0uaW5kZXg7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdHgudHguaW5wdXRzW2luZGV4XSBhcyBhbnk7XG4gICAgICAgIHNwbGl0UmVzdWx0cy5wdXNoKHRoaXMuZ2V0QW1vdW50KGlucHV0KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cmFuc2FjdGlvbi5raW5kID09PSAnTW92ZUNhbGwnICYmIHRyYW5zYWN0aW9uLnRhcmdldC5lbmRzV2l0aChNZXRob2ROYW1lcy5TdGFraW5nUG9vbFNwbGl0KSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRyYW5zYWN0aW9uLmFyZ3VtZW50c1sxXS5pbmRleDtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0eC50eC5pbnB1dHNbaW5kZXhdIGFzIGFueTtcbiAgICAgICAgc3BsaXRSZXN1bHRzLnB1c2godGhpcy5nZXRBbW91bnQoaW5wdXQpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGRlc3RpbmF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICB0eC50eC50cmFuc2FjdGlvbnMuZm9yRWFjaCgodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGlmICh0cmFuc2FjdGlvbi5raW5kID09PSAnVHJhbnNmZXJPYmplY3RzJykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRyYW5zYWN0aW9uLmFkZHJlc3MuaW5kZXg7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdHgudHguaW5wdXRzW2luZGV4XSBhcyBhbnk7XG4gICAgICAgIGRlc3RpbmF0aW9ucy5wdXNoKHRoaXMuZ2V0QWRkcmVzcyhpbnB1dCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIEluIFBhdGggMWIgKHNwb25zb3JlZCwgYWRkcmVzcy1iYWxhbmNlLW9ubHkpLCBhZnRlciBhbGwgcmVjaXBpZW50IFNwbGl0Q29pbnMvVHJhbnNmZXJPYmplY3RzXG4gICAgLy8gdGhlcmUgbWF5IGJlIG9uZSBleHRyYSBUcmFuc2Zlck9iamVjdHMgdGhhdCByZXR1cm5zIGNoYW5nZSB0byB0aGUgc2VuZGVyLiAgVGhhdCB0cmFuc2ZlclxuICAgIC8vIGhhcyBubyBjb3JyZXNwb25kaW5nIFNwbGl0Q29pbnMgZW50cnksIHNvIGRlc3RpbmF0aW9ucy5sZW5ndGggbWF5IGJlIHNwbGl0UmVzdWx0cy5sZW5ndGgrMS5cbiAgICAvLyBMaW1pdCB0aGUgemlwIHRvIHNwbGl0UmVzdWx0cy5sZW5ndGggc28gdGhlIGNoYW5nZSB0cmFuc2ZlciBpcyBub3QgY291bnRlZCBhcyBhIHJlY2lwaWVudC5cbiAgICBkZXN0aW5hdGlvbnMuc2xpY2UoMCwgc3BsaXRSZXN1bHRzLmxlbmd0aCkubWFwKChhZGRyZXNzLCBpKSA9PiB7XG4gICAgICByZWNlaXB0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBzcGxpdFJlc3VsdHNbaV0udG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdHgudHgudHJhbnNhY3Rpb25zLmZvckVhY2goKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ua2luZCA9PT0gJ01vdmVDYWxsJyAmJiB0cmFuc2FjdGlvbi50YXJnZXQuZW5kc1dpdGgoTWV0aG9kTmFtZXMuUHVibGljVHJhbnNmZXIpKSB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQXJnID0gdHJhbnNhY3Rpb24uYXJndW1lbnRzWzFdO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbklucHV0ID0gdHgudHguaW5wdXRzW2Rlc3RpbmF0aW9uQXJnLmluZGV4XSBhcyBhbnk7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5nZXRBZGRyZXNzKGRlc3RpbmF0aW9uSW5wdXQpO1xuXG4gICAgICAgIGNvbnN0IG1vdmluZ09iamVjdCA9IHRyYW5zYWN0aW9uLmFyZ3VtZW50c1swXTtcbiAgICAgICAgaWYgKG1vdmluZ09iamVjdC5raW5kID09PSAnSW5wdXQnKSB7XG4gICAgICAgICAgcmVjZWlwdHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgIGFtb3VudDogJzAnLCAvLyBzZXQgMCwgbm90IGFibGUgdG8gZ2V0IGFtb3VudCBtZXJlbHkgZnJvbSBwYXJzaW5nXG4gICAgICAgICAgICBkYXRhOiAndW5rbm93biBhbW91bnQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG1vdmluZ09iamVjdC5raW5kID09PSAnUmVzdWx0Jykge1xuICAgICAgICAgIHJlY2VpcHRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogZGVzdGluYXRpb24sXG4gICAgICAgICAgICBhbW91bnQ6IHNwbGl0UmVzdWx0c1ttb3ZpbmdPYmplY3QuaW5kZXhdLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZWNlaXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWRkIHN0YWtpbmcgcmVxdWVzdHNcbiAgICpcbiAgICogQHBhcmFtIHtTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb259IHR4OiBzdGFraW5nIHRyYW5zYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtSZXF1ZXN0QWRkU3Rha2VbXX0gIGFkZCBzdGFraW5nIHJlcXVlc3RzXG4gICAqL1xuICBnZXRTdGFrZVJlcXVlc3RzKHR4OiBTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24pOiBSZXF1ZXN0QWRkU3Rha2VbXSB7XG4gICAgY29uc3QgYW1vdW50czogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBhZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHgudHJhbnNhY3Rpb25zLmZvckVhY2goKHRyYW5zYWN0aW9uLCBpKSA9PiB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ua2luZCA9PT0gJ1NwbGl0Q29pbnMnKSB7XG4gICAgICAgIGNvbnN0IGFtb3VudElucHV0SWR4ID0gKCh0cmFuc2FjdGlvbiBhcyBTcGxpdENvaW5zVHJhbnNhY3Rpb24pLmFtb3VudHNbMF0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KS5pbmRleDtcbiAgICAgICAgYW1vdW50cy5wdXNoKHV0aWxzLmdldEFtb3VudCh0eC5pbnB1dHNbYW1vdW50SW5wdXRJZHhdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkpO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdNb3ZlQ2FsbCcpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yQWRkcmVzc0lucHV0SWR4ID0gKCh0cmFuc2FjdGlvbiBhcyBNb3ZlQ2FsbFRyYW5zYWN0aW9uKS5hcmd1bWVudHNbMl0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KVxuICAgICAgICAgIC5pbmRleDtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yQWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3ModHguaW5wdXRzW3ZhbGlkYXRvckFkZHJlc3NJbnB1dElkeF0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KTtcbiAgICAgICAgYWRkcmVzc2VzLnB1c2godmFsaWRhdG9yQWRkcmVzcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGFtb3VudHNbaW5kZXhdLFxuICAgICAgfSBhcyBSZXF1ZXN0QWRkU3Rha2U7XG4gICAgfSk7XG4gIH1cblxuICBnZXRXYWxydXNTdGFrZVdpdGhQb29sUmVxdWVzdHModHg6IFdhbHJ1c1N0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbik6IFJlcXVlc3RXYWxydXNTdGFrZVdpdGhQb29sW10ge1xuICAgIGNvbnN0IGFtb3VudHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgYWRkcmVzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHR4LnRyYW5zYWN0aW9ucy5mb3JFYWNoKCh0cmFuc2FjdGlvbiwgaSkgPT4ge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLmtpbmQgPT09ICdTcGxpdENvaW5zJykge1xuICAgICAgICBjb25zdCBhbW91bnRJbnB1dElkeCA9ICgodHJhbnNhY3Rpb24gYXMgU3BsaXRDb2luc1RyYW5zYWN0aW9uKS5hbW91bnRzWzBdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkuaW5kZXg7XG4gICAgICAgIGFtb3VudHMucHVzaCh1dGlscy5nZXRBbW91bnQodHguaW5wdXRzW2Ftb3VudElucHV0SWR4XSBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvbi5raW5kID09PSAnTW92ZUNhbGwnKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvckFkZHJlc3NJbnB1dElkeCA9ICgodHJhbnNhY3Rpb24gYXMgTW92ZUNhbGxUcmFuc2FjdGlvbikuYXJndW1lbnRzWzJdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dClcbiAgICAgICAgICAuaW5kZXg7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvckFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzKHR4LmlucHV0c1t2YWxpZGF0b3JBZGRyZXNzSW5wdXRJZHhdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCk7XG4gICAgICAgIGFkZHJlc3Nlcy5wdXNoKHZhbGlkYXRvckFkZHJlc3MpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhZGRyZXNzZXMubWFwKChhZGRyZXNzLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBhbW91bnRzW2luZGV4XSxcbiAgICAgIH0gYXMgUmVxdWVzdFdhbHJ1c1N0YWtlV2l0aFBvb2w7XG4gICAgfSk7XG4gIH1cblxuICBpc1dhbHJ1c1JlcXVlc3RXaXRoZHJhd1N0YWtlVHgodHg6IFdhbHJ1c1dpdGhkcmF3U3Rha2VQcm9ncmFtbWFibGVUcmFuc2FjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eC50cmFuc2FjdGlvbnNcbiAgICAgIC5maWx0ZXIoKHRyYW5zYWN0aW9uKSA9PiAna2luZCcgaW4gdHJhbnNhY3Rpb24gJiYgdHJhbnNhY3Rpb24ua2luZCA9PT0gJ01vdmVDYWxsJylcbiAgICAgIC5zb21lKCh7IHRhcmdldCB9KSA9PiB0YXJnZXQuZW5kc1dpdGgoJzo6c3Rha2luZzo6cmVxdWVzdF93aXRoZHJhd19zdGFrZScpKTtcbiAgfVxuXG4gIGdldFdhbHJ1c1dpdGhkcmF3U3Rha2VSZXF1ZXN0cyh0eDogV2FscnVzV2l0aGRyYXdTdGFrZVByb2dyYW1tYWJsZVRyYW5zYWN0aW9uKTogUmVxdWVzdFdhbHJ1c1dpdGhkcmF3U3Rha2Uge1xuICAgIGxldCBhbW91bnQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgc3Rha2VkV2FsOiBTdWlPYmplY3RSZWY7XG4gICAgbGV0IHN0YWtlZFdhbElucHV0SWR4ID0gLTE7XG5cbiAgICAvLyBUUyB3b24ndCBsZXQgdXMgdXNlIGZpbHRlclxuICAgIGNvbnN0IG1vdmVDYWxsczogTW92ZUNhbGxUcmFuc2FjdGlvbltdID0gW107XG4gICAgdHgudHJhbnNhY3Rpb25zLmZvckVhY2goKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ua2luZCA9PT0gJ01vdmVDYWxsJykge1xuICAgICAgICBtb3ZlQ2FsbHMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobW92ZUNhbGxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gVGhpcyBpcyBlaXRoZXIgcmVxdWVzdF93aXRoZHJhdyBmdWxsIG9yIHdpdGhkcmF3IGZ1bGwgKGVpdGhlciB3YXksIG5vIGFtb3VudClcbiAgICAgIHN0YWtlZFdhbElucHV0SWR4ID0gKChtb3ZlQ2FsbHNbMF0gYXMgTW92ZUNhbGxUcmFuc2FjdGlvbikuYXJndW1lbnRzWzFdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkuaW5kZXg7XG4gICAgfSBlbHNlIGlmIChtb3ZlQ2FsbHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAvLyBUaGlzIGlzIHJlcXVlc3Rfd2l0aGRyYXcgcGFydGlhbFxuICAgICAgY29uc3QgYW1vdW50SW5wdXRJZHggPSAoKG1vdmVDYWxsc1swXSBhcyBNb3ZlQ2FsbFRyYW5zYWN0aW9uKS5hcmd1bWVudHNbMV0gYXMgVHJhbnNhY3Rpb25CbG9ja0lucHV0KS5pbmRleDtcbiAgICAgIGFtb3VudCA9IHV0aWxzLmdldEFtb3VudCh0eC5pbnB1dHNbYW1vdW50SW5wdXRJZHhdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCk7XG5cbiAgICAgIHN0YWtlZFdhbElucHV0SWR4ID0gKChtb3ZlQ2FsbHNbMF0gYXMgTW92ZUNhbGxUcmFuc2FjdGlvbikuYXJndW1lbnRzWzBdIGFzIFRyYW5zYWN0aW9uQmxvY2tJbnB1dCkuaW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBudW1iZXIgb2YgTW92ZUNhbGwgdHJhbnNhY3Rpb25zJyk7XG4gICAgfVxuXG4gICAgbGV0IGlucHV0ID0gdHguaW5wdXRzW3N0YWtlZFdhbElucHV0SWR4XTtcbiAgICBpZiAoJ3ZhbHVlJyBpbiBpbnB1dCkge1xuICAgICAgaW5wdXQgPSBpbnB1dC52YWx1ZTtcbiAgICB9XG4gICAgaWYgKCdPYmplY3QnIGluIGlucHV0ICYmIGlzSW1tT3JPd25lZE9iaihpbnB1dC5PYmplY3QpKSB7XG4gICAgICBzdGFrZWRXYWwgPSB1dGlscy5ub3JtYWxpemVTdWlPYmplY3RSZWYoaW5wdXQuT2JqZWN0LkltbU9yT3duZWQgYXMgU3VpT2JqZWN0UmVmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgU3Rha2VkV2FsIG9iamVjdCBhdCBpbnB1dCBpbmRleCAke3N0YWtlZFdhbElucHV0SWR4fSwgZm91bmQgJHtpbnB1dH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7IGFtb3VudCwgc3Rha2VkV2FsIH07XG4gIH1cblxuICBnZXRBbW91bnQoaW5wdXQ6IFN1aUpzb25WYWx1ZSB8IFRyYW5zYWN0aW9uQmxvY2tJbnB1dCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGlzUHVyZUFyZyhpbnB1dClcbiAgICAgID8gYnVpbGRlci5kZShCQ1MuVTY0LCBCdWZmZXIuZnJvbShuZXcgVWludDE2QXJyYXkoaW5wdXQuUHVyZSkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgJ2Jhc2U2NCcpXG4gICAgICA6IChpbnB1dCBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpLnZhbHVlO1xuICB9XG5cbiAgZ2V0QWRkcmVzcyhpbnB1dDogVHJhbnNhY3Rpb25CbG9ja0lucHV0KTogc3RyaW5nIHtcbiAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHJldHVybiBpc1B1cmVBcmcoaW5wdXQudmFsdWUpXG4gICAgICAgID8gbm9ybWFsaXplU3VpQWRkcmVzcyhcbiAgICAgICAgICAgIGJ1aWxkZXIuZGUoQkNTLkFERFJFU1MsIEJ1ZmZlci5mcm9tKG5ldyBVaW50MTZBcnJheShpbnB1dC52YWx1ZT8uUHVyZSkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgJ2Jhc2U2NCcpXG4gICAgICAgICAgKVxuICAgICAgICA6IChpbnB1dCBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNQdXJlQXJnKGlucHV0KVxuICAgICAgICA/IG5vcm1hbGl6ZVN1aUFkZHJlc3MoXG4gICAgICAgICAgICBidWlsZGVyLmRlKEJDUy5BRERSRVNTLCBCdWZmZXIuZnJvbShuZXcgVWludDE2QXJyYXkoaW5wdXQuUHVyZSkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgJ2Jhc2U2NCcpXG4gICAgICAgICAgKVxuICAgICAgICA6IChpbnB1dCBhcyBUcmFuc2FjdGlvbkJsb2NrSW5wdXQpLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZUNvaW5zKGNvaW5zOiBhbnlbXSk6IFN1aU9iamVjdFJlZltdIHtcbiAgICByZXR1cm4gY29pbnMubWFwKChjb2luKSA9PiB7XG4gICAgICByZXR1cm4gdXRpbHMubm9ybWFsaXplU3VpT2JqZWN0UmVmKGNvaW4pO1xuICAgIH0pO1xuICB9XG5cbiAgbm9ybWFsaXplU3VpT2JqZWN0UmVmKG9iajogU3VpT2JqZWN0UmVmKTogU3VpT2JqZWN0UmVmIHtcbiAgICByZXR1cm4ge1xuICAgICAgb2JqZWN0SWQ6IG5vcm1hbGl6ZVN1aU9iamVjdElkKG9iai5vYmplY3RJZCksXG4gICAgICB2ZXJzaW9uOiBOdW1iZXIob2JqLnZlcnNpb24pLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH07XG4gIH1cblxuICB0cmFuc2FjdGlvbklucHV0KHR5cGU6ICdvYmplY3QnIHwgJ3B1cmUnLCBpbmRleCA9IDAsIHZhbHVlPzogdW5rbm93bik6IFRyYW5zYWN0aW9uQmxvY2tJbnB1dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdJbnB1dCcsXG4gICAgICB2YWx1ZTogdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyA/IFN0cmluZyh2YWx1ZSkgOiB2YWx1ZSxcbiAgICAgIGluZGV4LFxuICAgICAgdHlwZSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IFBVQkxJQ19LRVlfU0laRSA9IDMyO1xuICAgIGNvbnN0IHRtcCA9IG5ldyBVaW50OEFycmF5KFBVQkxJQ19LRVlfU0laRSArIDEpO1xuICAgIGNvbnN0IHB1YkJ1ZiA9IEJ1ZmZlci5mcm9tKHB1YmxpY0tleSwgJ2hleCcpO1xuICAgIHRtcC5zZXQoW1NJR05BVFVSRV9TQ0hFTUVfVE9fRkxBR1snRUQyNTUxOSddXSk7IC8vIEVEMjU1MTk6IDB4MDAsXG4gICAgdG1wLnNldChwdWJCdWYsIDEpO1xuICAgIHJldHVybiBub3JtYWxpemVTdWlBZGRyZXNzKFxuICAgICAgYmxha2UyYihQVUJMSUNfS0VZX1NJWkUpXG4gICAgICAgIC51cGRhdGUodG1wKVxuICAgICAgICAuZGlnZXN0KCdoZXgnKVxuICAgICAgICAuc2xpY2UoMCwgU1VJX0FERFJFU1NfTEVOR1RIICogMilcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0RmVlRXN0aW1hdGUodXJsOiBzdHJpbmcsIHR4SGV4OiBzdHJpbmcpOiBQcm9taXNlPEJpZ051bWJlcj4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1ha2VSUEModXJsLCAnc3VpX2RyeVJ1blRyYW5zYWN0aW9uQmxvY2snLCBbdHhIZXhdKTtcbiAgICBhc3NlcnQocmVzdWx0LmVmZmVjdHMpO1xuICAgIGFzc2VydChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkKTtcblxuICAgIGlmIChyZXN1bHQuZWZmZWN0cy5zdGF0dXMuc3RhdHVzICE9PSAnc3VjY2VzcycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYERyeSBydW4gZmFpbGVkLCBjb3VsZCBub3QgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgYSBidWRnZXQgZm9yIHR4SGV4ICR7dHhIZXh9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZXQgZmVlIGVzdGltYXRlYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FzT2JqZWN0ID0gcmVzdWx0LmVmZmVjdHMuZ2FzVXNlZDtcblxuICAgIGNvbnN0IHN0b3JhZ2VDb3N0ID0gbmV3IEJpZ051bWJlcihnYXNPYmplY3Quc3RvcmFnZUNvc3QpO1xuICAgIGNvbnN0IGNvbXB1dGF0aW9uQ29zdCA9IG5ldyBCaWdOdW1iZXIoZ2FzT2JqZWN0LmNvbXB1dGF0aW9uQ29zdCk7XG4gICAgY29uc3Qgc3RvcmFnZVJlYmF0ZSA9IG5ldyBCaWdOdW1iZXIoZ2FzT2JqZWN0LnN0b3JhZ2VSZWJhdGUpO1xuICAgIGNvbnN0IG5ldENvc3QgPSBjb21wdXRhdGlvbkNvc3QucGx1cyhzdG9yYWdlQ29zdCkubWludXMoc3RvcmFnZVJlYmF0ZSk7XG5cbiAgICByZXR1cm4gbmV0Q29zdC5jb21wYXJlZFRvKGNvbXB1dGF0aW9uQ29zdCkgPiAwID8gbmV0Q29zdCA6IGNvbXB1dGF0aW9uQ29zdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGVwb2NoIGFuZCBjaGFpbiBpZGVudGlmaWVyIG9mIHRoZSBTdWkgbmV0d29yayBieSBtYWtpbmcgUlBDIGNhbGxzIHRvIHRoZSBwcm92aWRlZCBVUkwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIG9mIHRoZSBTdWkgbmV0d29yayBSUEMgZW5kcG9pbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHsgZXBvY2g6IG51bWJlcjsgY2hhaW5JZDogc3RyaW5nIH0+fSAtIFRoZSBjdXJyZW50IGVwb2NoIGFuZCBjaGFpbiBpZGVudGlmaWVyLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q2hhaW5Db250ZXh0KHVybDogc3RyaW5nKTogUHJvbWlzZTx7IGVwb2NoOiBudW1iZXI7IGNoYWluSWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgW3N5c3RlbVN0YXRlLCBnZW5lc2lzQ2hlY2twb2ludF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBtYWtlUlBDKHVybCwgJ3N1aXhfZ2V0TGF0ZXN0U3VpU3lzdGVtU3RhdGUnLCBbXSksXG4gICAgICBtYWtlUlBDKHVybCwgJ3N1aV9nZXRDaGVja3BvaW50JywgWycwJ10pLFxuICAgIF0pO1xuICAgIHJldHVybiB7IGVwb2NoOiBOdW1iZXIoc3lzdGVtU3RhdGUuZXBvY2gpLCBjaGFpbklkOiBTdHJpbmcoZ2VuZXNpc0NoZWNrcG9pbnQuZGlnZXN0KSB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0QmFsYW5jZSh1cmw6IHN0cmluZywgb3duZXI6IHN0cmluZywgY29pblR5cGU/OiBzdHJpbmcpOiBQcm9taXNlPFN1aUJhbGFuY2VJbmZvPiB7XG4gICAgaWYgKGNvaW5UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvaW5UeXBlID0gU1VJX1RZUEVfQVJHO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtYWtlUlBDKHVybCwgJ3N1aXhfZ2V0QmFsYW5jZScsIFtvd25lciwgY29pblR5cGVdKTtcbiAgICBjb25zdCB0b3RhbEJhbGFuY2UgPSAocmVzdWx0LnRvdGFsQmFsYW5jZSA/PyAnMCcpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgZnVuZHNJbkFkZHJlc3NCYWxhbmNlID0gKHJlc3VsdC5mdW5kc0luQWRkcmVzc0JhbGFuY2UgPz8gJzAnKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGNvaW5PYmplY3RCYWxhbmNlID0gQmlnTnVtYmVyLm1heChcbiAgICAgIDAsXG4gICAgICBuZXcgQmlnTnVtYmVyKHRvdGFsQmFsYW5jZSkubWludXMobmV3IEJpZ051bWJlcihmdW5kc0luQWRkcmVzc0JhbGFuY2UpKVxuICAgICkudG9TdHJpbmcoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxCYWxhbmNlLFxuICAgICAgY29pbk9iamVjdEJhbGFuY2UsXG4gICAgICBmdW5kc0luQWRkcmVzc0JhbGFuY2UsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldElucHV0Q29pbnModXJsOiBzdHJpbmcsIG93bmVyOiBzdHJpbmcsIGNvaW5UeXBlPzogc3RyaW5nKTogUHJvbWlzZTxTdWlPYmplY3RJbmZvW10+IHtcbiAgICBpZiAoY29pblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29pblR5cGUgPSBTVUlfVFlQRV9BUkc7XG4gICAgfVxuICAgIGxldCBoYXNOZXh0UGFnZSA9IHRydWU7XG4gICAgbGV0IGN1cnNvciA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcGFyYW1zID0gW293bmVyLCBjb2luVHlwZV07XG4gICAgbGV0IGRhdGEgPSBbXTtcbiAgICB3aGlsZSAoaGFzTmV4dFBhZ2UpIHtcbiAgICAgIGlmIChjdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbXMgPSBbb3duZXIsIGNvaW5UeXBlLCBjdXJzb3JdO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWFrZVJQQyh1cmwsICdzdWl4X2dldENvaW5zJywgcGFyYW1zKTtcbiAgICAgICAgZGF0YSA9IGRhdGEuY29uY2F0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgaGFzTmV4dFBhZ2UgPSByZXN1bHQuaGFzTmV4dFBhZ2U7XG4gICAgICAgIGN1cnNvciA9IHJlc3VsdC5uZXh0Q3Vyc29yO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGlucHV0IGNvaW5zIGZyb20gdGhlIG5vZGUgJHtlfWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZXQgaW5wdXQgY29pbnMgZnJvbSB0aGUgbm9kZS5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgICAgIC5maWx0ZXIoKG9iamVjdDogYW55KSA9PiBvYmplY3QuYmFsYW5jZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgob2JqZWN0OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2luVHlwZTogb2JqZWN0LmNvaW5UeXBlLFxuICAgICAgICAgIG9iamVjdElkOiBvYmplY3QuY29pbk9iamVjdElkLFxuICAgICAgICAgIHZlcnNpb246IG9iamVjdC52ZXJzaW9uLFxuICAgICAgICAgIGRpZ2VzdDogb2JqZWN0LmRpZ2VzdCxcbiAgICAgICAgICBiYWxhbmNlOiBuZXcgQmlnTnVtYmVyKG9iamVjdC5iYWxhbmNlKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVRyYW5zYWN0aW9uQmxvY2sodXJsOiBzdHJpbmcsIHNlcmlhbGl6ZWRUeDogc3RyaW5nLCBzaWduYXR1cmVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcmVxVHlwZSA9ICdXYWl0Rm9yRWZmZWN0c0NlcnQnO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHNob3dFZmZlY3RzOiB0cnVlIH07XG4gICAgY29uc3QgcGFyYW1zID0gW3NlcmlhbGl6ZWRUeCwgc2lnbmF0dXJlcywgb3B0aW9ucywgcmVxVHlwZV07XG4gICAgbGV0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgbWFrZVJQQyh1cmwsICdzdWlfZXhlY3V0ZVRyYW5zYWN0aW9uQmxvY2snLCBwYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuZGlnZXN0O1xuICB9XG5cbiAgdmFsaWRhdGVOb25OZWdhdGl2ZU51bWJlcihkZWZhdWx0VmFsOiBudW1iZXIsIGVycm9yTXNnOiBzdHJpbmcsIGlucHV0VmFsPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoaW5wdXRWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWw7XG4gICAgfVxuICAgIGxldCBub25OZWdhdGl2ZU51bTogbnVtYmVyO1xuICAgIHRyeSB7XG4gICAgICBub25OZWdhdGl2ZU51bSA9IE51bWJlcihpbnB1dFZhbCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKG5vbk5lZ2F0aXZlTnVtLnZhbHVlT2YoKSkgfHwgbm9uTmVnYXRpdmVOdW0gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuICAgIH1cbiAgICByZXR1cm4gbm9uTmVnYXRpdmVOdW07XG4gIH1cblxuICBnZXRTdWlUb2tlbkZyb21BZGRyZXNzKHBhY2thZ2VJZDogc3RyaW5nLCBuZXR3b3JrOiBCYXNlTmV0d29yaykge1xuICAgIGNvbnN0IHRva2VucyA9IGNvaW5zLmZpbHRlcigoY29pbikgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29pbiBpbnN0YW5jZW9mIFN1aUNvaW4gJiZcbiAgICAgICAgY29pbi5uZXR3b3JrLnR5cGUgPT09IG5ldHdvcmsudHlwZSAmJlxuICAgICAgICBjb2luLnBhY2thZ2VJZC50b0xvd2VyQ2FzZSgpID09PSBwYWNrYWdlSWQudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBjb25zdCB0b2tlbnNBcnJheSA9IHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbik7XG4gICAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICAgIGFzc2VydCh0b2tlbnNBcnJheS5sZW5ndGggPT09IDEpO1xuICAgICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgc2VsZWN0T2JqZWN0c0luRGVzY09yZGVyT2ZCYWxhbmNlKG9ianM6IFN1aU9iamVjdEluZm9bXSwgbGltaXQ6IEJpZ051bWJlcik6IFN1aU9iamVjdEluZm9bXSB7XG4gICAgb2JqcyA9IG9ianMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgcmV0dXJuIGIuYmFsYW5jZS5taW51cyhhLmJhbGFuY2UpLnRvTnVtYmVyKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ianMucmVkdWNlKChhY2MsIG9iaikgPT4ge1xuICAgICAgaWYgKGxpbWl0Lmd0KDApKSB7XG4gICAgICAgIGFjYy5wdXNoKG9iaik7XG4gICAgICAgIGxpbWl0ID0gbGltaXQubWludXMob2JqLmJhbGFuY2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSBhcyBTdWlPYmplY3RJbmZvW10pO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKCk7XG5leHBvcnQgZGVmYXVsdCB1dGlscztcblxuZXhwb3J0IGVudW0gQXBwSWQge1xuICBTdWkgPSAwLFxufVxuXG5leHBvcnQgZW51bSBJbnRlbnRWZXJzaW9uIHtcbiAgVjAgPSAwLFxufVxuXG5leHBvcnQgZW51bSBJbnRlbnRTY29wZSB7XG4gIFRyYW5zYWN0aW9uRGF0YSA9IDAsXG4gIFRyYW5zYWN0aW9uRWZmZWN0cyA9IDEsXG4gIENoZWNrcG9pbnRTdW1tYXJ5ID0gMixcbiAgUGVyc29uYWxNZXNzYWdlID0gMyxcbn1cblxuZXhwb3J0IHR5cGUgSW50ZW50ID0gW0ludGVudFNjb3BlLCBJbnRlbnRWZXJzaW9uLCBBcHBJZF07XG4iXX0=