@bitgo-beta/sdk-coin-sol 7.6.4-beta.78 → 7.6.4-beta.780

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 (541) hide show
  1. package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
  2. package/dist/cjs/src/bigint-buffer-guard.js +29 -0
  3. package/dist/cjs/src/index.d.ts.map +1 -0
  4. package/dist/{src → cjs/src}/index.js +1 -1
  5. package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +12 -1
  6. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  7. package/dist/cjs/src/lib/ataInitializationBuilder.js +231 -0
  8. package/dist/cjs/src/lib/closeAtaBuilder.d.ts +55 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/closeAtaBuilder.js +162 -0
  11. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +136 -0
  12. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/confidentialTransferBuilder.js +375 -0
  14. package/dist/{src → cjs/src}/lib/constants.d.ts +97 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +277 -0
  17. package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +13 -2
  18. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/customInstructionBuilder.js +392 -0
  20. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  21. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
  23. package/dist/cjs/src/lib/iface.d.ts +538 -0
  24. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/iface.js +7 -0
  26. package/dist/{src → cjs/src}/lib/index.d.ts +9 -0
  27. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  28. package/dist/cjs/src/lib/index.js +106 -0
  29. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  30. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/instructionParamsFactory.js +1284 -0
  32. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  34. package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
  35. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/keyPair.js +112 -0
  37. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  38. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  39. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  40. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  41. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  42. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  44. package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
  45. package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
  47. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
  48. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
  50. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  51. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
  53. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
  54. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
  56. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +36 -0
  57. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  58. package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +211 -0
  59. package/dist/cjs/src/lib/serialization/index.d.ts +5 -0
  60. package/dist/cjs/src/lib/serialization/index.d.ts.map +1 -0
  61. package/dist/cjs/src/lib/serialization/index.js +27 -0
  62. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
  63. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  64. package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
  65. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
  66. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
  68. package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
  69. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  70. package/dist/cjs/src/lib/solInstructionFactory.js +1119 -0
  71. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
  73. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  74. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  75. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
  77. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  78. package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
  79. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  80. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  81. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  82. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
  83. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  84. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  85. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  86. package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
  87. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  88. package/dist/cjs/src/lib/tokenExtensions.js +109 -0
  89. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  90. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  91. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  92. package/dist/{src → cjs/src}/lib/transaction.d.ts +46 -1
  93. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  94. package/dist/cjs/src/lib/transaction.js +761 -0
  95. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +42 -1
  96. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  97. package/dist/cjs/src/lib/transactionBuilder.js +462 -0
  98. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +37 -0
  99. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  100. package/dist/cjs/src/lib/transactionBuilderFactory.js +249 -0
  101. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  102. package/dist/cjs/src/lib/transferBuilder.js +81 -0
  103. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  104. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  105. package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
  106. package/dist/{src → cjs/src}/lib/utils.d.ts +16 -0
  107. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  108. package/dist/cjs/src/lib/utils.js +681 -0
  109. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts +29 -0
  110. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  111. package/dist/cjs/src/lib/v1CustomInstructionBuilder.js +36 -0
  112. package/dist/cjs/src/lib/v1PaymentBuilder.d.ts +36 -0
  113. package/dist/cjs/src/lib/v1PaymentBuilder.d.ts.map +1 -0
  114. package/dist/cjs/src/lib/v1PaymentBuilder.js +70 -0
  115. package/dist/cjs/src/lib/v1TransactionBuilder.d.ts +253 -0
  116. package/dist/cjs/src/lib/v1TransactionBuilder.d.ts.map +1 -0
  117. package/dist/cjs/src/lib/v1TransactionBuilder.js +601 -0
  118. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  119. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  120. package/dist/cjs/src/register.d.ts +5 -0
  121. package/dist/cjs/src/register.d.ts.map +1 -0
  122. package/dist/cjs/src/register.js +29 -0
  123. package/dist/{src → cjs/src}/sol.d.ts +114 -3
  124. package/dist/cjs/src/sol.d.ts.map +1 -0
  125. package/dist/cjs/src/sol.js +1707 -0
  126. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  127. package/dist/cjs/src/solToken.d.ts.map +1 -0
  128. package/dist/cjs/src/solToken.js +79 -0
  129. package/dist/cjs/src/tsol.d.ts.map +1 -0
  130. package/dist/cjs/src/tsol.js +24 -0
  131. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  132. package/dist/cjs/test/fixtures/sol.js +1433 -0
  133. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  134. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  135. package/dist/cjs/test/resources/sol.js +320 -0
  136. package/dist/cjs/test/unit/ctEnablementVerify.d.ts +2 -0
  137. package/dist/cjs/test/unit/ctEnablementVerify.d.ts.map +1 -0
  138. package/dist/cjs/test/unit/ctEnablementVerify.js +143 -0
  139. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  140. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  141. package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
  142. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  143. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  144. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  145. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  146. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  147. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  148. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  149. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  150. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  151. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  152. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  153. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  154. package/dist/cjs/test/unit/keyPair.js +177 -0
  155. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  156. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  157. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  158. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  159. package/dist/cjs/test/unit/register.d.ts +2 -0
  160. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  161. package/dist/cjs/test/unit/register.js +65 -0
  162. package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
  163. package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
  164. package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
  165. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  166. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  167. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  168. package/dist/cjs/test/unit/serialization/exportV1.d.ts +2 -0
  169. package/dist/cjs/test/unit/serialization/exportV1.d.ts.map +1 -0
  170. package/dist/cjs/test/unit/serialization/exportV1.js +21 -0
  171. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  172. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  173. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  174. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  175. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  176. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  177. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  178. package/dist/cjs/test/unit/sol.js +5364 -0
  179. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  180. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  181. package/dist/cjs/test/unit/solIntentVersion.d.ts +2 -0
  182. package/dist/cjs/test/unit/solIntentVersion.d.ts.map +1 -0
  183. package/dist/cjs/test/unit/solIntentVersion.js +59 -0
  184. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  185. package/dist/cjs/test/unit/solToken.js +37 -0
  186. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  187. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  188. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  189. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  190. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/tokenExtensions.js +73 -0
  192. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  193. package/dist/cjs/test/unit/transaction.js +1129 -0
  194. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  195. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  196. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  198. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  199. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  200. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  201. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
  202. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
  204. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts +2 -0
  205. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts.map +1 -0
  206. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.js +124 -0
  207. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  208. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  209. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +922 -0
  210. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  211. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  212. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +194 -0
  213. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  214. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  215. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +168 -0
  216. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  217. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
  218. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  219. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  220. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  221. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  222. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  223. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  224. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  225. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  226. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  227. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  228. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  229. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  230. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  231. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  232. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  233. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  234. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  235. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  236. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
  237. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
  238. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
  239. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts +2 -0
  240. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts.map +1 -0
  241. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +331 -0
  242. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  243. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  244. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  245. package/dist/cjs/test/unit/utils.js +663 -0
  246. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  247. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  248. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  249. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  250. package/dist/esm/index.d.ts +7 -0
  251. package/dist/esm/index.js +7 -0
  252. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  253. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  254. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  255. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  256. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  257. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  258. package/dist/esm/lib/confidentialTransferBuilder.d.ts +136 -0
  259. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  260. package/dist/esm/lib/confidentialTransferBuilder.js +368 -0
  261. package/dist/esm/lib/constants.d.ts +235 -0
  262. package/dist/esm/lib/constants.d.ts.map +1 -0
  263. package/dist/esm/lib/constants.js +274 -0
  264. package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
  265. package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
  266. package/dist/esm/lib/customInstructionBuilder.js +385 -0
  267. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  268. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  269. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  270. package/dist/esm/lib/iface.d.ts +538 -0
  271. package/dist/esm/lib/iface.d.ts.map +1 -0
  272. package/dist/esm/lib/iface.js +3 -0
  273. package/dist/esm/lib/index.d.ts +31 -0
  274. package/dist/esm/lib/index.d.ts.map +1 -0
  275. package/dist/esm/lib/index.js +31 -0
  276. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  277. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  278. package/dist/esm/lib/instructionParamsFactory.js +1276 -0
  279. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  280. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  281. package/dist/esm/lib/keyPair.d.ts +32 -0
  282. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  283. package/dist/esm/lib/keyPair.js +75 -0
  284. package/dist/esm/lib/messages/index.d.ts +2 -0
  285. package/dist/esm/lib/messages/index.js +2 -0
  286. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  287. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  288. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  289. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  290. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  291. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  292. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  293. package/dist/esm/lib/scaledUiAmount.js +108 -0
  294. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  295. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  296. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  297. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  298. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  299. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  300. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  301. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  302. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  303. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +36 -0
  304. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  305. package/dist/esm/lib/serialization/compileTransactionMessage.js +208 -0
  306. package/dist/esm/lib/serialization/index.d.ts +5 -0
  307. package/dist/esm/lib/serialization/index.d.ts.map +1 -0
  308. package/dist/esm/lib/serialization/index.js +5 -0
  309. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  310. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  311. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  312. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  313. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  314. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  315. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  316. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  317. package/dist/esm/lib/solInstructionFactory.js +1113 -0
  318. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  319. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  320. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  321. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  322. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  323. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  324. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  325. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  326. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  327. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  328. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  329. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  330. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  331. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  332. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  333. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  334. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  335. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  336. package/dist/esm/lib/token2022Resolve.js +194 -0
  337. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  338. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  339. package/dist/esm/lib/tokenExtensions.js +103 -0
  340. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  341. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  342. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  343. package/dist/esm/lib/transaction.d.ts +148 -0
  344. package/dist/esm/lib/transaction.d.ts.map +1 -0
  345. package/dist/esm/lib/transaction.js +754 -0
  346. package/dist/esm/lib/transactionBuilder.d.ts +169 -0
  347. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  348. package/dist/esm/lib/transactionBuilder.js +455 -0
  349. package/dist/esm/lib/transactionBuilderFactory.d.ts +152 -0
  350. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  351. package/dist/esm/lib/transactionBuilderFactory.js +245 -0
  352. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  353. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  354. package/dist/esm/lib/transferBuilder.js +74 -0
  355. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  356. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  357. package/dist/esm/lib/transferBuilderV2.js +245 -0
  358. package/dist/esm/lib/utils.d.ts +216 -0
  359. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  360. package/dist/esm/lib/utils.js +642 -0
  361. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts +29 -0
  362. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  363. package/dist/esm/lib/v1CustomInstructionBuilder.js +32 -0
  364. package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
  365. package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
  366. package/dist/esm/lib/v1PaymentBuilder.js +63 -0
  367. package/dist/esm/lib/v1TransactionBuilder.d.ts +253 -0
  368. package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -0
  369. package/dist/esm/lib/v1TransactionBuilder.js +591 -0
  370. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  371. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  372. package/dist/esm/register.d.ts +5 -0
  373. package/dist/esm/register.d.ts.map +1 -0
  374. package/dist/esm/register.js +24 -0
  375. package/dist/esm/sol.d.ts +351 -0
  376. package/dist/esm/sol.d.ts.map +1 -0
  377. package/dist/esm/sol.js +1666 -0
  378. package/dist/esm/solToken.d.ts +44 -0
  379. package/dist/esm/solToken.d.ts.map +1 -0
  380. package/dist/esm/solToken.js +75 -0
  381. package/dist/esm/tsol.d.ts +11 -0
  382. package/dist/esm/tsol.js +20 -0
  383. package/package.json +37 -17
  384. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  385. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  386. package/dist/src/config/token2022StaticConfig.js +0 -50
  387. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  388. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  389. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  390. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  391. package/dist/src/lib/closeAtaBuilder.js +0 -69
  392. package/dist/src/lib/constants.d.ts.map +0 -1
  393. package/dist/src/lib/constants.js +0 -171
  394. package/dist/src/lib/customInstructionBuilder.js +0 -289
  395. package/dist/src/lib/iface.d.ts +0 -244
  396. package/dist/src/lib/iface.d.ts.map +0 -1
  397. package/dist/src/lib/iface.js +0 -7
  398. package/dist/src/lib/index.d.ts.map +0 -1
  399. package/dist/src/lib/index.js +0 -77
  400. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  401. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  402. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  403. package/dist/src/lib/keyPair.d.ts.map +0 -1
  404. package/dist/src/lib/keyPair.js +0 -63
  405. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  406. package/dist/src/lib/solInstructionFactory.js +0 -572
  407. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  408. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  409. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  410. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  411. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  412. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  413. package/dist/src/lib/token2022Config.d.ts +0 -44
  414. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  415. package/dist/src/lib/token2022Config.js +0 -27
  416. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  417. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  418. package/dist/src/lib/transaction.d.ts.map +0 -1
  419. package/dist/src/lib/transaction.js +0 -595
  420. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  421. package/dist/src/lib/transactionBuilder.js +0 -380
  422. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  423. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  424. package/dist/src/lib/transferBuilder.js +0 -70
  425. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  426. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  427. package/dist/src/lib/transferBuilderV2.js +0 -210
  428. package/dist/src/lib/utils.js +0 -589
  429. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  430. package/dist/src/register.d.ts +0 -3
  431. package/dist/src/register.d.ts.map +0 -1
  432. package/dist/src/register.js +0 -15
  433. package/dist/src/sol.d.ts.map +0 -1
  434. package/dist/src/sol.js +0 -1324
  435. package/dist/src/solToken.d.ts.map +0 -1
  436. package/dist/src/solToken.js +0 -69
  437. package/dist/src/tsol.js +0 -24
  438. package/dist/test/fixtures/sol.js +0 -1433
  439. package/dist/test/resources/sol.d.ts.map +0 -1
  440. package/dist/test/resources/sol.js +0 -320
  441. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  442. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  443. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  444. package/dist/test/unit/getBuilderFactory.js +0 -10
  445. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  446. package/dist/test/unit/instructionParamsFactory.js +0 -412
  447. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  448. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  449. package/dist/test/unit/keyPair.js +0 -177
  450. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  451. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  452. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  453. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  454. package/dist/test/unit/sol.js +0 -3180
  455. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  456. package/dist/test/unit/solInstructionFactory.js +0 -454
  457. package/dist/test/unit/solToken.d.ts.map +0 -1
  458. package/dist/test/unit/solToken.js +0 -31
  459. package/dist/test/unit/transaction.d.ts.map +0 -1
  460. package/dist/test/unit/transaction.js +0 -983
  461. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  462. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  463. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  464. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  465. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  466. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  467. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  468. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  469. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  470. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  471. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  472. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  473. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  474. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  475. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  476. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  477. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  478. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  479. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  480. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  481. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  482. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  483. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  484. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  485. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  486. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  487. package/dist/test/unit/utils.js +0 -517
  488. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  489. package/dist/test/unit/versionedTransaction.js +0 -207
  490. package/dist/tsconfig.tsbuildinfo +0 -1
  491. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  492. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  493. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  494. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  495. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  496. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  497. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  498. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  499. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  500. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  501. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  502. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  503. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  504. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  505. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  506. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  507. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  508. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  509. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  510. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  511. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  512. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  513. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  514. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  515. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  516. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  517. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  518. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  519. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  520. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  521. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  522. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  523. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  524. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  525. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  526. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  527. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  528. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  529. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  530. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  531. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  532. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  533. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  534. /package/dist/{src → esm}/index.d.ts.map +0 -0
  535. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  536. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  537. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  538. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  539. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  540. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  541. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,681 @@
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.isIdempotentAtaInstruction = isIdempotentAtaInstruction;
7
+ exports.isValidAddress = isValidAddress;
8
+ exports.isValidBlockId = isValidBlockId;
9
+ exports.isValidPrivateKey = isValidPrivateKey;
10
+ exports.isValidPublicKey = isValidPublicKey;
11
+ exports.isValidSignature = isValidSignature;
12
+ exports.isValidTransactionId = isValidTransactionId;
13
+ exports.isValidAmount = isValidAmount;
14
+ exports.isValidStakingAmount = isValidStakingAmount;
15
+ exports.isValidMemo = isValidMemo;
16
+ exports.isValidBase64 = isValidBase64;
17
+ exports.isValidHex = isValidHex;
18
+ exports.isValidRawTransaction = isValidRawTransaction;
19
+ exports.verifySignature = verifySignature;
20
+ exports.base58ToUint8Array = base58ToUint8Array;
21
+ exports.Uint8ArrayTobase58 = Uint8ArrayTobase58;
22
+ exports.countNotNullSignatures = countNotNullSignatures;
23
+ exports.requiresAllSignatures = requiresAllSignatures;
24
+ exports.matchTransactionTypeByInstructionsOrder = matchTransactionTypeByInstructionsOrder;
25
+ exports.matchConfidentialTransferInstructions = matchConfidentialTransferInstructions;
26
+ exports.getTransactionType = getTransactionType;
27
+ exports.getInstructionType = getInstructionType;
28
+ exports.validateIntructionTypes = validateIntructionTypes;
29
+ exports.validateRawMsgInstruction = validateRawMsgInstruction;
30
+ exports.validateRawTransaction = validateRawTransaction;
31
+ exports.validateAddress = validateAddress;
32
+ exports.getSolTokenFromAddress = getSolTokenFromAddress;
33
+ exports.getSolTokenFromAddressOnly = getSolTokenFromAddressOnly;
34
+ exports.getSolTokenFromTokenName = getSolTokenFromTokenName;
35
+ exports.getAssociatedTokenAccountAddress = getAssociatedTokenAccountAddress;
36
+ exports.validateMintAddress = validateMintAddress;
37
+ exports.validateOwnerAddress = validateOwnerAddress;
38
+ exports.isSolLegacyInstruction = isSolLegacyInstruction;
39
+ exports.computeTransferFee = computeTransferFee;
40
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
+ const statics_1 = require("@bitgo-beta/statics");
42
+ const spl_token_1 = require("@solana/spl-token");
43
+ const web3_js_1 = require("@solana/web3.js");
44
+ const assert_1 = __importDefault(require("assert"));
45
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
46
+ const bs58_1 = __importDefault(require("bs58"));
47
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
48
+ const constants_1 = require("./constants");
49
+ const spl_stake_pool_1 = require("@solana/spl-stake-pool");
50
+ const DECODED_BLOCK_HASH_LENGTH = 32; // https://docs.solana.com/developing/programming-model/transactions#blockhash-format
51
+ const DECODED_SIGNATURE_LENGTH = 64; // https://docs.solana.com/terminology#signature
52
+ const BASE_58_ENCONDING_REGEX = '[1-9A-HJ-NP-Za-km-z]';
53
+ const COMPUTE_BUDGET = 'ComputeBudget111111111111111111111111111111';
54
+ /**
55
+ * Checks if an ATA instruction is idempotent (discriminator byte = 1).
56
+ *
57
+ * Idempotent ATA instructions use Buffer.from([1]) as instruction data, created by
58
+ * @solana/spl-token's createAssociatedTokenAccountIdempotentInstruction() (v0.4.1+).
59
+ * An idempotent ATA instruction succeed even if account exists,
60
+ * preventing race condition errors in concurrent scenarios.
61
+ *
62
+ * @param {TransactionInstruction} instruction - The instruction to validate
63
+ * @returns {boolean} True if instruction data is a single byte with value 1
64
+ */
65
+ function isIdempotentAtaInstruction(instruction) {
66
+ return instruction.data.length === 1 && instruction.data[0] === 1;
67
+ }
68
+ /** @inheritdoc */
69
+ function isValidAddress(address) {
70
+ return isValidPublicKey(address);
71
+ }
72
+ /** @inheritdoc */
73
+ function isValidBlockId(hash) {
74
+ try {
75
+ return (!!hash && new RegExp(BASE_58_ENCONDING_REGEX).test(hash) && bs58_1.default.decode(hash).length === DECODED_BLOCK_HASH_LENGTH);
76
+ }
77
+ catch (e) {
78
+ return false;
79
+ }
80
+ }
81
+ /** @inheritdoc */
82
+ function isValidPrivateKey(prvKey) {
83
+ try {
84
+ const key = typeof prvKey === 'string' ? base58ToUint8Array(prvKey) : prvKey;
85
+ return !!web3_js_1.Keypair.fromSecretKey(key);
86
+ }
87
+ catch (e) {
88
+ return false;
89
+ }
90
+ }
91
+ /** @inheritdoc */
92
+ function isValidPublicKey(pubKey) {
93
+ try {
94
+ if ((0, sdk_core_1.isValidXpub)(pubKey))
95
+ return true;
96
+ new web3_js_1.PublicKey(pubKey);
97
+ return true;
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ }
103
+ /** @inheritdoc */
104
+ function isValidSignature(signature) {
105
+ try {
106
+ return !!signature && bs58_1.default.decode(signature).length === DECODED_SIGNATURE_LENGTH;
107
+ }
108
+ catch (e) {
109
+ return false;
110
+ }
111
+ }
112
+ /** @inheritdoc */
113
+ // TransactionId are the first signature on a Transaction
114
+ function isValidTransactionId(txId) {
115
+ return isValidSignature(txId);
116
+ }
117
+ /**
118
+ * Returns whether or not the string is a valid amount of lamports number
119
+ *
120
+ * @param {string} amount - the string to validate
121
+ * @returns {boolean} - the validation result
122
+ */
123
+ function isValidAmount(amount) {
124
+ const bigNumberAmount = new bignumber_js_1.default(amount);
125
+ return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThanOrEqualTo(0);
126
+ }
127
+ /**
128
+ * Check if the string is a valid amount of lamports number on staking
129
+ *
130
+ * @param {string} amount - the string to validate
131
+ * @returns {boolean} - the validation result
132
+ */
133
+ function isValidStakingAmount(amount) {
134
+ const bigNumberAmount = new bignumber_js_1.default(amount);
135
+ return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThan(0);
136
+ }
137
+ /**
138
+ * Check if this is a valid memo or not.
139
+ *
140
+ * @param memo - the memo string
141
+ * @returns {boolean} - the validation result
142
+ */
143
+ function isValidMemo(memo) {
144
+ return Buffer.from(memo).length <= constants_1.MAX_MEMO_LENGTH;
145
+ }
146
+ /**
147
+ * Checks if a string is valid base64 encoded data
148
+ * @param str - The string to validate
149
+ * @returns True if the string is valid base64, false otherwise
150
+ */
151
+ function isValidBase64(str) {
152
+ try {
153
+ const decoded = Buffer.from(str, 'base64').toString('base64');
154
+ return decoded === str;
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ }
160
+ /**
161
+ * Checks if a string is valid hexadecimal data
162
+ * @param str - The string to validate
163
+ * @returns True if the string is valid hex, false otherwise
164
+ */
165
+ function isValidHex(str) {
166
+ return /^[0-9A-Fa-f]*$/.test(str) && str.length % 2 === 0;
167
+ }
168
+ /**
169
+ * Checks if raw transaction can be deserialized
170
+ *
171
+ * @param {string} rawTransaction - transaction in base64 string format
172
+ * @param {boolean} requireAllSignatures - require all signatures to be present
173
+ * @param {boolean} verifySignatures - verify signatures
174
+ * @returns {boolean} - the validation result
175
+ */
176
+ function isValidRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
177
+ try {
178
+ const tx = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
179
+ tx.serialize({ requireAllSignatures, verifySignatures });
180
+ return true;
181
+ }
182
+ catch (e) {
183
+ return false;
184
+ }
185
+ }
186
+ /**
187
+ * Verifies if signature for message is valid.
188
+ *
189
+ * @param {Buffer} serializedTx - tx as a base64 string
190
+ * @param {string} signature - signature as a string
191
+ * @param {string} publicKey - public key as base 58
192
+ * @returns {Boolean} true if signature is valid.
193
+ */
194
+ function verifySignature(serializedTx, signature, publicKey) {
195
+ if (!isValidRawTransaction(serializedTx)) {
196
+ throw new sdk_core_1.UtilsError('Invalid serializedTx');
197
+ }
198
+ if (!isValidPublicKey(publicKey)) {
199
+ throw new sdk_core_1.UtilsError('Invalid publicKey');
200
+ }
201
+ if (!isValidSignature(signature)) {
202
+ throw new sdk_core_1.UtilsError('Invalid signature');
203
+ }
204
+ const msg = web3_js_1.Transaction.from(Buffer.from(serializedTx, 'base64')).serializeMessage();
205
+ const sig = base58ToUint8Array(signature);
206
+ const pub = new web3_js_1.PublicKey(publicKey);
207
+ return tweetnacl_1.default.sign.detached.verify(msg, sig, pub.toBuffer());
208
+ }
209
+ /**
210
+ * Converts a base58 string into a Uint8Array.
211
+ *
212
+ * @param {string} input - a string in base58
213
+ * @returns {Uint8Array} - an Uint8Array
214
+ */
215
+ function base58ToUint8Array(input) {
216
+ return new Uint8Array(bs58_1.default.decode(input));
217
+ }
218
+ /**
219
+ * Converts a Uint8Array to a base58 string.
220
+ *
221
+ * @param {Uint8Array} input - an Uint8Array
222
+ * @returns {string} - a string in base58
223
+ */
224
+ function Uint8ArrayTobase58(input) {
225
+ return bs58_1.default.encode(input);
226
+ }
227
+ /**
228
+ * Count the amount of signatures are not null.
229
+ *
230
+ * @param {SignaturePubkeyPair[]} signatures - an array of SignaturePubkeyPair
231
+ * @returns {number} - the amount of valid signatures
232
+ */
233
+ function countNotNullSignatures(signatures) {
234
+ return signatures.filter((sig) => !!sig.signature).length;
235
+ }
236
+ /**
237
+ * Check if all signatures are completed.
238
+ *
239
+ * @param {SignaturePubkeyPair[]} signatures - signatures
240
+ * @returns {boolean}
241
+ */
242
+ function requiresAllSignatures(signatures) {
243
+ return signatures.length > 0 && countNotNullSignatures(signatures) === signatures.length;
244
+ }
245
+ /**
246
+ * Check the transaction type matching instructions by order. Memo and AdvanceNonceAccount instructions
247
+ * are ignored.
248
+ *
249
+ * @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
250
+ * @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
251
+ * @returns true if it matches by order.
252
+ */
253
+ function matchTransactionTypeByInstructionsOrder(instructions, instructionIndexes) {
254
+ const instructionsCopy = [...instructions]; // Make a copy since we may modify the array below
255
+ // AdvanceNonceAccount and compute-budget instructions (SetComputeUnitLimit /
256
+ // SetPriorityFee) are optional leading instructions that don't affect the
257
+ // type-defining instruction order, so skip them the same way.
258
+ while (instructionsCopy.length > 0) {
259
+ const instructionType = getInstructionType(instructionsCopy[0]);
260
+ if (instructionType === 'AdvanceNonceAccount' ||
261
+ instructionType === constants_1.ValidInstructionTypesEnum.SetComputeUnitLimit ||
262
+ instructionType === constants_1.ValidInstructionTypesEnum.SetPriorityFee) {
263
+ instructionsCopy.shift();
264
+ }
265
+ else {
266
+ break;
267
+ }
268
+ }
269
+ // Memo is optional and the last instruction added, it does not matter to match the type
270
+ // Why have it in instructionKeys if we are going to ignore it?
271
+ const instructionsKeys = Object.keys(instructionIndexes);
272
+ if (instructionsKeys[instructionsKeys.length - 1] === 'Memo') {
273
+ instructionsKeys.pop();
274
+ }
275
+ // Check instructions by order using the index.
276
+ for (const keyName of instructionsKeys) {
277
+ const index = instructionIndexes[keyName];
278
+ if (index >= instructionsCopy.length) {
279
+ return false;
280
+ }
281
+ const result = getInstructionType(instructionsCopy[index]);
282
+ if (result !== keyName) {
283
+ return false;
284
+ }
285
+ }
286
+ return true;
287
+ }
288
+ /**
289
+ * Returns true when any instruction in the transaction is a confidential-transfer
290
+ * instruction.
291
+ *
292
+ * Unlike the staking and ATA patterns above, CT transactions cannot be identified by a
293
+ * fixed instruction order: enablement carries CreateATA + Reallocate before
294
+ * ConfigureAccount, while spend transactions lead with ApplyPendingBalance. They are
295
+ * identified by program + discriminator instead, so this is a membership test rather
296
+ * than an ordered match.
297
+ */
298
+ function matchConfidentialTransferInstructions(instructions) {
299
+ return instructions.some(isConfidentialTransferRawInstruction);
300
+ }
301
+ /**
302
+ * Returns true if the instruction is a confidential transfer instruction
303
+ * (Token-2022 CT extension or zk-elgamal-proof program).
304
+ *
305
+ * CT extension: byte 0 = 27 (ConfidentialTransferExtension), byte 1 ∈ {2, 5, 6, 7, 8}
306
+ * zk-elgamal-proof: any instruction from the zk-elgamal-proof program
307
+ */
308
+ function isConfidentialTransferRawInstruction(instruction) {
309
+ const programId = instruction.programId.toString();
310
+ // zk-elgamal-proof program instructions are always CT proof verifications
311
+ if (programId === constants_1.ZK_ELGAMAL_PROOF_PROGRAM_ID) {
312
+ return true;
313
+ }
314
+ // Token-2022 CT extension: byte 0 = CT_EXT_DISCRIMINATOR, byte 1 ∈ CT_SUB_DISCRIMINATORS
315
+ if (programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString() && instruction.data.length >= 2) {
316
+ return instruction.data[0] === constants_1.CT_EXT_DISCRIMINATOR && constants_1.CT_SUB_DISCRIMINATORS.has(instruction.data[1]);
317
+ }
318
+ return false;
319
+ }
320
+ /**
321
+ * Returns the transaction Type based on the transaction instructions.
322
+ * Wallet initialization, Transfer and Staking transactions are supported.
323
+ *
324
+ * @param {SolTransaction} transaction - the solana transaction
325
+ * @returns {TransactionType} - the type of transaction
326
+ */
327
+ function getTransactionType(transaction) {
328
+ const { instructions } = transaction;
329
+ if (validateRawMsgInstruction(instructions)) {
330
+ return sdk_core_1.TransactionType.StakingAuthorizeRaw;
331
+ }
332
+ validateIntructionTypes(instructions);
333
+ // check if deactivate instruction does not exist because deactivate can be include a transfer instruction
334
+ const memoInstruction = instructions.find((instruction) => getInstructionType(instruction) === 'Memo');
335
+ const memoData = memoInstruction?.data.toString('utf-8');
336
+ if (memoData?.includes('WalletConnectDefiCustomTx')) {
337
+ return sdk_core_1.TransactionType.CustomTx;
338
+ }
339
+ // Check for close ATA instructions before classifying as Send.
340
+ // A bulk close-ATA tx contains only closeAccount instructions (zero-balance ATAs).
341
+ // Note: This assumes close-ATA transactions never contain TokenTransfer instructions.
342
+ // This holds for Phase 1 where non-zero balance ATAs are rejected (user must consolidate first).
343
+ // If atomic transfer+close is added in the future, this detection needs refinement.
344
+ const hasCloseAta = instructions.some((instruction) => getInstructionType(instruction) === constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount);
345
+ if (hasCloseAta) {
346
+ return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
347
+ }
348
+ if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length === 0) {
349
+ for (const instruction of instructions) {
350
+ const instructionType = getInstructionType(instruction);
351
+ // Check if memo instruction is there and if it contains 'PrepareForRevoke' because Marinade staking deactivate transaction will have this
352
+ if ((instructionType === constants_1.ValidInstructionTypesEnum.Transfer && !memoData?.includes('PrepareForRevoke')) ||
353
+ instructionType === constants_1.ValidInstructionTypesEnum.TokenTransfer) {
354
+ return sdk_core_1.TransactionType.Send;
355
+ }
356
+ }
357
+ }
358
+ if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.walletInitInstructionIndexes)) {
359
+ return sdk_core_1.TransactionType.WalletInitialization;
360
+ }
361
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingActivateInstructionsIndexes) ||
362
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingActivateInstructionsIndexes) ||
363
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingActivateWithATAInstructionsIndexes) ||
364
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingActivateInstructionsIndexes)) {
365
+ return sdk_core_1.TransactionType.StakingActivate;
366
+ }
367
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingAuthorizeInstructionsIndexes)) {
368
+ return sdk_core_1.TransactionType.StakingAuthorize;
369
+ }
370
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDelegateInstructionsIndexes)) {
371
+ return sdk_core_1.TransactionType.StakingDelegate;
372
+ }
373
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.marinadeStakingDeactivateInstructionsIndexes) ||
374
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingDeactivateInstructionsIndexes) ||
375
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingPartialDeactivateInstructionsIndexes) ||
376
+ matchTransactionTypeByInstructionsOrder(instructions, constants_1.jitoStakingDeactivateInstructionsIndexes)) {
377
+ return sdk_core_1.TransactionType.StakingDeactivate;
378
+ }
379
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.stakingWithdrawInstructionsIndexes)) {
380
+ return sdk_core_1.TransactionType.StakingWithdraw;
381
+ }
382
+ else if (matchConfidentialTransferInstructions(instructions)) {
383
+ // CT wins over ATA-init because enablement carries CreateATA + Reallocate before
384
+ // ConfigureAccount; the CT instruction, not the ATA one, decides the parse path.
385
+ return sdk_core_1.TransactionType.ConfidentialTransfer;
386
+ }
387
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataInitInstructionIndexes)) {
388
+ return sdk_core_1.TransactionType.AssociatedTokenAccountInitialization;
389
+ }
390
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataCloseInstructionIndexes)) {
391
+ return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
392
+ }
393
+ else if (matchTransactionTypeByInstructionsOrder(instructions, constants_1.ataRecoverNestedInstructionIndexes)) {
394
+ return sdk_core_1.TransactionType.CloseAssociatedTokenAccount;
395
+ }
396
+ else {
397
+ return sdk_core_1.TransactionType.CustomTx;
398
+ }
399
+ }
400
+ /**
401
+ * Returns the instruction Type based on the solana instructions.
402
+ * Throws if the solana instruction program is not supported
403
+ *
404
+ * @param {TransactionInstruction} instruction - a solana instruction
405
+ * @returns {ValidInstructionTypes} - a solana instruction type
406
+ */
407
+ function getInstructionType(instruction) {
408
+ switch (instruction.programId.toString()) {
409
+ case new web3_js_1.PublicKey(constants_1.MEMO_PROGRAM_PK).toString():
410
+ return 'Memo';
411
+ case web3_js_1.SystemProgram.programId.toString():
412
+ return web3_js_1.SystemInstruction.decodeInstructionType(instruction);
413
+ case spl_token_1.TOKEN_PROGRAM_ID.toString():
414
+ case spl_token_1.TOKEN_2022_PROGRAM_ID.toString():
415
+ if (instruction.programId.equals(spl_token_1.TOKEN_2022_PROGRAM_ID) &&
416
+ instruction.data.length >= 2 &&
417
+ instruction.data[0] === spl_token_1.TokenInstruction.TransferFeeExtension &&
418
+ instruction.data[1] === spl_token_1.TransferFeeInstruction.TransferCheckedWithFee) {
419
+ return 'TokenTransfer';
420
+ }
421
+ let decodedInstruction;
422
+ try {
423
+ decodedInstruction = (0, spl_token_1.decodeInstruction)(instruction, instruction.programId);
424
+ }
425
+ catch (e) {
426
+ // decodeInstruction only supports the base token instruction set —
427
+ // extension-family instructions (Pause, PermissionedBurn, transfer
428
+ // fee ops, ...) throw TokenInvalidInstructionTypeError at EVERY
429
+ // @solana/spl-token version. Those must not crash classification:
430
+ // fall back to CustomInstruction, the same path used below for
431
+ // decodable-but-unmapped instruction types.
432
+ return 'CustomInstruction';
433
+ }
434
+ const instructionTypeMap = new Map();
435
+ instructionTypeMap.set(spl_token_1.TokenInstruction.CloseAccount, 'CloseAssociatedTokenAccount');
436
+ instructionTypeMap.set(spl_token_1.TokenInstruction.Burn, 'Burn');
437
+ instructionTypeMap.set(spl_token_1.TokenInstruction.MintTo, 'MintTo');
438
+ instructionTypeMap.set(spl_token_1.TokenInstruction.Approve, 'Approve');
439
+ instructionTypeMap.set(spl_token_1.TokenInstruction.TransferChecked, 'TokenTransfer');
440
+ const validInstruction = instructionTypeMap.get(decodedInstruction.data.instruction);
441
+ if (!validInstruction) {
442
+ return 'CustomInstruction';
443
+ }
444
+ return validInstruction;
445
+ case spl_stake_pool_1.STAKE_POOL_PROGRAM_ID.toString():
446
+ const discriminator = instruction.data.readUint8(0);
447
+ const layoutKey = Object.entries(spl_stake_pool_1.STAKE_POOL_INSTRUCTION_LAYOUTS).find(([_, v]) => v.index === discriminator)?.[0];
448
+ if (layoutKey === undefined) {
449
+ throw new Error('Instruction type incorrect; unknown discriminator');
450
+ }
451
+ const instructionKey = layoutKey;
452
+ return instructionKey;
453
+ case web3_js_1.StakeProgram.programId.toString():
454
+ return web3_js_1.StakeInstruction.decodeInstructionType(instruction);
455
+ case constants_1.TOKEN_ACL_PROGRAM_ID:
456
+ // The Token ACL program has a single instruction the SDK builds — the permissionless thaw.
457
+ return constants_1.ValidInstructionTypesEnum.PermissionlessThawIdempotent;
458
+ case spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID.toString():
459
+ // TODO: change this when @spl-token supports decoding associated token instructions
460
+ // Support both legacy ATA creation (data.length === 0) and idempotent ATA creation (discriminator = 1)
461
+ // Both instruction types are treated as 'InitializeAssociatedTokenAccount' for compatibility
462
+ if (instruction.data.length === 0 || isIdempotentAtaInstruction(instruction)) {
463
+ return 'InitializeAssociatedTokenAccount';
464
+ }
465
+ else if (instruction.data.length === 1 && instruction.data[0] === 2) {
466
+ return 'RecoverNestedAssociatedTokenAccount';
467
+ }
468
+ else {
469
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction program id not supported: ' + instruction.programId.toString());
470
+ }
471
+ case COMPUTE_BUDGET:
472
+ if (web3_js_1.ComputeBudgetInstruction.decodeInstructionType(instruction) === 'SetComputeUnitLimit') {
473
+ return 'SetComputeUnitLimit';
474
+ }
475
+ return 'SetPriorityFee';
476
+ default:
477
+ return 'CustomInstruction';
478
+ }
479
+ }
480
+ /**
481
+ * Validate solana instructions types to see if they are supported by the builder.
482
+ * Throws if the instruction type is invalid.
483
+ *
484
+ * @param {TransactionInstruction} instructions - a solana instruction
485
+ * @returns {void}
486
+ */
487
+ function validateIntructionTypes(instructions) {
488
+ for (const instruction of instructions) {
489
+ if (!constants_1.VALID_SYSTEM_INSTRUCTION_TYPES.includes(getInstructionType(instruction))) {
490
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
491
+ }
492
+ }
493
+ }
494
+ /**
495
+ * Validate solana instructions match raw msg authorize transaction
496
+ *
497
+ * @param {TransactionInstruction} instructions - a solana instruction
498
+ * @returns {boolean} true if the instructions match the raw msg authorize transaction
499
+ */
500
+ function validateRawMsgInstruction(instructions) {
501
+ // as web3.js cannot decode authorize instruction from CLI, we need to check it manually first
502
+ if (instructions.length === 2) {
503
+ const programId1 = instructions[0].programId.toString();
504
+ const programId2 = instructions[1].programId.toString();
505
+ if (programId1 === web3_js_1.SystemProgram.programId.toString() && programId2 === web3_js_1.StakeProgram.programId.toString()) {
506
+ const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
507
+ const data = instructions[1].data.toString('hex');
508
+ if (instructionName1 === constants_1.nonceAdvanceInstruction &&
509
+ (data === constants_1.validInstructionData || data === constants_1.validInstructionData2)) {
510
+ return true;
511
+ }
512
+ }
513
+ }
514
+ if (instructions.length === 3) {
515
+ const programId1 = instructions[0].programId.toString();
516
+ const programId2 = instructions[1].programId.toString();
517
+ const programId3 = instructions[2].programId.toString();
518
+ if (programId1 === web3_js_1.SystemProgram.programId.toString() &&
519
+ programId2 === web3_js_1.StakeProgram.programId.toString() &&
520
+ programId3 === web3_js_1.StakeProgram.programId.toString()) {
521
+ const instructionName1 = web3_js_1.SystemInstruction.decodeInstructionType(instructions[0]);
522
+ const data = instructions[1].data.toString('hex');
523
+ const data2 = instructions[2].data.toString('hex');
524
+ if (instructionName1 === constants_1.nonceAdvanceInstruction &&
525
+ (data === constants_1.validInstructionData || data === constants_1.validInstructionData2) &&
526
+ (data2 === constants_1.validInstructionData || data2 === constants_1.validInstructionData2)) {
527
+ return true;
528
+ }
529
+ }
530
+ }
531
+ return false;
532
+ }
533
+ /**
534
+ * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
535
+ *
536
+ * @param {string} rawTransaction - Transaction in base64 string format
537
+ */
538
+ function validateRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
539
+ if (!rawTransaction) {
540
+ throw new sdk_core_1.ParseTransactionError('Invalid raw transaction: Undefined');
541
+ }
542
+ if (!isValidRawTransaction(rawTransaction, requireAllSignatures, verifySignatures)) {
543
+ throw new sdk_core_1.ParseTransactionError('Invalid raw transaction');
544
+ }
545
+ }
546
+ /**
547
+ * Validates address to check if it exists and is a valid Solana public key
548
+ *
549
+ * @param {string} address The address to be validated
550
+ * @param {string} fieldName Name of the field to validate, its needed to return which field is failing on case of error.
551
+ */
552
+ function validateAddress(address, fieldName) {
553
+ if (!address || !isValidPublicKey(address)) {
554
+ throw new sdk_core_1.BuildTransactionError(`Invalid or missing ${fieldName}, got: ${address}`);
555
+ }
556
+ }
557
+ /**
558
+ * Get the statics coin object matching a given Solana token address if it exists
559
+ *
560
+ * @param tokenAddress The token address to match against
561
+ * @param network Solana Mainnet or Testnet
562
+ * @returns statics BaseCoin object for the matching token
563
+ */
564
+ function getSolTokenFromAddress(tokenAddress, network) {
565
+ const tokens = statics_1.coins.filter((coin) => {
566
+ if (coin instanceof statics_1.SolCoin) {
567
+ return coin.network.type === network.type && coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
568
+ }
569
+ return false;
570
+ });
571
+ const tokensArray = tokens.map((token) => token);
572
+ if (tokensArray.length >= 1) {
573
+ // there should never be two tokens with the same contract address, so we assert that here
574
+ (0, assert_1.default)(tokensArray.length === 1);
575
+ return tokensArray[0];
576
+ }
577
+ return undefined;
578
+ }
579
+ /**
580
+ * Get the statics coin object matching a given Solana token address if it exists
581
+ *
582
+ * @param tokenAddress The token address to match against
583
+ * @param network Solana Mainnet or Testnet
584
+ * @returns statics BaseCoin object for the matching token
585
+ */
586
+ function getSolTokenFromAddressOnly(tokenAddress) {
587
+ const tokens = statics_1.coins.filter((coin) => {
588
+ if (coin instanceof statics_1.SolCoin) {
589
+ return coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
590
+ }
591
+ return false;
592
+ });
593
+ const tokensArray = tokens.map((token) => token);
594
+ if (tokensArray.length >= 1) {
595
+ // there should never be two tokens with the same contract address, so we assert that here
596
+ (0, assert_1.default)(tokensArray.length === 1);
597
+ return tokensArray[0];
598
+ }
599
+ return undefined;
600
+ }
601
+ /**
602
+ * Get the solana token object from token name
603
+ * @param tokenName The token name to match against
604
+ * */
605
+ function getSolTokenFromTokenName(tokenName) {
606
+ try {
607
+ const token = statics_1.coins.get(tokenName);
608
+ if (!(token.isToken && token instanceof statics_1.SolCoin)) {
609
+ return undefined;
610
+ }
611
+ return token;
612
+ }
613
+ catch (e) {
614
+ if (!(e instanceof statics_1.CoinNotDefinedError)) {
615
+ throw e;
616
+ }
617
+ return undefined;
618
+ }
619
+ }
620
+ /**
621
+ * Get the solana associated token account address
622
+ * @param tokenAddress token mint address
623
+ * @param ownerAddress The owner of the associated token account
624
+ * @returns The associated token account address
625
+ * */
626
+ async function getAssociatedTokenAccountAddress(tokenMintAddress, ownerAddress, allowOwnerOffCurve = false, programId) {
627
+ const mintPublicKey = new web3_js_1.PublicKey(tokenMintAddress);
628
+ const ownerPublicKey = new web3_js_1.PublicKey(ownerAddress);
629
+ // tokenAddress are not on ed25519 curve, so they can't be used as ownerAddress
630
+ if (!allowOwnerOffCurve && !web3_js_1.PublicKey.isOnCurve(ownerPublicKey.toBuffer())) {
631
+ throw new sdk_core_1.UtilsError('Invalid ownerAddress - address off ed25519 curve, got: ' + ownerAddress);
632
+ }
633
+ if (!programId) {
634
+ const coin = getSolTokenFromAddressOnly(tokenMintAddress);
635
+ if (coin && coin instanceof statics_1.SolCoin && 'programId' in coin && coin.programId) {
636
+ programId = coin.programId.toString();
637
+ }
638
+ else {
639
+ programId = spl_token_1.TOKEN_PROGRAM_ID.toString();
640
+ }
641
+ }
642
+ let ataAddress;
643
+ if (programId === spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
644
+ ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve, spl_token_1.TOKEN_2022_PROGRAM_ID);
645
+ }
646
+ else {
647
+ ataAddress = await (0, spl_token_1.getAssociatedTokenAddress)(mintPublicKey, ownerPublicKey, allowOwnerOffCurve);
648
+ }
649
+ return ataAddress.toString();
650
+ }
651
+ function validateMintAddress(mintAddress) {
652
+ if (!mintAddress || !isValidAddress(mintAddress)) {
653
+ throw new sdk_core_1.BuildTransactionError('Invalid or missing mintAddress, got: ' + mintAddress);
654
+ }
655
+ }
656
+ function validateOwnerAddress(ownerAddress) {
657
+ if (!ownerAddress || !isValidAddress(ownerAddress)) {
658
+ throw new sdk_core_1.BuildTransactionError('Invalid or missing ownerAddress, got: ' + ownerAddress);
659
+ }
660
+ }
661
+ /**
662
+ * Type predicate to check if an instruction is a legacy SolInstruction.
663
+ * Uses 'programId' property as the discriminator since it's unique to legacy instructions
664
+ * Versioned instructions have 'programIdIndex' property.
665
+ *
666
+ * @param instruction - The instruction to check
667
+ * @returns True if the instruction is a SolInstruction (has programId field)
668
+ */
669
+ function isSolLegacyInstruction(instruction) {
670
+ return 'programId' in instruction;
671
+ }
672
+ /**
673
+ * Token-2022 transfer fee: min(amount * basisPoints / 10000, maximumFee), in raw base units.
674
+ * All math in BigInt to avoid precision loss.
675
+ */
676
+ function computeTransferFee(amount, basisPoints, maximumFee) {
677
+ const raw = (BigInt(amount) * BigInt(basisPoints)) / 10000n;
678
+ const cap = BigInt(maximumFee);
679
+ return (raw < cap ? raw : cap).toString();
680
+ }
681
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBb0ZBLGdFQUVDO0FBR0Qsd0NBRUM7QUFHRCx3Q0FRQztBQUdELDhDQU9DO0FBR0QsNENBUUM7QUFHRCw0Q0FNQztBQUlELG9EQUVDO0FBUUQsc0NBR0M7QUFRRCxvREFHQztBQVFELGtDQUVDO0FBT0Qsc0NBT0M7QUFPRCxnQ0FFQztBQVVELHNEQVlDO0FBVUQsMENBY0M7QUFRRCxnREFFQztBQVFELGdEQUVDO0FBUUQsd0RBRUM7QUFRRCxzREFFQztBQVVELDBGQXdDQztBQVlELHNGQUVDO0FBNkJELGdEQXVFQztBQVNELGdEQXlFQztBQVNELDBEQU1DO0FBUUQsOERBc0NDO0FBTUQsd0RBV0M7QUFRRCwwQ0FJQztBQVNELHdEQWNDO0FBU0QsZ0VBY0M7QUFNRCw0REFhQztBQVFELDRFQW1DQztBQUVELGtEQUlDO0FBRUQsb0RBSUM7QUFVRCx3REFJQztBQU1ELGdEQUlDO0FBdnZCRCxtREFTOEI7QUFDOUIsaURBQWlHO0FBQ2pHLGlEQVMyQjtBQUMzQiw2Q0FXeUI7QUFDekIsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUNyQyxnREFBd0I7QUFDeEIsMERBQTZCO0FBQzdCLDJDQTJCcUI7QUFFckIsMkRBQStGO0FBRS9GLE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDLENBQUMscUZBQXFGO0FBQzNILE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0RBQWdEO0FBQ3JGLE1BQU0sdUJBQXVCLEdBQUcsc0JBQXNCLENBQUM7QUFDdkQsTUFBTSxjQUFjLEdBQUcsNkNBQTZDLENBQUM7QUFFckU7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLDBCQUEwQixDQUFDLFdBQW1DO0lBQzVFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJ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QztBQUNILENBQUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxZQUFvQjtJQUN2RCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHdDQUF3QyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQzNGLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHNCQUFzQixDQUNwQyxXQUFxRDtJQUVyRCxPQUFPLFdBQVcsSUFBSSxXQUFXLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE1BQWMsRUFBRSxXQUFtQixFQUFFLFVBQWtCO0lBQ3hGLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUM1RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0IsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgaXNWYWxpZFhwdWIsXG4gIE5vdFN1cHBvcnRlZCxcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBTb2xJbnN0cnVjdGlvbixcbiAgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVXRpbHNFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4sIEJhc2VOZXR3b3JrLCBDb2luTm90RGVmaW5lZEVycm9yLCBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELFxuICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzLFxuICBUT0tFTl9QUk9HUkFNX0lELFxuICBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gIGRlY29kZUluc3RydWN0aW9uLFxuICBEZWNvZGVkSW5zdHJ1Y3Rpb24sXG4gIFRva2VuSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zZmVyRmVlSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEtleXBhaXIsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmF0dXJlUHVia2V5UGFpcixcbiAgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFN5c3RlbVByb2dyYW0sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7XG4gIGF0YUNsb3NlSW5zdHJ1Y3Rpb25JbmRleGVzLFxuICBhdGFJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLFxuICBhdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25JbmRleGVzLFxuICBNQVhfTUVNT19MRU5HVEgsXG4gIE1FTU9fUFJPR1JBTV9QSyxcbiAgbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24sXG4gIHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIG1hcmluYWRlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgc3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgbWFyaW5hZGVTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdEZWxlZ2F0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdQYXJ0aWFsRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMsXG4gIFZBTElEX1NZU1RFTV9JTlNUUlVDVElPTl9UWVBFUyxcbiAgdmFsaWRJbnN0cnVjdGlvbkRhdGEsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMixcbiAgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSxcbiAgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbiAgaml0b1N0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIGppdG9TdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIGppdG9TdGFraW5nQWN0aXZhdGVXaXRoQVRBSW5zdHJ1Y3Rpb25zSW5kZXhlcyxcbiAgVE9LRU5fQUNMX1BST0dSQU1fSUQsXG4gIFpLX0VMR0FNQUxfUFJPT0ZfUFJPR1JBTV9JRCxcbiAgQ1RfRVhUX0RJU0NSSU1JTkFUT1IsXG4gIENUX1NVQl9ESVNDUklNSU5BVE9SUyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVmFsaWRJbnN0cnVjdGlvblR5cGVzIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBTVEFLRV9QT09MX0lOU1RSVUNUSU9OX0xBWU9VVFMsIFNUQUtFX1BPT0xfUFJPR1JBTV9JRCB9IGZyb20gJ0Bzb2xhbmEvc3BsLXN0YWtlLXBvb2wnO1xuXG5jb25zdCBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIID0gMzI7IC8vIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL2RldmVsb3BpbmcvcHJvZ3JhbW1pbmctbW9kZWwvdHJhbnNhY3Rpb25zI2Jsb2NraGFzaC1mb3JtYXRcbmNvbnN0IERFQ09ERURfU0lHTkFUVVJFX0xFTkdUSCA9IDY0OyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS90ZXJtaW5vbG9neSNzaWduYXR1cmVcbmNvbnN0IEJBU0VfNThfRU5DT05ESU5HX1JFR0VYID0gJ1sxLTlBLUhKLU5QLVphLWttLXpdJztcbmNvbnN0IENPTVBVVEVfQlVER0VUID0gJ0NvbXB1dGVCdWRnZXQxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBBVEEgaW5zdHJ1Y3Rpb24gaXMgaWRlbXBvdGVudCAoZGlzY3JpbWluYXRvciBieXRlID0gMSkuXG4gKlxuICogSWRlbXBvdGVudCBBVEEgaW5zdHJ1Y3Rpb25zIHVzZSBCdWZmZXIuZnJvbShbMV0pIGFzIGluc3RydWN0aW9uIGRhdGEsIGNyZWF0ZWQgYnlcbiAqIEBzb2xhbmEvc3BsLXRva2VuJ3MgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudElkZW1wb3RlbnRJbnN0cnVjdGlvbigpICh2MC40LjErKS5cbiAqIEFuIGlkZW1wb3RlbnQgQVRBIGluc3RydWN0aW9uIHN1Y2NlZWQgZXZlbiBpZiBhY2NvdW50IGV4aXN0cyxcbiAqIHByZXZlbnRpbmcgcmFjZSBjb25kaXRpb24gZXJyb3JzIGluIGNvbmN1cnJlbnQgc2NlbmFyaW9zLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0gaW5zdHJ1Y3Rpb24gLSBUaGUgaW5zdHJ1Y3Rpb24gdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGluc3RydWN0aW9uIGRhdGEgaXMgYSBzaW5nbGUgYnl0ZSB3aXRoIHZhbHVlIDFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSWRlbXBvdGVudEF0YUluc3RydWN0aW9uKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA9PT0gMSAmJiBpbnN0cnVjdGlvbi5kYXRhWzBdID09PSAxO1xufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRQdWJsaWNLZXkoYWRkcmVzcyk7XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWhhc2ggJiYgbmV3IFJlZ0V4cChCQVNFXzU4X0VOQ09ORElOR19SRUdFWCkudGVzdChoYXNoKSAmJiBiczU4LmRlY29kZShoYXNoKS5sZW5ndGggPT09IERFQ09ERURfQkxPQ0tfSEFTSF9MRU5HVEhcbiAgICApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQcml2YXRlS2V5KHBydktleTogc3RyaW5nIHwgVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleTogVWludDhBcnJheSA9IHR5cGVvZiBwcnZLZXkgPT09ICdzdHJpbmcnID8gYmFzZTU4VG9VaW50OEFycmF5KHBydktleSkgOiBwcnZLZXk7XG4gICAgcmV0dXJuICEhS2V5cGFpci5mcm9tU2VjcmV0S2V5KGtleSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFB1YmxpY0tleShwdWJLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGlmIChpc1ZhbGlkWHB1YihwdWJLZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBuZXcgUHVibGljS2V5KHB1YktleSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhc2lnbmF0dXJlICYmIGJzNTguZGVjb2RlKHNpZ25hdHVyZSkubGVuZ3RoID09PSBERUNPREVEX1NJR05BVFVSRV9MRU5HVEg7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG4vLyBUcmFuc2FjdGlvbklkIGFyZSB0aGUgZmlyc3Qgc2lnbmF0dXJlIG9uIGEgVHJhbnNhY3Rpb25cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRTaWduYXR1cmUodHhJZCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSB0aGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBhbW91bnQgb2YgbGFtcG9ydHMgbnVtYmVyIG9uIHN0YWtpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3Rha2luZ0Ftb3VudChhbW91bnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiaWdOdW1iZXJBbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCk7XG4gIHJldHVybiBiaWdOdW1iZXJBbW91bnQuaXNJbnRlZ2VyKCkgJiYgYmlnTnVtYmVyQW1vdW50LmlzR3JlYXRlclRoYW4oMCk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBpcyBhIHZhbGlkIG1lbW8gb3Igbm90LlxuICpcbiAqIEBwYXJhbSBtZW1vIC0gdGhlIG1lbW8gc3RyaW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRNZW1vKG1lbW86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gQnVmZmVyLmZyb20obWVtbykubGVuZ3RoIDw9IE1BWF9NRU1PX0xFTkdUSDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgdmFsaWQgYmFzZTY0IGVuY29kZWQgZGF0YVxuICogQHBhcmFtIHN0ciAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cmluZyBpcyB2YWxpZCBiYXNlNjQsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJhc2U2NChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShzdHIsICdiYXNlNjQnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgcmV0dXJuIGRlY29kZWQgPT09IHN0cjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIHZhbGlkIGhleGFkZWNpbWFsIGRhdGFcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgdmFsaWQgaGV4LCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRIZXgoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eWzAtOUEtRmEtZl0qJC8udGVzdChzdHIpICYmIHN0ci5sZW5ndGggJSAyID09PSAwO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiByYXcgdHJhbnNhY3Rpb24gY2FuIGJlIGRlc2VyaWFsaXplZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIHRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgZm9ybWF0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVBbGxTaWduYXR1cmVzIC0gcmVxdWlyZSBhbGwgc2lnbmF0dXJlcyB0byBiZSBwcmVzZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZlcmlmeVNpZ25hdHVyZXMgLSB2ZXJpZnkgc2lnbmF0dXJlc1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUmF3VHJhbnNhY3Rpb24oXG4gIHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcsXG4gIHJlcXVpcmVBbGxTaWduYXR1cmVzID0gZmFsc2UsXG4gIHZlcmlmeVNpZ25hdHVyZXMgPSBmYWxzZVxuKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdHggPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHJhd1RyYW5zYWN0aW9uLCAnYmFzZTY0JykpO1xuICAgIHR4LnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzLCB2ZXJpZnlTaWduYXR1cmVzIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVmVyaWZpZXMgaWYgc2lnbmF0dXJlIGZvciBtZXNzYWdlIGlzIHZhbGlkLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzZXJpYWxpemVkVHggLSB0eCBhcyBhIGJhc2U2NCBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgLSBzaWduYXR1cmUgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNLZXkgLSBwdWJsaWMga2V5IGFzIGJhc2UgNThcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShzZXJpYWxpemVkVHg6IHN0cmluZywgc2lnbmF0dXJlOiBzdHJpbmcsIHB1YmxpY0tleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeCkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBzZXJpYWxpemVkVHgnKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRQdWJsaWNLZXkocHVibGljS2V5KSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHB1YmxpY0tleScpO1xuICB9XG4gIGlmICghaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmUpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlJyk7XG4gIH1cbiAgY29uc3QgbXNnID0gU29sVHJhbnNhY3Rpb24uZnJvbShCdWZmZXIuZnJvbShzZXJpYWxpemVkVHgsICdiYXNlNjQnKSkuc2VyaWFsaXplTWVzc2FnZSgpO1xuICBjb25zdCBzaWcgPSBiYXNlNThUb1VpbnQ4QXJyYXkoc2lnbmF0dXJlKTtcbiAgY29uc3QgcHViID0gbmV3IFB1YmxpY0tleShwdWJsaWNLZXkpO1xuICByZXR1cm4gbmFjbC5zaWduLmRldGFjaGVkLnZlcmlmeShtc2csIHNpZywgcHViLnRvQnVmZmVyKCkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzZTU4IHN0cmluZyBpbnRvIGEgVWludDhBcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgLSBhIHN0cmluZyBpbiBiYXNlNThcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSAtIGFuIFVpbnQ4QXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U1OFRvVWludDhBcnJheShpbnB1dDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShiczU4LmRlY29kZShpbnB1dCkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgVWludDhBcnJheSB0byBhIGJhc2U1OCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpbnB1dCAtIGFuIFVpbnQ4QXJyYXlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gYSBzdHJpbmcgaW4gYmFzZTU4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVaW50OEFycmF5VG9iYXNlNTgoaW5wdXQ6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICByZXR1cm4gYnM1OC5lbmNvZGUoaW5wdXQpO1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBhbW91bnQgb2Ygc2lnbmF0dXJlcyBhcmUgbm90IG51bGwuXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQdWJrZXlQYWlyW119IHNpZ25hdHVyZXMgLSBhbiBhcnJheSBvZiBTaWduYXR1cmVQdWJrZXlQYWlyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIHRoZSBhbW91bnQgb2YgdmFsaWQgc2lnbmF0dXJlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnROb3ROdWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBTaWduYXR1cmVQdWJrZXlQYWlyW10pOiBudW1iZXIge1xuICByZXR1cm4gc2lnbmF0dXJlcy5maWx0ZXIoKHNpZykgPT4gISFzaWcuc2lnbmF0dXJlKS5sZW5ndGg7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYWxsIHNpZ25hdHVyZXMgYXJlIGNvbXBsZXRlZC5cbiAqXG4gKiBAcGFyYW0ge1NpZ25hdHVyZVB1YmtleVBhaXJbXX0gc2lnbmF0dXJlcyAtIHNpZ25hdHVyZXNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZXNBbGxTaWduYXR1cmVzKHNpZ25hdHVyZXM6IFNpZ25hdHVyZVB1YmtleVBhaXJbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2lnbmF0dXJlcy5sZW5ndGggPiAwICYmIGNvdW50Tm90TnVsbFNpZ25hdHVyZXMoc2lnbmF0dXJlcykgPT09IHNpZ25hdHVyZXMubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrIHRoZSB0cmFuc2FjdGlvbiB0eXBlIG1hdGNoaW5nIGluc3RydWN0aW9ucyBieSBvcmRlci4gTWVtbyBhbmQgQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbnNcbiAqIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSB0aGUgYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYmUgcGFyc2VkXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlcj59IGluc3RydWN0aW9uSW5kZXhlcyAtIHRoZSBpbnN0cnVjdGlvbnMgaW5kZXhlcyBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvblxuICogQHJldHVybnMgdHJ1ZSBpZiBpdCBtYXRjaGVzIGJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgaW5zdHJ1Y3Rpb25JbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+XG4pOiBib29sZWFuIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zQ29weSA9IFsuLi5pbnN0cnVjdGlvbnNdOyAvLyBNYWtlIGEgY29weSBzaW5jZSB3ZSBtYXkgbW9kaWZ5IHRoZSBhcnJheSBiZWxvd1xuICAvLyBBZHZhbmNlTm9uY2VBY2NvdW50IGFuZCBjb21wdXRlLWJ1ZGdldCBpbnN0cnVjdGlvbnMgKFNldENvbXB1dGVVbml0TGltaXQgL1xuICAvLyBTZXRQcmlvcml0eUZlZSkgYXJlIG9wdGlvbmFsIGxlYWRpbmcgaW5zdHJ1Y3Rpb25zIHRoYXQgZG9uJ3QgYWZmZWN0IHRoZVxuICAvLyB0eXBlLWRlZmluaW5nIGluc3RydWN0aW9uIG9yZGVyLCBzbyBza2lwIHRoZW0gdGhlIHNhbWUgd2F5LlxuICB3aGlsZSAoaW5zdHJ1Y3Rpb25zQ29weS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc0NvcHlbMF0pO1xuICAgIGlmIChcbiAgICAgIGluc3RydWN0aW9uVHlwZSA9PT0gJ0FkdmFuY2VOb25jZUFjY291bnQnIHx8XG4gICAgICBpbnN0cnVjdGlvblR5cGUgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0Q29tcHV0ZVVuaXRMaW1pdCB8fFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNldFByaW9yaXR5RmVlXG4gICAgKSB7XG4gICAgICBpbnN0cnVjdGlvbnNDb3B5LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1lbW8gaXMgb3B0aW9uYWwgYW5kIHRoZSBsYXN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgLy8gV2h5IGhhdmUgaXQgaW4gaW5zdHJ1Y3Rpb25LZXlzIGlmIHdlIGFyZSBnb2luZyB0byBpZ25vcmUgaXQ/XG4gIGNvbnN0IGluc3RydWN0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhpbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAoaW5zdHJ1Y3Rpb25zS2V5c1tpbnN0cnVjdGlvbnNLZXlzLmxlbmd0aCAtIDFdID09PSAnTWVtbycpIHtcbiAgICBpbnN0cnVjdGlvbnNLZXlzLnBvcCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaW5zdHJ1Y3Rpb25zIGJ5IG9yZGVyIHVzaW5nIHRoZSBpbmRleC5cbiAgZm9yIChjb25zdCBrZXlOYW1lIG9mIGluc3RydWN0aW9uc0tleXMpIHtcbiAgICBjb25zdCBpbmRleCA9IGluc3RydWN0aW9uSW5kZXhlc1trZXlOYW1lXTtcbiAgICBpZiAoaW5kZXggPj0gaW5zdHJ1Y3Rpb25zQ29weS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uc0NvcHlbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ICE9PSBrZXlOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIGFueSBpbnN0cnVjdGlvbiBpbiB0aGUgdHJhbnNhY3Rpb24gaXMgYSBjb25maWRlbnRpYWwtdHJhbnNmZXJcbiAqIGluc3RydWN0aW9uLlxuICpcbiAqIFVubGlrZSB0aGUgc3Rha2luZyBhbmQgQVRBIHBhdHRlcm5zIGFib3ZlLCBDVCB0cmFuc2FjdGlvbnMgY2Fubm90IGJlIGlkZW50aWZpZWQgYnkgYVxuICogZml4ZWQgaW5zdHJ1Y3Rpb24gb3JkZXI6IGVuYWJsZW1lbnQgY2FycmllcyBDcmVhdGVBVEEgKyBSZWFsbG9jYXRlIGJlZm9yZVxuICogQ29uZmlndXJlQWNjb3VudCwgd2hpbGUgc3BlbmQgdHJhbnNhY3Rpb25zIGxlYWQgd2l0aCBBcHBseVBlbmRpbmdCYWxhbmNlLiBUaGV5IGFyZVxuICogaWRlbnRpZmllZCBieSBwcm9ncmFtICsgZGlzY3JpbWluYXRvciBpbnN0ZWFkLCBzbyB0aGlzIGlzIGEgbWVtYmVyc2hpcCB0ZXN0IHJhdGhlclxuICogdGhhbiBhbiBvcmRlcmVkIG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hDb25maWRlbnRpYWxUcmFuc2Zlckluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5zdHJ1Y3Rpb25zLnNvbWUoaXNDb25maWRlbnRpYWxUcmFuc2ZlclJhd0luc3RydWN0aW9uKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgY29uZmlkZW50aWFsIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gKiAoVG9rZW4tMjAyMiBDVCBleHRlbnNpb24gb3IgemstZWxnYW1hbC1wcm9vZiBwcm9ncmFtKS5cbiAqXG4gKiBDVCBleHRlbnNpb246IGJ5dGUgMCA9IDI3IChDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvbiksIGJ5dGUgMSDiiIggezIsIDUsIDYsIDcsIDh9XG4gKiB6ay1lbGdhbWFsLXByb29mOiBhbnkgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgemstZWxnYW1hbC1wcm9vZiBwcm9ncmFtXG4gKi9cbmZ1bmN0aW9uIGlzQ29uZmlkZW50aWFsVHJhbnNmZXJSYXdJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcm9ncmFtSWQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgLy8gemstZWxnYW1hbC1wcm9vZiBwcm9ncmFtIGluc3RydWN0aW9ucyBhcmUgYWx3YXlzIENUIHByb29mIHZlcmlmaWNhdGlvbnNcbiAgaWYgKHByb2dyYW1JZCA9PT0gWktfRUxHQU1BTF9QUk9PRl9QUk9HUkFNX0lEKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gVG9rZW4tMjAyMiBDVCBleHRlbnNpb246IGJ5dGUgMCA9IENUX0VYVF9ESVNDUklNSU5BVE9SLCBieXRlIDEg4oiIIENUX1NVQl9ESVNDUklNSU5BVE9SU1xuICBpZiAocHJvZ3JhbUlkID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSAmJiBpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA+PSAyKSB7XG4gICAgcmV0dXJuIGluc3RydWN0aW9uLmRhdGFbMF0gPT09IENUX0VYVF9ESVNDUklNSU5BVE9SICYmIENUX1NVQl9ESVNDUklNSU5BVE9SUy5oYXMoaW5zdHJ1Y3Rpb24uZGF0YVsxXSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zYWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlICB0cmFuc2FjdGlvbiBpbnN0cnVjdGlvbnMuXG4gKiBXYWxsZXQgaW5pdGlhbGl6YXRpb24sIFRyYW5zZmVyIGFuZCBTdGFraW5nIHRyYW5zYWN0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7U29sVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uIC0gdGhlIHNvbGFuYSB0cmFuc2FjdGlvblxuICogQHJldHVybnMge1RyYW5zYWN0aW9uVHlwZX0gLSB0aGUgdHlwZSBvZiB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBTb2xUcmFuc2FjdGlvbik6IFRyYW5zYWN0aW9uVHlwZSB7XG4gIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zIH0gPSB0cmFuc2FjdGlvbjtcbiAgaWYgKHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25zKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdztcbiAgfVxuICB2YWxpZGF0ZUludHJ1Y3Rpb25UeXBlcyhpbnN0cnVjdGlvbnMpO1xuICAvLyBjaGVjayBpZiBkZWFjdGl2YXRlIGluc3RydWN0aW9uIGRvZXMgbm90IGV4aXN0IGJlY2F1c2UgZGVhY3RpdmF0ZSBjYW4gYmUgaW5jbHVkZSBhIHRyYW5zZmVyIGluc3RydWN0aW9uXG4gIGNvbnN0IG1lbW9JbnN0cnVjdGlvbiA9IGluc3RydWN0aW9ucy5maW5kKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ01lbW8nKTtcbiAgY29uc3QgbWVtb0RhdGEgPSBtZW1vSW5zdHJ1Y3Rpb24/LmRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIGlmIChtZW1vRGF0YT8uaW5jbHVkZXMoJ1dhbGxldENvbm5lY3REZWZpQ3VzdG9tVHgnKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGNsb3NlIEFUQSBpbnN0cnVjdGlvbnMgYmVmb3JlIGNsYXNzaWZ5aW5nIGFzIFNlbmQuXG4gIC8vIEEgYnVsayBjbG9zZS1BVEEgdHggY29udGFpbnMgb25seSBjbG9zZUFjY291bnQgaW5zdHJ1Y3Rpb25zICh6ZXJvLWJhbGFuY2UgQVRBcykuXG4gIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjbG9zZS1BVEEgdHJhbnNhY3Rpb25zIG5ldmVyIGNvbnRhaW4gVG9rZW5UcmFuc2ZlciBpbnN0cnVjdGlvbnMuXG4gIC8vIFRoaXMgaG9sZHMgZm9yIFBoYXNlIDEgd2hlcmUgbm9uLXplcm8gYmFsYW5jZSBBVEFzIGFyZSByZWplY3RlZCAodXNlciBtdXN0IGNvbnNvbGlkYXRlIGZpcnN0KS5cbiAgLy8gSWYgYXRvbWljIHRyYW5zZmVyK2Nsb3NlIGlzIGFkZGVkIGluIHRoZSBmdXR1cmUsIHRoaXMgZGV0ZWN0aW9uIG5lZWRzIHJlZmluZW1lbnQuXG4gIGNvbnN0IGhhc0Nsb3NlQXRhID0gaW5zdHJ1Y3Rpb25zLnNvbWUoXG4gICAgKGluc3RydWN0aW9uKSA9PiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudFxuICApO1xuICBpZiAoaGFzQ2xvc2VBdGEpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDtcbiAgfVxuXG4gIGlmIChpbnN0cnVjdGlvbnMuZmlsdGVyKChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ0RlYWN0aXZhdGUnKS5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICAgIC8vIENoZWNrIGlmIG1lbW8gaW5zdHJ1Y3Rpb24gaXMgdGhlcmUgYW5kIGlmIGl0IGNvbnRhaW5zICdQcmVwYXJlRm9yUmV2b2tlJyBiZWNhdXNlIE1hcmluYWRlIHN0YWtpbmcgZGVhY3RpdmF0ZSB0cmFuc2FjdGlvbiB3aWxsIGhhdmUgdGhpc1xuICAgICAgaWYgKFxuICAgICAgICAoaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyICYmICFtZW1vRGF0YT8uaW5jbHVkZXMoJ1ByZXBhcmVGb3JSZXZva2UnKSkgfHxcbiAgICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRva2VuVHJhbnNmZXJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gIH0gZWxzZSBpZiAoXG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgbWFyaW5hZGVTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGppdG9TdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGppdG9TdGFraW5nQWN0aXZhdGVXaXRoQVRBSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZTtcbiAgfSBlbHNlIGlmIChcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBtYXJpbmFkZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ1BhcnRpYWxEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBqaXRvU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKVxuICApIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gIH0gZWxzZSBpZiAobWF0Y2hDb25maWRlbnRpYWxUcmFuc2Zlckluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpKSB7XG4gICAgLy8gQ1Qgd2lucyBvdmVyIEFUQS1pbml0IGJlY2F1c2UgZW5hYmxlbWVudCBjYXJyaWVzIENyZWF0ZUFUQSArIFJlYWxsb2NhdGUgYmVmb3JlXG4gICAgLy8gQ29uZmlndXJlQWNjb3VudDsgdGhlIENUIGluc3RydWN0aW9uLCBub3QgdGhlIEFUQSBvbmUsIGRlY2lkZXMgdGhlIHBhcnNlIHBhdGguXG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5Db25maWRlbnRpYWxUcmFuc2ZlcjtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBhdGFJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGF0YUNsb3NlSW5zdHJ1Y3Rpb25JbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50O1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGF0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbkluZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluc3RydWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlIHNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKiBUaHJvd3MgaWYgdGhlIHNvbGFuYSBpbnN0cnVjdGlvbiBwcm9ncmFtIGlzIG5vdCBzdXBwb3J0ZWRcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtWYWxpZEluc3RydWN0aW9uVHlwZXN9IC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb24gdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogVmFsaWRJbnN0cnVjdGlvblR5cGVzIHtcbiAgc3dpdGNoIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgIGNhc2UgbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gJ01lbW8nO1xuICAgIGNhc2UgU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIGNhc2UgVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgIGNhc2UgVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICBpZiAoXG4gICAgICAgIGluc3RydWN0aW9uLnByb2dyYW1JZC5lcXVhbHMoVE9LRU5fMjAyMl9QUk9HUkFNX0lEKSAmJlxuICAgICAgICBpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA+PSAyICYmXG4gICAgICAgIGluc3RydWN0aW9uLmRhdGFbMF0gPT09IFRva2VuSW5zdHJ1Y3Rpb24uVHJhbnNmZXJGZWVFeHRlbnNpb24gJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb24uZGF0YVsxXSA9PT0gVHJhbnNmZXJGZWVJbnN0cnVjdGlvbi5UcmFuc2ZlckNoZWNrZWRXaXRoRmVlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuICdUb2tlblRyYW5zZmVyJztcbiAgICAgIH1cbiAgICAgIGxldCBkZWNvZGVkSW5zdHJ1Y3Rpb246IERlY29kZWRJbnN0cnVjdGlvbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlY29kZWRJbnN0cnVjdGlvbiA9IGRlY29kZUluc3RydWN0aW9uKGluc3RydWN0aW9uLCBpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBkZWNvZGVJbnN0cnVjdGlvbiBvbmx5IHN1cHBvcnRzIHRoZSBiYXNlIHRva2VuIGluc3RydWN0aW9uIHNldCDigJRcbiAgICAgICAgLy8gZXh0ZW5zaW9uLWZhbWlseSBpbnN0cnVjdGlvbnMgKFBhdXNlLCBQZXJtaXNzaW9uZWRCdXJuLCB0cmFuc2ZlclxuICAgICAgICAvLyBmZWUgb3BzLCAuLi4pIHRocm93IFRva2VuSW52YWxpZEluc3RydWN0aW9uVHlwZUVycm9yIGF0IEVWRVJZXG4gICAgICAgIC8vIEBzb2xhbmEvc3BsLXRva2VuIHZlcnNpb24uIFRob3NlIG11c3Qgbm90IGNyYXNoIGNsYXNzaWZpY2F0aW9uOlxuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gQ3VzdG9tSW5zdHJ1Y3Rpb24sIHRoZSBzYW1lIHBhdGggdXNlZCBiZWxvdyBmb3JcbiAgICAgICAgLy8gZGVjb2RhYmxlLWJ1dC11bm1hcHBlZCBpbnN0cnVjdGlvbiB0eXBlcy5cbiAgICAgICAgcmV0dXJuICdDdXN0b21JbnN0cnVjdGlvbic7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0cnVjdGlvblR5cGVNYXA6IE1hcDxUb2tlbkluc3RydWN0aW9uLCBWYWxpZEluc3RydWN0aW9uVHlwZXM+ID0gbmV3IE1hcCgpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLkNsb3NlQWNjb3VudCwgJ0Nsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCcpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLkJ1cm4sICdCdXJuJyk7XG4gICAgICBpbnN0cnVjdGlvblR5cGVNYXAuc2V0KFRva2VuSW5zdHJ1Y3Rpb24uTWludFRvLCAnTWludFRvJyk7XG4gICAgICBpbnN0cnVjdGlvblR5cGVNYXAuc2V0KFRva2VuSW5zdHJ1Y3Rpb24uQXBwcm92ZSwgJ0FwcHJvdmUnKTtcbiAgICAgIGluc3RydWN0aW9uVHlwZU1hcC5zZXQoVG9rZW5JbnN0cnVjdGlvbi5UcmFuc2ZlckNoZWNrZWQsICdUb2tlblRyYW5zZmVyJyk7XG4gICAgICBjb25zdCB2YWxpZEluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25UeXBlTWFwLmdldChkZWNvZGVkSW5zdHJ1Y3Rpb24uZGF0YS5pbnN0cnVjdGlvbik7XG4gICAgICBpZiAoIXZhbGlkSW5zdHJ1Y3Rpb24pIHtcbiAgICAgICAgcmV0dXJuICdDdXN0b21JbnN0cnVjdGlvbic7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRJbnN0cnVjdGlvbjtcbiAgICBjYXNlIFNUQUtFX1BPT0xfUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgICAgY29uc3QgZGlzY3JpbWluYXRvciA9IGluc3RydWN0aW9uLmRhdGEucmVhZFVpbnQ4KDApO1xuICAgICAgY29uc3QgbGF5b3V0S2V5ID0gT2JqZWN0LmVudHJpZXMoU1RBS0VfUE9PTF9JTlNUUlVDVElPTl9MQVlPVVRTKS5maW5kKChbXywgdl0pID0+IHYuaW5kZXggPT09IGRpc2NyaW1pbmF0b3IpPy5bMF07XG4gICAgICBpZiAobGF5b3V0S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0cnVjdGlvbiB0eXBlIGluY29ycmVjdDsgdW5rbm93biBkaXNjcmltaW5hdG9yJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbktleSA9IGxheW91dEtleSBhcyBrZXlvZiB0eXBlb2YgU1RBS0VfUE9PTF9JTlNUUlVDVElPTl9MQVlPVVRTO1xuICAgICAgcmV0dXJuIGluc3RydWN0aW9uS2V5O1xuICAgIGNhc2UgU3Rha2VQcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpOlxuICAgICAgcmV0dXJuIFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBjYXNlIFRPS0VOX0FDTF9QUk9HUkFNX0lEOlxuICAgICAgLy8gVGhlIFRva2VuIEFDTCBwcm9ncmFtIGhhcyBhIHNpbmdsZSBpbnN0cnVjdGlvbiB0aGUgU0RLIGJ1aWxkcyDigJQgdGhlIHBlcm1pc3Npb25sZXNzIHRoYXcuXG4gICAgICByZXR1cm4gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5QZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50O1xuICAgIGNhc2UgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB3aGVuIEBzcGwtdG9rZW4gc3VwcG9ydHMgZGVjb2RpbmcgYXNzb2NpYXRlZCB0b2tlbiBpbnN0cnVjdGlvbnNcbiAgICAgIC8vIFN1cHBvcnQgYm90aCBsZWdhY3kgQVRBIGNyZWF0aW9uIChkYXRhLmxlbmd0aCA9PT0gMCkgYW5kIGlkZW1wb3RlbnQgQVRBIGNyZWF0aW9uIChkaXNjcmltaW5hdG9yID0gMSlcbiAgICAgIC8vIEJvdGggaW5zdHJ1Y3Rpb24gdHlwZXMgYXJlIHRyZWF0ZWQgYXMgJ0luaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50JyBmb3IgY29tcGF0aWJpbGl0eVxuICAgICAgaWYgKGluc3RydWN0aW9uLmRhdGEubGVuZ3RoID09PSAwIHx8IGlzSWRlbXBvdGVudEF0YUluc3RydWN0aW9uKGluc3RydWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gJ0luaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50JztcbiAgICAgIH0gZWxzZSBpZiAoaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPT09IDEgJiYgaW5zdHJ1Y3Rpb24uZGF0YVswXSA9PT0gMikge1xuICAgICAgICByZXR1cm4gJ1JlY292ZXJOZXN0ZWRBc3NvY2lhdGVkVG9rZW5BY2NvdW50JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHByb2dyYW0gaWQgbm90IHN1cHBvcnRlZDogJyArIGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgY2FzZSBDT01QVVRFX0JVREdFVDpcbiAgICAgIGlmIChDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ1NldENvbXB1dGVVbml0TGltaXQnKSB7XG4gICAgICAgIHJldHVybiAnU2V0Q29tcHV0ZVVuaXRMaW1pdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ1NldFByaW9yaXR5RmVlJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdDdXN0b21JbnN0cnVjdGlvbic7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIHR5cGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJ1aWxkZXIuXG4gKiBUaHJvd3MgaWYgdGhlIGluc3RydWN0aW9uIHR5cGUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKCFWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMuaW5jbHVkZXMoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNvbGFuYSBpbnN0cnVjdGlvbnMgbWF0Y2ggcmF3IG1zZyBhdXRob3JpemUgdHJhbnNhY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIG1hdGNoIHRoZSByYXcgbXNnIGF1dGhvcml6ZSB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IGJvb2xlYW4ge1xuICAvLyBhcyB3ZWIzLmpzIGNhbm5vdCBkZWNvZGUgYXV0aG9yaXplIGluc3RydWN0aW9uIGZyb20gQ0xJLCB3ZSBuZWVkIHRvIGNoZWNrIGl0IG1hbnVhbGx5IGZpcnN0XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgcHJvZ3JhbUlkMSA9IGluc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQyID0gaW5zdHJ1Y3Rpb25zWzFdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGlmIChwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmIHByb2dyYW1JZDIgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb25OYW1lMSA9PT0gbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgKGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IDMpIHtcbiAgICBjb25zdCBwcm9ncmFtSWQxID0gaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDIgPSBpbnN0cnVjdGlvbnNbMV0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMyA9IGluc3RydWN0aW9uc1syXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBpZiAoXG4gICAgICBwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmXG4gICAgICBwcm9ncmFtSWQyID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiZcbiAgICAgIHByb2dyYW1JZDMgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGRhdGEyID0gaW5zdHJ1Y3Rpb25zWzJdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbk5hbWUxID09PSBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiAmJlxuICAgICAgICAoZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKSAmJlxuICAgICAgICAoZGF0YTIgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEyID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIFRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiB2b2lkIHtcbiAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbiwgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhZGRyZXNzIHRvIGNoZWNrIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBTb2xhbmEgcHVibGljIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0byB2YWxpZGF0ZSwgaXRzIG5lZWRlZCB0byByZXR1cm4gd2hpY2ggZmllbGQgaXMgZmFpbGluZyBvbiBjYXNlIG9mIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFhZGRyZXNzIHx8ICFpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBvciBtaXNzaW5nICR7ZmllbGROYW1lfSwgZ290OiAke2FkZHJlc3N9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3ModG9rZW5BZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IEJhc2VOZXR3b3JrKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi5uZXR3b3JrLnR5cGUgPT09IG5ldHdvcmsudHlwZSAmJiBjb2luLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbiAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICBpZiAodG9rZW5zQXJyYXkubGVuZ3RoID49IDEpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICBhc3NlcnQodG9rZW5zQXJyYXkubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuQWRkcmVzczogc3RyaW5nKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgdG9rZW4gbWludCBhZGRyZXNzXG4gKiBAcGFyYW0gb3duZXJBZGRyZXNzIFRoZSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gIHRva2VuTWludEFkZHJlc3M6IHN0cmluZyxcbiAgb3duZXJBZGRyZXNzOiBzdHJpbmcsXG4gIGFsbG93T3duZXJPZmZDdXJ2ZSA9IGZhbHNlLFxuICBwcm9ncmFtSWQ/OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG1pbnRQdWJsaWNLZXkgPSBuZXcgUHVibGljS2V5KHRva2VuTWludEFkZHJlc3MpO1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKTtcblxuICAvLyB0b2tlbkFkZHJlc3MgYXJlIG5vdCBvbiBlZDI1NTE5IGN1cnZlLCBzbyB0aGV5IGNhbid0IGJlIHVzZWQgYXMgb3duZXJBZGRyZXNzXG4gIGlmICghYWxsb3dPd25lck9mZkN1cnZlICYmICFQdWJsaWNLZXkuaXNPbkN1cnZlKG93bmVyUHVibGljS2V5LnRvQnVmZmVyKCkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgb3duZXJBZGRyZXNzIC0gYWRkcmVzcyBvZmYgZWQyNTUxOSBjdXJ2ZSwgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxuXG4gIGlmICghcHJvZ3JhbUlkKSB7XG4gICAgY29uc3QgY29pbiA9IGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuTWludEFkZHJlc3MpO1xuICAgIGlmIChjb2luICYmIGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luICYmICdwcm9ncmFtSWQnIGluIGNvaW4gJiYgY29pbi5wcm9ncmFtSWQpIHtcbiAgICAgIHByb2dyYW1JZCA9IGNvaW4ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyYW1JZCA9IFRPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICBsZXQgYXRhQWRkcmVzczogUHVibGljS2V5O1xuICBpZiAocHJvZ3JhbUlkID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgIGF0YUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzKFxuICAgICAgbWludFB1YmxpY0tleSxcbiAgICAgIG93bmVyUHVibGljS2V5LFxuICAgICAgYWxsb3dPd25lck9mZkN1cnZlLFxuICAgICAgVE9LRU5fMjAyMl9QUk9HUkFNX0lEXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhdGFBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzcyhtaW50UHVibGljS2V5LCBvd25lclB1YmxpY0tleSwgYWxsb3dPd25lck9mZkN1cnZlKTtcbiAgfVxuICByZXR1cm4gYXRhQWRkcmVzcy50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNaW50QWRkcmVzcyhtaW50QWRkcmVzczogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghbWludEFkZHJlc3MgfHwgIWlzVmFsaWRBZGRyZXNzKG1pbnRBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBtaW50QWRkcmVzcywgZ290OiAnICsgbWludEFkZHJlc3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU93bmVyQWRkcmVzcyhvd25lckFkZHJlc3M6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIW93bmVyQWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3Mob3duZXJBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBvd25lckFkZHJlc3MsIGdvdDogJyArIG93bmVyQWRkcmVzcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUeXBlIHByZWRpY2F0ZSB0byBjaGVjayBpZiBhbiBpbnN0cnVjdGlvbiBpcyBhIGxlZ2FjeSBTb2xJbnN0cnVjdGlvbi5cbiAqIFVzZXMgJ3Byb2dyYW1JZCcgcHJvcGVydHkgYXMgdGhlIGRpc2NyaW1pbmF0b3Igc2luY2UgaXQncyB1bmlxdWUgdG8gbGVnYWN5IGluc3RydWN0aW9uc1xuICogVmVyc2lvbmVkIGluc3RydWN0aW9ucyBoYXZlICdwcm9ncmFtSWRJbmRleCcgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIGluc3RydWN0aW9uIC0gVGhlIGluc3RydWN0aW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIFNvbEluc3RydWN0aW9uIChoYXMgcHJvZ3JhbUlkIGZpZWxkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTb2xMZWdhY3lJbnN0cnVjdGlvbihcbiAgaW5zdHJ1Y3Rpb246IFNvbEluc3RydWN0aW9uIHwgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb25cbik6IGluc3RydWN0aW9uIGlzIFNvbEluc3RydWN0aW9uIHtcbiAgcmV0dXJuICdwcm9ncmFtSWQnIGluIGluc3RydWN0aW9uO1xufVxuXG4vKipcbiAqIFRva2VuLTIwMjIgdHJhbnNmZXIgZmVlOiBtaW4oYW1vdW50ICogYmFzaXNQb2ludHMgLyAxMDAwMCwgbWF4aW11bUZlZSksIGluIHJhdyBiYXNlIHVuaXRzLlxuICogQWxsIG1hdGggaW4gQmlnSW50IHRvIGF2b2lkIHByZWNpc2lvbiBsb3NzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVRyYW5zZmVyRmVlKGFtb3VudDogc3RyaW5nLCBiYXNpc1BvaW50czogbnVtYmVyLCBtYXhpbXVtRmVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByYXcgPSAoQmlnSW50KGFtb3VudCkgKiBCaWdJbnQoYmFzaXNQb2ludHMpKSAvIDEwMDAwbjtcbiAgY29uc3QgY2FwID0gQmlnSW50KG1heGltdW1GZWUpO1xuICByZXR1cm4gKHJhdyA8IGNhcCA/IHJhdyA6IGNhcCkudG9TdHJpbmcoKTtcbn1cbiJdfQ==