@bitgo-beta/sdk-coin-sol 7.6.4-beta.27 → 7.6.4-beta.270

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 (386) 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/config/token2022StaticConfig.d.ts.map +1 -0
  4. package/dist/cjs/src/config/token2022StaticConfig.js +50 -0
  5. package/dist/cjs/src/index.d.ts.map +1 -0
  6. package/dist/{src → cjs/src}/index.js +1 -1
  7. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  8. package/dist/cjs/src/lib/ataInitializationBuilder.js +196 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/closeAtaBuilder.js +69 -0
  11. package/dist/{src → cjs/src}/lib/constants.d.ts +18 -0
  12. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/constants.js +189 -0
  14. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  15. package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
  16. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  17. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  18. package/dist/cjs/src/lib/explainTransactionWasm.js +264 -0
  19. package/dist/{src → cjs/src}/lib/iface.d.ts +7 -0
  20. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  21. package/dist/cjs/src/lib/iface.js +7 -0
  22. package/dist/{src → cjs/src}/lib/index.d.ts +1 -0
  23. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  24. package/dist/{src → cjs/src}/lib/index.js +4 -2
  25. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +1 -0
  26. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/instructionParamsFactory.js +1037 -0
  28. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  29. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  30. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/keyPair.js +63 -0
  32. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  33. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  34. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  35. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  36. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  37. package/dist/cjs/src/lib/solInstructionFactory.js +572 -0
  38. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/stakingActivateBuilder.js +120 -0
  40. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  41. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  42. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +208 -0
  44. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  45. package/dist/cjs/src/lib/stakingDelegateBuilder.js +120 -0
  46. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  47. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  48. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +78 -0
  50. package/dist/cjs/src/lib/token2022Config.d.ts.map +1 -0
  51. package/dist/cjs/src/lib/token2022Config.js +27 -0
  52. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  53. package/dist/cjs/src/lib/tokenTransferBuilder.js +188 -0
  54. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/transaction.js +612 -0
  56. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  57. package/dist/cjs/src/lib/transactionBuilder.js +380 -0
  58. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  59. package/dist/cjs/src/lib/transactionBuilderFactory.js +202 -0
  60. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  61. package/dist/cjs/src/lib/transferBuilder.js +70 -0
  62. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  63. package/dist/cjs/src/lib/transferBuilderV2.js +210 -0
  64. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  65. package/dist/cjs/src/lib/utils.js +589 -0
  66. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  68. package/dist/cjs/src/register.d.ts.map +1 -0
  69. package/dist/cjs/src/register.js +15 -0
  70. package/dist/{src → cjs/src}/sol.d.ts +21 -0
  71. package/dist/cjs/src/sol.d.ts.map +1 -0
  72. package/dist/cjs/src/sol.js +1343 -0
  73. package/dist/cjs/src/solToken.d.ts.map +1 -0
  74. package/dist/cjs/src/solToken.js +69 -0
  75. package/dist/cjs/src/tsol.d.ts.map +1 -0
  76. package/dist/cjs/src/tsol.js +24 -0
  77. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  78. package/dist/cjs/test/fixtures/sol.js +1433 -0
  79. package/dist/{test → cjs/test}/resources/sol.d.ts +27 -27
  80. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  81. package/dist/cjs/test/resources/sol.js +320 -0
  82. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  83. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  84. package/dist/cjs/test/unit/explainTransactionWasm.js +26 -0
  85. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  86. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  87. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  88. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  89. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  90. package/dist/cjs/test/unit/instructionParamsFactory.js +412 -0
  91. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  92. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  93. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  94. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  95. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  96. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  97. package/dist/cjs/test/unit/keyPair.js +177 -0
  98. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  99. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  100. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  101. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  102. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  103. package/dist/cjs/test/unit/sol.js +3273 -0
  104. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  105. package/dist/cjs/test/unit/solInstructionFactory.js +454 -0
  106. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  107. package/dist/cjs/test/unit/solToken.js +31 -0
  108. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  109. package/dist/cjs/test/unit/transaction.js +1108 -0
  110. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  111. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  112. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  113. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
  114. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  115. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  116. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  117. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  118. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  119. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  120. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  121. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  122. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  123. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  124. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  125. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  126. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  127. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
  128. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  129. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  130. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  131. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +286 -0
  132. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  133. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
  134. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  135. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  136. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  137. package/dist/cjs/test/unit/utils.js +517 -0
  138. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  139. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  140. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  141. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  142. package/dist/esm/config/token2022StaticConfig.d.ts +3 -0
  143. package/dist/esm/config/token2022StaticConfig.js +47 -0
  144. package/dist/esm/index.d.ts +7 -0
  145. package/dist/esm/index.js +7 -0
  146. package/dist/esm/lib/ataInitializationBuilder.d.ts +47 -0
  147. package/dist/esm/lib/ataInitializationBuilder.js +156 -0
  148. package/dist/esm/lib/closeAtaBuilder.d.ts +19 -0
  149. package/dist/esm/lib/closeAtaBuilder.js +62 -0
  150. package/dist/esm/lib/constants.d.ts +158 -0
  151. package/dist/esm/lib/constants.d.ts.map +1 -0
  152. package/dist/esm/lib/constants.js +186 -0
  153. package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
  154. package/dist/esm/lib/customInstructionBuilder.js +282 -0
  155. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  156. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  157. package/dist/esm/lib/explainTransactionWasm.js +261 -0
  158. package/dist/esm/lib/iface.d.ts +251 -0
  159. package/dist/{src → esm}/lib/iface.d.ts.map +1 -1
  160. package/dist/esm/lib/iface.js +3 -0
  161. package/dist/esm/lib/index.d.ts +23 -0
  162. package/dist/{src → esm}/lib/index.d.ts.map +1 -1
  163. package/dist/esm/lib/index.js +23 -0
  164. package/dist/esm/lib/instructionParamsFactory.d.ts +13 -0
  165. package/dist/{src → esm}/lib/instructionParamsFactory.d.ts.map +1 -1
  166. package/dist/esm/lib/instructionParamsFactory.js +1030 -0
  167. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  168. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  169. package/dist/esm/lib/keyPair.d.ts +26 -0
  170. package/dist/esm/lib/keyPair.js +59 -0
  171. package/dist/esm/lib/messages/index.d.ts +2 -0
  172. package/dist/esm/lib/messages/index.js +2 -0
  173. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  174. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  175. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  176. package/dist/esm/lib/solInstructionFactory.js +566 -0
  177. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  178. package/dist/esm/lib/stakingActivateBuilder.js +113 -0
  179. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  180. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  181. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  182. package/dist/{src → esm}/lib/stakingDeactivateBuilder.js +31 -38
  183. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  184. package/dist/esm/lib/stakingDelegateBuilder.js +113 -0
  185. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  186. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  187. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  188. package/dist/esm/lib/stakingWithdrawBuilder.js +71 -0
  189. package/dist/esm/lib/token2022Config.d.ts +44 -0
  190. package/dist/esm/lib/token2022Config.js +23 -0
  191. package/dist/esm/lib/tokenTransferBuilder.d.ts +41 -0
  192. package/dist/esm/lib/tokenTransferBuilder.js +181 -0
  193. package/dist/esm/lib/transaction.d.ts +103 -0
  194. package/dist/esm/lib/transaction.d.ts.map +1 -0
  195. package/dist/esm/lib/transaction.js +605 -0
  196. package/dist/esm/lib/transactionBuilder.d.ts +128 -0
  197. package/dist/esm/lib/transactionBuilder.js +373 -0
  198. package/dist/esm/lib/transactionBuilderFactory.d.ts +115 -0
  199. package/dist/esm/lib/transactionBuilderFactory.js +198 -0
  200. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  201. package/dist/esm/lib/transferBuilder.js +63 -0
  202. package/dist/esm/lib/transferBuilderV2.d.ts +43 -0
  203. package/dist/esm/lib/transferBuilderV2.js +203 -0
  204. package/dist/esm/lib/utils.d.ts +200 -0
  205. package/dist/esm/lib/utils.js +552 -0
  206. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  207. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  208. package/dist/esm/register.d.ts +3 -0
  209. package/dist/esm/register.js +11 -0
  210. package/dist/esm/sol.d.ts +248 -0
  211. package/dist/esm/sol.d.ts.map +1 -0
  212. package/dist/esm/sol.js +1302 -0
  213. package/dist/esm/solToken.d.ts +37 -0
  214. package/dist/esm/solToken.js +65 -0
  215. package/dist/esm/tsol.d.ts +11 -0
  216. package/dist/esm/tsol.js +20 -0
  217. package/package.json +34 -15
  218. package/dist/src/config/token2022StaticConfig.js +0 -50
  219. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  220. package/dist/src/lib/closeAtaBuilder.js +0 -69
  221. package/dist/src/lib/constants.d.ts.map +0 -1
  222. package/dist/src/lib/constants.js +0 -171
  223. package/dist/src/lib/customInstructionBuilder.js +0 -289
  224. package/dist/src/lib/iface.js +0 -7
  225. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  226. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  227. package/dist/src/lib/keyPair.js +0 -63
  228. package/dist/src/lib/solInstructionFactory.js +0 -572
  229. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  230. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  231. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  232. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  233. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  234. package/dist/src/lib/token2022Config.js +0 -27
  235. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  236. package/dist/src/lib/transaction.d.ts.map +0 -1
  237. package/dist/src/lib/transaction.js +0 -595
  238. package/dist/src/lib/transactionBuilder.js +0 -380
  239. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  240. package/dist/src/lib/transferBuilder.js +0 -70
  241. package/dist/src/lib/transferBuilderV2.js +0 -210
  242. package/dist/src/lib/utils.js +0 -589
  243. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  244. package/dist/src/register.js +0 -15
  245. package/dist/src/sol.d.ts.map +0 -1
  246. package/dist/src/sol.js +0 -1285
  247. package/dist/src/solToken.js +0 -69
  248. package/dist/src/tsol.js +0 -24
  249. package/dist/test/fixtures/sol.js +0 -1433
  250. package/dist/test/resources/sol.d.ts.map +0 -1
  251. package/dist/test/resources/sol.js +0 -320
  252. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  253. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  254. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  255. package/dist/test/unit/getBuilderFactory.js +0 -10
  256. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  257. package/dist/test/unit/instructionParamsFactory.js +0 -412
  258. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  259. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  260. package/dist/test/unit/keyPair.js +0 -177
  261. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  262. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  263. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  264. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  265. package/dist/test/unit/sol.js +0 -3108
  266. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  267. package/dist/test/unit/solInstructionFactory.js +0 -454
  268. package/dist/test/unit/solToken.d.ts.map +0 -1
  269. package/dist/test/unit/solToken.js +0 -31
  270. package/dist/test/unit/transaction.d.ts.map +0 -1
  271. package/dist/test/unit/transaction.js +0 -983
  272. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  273. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  274. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  275. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  276. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  277. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  278. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  279. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  280. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  281. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  282. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  283. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  284. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  285. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  286. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  287. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  288. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  289. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  290. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  291. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  292. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  293. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  294. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  295. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  296. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  297. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  298. package/dist/test/unit/utils.js +0 -517
  299. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  300. package/dist/test/unit/versionedTransaction.js +0 -207
  301. package/dist/tsconfig.tsbuildinfo +0 -1
  302. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  303. /package/dist/{src → cjs/src}/config/token2022StaticConfig.d.ts +0 -0
  304. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  305. /package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +0 -0
  306. /package/dist/{src → cjs/src}/lib/closeAtaBuilder.d.ts +0 -0
  307. /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
  308. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  309. /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
  310. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  311. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  312. /package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +0 -0
  313. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  314. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  315. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  316. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  317. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  318. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  319. /package/dist/{src → cjs/src}/lib/token2022Config.d.ts +0 -0
  320. /package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +0 -0
  321. /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
  322. /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
  323. /package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +0 -0
  324. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  325. /package/dist/{src → cjs/src}/lib/transferBuilderV2.d.ts +0 -0
  326. /package/dist/{src → cjs/src}/lib/utils.d.ts +0 -0
  327. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  328. /package/dist/{src → cjs/src}/register.d.ts +0 -0
  329. /package/dist/{src → cjs/src}/solToken.d.ts +0 -0
  330. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  331. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  332. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  333. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  334. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  335. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  336. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  337. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  338. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  339. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  340. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  341. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  342. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  343. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  344. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  345. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  346. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  347. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  348. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  349. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  350. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  351. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  352. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  353. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  354. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  355. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  356. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  357. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  358. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  359. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  360. /package/dist/{src → esm}/config/token2022StaticConfig.d.ts.map +0 -0
  361. /package/dist/{src → esm}/index.d.ts.map +0 -0
  362. /package/dist/{src → esm}/lib/ataInitializationBuilder.d.ts.map +0 -0
  363. /package/dist/{src → esm}/lib/closeAtaBuilder.d.ts.map +0 -0
  364. /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
  365. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  366. /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
  367. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  368. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  369. /package/dist/{src → esm}/lib/solInstructionFactory.d.ts.map +0 -0
  370. /package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +0 -0
  371. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  372. /package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +0 -0
  373. /package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +0 -0
  374. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  375. /package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +0 -0
  376. /package/dist/{src → esm}/lib/token2022Config.d.ts.map +0 -0
  377. /package/dist/{src → esm}/lib/tokenTransferBuilder.d.ts.map +0 -0
  378. /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
  379. /package/dist/{src → esm}/lib/transactionBuilderFactory.d.ts.map +0 -0
  380. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  381. /package/dist/{src → esm}/lib/transferBuilderV2.d.ts.map +0 -0
  382. /package/dist/{src → esm}/lib/utils.d.ts.map +0 -0
  383. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  384. /package/dist/{src → esm}/register.d.ts.map +0 -0
  385. /package/dist/{src → esm}/solToken.d.ts.map +0 -0
  386. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,552 @@
1
+ import { BuildTransactionError, isValidXpub, NotSupported, ParseTransactionError, TransactionType, UtilsError, } from '@bitgo-beta/sdk-core';
2
+ import { CoinNotDefinedError, coins, SolCoin } from '@bitgo-beta/statics';
3
+ import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, decodeInstruction, TokenInstruction, } from '@solana/spl-token';
4
+ import { Keypair, PublicKey, Transaction as SolTransaction, StakeInstruction, StakeProgram, SystemInstruction, SystemProgram, ComputeBudgetInstruction, } from '@solana/web3.js';
5
+ import assert from 'assert';
6
+ import BigNumber from 'bignumber.js';
7
+ import bs58 from 'bs58';
8
+ import nacl from 'tweetnacl';
9
+ import { ataCloseInstructionIndexes, ataInitInstructionIndexes, MAX_MEMO_LENGTH, MEMO_PROGRAM_PK, nonceAdvanceInstruction, stakingActivateInstructionsIndexes, marinadeStakingActivateInstructionsIndexes, stakingAuthorizeInstructionsIndexes, stakingDeactivateInstructionsIndexes, marinadeStakingDeactivateInstructionsIndexes, stakingDelegateInstructionsIndexes, stakingPartialDeactivateInstructionsIndexes, stakingWithdrawInstructionsIndexes, VALID_SYSTEM_INSTRUCTION_TYPES, validInstructionData, validInstructionData2, ValidInstructionTypesEnum, walletInitInstructionIndexes, jitoStakingActivateInstructionsIndexes, jitoStakingDeactivateInstructionsIndexes, jitoStakingActivateWithATAInstructionsIndexes, } from './constants';
10
+ import { STAKE_POOL_INSTRUCTION_LAYOUTS, STAKE_POOL_PROGRAM_ID } from '@solana/spl-stake-pool';
11
+ const DECODED_BLOCK_HASH_LENGTH = 32; // https://docs.solana.com/developing/programming-model/transactions#blockhash-format
12
+ const DECODED_SIGNATURE_LENGTH = 64; // https://docs.solana.com/terminology#signature
13
+ const BASE_58_ENCONDING_REGEX = '[1-9A-HJ-NP-Za-km-z]';
14
+ const COMPUTE_BUDGET = 'ComputeBudget111111111111111111111111111111';
15
+ /**
16
+ * Checks if an ATA instruction is idempotent (discriminator byte = 1).
17
+ *
18
+ * Idempotent ATA instructions use Buffer.from([1]) as instruction data, created by
19
+ * @solana/spl-token's createAssociatedTokenAccountIdempotentInstruction() (v0.4.1+).
20
+ * An idempotent ATA instruction succeed even if account exists,
21
+ * preventing race condition errors in concurrent scenarios.
22
+ *
23
+ * @param {TransactionInstruction} instruction - The instruction to validate
24
+ * @returns {boolean} True if instruction data is a single byte with value 1
25
+ */
26
+ export function isIdempotentAtaInstruction(instruction) {
27
+ return instruction.data.length === 1 && instruction.data[0] === 1;
28
+ }
29
+ /** @inheritdoc */
30
+ export function isValidAddress(address) {
31
+ return isValidPublicKey(address);
32
+ }
33
+ /** @inheritdoc */
34
+ export function isValidBlockId(hash) {
35
+ try {
36
+ return (!!hash && new RegExp(BASE_58_ENCONDING_REGEX).test(hash) && bs58.decode(hash).length === DECODED_BLOCK_HASH_LENGTH);
37
+ }
38
+ catch (e) {
39
+ return false;
40
+ }
41
+ }
42
+ /** @inheritdoc */
43
+ export function isValidPrivateKey(prvKey) {
44
+ try {
45
+ const key = typeof prvKey === 'string' ? base58ToUint8Array(prvKey) : prvKey;
46
+ return !!Keypair.fromSecretKey(key);
47
+ }
48
+ catch (e) {
49
+ return false;
50
+ }
51
+ }
52
+ /** @inheritdoc */
53
+ export function isValidPublicKey(pubKey) {
54
+ try {
55
+ if (isValidXpub(pubKey))
56
+ return true;
57
+ new PublicKey(pubKey);
58
+ return true;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ /** @inheritdoc */
65
+ export function isValidSignature(signature) {
66
+ try {
67
+ return !!signature && bs58.decode(signature).length === DECODED_SIGNATURE_LENGTH;
68
+ }
69
+ catch (e) {
70
+ return false;
71
+ }
72
+ }
73
+ /** @inheritdoc */
74
+ // TransactionId are the first signature on a Transaction
75
+ export function isValidTransactionId(txId) {
76
+ return isValidSignature(txId);
77
+ }
78
+ /**
79
+ * Returns whether or not the string is a valid amount of lamports number
80
+ *
81
+ * @param {string} amount - the string to validate
82
+ * @returns {boolean} - the validation result
83
+ */
84
+ export function isValidAmount(amount) {
85
+ const bigNumberAmount = new BigNumber(amount);
86
+ return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThanOrEqualTo(0);
87
+ }
88
+ /**
89
+ * Check if the string is a valid amount of lamports number on staking
90
+ *
91
+ * @param {string} amount - the string to validate
92
+ * @returns {boolean} - the validation result
93
+ */
94
+ export function isValidStakingAmount(amount) {
95
+ const bigNumberAmount = new BigNumber(amount);
96
+ return bigNumberAmount.isInteger() && bigNumberAmount.isGreaterThan(0);
97
+ }
98
+ /**
99
+ * Check if this is a valid memo or not.
100
+ *
101
+ * @param memo - the memo string
102
+ * @returns {boolean} - the validation result
103
+ */
104
+ export function isValidMemo(memo) {
105
+ return Buffer.from(memo).length <= MAX_MEMO_LENGTH;
106
+ }
107
+ /**
108
+ * Checks if a string is valid base64 encoded data
109
+ * @param str - The string to validate
110
+ * @returns True if the string is valid base64, false otherwise
111
+ */
112
+ export function isValidBase64(str) {
113
+ try {
114
+ const decoded = Buffer.from(str, 'base64').toString('base64');
115
+ return decoded === str;
116
+ }
117
+ catch {
118
+ return false;
119
+ }
120
+ }
121
+ /**
122
+ * Checks if a string is valid hexadecimal data
123
+ * @param str - The string to validate
124
+ * @returns True if the string is valid hex, false otherwise
125
+ */
126
+ export function isValidHex(str) {
127
+ return /^[0-9A-Fa-f]*$/.test(str) && str.length % 2 === 0;
128
+ }
129
+ /**
130
+ * Checks if raw transaction can be deserialized
131
+ *
132
+ * @param {string} rawTransaction - transaction in base64 string format
133
+ * @param {boolean} requireAllSignatures - require all signatures to be present
134
+ * @param {boolean} verifySignatures - verify signatures
135
+ * @returns {boolean} - the validation result
136
+ */
137
+ export function isValidRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
138
+ try {
139
+ const tx = SolTransaction.from(Buffer.from(rawTransaction, 'base64'));
140
+ tx.serialize({ requireAllSignatures, verifySignatures });
141
+ return true;
142
+ }
143
+ catch (e) {
144
+ return false;
145
+ }
146
+ }
147
+ /**
148
+ * Verifies if signature for message is valid.
149
+ *
150
+ * @param {Buffer} serializedTx - tx as a base64 string
151
+ * @param {string} signature - signature as a string
152
+ * @param {string} publicKey - public key as base 58
153
+ * @returns {Boolean} true if signature is valid.
154
+ */
155
+ export function verifySignature(serializedTx, signature, publicKey) {
156
+ if (!isValidRawTransaction(serializedTx)) {
157
+ throw new UtilsError('Invalid serializedTx');
158
+ }
159
+ if (!isValidPublicKey(publicKey)) {
160
+ throw new UtilsError('Invalid publicKey');
161
+ }
162
+ if (!isValidSignature(signature)) {
163
+ throw new UtilsError('Invalid signature');
164
+ }
165
+ const msg = SolTransaction.from(Buffer.from(serializedTx, 'base64')).serializeMessage();
166
+ const sig = base58ToUint8Array(signature);
167
+ const pub = new PublicKey(publicKey);
168
+ return nacl.sign.detached.verify(msg, sig, pub.toBuffer());
169
+ }
170
+ /**
171
+ * Converts a base58 string into a Uint8Array.
172
+ *
173
+ * @param {string} input - a string in base58
174
+ * @returns {Uint8Array} - an Uint8Array
175
+ */
176
+ export function base58ToUint8Array(input) {
177
+ return new Uint8Array(bs58.decode(input));
178
+ }
179
+ /**
180
+ * Converts a Uint8Array to a base58 string.
181
+ *
182
+ * @param {Uint8Array} input - an Uint8Array
183
+ * @returns {string} - a string in base58
184
+ */
185
+ export function Uint8ArrayTobase58(input) {
186
+ return bs58.encode(input);
187
+ }
188
+ /**
189
+ * Count the amount of signatures are not null.
190
+ *
191
+ * @param {SignaturePubkeyPair[]} signatures - an array of SignaturePubkeyPair
192
+ * @returns {number} - the amount of valid signatures
193
+ */
194
+ export function countNotNullSignatures(signatures) {
195
+ return signatures.filter((sig) => !!sig.signature).length;
196
+ }
197
+ /**
198
+ * Check if all signatures are completed.
199
+ *
200
+ * @param {SignaturePubkeyPair[]} signatures - signatures
201
+ * @returns {boolean}
202
+ */
203
+ export function requiresAllSignatures(signatures) {
204
+ return signatures.length > 0 && countNotNullSignatures(signatures) === signatures.length;
205
+ }
206
+ /**
207
+ * Check the transaction type matching instructions by order. Memo and AdvanceNonceAccount instructions
208
+ * are ignored.
209
+ *
210
+ * @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
211
+ * @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
212
+ * @returns true if it matches by order.
213
+ */
214
+ export function matchTransactionTypeByInstructionsOrder(instructions, instructionIndexes) {
215
+ const instructionsCopy = [...instructions]; // Make a copy since we may modify the array below
216
+ // AdvanceNonceAccount is optional and the first instruction added, it does not matter to match the type
217
+ if (instructionsCopy.length > 0) {
218
+ if (getInstructionType(instructions[0]) === 'AdvanceNonceAccount') {
219
+ instructionsCopy.shift();
220
+ }
221
+ }
222
+ // Memo is optional and the last instruction added, it does not matter to match the type
223
+ // Why have it in instructionKeys if we are going to ignore it?
224
+ const instructionsKeys = Object.keys(instructionIndexes);
225
+ if (instructionsKeys[instructionsKeys.length - 1] === 'Memo') {
226
+ instructionsKeys.pop();
227
+ }
228
+ // Check instructions by order using the index.
229
+ for (const keyName of instructionsKeys) {
230
+ const index = instructionIndexes[keyName];
231
+ if (index >= instructionsCopy.length) {
232
+ return false;
233
+ }
234
+ const result = getInstructionType(instructionsCopy[index]);
235
+ if (result !== keyName) {
236
+ return false;
237
+ }
238
+ }
239
+ return true;
240
+ }
241
+ /**
242
+ * Returns the transaction Type based on the transaction instructions.
243
+ * Wallet initialization, Transfer and Staking transactions are supported.
244
+ *
245
+ * @param {SolTransaction} transaction - the solana transaction
246
+ * @returns {TransactionType} - the type of transaction
247
+ */
248
+ export function getTransactionType(transaction) {
249
+ const { instructions } = transaction;
250
+ if (validateRawMsgInstruction(instructions)) {
251
+ return TransactionType.StakingAuthorizeRaw;
252
+ }
253
+ validateIntructionTypes(instructions);
254
+ // check if deactivate instruction does not exist because deactivate can be include a transfer instruction
255
+ const memoInstruction = instructions.find((instruction) => getInstructionType(instruction) === 'Memo');
256
+ const memoData = memoInstruction?.data.toString('utf-8');
257
+ if (memoData?.includes('WalletConnectDefiCustomTx')) {
258
+ return TransactionType.CustomTx;
259
+ }
260
+ if (instructions.filter((instruction) => getInstructionType(instruction) === 'Deactivate').length === 0) {
261
+ for (const instruction of instructions) {
262
+ const instructionType = getInstructionType(instruction);
263
+ // Check if memo instruction is there and if it contains 'PrepareForRevoke' because Marinade staking deactivate transaction will have this
264
+ if ((instructionType === ValidInstructionTypesEnum.Transfer && !memoData?.includes('PrepareForRevoke')) ||
265
+ instructionType === ValidInstructionTypesEnum.TokenTransfer) {
266
+ return TransactionType.Send;
267
+ }
268
+ }
269
+ }
270
+ if (matchTransactionTypeByInstructionsOrder(instructions, walletInitInstructionIndexes)) {
271
+ return TransactionType.WalletInitialization;
272
+ }
273
+ else if (matchTransactionTypeByInstructionsOrder(instructions, marinadeStakingActivateInstructionsIndexes) ||
274
+ matchTransactionTypeByInstructionsOrder(instructions, jitoStakingActivateInstructionsIndexes) ||
275
+ matchTransactionTypeByInstructionsOrder(instructions, jitoStakingActivateWithATAInstructionsIndexes) ||
276
+ matchTransactionTypeByInstructionsOrder(instructions, stakingActivateInstructionsIndexes)) {
277
+ return TransactionType.StakingActivate;
278
+ }
279
+ else if (matchTransactionTypeByInstructionsOrder(instructions, stakingAuthorizeInstructionsIndexes)) {
280
+ return TransactionType.StakingAuthorize;
281
+ }
282
+ else if (matchTransactionTypeByInstructionsOrder(instructions, stakingDelegateInstructionsIndexes)) {
283
+ return TransactionType.StakingDelegate;
284
+ }
285
+ else if (matchTransactionTypeByInstructionsOrder(instructions, marinadeStakingDeactivateInstructionsIndexes) ||
286
+ matchTransactionTypeByInstructionsOrder(instructions, stakingDeactivateInstructionsIndexes) ||
287
+ matchTransactionTypeByInstructionsOrder(instructions, stakingPartialDeactivateInstructionsIndexes) ||
288
+ matchTransactionTypeByInstructionsOrder(instructions, jitoStakingDeactivateInstructionsIndexes)) {
289
+ return TransactionType.StakingDeactivate;
290
+ }
291
+ else if (matchTransactionTypeByInstructionsOrder(instructions, stakingWithdrawInstructionsIndexes)) {
292
+ return TransactionType.StakingWithdraw;
293
+ }
294
+ else if (matchTransactionTypeByInstructionsOrder(instructions, ataInitInstructionIndexes)) {
295
+ return TransactionType.AssociatedTokenAccountInitialization;
296
+ }
297
+ else if (matchTransactionTypeByInstructionsOrder(instructions, ataCloseInstructionIndexes)) {
298
+ return TransactionType.CloseAssociatedTokenAccount;
299
+ }
300
+ else {
301
+ return TransactionType.CustomTx;
302
+ }
303
+ }
304
+ /**
305
+ * Returns the instruction Type based on the solana instructions.
306
+ * Throws if the solana instruction program is not supported
307
+ *
308
+ * @param {TransactionInstruction} instruction - a solana instruction
309
+ * @returns {ValidInstructionTypes} - a solana instruction type
310
+ */
311
+ export function getInstructionType(instruction) {
312
+ switch (instruction.programId.toString()) {
313
+ case new PublicKey(MEMO_PROGRAM_PK).toString():
314
+ return 'Memo';
315
+ case SystemProgram.programId.toString():
316
+ return SystemInstruction.decodeInstructionType(instruction);
317
+ case TOKEN_PROGRAM_ID.toString():
318
+ case TOKEN_2022_PROGRAM_ID.toString():
319
+ const decodedInstruction = decodeInstruction(instruction, instruction.programId);
320
+ const instructionTypeMap = new Map();
321
+ instructionTypeMap.set(TokenInstruction.CloseAccount, 'CloseAssociatedTokenAccount');
322
+ instructionTypeMap.set(TokenInstruction.Burn, 'Burn');
323
+ instructionTypeMap.set(TokenInstruction.MintTo, 'MintTo');
324
+ instructionTypeMap.set(TokenInstruction.Approve, 'Approve');
325
+ instructionTypeMap.set(TokenInstruction.TransferChecked, 'TokenTransfer');
326
+ const validInstruction = instructionTypeMap.get(decodedInstruction.data.instruction);
327
+ if (!validInstruction) {
328
+ return 'CustomInstruction';
329
+ }
330
+ return validInstruction;
331
+ case STAKE_POOL_PROGRAM_ID.toString():
332
+ const discriminator = instruction.data.readUint8(0);
333
+ const layoutKey = Object.entries(STAKE_POOL_INSTRUCTION_LAYOUTS).find(([_, v]) => v.index === discriminator)?.[0];
334
+ if (layoutKey === undefined) {
335
+ throw new Error('Instruction type incorrect; unknown discriminator');
336
+ }
337
+ const instructionKey = layoutKey;
338
+ return instructionKey;
339
+ case StakeProgram.programId.toString():
340
+ return StakeInstruction.decodeInstructionType(instruction);
341
+ case ASSOCIATED_TOKEN_PROGRAM_ID.toString():
342
+ // TODO: change this when @spl-token supports decoding associated token instructions
343
+ // Support both legacy ATA creation (data.length === 0) and idempotent ATA creation (discriminator = 1)
344
+ // Both instruction types are treated as 'InitializeAssociatedTokenAccount' for compatibility
345
+ if (instruction.data.length === 0 || isIdempotentAtaInstruction(instruction)) {
346
+ return 'InitializeAssociatedTokenAccount';
347
+ }
348
+ else {
349
+ throw new NotSupported('Invalid transaction, instruction program id not supported: ' + instruction.programId.toString());
350
+ }
351
+ case COMPUTE_BUDGET:
352
+ if (ComputeBudgetInstruction.decodeInstructionType(instruction) === 'SetComputeUnitLimit') {
353
+ return 'SetComputeUnitLimit';
354
+ }
355
+ return 'SetPriorityFee';
356
+ default:
357
+ return 'CustomInstruction';
358
+ }
359
+ }
360
+ /**
361
+ * Validate solana instructions types to see if they are supported by the builder.
362
+ * Throws if the instruction type is invalid.
363
+ *
364
+ * @param {TransactionInstruction} instructions - a solana instruction
365
+ * @returns {void}
366
+ */
367
+ export function validateIntructionTypes(instructions) {
368
+ for (const instruction of instructions) {
369
+ if (!VALID_SYSTEM_INSTRUCTION_TYPES.includes(getInstructionType(instruction))) {
370
+ throw new NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
371
+ }
372
+ }
373
+ }
374
+ /**
375
+ * Validate solana instructions match raw msg authorize transaction
376
+ *
377
+ * @param {TransactionInstruction} instructions - a solana instruction
378
+ * @returns {boolean} true if the instructions match the raw msg authorize transaction
379
+ */
380
+ export function validateRawMsgInstruction(instructions) {
381
+ // as web3.js cannot decode authorize instruction from CLI, we need to check it manually first
382
+ if (instructions.length === 2) {
383
+ const programId1 = instructions[0].programId.toString();
384
+ const programId2 = instructions[1].programId.toString();
385
+ if (programId1 === SystemProgram.programId.toString() && programId2 === StakeProgram.programId.toString()) {
386
+ const instructionName1 = SystemInstruction.decodeInstructionType(instructions[0]);
387
+ const data = instructions[1].data.toString('hex');
388
+ if (instructionName1 === nonceAdvanceInstruction &&
389
+ (data === validInstructionData || data === validInstructionData2)) {
390
+ return true;
391
+ }
392
+ }
393
+ }
394
+ if (instructions.length === 3) {
395
+ const programId1 = instructions[0].programId.toString();
396
+ const programId2 = instructions[1].programId.toString();
397
+ const programId3 = instructions[2].programId.toString();
398
+ if (programId1 === SystemProgram.programId.toString() &&
399
+ programId2 === StakeProgram.programId.toString() &&
400
+ programId3 === StakeProgram.programId.toString()) {
401
+ const instructionName1 = SystemInstruction.decodeInstructionType(instructions[0]);
402
+ const data = instructions[1].data.toString('hex');
403
+ const data2 = instructions[2].data.toString('hex');
404
+ if (instructionName1 === nonceAdvanceInstruction &&
405
+ (data === validInstructionData || data === validInstructionData2) &&
406
+ (data2 === validInstructionData || data2 === validInstructionData2)) {
407
+ return true;
408
+ }
409
+ }
410
+ }
411
+ return false;
412
+ }
413
+ /**
414
+ * Check the raw transaction has a valid format in the blockchain context, throw otherwise.
415
+ *
416
+ * @param {string} rawTransaction - Transaction in base64 string format
417
+ */
418
+ export function validateRawTransaction(rawTransaction, requireAllSignatures = false, verifySignatures = false) {
419
+ if (!rawTransaction) {
420
+ throw new ParseTransactionError('Invalid raw transaction: Undefined');
421
+ }
422
+ if (!isValidRawTransaction(rawTransaction, requireAllSignatures, verifySignatures)) {
423
+ throw new ParseTransactionError('Invalid raw transaction');
424
+ }
425
+ }
426
+ /**
427
+ * Validates address to check if it exists and is a valid Solana public key
428
+ *
429
+ * @param {string} address The address to be validated
430
+ * @param {string} fieldName Name of the field to validate, its needed to return which field is failing on case of error.
431
+ */
432
+ export function validateAddress(address, fieldName) {
433
+ if (!address || !isValidPublicKey(address)) {
434
+ throw new BuildTransactionError(`Invalid or missing ${fieldName}, got: ${address}`);
435
+ }
436
+ }
437
+ /**
438
+ * Get the statics coin object matching a given Solana token address if it exists
439
+ *
440
+ * @param tokenAddress The token address to match against
441
+ * @param network Solana Mainnet or Testnet
442
+ * @returns statics BaseCoin object for the matching token
443
+ */
444
+ export function getSolTokenFromAddress(tokenAddress, network) {
445
+ const tokens = coins.filter((coin) => {
446
+ if (coin instanceof SolCoin) {
447
+ return coin.network.type === network.type && coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
448
+ }
449
+ return false;
450
+ });
451
+ const tokensArray = tokens.map((token) => token);
452
+ if (tokensArray.length >= 1) {
453
+ // there should never be two tokens with the same contract address, so we assert that here
454
+ assert(tokensArray.length === 1);
455
+ return tokensArray[0];
456
+ }
457
+ return undefined;
458
+ }
459
+ /**
460
+ * Get the statics coin object matching a given Solana token address if it exists
461
+ *
462
+ * @param tokenAddress The token address to match against
463
+ * @param network Solana Mainnet or Testnet
464
+ * @returns statics BaseCoin object for the matching token
465
+ */
466
+ export function getSolTokenFromAddressOnly(tokenAddress) {
467
+ const tokens = coins.filter((coin) => {
468
+ if (coin instanceof SolCoin) {
469
+ return coin.tokenAddress.toLowerCase() === tokenAddress.toLowerCase();
470
+ }
471
+ return false;
472
+ });
473
+ const tokensArray = tokens.map((token) => token);
474
+ if (tokensArray.length >= 1) {
475
+ // there should never be two tokens with the same contract address, so we assert that here
476
+ assert(tokensArray.length === 1);
477
+ return tokensArray[0];
478
+ }
479
+ return undefined;
480
+ }
481
+ /**
482
+ * Get the solana token object from token name
483
+ * @param tokenName The token name to match against
484
+ * */
485
+ export function getSolTokenFromTokenName(tokenName) {
486
+ try {
487
+ const token = coins.get(tokenName);
488
+ if (!(token.isToken && token instanceof SolCoin)) {
489
+ return undefined;
490
+ }
491
+ return token;
492
+ }
493
+ catch (e) {
494
+ if (!(e instanceof CoinNotDefinedError)) {
495
+ throw e;
496
+ }
497
+ return undefined;
498
+ }
499
+ }
500
+ /**
501
+ * Get the solana associated token account address
502
+ * @param tokenAddress token mint address
503
+ * @param ownerAddress The owner of the associated token account
504
+ * @returns The associated token account address
505
+ * */
506
+ export async function getAssociatedTokenAccountAddress(tokenMintAddress, ownerAddress, allowOwnerOffCurve = false, programId) {
507
+ const mintPublicKey = new PublicKey(tokenMintAddress);
508
+ const ownerPublicKey = new PublicKey(ownerAddress);
509
+ // tokenAddress are not on ed25519 curve, so they can't be used as ownerAddress
510
+ if (!allowOwnerOffCurve && !PublicKey.isOnCurve(ownerPublicKey.toBuffer())) {
511
+ throw new UtilsError('Invalid ownerAddress - address off ed25519 curve, got: ' + ownerAddress);
512
+ }
513
+ if (!programId) {
514
+ const coin = getSolTokenFromAddressOnly(tokenMintAddress);
515
+ if (coin && coin instanceof SolCoin && 'programId' in coin && coin.programId) {
516
+ programId = coin.programId.toString();
517
+ }
518
+ else {
519
+ programId = TOKEN_PROGRAM_ID.toString();
520
+ }
521
+ }
522
+ let ataAddress;
523
+ if (programId === TOKEN_2022_PROGRAM_ID.toString()) {
524
+ ataAddress = await getAssociatedTokenAddress(mintPublicKey, ownerPublicKey, allowOwnerOffCurve, TOKEN_2022_PROGRAM_ID);
525
+ }
526
+ else {
527
+ ataAddress = await getAssociatedTokenAddress(mintPublicKey, ownerPublicKey, allowOwnerOffCurve);
528
+ }
529
+ return ataAddress.toString();
530
+ }
531
+ export function validateMintAddress(mintAddress) {
532
+ if (!mintAddress || !isValidAddress(mintAddress)) {
533
+ throw new BuildTransactionError('Invalid or missing mintAddress, got: ' + mintAddress);
534
+ }
535
+ }
536
+ export function validateOwnerAddress(ownerAddress) {
537
+ if (!ownerAddress || !isValidAddress(ownerAddress)) {
538
+ throw new BuildTransactionError('Invalid or missing ownerAddress, got: ' + ownerAddress);
539
+ }
540
+ }
541
+ /**
542
+ * Type predicate to check if an instruction is a legacy SolInstruction.
543
+ * Uses 'programId' property as the discriminator since it's unique to legacy instructions
544
+ * Versioned instructions have 'programIdIndex' property.
545
+ *
546
+ * @param instruction - The instruction to check
547
+ * @returns True if the instruction is a SolInstruction (has programId field)
548
+ */
549
+ export function isSolLegacyInstruction(instruction) {
550
+ return 'programId' in instruction;
551
+ }
552
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFlBQVksRUFDWixxQkFBcUIsRUFHckIsZUFBZSxFQUNmLFVBQVUsR0FDWCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBeUIsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pHLE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGdCQUFnQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCxPQUFPLEVBQ1AsU0FBUyxFQUVULFdBQVcsSUFBSSxjQUFjLEVBQzdCLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFFYix3QkFBd0IsR0FDekIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxTQUFTLE1BQU0sY0FBYyxDQUFDO0FBQ3JDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsa0NBQWtDLEVBQ2xDLDBDQUEwQyxFQUMxQyxtQ0FBbUMsRUFDbkMsb0NBQW9DLEVBQ3BDLDRDQUE0QyxFQUM1QyxrQ0FBa0MsRUFDbEMsMkNBQTJDLEVBQzNDLGtDQUFrQyxFQUNsQyw4QkFBOEIsRUFDOUIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsNEJBQTRCLEVBQzVCLHNDQUFzQyxFQUN0Qyx3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QUNuRCxVQUFVLEdBQUcsTUFBTSx5QkFBeUIsQ0FDMUMsYUFBYSxFQUNiLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIscUJBQXFCLENBQ3RCLENBQUM7SUFDSixDQUFDO1NBQU0sQ0FBQztRQUNOLFVBQVUsR0FBRyxNQUFNLHlCQUF5QixDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxXQUFtQjtJQUNyRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDakQsTUFBTSxJQUFJLHFCQUFxQixDQUFDLHVDQUF1QyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFlBQW9CO0lBQ3ZELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUkscUJBQXFCLENBQUMsd0NBQXdDLEdBQUcsWUFBWSxDQUFDLENBQUM7SUFDM0YsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxXQUFxRDtJQUVyRCxPQUFPLFdBQVcsSUFBSSxXQUFXLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgaXNWYWxpZFhwdWIsXG4gIE5vdFN1cHBvcnRlZCxcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxuICBTb2xJbnN0cnVjdGlvbixcbiAgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVXRpbHNFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4sIEJhc2VOZXR3b3JrLCBDb2luTm90RGVmaW5lZEVycm9yLCBjb2lucywgU29sQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELFxuICBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzLFxuICBUT0tFTl9QUk9HUkFNX0lELFxuICBUT0tFTl8yMDIyX1BST0dSQU1fSUQsXG4gIGRlY29kZUluc3RydWN0aW9uLFxuICBUb2tlbkluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQge1xuICBLZXlwYWlyLFxuICBQdWJsaWNLZXksXG4gIFNpZ25hdHVyZVB1YmtleVBhaXIsXG4gIFRyYW5zYWN0aW9uIGFzIFNvbFRyYW5zYWN0aW9uLFxuICBTdGFrZUluc3RydWN0aW9uLFxuICBTdGFrZVByb2dyYW0sXG4gIFN5c3RlbUluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgYnM1OCBmcm9tICdiczU4JztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQge1xuICBhdGFDbG9zZUluc3RydWN0aW9uSW5kZXhlcyxcbiAgYXRhSW5pdEluc3RydWN0aW9uSW5kZXhlcyxcbiAgTUFYX01FTU9fTEVOR1RILFxuICBNRU1PX1BST0dSQU1fUEssXG4gIG5vbmNlQWR2YW5jZUluc3RydWN0aW9uLFxuICBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBtYXJpbmFkZVN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIHN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMsXG4gIG1hcmluYWRlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nUGFydGlhbERlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhLFxuICB2YWxpZEluc3RydWN0aW9uRGF0YTIsXG4gIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0sXG4gIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMsXG4gIGppdG9TdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBqaXRvU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzLFxuICBqaXRvU3Rha2luZ0FjdGl2YXRlV2l0aEFUQUluc3RydWN0aW9uc0luZGV4ZXMsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlcyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgU1RBS0VfUE9PTF9JTlNUUlVDVElPTl9MQVlPVVRTLCBTVEFLRV9QT09MX1BST0dSQU1fSUQgfSBmcm9tICdAc29sYW5hL3NwbC1zdGFrZS1wb29sJztcblxuY29uc3QgREVDT0RFRF9CTE9DS19IQVNIX0xFTkdUSCA9IDMyOyAvLyBodHRwczovL2RvY3Muc29sYW5hLmNvbS9kZXZlbG9waW5nL3Byb2dyYW1taW5nLW1vZGVsL3RyYW5zYWN0aW9ucyNibG9ja2hhc2gtZm9ybWF0XG5jb25zdCBERUNPREVEX1NJR05BVFVSRV9MRU5HVEggPSA2NDsgLy8gaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vdGVybWlub2xvZ3kjc2lnbmF0dXJlXG5jb25zdCBCQVNFXzU4X0VOQ09ORElOR19SRUdFWCA9ICdbMS05QS1ISi1OUC1aYS1rbS16XSc7XG5jb25zdCBDT01QVVRFX0JVREdFVCA9ICdDb21wdXRlQnVkZ2V0MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gQVRBIGluc3RydWN0aW9uIGlzIGlkZW1wb3RlbnQgKGRpc2NyaW1pbmF0b3IgYnl0ZSA9IDEpLlxuICpcbiAqIElkZW1wb3RlbnQgQVRBIGluc3RydWN0aW9ucyB1c2UgQnVmZmVyLmZyb20oWzFdKSBhcyBpbnN0cnVjdGlvbiBkYXRhLCBjcmVhdGVkIGJ5XG4gKiBAc29sYW5hL3NwbC10b2tlbidzIGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJZGVtcG90ZW50SW5zdHJ1Y3Rpb24oKSAodjAuNC4xKykuXG4gKiBBbiBpZGVtcG90ZW50IEFUQSBpbnN0cnVjdGlvbiBzdWNjZWVkIGV2ZW4gaWYgYWNjb3VudCBleGlzdHMsXG4gKiBwcmV2ZW50aW5nIHJhY2UgY29uZGl0aW9uIGVycm9ycyBpbiBjb25jdXJyZW50IHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIC0gVGhlIGluc3RydWN0aW9uIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBpbnN0cnVjdGlvbiBkYXRhIGlzIGEgc2luZ2xlIGJ5dGUgd2l0aCB2YWx1ZSAxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lkZW1wb3RlbnRBdGFJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGggPT09IDEgJiYgaW5zdHJ1Y3Rpb24uZGF0YVswXSA9PT0gMTtcbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpO1xufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgISFoYXNoICYmIG5ldyBSZWdFeHAoQkFTRV81OF9FTkNPTkRJTkdfUkVHRVgpLnRlc3QoaGFzaCkgJiYgYnM1OC5kZWNvZGUoaGFzaCkubGVuZ3RoID09PSBERUNPREVEX0JMT0NLX0hBU0hfTEVOR1RIXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogQGluaGVyaXRkb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJpdmF0ZUtleShwcnZLZXk6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXk6IFVpbnQ4QXJyYXkgPSB0eXBlb2YgcHJ2S2V5ID09PSAnc3RyaW5nJyA/IGJhc2U1OFRvVWludDhBcnJheShwcnZLZXkpIDogcHJ2S2V5O1xuICAgIHJldHVybiAhIUtleXBhaXIuZnJvbVNlY3JldEtleShrZXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHViS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAoaXNWYWxpZFhwdWIocHViS2V5KSkgcmV0dXJuIHRydWU7XG4gICAgbmV3IFB1YmxpY0tleShwdWJLZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIEBpbmhlcml0ZG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNpZ25hdHVyZShzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIXNpZ25hdHVyZSAmJiBiczU4LmRlY29kZShzaWduYXR1cmUpLmxlbmd0aCA9PT0gREVDT0RFRF9TSUdOQVRVUkVfTEVOR1RIO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBAaW5oZXJpdGRvYyAqL1xuLy8gVHJhbnNhY3Rpb25JZCBhcmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIFRyYW5zYWN0aW9uXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkU2lnbmF0dXJlKHR4SWQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGFtb3VudCBvZiBsYW1wb3J0cyBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQW1vdW50KGFtb3VudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgcmV0dXJuIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJiBiaWdOdW1iZXJBbW91bnQuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG9mIGxhbXBvcnRzIG51bWJlciBvbiBzdGFraW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCAtIHRoZSBzdHJpbmcgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFN0YWtpbmdBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpICYmIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuKDApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgaXMgYSB2YWxpZCBtZW1vIG9yIG5vdC5cbiAqXG4gKiBAcGFyYW0gbWVtbyAtIHRoZSBtZW1vIHN0cmluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKG1lbW8pLmxlbmd0aCA8PSBNQVhfTUVNT19MRU5HVEg7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIHZhbGlkIGJhc2U2NCBlbmNvZGVkIGRhdGFcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgdmFsaWQgYmFzZTY0LCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRCYXNlNjQoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkZWNvZGVkID0gQnVmZmVyLmZyb20oc3RyLCAnYmFzZTY0JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIHJldHVybiBkZWNvZGVkID09PSBzdHI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0cmluZyBpcyB2YWxpZCBoZXhhZGVjaW1hbCBkYXRhXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIHZhbGlkIGhleCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSGV4KHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlswLTlBLUZhLWZdKiQvLnRlc3Qoc3RyKSAmJiBzdHIubGVuZ3RoICUgMiA9PT0gMDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgcmF3IHRyYW5zYWN0aW9uIGNhbiBiZSBkZXNlcmlhbGl6ZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb24gLSB0cmFuc2FjdGlvbiBpbiBiYXNlNjQgc3RyaW5nIGZvcm1hdFxuICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlQWxsU2lnbmF0dXJlcyAtIHJlcXVpcmUgYWxsIHNpZ25hdHVyZXMgdG8gYmUgcHJlc2VudFxuICogQHBhcmFtIHtib29sZWFufSB2ZXJpZnlTaWduYXR1cmVzIC0gdmVyaWZ5IHNpZ25hdHVyZXNcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJhd1RyYW5zYWN0aW9uKFxuICByYXdUcmFuc2FjdGlvbjogc3RyaW5nLFxuICByZXF1aXJlQWxsU2lnbmF0dXJlcyA9IGZhbHNlLFxuICB2ZXJpZnlTaWduYXR1cmVzID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHR4ID0gU29sVHJhbnNhY3Rpb24uZnJvbShCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2Jhc2U2NCcpKTtcbiAgICB0eC5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlcywgdmVyaWZ5U2lnbmF0dXJlcyB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGlmIHNpZ25hdHVyZSBmb3IgbWVzc2FnZSBpcyB2YWxpZC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gc2VyaWFsaXplZFR4IC0gdHggYXMgYSBiYXNlNjQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIC0gc2lnbmF0dXJlIGFzIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5IC0gcHVibGljIGtleSBhcyBiYXNlIDU4XG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUoc2VyaWFsaXplZFR4OiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgc2VyaWFsaXplZFR4Jyk7XG4gIH1cbiAgaWYgKCFpc1ZhbGlkUHVibGljS2V5KHB1YmxpY0tleSkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcignSW52YWxpZCBwdWJsaWNLZXknKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG4gIGNvbnN0IG1zZyA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnYmFzZTY0JykpLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgY29uc3Qgc2lnID0gYmFzZTU4VG9VaW50OEFycmF5KHNpZ25hdHVyZSk7XG4gIGNvbnN0IHB1YiA9IG5ldyBQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobXNnLCBzaWcsIHB1Yi50b0J1ZmZlcigpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJhc2U1OCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gYSBzdHJpbmcgaW4gYmFzZTU4XG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gLSBhbiBVaW50OEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNThUb1VpbnQ4QXJyYXkoaW5wdXQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnM1OC5kZWNvZGUoaW5wdXQpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBiYXNlNTggc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgLSBhbiBVaW50OEFycmF5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIGEgc3RyaW5nIGluIGJhc2U1OFxuICovXG5leHBvcnQgZnVuY3Rpb24gVWludDhBcnJheVRvYmFzZTU4KGlucHV0OiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGJzNTguZW5jb2RlKGlucHV0KTtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgYW1vdW50IG9mIHNpZ25hdHVyZXMgYXJlIG5vdCBudWxsLlxuICpcbiAqIEBwYXJhbSB7U2lnbmF0dXJlUHVia2V5UGFpcltdfSBzaWduYXR1cmVzIC0gYW4gYXJyYXkgb2YgU2lnbmF0dXJlUHVia2V5UGFpclxuICogQHJldHVybnMge251bWJlcn0gLSB0aGUgYW1vdW50IG9mIHZhbGlkIHNpZ25hdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50Tm90TnVsbFNpZ25hdHVyZXMoc2lnbmF0dXJlczogU2lnbmF0dXJlUHVia2V5UGFpcltdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMuZmlsdGVyKChzaWcpID0+ICEhc2lnLnNpZ25hdHVyZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFsbCBzaWduYXR1cmVzIGFyZSBjb21wbGV0ZWQuXG4gKlxuICogQHBhcmFtIHtTaWduYXR1cmVQdWJrZXlQYWlyW119IHNpZ25hdHVyZXMgLSBzaWduYXR1cmVzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVzQWxsU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBTaWduYXR1cmVQdWJrZXlQYWlyW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hdHVyZXMubGVuZ3RoID4gMCAmJiBjb3VudE5vdE51bGxTaWduYXR1cmVzKHNpZ25hdHVyZXMpID09PSBzaWduYXR1cmVzLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBDaGVjayB0aGUgdHJhbnNhY3Rpb24gdHlwZSBtYXRjaGluZyBpbnN0cnVjdGlvbnMgYnkgb3JkZXIuIE1lbW8gYW5kIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb25zXG4gKiBhcmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHRydWUgaWYgaXQgbWF0Y2hlcyBieSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGluc3RydWN0aW9uc0NvcHkgPSBbLi4uaW5zdHJ1Y3Rpb25zXTsgLy8gTWFrZSBhIGNvcHkgc2luY2Ugd2UgbWF5IG1vZGlmeSB0aGUgYXJyYXkgYmVsb3dcbiAgLy8gQWR2YW5jZU5vbmNlQWNjb3VudCBpcyBvcHRpb25hbCBhbmQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGFkZGVkLCBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8gbWF0Y2ggdGhlIHR5cGVcbiAgaWYgKGluc3RydWN0aW9uc0NvcHkubGVuZ3RoID4gMCkge1xuICAgIGlmIChnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zWzBdKSA9PT0gJ0FkdmFuY2VOb25jZUFjY291bnQnKSB7XG4gICAgICBpbnN0cnVjdGlvbnNDb3B5LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWVtbyBpcyBvcHRpb25hbCBhbmQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gYWRkZWQsIGl0IGRvZXMgbm90IG1hdHRlciB0byBtYXRjaCB0aGUgdHlwZVxuICAvLyBXaHkgaGF2ZSBpdCBpbiBpbnN0cnVjdGlvbktleXMgaWYgd2UgYXJlIGdvaW5nIHRvIGlnbm9yZSBpdD9cbiAgY29uc3QgaW5zdHJ1Y3Rpb25zS2V5cyA9IE9iamVjdC5rZXlzKGluc3RydWN0aW9uSW5kZXhlcyk7XG4gIGlmIChpbnN0cnVjdGlvbnNLZXlzW2luc3RydWN0aW9uc0tleXMubGVuZ3RoIC0gMV0gPT09ICdNZW1vJykge1xuICAgIGluc3RydWN0aW9uc0tleXMucG9wKCk7XG4gIH1cblxuICAvLyBDaGVjayBpbnN0cnVjdGlvbnMgYnkgb3JkZXIgdXNpbmcgdGhlIGluZGV4LlxuICBmb3IgKGNvbnN0IGtleU5hbWUgb2YgaW5zdHJ1Y3Rpb25zS2V5cykge1xuICAgIGNvbnN0IGluZGV4ID0gaW5zdHJ1Y3Rpb25JbmRleGVzW2tleU5hbWVdO1xuICAgIGlmIChpbmRleCA+PSBpbnN0cnVjdGlvbnNDb3B5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb25zQ29weVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgIT09IGtleU5hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNhY3Rpb24gVHlwZSBiYXNlZCBvbiB0aGUgIHRyYW5zYWN0aW9uIGluc3RydWN0aW9ucy5cbiAqIFdhbGxldCBpbml0aWFsaXphdGlvbiwgVHJhbnNmZXIgYW5kIFN0YWtpbmcgdHJhbnNhY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtTb2xUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24gLSB0aGUgc29sYW5hIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlfSAtIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRyYW5zYWN0aW9uO1xuICBpZiAodmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplUmF3O1xuICB9XG4gIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9ucyk7XG4gIC8vIGNoZWNrIGlmIGRlYWN0aXZhdGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgZXhpc3QgYmVjYXVzZSBkZWFjdGl2YXRlIGNhbiBiZSBpbmNsdWRlIGEgdHJhbnNmZXIgaW5zdHJ1Y3Rpb25cbiAgY29uc3QgbWVtb0luc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25zLmZpbmQoKGluc3RydWN0aW9uKSA9PiBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pID09PSAnTWVtbycpO1xuICBjb25zdCBtZW1vRGF0YSA9IG1lbW9JbnN0cnVjdGlvbj8uZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgaWYgKG1lbW9EYXRhPy5pbmNsdWRlcygnV2FsbGV0Q29ubmVjdERlZmlDdXN0b21UeCcpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDtcbiAgfVxuICBpZiAoaW5zdHJ1Y3Rpb25zLmZpbHRlcigoaW5zdHJ1Y3Rpb24pID0+IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikgPT09ICdEZWFjdGl2YXRlJykubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgICAvLyBDaGVjayBpZiBtZW1vIGluc3RydWN0aW9uIGlzIHRoZXJlIGFuZCBpZiBpdCBjb250YWlucyAnUHJlcGFyZUZvclJldm9rZScgYmVjYXVzZSBNYXJpbmFkZSBzdGFraW5nIGRlYWN0aXZhdGUgdHJhbnNhY3Rpb24gd2lsbCBoYXZlIHRoaXNcbiAgICAgIGlmIChcbiAgICAgICAgKGluc3RydWN0aW9uVHlwZSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5UcmFuc2ZlciAmJiAhbWVtb0RhdGE/LmluY2x1ZGVzKCdQcmVwYXJlRm9yUmV2b2tlJykpIHx8XG4gICAgICAgIGluc3RydWN0aW9uVHlwZSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Ub2tlblRyYW5zZmVyXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcykpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uO1xuICB9IGVsc2UgaWYgKFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIG1hcmluYWRlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBqaXRvU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcykgfHxcbiAgICBtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBqaXRvU3Rha2luZ0FjdGl2YXRlV2l0aEFUQUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcylcbiAgKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU7XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplO1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdEZWxlZ2F0ZUluc3RydWN0aW9uc0luZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU7XG4gIH0gZWxzZSBpZiAoXG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgbWFyaW5hZGVTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgc3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnNJbmRleGVzKSB8fFxuICAgIG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIHN0YWtpbmdQYXJ0aWFsRGVhY3RpdmF0ZUluc3RydWN0aW9uc0luZGV4ZXMpIHx8XG4gICAgbWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgaml0b1N0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zSW5kZXhlcylcbiAgKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTtcbiAgfSBlbHNlIGlmIChtYXRjaFRyYW5zYWN0aW9uVHlwZUJ5SW5zdHJ1Y3Rpb25zT3JkZXIoaW5zdHJ1Y3Rpb25zLCBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbnNJbmRleGVzKSkge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3O1xuICB9IGVsc2UgaWYgKG1hdGNoVHJhbnNhY3Rpb25UeXBlQnlJbnN0cnVjdGlvbnNPcmRlcihpbnN0cnVjdGlvbnMsIGF0YUluaXRJbnN0cnVjdGlvbkluZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb247XG4gIH0gZWxzZSBpZiAobWF0Y2hUcmFuc2FjdGlvblR5cGVCeUluc3RydWN0aW9uc09yZGVyKGluc3RydWN0aW9ucywgYXRhQ2xvc2VJbnN0cnVjdGlvbkluZGV4ZXMpKSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluc3RydWN0aW9uIFR5cGUgYmFzZWQgb24gdGhlIHNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKiBUaHJvd3MgaWYgdGhlIHNvbGFuYSBpbnN0cnVjdGlvbiBwcm9ncmFtIGlzIG5vdCBzdXBwb3J0ZWRcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb25cbiAqIEByZXR1cm5zIHtWYWxpZEluc3RydWN0aW9uVHlwZXN9IC0gYSBzb2xhbmEgaW5zdHJ1Y3Rpb24gdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogVmFsaWRJbnN0cnVjdGlvblR5cGVzIHtcbiAgc3dpdGNoIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgIGNhc2UgbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gJ01lbW8nO1xuICAgIGNhc2UgU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKTpcbiAgICAgIHJldHVybiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIGNhc2UgVE9LRU5fUFJPR1JBTV9JRC50b1N0cmluZygpOlxuICAgIGNhc2UgVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICBjb25zdCBkZWNvZGVkSW5zdHJ1Y3Rpb24gPSBkZWNvZGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZU1hcDogTWFwPFRva2VuSW5zdHJ1Y3Rpb24sIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlcz4gPSBuZXcgTWFwKCk7XG4gICAgICBpbnN0cnVjdGlvblR5cGVNYXAuc2V0KFRva2VuSW5zdHJ1Y3Rpb24uQ2xvc2VBY2NvdW50LCAnQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50Jyk7XG4gICAgICBpbnN0cnVjdGlvblR5cGVNYXAuc2V0KFRva2VuSW5zdHJ1Y3Rpb24uQnVybiwgJ0J1cm4nKTtcbiAgICAgIGluc3RydWN0aW9uVHlwZU1hcC5zZXQoVG9rZW5JbnN0cnVjdGlvbi5NaW50VG8sICdNaW50VG8nKTtcbiAgICAgIGluc3RydWN0aW9uVHlwZU1hcC5zZXQoVG9rZW5JbnN0cnVjdGlvbi5BcHByb3ZlLCAnQXBwcm92ZScpO1xuICAgICAgaW5zdHJ1Y3Rpb25UeXBlTWFwLnNldChUb2tlbkluc3RydWN0aW9uLlRyYW5zZmVyQ2hlY2tlZCwgJ1Rva2VuVHJhbnNmZXInKTtcbiAgICAgIGNvbnN0IHZhbGlkSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvblR5cGVNYXAuZ2V0KGRlY29kZWRJbnN0cnVjdGlvbi5kYXRhLmluc3RydWN0aW9uKTtcbiAgICAgIGlmICghdmFsaWRJbnN0cnVjdGlvbikge1xuICAgICAgICByZXR1cm4gJ0N1c3RvbUluc3RydWN0aW9uJztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZEluc3RydWN0aW9uO1xuICAgIGNhc2UgU1RBS0VfUE9PTF9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICBjb25zdCBkaXNjcmltaW5hdG9yID0gaW5zdHJ1Y3Rpb24uZGF0YS5yZWFkVWludDgoMCk7XG4gICAgICBjb25zdCBsYXlvdXRLZXkgPSBPYmplY3QuZW50cmllcyhTVEFLRV9QT09MX0lOU1RSVUNUSU9OX0xBWU9VVFMpLmZpbmQoKFtfLCB2XSkgPT4gdi5pbmRleCA9PT0gZGlzY3JpbWluYXRvcik/LlswXTtcbiAgICAgIGlmIChsYXlvdXRLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luc3RydWN0aW9uIHR5cGUgaW5jb3JyZWN0OyB1bmtub3duIGRpc2NyaW1pbmF0b3InKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluc3RydWN0aW9uS2V5ID0gbGF5b3V0S2V5IGFzIGtleW9mIHR5cGVvZiBTVEFLRV9QT09MX0lOU1RSVUNUSU9OX0xBWU9VVFM7XG4gICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25LZXk7XG4gICAgY2FzZSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk6XG4gICAgICByZXR1cm4gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIGNhc2UgQVNTT0NJQVRFRF9UT0tFTl9QUk9HUkFNX0lELnRvU3RyaW5nKCk6XG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB3aGVuIEBzcGwtdG9rZW4gc3VwcG9ydHMgZGVjb2RpbmcgYXNzb2NpYXRlZCB0b2tlbiBpbnN0cnVjdGlvbnNcbiAgICAgIC8vIFN1cHBvcnQgYm90aCBsZWdhY3kgQVRBIGNyZWF0aW9uIChkYXRhLmxlbmd0aCA9PT0gMCkgYW5kIGlkZW1wb3RlbnQgQVRBIGNyZWF0aW9uIChkaXNjcmltaW5hdG9yID0gMSlcbiAgICAgIC8vIEJvdGggaW5zdHJ1Y3Rpb24gdHlwZXMgYXJlIHRyZWF0ZWQgYXMgJ0luaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50JyBmb3IgY29tcGF0aWJpbGl0eVxuICAgICAgaWYgKGluc3RydWN0aW9uLmRhdGEubGVuZ3RoID09PSAwIHx8IGlzSWRlbXBvdGVudEF0YUluc3RydWN0aW9uKGluc3RydWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gJ0luaXRpYWxpemVBc3NvY2lhdGVkVG9rZW5BY2NvdW50JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAgICAgJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHByb2dyYW0gaWQgbm90IHN1cHBvcnRlZDogJyArIGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgY2FzZSBDT01QVVRFX0JVREdFVDpcbiAgICAgIGlmIChDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24uZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gJ1NldENvbXB1dGVVbml0TGltaXQnKSB7XG4gICAgICAgIHJldHVybiAnU2V0Q29tcHV0ZVVuaXRMaW1pdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ1NldFByaW9yaXR5RmVlJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdDdXN0b21JbnN0cnVjdGlvbic7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zIHR5cGVzIHRvIHNlZSBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGJ1aWxkZXIuXG4gKiBUaHJvd3MgaWYgdGhlIGluc3RydWN0aW9uIHR5cGUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW50cnVjdGlvblR5cGVzKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKCFWQUxJRF9TWVNURU1fSU5TVFJVQ1RJT05fVFlQRVMuaW5jbHVkZXMoZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIGluc3RydWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNvbGFuYSBpbnN0cnVjdGlvbnMgbWF0Y2ggcmF3IG1zZyBhdXRob3JpemUgdHJhbnNhY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9ucyAtIGEgc29sYW5hIGluc3RydWN0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIG1hdGNoIHRoZSByYXcgbXNnIGF1dGhvcml6ZSB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbihpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IGJvb2xlYW4ge1xuICAvLyBhcyB3ZWIzLmpzIGNhbm5vdCBkZWNvZGUgYXV0aG9yaXplIGluc3RydWN0aW9uIGZyb20gQ0xJLCB3ZSBuZWVkIHRvIGNoZWNrIGl0IG1hbnVhbGx5IGZpcnN0XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgcHJvZ3JhbUlkMSA9IGluc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwcm9ncmFtSWQyID0gaW5zdHJ1Y3Rpb25zWzFdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGlmIChwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmIHByb2dyYW1JZDIgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGlmIChcbiAgICAgICAgaW5zdHJ1Y3Rpb25OYW1lMSA9PT0gbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgKGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhMilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IDMpIHtcbiAgICBjb25zdCBwcm9ncmFtSWQxID0gaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgIGNvbnN0IHByb2dyYW1JZDIgPSBpbnN0cnVjdGlvbnNbMV0ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcHJvZ3JhbUlkMyA9IGluc3RydWN0aW9uc1syXS5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICBpZiAoXG4gICAgICBwcm9ncmFtSWQxID09PSBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZC50b1N0cmluZygpICYmXG4gICAgICBwcm9ncmFtSWQyID09PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgJiZcbiAgICAgIHByb2dyYW1JZDMgPT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKVxuICAgICkge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25OYW1lMSA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGRhdGEyID0gaW5zdHJ1Y3Rpb25zWzJdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbk5hbWUxID09PSBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiAmJlxuICAgICAgICAoZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEgfHwgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGEyKSAmJlxuICAgICAgICAoZGF0YTIgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhIHx8IGRhdGEyID09PSB2YWxpZEluc3RydWN0aW9uRGF0YTIpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdUcmFuc2FjdGlvbiAtIFRyYW5zYWN0aW9uIGluIGJhc2U2NCBzdHJpbmcgIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihcbiAgcmF3VHJhbnNhY3Rpb246IHN0cmluZyxcbiAgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSBmYWxzZSxcbiAgdmVyaWZ5U2lnbmF0dXJlcyA9IGZhbHNlXG4pOiB2b2lkIHtcbiAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiBVbmRlZmluZWQnKTtcbiAgfVxuICBpZiAoIWlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbiwgcmVxdWlyZUFsbFNpZ25hdHVyZXMsIHZlcmlmeVNpZ25hdHVyZXMpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhZGRyZXNzIHRvIGNoZWNrIGlmIGl0IGV4aXN0cyBhbmQgaXMgYSB2YWxpZCBTb2xhbmEgcHVibGljIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkTmFtZSBOYW1lIG9mIHRoZSBmaWVsZCB0byB2YWxpZGF0ZSwgaXRzIG5lZWRlZCB0byByZXR1cm4gd2hpY2ggZmllbGQgaXMgZmFpbGluZyBvbiBjYXNlIG9mIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFhZGRyZXNzIHx8ICFpc1ZhbGlkUHVibGljS2V5KGFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBvciBtaXNzaW5nICR7ZmllbGROYW1lfSwgZ290OiAke2FkZHJlc3N9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3ModG9rZW5BZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IEJhc2VOZXR3b3JrKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi5uZXR3b3JrLnR5cGUgPT09IG5ldHdvcmsudHlwZSAmJiBjb2luLnRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSB0b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbiAgY29uc3QgdG9rZW5zQXJyYXkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gdG9rZW4pO1xuICBpZiAodG9rZW5zQXJyYXkubGVuZ3RoID49IDEpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdHdvIHRva2VucyB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MsIHNvIHdlIGFzc2VydCB0aGF0IGhlcmVcbiAgICBhc3NlcnQodG9rZW5zQXJyYXkubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdG9rZW5zQXJyYXlbMF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YXRpY3MgY29pbiBvYmplY3QgbWF0Y2hpbmcgYSBnaXZlbiBTb2xhbmEgdG9rZW4gYWRkcmVzcyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0gdG9rZW5BZGRyZXNzIFRoZSB0b2tlbiBhZGRyZXNzIHRvIG1hdGNoIGFnYWluc3RcbiAqIEBwYXJhbSBuZXR3b3JrIFNvbGFuYSBNYWlubmV0IG9yIFRlc3RuZXRcbiAqIEByZXR1cm5zIHN0YXRpY3MgQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuQWRkcmVzczogc3RyaW5nKTogUmVhZG9ubHk8QmFzZUNvaW4+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW5zID0gY29pbnMuZmlsdGVyKChjb2luKSA9PiB7XG4gICAgaWYgKGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luKSB7XG4gICAgICByZXR1cm4gY29pbi50b2tlbkFkZHJlc3MudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW5BZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG4gIGNvbnN0IHRva2Vuc0FycmF5ID0gdG9rZW5zLm1hcCgodG9rZW4pID0+IHRva2VuKTtcbiAgaWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA+PSAxKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIG5ldmVyIGJlIHR3byB0b2tlbnMgd2l0aCB0aGUgc2FtZSBjb250cmFjdCBhZGRyZXNzLCBzbyB3ZSBhc3NlcnQgdGhhdCBoZXJlXG4gICAgYXNzZXJ0KHRva2Vuc0FycmF5Lmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRva2Vuc0FycmF5WzBdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgdG9rZW4gb2JqZWN0IGZyb20gdG9rZW4gbmFtZVxuICogQHBhcmFtIHRva2VuTmFtZSBUaGUgdG9rZW4gbmFtZSB0byBtYXRjaCBhZ2FpbnN0XG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvbFRva2VuRnJvbVRva2VuTmFtZSh0b2tlbk5hbWU6IHN0cmluZyk6IFJlYWRvbmx5PFNvbENvaW4+IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICghKHRva2VuLmlzVG9rZW4gJiYgdG9rZW4gaW5zdGFuY2VvZiBTb2xDb2luKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIENvaW5Ob3REZWZpbmVkRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2xhbmEgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgdG9rZW4gbWludCBhZGRyZXNzXG4gKiBAcGFyYW0gb3duZXJBZGRyZXNzIFRoZSBvd25lciBvZiB0aGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gKiBAcmV0dXJucyBUaGUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IGFkZHJlc3NcbiAqICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXNzb2NpYXRlZFRva2VuQWNjb3VudEFkZHJlc3MoXG4gIHRva2VuTWludEFkZHJlc3M6IHN0cmluZyxcbiAgb3duZXJBZGRyZXNzOiBzdHJpbmcsXG4gIGFsbG93T3duZXJPZmZDdXJ2ZSA9IGZhbHNlLFxuICBwcm9ncmFtSWQ/OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG1pbnRQdWJsaWNLZXkgPSBuZXcgUHVibGljS2V5KHRva2VuTWludEFkZHJlc3MpO1xuICBjb25zdCBvd25lclB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkob3duZXJBZGRyZXNzKTtcblxuICAvLyB0b2tlbkFkZHJlc3MgYXJlIG5vdCBvbiBlZDI1NTE5IGN1cnZlLCBzbyB0aGV5IGNhbid0IGJlIHVzZWQgYXMgb3duZXJBZGRyZXNzXG4gIGlmICghYWxsb3dPd25lck9mZkN1cnZlICYmICFQdWJsaWNLZXkuaXNPbkN1cnZlKG93bmVyUHVibGljS2V5LnRvQnVmZmVyKCkpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoJ0ludmFsaWQgb3duZXJBZGRyZXNzIC0gYWRkcmVzcyBvZmYgZWQyNTUxOSBjdXJ2ZSwgZ290OiAnICsgb3duZXJBZGRyZXNzKTtcbiAgfVxuXG4gIGlmICghcHJvZ3JhbUlkKSB7XG4gICAgY29uc3QgY29pbiA9IGdldFNvbFRva2VuRnJvbUFkZHJlc3NPbmx5KHRva2VuTWludEFkZHJlc3MpO1xuICAgIGlmIChjb2luICYmIGNvaW4gaW5zdGFuY2VvZiBTb2xDb2luICYmICdwcm9ncmFtSWQnIGluIGNvaW4gJiYgY29pbi5wcm9ncmFtSWQpIHtcbiAgICAgIHByb2dyYW1JZCA9IGNvaW4ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyYW1JZCA9IFRPS0VOX1BST0dSQU1fSUQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICBsZXQgYXRhQWRkcmVzczogUHVibGljS2V5O1xuICBpZiAocHJvZ3JhbUlkID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgIGF0YUFkZHJlc3MgPSBhd2FpdCBnZXRBc3NvY2lhdGVkVG9rZW5BZGRyZXNzKFxuICAgICAgbWludFB1YmxpY0tleSxcbiAgICAgIG93bmVyUHVibGljS2V5LFxuICAgICAgYWxsb3dPd25lck9mZkN1cnZlLFxuICAgICAgVE9LRU5fMjAyMl9QUk9HUkFNX0lEXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhdGFBZGRyZXNzID0gYXdhaXQgZ2V0QXNzb2NpYXRlZFRva2VuQWRkcmVzcyhtaW50UHVibGljS2V5LCBvd25lclB1YmxpY0tleSwgYWxsb3dPd25lck9mZkN1cnZlKTtcbiAgfVxuICByZXR1cm4gYXRhQWRkcmVzcy50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNaW50QWRkcmVzcyhtaW50QWRkcmVzczogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghbWludEFkZHJlc3MgfHwgIWlzVmFsaWRBZGRyZXNzKG1pbnRBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBtaW50QWRkcmVzcywgZ290OiAnICsgbWludEFkZHJlc3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU93bmVyQWRkcmVzcyhvd25lckFkZHJlc3M6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIW93bmVyQWRkcmVzcyB8fCAhaXNWYWxpZEFkZHJlc3Mob3duZXJBZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBvd25lckFkZHJlc3MsIGdvdDogJyArIG93bmVyQWRkcmVzcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUeXBlIHByZWRpY2F0ZSB0byBjaGVjayBpZiBhbiBpbnN0cnVjdGlvbiBpcyBhIGxlZ2FjeSBTb2xJbnN0cnVjdGlvbi5cbiAqIFVzZXMgJ3Byb2dyYW1JZCcgcHJvcGVydHkgYXMgdGhlIGRpc2NyaW1pbmF0b3Igc2luY2UgaXQncyB1bmlxdWUgdG8gbGVnYWN5IGluc3RydWN0aW9uc1xuICogVmVyc2lvbmVkIGluc3RydWN0aW9ucyBoYXZlICdwcm9ncmFtSWRJbmRleCcgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIGluc3RydWN0aW9uIC0gVGhlIGluc3RydWN0aW9uIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBhIFNvbEluc3RydWN0aW9uIChoYXMgcHJvZ3JhbUlkIGZpZWxkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTb2xMZWdhY3lJbnN0cnVjdGlvbihcbiAgaW5zdHJ1Y3Rpb246IFNvbEluc3RydWN0aW9uIHwgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb25cbik6IGluc3RydWN0aW9uIGlzIFNvbEluc3RydWN0aW9uIHtcbiAgcmV0dXJuICdwcm9ncmFtSWQnIGluIGluc3RydWN0aW9uO1xufVxuIl19