@bitgo-beta/abstract-eth 1.0.2-beta.233 → 1.0.2-beta.2331

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 (187) hide show
  1. package/dist/src/abstractEthLikeCoin.d.ts +20 -9
  2. package/dist/src/abstractEthLikeCoin.d.ts.map +1 -1
  3. package/dist/src/abstractEthLikeCoin.js +46 -15
  4. package/dist/src/abstractEthLikeNewCoins.d.ts +938 -0
  5. package/dist/src/abstractEthLikeNewCoins.d.ts.map +1 -0
  6. package/dist/src/abstractEthLikeNewCoins.js +2891 -0
  7. package/dist/src/ethLikeToken.d.ts +38 -6
  8. package/dist/src/ethLikeToken.d.ts.map +1 -1
  9. package/dist/src/ethLikeToken.js +292 -10
  10. package/dist/src/index.d.ts +2 -0
  11. package/dist/src/index.d.ts.map +1 -1
  12. package/dist/src/index.js +8 -2
  13. package/dist/src/lib/constants.d.ts +4 -0
  14. package/dist/src/lib/constants.d.ts.map +1 -0
  15. package/dist/src/lib/constants.js +11 -0
  16. package/dist/src/lib/contractCall.d.ts +8 -0
  17. package/dist/src/lib/contractCall.d.ts.map +1 -0
  18. package/dist/src/lib/contractCall.js +17 -0
  19. package/dist/src/lib/decryptionDelegationBuilder.d.ts +90 -0
  20. package/dist/src/lib/decryptionDelegationBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/decryptionDelegationBuilder.js +59 -0
  22. package/dist/src/lib/iface.d.ts +173 -0
  23. package/dist/src/lib/iface.d.ts.map +1 -0
  24. package/dist/src/lib/iface.js +8 -0
  25. package/dist/src/lib/index.d.ts +19 -0
  26. package/dist/src/lib/index.d.ts.map +1 -0
  27. package/dist/src/lib/index.js +60 -0
  28. package/dist/src/lib/keyPair.d.ts +26 -0
  29. package/dist/src/lib/keyPair.d.ts.map +1 -0
  30. package/dist/src/lib/keyPair.js +65 -0
  31. package/dist/src/lib/messages/eip191/eip191Message.d.ts +12 -0
  32. package/dist/src/lib/messages/eip191/eip191Message.d.ts.map +1 -0
  33. package/dist/src/lib/messages/eip191/eip191Message.js +25 -0
  34. package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts +19 -0
  35. package/dist/src/lib/messages/eip191/eip191MessageBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/messages/eip191/eip191MessageBuilder.js +27 -0
  37. package/dist/src/lib/messages/eip191/index.d.ts +3 -0
  38. package/dist/src/lib/messages/eip191/index.d.ts.map +1 -0
  39. package/dist/src/lib/messages/eip191/index.js +19 -0
  40. package/dist/src/lib/messages/eip712/eip712Message.d.ts +6 -0
  41. package/dist/src/lib/messages/eip712/eip712Message.d.ts.map +1 -0
  42. package/dist/src/lib/messages/eip712/eip712Message.js +27 -0
  43. package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts +7 -0
  44. package/dist/src/lib/messages/eip712/eip712MessageBuilder.d.ts.map +1 -0
  45. package/dist/src/lib/messages/eip712/eip712MessageBuilder.js +15 -0
  46. package/dist/src/lib/messages/eip712/index.d.ts +3 -0
  47. package/dist/src/lib/messages/eip712/index.d.ts.map +1 -0
  48. package/dist/src/lib/messages/eip712/index.js +19 -0
  49. package/dist/src/lib/messages/index.d.ts +4 -0
  50. package/dist/src/lib/messages/index.d.ts.map +1 -0
  51. package/dist/src/lib/messages/index.js +20 -0
  52. package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
  53. package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  54. package/dist/src/lib/messages/messageBuilderFactory.js +23 -0
  55. package/dist/src/lib/transaction.d.ts +69 -0
  56. package/dist/src/lib/transaction.d.ts.map +1 -0
  57. package/dist/src/lib/transaction.js +149 -0
  58. package/dist/src/lib/transactionBuilder.d.ts +388 -0
  59. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  60. package/dist/src/lib/transactionBuilder.js +1120 -0
  61. package/dist/src/lib/transferBuilder.d.ts +76 -0
  62. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/transferBuilder.js +307 -0
  64. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts +54 -0
  65. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.d.ts.map +1 -0
  66. package/dist/src/lib/transferBuilders/baseNFTTransferBuilder.js +120 -0
  67. package/dist/src/lib/transferBuilders/index.d.ts +5 -0
  68. package/dist/src/lib/transferBuilders/index.d.ts.map +1 -0
  69. package/dist/src/lib/transferBuilders/index.js +21 -0
  70. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts +17 -0
  71. package/dist/src/lib/transferBuilders/transferBuilderERC1155.d.ts.map +1 -0
  72. package/dist/src/lib/transferBuilders/transferBuilderERC1155.js +96 -0
  73. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts +21 -0
  74. package/dist/src/lib/transferBuilders/transferBuilderERC721.d.ts.map +1 -0
  75. package/dist/src/lib/transferBuilders/transferBuilderERC721.js +91 -0
  76. package/dist/src/lib/transferBuilders/transferBuilderERC7984.d.ts +35 -0
  77. package/dist/src/lib/transferBuilders/transferBuilderERC7984.d.ts.map +1 -0
  78. package/dist/src/lib/transferBuilders/transferBuilderERC7984.js +113 -0
  79. package/dist/src/lib/types.d.ts +40 -0
  80. package/dist/src/lib/types.d.ts.map +1 -0
  81. package/dist/src/lib/types.js +140 -0
  82. package/dist/src/lib/utils.d.ts +386 -0
  83. package/dist/src/lib/utils.d.ts.map +1 -0
  84. package/dist/src/lib/utils.js +1026 -0
  85. package/dist/src/lib/walletUtil.d.ts +46 -0
  86. package/dist/src/lib/walletUtil.d.ts.map +1 -0
  87. package/dist/src/lib/walletUtil.js +53 -0
  88. package/dist/src/lib/zamaUtils.d.ts +257 -0
  89. package/dist/src/lib/zamaUtils.d.ts.map +1 -0
  90. package/dist/src/lib/zamaUtils.js +527 -0
  91. package/dist/src/types.d.ts +9 -0
  92. package/dist/src/types.d.ts.map +1 -0
  93. package/dist/src/types.js +3 -0
  94. package/dist/test/index.d.ts +2 -0
  95. package/dist/test/index.d.ts.map +1 -0
  96. package/dist/test/index.js +18 -0
  97. package/dist/test/unit/coin.d.ts +8 -0
  98. package/dist/test/unit/coin.d.ts.map +1 -0
  99. package/dist/test/unit/coin.js +577 -0
  100. package/dist/test/unit/decryptionDelegationBuilder.d.ts +2 -0
  101. package/dist/test/unit/decryptionDelegationBuilder.d.ts.map +1 -0
  102. package/dist/test/unit/decryptionDelegationBuilder.js +265 -0
  103. package/dist/test/unit/index.d.ts +8 -0
  104. package/dist/test/unit/index.d.ts.map +1 -0
  105. package/dist/test/unit/index.js +24 -0
  106. package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts +3 -0
  107. package/dist/test/unit/messages/abstractEthMessageBuilderTests.d.ts.map +1 -0
  108. package/dist/test/unit/messages/abstractEthMessageBuilderTests.js +110 -0
  109. package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts +43 -0
  110. package/dist/test/unit/messages/abstractEthMessageTestTypes.d.ts.map +1 -0
  111. package/dist/test/unit/messages/abstractEthMessageTestTypes.js +3 -0
  112. package/dist/test/unit/messages/abstractEthMessagesTests.d.ts +3 -0
  113. package/dist/test/unit/messages/abstractEthMessagesTests.d.ts.map +1 -0
  114. package/dist/test/unit/messages/abstractEthMessagesTests.js +129 -0
  115. package/dist/test/unit/messages/eip191/eip191Message.d.ts +2 -0
  116. package/dist/test/unit/messages/eip191/eip191Message.d.ts.map +1 -0
  117. package/dist/test/unit/messages/eip191/eip191Message.js +15 -0
  118. package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts +2 -0
  119. package/dist/test/unit/messages/eip191/eip191MessageBuilder.d.ts.map +1 -0
  120. package/dist/test/unit/messages/eip191/eip191MessageBuilder.js +16 -0
  121. package/dist/test/unit/messages/eip191/fixtures.d.ts +109 -0
  122. package/dist/test/unit/messages/eip191/fixtures.d.ts.map +1 -0
  123. package/dist/test/unit/messages/eip191/fixtures.js +63 -0
  124. package/dist/test/unit/messages/eip712/eip712Message.d.ts +2 -0
  125. package/dist/test/unit/messages/eip712/eip712Message.d.ts.map +1 -0
  126. package/dist/test/unit/messages/eip712/eip712Message.js +15 -0
  127. package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts +2 -0
  128. package/dist/test/unit/messages/eip712/eip712MessageBuilder.d.ts.map +1 -0
  129. package/dist/test/unit/messages/eip712/eip712MessageBuilder.js +16 -0
  130. package/dist/test/unit/messages/eip712/fixtures.d.ts +76 -0
  131. package/dist/test/unit/messages/eip712/fixtures.d.ts.map +1 -0
  132. package/dist/test/unit/messages/eip712/fixtures.js +120 -0
  133. package/dist/test/unit/messages/index.d.ts +4 -0
  134. package/dist/test/unit/messages/index.d.ts.map +1 -0
  135. package/dist/test/unit/messages/index.js +20 -0
  136. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  137. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  138. package/dist/test/unit/messages/messageBuilderFactory.js +52 -0
  139. package/dist/test/unit/token.d.ts +2 -0
  140. package/dist/test/unit/token.d.ts.map +1 -0
  141. package/dist/test/unit/token.js +37 -0
  142. package/dist/test/unit/transaction.d.ts +3 -0
  143. package/dist/test/unit/transaction.d.ts.map +1 -0
  144. package/dist/test/unit/transaction.js +73 -0
  145. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts +8 -0
  146. package/dist/test/unit/transactionBuilder/addressInitialization.d.ts.map +1 -0
  147. package/dist/test/unit/transactionBuilder/addressInitialization.js +95 -0
  148. package/dist/test/unit/transactionBuilder/decryptionDelegation.d.ts +3 -0
  149. package/dist/test/unit/transactionBuilder/decryptionDelegation.d.ts.map +1 -0
  150. package/dist/test/unit/transactionBuilder/decryptionDelegation.js +161 -0
  151. package/dist/test/unit/transactionBuilder/finalizeUnwrapERC7984.d.ts +3 -0
  152. package/dist/test/unit/transactionBuilder/finalizeUnwrapERC7984.d.ts.map +1 -0
  153. package/dist/test/unit/transactionBuilder/finalizeUnwrapERC7984.js +127 -0
  154. package/dist/test/unit/transactionBuilder/flushERC7984.d.ts +3 -0
  155. package/dist/test/unit/transactionBuilder/flushERC7984.d.ts.map +1 -0
  156. package/dist/test/unit/transactionBuilder/flushERC7984.js +292 -0
  157. package/dist/test/unit/transactionBuilder/flushNft.d.ts +2 -0
  158. package/dist/test/unit/transactionBuilder/flushNft.d.ts.map +1 -0
  159. package/dist/test/unit/transactionBuilder/flushNft.js +381 -0
  160. package/dist/test/unit/transactionBuilder/index.d.ts +10 -0
  161. package/dist/test/unit/transactionBuilder/index.d.ts.map +1 -0
  162. package/dist/test/unit/transactionBuilder/index.js +26 -0
  163. package/dist/test/unit/transactionBuilder/send.d.ts +3 -0
  164. package/dist/test/unit/transactionBuilder/send.d.ts.map +1 -0
  165. package/dist/test/unit/transactionBuilder/send.js +197 -0
  166. package/dist/test/unit/transactionBuilder/unwrapERC7984.d.ts +3 -0
  167. package/dist/test/unit/transactionBuilder/unwrapERC7984.d.ts.map +1 -0
  168. package/dist/test/unit/transactionBuilder/unwrapERC7984.js +134 -0
  169. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +11 -0
  170. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
  171. package/dist/test/unit/transactionBuilder/walletInitialization.js +137 -0
  172. package/dist/test/unit/transactionBuilder/wrapERC7984.d.ts +3 -0
  173. package/dist/test/unit/transactionBuilder/wrapERC7984.d.ts.map +1 -0
  174. package/dist/test/unit/transactionBuilder/wrapERC7984.js +140 -0
  175. package/dist/test/unit/transferBuilder.d.ts +2 -0
  176. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  177. package/dist/test/unit/transferBuilder.js +76 -0
  178. package/dist/test/unit/utils.d.ts +2 -0
  179. package/dist/test/unit/utils.d.ts.map +1 -0
  180. package/dist/test/unit/utils.js +214 -0
  181. package/dist/test/unit/zamaUtils.d.ts +2 -0
  182. package/dist/test/unit/zamaUtils.d.ts.map +1 -0
  183. package/dist/test/unit/zamaUtils.js +616 -0
  184. package/dist/tsconfig.tsbuildinfo +1 -8436
  185. package/package.json +34 -10
  186. package/.eslintignore +0 -5
  187. package/CHANGELOG.md +0 -178
@@ -0,0 +1,527 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.finalizeUnwrapMethodId = exports.unwrapMethodId = exports.wrapMethodId = exports.approveMethodId = exports.callFromParentMethodId = exports.aclMulticallMethodId = exports.delegateForUserDecryptionMethodId = exports.UINT64_MAX = exports.finalizeUnwrapTypes = exports.unwrapTypes = exports.wrapTypes = exports.approveTypes = exports.aclMulticallTypes = exports.callFromParentTypes = exports.delegateForUserDecryptionTypes = void 0;
7
+ exports.assertWrapAmountFitsUint64 = assertWrapAmountFitsUint64;
8
+ exports.buildApproveCalldata = buildApproveCalldata;
9
+ exports.decodeApproveCalldata = decodeApproveCalldata;
10
+ exports.buildWrapCalldata = buildWrapCalldata;
11
+ exports.decodeWrapCalldata = decodeWrapCalldata;
12
+ exports.buildUnwrapCalldata = buildUnwrapCalldata;
13
+ exports.decodeUnwrapCalldata = decodeUnwrapCalldata;
14
+ exports.buildFinalizeUnwrapCalldata = buildFinalizeUnwrapCalldata;
15
+ exports.decodeFinalizeUnwrapCalldata = decodeFinalizeUnwrapCalldata;
16
+ exports.buildDelegationCalldata = buildDelegationCalldata;
17
+ exports.buildMulticallDelegationCalldata = buildMulticallDelegationCalldata;
18
+ exports.wrapInCallFromParent = wrapInCallFromParent;
19
+ exports.decodeTokenAddressesFromDelegationCalldata = decodeTokenAddressesFromDelegationCalldata;
20
+ exports.buildConfidentialTransferByHandleCalldata = buildConfidentialTransferByHandleCalldata;
21
+ exports.buildFlushERC7984ForwarderTokenCalldata = buildFlushERC7984ForwarderTokenCalldata;
22
+ exports.decodeFlushERC7984ForwarderTokenCalldata = decodeFlushERC7984ForwarderTokenCalldata;
23
+ const ethereumjs_util_1 = require("ethereumjs-util");
24
+ const ethereumjs_abi_1 = __importDefault(require("ethereumjs-abi"));
25
+ const ethers_1 = require("ethers");
26
+ const walletUtil_1 = require("./walletUtil");
27
+ // ---------------------------------------------------------------------------
28
+ // Constants
29
+ // ---------------------------------------------------------------------------
30
+ // ABI parameter type arrays
31
+ exports.delegateForUserDecryptionTypes = ['address', 'address', 'uint64'];
32
+ exports.callFromParentTypes = ['address', 'uint256', 'bytes'];
33
+ exports.aclMulticallTypes = ['bytes[]'];
34
+ exports.approveTypes = ['address', 'uint256'];
35
+ exports.wrapTypes = ['address', 'uint256'];
36
+ exports.unwrapTypes = ['address', 'address', 'bytes32', 'bytes'];
37
+ exports.finalizeUnwrapTypes = ['bytes32', 'uint64', 'bytes'];
38
+ /** Max value for Solidity `uint64` / ERC-7984 confidential amount domain (`euint64`). */
39
+ exports.UINT64_MAX = 18446744073709551615n;
40
+ /**
41
+ * Function selector for ACL.delegateForUserDecryption(address,address,uint64)
42
+ * = keccak256('delegateForUserDecryption(address,address,uint64)')[0:4]
43
+ */
44
+ exports.delegateForUserDecryptionMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('delegateForUserDecryption', [...exports.delegateForUserDecryptionTypes]).toString('hex'));
45
+ /**
46
+ * Function selector for ACL.multicall(bytes[])
47
+ * = keccak256('multicall(bytes[])')[0:4]
48
+ * ACL inherits OpenZeppelin MulticallUpgradeable — preserves msg.sender via delegatecall.
49
+ */
50
+ exports.aclMulticallMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('multicall', [...exports.aclMulticallTypes]).toString('hex'));
51
+ /**
52
+ * Function selector for ForwarderV4.callFromParent(address,uint256,bytes)
53
+ * = keccak256('callFromParent(address,uint256,bytes)')[0:4]
54
+ */
55
+ exports.callFromParentMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('callFromParent', [...exports.callFromParentTypes]).toString('hex'));
56
+ /**
57
+ * Function selector for ERC-20 approve(address,uint256)
58
+ * = keccak256('approve(address,uint256)')[0:4]
59
+ * Used for exact-amount (and approve(0) reset) approvals of the ERC-7984 wrapper as spender.
60
+ */
61
+ exports.approveMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('approve', [...exports.approveTypes]).toString('hex'));
62
+ /**
63
+ * Function selector for ERC-7984 wrap(address,uint256)
64
+ * = keccak256('wrap(address,uint256)')[0:4]
65
+ * Locks underlying ERC-20 in the wrapper and mints an encrypted balance to `to`.
66
+ */
67
+ exports.wrapMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('wrap', [...exports.wrapTypes]).toString('hex'));
68
+ /**
69
+ * Function selector for ERC-7984 unwrap(address,address,bytes32,bytes)
70
+ * = keccak256('unwrap(address,address,bytes32,bytes)')[0:4]
71
+ * Burns confidential balance and requests release of underlying ERC-20 escrow.
72
+ */
73
+ exports.unwrapMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('unwrap', [...exports.unwrapTypes]).toString('hex'));
74
+ /**
75
+ * Function selector for ERC-7984 finalizeUnwrap(bytes32,uint64,bytes)
76
+ * = keccak256('finalizeUnwrap(bytes32,uint64,bytes)')[0:4]
77
+ * Completes unshield after oracle decryption of the phase-1 unwrap request.
78
+ */
79
+ exports.finalizeUnwrapMethodId = (0, ethereumjs_util_1.addHexPrefix)(ethereumjs_abi_1.default.methodID('finalizeUnwrap', [...exports.finalizeUnwrapTypes]).toString('hex'));
80
+ // ---------------------------------------------------------------------------
81
+ // Encoding functions
82
+ // ---------------------------------------------------------------------------
83
+ /**
84
+ * Asserts that the confidential amount minted by `wrap(to, amount)` fits in uint64 (`euint64`).
85
+ *
86
+ * The wrapper mints `floor(amount / rate())` — `amount` is in underlying-token base units and
87
+ * `rate()` is `10 ** (underlyingDecimals - 6)` (1 when the underlying has <= 6 decimals) — and
88
+ * reverts if that quotient does not fit uint64. For a rate > 1 the underlying amount can therefore
89
+ * be far larger than uint64 (e.g. 1 full 18-decimal token is 1e18 at rate 1e12, minting 1e6).
90
+ *
91
+ * @throws {Error} if amount or rate is invalid, or `floor(amount / rate)` exceeds uint64
92
+ */
93
+ function assertWrapAmountFitsUint64(amount, rate) {
94
+ let amountBn;
95
+ let rateBn;
96
+ try {
97
+ amountBn = typeof amount === 'bigint' ? amount : BigInt(amount);
98
+ }
99
+ catch {
100
+ throw new Error(`assertWrapAmountFitsUint64: invalid amount '${amount}'`);
101
+ }
102
+ try {
103
+ rateBn = typeof rate === 'bigint' ? rate : BigInt(rate);
104
+ }
105
+ catch {
106
+ throw new Error(`assertWrapAmountFitsUint64: invalid rate '${rate}'`);
107
+ }
108
+ if (amountBn <= 0n) {
109
+ throw new Error('assertWrapAmountFitsUint64: amount must be > 0');
110
+ }
111
+ if (rateBn <= 0n) {
112
+ throw new Error('assertWrapAmountFitsUint64: rate must be > 0');
113
+ }
114
+ if (amountBn / rateBn > exports.UINT64_MAX) {
115
+ throw new Error('assertWrapAmountFitsUint64: amount / rate exceeds uint64');
116
+ }
117
+ }
118
+ /**
119
+ * Encodes ERC-20 `approve(spender, amount)` calldata for ERC-7984 shield.
120
+ *
121
+ * The spender is the confidential wrapper contract; the resulting calldata is
122
+ * sent to the underlying ERC-20. Exact-amount approve is used for the shield
123
+ * path; `amount = 0` is the USDT-style allowance reset used when
124
+ * `requiresApprovalReset` is set on the wrapper pair.
125
+ *
126
+ * Does not set gasLimit — WP owns gas.
127
+ *
128
+ * @param wrapperAddress ERC-7984 wrapper contract (spender)
129
+ * @param amount Exact allowance to set (base units); `0` for reset
130
+ * @returns ABI-encoded calldata hex string (0x-prefixed)
131
+ * @throws {Error} if the wrapper address is invalid or amount is negative
132
+ */
133
+ function buildApproveCalldata(wrapperAddress, amount) {
134
+ let checksummedWrapper;
135
+ try {
136
+ checksummedWrapper = ethers_1.ethers.utils.getAddress(wrapperAddress);
137
+ }
138
+ catch {
139
+ throw new Error(`buildApproveCalldata: invalid wrapper address '${wrapperAddress}'`);
140
+ }
141
+ let amountBn;
142
+ try {
143
+ amountBn = typeof amount === 'bigint' ? amount : BigInt(amount);
144
+ }
145
+ catch {
146
+ throw new Error(`buildApproveCalldata: invalid amount '${amount}'`);
147
+ }
148
+ if (amountBn < 0n) {
149
+ throw new Error('buildApproveCalldata: amount must be >= 0');
150
+ }
151
+ const method = ethereumjs_abi_1.default.methodID('approve', [...exports.approveTypes]);
152
+ const args = ethereumjs_abi_1.default.rawEncode([...exports.approveTypes], [checksummedWrapper, amountBn.toString()]);
153
+ return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
154
+ }
155
+ /**
156
+ * Decodes ERC-20 `approve(spender, amount)` calldata.
157
+ *
158
+ * @param data ABI-encoded approve calldata (0x-prefixed)
159
+ * @returns `{ spender, amount }` with checksummed `spender` and decimal-string `amount`
160
+ * @throws {Error} if the selector is not `approve` or the arguments cannot be decoded
161
+ */
162
+ function decodeApproveCalldata(data) {
163
+ if (!data.toLowerCase().startsWith(exports.approveMethodId.toLowerCase())) {
164
+ throw new Error(`decodeApproveCalldata: expected approve selector ${exports.approveMethodId}, got ${data.slice(0, 10)}`);
165
+ }
166
+ // selector (4 bytes) + two 32-byte words; reject trailing bytes so nothing unparsed rides along
167
+ if (data.length !== 2 + 8 + 2 * 64) {
168
+ throw new Error(`decodeApproveCalldata: expected 68 bytes of calldata, got ${(data.length - 2) / 2}`);
169
+ }
170
+ const abiCoder = new ethers_1.ethers.utils.AbiCoder();
171
+ const decoded = abiCoder.decode([...exports.approveTypes], '0x' + data.slice(10));
172
+ return {
173
+ spender: ethers_1.ethers.utils.getAddress(decoded[0]),
174
+ amount: decoded[1].toString(),
175
+ };
176
+ }
177
+ /**
178
+ * Encodes ERC-7984 `wrap(to, amount)` calldata for the shield path.
179
+ *
180
+ * Calldata is sent to the confidential wrapper contract. `to` is the recipient of
181
+ * the minted encrypted balance (self-directed shields use the wallet base address).
182
+ * When `rate` is provided, validates that the minted `floor(amount / rate)` fits uint64 (`euint64`).
183
+ * `rate` is not encoded in calldata (deserialize round-trips omit it).
184
+ *
185
+ * Does not set gasLimit — WP owns gas.
186
+ *
187
+ * @param to Recipient of confidential tokens (checksummed / lowercased accepted)
188
+ * @param amount Underlying ERC-20 amount to wrap (base units); must be > 0
189
+ * @param rate Optional on-chain wrapper `rate()` for uint64 validation
190
+ * @returns ABI-encoded calldata hex string (0x-prefixed)
191
+ * @throws {Error} if address/amount/rate is invalid or floor(amount / rate) exceeds uint64
192
+ */
193
+ function buildWrapCalldata(to, amount, rate) {
194
+ let checksummedTo;
195
+ try {
196
+ checksummedTo = ethers_1.ethers.utils.getAddress(to);
197
+ }
198
+ catch {
199
+ throw new Error(`buildWrapCalldata: invalid to address '${to}'`);
200
+ }
201
+ let amountBn;
202
+ try {
203
+ amountBn = typeof amount === 'bigint' ? amount : BigInt(amount);
204
+ }
205
+ catch {
206
+ throw new Error(`buildWrapCalldata: invalid amount '${amount}'`);
207
+ }
208
+ if (amountBn <= 0n) {
209
+ throw new Error('buildWrapCalldata: amount must be > 0');
210
+ }
211
+ if (rate !== undefined) {
212
+ assertWrapAmountFitsUint64(amountBn, rate);
213
+ }
214
+ const method = ethereumjs_abi_1.default.methodID('wrap', [...exports.wrapTypes]);
215
+ const args = ethereumjs_abi_1.default.rawEncode([...exports.wrapTypes], [checksummedTo, amountBn.toString()]);
216
+ return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
217
+ }
218
+ /**
219
+ * Decodes ERC-7984 `wrap(to, amount)` calldata.
220
+ *
221
+ * @param data ABI-encoded wrap calldata (0x-prefixed)
222
+ * @returns `{ to, amount }` with checksummed `to` and decimal-string `amount`
223
+ */
224
+ function decodeWrapCalldata(data) {
225
+ if (!data.toLowerCase().startsWith(exports.wrapMethodId.toLowerCase())) {
226
+ throw new Error(`decodeWrapCalldata: expected wrap selector ${exports.wrapMethodId}, got ${data.slice(0, 10)}`);
227
+ }
228
+ const abiCoder = new ethers_1.ethers.utils.AbiCoder();
229
+ const decoded = abiCoder.decode([...exports.wrapTypes], '0x' + data.slice(10));
230
+ return {
231
+ to: ethers_1.ethers.utils.getAddress(decoded[0]),
232
+ amount: decoded[1].toString(),
233
+ };
234
+ }
235
+ /**
236
+ * Encodes ERC-7984 `unwrap(from, to, encryptedAmount, inputProof)` calldata for unshield.
237
+ *
238
+ * Calldata is sent to the confidential wrapper. Phase-1 unshield is self-directed:
239
+ * `from` and `to` are both the wallet base address. `encryptedAmount` is the
240
+ * FHE-encrypted burn amount (bytes32 handle) and `inputProof` is the Zama
241
+ * encryption proof — both produced by WP `ZamaRelayerService.encryptAmount`.
242
+ *
243
+ * Does not set gasLimit — WP owns gas.
244
+ *
245
+ * @param from Source of confidential balance (base address)
246
+ * @param to Recipient of released ERC-20 (base address in v1)
247
+ * @param encryptedAmount bytes32 encrypted amount handle (0x-prefixed)
248
+ * @param inputProof Encryption input proof bytes (0x-prefixed)
249
+ * @returns ABI-encoded calldata hex string (0x-prefixed)
250
+ * @throws {Error} if addresses or ciphertext fields are invalid
251
+ */
252
+ function buildUnwrapCalldata(from, to, encryptedAmount, inputProof) {
253
+ let checksummedFrom;
254
+ let checksummedTo;
255
+ try {
256
+ checksummedFrom = ethers_1.ethers.utils.getAddress(from);
257
+ }
258
+ catch {
259
+ throw new Error(`buildUnwrapCalldata: invalid from address '${from}'`);
260
+ }
261
+ try {
262
+ checksummedTo = ethers_1.ethers.utils.getAddress(to);
263
+ }
264
+ catch {
265
+ throw new Error(`buildUnwrapCalldata: invalid to address '${to}'`);
266
+ }
267
+ if (!ethers_1.ethers.utils.isHexString(encryptedAmount) || ethers_1.ethers.utils.hexDataLength(encryptedAmount) !== 32) {
268
+ throw new Error(`buildUnwrapCalldata: encryptedAmount must be a 32-byte hex string, got '${encryptedAmount}'`);
269
+ }
270
+ if (!ethers_1.ethers.utils.isHexString(inputProof) || ethers_1.ethers.utils.hexDataLength(inputProof) === 0) {
271
+ throw new Error(`buildUnwrapCalldata: inputProof must be a non-empty hex string, got '${inputProof}'`);
272
+ }
273
+ const method = ethereumjs_abi_1.default.methodID('unwrap', [...exports.unwrapTypes]);
274
+ const args = ethereumjs_abi_1.default.rawEncode([...exports.unwrapTypes], [checksummedFrom, checksummedTo, (0, ethereumjs_util_1.toBuffer)(encryptedAmount), (0, ethereumjs_util_1.toBuffer)(inputProof)]);
275
+ return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
276
+ }
277
+ /**
278
+ * Decodes ERC-7984 `unwrap(from, to, encryptedAmount, inputProof)` calldata.
279
+ *
280
+ * @param data ABI-encoded unwrap calldata (0x-prefixed)
281
+ */
282
+ function decodeUnwrapCalldata(data) {
283
+ if (!data.toLowerCase().startsWith(exports.unwrapMethodId.toLowerCase())) {
284
+ throw new Error(`decodeUnwrapCalldata: expected unwrap selector ${exports.unwrapMethodId}, got ${data.slice(0, 10)}`);
285
+ }
286
+ const abiCoder = new ethers_1.ethers.utils.AbiCoder();
287
+ const decoded = abiCoder.decode([...exports.unwrapTypes], '0x' + data.slice(10));
288
+ return {
289
+ from: ethers_1.ethers.utils.getAddress(decoded[0]),
290
+ to: ethers_1.ethers.utils.getAddress(decoded[1]),
291
+ encryptedAmount: ethers_1.ethers.utils.hexlify(decoded[2]),
292
+ inputProof: ethers_1.ethers.utils.hexlify(decoded[3]),
293
+ };
294
+ }
295
+ /**
296
+ * Encodes ERC-7984 `finalizeUnwrap(requestId, cleartextAmount, decryptionProof)` calldata.
297
+ *
298
+ * Calldata is sent to the confidential wrapper to complete unshield phase-2 after
299
+ * the Zama oracle returns a cleartext amount and decryption proof for the unwrap
300
+ * request created in phase-1.
301
+ *
302
+ * Does not set gasLimit — WP owns gas.
303
+ *
304
+ * @param requestId bytes32 unwrap request id (0x-prefixed)
305
+ * @param cleartextAmount Decrypted confidential amount (uint64 domain); must be > 0
306
+ * @param decryptionProof Oracle decryption proof bytes (0x-prefixed)
307
+ * @returns ABI-encoded calldata hex string (0x-prefixed)
308
+ * @throws {Error} if requestId, amount, or proof is invalid
309
+ */
310
+ function buildFinalizeUnwrapCalldata(requestId, cleartextAmount, decryptionProof) {
311
+ if (!ethers_1.ethers.utils.isHexString(requestId) || ethers_1.ethers.utils.hexDataLength(requestId) !== 32) {
312
+ throw new Error(`buildFinalizeUnwrapCalldata: requestId must be a 32-byte hex string, got '${requestId}'`);
313
+ }
314
+ let amountBn;
315
+ try {
316
+ amountBn = typeof cleartextAmount === 'bigint' ? cleartextAmount : BigInt(cleartextAmount);
317
+ }
318
+ catch {
319
+ throw new Error(`buildFinalizeUnwrapCalldata: invalid cleartextAmount '${cleartextAmount}'`);
320
+ }
321
+ if (amountBn <= 0n) {
322
+ throw new Error('buildFinalizeUnwrapCalldata: cleartextAmount must be > 0');
323
+ }
324
+ if (amountBn > exports.UINT64_MAX) {
325
+ throw new Error('buildFinalizeUnwrapCalldata: cleartextAmount exceeds uint64');
326
+ }
327
+ if (!ethers_1.ethers.utils.isHexString(decryptionProof) || ethers_1.ethers.utils.hexDataLength(decryptionProof) === 0) {
328
+ throw new Error(`buildFinalizeUnwrapCalldata: decryptionProof must be a non-empty hex string, got '${decryptionProof}'`);
329
+ }
330
+ const method = ethereumjs_abi_1.default.methodID('finalizeUnwrap', [...exports.finalizeUnwrapTypes]);
331
+ const args = ethereumjs_abi_1.default.rawEncode([...exports.finalizeUnwrapTypes], [(0, ethereumjs_util_1.toBuffer)(requestId), amountBn.toString(), (0, ethereumjs_util_1.toBuffer)(decryptionProof)]);
332
+ return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
333
+ }
334
+ /**
335
+ * Decodes ERC-7984 `finalizeUnwrap(requestId, cleartextAmount, decryptionProof)` calldata.
336
+ *
337
+ * @param data ABI-encoded finalizeUnwrap calldata (0x-prefixed)
338
+ */
339
+ function decodeFinalizeUnwrapCalldata(data) {
340
+ if (!data.toLowerCase().startsWith(exports.finalizeUnwrapMethodId.toLowerCase())) {
341
+ throw new Error(`decodeFinalizeUnwrapCalldata: expected finalizeUnwrap selector ${exports.finalizeUnwrapMethodId}, got ${data.slice(0, 10)}`);
342
+ }
343
+ const abiCoder = new ethers_1.ethers.utils.AbiCoder();
344
+ const decoded = abiCoder.decode([...exports.finalizeUnwrapTypes], '0x' + data.slice(10));
345
+ return {
346
+ requestId: ethers_1.ethers.utils.hexlify(decoded[0]),
347
+ cleartextAmount: decoded[1].toString(),
348
+ decryptionProof: ethers_1.ethers.utils.hexlify(decoded[2]),
349
+ };
350
+ }
351
+ /**
352
+ * Encodes a single ACL.delegateForUserDecryption() call.
353
+ *
354
+ * Grants `delegateAddress` the right to decrypt ERC-7984 token balances on
355
+ * behalf of the calling address (msg.sender) for the specified token contract.
356
+ *
357
+ * @param delegateAddress BitGo enterprise viewing key address
358
+ * @param tokenContractAddress ERC-7984 token contract address
359
+ * @param expiryTimestamp Unix seconds; recommended: Math.floor(Date.now()/1000) + 365*86400
360
+ * @returns ABI-encoded calldata hex string (0x-prefixed)
361
+ */
362
+ function buildDelegationCalldata(delegateAddress, tokenContractAddress, expiryTimestamp) {
363
+ const method = ethereumjs_abi_1.default.methodID('delegateForUserDecryption', [...exports.delegateForUserDecryptionTypes]);
364
+ const args = ethereumjs_abi_1.default.rawEncode([...exports.delegateForUserDecryptionTypes], [delegateAddress, tokenContractAddress, expiryTimestamp]);
365
+ return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
366
+ }
367
+ /**
368
+ * Encodes N delegateForUserDecryption calls batched inside ACL.multicall().
369
+ *
370
+ * Produces a single TX that grants delegation for all specified token contracts.
371
+ * Requires tokenContractAddresses.length >= 1.
372
+ * Note: DecryptionDelegationBuilder always uses this function (even for a single token)
373
+ * to keep the transaction shape consistent regardless of token count.
374
+ *
375
+ * @param delegateAddress BitGo enterprise viewing key address
376
+ * @param tokenContractAddresses Array of ERC-7984 token contract addresses
377
+ * @param expiryTimestamp Unix seconds
378
+ * @returns ABI-encoded calldata hex string (0x-prefixed)
379
+ */
380
+ function buildMulticallDelegationCalldata(delegateAddress, tokenContractAddresses, expiryTimestamp) {
381
+ if (tokenContractAddresses.length === 0) {
382
+ throw new Error('buildMulticallDelegationCalldata: tokenContractAddresses must not be empty');
383
+ }
384
+ // Build each inner delegateForUserDecryption call as raw bytes
385
+ const innerCalls = tokenContractAddresses.map((tokenAddress) => {
386
+ const innerMethod = ethereumjs_abi_1.default.methodID('delegateForUserDecryption', [...exports.delegateForUserDecryptionTypes]);
387
+ const innerArgs = ethereumjs_abi_1.default.rawEncode([...exports.delegateForUserDecryptionTypes], [delegateAddress, tokenAddress, expiryTimestamp]);
388
+ return Buffer.concat([innerMethod, innerArgs]);
389
+ });
390
+ // Encode outer multicall(bytes[])
391
+ // ethereumjs-abi v0.6.x has a bug where it omits the per-element offset table
392
+ // for bytes[], producing malformed calldata that on-chain ABI decoders reject.
393
+ // Use ethers AbiCoder which correctly emits the head offset words.
394
+ const outerMethod = ethereumjs_abi_1.default.methodID('multicall', [...exports.aclMulticallTypes]);
395
+ const outerArgs = Buffer.from(new ethers_1.ethers.utils.AbiCoder().encode([...exports.aclMulticallTypes], [innerCalls]).slice(2), 'hex');
396
+ return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([outerMethod, outerArgs]).toString('hex'));
397
+ }
398
+ /**
399
+ * Wraps calldata in a ForwarderV4.callFromParent(target, 0, data) call.
400
+ *
401
+ * Used when a forwarder contract must be msg.sender for an external contract
402
+ * call — for example, when the forwarder itself needs to call
403
+ * ACL.delegateForUserDecryption() so that its own balance can be decrypted.
404
+ *
405
+ * Only the parentAddress (root wallet) is allowed to call callFromParent
406
+ * (enforced by the forwarder's onlyParent modifier).
407
+ *
408
+ * @param targetAddress Address of the contract the forwarder will call (e.g. ACL)
409
+ * @param calldata ABI-encoded inner calldata (e.g. from buildDelegationCalldata)
410
+ * @returns ABI-encoded callFromParent calldata hex string (0x-prefixed)
411
+ */
412
+ function wrapInCallFromParent(targetAddress, calldata) {
413
+ const method = ethereumjs_abi_1.default.methodID('callFromParent', [...exports.callFromParentTypes]);
414
+ const args = ethereumjs_abi_1.default.rawEncode([...exports.callFromParentTypes], [
415
+ targetAddress,
416
+ 0, // value: no ETH transfer
417
+ (0, ethereumjs_util_1.toBuffer)(calldata), // inner calldata as bytes
418
+ ]);
419
+ return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
420
+ }
421
+ /**
422
+ * Decodes token contract addresses from delegation calldata.
423
+ *
424
+ * Handles two shapes of calldata:
425
+ * - Direct ACL.multicall(bytes[]) (root wallet path)
426
+ * - ForwarderV4.callFromParent(address, uint256, bytes) wrapping a multicall (forwarder path)
427
+ *
428
+ * @param calldata ABI-encoded delegation calldata (0x-prefixed or raw hex)
429
+ * @returns Array of token contract addresses (lowercase) found in the delegation calls
430
+ * @throws {Error} if the calldata does not start with a recognised method selector
431
+ */
432
+ function decodeTokenAddressesFromDelegationCalldata(calldata) {
433
+ const data = calldata.startsWith('0x') ? calldata : '0x' + calldata;
434
+ const methodId = data.slice(0, 10);
435
+ const abiCoder = new ethers_1.ethers.utils.AbiCoder();
436
+ let multicallHex;
437
+ if (methodId === exports.callFromParentMethodId) {
438
+ // Decode callFromParent(address, uint256, bytes) — inner bytes is the full multicall calldata.
439
+ // ethers v5 returns `bytes` as a hex string; use hexlify to normalise to a 0x-prefixed hex string
440
+ // regardless of whether the runtime returns a string or a Uint8Array.
441
+ const decoded = abiCoder.decode([...exports.callFromParentTypes], '0x' + data.slice(10));
442
+ multicallHex = ethers_1.ethers.utils.hexlify(decoded[2]);
443
+ }
444
+ else if (methodId === exports.aclMulticallMethodId) {
445
+ multicallHex = data;
446
+ }
447
+ else {
448
+ throw new Error('Not a valid delegation calldata');
449
+ }
450
+ if (multicallHex.slice(0, 10) !== exports.aclMulticallMethodId) {
451
+ throw new Error('Not a valid delegation calldata');
452
+ }
453
+ // Decode multicall(bytes[]) — each element is an inner delegateForUserDecryption call.
454
+ // ethers v5 returns bytes[] elements as hex strings; use hexlify to normalise each element.
455
+ const decoded = abiCoder.decode(['bytes[]'], '0x' + multicallHex.slice(10));
456
+ const innerCalls = decoded[0];
457
+ const tokenAddresses = [];
458
+ for (const innerCall of innerCalls) {
459
+ const innerHex = ethers_1.ethers.utils.hexlify(innerCall).slice(2); // strip 0x
460
+ const innerMethodId = '0x' + innerHex.slice(0, 8);
461
+ if (innerMethodId !== exports.delegateForUserDecryptionMethodId) {
462
+ continue;
463
+ }
464
+ // Decode delegateForUserDecryption(address delegate, address tokenAddress, uint64 expiry)
465
+ const innerDecoded = abiCoder.decode([...exports.delegateForUserDecryptionTypes], '0x' + innerHex.slice(8));
466
+ tokenAddresses.push(innerDecoded[1].toLowerCase());
467
+ }
468
+ return tokenAddresses;
469
+ }
470
+ /**
471
+ * Encodes confidentialTransfer(address to, bytes32 encryptedHandle) calldata.
472
+ * Uses the no-proof variant (selector 0x5bebed7e) — valid when the caller (forwarder)
473
+ * is already ACL-allowed on the handle from when it received the tokens.
474
+ *
475
+ * @param toAddress Address that will receive the tokens
476
+ * @param encryptedHandle bytes32 encrypted balance handle from confidentialBalanceOf
477
+ * @returns ABI-encoded calldata hex string (0x-prefixed)
478
+ */
479
+ function buildConfidentialTransferByHandleCalldata(toAddress, encryptedHandle) {
480
+ const method = Buffer.from(walletUtil_1.confidentialTransferNoProofMethodId.slice(2), 'hex');
481
+ const handleBuffer = (0, ethereumjs_util_1.toBuffer)(encryptedHandle);
482
+ const args = ethereumjs_abi_1.default.rawEncode([...walletUtil_1.confidentialTransferNoProofTypes], [toAddress, handleBuffer]);
483
+ return (0, ethereumjs_util_1.addHexPrefix)(Buffer.concat([method, args]).toString('hex'));
484
+ }
485
+ /**
486
+ * Encodes the full flush calldata for ERC-7984 forwarder consolidation:
487
+ * callFromParent(tokenContractAddress, 0, confidentialTransfer(parentAddress, encryptedHandle))
488
+ * The forwarder executes the inner confidentialTransfer with msg.sender = forwarder.
489
+ *
490
+ * @param tokenContractAddress ERC-7984 token contract address
491
+ * @param parentAddress Root wallet address (destination of flushed tokens)
492
+ * @param encryptedHandle bytes32 encrypted balance handle from confidentialBalanceOf
493
+ * @returns ABI-encoded calldata hex string (0x-prefixed)
494
+ */
495
+ function buildFlushERC7984ForwarderTokenCalldata(tokenContractAddress, parentAddress, encryptedHandle) {
496
+ const innerCalldata = buildConfidentialTransferByHandleCalldata(parentAddress, encryptedHandle);
497
+ return wrapInCallFromParent(tokenContractAddress, innerCalldata);
498
+ }
499
+ /**
500
+ * Decodes a FlushERC7984ForwarderToken calldata.
501
+ * Strips the outer callFromParent wrapper and the inner confidentialTransfer.
502
+ * Returns { tokenContractAddress, parentAddress, encryptedHandle }.
503
+ *
504
+ * @param data ABI-encoded flush calldata (0x-prefixed)
505
+ * @returns Decoded fields
506
+ */
507
+ function decodeFlushERC7984ForwarderTokenCalldata(data) {
508
+ if (!data.startsWith(exports.callFromParentMethodId)) {
509
+ throw new Error(`Invalid FlushERC7984ForwarderToken calldata: expected callFromParent selector, got ${data.slice(0, 10)}`);
510
+ }
511
+ const abiCoder = new ethers_1.ethers.utils.AbiCoder();
512
+ const outerDecoded = abiCoder.decode([...exports.callFromParentTypes], '0x' + data.slice(10));
513
+ const tokenContractAddress = outerDecoded[0];
514
+ const innerCalldata = ethers_1.ethers.utils.hexlify(outerDecoded[2]);
515
+ if (!innerCalldata.startsWith(walletUtil_1.confidentialTransferNoProofMethodId)) {
516
+ throw new Error(`Invalid FlushERC7984ForwarderToken inner calldata: expected confidentialTransfer selector, got ${innerCalldata.slice(0, 10)}`);
517
+ }
518
+ const innerDecoded = abiCoder.decode([...walletUtil_1.confidentialTransferNoProofTypes], '0x' + innerCalldata.slice(10));
519
+ const parentAddress = innerDecoded[0];
520
+ const encryptedHandle = (0, ethereumjs_util_1.bufferToHex)((0, ethereumjs_util_1.toBuffer)(innerDecoded[1]));
521
+ return {
522
+ tokenContractAddress,
523
+ parentAddress,
524
+ encryptedHandle,
525
+ };
526
+ }
527
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemFtYVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi96YW1hVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBeUZBLGdFQXNCQztBQWlCRCxvREFxQkM7QUFTRCxzREFjQztBQWtCRCw4Q0E2QkM7QUFRRCxnREFVQztBQW1CRCxrREEyQkM7QUFPRCxvREFpQkM7QUFpQkQsa0VBa0NDO0FBT0Qsb0VBb0JDO0FBYUQsMERBV0M7QUFlRCw0RUE2QkM7QUFnQkQsb0RBV0M7QUFhRCxnR0F5Q0M7QUFXRCw4RkFLQztBQVlELDBGQU9DO0FBVUQsNEZBa0NDO0FBcm1CRCxxREFBc0U7QUFDdEUsb0VBQXlDO0FBQ3pDLG1DQUFnQztBQUNoQyw2Q0FBcUc7QUFFckcsOEVBQThFO0FBQzlFLFlBQVk7QUFDWiw4RUFBOEU7QUFFOUUsNEJBQTRCO0FBQ2YsUUFBQSw4QkFBOEIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFDM0UsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDL0QsUUFBQSxpQkFBaUIsR0FBRyxDQUFDLFNBQVMsQ0FBVSxDQUFDO0FBQ3pDLFFBQUEsWUFBWSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBVSxDQUFDO0FBQy9DLFFBQUEsU0FBUyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBVSxDQUFDO0FBQzVDLFFBQUEsV0FBVyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDbEUsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFFM0UseUZBQXlGO0FBQzVFLFFBQUEsVUFBVSxHQUFHLHFCQUFxQixDQUFDO0FBQ2hEOzs7R0FHRztBQUNVLFFBQUEsaUNBQWlDLEdB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RUQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsNkNBQWdDLENBQUMsRUFBRSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVHLE1BQU0sYUFBYSxHQUFXLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLGVBQWUsR0FBVyxJQUFBLDZCQUFXLEVBQUMsSUFBQSwwQkFBUSxFQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkUsT0FBTztRQUNMLG9CQUFvQjtRQUNwQixhQUFhO1FBQ2IsZUFBZTtLQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFkZEhleFByZWZpeCwgYnVmZmVyVG9IZXgsIHRvQnVmZmVyIH0gZnJvbSAnZXRoZXJldW1qcy11dGlsJztcbmltcG9ydCBFdGhlcmV1bUFiaSBmcm9tICdldGhlcmV1bWpzLWFiaSc7XG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xuaW1wb3J0IHsgY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQsIGNvbmZpZGVudGlhbFRyYW5zZmVyTm9Qcm9vZlR5cGVzIH0gZnJvbSAnLi93YWxsZXRVdGlsJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBBQkkgcGFyYW1ldGVyIHR5cGUgYXJyYXlzXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzID0gWydhZGRyZXNzJywgJ2FkZHJlc3MnLCAndWludDY0J10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRUeXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2JywgJ2J5dGVzJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsVHlwZXMgPSBbJ2J5dGVzW10nXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBhcHByb3ZlVHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IHdyYXBUeXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2J10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdW53cmFwVHlwZXMgPSBbJ2FkZHJlc3MnLCAnYWRkcmVzcycsICdieXRlczMyJywgJ2J5dGVzJ10gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgZmluYWxpemVVbndyYXBUeXBlcyA9IFsnYnl0ZXMzMicsICd1aW50NjQnLCAnYnl0ZXMnXSBhcyBjb25zdDtcblxuLyoqIE1heCB2YWx1ZSBmb3IgU29saWRpdHkgYHVpbnQ2NGAgLyBFUkMtNzk4NCBjb25maWRlbnRpYWwgYW1vdW50IGRvbWFpbiAoYGV1aW50NjRgKS4gKi9cbmV4cG9ydCBjb25zdCBVSU5UNjRfTUFYID0gMTg0NDY3NDQwNzM3MDk1NTE2MTVuO1xuLyoqXG4gKiBGdW5jdGlvbiBzZWxlY3RvciBmb3IgQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oYWRkcmVzcyxhZGRyZXNzLHVpbnQ2NClcbiAqID0ga2VjY2FrMjU2KCdkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbk1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSlcbiAqID0ga2VjY2FrMjU2KCdtdWx0aWNhbGwoYnl0ZXNbXSknKVswOjRdXG4gKiBBQ0wgaW5oZXJpdHMgT3BlblplcHBlbGluIE11bHRpY2FsbFVwZ3JhZGVhYmxlIOKAlCBwcmVzZXJ2ZXMgbXNnLnNlbmRlciB2aWEgZGVsZWdhdGVjYWxsLlxuICovXG5leHBvcnQgY29uc3QgYWNsTXVsdGljYWxsTWV0aG9kSWQgPSBhZGRIZXhQcmVmaXgoXG4gIEV0aGVyZXVtQWJpLm1ldGhvZElEKCdtdWx0aWNhbGwnLCBbLi4uYWNsTXVsdGljYWxsVHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KGFkZHJlc3MsdWludDI1NixieXRlcylcbiAqID0ga2VjY2FrMjU2KCdjYWxsRnJvbVBhcmVudChhZGRyZXNzLHVpbnQyNTYsYnl0ZXMpJylbMDo0XVxuICovXG5leHBvcnQgY29uc3QgY2FsbEZyb21QYXJlbnRNZXRob2RJZCA9IGFkZEhleFByZWZpeChcbiAgRXRoZXJldW1BYmkubWV0aG9kSUQoJ2NhbGxGcm9tUGFyZW50JywgWy4uLmNhbGxGcm9tUGFyZW50VHlwZXNdKS50b1N0cmluZygnaGV4Jylcbik7XG5cbi8qKlxuICogRnVuY3Rpb24gc2VsZWN0b3IgZm9yIEVSQy0yMCBhcHByb3ZlKGFkZHJlc3MsdWludDI1NilcbiAqID0ga2VjY2FrMjU2KCdhcHByb3ZlKGFkZHJlc3MsdWludDI1NiknKVswOjRdXG4gKiBVc2VkIGZvciBleGFjdC1hbW91bnQgKGFuZCBhcHByb3ZlKDApIHJlc2V0KSBhcHByb3ZhbHMgb2YgdGhlIEVSQy03OTg0IHdyYXBwZXIgYXMgc3BlbmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcHJvdmVNZXRob2RJZCA9IGFkZEhleFByZWZpeChFdGhlcmV1bUFiaS5tZXRob2RJRCgnYXBwcm92ZScsIFsuLi5hcHByb3ZlVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBFUkMtNzk4NCB3cmFwKGFkZHJlc3MsdWludDI1NilcbiAqID0ga2VjY2FrMjU2KCd3cmFwKGFkZHJlc3MsdWludDI1NiknKVswOjRdXG4gKiBMb2NrcyB1bmRlcmx5aW5nIEVSQy0yMCBpbiB0aGUgd3JhcHBlciBhbmQgbWludHMgYW4gZW5jcnlwdGVkIGJhbGFuY2UgdG8gYHRvYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHdyYXBNZXRob2RJZCA9IGFkZEhleFByZWZpeChFdGhlcmV1bUFiaS5tZXRob2RJRCgnd3JhcCcsIFsuLi53cmFwVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBFUkMtNzk4NCB1bndyYXAoYWRkcmVzcyxhZGRyZXNzLGJ5dGVzMzIsYnl0ZXMpXG4gKiA9IGtlY2NhazI1NigndW53cmFwKGFkZHJlc3MsYWRkcmVzcyxieXRlczMyLGJ5dGVzKScpWzA6NF1cbiAqIEJ1cm5zIGNvbmZpZGVudGlhbCBiYWxhbmNlIGFuZCByZXF1ZXN0cyByZWxlYXNlIG9mIHVuZGVybHlpbmcgRVJDLTIwIGVzY3Jvdy5cbiAqL1xuZXhwb3J0IGNvbnN0IHVud3JhcE1ldGhvZElkID0gYWRkSGV4UHJlZml4KEV0aGVyZXVtQWJpLm1ldGhvZElEKCd1bndyYXAnLCBbLi4udW53cmFwVHlwZXNdKS50b1N0cmluZygnaGV4JykpO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHNlbGVjdG9yIGZvciBFUkMtNzk4NCBmaW5hbGl6ZVVud3JhcChieXRlczMyLHVpbnQ2NCxieXRlcylcbiAqID0ga2VjY2FrMjU2KCdmaW5hbGl6ZVVud3JhcChieXRlczMyLHVpbnQ2NCxieXRlcyknKVswOjRdXG4gKiBDb21wbGV0ZXMgdW5zaGllbGQgYWZ0ZXIgb3JhY2xlIGRlY3J5cHRpb24gb2YgdGhlIHBoYXNlLTEgdW53cmFwIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBmaW5hbGl6ZVVud3JhcE1ldGhvZElkID0gYWRkSGV4UHJlZml4KFxuICBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmluYWxpemVVbndyYXAnLCBbLi4uZmluYWxpemVVbndyYXBUeXBlc10pLnRvU3RyaW5nKCdoZXgnKVxuKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNvZGluZyBmdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgY29uZmlkZW50aWFsIGFtb3VudCBtaW50ZWQgYnkgYHdyYXAodG8sIGFtb3VudClgIGZpdHMgaW4gdWludDY0IChgZXVpbnQ2NGApLlxuICpcbiAqIFRoZSB3cmFwcGVyIG1pbnRzIGBmbG9vcihhbW91bnQgLyByYXRlKCkpYCDigJQgYGFtb3VudGAgaXMgaW4gdW5kZXJseWluZy10b2tlbiBiYXNlIHVuaXRzIGFuZFxuICogYHJhdGUoKWAgaXMgYDEwICoqICh1bmRlcmx5aW5nRGVjaW1hbHMgLSA2KWAgKDEgd2hlbiB0aGUgdW5kZXJseWluZyBoYXMgPD0gNiBkZWNpbWFscykg4oCUIGFuZFxuICogcmV2ZXJ0cyBpZiB0aGF0IHF1b3RpZW50IGRvZXMgbm90IGZpdCB1aW50NjQuIEZvciBhIHJhdGUgPiAxIHRoZSB1bmRlcmx5aW5nIGFtb3VudCBjYW4gdGhlcmVmb3JlXG4gKiBiZSBmYXIgbGFyZ2VyIHRoYW4gdWludDY0IChlLmcuIDEgZnVsbCAxOC1kZWNpbWFsIHRva2VuIGlzIDFlMTggYXQgcmF0ZSAxZTEyLCBtaW50aW5nIDFlNikuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IGlmIGFtb3VudCBvciByYXRlIGlzIGludmFsaWQsIG9yIGBmbG9vcihhbW91bnQgLyByYXRlKWAgZXhjZWVkcyB1aW50NjRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdyYXBBbW91bnRGaXRzVWludDY0KGFtb3VudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LCByYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiB2b2lkIHtcbiAgbGV0IGFtb3VudEJuOiBiaWdpbnQ7XG4gIGxldCByYXRlQm46IGJpZ2ludDtcbiAgdHJ5IHtcbiAgICBhbW91bnRCbiA9IHR5cGVvZiBhbW91bnQgPT09ICdiaWdpbnQnID8gYW1vdW50IDogQmlnSW50KGFtb3VudCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYXNzZXJ0V3JhcEFtb3VudEZpdHNVaW50NjQ6IGludmFsaWQgYW1vdW50ICcke2Ftb3VudH0nYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByYXRlQm4gPSB0eXBlb2YgcmF0ZSA9PT0gJ2JpZ2ludCcgPyByYXRlIDogQmlnSW50KHJhdGUpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGFzc2VydFdyYXBBbW91bnRGaXRzVWludDY0OiBpbnZhbGlkIHJhdGUgJyR7cmF0ZX0nYCk7XG4gIH1cbiAgaWYgKGFtb3VudEJuIDw9IDBuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhc3NlcnRXcmFwQW1vdW50Rml0c1VpbnQ2NDogYW1vdW50IG11c3QgYmUgPiAwJyk7XG4gIH1cbiAgaWYgKHJhdGVCbiA8PSAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYXNzZXJ0V3JhcEFtb3VudEZpdHNVaW50NjQ6IHJhdGUgbXVzdCBiZSA+IDAnKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gLyByYXRlQm4gPiBVSU5UNjRfTUFYKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhc3NlcnRXcmFwQW1vdW50Rml0c1VpbnQ2NDogYW1vdW50IC8gcmF0ZSBleGNlZWRzIHVpbnQ2NCcpO1xuICB9XG59XG5cbi8qKlxuICogRW5jb2RlcyBFUkMtMjAgYGFwcHJvdmUoc3BlbmRlciwgYW1vdW50KWAgY2FsbGRhdGEgZm9yIEVSQy03OTg0IHNoaWVsZC5cbiAqXG4gKiBUaGUgc3BlbmRlciBpcyB0aGUgY29uZmlkZW50aWFsIHdyYXBwZXIgY29udHJhY3Q7IHRoZSByZXN1bHRpbmcgY2FsbGRhdGEgaXNcbiAqIHNlbnQgdG8gdGhlIHVuZGVybHlpbmcgRVJDLTIwLiBFeGFjdC1hbW91bnQgYXBwcm92ZSBpcyB1c2VkIGZvciB0aGUgc2hpZWxkXG4gKiBwYXRoOyBgYW1vdW50ID0gMGAgaXMgdGhlIFVTRFQtc3R5bGUgYWxsb3dhbmNlIHJlc2V0IHVzZWQgd2hlblxuICogYHJlcXVpcmVzQXBwcm92YWxSZXNldGAgaXMgc2V0IG9uIHRoZSB3cmFwcGVyIHBhaXIuXG4gKlxuICogRG9lcyBub3Qgc2V0IGdhc0xpbWl0IOKAlCBXUCBvd25zIGdhcy5cbiAqXG4gKiBAcGFyYW0gd3JhcHBlckFkZHJlc3MgIEVSQy03OTg0IHdyYXBwZXIgY29udHJhY3QgKHNwZW5kZXIpXG4gKiBAcGFyYW0gYW1vdW50ICAgICAgICAgIEV4YWN0IGFsbG93YW5jZSB0byBzZXQgKGJhc2UgdW5pdHMpOyBgMGAgZm9yIHJlc2V0XG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd3JhcHBlciBhZGRyZXNzIGlzIGludmFsaWQgb3IgYW1vdW50IGlzIG5lZ2F0aXZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFwcHJvdmVDYWxsZGF0YSh3cmFwcGVyQWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCk6IHN0cmluZyB7XG4gIGxldCBjaGVja3N1bW1lZFdyYXBwZXI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjaGVja3N1bW1lZFdyYXBwZXIgPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyh3cmFwcGVyQWRkcmVzcyk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRBcHByb3ZlQ2FsbGRhdGE6IGludmFsaWQgd3JhcHBlciBhZGRyZXNzICcke3dyYXBwZXJBZGRyZXNzfSdgKTtcbiAgfVxuXG4gIGxldCBhbW91bnRCbjogYmlnaW50O1xuICB0cnkge1xuICAgIGFtb3VudEJuID0gdHlwZW9mIGFtb3VudCA9PT0gJ2JpZ2ludCcgPyBhbW91bnQgOiBCaWdJbnQoYW1vdW50KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZEFwcHJvdmVDYWxsZGF0YTogaW52YWxpZCBhbW91bnQgJyR7YW1vdW50fSdgKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gPCAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRBcHByb3ZlQ2FsbGRhdGE6IGFtb3VudCBtdXN0IGJlID49IDAnKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCdhcHByb3ZlJywgWy4uLmFwcHJvdmVUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFsuLi5hcHByb3ZlVHlwZXNdLCBbY2hlY2tzdW1tZWRXcmFwcGVyLCBhbW91bnRCbi50b1N0cmluZygpXSk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIEVSQy0yMCBgYXBwcm92ZShzcGVuZGVyLCBhbW91bnQpYCBjYWxsZGF0YS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBQkktZW5jb2RlZCBhcHByb3ZlIGNhbGxkYXRhICgweC1wcmVmaXhlZClcbiAqIEByZXR1cm5zIGB7IHNwZW5kZXIsIGFtb3VudCB9YCB3aXRoIGNoZWNrc3VtbWVkIGBzcGVuZGVyYCBhbmQgZGVjaW1hbC1zdHJpbmcgYGFtb3VudGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2VsZWN0b3IgaXMgbm90IGBhcHByb3ZlYCBvciB0aGUgYXJndW1lbnRzIGNhbm5vdCBiZSBkZWNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVBcHByb3ZlQ2FsbGRhdGEoZGF0YTogc3RyaW5nKTogeyBzcGVuZGVyOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH0ge1xuICBpZiAoIWRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGFwcHJvdmVNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVjb2RlQXBwcm92ZUNhbGxkYXRhOiBleHBlY3RlZCBhcHByb3ZlIHNlbGVjdG9yICR7YXBwcm92ZU1ldGhvZElkfSwgZ290ICR7ZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gIH1cbiAgLy8gc2VsZWN0b3IgKDQgYnl0ZXMpICsgdHdvIDMyLWJ5dGUgd29yZHM7IHJlamVjdCB0cmFpbGluZyBieXRlcyBzbyBub3RoaW5nIHVucGFyc2VkIHJpZGVzIGFsb25nXG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gMiArIDggKyAyICogNjQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY29kZUFwcHJvdmVDYWxsZGF0YTogZXhwZWN0ZWQgNjggYnl0ZXMgb2YgY2FsbGRhdGEsIGdvdCAkeyhkYXRhLmxlbmd0aCAtIDIpIC8gMn1gKTtcbiAgfVxuICBjb25zdCBhYmlDb2RlciA9IG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKTtcbiAgY29uc3QgZGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uYXBwcm92ZVR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgcmV0dXJuIHtcbiAgICBzcGVuZGVyOiBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhkZWNvZGVkWzBdKSxcbiAgICBhbW91bnQ6IGRlY29kZWRbMV0udG9TdHJpbmcoKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIEVSQy03OTg0IGB3cmFwKHRvLCBhbW91bnQpYCBjYWxsZGF0YSBmb3IgdGhlIHNoaWVsZCBwYXRoLlxuICpcbiAqIENhbGxkYXRhIGlzIHNlbnQgdG8gdGhlIGNvbmZpZGVudGlhbCB3cmFwcGVyIGNvbnRyYWN0LiBgdG9gIGlzIHRoZSByZWNpcGllbnQgb2ZcbiAqIHRoZSBtaW50ZWQgZW5jcnlwdGVkIGJhbGFuY2UgKHNlbGYtZGlyZWN0ZWQgc2hpZWxkcyB1c2UgdGhlIHdhbGxldCBiYXNlIGFkZHJlc3MpLlxuICogV2hlbiBgcmF0ZWAgaXMgcHJvdmlkZWQsIHZhbGlkYXRlcyB0aGF0IHRoZSBtaW50ZWQgYGZsb29yKGFtb3VudCAvIHJhdGUpYCBmaXRzIHVpbnQ2NCAoYGV1aW50NjRgKS5cbiAqIGByYXRlYCBpcyBub3QgZW5jb2RlZCBpbiBjYWxsZGF0YSAoZGVzZXJpYWxpemUgcm91bmQtdHJpcHMgb21pdCBpdCkuXG4gKlxuICogRG9lcyBub3Qgc2V0IGdhc0xpbWl0IOKAlCBXUCBvd25zIGdhcy5cbiAqXG4gKiBAcGFyYW0gdG8gICAgICBSZWNpcGllbnQgb2YgY29uZmlkZW50aWFsIHRva2VucyAoY2hlY2tzdW1tZWQgLyBsb3dlcmNhc2VkIGFjY2VwdGVkKVxuICogQHBhcmFtIGFtb3VudCAgVW5kZXJseWluZyBFUkMtMjAgYW1vdW50IHRvIHdyYXAgKGJhc2UgdW5pdHMpOyBtdXN0IGJlID4gMFxuICogQHBhcmFtIHJhdGUgICAgT3B0aW9uYWwgb24tY2hhaW4gd3JhcHBlciBgcmF0ZSgpYCBmb3IgdWludDY0IHZhbGlkYXRpb25cbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICogQHRocm93cyB7RXJyb3J9IGlmIGFkZHJlc3MvYW1vdW50L3JhdGUgaXMgaW52YWxpZCBvciBmbG9vcihhbW91bnQgLyByYXRlKSBleGNlZWRzIHVpbnQ2NFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRXcmFwQ2FsbGRhdGEoXG4gIHRvOiBzdHJpbmcsXG4gIGFtb3VudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICByYXRlPzogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50XG4pOiBzdHJpbmcge1xuICBsZXQgY2hlY2tzdW1tZWRUbzogc3RyaW5nO1xuICB0cnkge1xuICAgIGNoZWNrc3VtbWVkVG8gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyh0byk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRXcmFwQ2FsbGRhdGE6IGludmFsaWQgdG8gYWRkcmVzcyAnJHt0b30nYCk7XG4gIH1cblxuICBsZXQgYW1vdW50Qm46IGJpZ2ludDtcbiAgdHJ5IHtcbiAgICBhbW91bnRCbiA9IHR5cGVvZiBhbW91bnQgPT09ICdiaWdpbnQnID8gYW1vdW50IDogQmlnSW50KGFtb3VudCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRXcmFwQ2FsbGRhdGE6IGludmFsaWQgYW1vdW50ICcke2Ftb3VudH0nYCk7XG4gIH1cbiAgaWYgKGFtb3VudEJuIDw9IDBuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidWlsZFdyYXBDYWxsZGF0YTogYW1vdW50IG11c3QgYmUgPiAwJyk7XG4gIH1cblxuICBpZiAocmF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0V3JhcEFtb3VudEZpdHNVaW50NjQoYW1vdW50Qm4sIHJhdGUpO1xuICB9XG5cbiAgY29uc3QgbWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ3dyYXAnLCBbLi4ud3JhcFR5cGVzXSk7XG4gIGNvbnN0IGFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoWy4uLndyYXBUeXBlc10sIFtjaGVja3N1bW1lZFRvLCBhbW91bnRCbi50b1N0cmluZygpXSk7XG4gIHJldHVybiBhZGRIZXhQcmVmaXgoQnVmZmVyLmNvbmNhdChbbWV0aG9kLCBhcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIEVSQy03OTg0IGB3cmFwKHRvLCBhbW91bnQpYCBjYWxsZGF0YS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBQkktZW5jb2RlZCB3cmFwIGNhbGxkYXRhICgweC1wcmVmaXhlZClcbiAqIEByZXR1cm5zIGB7IHRvLCBhbW91bnQgfWAgd2l0aCBjaGVja3N1bW1lZCBgdG9gIGFuZCBkZWNpbWFsLXN0cmluZyBgYW1vdW50YFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlV3JhcENhbGxkYXRhKGRhdGE6IHN0cmluZyk6IHsgdG86IHN0cmluZzsgYW1vdW50OiBzdHJpbmcgfSB7XG4gIGlmICghZGF0YS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgod3JhcE1ldGhvZElkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZWNvZGVXcmFwQ2FsbGRhdGE6IGV4cGVjdGVkIHdyYXAgc2VsZWN0b3IgJHt3cmFwTWV0aG9kSWR9LCBnb3QgJHtkYXRhLnNsaWNlKDAsIDEwKX1gKTtcbiAgfVxuICBjb25zdCBhYmlDb2RlciA9IG5ldyBldGhlcnMudXRpbHMuQWJpQ29kZXIoKTtcbiAgY29uc3QgZGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4ud3JhcFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgcmV0dXJuIHtcbiAgICB0bzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoZGVjb2RlZFswXSksXG4gICAgYW1vdW50OiBkZWNvZGVkWzFdLnRvU3RyaW5nKCksXG4gIH07XG59XG5cbi8qKlxuICogRW5jb2RlcyBFUkMtNzk4NCBgdW53cmFwKGZyb20sIHRvLCBlbmNyeXB0ZWRBbW91bnQsIGlucHV0UHJvb2YpYCBjYWxsZGF0YSBmb3IgdW5zaGllbGQuXG4gKlxuICogQ2FsbGRhdGEgaXMgc2VudCB0byB0aGUgY29uZmlkZW50aWFsIHdyYXBwZXIuIFBoYXNlLTEgdW5zaGllbGQgaXMgc2VsZi1kaXJlY3RlZDpcbiAqIGBmcm9tYCBhbmQgYHRvYCBhcmUgYm90aCB0aGUgd2FsbGV0IGJhc2UgYWRkcmVzcy4gYGVuY3J5cHRlZEFtb3VudGAgaXMgdGhlXG4gKiBGSEUtZW5jcnlwdGVkIGJ1cm4gYW1vdW50IChieXRlczMyIGhhbmRsZSkgYW5kIGBpbnB1dFByb29mYCBpcyB0aGUgWmFtYVxuICogZW5jcnlwdGlvbiBwcm9vZiDigJQgYm90aCBwcm9kdWNlZCBieSBXUCBgWmFtYVJlbGF5ZXJTZXJ2aWNlLmVuY3J5cHRBbW91bnRgLlxuICpcbiAqIERvZXMgbm90IHNldCBnYXNMaW1pdCDigJQgV1Agb3ducyBnYXMuXG4gKlxuICogQHBhcmFtIGZyb20gICAgICAgICAgICAgU291cmNlIG9mIGNvbmZpZGVudGlhbCBiYWxhbmNlIChiYXNlIGFkZHJlc3MpXG4gKiBAcGFyYW0gdG8gICAgICAgICAgICAgICBSZWNpcGllbnQgb2YgcmVsZWFzZWQgRVJDLTIwIChiYXNlIGFkZHJlc3MgaW4gdjEpXG4gKiBAcGFyYW0gZW5jcnlwdGVkQW1vdW50ICBieXRlczMyIGVuY3J5cHRlZCBhbW91bnQgaGFuZGxlICgweC1wcmVmaXhlZClcbiAqIEBwYXJhbSBpbnB1dFByb29mICAgICAgIEVuY3J5cHRpb24gaW5wdXQgcHJvb2YgYnl0ZXMgKDB4LXByZWZpeGVkKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYWRkcmVzc2VzIG9yIGNpcGhlcnRleHQgZmllbGRzIGFyZSBpbnZhbGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVud3JhcENhbGxkYXRhKGZyb206IHN0cmluZywgdG86IHN0cmluZywgZW5jcnlwdGVkQW1vdW50OiBzdHJpbmcsIGlucHV0UHJvb2Y6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBjaGVja3N1bW1lZEZyb206IHN0cmluZztcbiAgbGV0IGNoZWNrc3VtbWVkVG86IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjaGVja3N1bW1lZEZyb20gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhmcm9tKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBidWlsZFVud3JhcENhbGxkYXRhOiBpbnZhbGlkIGZyb20gYWRkcmVzcyAnJHtmcm9tfSdgKTtcbiAgfVxuICB0cnkge1xuICAgIGNoZWNrc3VtbWVkVG8gPSBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyh0byk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRVbndyYXBDYWxsZGF0YTogaW52YWxpZCB0byBhZGRyZXNzICcke3RvfSdgKTtcbiAgfVxuXG4gIGlmICghZXRoZXJzLnV0aWxzLmlzSGV4U3RyaW5nKGVuY3J5cHRlZEFtb3VudCkgfHwgZXRoZXJzLnV0aWxzLmhleERhdGFMZW5ndGgoZW5jcnlwdGVkQW1vdW50KSAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkVW53cmFwQ2FsbGRhdGE6IGVuY3J5cHRlZEFtb3VudCBtdXN0IGJlIGEgMzItYnl0ZSBoZXggc3RyaW5nLCBnb3QgJyR7ZW5jcnlwdGVkQW1vdW50fSdgKTtcbiAgfVxuICBpZiAoIWV0aGVycy51dGlscy5pc0hleFN0cmluZyhpbnB1dFByb29mKSB8fCBldGhlcnMudXRpbHMuaGV4RGF0YUxlbmd0aChpbnB1dFByb29mKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRVbndyYXBDYWxsZGF0YTogaW5wdXRQcm9vZiBtdXN0IGJlIGEgbm9uLWVtcHR5IGhleCBzdHJpbmcsIGdvdCAnJHtpbnB1dFByb29mfSdgKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGhvZCA9IEV0aGVyZXVtQWJpLm1ldGhvZElEKCd1bndyYXAnLCBbLi4udW53cmFwVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICBbLi4udW53cmFwVHlwZXNdLFxuICAgIFtjaGVja3N1bW1lZEZyb20sIGNoZWNrc3VtbWVkVG8sIHRvQnVmZmVyKGVuY3J5cHRlZEFtb3VudCksIHRvQnVmZmVyKGlucHV0UHJvb2YpXVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyBFUkMtNzk4NCBgdW53cmFwKGZyb20sIHRvLCBlbmNyeXB0ZWRBbW91bnQsIGlucHV0UHJvb2YpYCBjYWxsZGF0YS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBQkktZW5jb2RlZCB1bndyYXAgY2FsbGRhdGEgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVW53cmFwQ2FsbGRhdGEoZGF0YTogc3RyaW5nKToge1xuICBmcm9tOiBzdHJpbmc7XG4gIHRvOiBzdHJpbmc7XG4gIGVuY3J5cHRlZEFtb3VudDogc3RyaW5nO1xuICBpbnB1dFByb29mOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFkYXRhLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh1bndyYXBNZXRob2RJZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVjb2RlVW53cmFwQ2FsbGRhdGE6IGV4cGVjdGVkIHVud3JhcCBzZWxlY3RvciAke3Vud3JhcE1ldGhvZElkfSwgZ290ICR7ZGF0YS5zbGljZSgwLCAxMCl9YCk7XG4gIH1cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLnVud3JhcFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBldGhlcnMudXRpbHMuZ2V0QWRkcmVzcyhkZWNvZGVkWzBdKSxcbiAgICB0bzogZXRoZXJzLnV0aWxzLmdldEFkZHJlc3MoZGVjb2RlZFsxXSksXG4gICAgZW5jcnlwdGVkQW1vdW50OiBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzJdKSxcbiAgICBpbnB1dFByb29mOiBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzNdKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIEVSQy03OTg0IGBmaW5hbGl6ZVVud3JhcChyZXF1ZXN0SWQsIGNsZWFydGV4dEFtb3VudCwgZGVjcnlwdGlvblByb29mKWAgY2FsbGRhdGEuXG4gKlxuICogQ2FsbGRhdGEgaXMgc2VudCB0byB0aGUgY29uZmlkZW50aWFsIHdyYXBwZXIgdG8gY29tcGxldGUgdW5zaGllbGQgcGhhc2UtMiBhZnRlclxuICogdGhlIFphbWEgb3JhY2xlIHJldHVybnMgYSBjbGVhcnRleHQgYW1vdW50IGFuZCBkZWNyeXB0aW9uIHByb29mIGZvciB0aGUgdW53cmFwXG4gKiByZXF1ZXN0IGNyZWF0ZWQgaW4gcGhhc2UtMS5cbiAqXG4gKiBEb2VzIG5vdCBzZXQgZ2FzTGltaXQg4oCUIFdQIG93bnMgZ2FzLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0SWQgICAgICAgICBieXRlczMyIHVud3JhcCByZXF1ZXN0IGlkICgweC1wcmVmaXhlZClcbiAqIEBwYXJhbSBjbGVhcnRleHRBbW91bnQgICBEZWNyeXB0ZWQgY29uZmlkZW50aWFsIGFtb3VudCAodWludDY0IGRvbWFpbik7IG11c3QgYmUgPiAwXG4gKiBAcGFyYW0gZGVjcnlwdGlvblByb29mICAgT3JhY2xlIGRlY3J5cHRpb24gcHJvb2YgYnl0ZXMgKDB4LXByZWZpeGVkKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcmVxdWVzdElkLCBhbW91bnQsIG9yIHByb29mIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmluYWxpemVVbndyYXBDYWxsZGF0YShcbiAgcmVxdWVzdElkOiBzdHJpbmcsXG4gIGNsZWFydGV4dEFtb3VudDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICBkZWNyeXB0aW9uUHJvb2Y6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgaWYgKCFldGhlcnMudXRpbHMuaXNIZXhTdHJpbmcocmVxdWVzdElkKSB8fCBldGhlcnMudXRpbHMuaGV4RGF0YUxlbmd0aChyZXF1ZXN0SWQpICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRGaW5hbGl6ZVVud3JhcENhbGxkYXRhOiByZXF1ZXN0SWQgbXVzdCBiZSBhIDMyLWJ5dGUgaGV4IHN0cmluZywgZ290ICcke3JlcXVlc3RJZH0nYCk7XG4gIH1cblxuICBsZXQgYW1vdW50Qm46IGJpZ2ludDtcbiAgdHJ5IHtcbiAgICBhbW91bnRCbiA9IHR5cGVvZiBjbGVhcnRleHRBbW91bnQgPT09ICdiaWdpbnQnID8gY2xlYXJ0ZXh0QW1vdW50IDogQmlnSW50KGNsZWFydGV4dEFtb3VudCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnVpbGRGaW5hbGl6ZVVud3JhcENhbGxkYXRhOiBpbnZhbGlkIGNsZWFydGV4dEFtb3VudCAnJHtjbGVhcnRleHRBbW91bnR9J2ApO1xuICB9XG4gIGlmIChhbW91bnRCbiA8PSAwbikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVpbGRGaW5hbGl6ZVVud3JhcENhbGxkYXRhOiBjbGVhcnRleHRBbW91bnQgbXVzdCBiZSA+IDAnKTtcbiAgfVxuICBpZiAoYW1vdW50Qm4gPiBVSU5UNjRfTUFYKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidWlsZEZpbmFsaXplVW53cmFwQ2FsbGRhdGE6IGNsZWFydGV4dEFtb3VudCBleGNlZWRzIHVpbnQ2NCcpO1xuICB9XG5cbiAgaWYgKCFldGhlcnMudXRpbHMuaXNIZXhTdHJpbmcoZGVjcnlwdGlvblByb29mKSB8fCBldGhlcnMudXRpbHMuaGV4RGF0YUxlbmd0aChkZWNyeXB0aW9uUHJvb2YpID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGJ1aWxkRmluYWxpemVVbndyYXBDYWxsZGF0YTogZGVjcnlwdGlvblByb29mIG11c3QgYmUgYSBub24tZW1wdHkgaGV4IHN0cmluZywgZ290ICcke2RlY3J5cHRpb25Qcm9vZn0nYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZmluYWxpemVVbndyYXAnLCBbLi4uZmluYWxpemVVbndyYXBUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5maW5hbGl6ZVVud3JhcFR5cGVzXSxcbiAgICBbdG9CdWZmZXIocmVxdWVzdElkKSwgYW1vdW50Qm4udG9TdHJpbmcoKSwgdG9CdWZmZXIoZGVjcnlwdGlvblByb29mKV1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIERlY29kZXMgRVJDLTc5ODQgYGZpbmFsaXplVW53cmFwKHJlcXVlc3RJZCwgY2xlYXJ0ZXh0QW1vdW50LCBkZWNyeXB0aW9uUHJvb2YpYCBjYWxsZGF0YS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBQkktZW5jb2RlZCBmaW5hbGl6ZVVud3JhcCBjYWxsZGF0YSAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVGaW5hbGl6ZVVud3JhcENhbGxkYXRhKGRhdGE6IHN0cmluZyk6IHtcbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIGNsZWFydGV4dEFtb3VudDogc3RyaW5nO1xuICBkZWNyeXB0aW9uUHJvb2Y6IHN0cmluZztcbn0ge1xuICBpZiAoIWRhdGEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGZpbmFsaXplVW53cmFwTWV0aG9kSWQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZGVjb2RlRmluYWxpemVVbndyYXBDYWxsZGF0YTogZXhwZWN0ZWQgZmluYWxpemVVbndyYXAgc2VsZWN0b3IgJHtmaW5hbGl6ZVVud3JhcE1ldGhvZElkfSwgZ290ICR7ZGF0YS5zbGljZShcbiAgICAgICAgMCxcbiAgICAgICAgMTBcbiAgICAgICl9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IGRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmZpbmFsaXplVW53cmFwVHlwZXNdLCAnMHgnICsgZGF0YS5zbGljZSgxMCkpO1xuICByZXR1cm4ge1xuICAgIHJlcXVlc3RJZDogZXRoZXJzLnV0aWxzLmhleGxpZnkoZGVjb2RlZFswXSksXG4gICAgY2xlYXJ0ZXh0QW1vdW50OiBkZWNvZGVkWzFdLnRvU3RyaW5nKCksXG4gICAgZGVjcnlwdGlvblByb29mOiBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzJdKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgc2luZ2xlIEFDTC5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uKCkgY2FsbC5cbiAqXG4gKiBHcmFudHMgYGRlbGVnYXRlQWRkcmVzc2AgdGhlIHJpZ2h0IHRvIGRlY3J5cHQgRVJDLTc5ODQgdG9rZW4gYmFsYW5jZXMgb25cbiAqIGJlaGFsZiBvZiB0aGUgY2FsbGluZyBhZGRyZXNzIChtc2cuc2VuZGVyKSBmb3IgdGhlIHNwZWNpZmllZCB0b2tlbiBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0gZGVsZWdhdGVBZGRyZXNzICAgICAgIEJpdEdvIGVudGVycHJpc2Ugdmlld2luZyBrZXkgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzICBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzXG4gKiBAcGFyYW0gZXhwaXJ5VGltZXN0YW1wICAgICAgIFVuaXggc2Vjb25kczsgcmVjb21tZW5kZWQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKS8xMDAwKSArIDM2NSo4NjQwMFxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbGVnYXRpb25DYWxsZGF0YShcbiAgZGVsZWdhdGVBZGRyZXNzOiBzdHJpbmcsXG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcsXG4gIGV4cGlyeVRpbWVzdGFtcDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShcbiAgICBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSxcbiAgICBbZGVsZWdhdGVBZGRyZXNzLCB0b2tlbkNvbnRyYWN0QWRkcmVzcywgZXhwaXJ5VGltZXN0YW1wXVxuICApO1xuICByZXR1cm4gYWRkSGV4UHJlZml4KEJ1ZmZlci5jb25jYXQoW21ldGhvZCwgYXJnc10pLnRvU3RyaW5nKCdoZXgnKSk7XG59XG5cbi8qKlxuICogRW5jb2RlcyBOIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbHMgYmF0Y2hlZCBpbnNpZGUgQUNMLm11bHRpY2FsbCgpLlxuICpcbiAqIFByb2R1Y2VzIGEgc2luZ2xlIFRYIHRoYXQgZ3JhbnRzIGRlbGVnYXRpb24gZm9yIGFsbCBzcGVjaWZpZWQgdG9rZW4gY29udHJhY3RzLlxuICogUmVxdWlyZXMgdG9rZW5Db250cmFjdEFkZHJlc3Nlcy5sZW5ndGggPj0gMS5cbiAqIE5vdGU6IERlY3J5cHRpb25EZWxlZ2F0aW9uQnVpbGRlciBhbHdheXMgdXNlcyB0aGlzIGZ1bmN0aW9uIChldmVuIGZvciBhIHNpbmdsZSB0b2tlbilcbiAqIHRvIGtlZXAgdGhlIHRyYW5zYWN0aW9uIHNoYXBlIGNvbnNpc3RlbnQgcmVnYXJkbGVzcyBvZiB0b2tlbiBjb3VudC5cbiAqXG4gKiBAcGFyYW0gZGVsZWdhdGVBZGRyZXNzICAgICAgICAgIEJpdEdvIGVudGVycHJpc2Ugdmlld2luZyBrZXkgYWRkcmVzc1xuICogQHBhcmFtIHRva2VuQ29udHJhY3RBZGRyZXNzZXMgICBBcnJheSBvZiBFUkMtNzk4NCB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXNcbiAqIEBwYXJhbSBleHBpcnlUaW1lc3RhbXAgICAgICAgICAgVW5peCBzZWNvbmRzXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhKFxuICBkZWxlZ2F0ZUFkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5Db250cmFjdEFkZHJlc3Nlczogc3RyaW5nW10sXG4gIGV4cGlyeVRpbWVzdGFtcDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBpZiAodG9rZW5Db250cmFjdEFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1aWxkTXVsdGljYWxsRGVsZWdhdGlvbkNhbGxkYXRhOiB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzIG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICAvLyBCdWlsZCBlYWNoIGlubmVyIGRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24gY2FsbCBhcyByYXcgYnl0ZXNcbiAgY29uc3QgaW5uZXJDYWxsczogQnVmZmVyW10gPSB0b2tlbkNvbnRyYWN0QWRkcmVzc2VzLm1hcCgodG9rZW5BZGRyZXNzKSA9PiB7XG4gICAgY29uc3QgaW5uZXJNZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbicsIFsuLi5kZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uVHlwZXNdKTtcbiAgICBjb25zdCBpbm5lckFyZ3MgPSBFdGhlcmV1bUFiaS5yYXdFbmNvZGUoXG4gICAgICBbLi4uZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvblR5cGVzXSxcbiAgICAgIFtkZWxlZ2F0ZUFkZHJlc3MsIHRva2VuQWRkcmVzcywgZXhwaXJ5VGltZXN0YW1wXVxuICAgICk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2lubmVyTWV0aG9kLCBpbm5lckFyZ3NdKTtcbiAgfSk7XG5cbiAgLy8gRW5jb2RlIG91dGVyIG11bHRpY2FsbChieXRlc1tdKVxuICAvLyBldGhlcmV1bWpzLWFiaSB2MC42LnggaGFzIGEgYnVnIHdoZXJlIGl0IG9taXRzIHRoZSBwZXItZWxlbWVudCBvZmZzZXQgdGFibGVcbiAgLy8gZm9yIGJ5dGVzW10sIHByb2R1Y2luZyBtYWxmb3JtZWQgY2FsbGRhdGEgdGhhdCBvbi1jaGFpbiBBQkkgZGVjb2RlcnMgcmVqZWN0LlxuICAvLyBVc2UgZXRoZXJzIEFiaUNvZGVyIHdoaWNoIGNvcnJlY3RseSBlbWl0cyB0aGUgaGVhZCBvZmZzZXQgd29yZHMuXG4gIGNvbnN0IG91dGVyTWV0aG9kID0gRXRoZXJldW1BYmkubWV0aG9kSUQoJ211bHRpY2FsbCcsIFsuLi5hY2xNdWx0aWNhbGxUeXBlc10pO1xuICBjb25zdCBvdXRlckFyZ3MgPSBCdWZmZXIuZnJvbShcbiAgICBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCkuZW5jb2RlKFsuLi5hY2xNdWx0aWNhbGxUeXBlc10sIFtpbm5lckNhbGxzXSkuc2xpY2UoMiksXG4gICAgJ2hleCdcbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFtvdXRlck1ldGhvZCwgb3V0ZXJBcmdzXSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuLyoqXG4gKiBXcmFwcyBjYWxsZGF0YSBpbiBhIEZvcndhcmRlclY0LmNhbGxGcm9tUGFyZW50KHRhcmdldCwgMCwgZGF0YSkgY2FsbC5cbiAqXG4gKiBVc2VkIHdoZW4gYSBmb3J3YXJkZXIgY29udHJhY3QgbXVzdCBiZSBtc2cuc2VuZGVyIGZvciBhbiBleHRlcm5hbCBjb250cmFjdFxuICogY2FsbCDigJQgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGZvcndhcmRlciBpdHNlbGYgbmVlZHMgdG8gY2FsbFxuICogQUNMLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb24oKSBzbyB0aGF0IGl0cyBvd24gYmFsYW5jZSBjYW4gYmUgZGVjcnlwdGVkLlxuICpcbiAqIE9ubHkgdGhlIHBhcmVudEFkZHJlc3MgKHJvb3Qgd2FsbGV0KSBpcyBhbGxvd2VkIHRvIGNhbGwgY2FsbEZyb21QYXJlbnRcbiAqIChlbmZvcmNlZCBieSB0aGUgZm9yd2FyZGVyJ3Mgb25seVBhcmVudCBtb2RpZmllcikuXG4gKlxuICogQHBhcmFtIHRhcmdldEFkZHJlc3MgIEFkZHJlc3Mgb2YgdGhlIGNvbnRyYWN0IHRoZSBmb3J3YXJkZXIgd2lsbCBjYWxsIChlLmcuIEFDTClcbiAqIEBwYXJhbSBjYWxsZGF0YSAgICAgICBBQkktZW5jb2RlZCBpbm5lciBjYWxsZGF0YSAoZS5nLiBmcm9tIGJ1aWxkRGVsZWdhdGlvbkNhbGxkYXRhKVxuICogQHJldHVybnMgQUJJLWVuY29kZWQgY2FsbEZyb21QYXJlbnQgY2FsbGRhdGEgaGV4IHN0cmluZyAoMHgtcHJlZml4ZWQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0YXJnZXRBZGRyZXNzOiBzdHJpbmcsIGNhbGxkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSBFdGhlcmV1bUFiaS5tZXRob2RJRCgnY2FsbEZyb21QYXJlbnQnLCBbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10pO1xuICBjb25zdCBhcmdzID0gRXRoZXJldW1BYmkucmF3RW5jb2RlKFxuICAgIFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSxcbiAgICBbXG4gICAgICB0YXJnZXRBZGRyZXNzLFxuICAgICAgMCwgLy8gdmFsdWU6IG5vIEVUSCB0cmFuc2ZlclxuICAgICAgdG9CdWZmZXIoY2FsbGRhdGEpLCAvLyBpbm5lciBjYWxsZGF0YSBhcyBieXRlc1xuICAgIF1cbiAgKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIERlY29kZXMgdG9rZW4gY29udHJhY3QgYWRkcmVzc2VzIGZyb20gZGVsZWdhdGlvbiBjYWxsZGF0YS5cbiAqXG4gKiBIYW5kbGVzIHR3byBzaGFwZXMgb2YgY2FsbGRhdGE6XG4gKiAgIC0gRGlyZWN0IEFDTC5tdWx0aWNhbGwoYnl0ZXNbXSkgKHJvb3Qgd2FsbGV0IHBhdGgpXG4gKiAgIC0gRm9yd2FyZGVyVjQuY2FsbEZyb21QYXJlbnQoYWRkcmVzcywgdWludDI1NiwgYnl0ZXMpIHdyYXBwaW5nIGEgbXVsdGljYWxsIChmb3J3YXJkZXIgcGF0aClcbiAqXG4gKiBAcGFyYW0gY2FsbGRhdGEgIEFCSS1lbmNvZGVkIGRlbGVnYXRpb24gY2FsbGRhdGEgKDB4LXByZWZpeGVkIG9yIHJhdyBoZXgpXG4gKiBAcmV0dXJucyBBcnJheSBvZiB0b2tlbiBjb250cmFjdCBhZGRyZXNzZXMgKGxvd2VyY2FzZSkgZm91bmQgaW4gdGhlIGRlbGVnYXRpb24gY2FsbHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgY2FsbGRhdGEgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIHJlY29nbmlzZWQgbWV0aG9kIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVUb2tlbkFkZHJlc3Nlc0Zyb21EZWxlZ2F0aW9uQ2FsbGRhdGEoY2FsbGRhdGE6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGF0YSA9IGNhbGxkYXRhLnN0YXJ0c1dpdGgoJzB4JykgPyBjYWxsZGF0YSA6ICcweCcgKyBjYWxsZGF0YTtcbiAgY29uc3QgbWV0aG9kSWQgPSBkYXRhLnNsaWNlKDAsIDEwKTtcbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG5cbiAgbGV0IG11bHRpY2FsbEhleDogc3RyaW5nO1xuXG4gIGlmIChtZXRob2RJZCA9PT0gY2FsbEZyb21QYXJlbnRNZXRob2RJZCkge1xuICAgIC8vIERlY29kZSBjYWxsRnJvbVBhcmVudChhZGRyZXNzLCB1aW50MjU2LCBieXRlcykg4oCUIGlubmVyIGJ5dGVzIGlzIHRoZSBmdWxsIG11bHRpY2FsbCBjYWxsZGF0YS5cbiAgICAvLyBldGhlcnMgdjUgcmV0dXJucyBgYnl0ZXNgIGFzIGEgaGV4IHN0cmluZzsgdXNlIGhleGxpZnkgdG8gbm9ybWFsaXNlIHRvIGEgMHgtcHJlZml4ZWQgaGV4IHN0cmluZ1xuICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcnVudGltZSByZXR1cm5zIGEgc3RyaW5nIG9yIGEgVWludDhBcnJheS5cbiAgICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsuLi5jYWxsRnJvbVBhcmVudFR5cGVzXSwgJzB4JyArIGRhdGEuc2xpY2UoMTApKTtcbiAgICBtdWx0aWNhbGxIZXggPSBldGhlcnMudXRpbHMuaGV4bGlmeShkZWNvZGVkWzJdKTtcbiAgfSBlbHNlIGlmIChtZXRob2RJZCA9PT0gYWNsTXVsdGljYWxsTWV0aG9kSWQpIHtcbiAgICBtdWx0aWNhbGxIZXggPSBkYXRhO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgZGVsZWdhdGlvbiBjYWxsZGF0YScpO1xuICB9XG5cbiAgaWYgKG11bHRpY2FsbEhleC5zbGljZSgwLCAxMCkgIT09IGFjbE11bHRpY2FsbE1ldGhvZElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBkZWxlZ2F0aW9uIGNhbGxkYXRhJyk7XG4gIH1cblxuICAvLyBEZWNvZGUgbXVsdGljYWxsKGJ5dGVzW10pIOKAlCBlYWNoIGVsZW1lbnQgaXMgYW4gaW5uZXIgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbiBjYWxsLlxuICAvLyBldGhlcnMgdjUgcmV0dXJucyBieXRlc1tdIGVsZW1lbnRzIGFzIGhleCBzdHJpbmdzOyB1c2UgaGV4bGlmeSB0byBub3JtYWxpc2UgZWFjaCBlbGVtZW50LlxuICBjb25zdCBkZWNvZGVkID0gYWJpQ29kZXIuZGVjb2RlKFsnYnl0ZXNbXSddLCAnMHgnICsgbXVsdGljYWxsSGV4LnNsaWNlKDEwKSk7XG4gIGNvbnN0IGlubmVyQ2FsbHM6IHVua25vd25bXSA9IGRlY29kZWRbMF07XG5cbiAgY29uc3QgdG9rZW5BZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgaW5uZXJDYWxsIG9mIGlubmVyQ2FsbHMpIHtcbiAgICBjb25zdCBpbm5lckhleCA9IGV0aGVycy51dGlscy5oZXhsaWZ5KGlubmVyQ2FsbCBhcyBldGhlcnMudXRpbHMuQnl0ZXNMaWtlKS5zbGljZSgyKTsgLy8gc3RyaXAgMHhcbiAgICBjb25zdCBpbm5lck1ldGhvZElkID0gJzB4JyArIGlubmVySGV4LnNsaWNlKDAsIDgpO1xuICAgIGlmIChpbm5lck1ldGhvZElkICE9PSBkZWxlZ2F0ZUZvclVzZXJEZWNyeXB0aW9uTWV0aG9kSWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBEZWNvZGUgZGVsZWdhdGVGb3JVc2VyRGVjcnlwdGlvbihhZGRyZXNzIGRlbGVnYXRlLCBhZGRyZXNzIHRva2VuQWRkcmVzcywgdWludDY0IGV4cGlyeSlcbiAgICBjb25zdCBpbm5lckRlY29kZWQgPSBhYmlDb2Rlci5kZWNvZGUoWy4uLmRlbGVnYXRlRm9yVXNlckRlY3J5cHRpb25UeXBlc10sICcweCcgKyBpbm5lckhleC5zbGljZSg4KSk7XG4gICAgdG9rZW5BZGRyZXNzZXMucHVzaCgoaW5uZXJEZWNvZGVkWzFdIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5BZGRyZXNzZXM7XG59XG5cbi8qKlxuICogRW5jb2RlcyBjb25maWRlbnRpYWxUcmFuc2ZlcihhZGRyZXNzIHRvLCBieXRlczMyIGVuY3J5cHRlZEhhbmRsZSkgY2FsbGRhdGEuXG4gKiBVc2VzIHRoZSBuby1wcm9vZiB2YXJpYW50IChzZWxlY3RvciAweDViZWJlZDdlKSDigJQgdmFsaWQgd2hlbiB0aGUgY2FsbGVyIChmb3J3YXJkZXIpXG4gKiBpcyBhbHJlYWR5IEFDTC1hbGxvd2VkIG9uIHRoZSBoYW5kbGUgZnJvbSB3aGVuIGl0IHJlY2VpdmVkIHRoZSB0b2tlbnMuXG4gKlxuICogQHBhcmFtIHRvQWRkcmVzcyAgICAgICBBZGRyZXNzIHRoYXQgd2lsbCByZWNlaXZlIHRoZSB0b2tlbnNcbiAqIEBwYXJhbSBlbmNyeXB0ZWRIYW5kbGUgYnl0ZXMzMiBlbmNyeXB0ZWQgYmFsYW5jZSBoYW5kbGUgZnJvbSBjb25maWRlbnRpYWxCYWxhbmNlT2ZcbiAqIEByZXR1cm5zIEFCSS1lbmNvZGVkIGNhbGxkYXRhIGhleCBzdHJpbmcgKDB4LXByZWZpeGVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb25maWRlbnRpYWxUcmFuc2ZlckJ5SGFuZGxlQ2FsbGRhdGEodG9BZGRyZXNzOiBzdHJpbmcsIGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWV0aG9kID0gQnVmZmVyLmZyb20oY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQuc2xpY2UoMiksICdoZXgnKTtcbiAgY29uc3QgaGFuZGxlQnVmZmVyID0gdG9CdWZmZXIoZW5jcnlwdGVkSGFuZGxlKTtcbiAgY29uc3QgYXJncyA9IEV0aGVyZXVtQWJpLnJhd0VuY29kZShbLi4uY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mVHlwZXNdLCBbdG9BZGRyZXNzLCBoYW5kbGVCdWZmZXJdKTtcbiAgcmV0dXJuIGFkZEhleFByZWZpeChCdWZmZXIuY29uY2F0KFttZXRob2QsIGFyZ3NdKS50b1N0cmluZygnaGV4JykpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGZ1bGwgZmx1c2ggY2FsbGRhdGEgZm9yIEVSQy03OTg0IGZvcndhcmRlciBjb25zb2xpZGF0aW9uOlxuICogICBjYWxsRnJvbVBhcmVudCh0b2tlbkNvbnRyYWN0QWRkcmVzcywgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocGFyZW50QWRkcmVzcywgZW5jcnlwdGVkSGFuZGxlKSlcbiAqIFRoZSBmb3J3YXJkZXIgZXhlY3V0ZXMgdGhlIGlubmVyIGNvbmZpZGVudGlhbFRyYW5zZmVyIHdpdGggbXNnLnNlbmRlciA9IGZvcndhcmRlci5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Db250cmFjdEFkZHJlc3MgIEVSQy03OTg0IHRva2VuIGNvbnRyYWN0IGFkZHJlc3NcbiAqIEBwYXJhbSBwYXJlbnRBZGRyZXNzICAgICAgICAgUm9vdCB3YWxsZXQgYWRkcmVzcyAoZGVzdGluYXRpb24gb2YgZmx1c2hlZCB0b2tlbnMpXG4gKiBAcGFyYW0gZW5jcnlwdGVkSGFuZGxlICAgICAgIGJ5dGVzMzIgZW5jcnlwdGVkIGJhbGFuY2UgaGFuZGxlIGZyb20gY29uZmlkZW50aWFsQmFsYW5jZU9mXG4gKiBAcmV0dXJucyBBQkktZW5jb2RlZCBjYWxsZGF0YSBoZXggc3RyaW5nICgweC1wcmVmaXhlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShcbiAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgcGFyZW50QWRkcmVzczogc3RyaW5nLFxuICBlbmNyeXB0ZWRIYW5kbGU6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgaW5uZXJDYWxsZGF0YSA9IGJ1aWxkQ29uZmlkZW50aWFsVHJhbnNmZXJCeUhhbmRsZUNhbGxkYXRhKHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSk7XG4gIHJldHVybiB3cmFwSW5DYWxsRnJvbVBhcmVudCh0b2tlbkNvbnRyYWN0QWRkcmVzcywgaW5uZXJDYWxsZGF0YSk7XG59XG5cbi8qKlxuICogRGVjb2RlcyBhIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuIGNhbGxkYXRhLlxuICogU3RyaXBzIHRoZSBvdXRlciBjYWxsRnJvbVBhcmVudCB3cmFwcGVyIGFuZCB0aGUgaW5uZXIgY29uZmlkZW50aWFsVHJhbnNmZXIuXG4gKiBSZXR1cm5zIHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHBhcmVudEFkZHJlc3MsIGVuY3J5cHRlZEhhbmRsZSB9LlxuICpcbiAqIEBwYXJhbSBkYXRhICBBQkktZW5jb2RlZCBmbHVzaCBjYWxsZGF0YSAoMHgtcHJlZml4ZWQpXG4gKiBAcmV0dXJucyBEZWNvZGVkIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW5DYWxsZGF0YShkYXRhOiBzdHJpbmcpOiB7XG4gIHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XG4gIHBhcmVudEFkZHJlc3M6IHN0cmluZztcbiAgZW5jcnlwdGVkSGFuZGxlOiBzdHJpbmc7XG59IHtcbiAgaWYgKCFkYXRhLnN0YXJ0c1dpdGgoY2FsbEZyb21QYXJlbnRNZXRob2RJZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBGbHVzaEVSQzc5ODRGb3J3YXJkZXJUb2tlbiBjYWxsZGF0YTogZXhwZWN0ZWQgY2FsbEZyb21QYXJlbnQgc2VsZWN0b3IsIGdvdCAke2RhdGEuc2xpY2UoMCwgMTApfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYWJpQ29kZXIgPSBuZXcgZXRoZXJzLnV0aWxzLkFiaUNvZGVyKCk7XG4gIGNvbnN0IG91dGVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY2FsbEZyb21QYXJlbnRUeXBlc10sICcweCcgKyBkYXRhLnNsaWNlKDEwKSk7XG4gIGNvbnN0IHRva2VuQ29udHJhY3RBZGRyZXNzOiBzdHJpbmcgPSBvdXRlckRlY29kZWRbMF07XG4gIGNvbnN0IGlubmVyQ2FsbGRhdGE6IHN0cmluZyA9IGV0aGVycy51dGlscy5oZXhsaWZ5KG91dGVyRGVjb2RlZFsyXSk7XG5cbiAgaWYgKCFpbm5lckNhbGxkYXRhLnN0YXJ0c1dpdGgoY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mTWV0aG9kSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4gaW5uZXIgY2FsbGRhdGE6IGV4cGVjdGVkIGNvbmZpZGVudGlhbFRyYW5zZmVyIHNlbGVjdG9yLCBnb3QgJHtpbm5lckNhbGxkYXRhLnNsaWNlKFxuICAgICAgICAwLFxuICAgICAgICAxMFxuICAgICAgKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGlubmVyRGVjb2RlZCA9IGFiaUNvZGVyLmRlY29kZShbLi4uY29uZmlkZW50aWFsVHJhbnNmZXJOb1Byb29mVHlwZXNdLCAnMHgnICsgaW5uZXJDYWxsZGF0YS5zbGljZSgxMCkpO1xuICBjb25zdCBwYXJlbnRBZGRyZXNzOiBzdHJpbmcgPSBpbm5lckRlY29kZWRbMF07XG4gIGNvbnN0IGVuY3J5cHRlZEhhbmRsZTogc3RyaW5nID0gYnVmZmVyVG9IZXgodG9CdWZmZXIoaW5uZXJEZWNvZGVkWzFdKSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICBwYXJlbnRBZGRyZXNzLFxuICAgIGVuY3J5cHRlZEhhbmRsZSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import EthereumCommon from '@ethereumjs/common';
2
+ export type SendCrossChainRecoveryOptions = {
3
+ recoveryId: string;
4
+ walletPassphrase?: string;
5
+ encryptedPrv?: string;
6
+ walletType: 'hot' | 'cold';
7
+ common?: EthereumCommon;
8
+ };
9
+ //# sourceMappingURL=types.d.ts.map