@bitgo/account-lib 2.17.2-rc.1 → 2.17.2-rc.5

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 (96) hide show
  1. package/dist/browser/bitgo-account-lib.min.js +1 -1
  2. package/dist/browser/bitgo-account-lib.min.js.LICENSE.txt +4 -0
  3. package/dist/package.json +7 -3
  4. package/dist/src/coin/algo/utils.d.ts +39 -22
  5. package/dist/src/coin/algo/utils.d.ts.map +1 -1
  6. package/dist/src/coin/algo/utils.js +88 -73
  7. package/dist/src/coin/baseCoin/baseTransaction.d.ts +6 -0
  8. package/dist/src/coin/baseCoin/baseTransaction.d.ts.map +1 -1
  9. package/dist/src/coin/baseCoin/baseTransaction.js +8 -1
  10. package/dist/src/coin/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
  11. package/dist/src/coin/baseCoin/baseTransactionBuilder.js +1 -1
  12. package/dist/src/coin/baseCoin/iface.d.ts +37 -0
  13. package/dist/src/coin/baseCoin/iface.d.ts.map +1 -1
  14. package/dist/src/coin/baseCoin/iface.js +1 -1
  15. package/dist/src/coin/cspr/utils.js +2 -2
  16. package/dist/src/coin/dot/errors.d.ts +3 -0
  17. package/dist/src/coin/dot/errors.d.ts.map +1 -1
  18. package/dist/src/coin/dot/errors.js +12 -2
  19. package/dist/src/coin/dot/iface.d.ts +13 -13
  20. package/dist/src/coin/dot/iface.d.ts.map +1 -1
  21. package/dist/src/coin/dot/iface.js +1 -1
  22. package/dist/src/coin/dot/index.d.ts +6 -0
  23. package/dist/src/coin/dot/index.d.ts.map +1 -1
  24. package/dist/src/coin/dot/index.js +14 -2
  25. package/dist/src/coin/dot/keyPair.d.ts +15 -2
  26. package/dist/src/coin/dot/keyPair.d.ts.map +1 -1
  27. package/dist/src/coin/dot/keyPair.js +41 -6
  28. package/dist/src/coin/dot/stakingBuilder.d.ts +2 -2
  29. package/dist/src/coin/dot/stakingBuilder.d.ts.map +1 -1
  30. package/dist/src/coin/dot/stakingBuilder.js +2 -7
  31. package/dist/src/coin/dot/transaction.d.ts +37 -3
  32. package/dist/src/coin/dot/transaction.d.ts.map +1 -1
  33. package/dist/src/coin/dot/transaction.js +345 -7
  34. package/dist/src/coin/dot/transactionBuilder.d.ts +106 -10
  35. package/dist/src/coin/dot/transactionBuilder.d.ts.map +1 -1
  36. package/dist/src/coin/dot/transactionBuilder.js +311 -15
  37. package/dist/src/coin/dot/transactionBuilderFactory.d.ts +12 -16
  38. package/dist/src/coin/dot/transactionBuilderFactory.d.ts.map +1 -1
  39. package/dist/src/coin/dot/transactionBuilderFactory.js +60 -25
  40. package/dist/src/coin/dot/transferBuilder.d.ts +62 -4
  41. package/dist/src/coin/dot/transferBuilder.d.ts.map +1 -1
  42. package/dist/src/coin/dot/transferBuilder.js +158 -44
  43. package/dist/src/coin/dot/txnSchema.d.ts.map +1 -1
  44. package/dist/src/coin/dot/txnSchema.js +1 -2
  45. package/dist/src/coin/dot/unstakeBuilder.d.ts +4 -4
  46. package/dist/src/coin/dot/unstakeBuilder.d.ts.map +1 -1
  47. package/dist/src/coin/dot/unstakeBuilder.js +4 -9
  48. package/dist/src/coin/dot/utils.d.ts +69 -0
  49. package/dist/src/coin/dot/utils.d.ts.map +1 -1
  50. package/dist/src/coin/dot/utils.js +144 -4
  51. package/dist/src/coin/dot/walletInitializationBuilder.d.ts +51 -5
  52. package/dist/src/coin/dot/walletInitializationBuilder.d.ts.map +1 -1
  53. package/dist/src/coin/dot/walletInitializationBuilder.js +108 -45
  54. package/dist/src/coin/sol/constants.d.ts +24 -0
  55. package/dist/src/coin/sol/constants.d.ts.map +1 -0
  56. package/dist/src/coin/sol/constants.js +35 -0
  57. package/dist/src/coin/sol/iface.d.ts +55 -0
  58. package/dist/src/coin/sol/iface.d.ts.map +1 -1
  59. package/dist/src/coin/sol/iface.js +3 -1
  60. package/dist/src/coin/sol/instructionParamsFactory.d.ts +12 -0
  61. package/dist/src/coin/sol/instructionParamsFactory.d.ts.map +1 -0
  62. package/dist/src/coin/sol/instructionParamsFactory.js +99 -0
  63. package/dist/src/coin/sol/keyPair.d.ts +32 -6
  64. package/dist/src/coin/sol/keyPair.d.ts.map +1 -1
  65. package/dist/src/coin/sol/keyPair.js +107 -29
  66. package/dist/src/coin/sol/solInstructionFactory.d.ts +10 -0
  67. package/dist/src/coin/sol/solInstructionFactory.d.ts.map +1 -0
  68. package/dist/src/coin/sol/solInstructionFactory.js +102 -0
  69. package/dist/src/coin/sol/transaction.d.ts +36 -17
  70. package/dist/src/coin/sol/transaction.d.ts.map +1 -1
  71. package/dist/src/coin/sol/transaction.js +311 -20
  72. package/dist/src/coin/sol/transactionBuilder.d.ts +64 -4
  73. package/dist/src/coin/sol/transactionBuilder.d.ts.map +1 -1
  74. package/dist/src/coin/sol/transactionBuilder.js +212 -10
  75. package/dist/src/coin/sol/transactionBuilderFactory.d.ts +13 -3
  76. package/dist/src/coin/sol/transactionBuilderFactory.d.ts.map +1 -1
  77. package/dist/src/coin/sol/transactionBuilderFactory.js +36 -6
  78. package/dist/src/coin/sol/transferBuilder.d.ts +15 -8
  79. package/dist/src/coin/sol/transferBuilder.d.ts.map +1 -1
  80. package/dist/src/coin/sol/transferBuilder.js +62 -15
  81. package/dist/src/coin/sol/utils.d.ts +84 -2
  82. package/dist/src/coin/sol/utils.d.ts.map +1 -1
  83. package/dist/src/coin/sol/utils.js +162 -6
  84. package/dist/src/coin/sol/walletInitializationBuilder.d.ts +15 -8
  85. package/dist/src/coin/sol/walletInitializationBuilder.d.ts.map +1 -1
  86. package/dist/src/coin/sol/walletInitializationBuilder.js +61 -13
  87. package/dist/src/index.d.ts +2 -0
  88. package/dist/src/index.d.ts.map +1 -1
  89. package/dist/src/index.js +6 -2
  90. package/dist/src/utils/crypto.d.ts +8 -0
  91. package/dist/src/utils/crypto.d.ts.map +1 -1
  92. package/dist/src/utils/crypto.js +13 -2
  93. package/package.json +7 -3
  94. package/resources/dot/index.ts +2 -0
  95. package/resources/dot/mainnet.ts +2 -0
  96. package/resources/dot/westend.ts +2 -0
@@ -223,6 +223,10 @@ PERFORMANCE OF THIS SOFTWARE.
223
223
 
224
224
  /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
225
225
 
226
+ /*! micro-base - MIT License (c) 2021 Paul Miller (paulmillr.com) */
227
+
228
+ /*! noble-hashes - MIT License (c) 2021 Paul Miller (paulmillr.com) */
229
+
226
230
  /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
227
231
 
228
232
  /**
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo/account-lib",
3
- "version": "2.17.2-rc.1",
3
+ "version": "2.17.2-rc.5",
4
4
  "description": "BitGo's account library functions",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
@@ -36,15 +36,19 @@
36
36
  "dependencies": {
37
37
  "@bitgo/blake2b": "^3.0.1",
38
38
  "@bitgo/bls": "^0.1.0",
39
- "@bitgo/statics": "^6.15.1-rc.1",
39
+ "@bitgo/statics": "^6.15.1-rc.5",
40
40
  "@celo/contractkit": "^1.2.4",
41
41
  "@ethereumjs/common": "^2.4.0",
42
42
  "@ethereumjs/tx": "^3.3.0",
43
43
  "@hashgraph/sdk": "~2.3.0",
44
+ "@polkadot/api": "^6.6.1",
45
+ "@polkadot/keyring": "^8.0.5",
44
46
  "@solana/web3.js": "^1.30.2",
45
47
  "@stablelib/hex": "^1.0.0",
46
48
  "@stablelib/sha384": "^1.0.0",
47
49
  "@stacks/transactions": "2.0.1",
50
+ "@substrate/txwrapper-core": "^1.2.19",
51
+ "@substrate/txwrapper-polkadot": "^1.2.19",
48
52
  "@taquito/local-forging": "6.3.5-beta.0",
49
53
  "@taquito/signer": "6.3.5-beta.0",
50
54
  "@types/lodash": "^4.14.151",
@@ -112,5 +116,5 @@
112
116
  "git add"
113
117
  ]
114
118
  },
115
- "gitHead": "e1dfa18a2913bcfcdd45792f0152594636adf5be"
119
+ "gitHead": "2bfb3d25cea4f5557420b3bc074a9c0fc349ac01"
116
120
  }
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import algosdk from 'algosdk';
3
3
  import { BaseUtils } from '../baseCoin';
4
- import { EncodedTx, Address, Seed } from './ifaces';
4
+ import { Address, EncodedTx, Seed } from './ifaces';
5
5
  import { KeyPair } from './keyPair';
6
6
  export declare class Utils implements BaseUtils {
7
7
  /** @inheritdoc */
@@ -15,10 +15,10 @@ export declare class Utils implements BaseUtils {
15
15
  /**
16
16
  * Returns an hex string of the given buffer
17
17
  *
18
- * @param {Buffer | Uint8Array} buffer - the buffer to be converted to hex
18
+ * @param {Uint8Array} buffer - the buffer to be converted to hex
19
19
  * @returns {string} - the hex value
20
20
  */
21
- toHex(buffer: Buffer | Uint8Array): string;
21
+ toHex(buffer: Uint8Array): string;
22
22
  /** @inheritdoc */
23
23
  isValidSignature(signature: string): boolean;
24
24
  /** @inheritdoc */
@@ -55,12 +55,12 @@ export declare class Utils implements BaseUtils {
55
55
  /**
56
56
  * decodeSeed decodes an algo seed
57
57
  *
58
- * Decoding algo seed is sane as decoding address.
59
- * Latest version of algo sdk (1.9, at this writing) does not expose explicit method for decoding seed
60
- * hence, this routine uses decodeAddress and changes the return structure
58
+ * Decoding algo seed is same as decoding address.
59
+ * Latest version of algo sdk (1.9, at this writing) does not expose explicit method for decoding seed.
60
+ * Parameter is decoded and split into seed and checksum.
61
61
  *
62
- * @param {string} seed - the seed to be validated.
63
- * @returns {Seed} - the object Seed
62
+ * @param {string} seed - hex or base64 encoded seed to be validated
63
+ * @returns {Seed} - validated object Seed
64
64
  */
65
65
  decodeSeed(seed: string): Seed;
66
66
  /**
@@ -102,6 +102,20 @@ export declare class Utils implements BaseUtils {
102
102
  * @returns {EncodedTx} The decoded transaction.
103
103
  */
104
104
  decodeAlgoTxn(txnBytes: Uint8Array | string): EncodedTx;
105
+ /**
106
+ * Try to decode a signed Algo transaction
107
+ * @param buffer the encoded transaction
108
+ * @returns { EncodedTx } the decoded signed transaction
109
+ * @throws error if it is not a valid encoded signed transaction
110
+ */
111
+ tryToDecodeSignedTransaction(buffer: Buffer): EncodedTx;
112
+ /**
113
+ * Try to decode an unsigned Algo transaction
114
+ * @param buffer the encoded transaction
115
+ * @returns {EncodedTx} the decoded unsigned transaction
116
+ * @throws error if it is not a valid encoded unsigned transaction
117
+ */
118
+ tryToDecodeUnsignedTransaction(buffer: Buffer): EncodedTx;
105
119
  encodeObj(obj: Record<string | number | symbol, any>): Uint8Array;
106
120
  /**
107
121
  * decodeObj takes a Uint8Array and returns its javascript obj
@@ -110,7 +124,7 @@ export declare class Utils implements BaseUtils {
110
124
  */
111
125
  decodeObj(o: ArrayLike<number>): unknown;
112
126
  /**
113
- * secretKeyToMnemonic take an Algorant secret key and returns the corressponding mnemonic
127
+ * secretKeyToMnemonic takes an Algorant secret key and returns the corresponding mnemonic
114
128
  *
115
129
  * @param sk - Algorant secret key
116
130
  * @return Secret key is associated mnemonic
@@ -146,14 +160,14 @@ export declare class Utils implements BaseUtils {
146
160
  */
147
161
  protected mnemonicFromSeed(seed: Uint8Array): string;
148
162
  /**
149
- * isValidEd25519PublicKeyStellar validate the key with the stellar-sdk
163
+ * Validates the key with the stellar-sdk
150
164
  *
151
165
  * @param publicKey
152
- * @returns booldean
166
+ * @returns boolean
153
167
  */
154
168
  protected isValidEd25519PublicKeyStellar(publicKey: string): boolean;
155
169
  /**
156
- * decodeEd25519PublicKeyStellar decode the key with the stellar-sdk
170
+ * Decodes the key with the stellar-sdk
157
171
  *
158
172
  * @param publicKey
159
173
  * @returns Buffer
@@ -167,25 +181,25 @@ export declare class Utils implements BaseUtils {
167
181
  */
168
182
  convertFromStellarSeed(seed: string): string;
169
183
  /**
170
- * encodeAddress return an addres encoding with algosdk
184
+ * Returns an address encoded with algosdk
171
185
  *
172
186
  * @param addr
173
187
  * @returns string
174
188
  */
175
- encodeAddress(addr: Buffer): string;
189
+ encodeAddress(addr: Uint8Array): string;
176
190
  /**
177
- * decodeAddress return an addres decoding with algosdk
191
+ * Return an address decoded with algosdk
178
192
  *
179
193
  * @param addr
180
194
  * @returns Address
181
195
  */
182
196
  decodeAddress(addr: string): Address;
183
197
  /**
184
- *stellarAddressToAlgoAddress returns an address algo of algo
185
- *if is sent an xmlAddress if it does not return the same address.
198
+ * Converts an address into an ALGO one
199
+ * If the given data is a Stellar address or public key, it is converted to ALGO address.
186
200
  *
187
- * @param addressOrPubKey
188
- * @returns address algo string
201
+ * @param addressOrPubKey an ALGO address, or an Stellar address or public key
202
+ * @returns address algo address string
189
203
  */
190
204
  stellarAddressToAlgoAddress(addressOrPubKey: string): string;
191
205
  /**
@@ -216,9 +230,12 @@ export declare class Utils implements BaseUtils {
216
230
  */
217
231
  getMultisigTxID(txBase64: string): string;
218
232
  /**
219
- * returns if a tx is an enable or disable token tx
220
- * @param tx - tx in JSON format
221
- * @returns true if it's a token tx
233
+ * Determines if a given transaction data is to enable or disable a token
234
+ * @param amount the amount in transaction
235
+ * @param from the originated address
236
+ * @param to the target address
237
+ * @param closeRemainderTo (optional) address to send remaining units in originated address
238
+ * @returns 'enableToken' or 'disableToken'
222
239
  */
223
240
  getTokenTxType(amount: string, from: string, to: string, closeRemainderTo?: string): string;
224
241
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/coin/algo/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/coin/algo/utils.ts"],"names":[],"mappings":"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"}
@@ -42,7 +42,7 @@ var ALGORAND_SEED_BYTE_LENGTH = 36;
42
42
  var ALGORAND_TRANSACTION_LENGTH = 52;
43
43
  var SEED_BYTES_LENGTH = 32;
44
44
  /**
45
- * Determines whether the string is a composed of hex chars only.
45
+ * Determines whether the string is only composed of hex chars.
46
46
  *
47
47
  * @param {string} maybe The string to be validated.
48
48
  * @returns {boolean} true if the string consists of only hex characters, otherwise false.
@@ -53,9 +53,9 @@ function allHexChars(maybe) {
53
53
  /**
54
54
  * ConcatArrays takes two array and returns a joint array of both
55
55
  *
56
- * @param a {Buffer}
57
- * @param b {Buffer}
58
- * @returns {Uint8Array} [a,b]
56
+ * @param a {Uint8Array} first array to concat
57
+ * @param b {Uint8Array} second array
58
+ * @returns {Uint8Array} a new array containing all elements of 'a' followed by all elements of 'b'
59
59
  */
60
60
  function concatArrays(a, b) {
61
61
  var c = new Uint8Array(a.length + b.length);
@@ -88,7 +88,7 @@ var Utils = /** @class */ (function () {
88
88
  /**
89
89
  * Returns an hex string of the given buffer
90
90
  *
91
- * @param {Buffer | Uint8Array} buffer - the buffer to be converted to hex
91
+ * @param {Uint8Array} buffer - the buffer to be converted to hex
92
92
  * @returns {string} - the hex value
93
93
  */
94
94
  Utils.prototype.toHex = function (buffer) {
@@ -162,12 +162,12 @@ var Utils = /** @class */ (function () {
162
162
  /**
163
163
  * decodeSeed decodes an algo seed
164
164
  *
165
- * Decoding algo seed is sane as decoding address.
166
- * Latest version of algo sdk (1.9, at this writing) does not expose explicit method for decoding seed
167
- * hence, this routine uses decodeAddress and changes the return structure
165
+ * Decoding algo seed is same as decoding address.
166
+ * Latest version of algo sdk (1.9, at this writing) does not expose explicit method for decoding seed.
167
+ * Parameter is decoded and split into seed and checksum.
168
168
  *
169
- * @param {string} seed - the seed to be validated.
170
- * @returns {Seed} - the object Seed
169
+ * @param {string} seed - hex or base64 encoded seed to be validated
170
+ * @returns {Seed} - validated object Seed
171
171
  */
172
172
  Utils.prototype.decodeSeed = function (seed) {
173
173
  // try to decode
@@ -213,7 +213,7 @@ var Utils = /** @class */ (function () {
213
213
  algosdk_1.default.decodeUnsignedTransaction(txn);
214
214
  return true;
215
215
  }
216
- catch (_) {
216
+ catch (_a) {
217
217
  return false;
218
218
  }
219
219
  };
@@ -228,7 +228,7 @@ var Utils = /** @class */ (function () {
228
228
  algosdk_1.default.decodeSignedTransaction(txn);
229
229
  return true;
230
230
  }
231
- catch (_) {
231
+ catch (_a) {
232
232
  return false;
233
233
  }
234
234
  };
@@ -239,18 +239,9 @@ var Utils = /** @class */ (function () {
239
239
  * @returns {EncodedTx} The decoded transaction.
240
240
  */
241
241
  Utils.prototype.decodeAlgoTxn = function (txnBytes) {
242
- var buffer;
243
- if (typeof txnBytes === 'string') {
244
- if (allHexChars(txnBytes)) {
245
- buffer = Buffer.from(txnBytes, 'hex');
246
- }
247
- else {
248
- buffer = Buffer.from(txnBytes, 'base64');
249
- }
250
- }
251
- else {
252
- buffer = Buffer.from(txnBytes);
253
- }
242
+ var buffer = typeof txnBytes === 'string'
243
+ ? Buffer.from(txnBytes, allHexChars(txnBytes) ? 'hex' : 'base64')
244
+ : Buffer.from(txnBytes);
254
245
  // In order to maintain backward compatibility with old keyreg transactions encoded with
255
246
  // forked algosdk 1.2.0 (https://github.com/BitGo/algosdk-bitgo),
256
247
  // the relevant information is extracted and parsed following the latest algosdk
@@ -262,44 +253,66 @@ var Utils = /** @class */ (function () {
262
253
  decodedTx.txn.selkey = decodedTx.txn.selkey || decodedTx.msig.subsig[0].pk;
263
254
  buffer = decodedTx.msig || decodedTx.sig ? encoding.encode(decodedTx) : encoding.encode(decodedTx.txn);
264
255
  }
265
- if (this.isDecodableUnsignedAlgoTxn(buffer)) {
266
- return {
267
- rawTransaction: new Uint8Array(buffer),
268
- txn: algosdk_1.default.decodeUnsignedTransaction(buffer),
269
- signed: false,
270
- };
256
+ try {
257
+ return this.tryToDecodeUnsignedTransaction(buffer);
271
258
  }
272
- else if (this.isDecodableSignedTransaction(buffer)) {
273
- // TODO: Replace with
274
- // return algosdk.Transaction.from_obj_for_encoding(algosdk.decodeSignedTransaction(buffer).txn);
275
- // see: https://github.com/algorand/js-algorand-sdk/issues/364
276
- // "...some parts of the codebase treat the output of Transaction.from_obj_for_encoding as EncodedTransaction.
277
- // They need to be fixed(or we at least need to make it so Transaction conforms to EncodedTransaction)."
278
- var tx = algosdk_1.default.decodeSignedTransaction(buffer);
279
- var signers = [];
280
- var signedBy = [];
281
- if (tx.msig && tx.msig.subsig) {
282
- for (var _i = 0, _a = tx.msig.subsig; _i < _a.length; _i++) {
283
- var sig = _a[_i];
284
- var addr = algosdk_1.default.encodeAddress(sig.pk);
285
- signers.push(addr);
286
- if (sig.s) {
287
- signedBy.push(addr);
288
- }
289
- }
290
- }
291
- return {
292
- rawTransaction: new Uint8Array(buffer),
293
- txn: tx.txn,
294
- signed: true,
295
- signers: signers,
296
- signedBy: signedBy,
297
- };
259
+ catch (_a) {
260
+ // Ignore error to try different format
261
+ }
262
+ try {
263
+ return this.tryToDecodeSignedTransaction(buffer);
298
264
  }
299
- else {
265
+ catch (_b) {
300
266
  throw new errors_1.InvalidTransactionError('Transaction cannot be decoded');
301
267
  }
302
268
  };
269
+ /**
270
+ * Try to decode a signed Algo transaction
271
+ * @param buffer the encoded transaction
272
+ * @returns { EncodedTx } the decoded signed transaction
273
+ * @throws error if it is not a valid encoded signed transaction
274
+ */
275
+ Utils.prototype.tryToDecodeSignedTransaction = function (buffer) {
276
+ // TODO: Replace with
277
+ // return algosdk.Transaction.from_obj_for_encoding(algosdk.decodeSignedTransaction(buffer).txn);
278
+ // see: https://github.com/algorand/js-algorand-sdk/issues/364
279
+ // "...some parts of the codebase treat the output of Transaction.from_obj_for_encoding as EncodedTransaction.
280
+ // They need to be fixed(or we at least need to make it so Transaction conforms to EncodedTransaction)."
281
+ var tx = algosdk_1.default.decodeSignedTransaction(buffer);
282
+ var signers = [];
283
+ var signedBy = [];
284
+ if (tx.msig && tx.msig.subsig) {
285
+ for (var _i = 0, _a = tx.msig.subsig; _i < _a.length; _i++) {
286
+ var sig = _a[_i];
287
+ var addr = algosdk_1.default.encodeAddress(sig.pk);
288
+ signers.push(addr);
289
+ if (sig.s) {
290
+ signedBy.push(addr);
291
+ }
292
+ }
293
+ }
294
+ return {
295
+ rawTransaction: new Uint8Array(buffer),
296
+ txn: tx.txn,
297
+ signed: true,
298
+ signers: signers,
299
+ signedBy: signedBy,
300
+ };
301
+ };
302
+ /**
303
+ * Try to decode an unsigned Algo transaction
304
+ * @param buffer the encoded transaction
305
+ * @returns {EncodedTx} the decoded unsigned transaction
306
+ * @throws error if it is not a valid encoded unsigned transaction
307
+ */
308
+ Utils.prototype.tryToDecodeUnsignedTransaction = function (buffer) {
309
+ var txn = algosdk_1.default.decodeUnsignedTransaction(buffer);
310
+ return {
311
+ rawTransaction: new Uint8Array(buffer),
312
+ txn: txn,
313
+ signed: false,
314
+ };
315
+ };
303
316
  /*
304
317
  * encodeObj takes a javascript object and returns its msgpack encoding
305
318
  * Note that the encoding sorts the fields alphabetically
@@ -319,7 +332,7 @@ var Utils = /** @class */ (function () {
319
332
  return algosdk_1.default.decodeObj(o);
320
333
  };
321
334
  /**
322
- * secretKeyToMnemonic take an Algorant secret key and returns the corressponding mnemonic
335
+ * secretKeyToMnemonic takes an Algorant secret key and returns the corresponding mnemonic
323
336
  *
324
337
  * @param sk - Algorant secret key
325
338
  * @return Secret key is associated mnemonic
@@ -361,8 +374,7 @@ var Utils = /** @class */ (function () {
361
374
  */
362
375
  Utils.prototype.createKeyPair = function (base64PrivateKey) {
363
376
  var sk = base64PrivateKey.slice(0, 32);
364
- var keyPair = new keyPair_1.KeyPair({ prv: Buffer.from(sk).toString('hex') });
365
- return keyPair;
377
+ return new keyPair_1.KeyPair({ prv: Buffer.from(sk).toString('hex') });
366
378
  };
367
379
  /**
368
380
  * decodePrivateKey generates a seed with a mnemonic and using algosdk.
@@ -374,16 +386,16 @@ var Utils = /** @class */ (function () {
374
386
  return algosdk_1.default.masterDerivationKeyToMnemonic(seed);
375
387
  };
376
388
  /**
377
- * isValidEd25519PublicKeyStellar validate the key with the stellar-sdk
389
+ * Validates the key with the stellar-sdk
378
390
  *
379
391
  * @param publicKey
380
- * @returns booldean
392
+ * @returns boolean
381
393
  */
382
394
  Utils.prototype.isValidEd25519PublicKeyStellar = function (publicKey) {
383
395
  return stellar_sdk_1.default.StrKey.isValidEd25519PublicKey(publicKey);
384
396
  };
385
397
  /**
386
- * decodeEd25519PublicKeyStellar decode the key with the stellar-sdk
398
+ * Decodes the key with the stellar-sdk
387
399
  *
388
400
  * @param publicKey
389
401
  * @returns Buffer
@@ -401,7 +413,7 @@ var Utils = /** @class */ (function () {
401
413
  return seedEncoding_1.SeedEncoding.encode(stellar_sdk_1.default.StrKey.decodeEd25519SecretSeed(seed));
402
414
  };
403
415
  /**
404
- * encodeAddress return an addres encoding with algosdk
416
+ * Returns an address encoded with algosdk
405
417
  *
406
418
  * @param addr
407
419
  * @returns string
@@ -410,7 +422,7 @@ var Utils = /** @class */ (function () {
410
422
  return algosdk_1.default.encodeAddress(addr);
411
423
  };
412
424
  /**
413
- * decodeAddress return an addres decoding with algosdk
425
+ * Return an address decoded with algosdk
414
426
  *
415
427
  * @param addr
416
428
  * @returns Address
@@ -419,11 +431,11 @@ var Utils = /** @class */ (function () {
419
431
  return algosdk_1.default.decodeAddress(addr);
420
432
  };
421
433
  /**
422
- *stellarAddressToAlgoAddress returns an address algo of algo
423
- *if is sent an xmlAddress if it does not return the same address.
434
+ * Converts an address into an ALGO one
435
+ * If the given data is a Stellar address or public key, it is converted to ALGO address.
424
436
  *
425
- * @param addressOrPubKey
426
- * @returns address algo string
437
+ * @param addressOrPubKey an ALGO address, or an Stellar address or public key
438
+ * @returns address algo address string
427
439
  */
428
440
  Utils.prototype.stellarAddressToAlgoAddress = function (addressOrPubKey) {
429
441
  // we have an Algorand address
@@ -493,9 +505,12 @@ var Utils = /** @class */ (function () {
493
505
  return hi_base32_1.default.encode(hash).slice(0, ALGORAND_TRANSACTION_LENGTH);
494
506
  };
495
507
  /**
496
- * returns if a tx is an enable or disable token tx
497
- * @param tx - tx in JSON format
498
- * @returns true if it's a token tx
508
+ * Determines if a given transaction data is to enable or disable a token
509
+ * @param amount the amount in transaction
510
+ * @param from the originated address
511
+ * @param to the target address
512
+ * @param closeRemainderTo (optional) address to send remaining units in originated address
513
+ * @returns 'enableToken' or 'disableToken'
499
514
  */
500
515
  Utils.prototype.getTokenTxType = function (amount, from, to, closeRemainderTo) {
501
516
  var type = 'transferToken';
@@ -509,4 +524,4 @@ var Utils = /** @class */ (function () {
509
524
  exports.Utils = Utils;
510
525
  var utils = new Utils();
511
526
  exports.default = utils;
512
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29pbi9hbGdvL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBOEI7QUFDOUIsNERBQWtDO0FBQ2xDLGtEQUFzQztBQUN0Qyw4Q0FBa0M7QUFDbEMsd0RBQStCO0FBQy9CLHdEQUErQjtBQUMvQixrREFBdUI7QUFDdkIsNkNBQXNGO0FBRXRGLDZDQUE4RjtBQUU5RixxQ0FBb0M7QUFDcEMsK0NBQThDO0FBQzlDLCtFQUFtRTtBQUNuRSwrRUFBbUU7QUFFbkUsSUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFDeEMsSUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFDaEMsSUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFDckMsSUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFDdkMsSUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFN0I7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFhO0lBQ2hDLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUN4QyxJQUFNLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1QsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25CLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVEO0lBQUE7SUE0ZEEsQ0FBQztJQTNkQyxrQkFBa0I7SUFDbEIsOEJBQWMsR0FBZCxVQUFlLE9BQWU7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dUJBQXVCLEVBQUUsQ0FBQztRQUNoRixJQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLElBQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxJQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxPQUFPLG1CQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILDhCQUFjLEdBQWQsVUFBZSxNQUFjLEVBQUUsSUFBWSxFQUFFLEVBQVUsRUFBRSxnQkFBeUI7UUFDaEYsSUFBSSxJQUFJLEdBQUcsZUFBZSxDQUFDO1FBQzNCLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFO1lBQ2pDLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztTQUMzRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNILFlBQUM7QUFBRCxDQUFDLEFBNWRELElBNGRDO0FBNWRZLHNCQUFLO0FBOGRsQixJQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBRTFCLGtCQUFlLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhbGdvc2RrIGZyb20gJ2FsZ29zZGsnO1xuaW1wb3J0IHN0ZWxsYXIgZnJvbSAnc3RlbGxhci1zZGsnO1xuaW1wb3J0ICogYXMgaGV4IGZyb20gJ0BzdGFibGVsaWIvaGV4JztcbmltcG9ydCAqIGFzIG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCBiYXNlMzIgZnJvbSAnaGktYmFzZTMyJztcbmltcG9ydCBzaGE1MTIgZnJvbSAnanMtc2hhNTEyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleSwgaXNWYWxpZEVkMjU1MTlTZWNyZXRLZXkgfSBmcm9tICcuLi8uLi91dGlscy9jcnlwdG8nO1xuaW1wb3J0IHsgQmFzZVV0aWxzIH0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgSW52YWxpZEtleSwgTm90SW1wbGVtZW50ZWRFcnJvciwgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICcuLi9iYXNlQ29pbi9lcnJvcnMnO1xuaW1wb3J0IHsgRW5jb2RlZFR4LCBBZGRyZXNzLCBTZWVkIH0gZnJvbSAnLi9pZmFjZXMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgeyBTZWVkRW5jb2RpbmcgfSBmcm9tICcuL3NlZWRFbmNvZGluZyc7XG5pbXBvcnQgKiBhcyBhbGdvTmFjbCBmcm9tICdhbGdvc2RrL2Rpc3QvY2pzL3NyYy9uYWNsL25hY2xXcmFwcGVycyc7XG5pbXBvcnQgKiBhcyBlbmNvZGluZyBmcm9tICdhbGdvc2RrL2Rpc3QvY2pzL3NyYy9lbmNvZGluZy9lbmNvZGluZyc7XG5cbmNvbnN0IEFMR09SQU5EX0NIRUNLU1VNX0JZVEVfTEVOR1RIID0gNDtcbmNvbnN0IEFMR09SQU5EX1NFRURfTEVOR1RIID0gNTg7XG5jb25zdCBBTEdPUkFORF9TRUVEX0JZVEVfTEVOR1RIID0gMzY7XG5jb25zdCBBTEdPUkFORF9UUkFOU0FDVElPTl9MRU5HVEggPSA1MjtcbmNvbnN0IFNFRURfQllURVNfTEVOR1RIID0gMzI7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzdHJpbmcgaXMgYSBjb21wb3NlZCBvZiBoZXggY2hhcnMgb25seS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWF5YmUgVGhlIHN0cmluZyB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnNpc3RzIG9mIG9ubHkgaGV4IGNoYXJhY3RlcnMsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gYWxsSGV4Q2hhcnMobWF5YmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL14oWzAtOWEtZl17Mn0pKyQvaS50ZXN0KG1heWJlKTtcbn1cblxuLyoqXG4gKiBDb25jYXRBcnJheXMgdGFrZXMgdHdvIGFycmF5IGFuZCByZXR1cm5zIGEgam9pbnQgYXJyYXkgb2YgYm90aFxuICpcbiAqIEBwYXJhbSBhIHtCdWZmZXJ9XG4gKiBAcGFyYW0gYiB7QnVmZmVyfVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IFthLGJdXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdEFycmF5cyhhOiBCdWZmZXIsIGI6IEJ1ZmZlcik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBjID0gbmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGggKyBiLmxlbmd0aCk7XG4gIGMuc2V0KGEpO1xuICBjLnNldChiLCBhLmxlbmd0aCk7XG4gIHJldHVybiBjO1xufVxuXG5leHBvcnQgY2xhc3MgVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFsZ29zZGsuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHR4SWQubGVuZ3RoICE9PSAxMDQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxsSGV4Q2hhcnModHhJZCk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRQcml2YXRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRFZDI1NTE5U2VjcmV0S2V5KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBoZXggc3RyaW5nIG9mIHRoZSBnaXZlbiBidWZmZXJcbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXIgfCBVaW50OEFycmF5fSBidWZmZXIgLSB0aGUgYnVmZmVyIHRvIGJlIGNvbnZlcnRlZCB0byBoZXhcbiAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgaGV4IHZhbHVlXG4gICAqL1xuICB0b0hleChidWZmZXI6IEJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBoZXguZW5jb2RlKGJ1ZmZlciwgdHJ1ZSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdpc1ZhbGlkU2lnbmF0dXJlIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaGFzaCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSB0d28gS2V5c1xuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleTEgLSBrZXkgdG8gYmUgY29tcGFyZVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGtleTIgLSBrZXkgdG8gYmUgY29tcGFyZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSByZXR1cm5zIHRydWUgaWYgYm90aCBrZXlzIGFyZSBlcXVhbFxuICAgKi9cbiAgYXJlS2V5c0VxdWFsKGtleTE6IFVpbnQ4QXJyYXksIGtleTI6IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmFjbC52ZXJpZnkoa2V5MSwga2V5Mik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFVpbnQ4QXJyYXkgb2YgdGhlIGdpdmVuIGhleCBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIHRoZSBoZXggc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBVaW50OEFycmF5IHZhbHVlXG4gICAqL1xuICB0b1VpbnQ4QXJyYXkoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oc3RyLCAnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgc2VlZCBpcyB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlZWQgLSB0aGUgc2VlZCB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdHJ1ZSBpZiB0aGUgc2VlZCBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZFNlZWQoc2VlZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBzZWVkICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHNlZWQubGVuZ3RoICE9PSBBTEdPUkFORF9TRUVEX0xFTkdUSCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVHJ5IHRvIGRlY29kZVxuICAgIGxldCBkZWNvZGVkO1xuICAgIHRyeSB7XG4gICAgICBkZWNvZGVkID0gdGhpcy5kZWNvZGVTZWVkKHNlZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIGNoZWNrc3VtXG4gICAgY29uc3QgY2hlY2tzdW0gPSBuZXcgVWludDhBcnJheShcbiAgICAgIHNoYTUxMi5zaGE1MTJfMjU2LmFycmF5KGRlY29kZWQuc2VlZCkuc2xpY2UoU0VFRF9CWVRFU19MRU5HVEggLSBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCwgU0VFRF9CWVRFU19MRU5HVEgpLFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY2hlY2tzdW0gbWF0Y2hlcyB0aGUgb25lIGZyb20gdGhlIGRlY29kZWQgc2VlZFxuICAgIHJldHVybiBfLmlzRXF1YWwoY2hlY2tzdW0sIGRlY29kZWQuY2hlY2tzdW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhbiBhbGdvIHNlZWRcbiAgICpcbiAgICogQHBhcmFtICB7QnVmZmVyfSBzZWNyZXRLZXkgLSB0aGUgdmFsaWQgc2VjcmV0S2V5IC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgc2VlZCB0byBiZSB2YWxpZGF0ZWQuXG4gICAqL1xuICBlbmNvZGVTZWVkKHNlY3JldEtleTogQnVmZmVyKTogc3RyaW5nIHtcbiAgICAvLyBnZXQgc2VlZFxuICAgIGNvbnN0IHNlZWQgPSBzZWNyZXRLZXkuc2xpY2UoMCwgU0VFRF9CWVRFU19MRU5HVEgpO1xuICAgIC8vIGNvbXB1dGUgY2hlY2tzdW1cbiAgICBjb25zdCBjaGVja3N1bSA9IEJ1ZmZlci5mcm9tKFxuICAgICAgc2hhNTEyLnNoYTUxMl8yNTYuYXJyYXkoc2VlZCkuc2xpY2UoU0VFRF9CWVRFU19MRU5HVEggLSBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCwgU0VFRF9CWVRFU19MRU5HVEgpLFxuICAgICk7XG4gICAgY29uc3QgZW5jb2RlZFNlZWQgPSBiYXNlMzIuZW5jb2RlKGNvbmNhdEFycmF5cyhzZWVkLCBjaGVja3N1bSkpO1xuXG4gICAgcmV0dXJuIGVuY29kZWRTZWVkLnRvU3RyaW5nKCkuc2xpY2UoMCwgQUxHT1JBTkRfU0VFRF9MRU5HVEgpOyAvLyByZW1vdmluZyB0aGUgZXh0cmEgJz09PT0nXG4gIH1cblxuICAvKipcbiAgICogZGVjb2RlU2VlZCBkZWNvZGVzIGFuIGFsZ28gc2VlZFxuICAgKlxuICAgKiBEZWNvZGluZyBhbGdvIHNlZWQgaXMgc2FuZSBhcyBkZWNvZGluZyBhZGRyZXNzLlxuICAgKiBMYXRlc3QgdmVyc2lvbiBvZiBhbGdvIHNkayAoMS45LCBhdCB0aGlzIHdyaXRpbmcpIGRvZXMgbm90IGV4cG9zZSBleHBsaWNpdCBtZXRob2QgZm9yIGRlY29kaW5nIHNlZWRcbiAgICogaGVuY2UsIHRoaXMgcm91dGluZSB1c2VzIGRlY29kZUFkZHJlc3MgYW5kIGNoYW5nZXMgdGhlIHJldHVybiBzdHJ1Y3R1cmVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlZWQgLSB0aGUgc2VlZCB0byBiZSB2YWxpZGF0ZWQuXG4gICAqIEByZXR1cm5zIHtTZWVkfSAtIHRoZSBvYmplY3QgU2VlZFxuICAgKi9cbiAgZGVjb2RlU2VlZChzZWVkOiBzdHJpbmcpOiBTZWVkIHtcbiAgICAvLyB0cnkgdG8gZGVjb2RlXG4gICAgY29uc3QgZGVjb2RlZCA9IGJhc2UzMi5kZWNvZGUuYXNCeXRlcyhzZWVkKTtcblxuICAgIC8vIFNhbml0eSBjaGVja1xuICAgIGlmIChkZWNvZGVkLmxlbmd0aCAhPT0gQUxHT1JBTkRfU0VFRF9CWVRFX0xFTkdUSCkgdGhyb3cgbmV3IEVycm9yKCdzZWVkIHNlZW1zIHRvIGJlIG1hbGZvcm1lZCcpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWVkOiBuZXcgVWludDhBcnJheShkZWNvZGVkLnNsaWNlKDAsIEFMR09SQU5EX1NFRURfQllURV9MRU5HVEggLSBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCkpLFxuICAgICAgY2hlY2tzdW06IG5ldyBVaW50OEFycmF5KGRlY29kZWQuc2xpY2UoU0VFRF9CWVRFU19MRU5HVEgsIEFMR09SQU5EX1NFRURfQllURV9MRU5HVEgpKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHNpZ25hdHVyZSBmb3IgbWVzc2FnZSBpcyB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIHB1YiB7VWludDhBcnJheX0gcHVibGljIGtleVxuICAgKiBAcGFyYW0gbWVzc2FnZSB7VWludDhBcnJheX0gc2lnbmVkIG1lc3NhZ2VcbiAgICogQHBhcmFtIHNpZ25hdHVyZSB7QnVmZmVyfSBzaWduYXR1cmUgdG8gdmVyaWZ5XG4gICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZC5cbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZShtZXNzYWdlOiBVaW50OEFycmF5LCBzaWduYXR1cmU6IEJ1ZmZlciwgcHViOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobWVzc2FnZSwgc2lnbmF0dXJlLCBwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgYW4gRWQyNTUxOSBwdWJsaWMga2V5IGludG8gYW4gYWxnb3JhbmQgYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBwayBUaGUgRWQyNTUxOSBwdWJsaWMga2V5LlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL2ZlYXR1cmVzL2FjY291bnRzLyN0cmFuc2Zvcm1hdGlvbi1wdWJsaWMta2V5LXRvLWFsZ29yYW5kLWFkZHJlc3NcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGFsZ29yYW5kIGFkZHJlc3MuXG4gICAqL1xuICBwdWJsaWNLZXlUb0FsZ29BZGRyZXNzKHBrOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IEtleVBhaXIoeyBwdWI6IEJ1ZmZlci5mcm9tKHBrKS50b1N0cmluZygnaGV4JykgfSkuZ2V0QWRkcmVzcygpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB1bnNpZ25lZCBhbGdvIHRyYW5zYWN0aW9uIGNhbiBiZSBkZWNvZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHR4biBUaGUgZW5jb2RlZCB1bnNpZ25lZCB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIGNhbiBiZSBkZWNvZGVkLCBvdGhlcndpc2UgZmFsc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc0RlY29kYWJsZVVuc2lnbmVkQWxnb1R4bih0eG46IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgYWxnb3Nkay5kZWNvZGVVbnNpZ25lZFRyYW5zYWN0aW9uKHR4bik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChfOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIHNpZ25lZCBhbGdvIHRyYW5zYWN0aW9uIGNhbiBiZSBkZWNvZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHR4biBUaGUgZW5jb2RlZCBzaWduZWQgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiBjYW4gYmUgZGVjb2RlZCwgb3RoZXJ3aXNlIGZhbHNlXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNEZWNvZGFibGVTaWduZWRUcmFuc2FjdGlvbih0eG46IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgYWxnb3Nkay5kZWNvZGVTaWduZWRUcmFuc2FjdGlvbih0eG4pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoXzogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgc2lnbmVkIG9yIHVuc2lnbmVkIGFsZ28gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheSB8IHN0cmluZ30gdHhuQnl0ZXMgVGhlIGVuY29kZWQgdW5zaWduZWQgb3Igc2lnbmVkIHR4bi5cbiAgICogQHJldHVybnMge0VuY29kZWRUeH0gVGhlIGRlY29kZWQgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBkZWNvZGVBbGdvVHhuKHR4bkJ5dGVzOiBVaW50OEFycmF5IHwgc3RyaW5nKTogRW5jb2RlZFR4IHtcbiAgICBsZXQgYnVmZmVyOiBCdWZmZXI7XG4gICAgaWYgKHR5cGVvZiB0eG5CeXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChhbGxIZXhDaGFycyh0eG5CeXRlcykpIHtcbiAgICAgICAgYnVmZmVyID0gQnVmZmVyLmZyb20odHhuQnl0ZXMsICdoZXgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHR4bkJ5dGVzLCAnYmFzZTY0Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHR4bkJ5dGVzKTtcbiAgICB9XG5cbiAgICAvLyBJbiBvcmRlciB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGtleXJlZyB0cmFuc2FjdGlvbnMgZW5jb2RlZCB3aXRoXG4gICAgLy8gZm9ya2VkIGFsZ29zZGsgMS4yLjAgKGh0dHBzOi8vZ2l0aHViLmNvbS9CaXRHby9hbGdvc2RrLWJpdGdvKSxcbiAgICAvLyB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkIGFuZCBwYXJzZWQgZm9sbG93aW5nIHRoZSBsYXRlc3QgYWxnb3Nka1xuICAgIC8vIHJlbGVhc2Ugc3RhbmRhcmQuXG4gICAgLy8gVGhpcyB3YXkgd2UgY2FuIGRlY29kZSB0cmFuc2FjdGlvbnMgc3VjY2Vzc2Z1bGx5IGJ5IHN0aWxsIG1haW50YWluaW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAgY29uc3QgZGVjb2RlZFR4ID0gZW5jb2RpbmcuZGVjb2RlKGJ1ZmZlcik7XG4gICAgaWYgKGRlY29kZWRUeC50eG4gJiYgZGVjb2RlZFR4LnR4bi50eXBlID09PSAna2V5cmVnJykge1xuICAgICAgZGVjb2RlZFR4LnR4bi52b3Rla2V5ID0gZGVjb2RlZFR4LnR4bi52b3Rla2V5IHx8IGRlY29kZWRUeC5tc2lnLnN1YnNpZ1swXS5waztcbiAgICAgIGRlY29kZWRUeC50eG4uc2Vsa2V5ID0gZGVjb2RlZFR4LnR4bi5zZWxrZXkgfHwgZGVjb2RlZFR4Lm1zaWcuc3Vic2lnWzBdLnBrO1xuICAgICAgYnVmZmVyID0gZGVjb2RlZFR4Lm1zaWcgfHwgZGVjb2RlZFR4LnNpZyA/IGVuY29kaW5nLmVuY29kZShkZWNvZGVkVHgpIDogZW5jb2RpbmcuZW5jb2RlKGRlY29kZWRUeC50eG4pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRGVjb2RhYmxlVW5zaWduZWRBbGdvVHhuKGJ1ZmZlcikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJhd1RyYW5zYWN0aW9uOiBuZXcgVWludDhBcnJheShidWZmZXIpLFxuICAgICAgICB0eG46IGFsZ29zZGsuZGVjb2RlVW5zaWduZWRUcmFuc2FjdGlvbihidWZmZXIpLFxuICAgICAgICBzaWduZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEZWNvZGFibGVTaWduZWRUcmFuc2FjdGlvbihidWZmZXIpKSB7XG4gICAgICAvLyBUT0RPOiBSZXBsYWNlIHdpdGhcbiAgICAgIC8vIHJldHVybiBhbGdvc2RrLlRyYW5zYWN0aW9uLmZyb21fb2JqX2Zvcl9lbmNvZGluZyhhbGdvc2RrLmRlY29kZVNpZ25lZFRyYW5zYWN0aW9uKGJ1ZmZlcikudHhuKTtcbiAgICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FsZ29yYW5kL2pzLWFsZ29yYW5kLXNkay9pc3N1ZXMvMzY0XG4gICAgICAvLyBcIi4uLnNvbWUgcGFydHMgb2YgdGhlIGNvZGViYXNlIHRyZWF0IHRoZSBvdXRwdXQgb2YgVHJhbnNhY3Rpb24uZnJvbV9vYmpfZm9yX2VuY29kaW5nIGFzIEVuY29kZWRUcmFuc2FjdGlvbi5cbiAgICAgIC8vIFRoZXkgbmVlZCB0byBiZSBmaXhlZChvciB3ZSBhdCBsZWFzdCBuZWVkIHRvIG1ha2UgaXQgc28gVHJhbnNhY3Rpb24gY29uZm9ybXMgdG8gRW5jb2RlZFRyYW5zYWN0aW9uKS5cIlxuICAgICAgY29uc3QgdHggPSBhbGdvc2RrLmRlY29kZVNpZ25lZFRyYW5zYWN0aW9uKGJ1ZmZlcik7XG5cbiAgICAgIGNvbnN0IHNpZ25lcnM6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBzaWduZWRCeTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICh0eC5tc2lnICYmIHR4Lm1zaWcuc3Vic2lnKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHR4Lm1zaWcuc3Vic2lnKSB7XG4gICAgICAgICAgY29uc3QgYWRkciA9IGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhzaWcucGspO1xuICAgICAgICAgIHNpZ25lcnMucHVzaChhZGRyKTtcbiAgICAgICAgICBpZiAoc2lnLnMpIHtcbiAgICAgICAgICAgIHNpZ25lZEJ5LnB1c2goYWRkcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJhd1RyYW5zYWN0aW9uOiBuZXcgVWludDhBcnJheShidWZmZXIpLFxuICAgICAgICB0eG46IHR4LnR4bixcbiAgICAgICAgc2lnbmVkOiB0cnVlLFxuICAgICAgICBzaWduZXJzOiBzaWduZXJzLFxuICAgICAgICBzaWduZWRCeTogc2lnbmVkQnksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGNhbm5vdCBiZSBkZWNvZGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogZW5jb2RlT2JqIHRha2VzIGEgamF2YXNjcmlwdCBvYmplY3QgYW5kIHJldHVybnMgaXRzIG1zZ3BhY2sgZW5jb2RpbmdcbiAgICogTm90ZSB0aGF0IHRoZSBlbmNvZGluZyBzb3J0cyB0aGUgZmllbGRzIGFscGhhYmV0aWNhbGx5XG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgYW55Pn0gb2JqIGpzIG9ialxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gVWludDhBcnJheSBiaW5hcnkgcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGVuY29kZU9iaihvYmo6IFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIGFueT4pOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gYWxnb3Nkay5lbmNvZGVPYmoob2JqKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWNvZGVPYmogdGFrZXMgYSBVaW50OEFycmF5IGFuZCByZXR1cm5zIGl0cyBqYXZhc2NyaXB0IG9ialxuICAgKiBAcGFyYW0gbyAtIFVpbnQ4QXJyYXkgdG8gZGVjb2RlXG4gICAqIEByZXR1cm5zIG9iamVjdFxuICAgKi9cbiAgZGVjb2RlT2JqKG86IEFycmF5TGlrZTxudW1iZXI+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIGFsZ29zZGsuZGVjb2RlT2JqKG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlY3JldEtleVRvTW5lbW9uaWMgdGFrZSBhbiBBbGdvcmFudCBzZWNyZXQga2V5IGFuZCByZXR1cm5zIHRoZSBjb3JyZXNzcG9uZGluZyBtbmVtb25pY1xuICAgKlxuICAgKiBAcGFyYW0gc2sgLSBBbGdvcmFudCBzZWNyZXQga2V5XG4gICAqIEByZXR1cm4gU2VjcmV0IGtleSBpcyBhc3NvY2lhdGVkIG1uZW1vbmljXG4gICAqL1xuICBzZWNyZXRLZXlUb01uZW1vbmljKHNrOiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNrVmFsaWQgPSBCdWZmZXIuZnJvbShzay50b1N0cmluZygnaGV4JykpO1xuICAgIGlmICghdGhpcy5pc1ZhbGlkUHJpdmF0ZUtleShza1ZhbGlkLnRvU3RyaW5nKCdoZXgnKSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkS2V5KGBUaGUgc2VjcmV0IGtleTogJHtzay50b1N0cmluZygnaGV4Jyl9IGlzIGludmFsaWRgKTtcbiAgICB9XG4gICAgY29uc3Qgc2tVbml0OEFycmF5ID0gQnVmZmVyLmZyb20oc2spO1xuICAgIHJldHVybiBhbGdvc2RrLnNlY3JldEtleVRvTW5lbW9uaWMoc2tVbml0OEFycmF5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZWVkRnJvbU1uZW1vbmljIGNvbnZlcnRzIGEgbW5lbW9uaWMgZ2VuZXJhdGVkIHVzaW5nIHRoaXMgbGlicmFyeSBpbnRvIHRoZSBzb3VyY2Uga2V5IHVzZWQgdG8gY3JlYXRlIGl0XG4gICAqIEl0IHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHBhc3NlZCBtbmVtb25pYyBoYXMgYW4gaW5jb3JyZWN0IGNoZWNrc3VtLCBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGlzIHVuZXhwZWN0ZWQsIG9yIGlmIG9uZVxuICAgKiBvZiB0aGUgcGFzc2VkIHdvcmRzIGlzIG5vdCBmb3VuZCBpbiB0aGUgd29yZHMgbGlzdFxuICAgKlxuICAgKiBAcGFyYW0gbW5lbW9uaWMgLSAyNSB3b3JkcyBtbmVtb25pY1xuICAgKiBAcmV0dXJucyAzMiBieXRlcyBsb25nIHNlZWRcbiAgICovXG4gIHNlZWRGcm9tTW5lbW9uaWMobW5lbW9uaWM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBhbGdvc2RrLm1uZW1vbmljVG9NYXN0ZXJEZXJpdmF0aW9uS2V5KG1uZW1vbmljKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBrZXlQYWlyRnJvbVNlZWQgZ2VuZXJhdGVzIGFuIG9iamVjdCB3aXRoIHNlY3JldEtleSBhbmQgcHVibGljS2V5IHVzaW5nIHRoZSBhbGdvc2RrXG4gICAqIEBwYXJhbSBzZWVkIDMyIGJ5dGVzIGxvbmcgc2VlZFxuICAgKiBAcmV0dXJucyBLZXlQYWlyXG4gICAqL1xuICBrZXlQYWlyRnJvbVNlZWQoc2VlZDogVWludDhBcnJheSk6IEtleVBhaXIge1xuICAgIGNvbnN0IG1uID0gdGhpcy5tbmVtb25pY0Zyb21TZWVkKHNlZWQpO1xuICAgIGNvbnN0IGJhc2U2NFByaXZhdGVLZXkgPSBhbGdvc2RrLm1uZW1vbmljVG9TZWNyZXRLZXkobW4pLnNrO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUtleVBhaXIoYmFzZTY0UHJpdmF0ZUtleSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcgYEtleVBhaXJgIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBwcml2YXRlIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGJhc2U2NFByaXZhdGVLZXkgNjQgYnl0ZXMgbG9uZyBwcml2YXRlS2V5XG4gICAqIEByZXR1cm5zIEtleVBhaXJcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVLZXlQYWlyKGJhc2U2NFByaXZhdGVLZXk6IFVpbnQ4QXJyYXkpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBzayA9IGJhc2U2NFByaXZhdGVLZXkuc2xpY2UoMCwgMzIpO1xuICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogQnVmZmVyLmZyb20oc2spLnRvU3RyaW5nKCdoZXgnKSB9KTtcbiAgICByZXR1cm4ga2V5UGFpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWNvZGVQcml2YXRlS2V5IGdlbmVyYXRlcyBhIHNlZWQgd2l0aCBhIG1uZW1vbmljIGFuZCB1c2luZyBhbGdvc2RrLlxuICAgKlxuICAgKiBAcGFyYW0gc2VlZCAzMiBieXRlcyBsb25nIHNlZWRcbiAgICogQHJldHVybnMgbW5lbW9uaWMgLSAyNSB3b3JkcyBtbmVtb25pYyAtIDI1IHdvcmRzIG1uZW1vbmljXG4gICAqL1xuICBwcm90ZWN0ZWQgbW5lbW9uaWNGcm9tU2VlZChzZWVkOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYWxnb3Nkay5tYXN0ZXJEZXJpdmF0aW9uS2V5VG9NbmVtb25pYyhzZWVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleVN0ZWxsYXIgdmFsaWRhdGUgdGhlIGtleSB3aXRoIHRoZSBzdGVsbGFyLXNka1xuICAgKlxuICAgKiBAcGFyYW0gcHVibGljS2V5XG4gICAqIEByZXR1cm5zIGJvb2xkZWFuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXlTdGVsbGFyKHB1YmxpY0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0ZWxsYXIuU3RyS2V5LmlzVmFsaWRFZDI1NTE5UHVibGljS2V5KHB1YmxpY0tleSk7XG4gIH1cblxuICAvKipcbiAgICogZGVjb2RlRWQyNTUxOVB1YmxpY0tleVN0ZWxsYXIgZGVjb2RlIHRoZSBrZXkgd2l0aCB0aGUgc3RlbGxhci1zZGtcbiAgICpcbiAgICogQHBhcmFtIHB1YmxpY0tleVxuICAgKiBAcmV0dXJucyBCdWZmZXJcbiAgICovXG4gIHByb3RlY3RlZCBkZWNvZGVFZDI1NTE5UHVibGljS2V5U3RlbGxhcihwdWJsaWNLZXk6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHN0ZWxsYXIuU3RyS2V5LmRlY29kZUVkMjU1MTlQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgc3RlbGxhciBzZWVkIHRvIGFsZ29yYW5kIGVuY29kaW5nXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm5zIHN0cmluZyB0aGUgZW5jb2RlZCBzZWVkXG4gICAqL1xuICBjb252ZXJ0RnJvbVN0ZWxsYXJTZWVkKHNlZWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlZWRFbmNvZGluZy5lbmNvZGUoc3RlbGxhci5TdHJLZXkuZGVjb2RlRWQyNTUxOVNlY3JldFNlZWQoc2VlZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGVuY29kZUFkZHJlc3MgcmV0dXJuIGFuIGFkZHJlcyBlbmNvZGluZyB3aXRoIGFsZ29zZGtcbiAgICpcbiAgICogQHBhcmFtIGFkZHJcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBlbmNvZGVBZGRyZXNzKGFkZHI6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhhZGRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWNvZGVBZGRyZXNzIHJldHVybiBhbiBhZGRyZXMgZGVjb2Rpbmcgd2l0aCBhbGdvc2RrXG4gICAqXG4gICAqIEBwYXJhbSBhZGRyXG4gICAqIEByZXR1cm5zIEFkZHJlc3NcbiAgICovXG4gIGRlY29kZUFkZHJlc3MoYWRkcjogc3RyaW5nKTogQWRkcmVzcyB7XG4gICAgcmV0dXJuIGFsZ29zZGsuZGVjb2RlQWRkcmVzcyhhZGRyKTtcbiAgfVxuXG4gIC8qKlxuICAgKnN0ZWxsYXJBZGRyZXNzVG9BbGdvQWRkcmVzcyByZXR1cm5zIGFuIGFkZHJlc3MgYWxnbyBvZiBhbGdvXG4gICAqaWYgaXMgc2VudCBhbiB4bWxBZGRyZXNzIGlmIGl0IGRvZXMgbm90IHJldHVybiB0aGUgc2FtZSBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzc09yUHViS2V5XG4gICAqIEByZXR1cm5zIGFkZHJlc3MgYWxnbyBzdHJpbmdcbiAgICovXG4gIHN0ZWxsYXJBZGRyZXNzVG9BbGdvQWRkcmVzcyhhZGRyZXNzT3JQdWJLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gd2UgaGF2ZSBhbiBBbGdvcmFuZCBhZGRyZXNzXG4gICAgaWYgKHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzc09yUHViS2V5KSkge1xuICAgICAgcmV0dXJuIGFkZHJlc3NPclB1YktleTtcbiAgICB9XG4gICAgLy8gd2UgaGF2ZSBhIHN0ZWxsYXIga2V5XG4gICAgaWYgKHRoaXMuaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXlTdGVsbGFyKGFkZHJlc3NPclB1YktleSkpIHtcbiAgICAgIGNvbnN0IHN0ZWxsYXJQdWIgPSB0aGlzLmRlY29kZUVkMjU1MTlQdWJsaWNLZXlTdGVsbGFyKGFkZHJlc3NPclB1YktleSk7XG4gICAgICBjb25zdCBhbGdvQWRkcmVzcyA9IHRoaXMuZW5jb2RlQWRkcmVzcyhzdGVsbGFyUHViKTtcbiAgICAgIGlmICh0aGlzLmlzVmFsaWRBZGRyZXNzKGFsZ29BZGRyZXNzKSkge1xuICAgICAgICByZXR1cm4gYWxnb0FkZHJlc3M7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IFN0ZWxsYXIgYWRkcmVzcyB0byBhbiBBbGdvcmFuZCBhZGRyZXNzIHZpYSBwdWJrZXkuJyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignTmVpdGhlciBhbiBBbGdvcmFuZCBhZGRyZXNzIG5vciBhIHN0ZWxsYXIgcHVia2V5LicpO1xuICB9XG5cbiAgLyoqXG4gICAqIG11bHRpc2lnQWRkcmVzcyB0YWtlcyBtdWx0aXNpZyBtZXRhZGF0YSAocHJlaW1hZ2UpIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGh1bWFuIHJlYWRhYmxlIEFsZ29yYW5kIGFkZHJlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2ZXJzaW9uIG11dGxpc2lnIHZlcnNpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCBtdWx0aXNpZyB0aHJlc2hvbGRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYWRkcnMgbGlzdCBvZiBBbGdvcmFuZCBhZGRyZXNzZXNcbiAgICogQHJldHVybnMge3N0cmluZ30gaHVtYW4gcmVhZGFibGUgQWxnb3JhbmQgYWRkcmVzcy5cbiAgICovXG4gIG11bHRpc2lnQWRkcmVzcyh2ZXJzaW9uOiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyLCBhZGRyczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBhbGdvc2RrLm11bHRpc2lnQWRkcmVzcyh7XG4gICAgICB2ZXJzaW9uLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgYWRkcnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZ2VuZXJhdGVBY2NvdW50IGdlbmVyYXRlcyB1biBhY2NvdW50IHdpdGggYSBzZWNyZXRLZXkgYW5kIGFuIGFkZHJlc3NcbiAgICpcbiAgICogRnVuY3Rpb24gaGFzIG5vdCBwYXJhbXNcbiAgICogQHJldHVybnMgQWNjb3VudFxuICAgKi9cbiAgZ2VuZXJhdGVBY2NvdW50KCk6IGFsZ29zZGsuQWNjb3VudCB7XG4gICAgcmV0dXJuIGFsZ29zZGsuZ2VuZXJhdGVBY2NvdW50KCk7XG4gIH1cblxuICBnZW5lcmF0ZUFjY291bnRGcm9tU2VlZChzZWVkOiBVaW50OEFycmF5KTogYWxnb3Nkay5BY2NvdW50IHtcbiAgICBjb25zdCBrZXlzID0gbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlZWQoc2VlZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHI6IGFsZ29zZGsuZW5jb2RlQWRkcmVzcyhrZXlzLnB1YmxpY0tleSksXG4gICAgICBzazoga2V5cy5zZWNyZXRLZXksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgVHggSUQgZnJvbSBhbiBlbmNvZGVkIG11bHRpc2lnIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIFRoaXMgaXMgZG9uZSBiZWNhdXNlIG9mIGEgY2hhbmdlIG1hZGUgb24gdmVyc2lvbiAxLjEwLjEgb24gYWxnb3NkayBzbyBtZXRob2QgdHhJRCgpIG9ubHkgc3VwcG9ydHMgU2lnbmVkVHJhbnNhY3Rpb24gdHlwZS5cbiAgICogKGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZC9qcy1hbGdvcmFuZC1zZGsvYmxvYi9kZXZlbG9wL0NIQU5HRUxPRy5tZCMxMTAxKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHhCYXNlNjQgLSBlbmNvZGVkIGJhc2U2NCBtdWx0aXNpZyB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRyYW5zYWN0aW9uIElEXG4gICAqL1xuICBnZXRNdWx0aXNpZ1R4SUQodHhCYXNlNjQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHhCeXRlcyA9IEJ1ZmZlci5mcm9tKHR4QmFzZTY0LCAnYmFzZTY0Jyk7XG4gICAgY29uc3QgZGVjb2RlU2lnblR4ID0gYWxnb3Nkay5kZWNvZGVTaWduZWRUcmFuc2FjdGlvbih0eEJ5dGVzKTtcbiAgICBjb25zdCB3ZWxsRm9ybWVkRGVjb2RlZFNpZ25UeCA9IGRlY29kZVNpZ25UeC50eG4uZ2V0X29ial9mb3JfZW5jb2RpbmcoKTtcbiAgICBjb25zdCB0eEZvckVuY29kaW5nID0geyBtc2lnOiBkZWNvZGVTaWduVHgubXNpZywgdHhuOiB3ZWxsRm9ybWVkRGVjb2RlZFNpZ25UeCB9O1xuICAgIGNvbnN0IGVuX21zZyA9IGVuY29kaW5nLmVuY29kZSh0eEZvckVuY29kaW5nKTtcbiAgICBjb25zdCB0YWcgPSBCdWZmZXIuZnJvbShbODQsIDg4XSk7XG4gICAgY29uc3QgZ2ggPSBCdWZmZXIuZnJvbShjb25jYXRBcnJheXModGFnLCBlbl9tc2cpKTtcbiAgICBjb25zdCBoYXNoID0gQnVmZmVyLmZyb20oYWxnb05hY2wuZ2VuZXJpY0hhc2goZ2gpKTtcbiAgICByZXR1cm4gYmFzZTMyLmVuY29kZShoYXNoKS5zbGljZSgwLCBBTEdPUkFORF9UUkFOU0FDVElPTl9MRU5HVEgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgaWYgYSB0eCBpcyBhbiBlbmFibGUgb3IgZGlzYWJsZSB0b2tlbiB0eFxuICAgKiBAcGFyYW0gdHggLSB0eCBpbiBKU09OIGZvcm1hdFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0J3MgYSB0b2tlbiB0eFxuICAgKi9cbiAgZ2V0VG9rZW5UeFR5cGUoYW1vdW50OiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgY2xvc2VSZW1haW5kZXJUbz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHR5cGUgPSAndHJhbnNmZXJUb2tlbic7XG4gICAgaWYgKGFtb3VudCA9PT0gJzAnICYmIGZyb20gPT09IHRvKSB7XG4gICAgICB0eXBlID0gIWNsb3NlUmVtYWluZGVyVG8gPyAnZW5hYmxlVG9rZW4nIDogJ2Rpc2FibGVUb2tlbic7XG4gICAgfVxuICAgIHJldHVybiB0eXBlO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuIl19
527
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29pbi9hbGdvL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBOEI7QUFDOUIsNERBQWtDO0FBQ2xDLGtEQUFzQztBQUN0Qyw4Q0FBa0M7QUFDbEMsd0RBQStCO0FBQy9CLHdEQUErQjtBQUMvQixrREFBdUI7QUFDdkIsNkNBQXNGO0FBRXRGLDZDQUE4RjtBQUU5RixxQ0FBb0M7QUFDcEMsK0NBQThDO0FBQzlDLCtFQUFtRTtBQUNuRSwrRUFBbUU7QUFFbkUsSUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUM7QUFDeEMsSUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFDaEMsSUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFDckMsSUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFDdkMsSUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFN0I7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxLQUFhO0lBQ2hDLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxDQUFhLEVBQUUsQ0FBYTtJQUNoRCxJQUFNLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1QsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25CLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVEO0lBQUE7SUFpZkEsQ0FBQztJQWhmQyxrQkFBa0I7SUFDbEIsOEJBQWMsR0FBZCxVQUFlLE9BQWU7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QVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLHVCQUF1QixFQUFFLENBQUM7UUFDaEYsSUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5QyxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEQsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxtQkFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLDJCQUEyQixDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCw4QkFBYyxHQUFkLFVBQWUsTUFBYyxFQUFFLElBQVksRUFBRSxFQUFVLEVBQUUsZ0JBQXlCO1FBQ2hGLElBQUksSUFBSSxHQUFHLGVBQWUsQ0FBQztRQUMzQixJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRTtZQUNqQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7U0FDM0Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCxZQUFDO0FBQUQsQ0FBQyxBQWpmRCxJQWlmQztBQWpmWSxzQkFBSztBQW1mbEIsSUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUUxQixrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWxnb3NkayBmcm9tICdhbGdvc2RrJztcbmltcG9ydCBzdGVsbGFyIGZyb20gJ3N0ZWxsYXItc2RrJztcbmltcG9ydCAqIGFzIGhleCBmcm9tICdAc3RhYmxlbGliL2hleCc7XG5pbXBvcnQgKiBhcyBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgYmFzZTMyIGZyb20gJ2hpLWJhc2UzMic7XG5pbXBvcnQgc2hhNTEyIGZyb20gJ2pzLXNoYTUxMic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXksIGlzVmFsaWRFZDI1NTE5U2VjcmV0S2V5IH0gZnJvbSAnLi4vLi4vdXRpbHMvY3J5cHRvJztcbmltcG9ydCB7IEJhc2VVdGlscyB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEludmFsaWRLZXksIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi4vYmFzZUNvaW4vZXJyb3JzJztcbmltcG9ydCB7IEFkZHJlc3MsIEVuY29kZWRUeCwgU2VlZCB9IGZyb20gJy4vaWZhY2VzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgU2VlZEVuY29kaW5nIH0gZnJvbSAnLi9zZWVkRW5jb2RpbmcnO1xuaW1wb3J0ICogYXMgYWxnb05hY2wgZnJvbSAnYWxnb3Nkay9kaXN0L2Nqcy9zcmMvbmFjbC9uYWNsV3JhcHBlcnMnO1xuaW1wb3J0ICogYXMgZW5jb2RpbmcgZnJvbSAnYWxnb3Nkay9kaXN0L2Nqcy9zcmMvZW5jb2RpbmcvZW5jb2RpbmcnO1xuXG5jb25zdCBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCA9IDQ7XG5jb25zdCBBTEdPUkFORF9TRUVEX0xFTkdUSCA9IDU4O1xuY29uc3QgQUxHT1JBTkRfU0VFRF9CWVRFX0xFTkdUSCA9IDM2O1xuY29uc3QgQUxHT1JBTkRfVFJBTlNBQ1RJT05fTEVOR1RIID0gNTI7XG5jb25zdCBTRUVEX0JZVEVTX0xFTkdUSCA9IDMyO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3RyaW5nIGlzIG9ubHkgY29tcG9zZWQgb2YgaGV4IGNoYXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXliZSBUaGUgc3RyaW5nIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBzdHJpbmcgY29uc2lzdHMgb2Ygb25seSBoZXggY2hhcmFjdGVycywgb3RoZXJ3aXNlIGZhbHNlLlxuICovXG5mdW5jdGlvbiBhbGxIZXhDaGFycyhtYXliZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXihbMC05YS1mXXsyfSkrJC9pLnRlc3QobWF5YmUpO1xufVxuXG4vKipcbiAqIENvbmNhdEFycmF5cyB0YWtlcyB0d28gYXJyYXkgYW5kIHJldHVybnMgYSBqb2ludCBhcnJheSBvZiBib3RoXG4gKlxuICogQHBhcmFtIGEge1VpbnQ4QXJyYXl9IGZpcnN0IGFycmF5IHRvIGNvbmNhdFxuICogQHBhcmFtIGIge1VpbnQ4QXJyYXl9IHNlY29uZCBhcnJheVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIG9mICdhJyBmb2xsb3dlZCBieSBhbGwgZWxlbWVudHMgb2YgJ2InXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdEFycmF5cyhhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGNvbnN0IGMgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCArIGIubGVuZ3RoKTtcbiAgYy5zZXQoYSk7XG4gIGMuc2V0KGIsIGEubGVuZ3RoKTtcbiAgcmV0dXJuIGM7XG59XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYWxnb3Nkay5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHhJZC5sZW5ndGggIT09IDEwNCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhbGxIZXhDaGFycyh0eElkKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5KGtleSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNWYWxpZEVkMjU1MTlTZWNyZXRLZXkoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGhleCBzdHJpbmcgb2YgdGhlIGdpdmVuIGJ1ZmZlclxuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ1ZmZlciAtIHRoZSBidWZmZXIgdG8gYmUgY29udmVydGVkIHRvIGhleFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBoZXggdmFsdWVcbiAgICovXG4gIHRvSGV4KGJ1ZmZlcjogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGhleC5lbmNvZGUoYnVmZmVyLCB0cnVlKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRTaWduYXR1cmUgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdoYXNoIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIHR3byBLZXlzXG4gICAqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5MSAtIGtleSB0byBiZSBjb21wYXJlXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0ga2V5MiAtIGtleSB0byBiZSBjb21wYXJlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHJldHVybnMgdHJ1ZSBpZiBib3RoIGtleXMgYXJlIGVxdWFsXG4gICAqL1xuICBhcmVLZXlzRXF1YWwoa2V5MTogVWludDhBcnJheSwga2V5MjogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuYWNsLnZlcmlmeShrZXkxLCBrZXkyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgVWludDhBcnJheSBvZiB0aGUgZ2l2ZW4gaGV4IHN0cmluZ1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gdGhlIGhleCBzdHJpbmcgdG8gYmUgY29udmVydGVkXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIFVpbnQ4QXJyYXkgdmFsdWVcbiAgICovXG4gIHRvVWludDhBcnJheShzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzdHIsICdoZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzZWVkIGlzIHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VlZCAtIHRoZSBzZWVkIHRvIGJlIHZhbGlkYXRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIGlmIHRoZSBzZWVkIGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkU2VlZChzZWVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHNlZWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoc2VlZC5sZW5ndGggIT09IEFMR09SQU5EX1NFRURfTEVOR1RIKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBUcnkgdG8gZGVjb2RlXG4gICAgbGV0IGRlY29kZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGRlY29kZWQgPSB0aGlzLmRlY29kZVNlZWQoc2VlZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgY2hlY2tzdW1cbiAgICBjb25zdCBjaGVja3N1bSA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgc2hhNTEyLnNoYTUxMl8yNTYuYXJyYXkoZGVjb2RlZC5zZWVkKS5zbGljZShTRUVEX0JZVEVTX0xFTkdUSCAtIEFMR09SQU5EX0NIRUNLU1VNX0JZVEVfTEVOR1RILCBTRUVEX0JZVEVTX0xFTkdUSCksXG4gICAgKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjaGVja3N1bSBtYXRjaGVzIHRoZSBvbmUgZnJvbSB0aGUgZGVjb2RlZCBzZWVkXG4gICAgcmV0dXJuIF8uaXNFcXVhbChjaGVja3N1bSwgZGVjb2RlZC5jaGVja3N1bSk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIGFuIGFsZ28gc2VlZFxuICAgKlxuICAgKiBAcGFyYW0gIHtCdWZmZXJ9IHNlY3JldEtleSAtIHRoZSB2YWxpZCBzZWNyZXRLZXkgLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBzZWVkIHRvIGJlIHZhbGlkYXRlZC5cbiAgICovXG4gIGVuY29kZVNlZWQoc2VjcmV0S2V5OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIC8vIGdldCBzZWVkXG4gICAgY29uc3Qgc2VlZCA9IHNlY3JldEtleS5zbGljZSgwLCBTRUVEX0JZVEVTX0xFTkdUSCk7XG4gICAgLy8gY29tcHV0ZSBjaGVja3N1bVxuICAgIGNvbnN0IGNoZWNrc3VtID0gQnVmZmVyLmZyb20oXG4gICAgICBzaGE1MTIuc2hhNTEyXzI1Ni5hcnJheShzZWVkKS5zbGljZShTRUVEX0JZVEVTX0xFTkdUSCAtIEFMR09SQU5EX0NIRUNLU1VNX0JZVEVfTEVOR1RILCBTRUVEX0JZVEVTX0xFTkdUSCksXG4gICAgKTtcbiAgICBjb25zdCBlbmNvZGVkU2VlZCA9IGJhc2UzMi5lbmNvZGUoY29uY2F0QXJyYXlzKHNlZWQsIGNoZWNrc3VtKSk7XG5cbiAgICByZXR1cm4gZW5jb2RlZFNlZWQudG9TdHJpbmcoKS5zbGljZSgwLCBBTEdPUkFORF9TRUVEX0xFTkdUSCk7IC8vIHJlbW92aW5nIHRoZSBleHRyYSAnPT09PSdcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWNvZGVTZWVkIGRlY29kZXMgYW4gYWxnbyBzZWVkXG4gICAqXG4gICAqIERlY29kaW5nIGFsZ28gc2VlZCBpcyBzYW1lIGFzIGRlY29kaW5nIGFkZHJlc3MuXG4gICAqIExhdGVzdCB2ZXJzaW9uIG9mIGFsZ28gc2RrICgxLjksIGF0IHRoaXMgd3JpdGluZykgZG9lcyBub3QgZXhwb3NlIGV4cGxpY2l0IG1ldGhvZCBmb3IgZGVjb2Rpbmcgc2VlZC5cbiAgICogUGFyYW1ldGVyIGlzIGRlY29kZWQgYW5kIHNwbGl0IGludG8gc2VlZCBhbmQgY2hlY2tzdW0uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWVkIC0gaGV4IG9yIGJhc2U2NCBlbmNvZGVkIHNlZWQgdG8gYmUgdmFsaWRhdGVkXG4gICAqIEByZXR1cm5zIHtTZWVkfSAtIHZhbGlkYXRlZCBvYmplY3QgU2VlZFxuICAgKi9cbiAgZGVjb2RlU2VlZChzZWVkOiBzdHJpbmcpOiBTZWVkIHtcbiAgICAvLyB0cnkgdG8gZGVjb2RlXG4gICAgY29uc3QgZGVjb2RlZCA9IGJhc2UzMi5kZWNvZGUuYXNCeXRlcyhzZWVkKTtcblxuICAgIC8vIFNhbml0eSBjaGVja1xuICAgIGlmIChkZWNvZGVkLmxlbmd0aCAhPT0gQUxHT1JBTkRfU0VFRF9CWVRFX0xFTkdUSCkgdGhyb3cgbmV3IEVycm9yKCdzZWVkIHNlZW1zIHRvIGJlIG1hbGZvcm1lZCcpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWVkOiBuZXcgVWludDhBcnJheShkZWNvZGVkLnNsaWNlKDAsIEFMR09SQU5EX1NFRURfQllURV9MRU5HVEggLSBBTEdPUkFORF9DSEVDS1NVTV9CWVRFX0xFTkdUSCkpLFxuICAgICAgY2hlY2tzdW06IG5ldyBVaW50OEFycmF5KGRlY29kZWQuc2xpY2UoU0VFRF9CWVRFU19MRU5HVEgsIEFMR09SQU5EX1NFRURfQllURV9MRU5HVEgpKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHNpZ25hdHVyZSBmb3IgbWVzc2FnZSBpcyB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIHB1YiB7VWludDhBcnJheX0gcHVibGljIGtleVxuICAgKiBAcGFyYW0gbWVzc2FnZSB7VWludDhBcnJheX0gc2lnbmVkIG1lc3NhZ2VcbiAgICogQHBhcmFtIHNpZ25hdHVyZSB7QnVmZmVyfSBzaWduYXR1cmUgdG8gdmVyaWZ5XG4gICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZC5cbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZShtZXNzYWdlOiBVaW50OEFycmF5LCBzaWduYXR1cmU6IEJ1ZmZlciwgcHViOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobWVzc2FnZSwgc2lnbmF0dXJlLCBwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgYW4gRWQyNTUxOSBwdWJsaWMga2V5IGludG8gYW4gYWxnb3JhbmQgYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHtVaW50OEFycmF5fSBwayBUaGUgRWQyNTUxOSBwdWJsaWMga2V5LlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFsZ29yYW5kLm9yZy9kb2NzL2ZlYXR1cmVzL2FjY291bnRzLyN0cmFuc2Zvcm1hdGlvbi1wdWJsaWMta2V5LXRvLWFsZ29yYW5kLWFkZHJlc3NcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGFsZ29yYW5kIGFkZHJlc3MuXG4gICAqL1xuICBwdWJsaWNLZXlUb0FsZ29BZGRyZXNzKHBrOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IEtleVBhaXIoeyBwdWI6IEJ1ZmZlci5mcm9tKHBrKS50b1N0cmluZygnaGV4JykgfSkuZ2V0QWRkcmVzcygpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB1bnNpZ25lZCBhbGdvIHRyYW5zYWN0aW9uIGNhbiBiZSBkZWNvZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHR4biBUaGUgZW5jb2RlZCB1bnNpZ25lZCB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIGNhbiBiZSBkZWNvZGVkLCBvdGhlcndpc2UgZmFsc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc0RlY29kYWJsZVVuc2lnbmVkQWxnb1R4bih0eG46IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgYWxnb3Nkay5kZWNvZGVVbnNpZ25lZFRyYW5zYWN0aW9uKHR4bik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgc2lnbmVkIGFsZ28gdHJhbnNhY3Rpb24gY2FuIGJlIGRlY29kZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VWludDhBcnJheX0gdHhuIFRoZSBlbmNvZGVkIHNpZ25lZCB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIGNhbiBiZSBkZWNvZGVkLCBvdGhlcndpc2UgZmFsc2VcbiAgICovXG4gIHByb3RlY3RlZCBpc0RlY29kYWJsZVNpZ25lZFRyYW5zYWN0aW9uKHR4bjogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBhbGdvc2RrLmRlY29kZVNpZ25lZFRyYW5zYWN0aW9uKHR4bik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBhIHNpZ25lZCBvciB1bnNpZ25lZCBhbGdvIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXkgfCBzdHJpbmd9IHR4bkJ5dGVzIFRoZSBlbmNvZGVkIHVuc2lnbmVkIG9yIHNpZ25lZCB0eG4uXG4gICAqIEByZXR1cm5zIHtFbmNvZGVkVHh9IFRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgZGVjb2RlQWxnb1R4bih0eG5CeXRlczogVWludDhBcnJheSB8IHN0cmluZyk6IEVuY29kZWRUeCB7XG4gICAgbGV0IGJ1ZmZlciA9XG4gICAgICB0eXBlb2YgdHhuQnl0ZXMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gQnVmZmVyLmZyb20odHhuQnl0ZXMsIGFsbEhleENoYXJzKHR4bkJ5dGVzKSA/ICdoZXgnIDogJ2Jhc2U2NCcpXG4gICAgICAgIDogQnVmZmVyLmZyb20odHhuQnl0ZXMpO1xuXG4gICAgLy8gSW4gb3JkZXIgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBrZXlyZWcgdHJhbnNhY3Rpb25zIGVuY29kZWQgd2l0aFxuICAgIC8vIGZvcmtlZCBhbGdvc2RrIDEuMi4wIChodHRwczovL2dpdGh1Yi5jb20vQml0R28vYWxnb3Nkay1iaXRnbyksXG4gICAgLy8gdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhbmQgcGFyc2VkIGZvbGxvd2luZyB0aGUgbGF0ZXN0IGFsZ29zZGtcbiAgICAvLyByZWxlYXNlIHN0YW5kYXJkLlxuICAgIC8vIFRoaXMgd2F5IHdlIGNhbiBkZWNvZGUgdHJhbnNhY3Rpb25zIHN1Y2Nlc3NmdWxseSBieSBzdGlsbCBtYWludGFpbmluZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgIGNvbnN0IGRlY29kZWRUeCA9IGVuY29kaW5nLmRlY29kZShidWZmZXIpO1xuICAgIGlmIChkZWNvZGVkVHgudHhuICYmIGRlY29kZWRUeC50eG4udHlwZSA9PT0gJ2tleXJlZycpIHtcbiAgICAgIGRlY29kZWRUeC50eG4udm90ZWtleSA9IGRlY29kZWRUeC50eG4udm90ZWtleSB8fCBkZWNvZGVkVHgubXNpZy5zdWJzaWdbMF0ucGs7XG4gICAgICBkZWNvZGVkVHgudHhuLnNlbGtleSA9IGRlY29kZWRUeC50eG4uc2Vsa2V5IHx8IGRlY29kZWRUeC5tc2lnLnN1YnNpZ1swXS5waztcbiAgICAgIGJ1ZmZlciA9IGRlY29kZWRUeC5tc2lnIHx8IGRlY29kZWRUeC5zaWcgPyBlbmNvZGluZy5lbmNvZGUoZGVjb2RlZFR4KSA6IGVuY29kaW5nLmVuY29kZShkZWNvZGVkVHgudHhuKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMudHJ5VG9EZWNvZGVVbnNpZ25lZFRyYW5zYWN0aW9uKGJ1ZmZlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3IgdG8gdHJ5IGRpZmZlcmVudCBmb3JtYXRcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMudHJ5VG9EZWNvZGVTaWduZWRUcmFuc2FjdGlvbihidWZmZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgZGVjb2RlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gZGVjb2RlIGEgc2lnbmVkIEFsZ28gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGJ1ZmZlciB0aGUgZW5jb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7IEVuY29kZWRUeCB9IHRoZSBkZWNvZGVkIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKiBAdGhyb3dzIGVycm9yIGlmIGl0IGlzIG5vdCBhIHZhbGlkIGVuY29kZWQgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICB0cnlUb0RlY29kZVNpZ25lZFRyYW5zYWN0aW9uKGJ1ZmZlcjogQnVmZmVyKTogRW5jb2RlZFR4IHtcbiAgICAvLyBUT0RPOiBSZXBsYWNlIHdpdGhcbiAgICAvLyByZXR1cm4gYWxnb3Nkay5UcmFuc2FjdGlvbi5mcm9tX29ial9mb3JfZW5jb2RpbmcoYWxnb3Nkay5kZWNvZGVTaWduZWRUcmFuc2FjdGlvbihidWZmZXIpLnR4bik7XG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmQvanMtYWxnb3JhbmQtc2RrL2lzc3Vlcy8zNjRcbiAgICAvLyBcIi4uLnNvbWUgcGFydHMgb2YgdGhlIGNvZGViYXNlIHRyZWF0IHRoZSBvdXRwdXQgb2YgVHJhbnNhY3Rpb24uZnJvbV9vYmpfZm9yX2VuY29kaW5nIGFzIEVuY29kZWRUcmFuc2FjdGlvbi5cbiAgICAvLyBUaGV5IG5lZWQgdG8gYmUgZml4ZWQob3Igd2UgYXQgbGVhc3QgbmVlZCB0byBtYWtlIGl0IHNvIFRyYW5zYWN0aW9uIGNvbmZvcm1zIHRvIEVuY29kZWRUcmFuc2FjdGlvbikuXCJcbiAgICBjb25zdCB0eCA9IGFsZ29zZGsuZGVjb2RlU2lnbmVkVHJhbnNhY3Rpb24oYnVmZmVyKTtcblxuICAgIGNvbnN0IHNpZ25lcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2lnbmVkQnk6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHR4Lm1zaWcgJiYgdHgubXNpZy5zdWJzaWcpIHtcbiAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHR4Lm1zaWcuc3Vic2lnKSB7XG4gICAgICAgIGNvbnN0IGFkZHIgPSBhbGdvc2RrLmVuY29kZUFkZHJlc3Moc2lnLnBrKTtcbiAgICAgICAgc2lnbmVycy5wdXNoKGFkZHIpO1xuICAgICAgICBpZiAoc2lnLnMpIHtcbiAgICAgICAgICBzaWduZWRCeS5wdXNoKGFkZHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJhd1RyYW5zYWN0aW9uOiBuZXcgVWludDhBcnJheShidWZmZXIpLFxuICAgICAgdHhuOiB0eC50eG4sXG4gICAgICBzaWduZWQ6IHRydWUsXG4gICAgICBzaWduZXJzOiBzaWduZXJzLFxuICAgICAgc2lnbmVkQnk6IHNpZ25lZEJ5LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGRlY29kZSBhbiB1bnNpZ25lZCBBbGdvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBidWZmZXIgdGhlIGVuY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge0VuY29kZWRUeH0gdGhlIGRlY29kZWQgdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICogQHRocm93cyBlcnJvciBpZiBpdCBpcyBub3QgYSB2YWxpZCBlbmNvZGVkIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICB0cnlUb0RlY29kZVVuc2lnbmVkVHJhbnNhY3Rpb24oYnVmZmVyOiBCdWZmZXIpOiBFbmNvZGVkVHgge1xuICAgIGNvbnN0IHR4biA9IGFsZ29zZGsuZGVjb2RlVW5zaWduZWRUcmFuc2FjdGlvbihidWZmZXIpO1xuICAgIHJldHVybiB7XG4gICAgICByYXdUcmFuc2FjdGlvbjogbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSxcbiAgICAgIHR4bixcbiAgICAgIHNpZ25lZDogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qXG4gICAqIGVuY29kZU9iaiB0YWtlcyBhIGphdmFzY3JpcHQgb2JqZWN0IGFuZCByZXR1cm5zIGl0cyBtc2dwYWNrIGVuY29kaW5nXG4gICAqIE5vdGUgdGhhdCB0aGUgZW5jb2Rpbmcgc29ydHMgdGhlIGZpZWxkcyBhbHBoYWJldGljYWxseVxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIGFueT59IG9iaiBqcyBvYmpcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXl9IFVpbnQ4QXJyYXkgYmluYXJ5IHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICBlbmNvZGVPYmoob2JqOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBhbnk+KTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIGFsZ29zZGsuZW5jb2RlT2JqKG9iaik7XG4gIH1cblxuICAvKipcbiAgICogZGVjb2RlT2JqIHRha2VzIGEgVWludDhBcnJheSBhbmQgcmV0dXJucyBpdHMgamF2YXNjcmlwdCBvYmpcbiAgICogQHBhcmFtIG8gLSBVaW50OEFycmF5IHRvIGRlY29kZVxuICAgKiBAcmV0dXJucyBvYmplY3RcbiAgICovXG4gIGRlY29kZU9iaihvOiBBcnJheUxpa2U8bnVtYmVyPik6IHVua25vd24ge1xuICAgIHJldHVybiBhbGdvc2RrLmRlY29kZU9iaihvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZWNyZXRLZXlUb01uZW1vbmljIHRha2VzIGFuIEFsZ29yYW50IHNlY3JldCBrZXkgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgbW5lbW9uaWNcbiAgICpcbiAgICogQHBhcmFtIHNrIC0gQWxnb3JhbnQgc2VjcmV0IGtleVxuICAgKiBAcmV0dXJuIFNlY3JldCBrZXkgaXMgYXNzb2NpYXRlZCBtbmVtb25pY1xuICAgKi9cbiAgc2VjcmV0S2V5VG9NbmVtb25pYyhzazogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBza1ZhbGlkID0gQnVmZmVyLmZyb20oc2sudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZFByaXZhdGVLZXkoc2tWYWxpZC50b1N0cmluZygnaGV4JykpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEtleShgVGhlIHNlY3JldCBrZXk6ICR7c2sudG9TdHJpbmcoJ2hleCcpfSBpcyBpbnZhbGlkYCk7XG4gICAgfVxuICAgIGNvbnN0IHNrVW5pdDhBcnJheSA9IEJ1ZmZlci5mcm9tKHNrKTtcbiAgICByZXR1cm4gYWxnb3Nkay5zZWNyZXRLZXlUb01uZW1vbmljKHNrVW5pdDhBcnJheSk7XG4gIH1cblxuICAvKipcbiAgICogc2VlZEZyb21NbmVtb25pYyBjb252ZXJ0cyBhIG1uZW1vbmljIGdlbmVyYXRlZCB1c2luZyB0aGlzIGxpYnJhcnkgaW50byB0aGUgc291cmNlIGtleSB1c2VkIHRvIGNyZWF0ZSBpdFxuICAgKiBJdCByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBwYXNzZWQgbW5lbW9uaWMgaGFzIGFuIGluY29ycmVjdCBjaGVja3N1bSwgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpcyB1bmV4cGVjdGVkLCBvciBpZiBvbmVcbiAgICogb2YgdGhlIHBhc3NlZCB3b3JkcyBpcyBub3QgZm91bmQgaW4gdGhlIHdvcmRzIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIG1uZW1vbmljIC0gMjUgd29yZHMgbW5lbW9uaWNcbiAgICogQHJldHVybnMgMzIgYnl0ZXMgbG9uZyBzZWVkXG4gICAqL1xuICBzZWVkRnJvbU1uZW1vbmljKG1uZW1vbmljOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gYWxnb3Nkay5tbmVtb25pY1RvTWFzdGVyRGVyaXZhdGlvbktleShtbmVtb25pYyk7XG4gIH1cblxuICAvKipcbiAgICoga2V5UGFpckZyb21TZWVkIGdlbmVyYXRlcyBhbiBvYmplY3Qgd2l0aCBzZWNyZXRLZXkgYW5kIHB1YmxpY0tleSB1c2luZyB0aGUgYWxnb3Nka1xuICAgKiBAcGFyYW0gc2VlZCAzMiBieXRlcyBsb25nIHNlZWRcbiAgICogQHJldHVybnMgS2V5UGFpclxuICAgKi9cbiAga2V5UGFpckZyb21TZWVkKHNlZWQ6IFVpbnQ4QXJyYXkpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBtbiA9IHRoaXMubW5lbW9uaWNGcm9tU2VlZChzZWVkKTtcbiAgICBjb25zdCBiYXNlNjRQcml2YXRlS2V5ID0gYWxnb3Nkay5tbmVtb25pY1RvU2VjcmV0S2V5KG1uKS5zaztcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVLZXlQYWlyKGJhc2U2NFByaXZhdGVLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IGBLZXlQYWlyYCBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gcHJpdmF0ZSBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBiYXNlNjRQcml2YXRlS2V5IDY0IGJ5dGVzIGxvbmcgcHJpdmF0ZUtleVxuICAgKiBAcmV0dXJucyBLZXlQYWlyXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlS2V5UGFpcihiYXNlNjRQcml2YXRlS2V5OiBVaW50OEFycmF5KTogS2V5UGFpciB7XG4gICAgY29uc3Qgc2sgPSBiYXNlNjRQcml2YXRlS2V5LnNsaWNlKDAsIDMyKTtcbiAgICByZXR1cm4gbmV3IEtleVBhaXIoeyBwcnY6IEJ1ZmZlci5mcm9tKHNrKS50b1N0cmluZygnaGV4JykgfSk7XG4gIH1cblxuICAvKipcbiAgICogZGVjb2RlUHJpdmF0ZUtleSBnZW5lcmF0ZXMgYSBzZWVkIHdpdGggYSBtbmVtb25pYyBhbmQgdXNpbmcgYWxnb3Nkay5cbiAgICpcbiAgICogQHBhcmFtIHNlZWQgMzIgYnl0ZXMgbG9uZyBzZWVkXG4gICAqIEByZXR1cm5zIG1uZW1vbmljIC0gMjUgd29yZHMgbW5lbW9uaWMgLSAyNSB3b3JkcyBtbmVtb25pY1xuICAgKi9cbiAgcHJvdGVjdGVkIG1uZW1vbmljRnJvbVNlZWQoc2VlZDogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGFsZ29zZGsubWFzdGVyRGVyaXZhdGlvbktleVRvTW5lbW9uaWMoc2VlZCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBrZXkgd2l0aCB0aGUgc3RlbGxhci1zZGtcbiAgICpcbiAgICogQHBhcmFtIHB1YmxpY0tleVxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZEVkMjU1MTlQdWJsaWNLZXlTdGVsbGFyKHB1YmxpY0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0ZWxsYXIuU3RyS2V5LmlzVmFsaWRFZDI1NTE5UHVibGljS2V5KHB1YmxpY0tleSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyB0aGUga2V5IHdpdGggdGhlIHN0ZWxsYXItc2RrXG4gICAqXG4gICAqIEBwYXJhbSBwdWJsaWNLZXlcbiAgICogQHJldHVybnMgQnVmZmVyXG4gICAqL1xuICBwcm90ZWN0ZWQgZGVjb2RlRWQyNTUxOVB1YmxpY0tleVN0ZWxsYXIocHVibGljS2V5OiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiBzdGVsbGFyLlN0cktleS5kZWNvZGVFZDI1NTE5UHVibGljS2V5KHB1YmxpY0tleSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIHN0ZWxsYXIgc2VlZCB0byBhbGdvcmFuZCBlbmNvZGluZ1xuICAgKlxuICAgKiBAcGFyYW0gc2VlZFxuICAgKiBAcmV0dXJucyBzdHJpbmcgdGhlIGVuY29kZWQgc2VlZFxuICAgKi9cbiAgY29udmVydEZyb21TdGVsbGFyU2VlZChzZWVkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZWVkRW5jb2RpbmcuZW5jb2RlKHN0ZWxsYXIuU3RyS2V5LmRlY29kZUVkMjU1MTlTZWNyZXRTZWVkKHNlZWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFkZHJlc3MgZW5jb2RlZCB3aXRoIGFsZ29zZGtcbiAgICpcbiAgICogQHBhcmFtIGFkZHJcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBlbmNvZGVBZGRyZXNzKGFkZHI6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBhbGdvc2RrLmVuY29kZUFkZHJlc3MoYWRkcik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGFkZHJlc3MgZGVjb2RlZCB3aXRoIGFsZ29zZGtcbiAgICpcbiAgICogQHBhcmFtIGFkZHJcbiAgICogQHJldHVybnMgQWRkcmVzc1xuICAgKi9cbiAgZGVjb2RlQWRkcmVzcyhhZGRyOiBzdHJpbmcpOiBBZGRyZXNzIHtcbiAgICByZXR1cm4gYWxnb3Nkay5kZWNvZGVBZGRyZXNzKGFkZHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGFkZHJlc3MgaW50byBhbiBBTEdPIG9uZVxuICAgKiBJZiB0aGUgZ2l2ZW4gZGF0YSBpcyBhIFN0ZWxsYXIgYWRkcmVzcyBvciBwdWJsaWMga2V5LCBpdCBpcyBjb252ZXJ0ZWQgdG8gQUxHTyBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzc09yUHViS2V5IGFuIEFMR08gYWRkcmVzcywgb3IgYW4gU3RlbGxhciBhZGRyZXNzIG9yIHB1YmxpYyBrZXlcbiAgICogQHJldHVybnMgYWRkcmVzcyBhbGdvIGFkZHJlc3Mgc3RyaW5nXG4gICAqL1xuICBzdGVsbGFyQWRkcmVzc1RvQWxnb0FkZHJlc3MoYWRkcmVzc09yUHViS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIHdlIGhhdmUgYW4gQWxnb3JhbmQgYWRkcmVzc1xuICAgIGlmICh0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3NPclB1YktleSkpIHtcbiAgICAgIHJldHVybiBhZGRyZXNzT3JQdWJLZXk7XG4gICAgfVxuICAgIC8vIHdlIGhhdmUgYSBzdGVsbGFyIGtleVxuICAgIGlmICh0aGlzLmlzVmFsaWRFZDI1NTE5UHVibGljS2V5U3RlbGxhcihhZGRyZXNzT3JQdWJLZXkpKSB7XG4gICAgICBjb25zdCBzdGVsbGFyUHViID0gdGhpcy5kZWNvZGVFZDI1NTE5UHVibGljS2V5U3RlbGxhcihhZGRyZXNzT3JQdWJLZXkpO1xuICAgICAgY29uc3QgYWxnb0FkZHJlc3MgPSB0aGlzLmVuY29kZUFkZHJlc3Moc3RlbGxhclB1Yik7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkQWRkcmVzcyhhbGdvQWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIGFsZ29BZGRyZXNzO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCBTdGVsbGFyIGFkZHJlc3MgdG8gYW4gQWxnb3JhbmQgYWRkcmVzcyB2aWEgcHVia2V5LicpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05laXRoZXIgYW4gQWxnb3JhbmQgYWRkcmVzcyBub3IgYSBzdGVsbGFyIHB1YmtleS4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBtdWx0aXNpZ0FkZHJlc3MgdGFrZXMgbXVsdGlzaWcgbWV0YWRhdGEgKHByZWltYWdlKSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBodW1hbiByZWFkYWJsZSBBbGdvcmFuZCBhZGRyZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmVyc2lvbiBtdXRsaXNpZyB2ZXJzaW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aHJlc2hvbGQgbXVsdGlzaWcgdGhyZXNob2xkXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFkZHJzIGxpc3Qgb2YgQWxnb3JhbmQgYWRkcmVzc2VzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IGh1bWFuIHJlYWRhYmxlIEFsZ29yYW5kIGFkZHJlc3MuXG4gICAqL1xuICBtdWx0aXNpZ0FkZHJlc3ModmVyc2lvbjogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlciwgYWRkcnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYWxnb3Nkay5tdWx0aXNpZ0FkZHJlc3Moe1xuICAgICAgdmVyc2lvbixcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGFkZHJzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGdlbmVyYXRlQWNjb3VudCBnZW5lcmF0ZXMgdW4gYWNjb3VudCB3aXRoIGEgc2VjcmV0S2V5IGFuZCBhbiBhZGRyZXNzXG4gICAqXG4gICAqIEZ1bmN0aW9uIGhhcyBub3QgcGFyYW1zXG4gICAqIEByZXR1cm5zIEFjY291bnRcbiAgICovXG4gIGdlbmVyYXRlQWNjb3VudCgpOiBhbGdvc2RrLkFjY291bnQge1xuICAgIHJldHVybiBhbGdvc2RrLmdlbmVyYXRlQWNjb3VudCgpO1xuICB9XG5cbiAgZ2VuZXJhdGVBY2NvdW50RnJvbVNlZWQoc2VlZDogVWludDhBcnJheSk6IGFsZ29zZGsuQWNjb3VudCB7XG4gICAgY29uc3Qga2V5cyA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKHNlZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBhZGRyOiBhbGdvc2RrLmVuY29kZUFkZHJlc3Moa2V5cy5wdWJsaWNLZXkpLFxuICAgICAgc2s6IGtleXMuc2VjcmV0S2V5LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIFR4IElEIGZyb20gYW4gZW5jb2RlZCBtdWx0aXNpZyB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBUaGlzIGlzIGRvbmUgYmVjYXVzZSBvZiBhIGNoYW5nZSBtYWRlIG9uIHZlcnNpb24gMS4xMC4xIG9uIGFsZ29zZGsgc28gbWV0aG9kIHR4SUQoKSBvbmx5IHN1cHBvcnRzIFNpZ25lZFRyYW5zYWN0aW9uIHR5cGUuXG4gICAqIChodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmQvanMtYWxnb3JhbmQtc2RrL2Jsb2IvZGV2ZWxvcC9DSEFOR0VMT0cubWQjMTEwMSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR4QmFzZTY0IC0gZW5jb2RlZCBiYXNlNjQgbXVsdGlzaWcgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge3N0cmluZ30gLSB0cmFuc2FjdGlvbiBJRFxuICAgKi9cbiAgZ2V0TXVsdGlzaWdUeElEKHR4QmFzZTY0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR4Qnl0ZXMgPSBCdWZmZXIuZnJvbSh0eEJhc2U2NCwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IGRlY29kZVNpZ25UeCA9IGFsZ29zZGsuZGVjb2RlU2lnbmVkVHJhbnNhY3Rpb24odHhCeXRlcyk7XG4gICAgY29uc3Qgd2VsbEZvcm1lZERlY29kZWRTaWduVHggPSBkZWNvZGVTaWduVHgudHhuLmdldF9vYmpfZm9yX2VuY29kaW5nKCk7XG4gICAgY29uc3QgdHhGb3JFbmNvZGluZyA9IHsgbXNpZzogZGVjb2RlU2lnblR4Lm1zaWcsIHR4bjogd2VsbEZvcm1lZERlY29kZWRTaWduVHggfTtcbiAgICBjb25zdCBlbl9tc2cgPSBlbmNvZGluZy5lbmNvZGUodHhGb3JFbmNvZGluZyk7XG4gICAgY29uc3QgdGFnID0gQnVmZmVyLmZyb20oWzg0LCA4OF0pO1xuICAgIGNvbnN0IGdoID0gQnVmZmVyLmZyb20oY29uY2F0QXJyYXlzKHRhZywgZW5fbXNnKSk7XG4gICAgY29uc3QgaGFzaCA9IEJ1ZmZlci5mcm9tKGFsZ29OYWNsLmdlbmVyaWNIYXNoKGdoKSk7XG4gICAgcmV0dXJuIGJhc2UzMi5lbmNvZGUoaGFzaCkuc2xpY2UoMCwgQUxHT1JBTkRfVFJBTlNBQ1RJT05fTEVOR1RIKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyB0byBlbmFibGUgb3IgZGlzYWJsZSBhIHRva2VuXG4gICAqIEBwYXJhbSBhbW91bnQgdGhlIGFtb3VudCBpbiB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gZnJvbSB0aGUgb3JpZ2luYXRlZCBhZGRyZXNzXG4gICAqIEBwYXJhbSB0byB0aGUgdGFyZ2V0IGFkZHJlc3NcbiAgICogQHBhcmFtIGNsb3NlUmVtYWluZGVyVG8gKG9wdGlvbmFsKSBhZGRyZXNzIHRvIHNlbmQgcmVtYWluaW5nIHVuaXRzIGluIG9yaWdpbmF0ZWQgYWRkcmVzc1xuICAgKiBAcmV0dXJucyAnZW5hYmxlVG9rZW4nIG9yICdkaXNhYmxlVG9rZW4nXG4gICAqL1xuICBnZXRUb2tlblR4VHlwZShhbW91bnQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBjbG9zZVJlbWFpbmRlclRvPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgdHlwZSA9ICd0cmFuc2ZlclRva2VuJztcbiAgICBpZiAoYW1vdW50ID09PSAnMCcgJiYgZnJvbSA9PT0gdG8pIHtcbiAgICAgIHR5cGUgPSAhY2xvc2VSZW1haW5kZXJUbyA/ICdlbmFibGVUb2tlbicgOiAnZGlzYWJsZVRva2VuJztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbn1cblxuY29uc3QgdXRpbHMgPSBuZXcgVXRpbHMoKTtcblxuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=