@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,1037 @@
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.instructionParamsFactory = instructionParamsFactory;
7
+ exports.findTokenName = findTokenName;
8
+ const spl_token_1 = require("@solana/spl-token");
9
+ const web3_js_1 = require("@solana/web3.js");
10
+ const public_types_1 = require("@bitgo/public-types");
11
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
12
+ const statics_1 = require("@bitgo-beta/statics");
13
+ const assert_1 = __importDefault(require("assert"));
14
+ const constants_1 = require("./constants");
15
+ const utils_1 = require("./utils");
16
+ const jitoStakePoolOperations_1 = require("./jitoStakePoolOperations");
17
+ /**
18
+ * Construct instructions params from Solana instructions
19
+ *
20
+ * @param {TransactionType} type - the transaction type
21
+ * @param {TransactionInstruction[]} instructions - solana instructions
22
+ * @returns {InstructionParams[]} An array containing instruction params
23
+ */
24
+ function instructionParamsFactory(type, instructions, coinName, instructionMetadata, _useTokenAddressTokenName) {
25
+ switch (type) {
26
+ case sdk_core_1.TransactionType.WalletInitialization:
27
+ return parseWalletInitInstructions(instructions);
28
+ case sdk_core_1.TransactionType.Send:
29
+ return parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
30
+ case sdk_core_1.TransactionType.StakingActivate:
31
+ return parseStakingActivateInstructions(instructions);
32
+ case sdk_core_1.TransactionType.StakingDeactivate:
33
+ return parseStakingDeactivateInstructions(instructions, coinName);
34
+ case sdk_core_1.TransactionType.StakingWithdraw:
35
+ return parseStakingWithdrawInstructions(instructions);
36
+ case sdk_core_1.TransactionType.AssociatedTokenAccountInitialization:
37
+ return parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
38
+ case sdk_core_1.TransactionType.CloseAssociatedTokenAccount:
39
+ return parseAtaCloseInstructions(instructions);
40
+ case sdk_core_1.TransactionType.StakingAuthorize:
41
+ return parseStakingAuthorizeInstructions(instructions);
42
+ case sdk_core_1.TransactionType.StakingAuthorizeRaw:
43
+ return parseStakingAuthorizeRawInstructions(instructions);
44
+ case sdk_core_1.TransactionType.StakingDelegate:
45
+ return parseStakingDelegateInstructions(instructions);
46
+ case sdk_core_1.TransactionType.CustomTx:
47
+ return parseCustomInstructions(instructions, instructionMetadata);
48
+ default:
49
+ throw new sdk_core_1.NotSupported('Invalid transaction, transaction type not supported: ' + type);
50
+ }
51
+ }
52
+ /**
53
+ * Parses Solana instructions to Wallet initialization tx instructions params
54
+ *
55
+ * @param {TransactionInstruction[]} instructions - containing create and initialize nonce solana instructions
56
+ * @returns {InstructionParams[]} An array containing instruction params for Wallet initialization tx
57
+ */
58
+ function parseWalletInitInstructions(instructions) {
59
+ const instructionData = [];
60
+ const createInstruction = web3_js_1.SystemInstruction.decodeCreateAccount(instructions[constants_1.walletInitInstructionIndexes.Create]);
61
+ const nonceInitInstruction = web3_js_1.SystemInstruction.decodeNonceInitialize(instructions[constants_1.walletInitInstructionIndexes.InitializeNonceAccount]);
62
+ const walletInit = {
63
+ type: constants_1.InstructionBuilderTypes.CreateNonceAccount,
64
+ params: {
65
+ fromAddress: createInstruction.fromPubkey.toString(),
66
+ nonceAddress: nonceInitInstruction.noncePubkey.toString(),
67
+ authAddress: nonceInitInstruction.authorizedPubkey.toString(),
68
+ amount: createInstruction.lamports.toString(),
69
+ },
70
+ };
71
+ instructionData.push(walletInit);
72
+ const memo = getMemo(instructions, constants_1.walletInitInstructionIndexes);
73
+ if (memo) {
74
+ instructionData.push(memo);
75
+ }
76
+ return instructionData;
77
+ }
78
+ /**
79
+ * Parses Solana instructions to Send tx instructions params
80
+ * Only supports Memo, Transfer and Advance Nonce Solana instructions
81
+ *
82
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
83
+ * @returns {InstructionParams[]} An array containing instruction params for Send tx
84
+ */
85
+ function parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
86
+ const instructionData = [];
87
+ for (const instruction of instructions) {
88
+ const type = (0, utils_1.getInstructionType)(instruction);
89
+ switch (type) {
90
+ case constants_1.ValidInstructionTypesEnum.Memo:
91
+ const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
92
+ instructionData.push(memo);
93
+ break;
94
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
95
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
96
+ const nonce = {
97
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
98
+ params: {
99
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
100
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
101
+ },
102
+ };
103
+ instructionData.push(nonce);
104
+ break;
105
+ case constants_1.ValidInstructionTypesEnum.Transfer:
106
+ const transferInstruction = web3_js_1.SystemInstruction.decodeTransfer(instruction);
107
+ const transfer = {
108
+ type: constants_1.InstructionBuilderTypes.Transfer,
109
+ params: {
110
+ fromAddress: transferInstruction.fromPubkey.toString(),
111
+ toAddress: transferInstruction.toPubkey.toString(),
112
+ amount: transferInstruction.lamports.toString(),
113
+ },
114
+ };
115
+ instructionData.push(transfer);
116
+ break;
117
+ case constants_1.ValidInstructionTypesEnum.TokenTransfer:
118
+ let tokenTransferInstruction;
119
+ if (instruction.programId.toString() !== spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
120
+ tokenTransferInstruction = (0, spl_token_1.decodeTransferCheckedInstruction)(instruction);
121
+ }
122
+ else {
123
+ tokenTransferInstruction = (0, spl_token_1.decodeTransferCheckedInstruction)(instruction, spl_token_1.TOKEN_2022_PROGRAM_ID);
124
+ }
125
+ const tokenAddress = tokenTransferInstruction.keys.mint.pubkey.toString();
126
+ const tokenName = findTokenName(tokenAddress, instructionMetadata, _useTokenAddressTokenName);
127
+ let programIDForTokenTransfer;
128
+ if (instruction.programId) {
129
+ programIDForTokenTransfer = instruction.programId.toString();
130
+ }
131
+ const tokenTransfer = {
132
+ type: constants_1.InstructionBuilderTypes.TokenTransfer,
133
+ params: {
134
+ fromAddress: tokenTransferInstruction.keys.owner.pubkey.toString(),
135
+ toAddress: tokenTransferInstruction.keys.destination.pubkey.toString(),
136
+ amount: tokenTransferInstruction.data.amount.toString(),
137
+ tokenName,
138
+ sourceAddress: tokenTransferInstruction.keys.source.pubkey.toString(),
139
+ tokenAddress: tokenAddress,
140
+ programId: programIDForTokenTransfer,
141
+ decimalPlaces: tokenTransferInstruction.data.decimals,
142
+ },
143
+ };
144
+ instructionData.push(tokenTransfer);
145
+ break;
146
+ case constants_1.ValidInstructionTypesEnum.Approve:
147
+ const programId = instruction.programId.equals(spl_token_1.TOKEN_2022_PROGRAM_ID) ? spl_token_1.TOKEN_2022_PROGRAM_ID : undefined;
148
+ const approveInstruction = (0, spl_token_1.decodeApproveInstruction)(instruction, programId);
149
+ const approve = {
150
+ type: constants_1.InstructionBuilderTypes.Approve,
151
+ params: {
152
+ accountAddress: approveInstruction.keys.account.toString(),
153
+ delegateAddress: approveInstruction.keys.delegate.toString(),
154
+ ownerAddress: approveInstruction.keys.owner.toString(),
155
+ amount: approveInstruction.data.amount.toString(),
156
+ programId: programId && programId.toString(),
157
+ },
158
+ };
159
+ instructionData.push(approve);
160
+ break;
161
+ case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
162
+ const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
163
+ const mintTokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
164
+ let programID;
165
+ if (instruction.programId) {
166
+ programID = instruction.programId.toString();
167
+ }
168
+ const ataInit = {
169
+ type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
170
+ params: {
171
+ mintAddress,
172
+ ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
173
+ ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
174
+ payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
175
+ tokenName: mintTokenName,
176
+ programId: programID,
177
+ },
178
+ };
179
+ instructionData.push(ataInit);
180
+ break;
181
+ case constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
182
+ const accountAddress = instruction.keys[closeAtaInstructionKeysIndexes.AccountAddress].pubkey.toString();
183
+ const destinationAddress = instruction.keys[closeAtaInstructionKeysIndexes.DestinationAddress].pubkey.toString();
184
+ const authorityAddress = instruction.keys[closeAtaInstructionKeysIndexes.AuthorityAddress].pubkey.toString();
185
+ const ataClose = {
186
+ type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
187
+ params: {
188
+ accountAddress,
189
+ destinationAddress,
190
+ authorityAddress,
191
+ },
192
+ };
193
+ instructionData.push(ataClose);
194
+ break;
195
+ case constants_1.ValidInstructionTypesEnum.SetComputeUnitLimit:
196
+ const setComputeUnitLimitParams = web3_js_1.ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction);
197
+ const setComputeUnitLimit = {
198
+ type: constants_1.InstructionBuilderTypes.SetComputeUnitLimit,
199
+ params: {
200
+ units: setComputeUnitLimitParams.units,
201
+ },
202
+ };
203
+ instructionData.push(setComputeUnitLimit);
204
+ break;
205
+ case constants_1.ValidInstructionTypesEnum.SetPriorityFee:
206
+ const setComputeUnitPriceParams = web3_js_1.ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction);
207
+ const setPriorityFee = {
208
+ type: constants_1.InstructionBuilderTypes.SetPriorityFee,
209
+ params: {
210
+ fee: setComputeUnitPriceParams.microLamports,
211
+ },
212
+ };
213
+ instructionData.push(setPriorityFee);
214
+ break;
215
+ case constants_1.ValidInstructionTypesEnum.MintTo:
216
+ let mintToInstruction;
217
+ if (instruction.programId.toString() !== spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
218
+ mintToInstruction = (0, spl_token_1.decodeMintToInstruction)(instruction);
219
+ }
220
+ else {
221
+ mintToInstruction = (0, spl_token_1.decodeMintToInstruction)(instruction, spl_token_1.TOKEN_2022_PROGRAM_ID);
222
+ }
223
+ const mintAddressForMint = mintToInstruction.keys.mint.pubkey.toString();
224
+ const tokenNameForMint = findTokenName(mintAddressForMint, instructionMetadata, _useTokenAddressTokenName);
225
+ let programIDForMint;
226
+ if (instruction.programId) {
227
+ programIDForMint = instruction.programId.toString();
228
+ }
229
+ const mintTo = {
230
+ type: constants_1.InstructionBuilderTypes.MintTo,
231
+ params: {
232
+ mintAddress: mintAddressForMint,
233
+ destinationAddress: mintToInstruction.keys.destination.pubkey.toString(),
234
+ authorityAddress: mintToInstruction.keys.authority.pubkey.toString(),
235
+ amount: mintToInstruction.data.amount.toString(),
236
+ tokenName: tokenNameForMint,
237
+ decimalPlaces: undefined,
238
+ programId: programIDForMint,
239
+ },
240
+ };
241
+ instructionData.push(mintTo);
242
+ break;
243
+ case constants_1.ValidInstructionTypesEnum.Burn:
244
+ let burnInstruction;
245
+ if (instruction.programId.toString() !== spl_token_1.TOKEN_2022_PROGRAM_ID.toString()) {
246
+ burnInstruction = (0, spl_token_1.decodeBurnInstruction)(instruction);
247
+ }
248
+ else {
249
+ burnInstruction = (0, spl_token_1.decodeBurnInstruction)(instruction, spl_token_1.TOKEN_2022_PROGRAM_ID);
250
+ }
251
+ const mintAddressForBurn = burnInstruction.keys.mint.pubkey.toString();
252
+ const tokenNameForBurn = findTokenName(mintAddressForBurn, instructionMetadata, _useTokenAddressTokenName);
253
+ let programIDForBurn;
254
+ if (instruction.programId) {
255
+ programIDForBurn = instruction.programId.toString();
256
+ }
257
+ const burn = {
258
+ type: constants_1.InstructionBuilderTypes.Burn,
259
+ params: {
260
+ mintAddress: mintAddressForBurn,
261
+ accountAddress: burnInstruction.keys.account.pubkey.toString(),
262
+ authorityAddress: burnInstruction.keys.owner.pubkey.toString(),
263
+ amount: burnInstruction.data.amount.toString(),
264
+ tokenName: tokenNameForBurn,
265
+ decimalPlaces: undefined,
266
+ programId: programIDForBurn,
267
+ },
268
+ };
269
+ instructionData.push(burn);
270
+ break;
271
+ default:
272
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
273
+ }
274
+ }
275
+ return instructionData;
276
+ }
277
+ function isJitoStakingInstructions(si) {
278
+ return si.depositSol !== undefined;
279
+ }
280
+ function isMarinadeStakingInstructions(si) {
281
+ return si.create !== undefined && si.initialize !== undefined && si.delegate === undefined;
282
+ }
283
+ function isNativeStakingInstructions(si) {
284
+ return si.create !== undefined && si.initialize !== undefined && si.delegate !== undefined;
285
+ }
286
+ function getStakingTypeFromStakingInstructions(si) {
287
+ const isJito = isJitoStakingInstructions(si);
288
+ const isMarinade = isMarinadeStakingInstructions(si);
289
+ const isNative = isNativeStakingInstructions(si);
290
+ (0, assert_1.default)([isJito, isMarinade, isNative].filter((x) => x).length === 1, 'StakingType is ambiguous');
291
+ if (isJito)
292
+ return public_types_1.SolStakingTypeEnum.JITO;
293
+ if (isMarinade)
294
+ return public_types_1.SolStakingTypeEnum.MARINADE;
295
+ if (isNative)
296
+ return public_types_1.SolStakingTypeEnum.NATIVE;
297
+ (0, assert_1.default)(false, 'No StakingType found');
298
+ }
299
+ /**
300
+ * Parses Solana instructions to create staking tx and delegate tx instructions params
301
+ * Only supports Nonce, StakingActivate and Memo Solana instructions
302
+ *
303
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
304
+ * @returns {InstructionParams[]} An array containing instruction params for staking activate tx
305
+ */
306
+ function parseStakingActivateInstructions(instructions) {
307
+ const instructionData = [];
308
+ const stakingInstructions = {};
309
+ for (const instruction of instructions) {
310
+ const type = (0, utils_1.getInstructionType)(instruction);
311
+ switch (type) {
312
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
313
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
314
+ const nonce = {
315
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
316
+ params: {
317
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
318
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
319
+ },
320
+ };
321
+ instructionData.push(nonce);
322
+ break;
323
+ case constants_1.ValidInstructionTypesEnum.Memo:
324
+ const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
325
+ instructionData.push(memo);
326
+ break;
327
+ case constants_1.ValidInstructionTypesEnum.Create:
328
+ stakingInstructions.create = web3_js_1.SystemInstruction.decodeCreateAccount(instruction);
329
+ break;
330
+ case constants_1.ValidInstructionTypesEnum.StakingInitialize:
331
+ stakingInstructions.initialize = web3_js_1.StakeInstruction.decodeInitialize(instruction);
332
+ break;
333
+ case constants_1.ValidInstructionTypesEnum.StakingDelegate:
334
+ stakingInstructions.delegate = web3_js_1.StakeInstruction.decodeDelegate(instruction);
335
+ break;
336
+ case constants_1.ValidInstructionTypesEnum.DepositSol:
337
+ stakingInstructions.depositSol = (0, jitoStakePoolOperations_1.decodeDepositSol)(instruction);
338
+ break;
339
+ case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
340
+ stakingInstructions.hasAtaInit = true;
341
+ instructionData.push({
342
+ type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
343
+ params: {
344
+ mintAddress: instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString(),
345
+ ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
346
+ ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
347
+ payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
348
+ tokenName: findTokenName(instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString()),
349
+ },
350
+ });
351
+ break;
352
+ }
353
+ }
354
+ validateStakingInstructions(stakingInstructions);
355
+ const stakingType = getStakingTypeFromStakingInstructions(stakingInstructions);
356
+ let stakingActivate;
357
+ switch (stakingType) {
358
+ case public_types_1.SolStakingTypeEnum.JITO: {
359
+ (0, assert_1.default)(isJitoStakingInstructions(stakingInstructions));
360
+ const { depositSol, hasAtaInit } = stakingInstructions;
361
+ stakingActivate = {
362
+ type: constants_1.InstructionBuilderTypes.StakingActivate,
363
+ params: {
364
+ stakingType,
365
+ fromAddress: depositSol.fundingAccount.toString(),
366
+ stakingAddress: depositSol.stakePool.toString(),
367
+ amount: depositSol.lamports.toString(),
368
+ validator: depositSol.stakePool.toString(),
369
+ extraParams: {
370
+ stakePoolData: {
371
+ managerFeeAccount: depositSol.managerFeeAccount.toString(),
372
+ poolMint: depositSol.poolMint.toString(),
373
+ reserveStake: depositSol.reserveStake.toString(),
374
+ },
375
+ createAssociatedTokenAccount: !!hasAtaInit,
376
+ },
377
+ },
378
+ };
379
+ break;
380
+ }
381
+ case public_types_1.SolStakingTypeEnum.MARINADE: {
382
+ (0, assert_1.default)(isMarinadeStakingInstructions(stakingInstructions));
383
+ const { create, initialize } = stakingInstructions;
384
+ stakingActivate = {
385
+ type: constants_1.InstructionBuilderTypes.StakingActivate,
386
+ params: {
387
+ stakingType,
388
+ fromAddress: create.fromPubkey.toString(),
389
+ stakingAddress: initialize.stakePubkey.toString(),
390
+ amount: create.lamports.toString(),
391
+ validator: initialize.authorized.staker.toString(),
392
+ },
393
+ };
394
+ break;
395
+ }
396
+ case public_types_1.SolStakingTypeEnum.NATIVE: {
397
+ (0, assert_1.default)(isNativeStakingInstructions(stakingInstructions));
398
+ const { create, initialize, delegate } = stakingInstructions;
399
+ stakingActivate = {
400
+ type: constants_1.InstructionBuilderTypes.StakingActivate,
401
+ params: {
402
+ stakingType,
403
+ fromAddress: create.fromPubkey.toString(),
404
+ stakingAddress: initialize.stakePubkey.toString(),
405
+ amount: create.lamports.toString(),
406
+ validator: delegate.votePubkey.toString(),
407
+ },
408
+ };
409
+ break;
410
+ }
411
+ default: {
412
+ const unreachable = stakingType;
413
+ throw new Error(`Unknown staking type ${unreachable}`);
414
+ }
415
+ }
416
+ instructionData.push(stakingActivate);
417
+ return instructionData;
418
+ }
419
+ /**
420
+ * Parses Solana instructions to create delegate tx
421
+ * Only supports Nonce, StakingDelegate
422
+ *
423
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
424
+ * @returns {InstructionParams[]} An array containing instruction params for staking delegate tx
425
+ */
426
+ function parseStakingDelegateInstructions(instructions) {
427
+ const instructionData = [];
428
+ for (const instruction of instructions) {
429
+ const type = (0, utils_1.getInstructionType)(instruction);
430
+ switch (type) {
431
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
432
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
433
+ const nonce = {
434
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
435
+ params: {
436
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
437
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
438
+ },
439
+ };
440
+ instructionData.push(nonce);
441
+ break;
442
+ case constants_1.ValidInstructionTypesEnum.StakingDelegate:
443
+ const stakingDelegateParams = web3_js_1.StakeInstruction.decodeDelegate(instruction);
444
+ const stakingDelegate = {
445
+ type: constants_1.InstructionBuilderTypes.StakingDelegate,
446
+ params: {
447
+ fromAddress: stakingDelegateParams.authorizedPubkey.toString() || '',
448
+ stakingAddress: stakingDelegateParams.stakePubkey.toString() || '',
449
+ validator: stakingDelegateParams.votePubkey.toString() || '',
450
+ },
451
+ };
452
+ instructionData.push(stakingDelegate);
453
+ break;
454
+ }
455
+ }
456
+ return instructionData;
457
+ }
458
+ function validateStakingInstructions(stakingInstructions) {
459
+ if (stakingInstructions.delegate === undefined && stakingInstructions.depositSol !== undefined) {
460
+ return;
461
+ }
462
+ if (!stakingInstructions.create) {
463
+ throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing create stake account instruction');
464
+ }
465
+ if (!stakingInstructions.delegate && !stakingInstructions.initialize) {
466
+ throw new sdk_core_1.NotSupported('Invalid staking activate transaction, missing initialize stake account/delegate instruction');
467
+ }
468
+ }
469
+ function isJitoUnstakingInstructions(ui) {
470
+ return ui.withdrawStake !== undefined && ui.deactivate !== undefined;
471
+ }
472
+ function isMarinadeUnstakingInstructions(ui) {
473
+ return ui.transfer !== undefined && ui.deactivate === undefined;
474
+ }
475
+ function isNativeUnstakingInstructions(ui) {
476
+ return ui.withdrawStake === undefined && ui.deactivate !== undefined;
477
+ }
478
+ function getStakingTypeFromUnstakingInstructions(ui) {
479
+ const isJito = isJitoUnstakingInstructions(ui);
480
+ const isMarinade = isMarinadeUnstakingInstructions(ui);
481
+ const isNative = isNativeUnstakingInstructions(ui);
482
+ (0, assert_1.default)([isJito, isMarinade, isNative].filter((x) => x).length === 1, 'StakingType is ambiguous');
483
+ if (isJito)
484
+ return public_types_1.SolStakingTypeEnum.JITO;
485
+ if (isMarinade)
486
+ return public_types_1.SolStakingTypeEnum.MARINADE;
487
+ if (isNative)
488
+ return public_types_1.SolStakingTypeEnum.NATIVE;
489
+ (0, assert_1.default)(false, 'No StakingType found');
490
+ }
491
+ /**
492
+ * Parses Solana instructions to create deactivate stake tx instructions params. Supports full stake
493
+ * account deactivation and partial stake account deactivation.
494
+ *
495
+ * When partially deactivating a stake account this method expects the following instructions: Allocate,
496
+ * to allocate a new staking account, Assign, to assign the newly created staking account to the
497
+ * Stake Program, Split, to split the current stake account, and StakingDeactivate to deactivate the
498
+ * newly created stake account.
499
+ *
500
+ * Supports Nonce, StakingDeactivate, Memo, Allocate, Assign, and Split Solana instructions.
501
+ *
502
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
503
+ * @returns {InstructionParams[]} An array containing instruction params for staking deactivate tx
504
+ */
505
+ function parseStakingDeactivateInstructions(instructions, coinName) {
506
+ const instructionData = [];
507
+ const unstakingInstructions = [];
508
+ for (const instruction of instructions) {
509
+ const type = (0, utils_1.getInstructionType)(instruction);
510
+ switch (type) {
511
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
512
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
513
+ const nonce = {
514
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
515
+ params: {
516
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
517
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
518
+ },
519
+ };
520
+ instructionData.push(nonce);
521
+ break;
522
+ case constants_1.ValidInstructionTypesEnum.Memo:
523
+ const memo = {
524
+ type: constants_1.InstructionBuilderTypes.Memo,
525
+ params: { memo: instruction.data.toString() },
526
+ };
527
+ instructionData.push(memo);
528
+ break;
529
+ case constants_1.ValidInstructionTypesEnum.Allocate:
530
+ if (unstakingInstructions.length > 0 &&
531
+ unstakingInstructions[unstakingInstructions.length - 1].allocate === undefined) {
532
+ unstakingInstructions[unstakingInstructions.length - 1].allocate =
533
+ web3_js_1.SystemInstruction.decodeAllocate(instruction);
534
+ }
535
+ else {
536
+ unstakingInstructions.push({
537
+ allocate: web3_js_1.SystemInstruction.decodeAllocate(instruction),
538
+ });
539
+ }
540
+ break;
541
+ case constants_1.ValidInstructionTypesEnum.Assign:
542
+ if (unstakingInstructions.length > 0 &&
543
+ unstakingInstructions[unstakingInstructions.length - 1].assign === undefined) {
544
+ unstakingInstructions[unstakingInstructions.length - 1].assign = web3_js_1.SystemInstruction.decodeAssign(instruction);
545
+ }
546
+ else {
547
+ unstakingInstructions.push({
548
+ assign: web3_js_1.SystemInstruction.decodeAssign(instruction),
549
+ });
550
+ }
551
+ break;
552
+ case constants_1.ValidInstructionTypesEnum.Split:
553
+ if (unstakingInstructions.length > 0 &&
554
+ unstakingInstructions[unstakingInstructions.length - 1].split === undefined) {
555
+ unstakingInstructions[unstakingInstructions.length - 1].split = web3_js_1.StakeInstruction.decodeSplit(instruction);
556
+ }
557
+ else {
558
+ unstakingInstructions.push({
559
+ split: web3_js_1.StakeInstruction.decodeSplit(instruction),
560
+ });
561
+ }
562
+ break;
563
+ case constants_1.ValidInstructionTypesEnum.StakingDeactivate:
564
+ if (unstakingInstructions.length > 0 &&
565
+ unstakingInstructions[unstakingInstructions.length - 1].deactivate === undefined) {
566
+ unstakingInstructions[unstakingInstructions.length - 1].deactivate =
567
+ web3_js_1.StakeInstruction.decodeDeactivate(instruction);
568
+ }
569
+ else {
570
+ unstakingInstructions.push({
571
+ deactivate: web3_js_1.StakeInstruction.decodeDeactivate(instruction),
572
+ });
573
+ }
574
+ break;
575
+ case constants_1.ValidInstructionTypesEnum.Transfer:
576
+ if (unstakingInstructions.length > 0 &&
577
+ unstakingInstructions[unstakingInstructions.length - 1].transfer === undefined) {
578
+ unstakingInstructions[unstakingInstructions.length - 1].transfer =
579
+ web3_js_1.SystemInstruction.decodeTransfer(instruction);
580
+ }
581
+ else {
582
+ unstakingInstructions.push({
583
+ transfer: web3_js_1.SystemInstruction.decodeTransfer(instruction),
584
+ });
585
+ }
586
+ break;
587
+ case constants_1.ValidInstructionTypesEnum.WithdrawStake:
588
+ if (unstakingInstructions.length > 0 &&
589
+ unstakingInstructions[unstakingInstructions.length - 1].withdrawStake === undefined) {
590
+ unstakingInstructions[unstakingInstructions.length - 1].withdrawStake = (0, jitoStakePoolOperations_1.decodeWithdrawStake)(instruction);
591
+ }
592
+ else {
593
+ unstakingInstructions.push({
594
+ withdrawStake: (0, jitoStakePoolOperations_1.decodeWithdrawStake)(instruction),
595
+ });
596
+ }
597
+ break;
598
+ }
599
+ }
600
+ for (const unstakingInstruction of unstakingInstructions) {
601
+ validateUnstakingInstructions(unstakingInstruction);
602
+ const stakingType = getStakingTypeFromUnstakingInstructions(unstakingInstruction);
603
+ let stakingDeactivate;
604
+ switch (stakingType) {
605
+ case public_types_1.SolStakingTypeEnum.JITO: {
606
+ (0, assert_1.default)(isJitoUnstakingInstructions(unstakingInstruction));
607
+ const { withdrawStake } = unstakingInstruction;
608
+ stakingDeactivate = {
609
+ type: constants_1.InstructionBuilderTypes.StakingDeactivate,
610
+ params: {
611
+ stakingType,
612
+ fromAddress: withdrawStake.destinationStakeAuthority.toString(),
613
+ stakingAddress: withdrawStake.stakePool.toString(),
614
+ amount: withdrawStake.poolTokens.toString(),
615
+ unstakingAddress: withdrawStake.destinationStake.toString(),
616
+ extraParams: {
617
+ stakePoolData: {
618
+ managerFeeAccount: withdrawStake.managerFeeAccount.toString(),
619
+ poolMint: withdrawStake.poolMint.toString(),
620
+ validatorListAccount: withdrawStake.validatorList.toString(),
621
+ },
622
+ validatorAddress: withdrawStake.validatorStake.toString(),
623
+ transferAuthorityAddress: withdrawStake.sourceTransferAuthority.toString(),
624
+ },
625
+ },
626
+ };
627
+ break;
628
+ }
629
+ case public_types_1.SolStakingTypeEnum.MARINADE: {
630
+ (0, assert_1.default)(isMarinadeUnstakingInstructions(unstakingInstruction));
631
+ const { transfer } = unstakingInstruction;
632
+ stakingDeactivate = {
633
+ type: constants_1.InstructionBuilderTypes.StakingDeactivate,
634
+ params: {
635
+ stakingType,
636
+ fromAddress: '',
637
+ stakingAddress: '',
638
+ recipients: [
639
+ {
640
+ address: transfer.toPubkey.toString() || '',
641
+ amount: transfer.lamports.toString() || '',
642
+ },
643
+ ],
644
+ },
645
+ };
646
+ break;
647
+ }
648
+ case public_types_1.SolStakingTypeEnum.NATIVE: {
649
+ (0, assert_1.default)(isNativeUnstakingInstructions(unstakingInstruction));
650
+ const { deactivate, split } = unstakingInstruction;
651
+ stakingDeactivate = {
652
+ type: constants_1.InstructionBuilderTypes.StakingDeactivate,
653
+ params: {
654
+ stakingType,
655
+ fromAddress: deactivate.authorizedPubkey.toString() || '',
656
+ stakingAddress: split?.stakePubkey.toString() || deactivate.stakePubkey.toString(),
657
+ amount: split?.lamports.toString(),
658
+ unstakingAddress: split?.splitStakePubkey.toString(),
659
+ },
660
+ };
661
+ break;
662
+ }
663
+ default: {
664
+ const unreachable = stakingType;
665
+ throw new Error(`Unknown staking type ${unreachable}`);
666
+ }
667
+ }
668
+ instructionData.push(stakingDeactivate);
669
+ }
670
+ return instructionData;
671
+ }
672
+ function validateUnstakingInstructions(unstakingInstructions) {
673
+ // Cases where exactly one field should be present
674
+ const unstakingInstructionsKeys = [
675
+ 'allocate',
676
+ 'assign',
677
+ 'split',
678
+ 'deactivate',
679
+ 'transfer',
680
+ ];
681
+ if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'transfer'))) {
682
+ return;
683
+ }
684
+ if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'withdrawStake'))) {
685
+ return;
686
+ }
687
+ if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'deactivate'))) {
688
+ return;
689
+ }
690
+ // Cases where deactivate field must be present with another field
691
+ if (!unstakingInstructions.deactivate) {
692
+ throw new sdk_core_1.NotSupported('Invalid deactivate stake transaction, missing deactivate stake account instruction');
693
+ }
694
+ // This is a stake pool instruction, not a partial unstake
695
+ if (unstakingInstructions.withdrawStake) {
696
+ return;
697
+ }
698
+ if (!unstakingInstructions.allocate) {
699
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing allocate unstake account instruction');
700
+ }
701
+ else if (!unstakingInstructions.assign) {
702
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing assign unstake account instruction');
703
+ }
704
+ else if (!unstakingInstructions.split) {
705
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing split stake account instruction');
706
+ }
707
+ else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.assign.accountPubkey.toString()) {
708
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, must allocate and assign the same public key');
709
+ }
710
+ else if (unstakingInstructions.allocate.space !== web3_js_1.StakeProgram.space) {
711
+ throw new sdk_core_1.NotSupported(`Invalid partial deactivate stake transaction, unstaking account must allocate ${web3_js_1.StakeProgram.space} bytes`);
712
+ }
713
+ else if (unstakingInstructions.assign.programId.toString() !== web3_js_1.StakeProgram.programId.toString()) {
714
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, the unstake account must be assigned to the Stake Program');
715
+ }
716
+ else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.split.splitStakePubkey.toString()) {
717
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, must allocate the unstaking account');
718
+ }
719
+ else if (unstakingInstructions.split.stakePubkey.toString() === unstakingInstructions.split.splitStakePubkey.toString()) {
720
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, the unstaking account must be different from the Stake Account');
721
+ }
722
+ else if (!unstakingInstructions.transfer) {
723
+ throw new sdk_core_1.NotSupported('Invalid partial deactivate stake transaction, missing funding of unstake address instruction');
724
+ }
725
+ }
726
+ /**
727
+ * Parses Solana instructions to create staking withdraw tx instructions params
728
+ * Only supports Nonce, StakingWithdraw, and Memo Solana instructions
729
+ *
730
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
731
+ * @returns {InstructionParams[]} An array containing instruction params for staking withdraw tx
732
+ */
733
+ function parseStakingWithdrawInstructions(instructions) {
734
+ const instructionData = [];
735
+ for (const instruction of instructions) {
736
+ const type = (0, utils_1.getInstructionType)(instruction);
737
+ switch (type) {
738
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
739
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
740
+ const nonce = {
741
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
742
+ params: {
743
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
744
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
745
+ },
746
+ };
747
+ instructionData.push(nonce);
748
+ break;
749
+ case constants_1.ValidInstructionTypesEnum.Memo:
750
+ const memo = {
751
+ type: constants_1.InstructionBuilderTypes.Memo,
752
+ params: { memo: instruction.data.toString() },
753
+ };
754
+ instructionData.push(memo);
755
+ break;
756
+ case constants_1.ValidInstructionTypesEnum.StakingWithdraw:
757
+ const withdrawInstruction = web3_js_1.StakeInstruction.decodeWithdraw(instruction);
758
+ const stakingWithdraw = {
759
+ type: constants_1.InstructionBuilderTypes.StakingWithdraw,
760
+ params: {
761
+ fromAddress: withdrawInstruction.authorizedPubkey.toString(),
762
+ stakingAddress: withdrawInstruction.stakePubkey.toString(),
763
+ amount: withdrawInstruction.lamports.toString(),
764
+ },
765
+ };
766
+ instructionData.push(stakingWithdraw);
767
+ break;
768
+ }
769
+ }
770
+ return instructionData;
771
+ }
772
+ /**
773
+ * Get the memo object from instructions if it exists
774
+ *
775
+ * @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
776
+ * @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
777
+ * @returns {Memo | undefined} - memo object or undefined
778
+ */
779
+ function getMemo(instructions, instructionIndexes) {
780
+ const instructionsLength = Object.keys(instructionIndexes).length;
781
+ if (instructions.length === instructionsLength && instructions[instructionIndexes.Memo]) {
782
+ return {
783
+ type: constants_1.InstructionBuilderTypes.Memo,
784
+ params: { memo: instructions[instructionIndexes.Memo].data.toString() },
785
+ };
786
+ }
787
+ }
788
+ const ataInitInstructionKeysIndexes = {
789
+ PayerAddress: 0,
790
+ ATAAddress: 1,
791
+ OwnerAddress: 2,
792
+ MintAddress: 3,
793
+ };
794
+ const closeAtaInstructionKeysIndexes = {
795
+ AccountAddress: 0,
796
+ DestinationAddress: 1,
797
+ AuthorityAddress: 2,
798
+ };
799
+ /**
800
+ * Parses Solana instructions to initialize associated token account tx instructions params
801
+ *
802
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
803
+ * @returns {InstructionParams[]} An array containing instruction params for Send tx
804
+ */
805
+ function parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
806
+ const instructionData = [];
807
+ let memo;
808
+ for (const instruction of instructions) {
809
+ const type = (0, utils_1.getInstructionType)(instruction);
810
+ switch (type) {
811
+ case constants_1.ValidInstructionTypesEnum.Memo:
812
+ memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
813
+ break;
814
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
815
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
816
+ const nonce = {
817
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
818
+ params: {
819
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
820
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
821
+ },
822
+ };
823
+ instructionData.push(nonce);
824
+ break;
825
+ case constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
826
+ const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
827
+ const tokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
828
+ let programID;
829
+ if (instruction.programId) {
830
+ programID = instruction.programId.toString();
831
+ }
832
+ const ataInit = {
833
+ type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
834
+ params: {
835
+ mintAddress,
836
+ ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
837
+ ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
838
+ payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
839
+ tokenName,
840
+ programId: programID,
841
+ },
842
+ };
843
+ instructionData.push(ataInit);
844
+ break;
845
+ case constants_1.ValidInstructionTypesEnum.DepositSol:
846
+ // AtaInit is a part of spl-stake-pool's depositSol process
847
+ break;
848
+ default:
849
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
850
+ }
851
+ }
852
+ if (memo) {
853
+ instructionData.push(memo);
854
+ }
855
+ return instructionData;
856
+ }
857
+ const ataCloseInstructionKeysIndexes = {
858
+ AccountAddress: 0,
859
+ DestinationAddress: 1,
860
+ AuthorityAddress: 2,
861
+ };
862
+ /**
863
+ * Parses Solana instructions to close associated token account tx instructions params
864
+ *
865
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
866
+ * @returns {InstructionParams[]} An array containing instruction params for Send tx
867
+ */
868
+ function parseAtaCloseInstructions(instructions) {
869
+ const instructionData = [];
870
+ for (const instruction of instructions) {
871
+ const type = (0, utils_1.getInstructionType)(instruction);
872
+ switch (type) {
873
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
874
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
875
+ const nonce = {
876
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
877
+ params: {
878
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
879
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
880
+ },
881
+ };
882
+ instructionData.push(nonce);
883
+ break;
884
+ case constants_1.ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
885
+ const ataClose = {
886
+ type: constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount,
887
+ params: {
888
+ accountAddress: instruction.keys[ataCloseInstructionKeysIndexes.AccountAddress].pubkey.toString(),
889
+ destinationAddress: instruction.keys[ataCloseInstructionKeysIndexes.DestinationAddress].pubkey.toString(),
890
+ authorityAddress: instruction.keys[ataCloseInstructionKeysIndexes.AuthorityAddress].pubkey.toString(),
891
+ },
892
+ };
893
+ instructionData.push(ataClose);
894
+ break;
895
+ default:
896
+ throw new sdk_core_1.NotSupported('Invalid transaction, instruction type not supported: ' + (0, utils_1.getInstructionType)(instruction));
897
+ }
898
+ }
899
+ return instructionData;
900
+ }
901
+ /**
902
+ * Parses Solana instructions to authorized staking account params
903
+ * Only supports Nonce, Authorize instructions
904
+ *
905
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
906
+ * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
907
+ */
908
+ function parseStakingAuthorizeInstructions(instructions) {
909
+ const instructionData = [];
910
+ for (const instruction of instructions) {
911
+ const type = (0, utils_1.getInstructionType)(instruction);
912
+ switch (type) {
913
+ case constants_1.ValidInstructionTypesEnum.AdvanceNonceAccount:
914
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instruction);
915
+ const nonce = {
916
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
917
+ params: {
918
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
919
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
920
+ },
921
+ };
922
+ instructionData.push(nonce);
923
+ break;
924
+ case constants_1.ValidInstructionTypesEnum.Memo:
925
+ const memo = { type: constants_1.InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
926
+ instructionData.push(memo);
927
+ break;
928
+ case constants_1.ValidInstructionTypesEnum.Authorize:
929
+ const authorize = web3_js_1.StakeInstruction.decodeAuthorize(instruction);
930
+ instructionData.push({
931
+ type: constants_1.InstructionBuilderTypes.StakingAuthorize,
932
+ params: {
933
+ stakingAddress: authorize.stakePubkey.toString(),
934
+ oldAuthorizeAddress: authorize.authorizedPubkey.toString(),
935
+ newAuthorizeAddress: authorize.newAuthorizedPubkey.toString(),
936
+ newWithdrawAddress: authorize.custodianPubkey?.toString() || '',
937
+ },
938
+ });
939
+ break;
940
+ }
941
+ }
942
+ return instructionData;
943
+ }
944
+ /**
945
+ * Parses Solana instructions to authorized staking account params
946
+ * Only supports Nonce, Authorize instructions
947
+ *
948
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
949
+ * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
950
+ */
951
+ function parseStakingAuthorizeRawInstructions(instructions) {
952
+ const instructionData = [];
953
+ (0, assert_1.default)(instructions.length === 2, 'Invalid number of instructions');
954
+ const advanceNonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instructions[0]);
955
+ const nonce = {
956
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
957
+ params: {
958
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
959
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
960
+ },
961
+ };
962
+ instructionData.push(nonce);
963
+ const authorize = instructions[1];
964
+ (0, assert_1.default)(authorize.keys.length === 5, 'Invalid number of keys in authorize instruction');
965
+ instructionData.push({
966
+ type: constants_1.InstructionBuilderTypes.StakingAuthorize,
967
+ params: {
968
+ stakingAddress: authorize.keys[0].pubkey.toString(),
969
+ oldAuthorizeAddress: authorize.keys[2].pubkey.toString(),
970
+ newAuthorizeAddress: authorize.keys[3].pubkey.toString(),
971
+ custodianAddress: authorize.keys[4].pubkey.toString(),
972
+ },
973
+ });
974
+ return instructionData;
975
+ }
976
+ /**
977
+ * Parses Solana instructions to custom instruction params
978
+ *
979
+ * @param {TransactionInstruction[]} instructions - containing custom solana instructions
980
+ * @param {InstructionParams[]} instructionMetadata - the instruction metadata for the transaction
981
+ * @returns {InstructionParams[]} An array containing instruction params for custom instructions
982
+ */
983
+ function parseCustomInstructions(instructions, instructionMetadata) {
984
+ const instructionData = [];
985
+ for (let i = 0; i < instructions.length; i++) {
986
+ const instruction = instructions[i];
987
+ // Check if we have metadata for this instruction position
988
+ if (instructionMetadata &&
989
+ instructionMetadata[i] &&
990
+ instructionMetadata[i].type === constants_1.InstructionBuilderTypes.CustomInstruction) {
991
+ instructionData.push(instructionMetadata[i]);
992
+ }
993
+ else {
994
+ // Convert the raw instruction to CustomInstruction format
995
+ const customInstruction = {
996
+ type: constants_1.InstructionBuilderTypes.CustomInstruction,
997
+ params: {
998
+ programId: instruction.programId.toString(),
999
+ keys: instruction.keys.map((key) => ({
1000
+ pubkey: key.pubkey.toString(),
1001
+ isSigner: key.isSigner,
1002
+ isWritable: key.isWritable,
1003
+ })),
1004
+ data: instruction.data.toString('base64'),
1005
+ },
1006
+ };
1007
+ instructionData.push(customInstruction);
1008
+ }
1009
+ }
1010
+ return instructionData;
1011
+ }
1012
+ function findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName) {
1013
+ let token;
1014
+ statics_1.coins.forEach((value, key) => {
1015
+ if (value instanceof statics_1.SolCoin && value.tokenAddress === mintAddress) {
1016
+ token = value.name;
1017
+ }
1018
+ });
1019
+ if (!token && instructionMetadata) {
1020
+ instructionMetadata.forEach((instruction) => {
1021
+ if (instruction.type === constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount &&
1022
+ instruction.params.mintAddress === mintAddress) {
1023
+ token = instruction.params.tokenName;
1024
+ }
1025
+ else if (instruction.type === constants_1.InstructionBuilderTypes.TokenTransfer &&
1026
+ instruction.params.tokenAddress === mintAddress) {
1027
+ token = instruction.params.tokenName;
1028
+ }
1029
+ });
1030
+ }
1031
+ if (!token && _useTokenAddressTokenName) {
1032
+ token = mintAddress;
1033
+ }
1034
+ (0, assert_1.default)(token);
1035
+ return token;
1036
+ }
1037
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUErREEsNERBaUNDO0FBeW5DRCxzQ0FvQ0M7QUE3dkNELGlEQVMyQjtBQUMzQiw2Q0FjeUI7QUFFekIsc0RBQXlEO0FBQ3pELG1EQUFxRTtBQUNyRSxpREFBcUQ7QUFDckQsb0RBQTRCO0FBQzVCLDJDQUErRztBQXNCL0csbUNBQTZDO0FBRTdDLHVFQUFrRjtBQUVsRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FDdEMsSUFBcUIsRUFDckIsWUFBc0MsRUFDdEMsUUFBaUIsRUFDakIsbUJBQXlDLEVBQ3pDLHlCQUFtQztJQUVuQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSywwQkFBZSxDQUFDLG9CQUFvQjtZQUN2QyxPQUFPLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELEtBQUssMEJBQWUsQ0FBQyxJQUFJO1lBQ3ZCLE9BQU8scUJBQXFCLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDN0YsS0FBSywwQkFBZSxDQUFDLGVBQWU7WUFDbEMsT0FBTyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxLQUFLLDBCQUFlLENBQUMsaUJBQWlCO1lBQ3BDLE9BQU8sa0NBQWtDLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssMEJBQWUsQ0FBQyxlQUFlO1lBQ2xDLE9BQU8sZ0NBQWdDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsS0FBSywwQkFBZSxDQUFDLG9DQUFvQztZQUN2RCxPQUFPLHdCQUF3QixDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hHLEtBQUssMEJBQWUsQ0FBQywy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RUQsSUFBSSxDQUFDLEtBQUssSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1FBQ3hDLEtBQUssR0FBRyxXQUFXLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUEsZ0JBQU0sRUFBQyxLQUFLLENBQUMsQ0FBQztJQUVkLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlY29kZWRUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbixcbiAgZGVjb2RlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24sXG4gIERlY29kZWRCdXJuSW5zdHJ1Y3Rpb24sXG4gIGRlY29kZUJ1cm5JbnN0cnVjdGlvbixcbiAgRGVjb2RlZE1pbnRUb0luc3RydWN0aW9uLFxuICBkZWNvZGVNaW50VG9JbnN0cnVjdGlvbixcbiAgVE9LRU5fMjAyMl9QUk9HUkFNX0lELFxuICBkZWNvZGVBcHByb3ZlSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvc3BsLXRva2VuJztcbmltcG9ydCB7XG4gIEFsbG9jYXRlUGFyYW1zLFxuICBBc3NpZ25QYXJhbXMsXG4gIENyZWF0ZUFjY291bnRQYXJhbXMsXG4gIERlYWN0aXZhdGVTdGFrZVBhcmFtcyxcbiAgRGVjb2RlZFRyYW5zZmVySW5zdHJ1Y3Rpb24sXG4gIERlbGVnYXRlU3Rha2VQYXJhbXMsXG4gIEluaXRpYWxpemVTdGFrZVBhcmFtcyxcbiAgU3BsaXRTdGFrZVBhcmFtcyxcbiAgU3Rha2VJbnN0cnVjdGlvbixcbiAgU3Rha2VQcm9ncmFtLFxuICBTeXN0ZW1JbnN0cnVjdGlvbixcbiAgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbixcbiAgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuXG5pbXBvcnQgeyBTb2xTdGFraW5nVHlwZUVudW0gfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IE5vdFN1cHBvcnRlZCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIFNvbENvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLCBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQXRhQ2xvc2UsXG4gIEF0YUluaXQsXG4gIEJ1cm4sXG4gIEluc3RydWN0aW9uUGFyYW1zLFxuICBNZW1vLFxuICBNaW50VG8sXG4gIE5vbmNlLFxuICBTdGFraW5nQWN0aXZhdGUsXG4gIFN0YWtpbmdBdXRob3JpemUsXG4gIFN0YWtpbmdEZWFjdGl2YXRlLFxuICBTdGFraW5nRGVsZWdhdGUsXG4gIFN0YWtpbmdXaXRoZHJhdyxcbiAgVG9rZW5UcmFuc2ZlcixcbiAgVHJhbnNmZXIsXG4gIFdhbGxldEluaXQsXG4gIFNldENvbXB1dGVVbml0TGltaXQsXG4gIFNldFByaW9yaXR5RmVlLFxuICBDdXN0b21JbnN0cnVjdGlvbixcbiAgQXBwcm92ZSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBnZXRJbnN0cnVjdGlvblR5cGUgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IERlcG9zaXRTb2xQYXJhbXMsIFdpdGhkcmF3U3Rha2VQYXJhbXMgfSBmcm9tICdAc29sYW5hL3NwbC1zdGFrZS1wb29sJztcbmltcG9ydCB7IGRlY29kZURlcG9zaXRTb2wsIGRlY29kZVdpdGhkcmF3U3Rha2UgfSBmcm9tICcuL2ppdG9TdGFrZVBvb2xPcGVyYXRpb25zJztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgaW5zdHJ1Y3Rpb25zIHBhcmFtcyBmcm9tIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHlwZSAtIHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gc29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoXG4gIHR5cGU6IFRyYW5zYWN0aW9uVHlwZSxcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGNvaW5OYW1lPzogc3RyaW5nLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXSxcbiAgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZT86IGJvb2xlYW5cbik6IEluc3RydWN0aW9uUGFyYW1zW10ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZVdhbGxldEluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgcmV0dXJuIHBhcnNlU2VuZEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0RlYWN0aXZhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBjb2luTmFtZSk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uOlxuICAgICAgcmV0dXJuIHBhcnNlQXRhSW5pdEluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgIHJldHVybiBwYXJzZUF0YUNsb3NlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplUmF3OlxuICAgICAgcmV0dXJuIHBhcnNlU3Rha2luZ0F1dGhvcml6ZVJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdEZWxlZ2F0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4OlxuICAgICAgcmV0dXJuIHBhcnNlQ3VzdG9tSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgaW5zdHJ1Y3Rpb25NZXRhZGF0YSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgdHJhbnNhY3Rpb24sIHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIHR5cGUpO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gV2FsbGV0IGluaXRpYWxpemF0aW9uIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBjcmVhdGUgYW5kIGluaXRpYWxpemUgbm9uY2Ugc29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8V2FsbGV0SW5pdCB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4gPSBbXTtcbiAgY29uc3QgY3JlYXRlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVDcmVhdGVBY2NvdW50KGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkNyZWF0ZV0pO1xuICBjb25zdCBub25jZUluaXRJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlSW5pdGlhbGl6ZShcbiAgICBpbnN0cnVjdGlvbnNbd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcy5Jbml0aWFsaXplTm9uY2VBY2NvdW50XVxuICApO1xuXG4gIGNvbnN0IHdhbGxldEluaXQ6IFdhbGxldEluaXQgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50LFxuICAgIHBhcmFtczoge1xuICAgICAgZnJvbUFkZHJlc3M6IGNyZWF0ZUluc3RydWN0aW9uLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG5vbmNlQWRkcmVzczogbm9uY2VJbml0SW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhbW91bnQ6IGNyZWF0ZUluc3RydWN0aW9uLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2god2FsbGV0SW5pdCk7XG5cbiAgY29uc3QgbWVtbyA9IGdldE1lbW8oaW5zdHJ1Y3Rpb25zLCB3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzKTtcbiAgaWYgKG1lbW8pIHtcbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gU2VuZCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE1lbW8sIFRyYW5zZmVyIGFuZCBBZHZhbmNlIE5vbmNlIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXSxcbiAgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZT86IGJvb2xlYW5cbik6IEFycmF5PFxuICB8IE5vbmNlXG4gIHwgTWVtb1xuICB8IFRyYW5zZmVyXG4gIHwgVG9rZW5UcmFuc2ZlclxuICB8IEF0YUluaXRcbiAgfCBBdGFDbG9zZVxuICB8IFNldENvbXB1dGVVbml0TGltaXRcbiAgfCBTZXRQcmlvcml0eUZlZVxuICB8IE1pbnRUb1xuICB8IEJ1cm5cbiAgfCBBcHByb3ZlXG4+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxcbiAgICB8IE5vbmNlXG4gICAgfCBNZW1vXG4gICAgfCBUcmFuc2ZlclxuICAgIHwgVG9rZW5UcmFuc2ZlclxuICAgIHwgQXRhSW5pdFxuICAgIHwgQXRhQ2xvc2VcbiAgICB8IFNldENvbXB1dGVVbml0TGltaXRcbiAgICB8IFNldFByaW9yaXR5RmVlXG4gICAgfCBNaW50VG9cbiAgICB8IEJ1cm5cbiAgICB8IEFwcHJvdmVcbiAgPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCB0cmFuc2ZlcjogVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24udG9QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgbGV0IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbjogRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgICAgICAgdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uID0gZGVjb2RlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbiA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKGluc3RydWN0aW9uLCBUT0tFTl8yMDIyX1BST0dSQU1fSUQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRva2VuQWRkcmVzcyA9IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUodG9rZW5BZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JREZvclRva2VuVHJhbnNmZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JREZvclRva2VuVHJhbnNmZXIgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlblRyYW5zZmVyOiBUb2tlblRyYW5zZmVyID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLmtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLmRlc3RpbmF0aW9uLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5rZXlzLnNvdXJjZS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSURGb3JUb2tlblRyYW5zZmVyLFxuICAgICAgICAgICAgZGVjaW1hbFBsYWNlczogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLmRhdGEuZGVjaW1hbHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2godG9rZW5UcmFuc2Zlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFwcHJvdmU6XG4gICAgICAgIGNvbnN0IHByb2dyYW1JZCA9IGluc3RydWN0aW9uLnByb2dyYW1JZC5lcXVhbHMoVE9LRU5fMjAyMl9QUk9HUkFNX0lEKSA/IFRPS0VOXzIwMjJfUFJPR1JBTV9JRCA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgYXBwcm92ZUluc3RydWN0aW9uID0gZGVjb2RlQXBwcm92ZUluc3RydWN0aW9uKGluc3RydWN0aW9uLCBwcm9ncmFtSWQpO1xuICAgICAgICBjb25zdCBhcHByb3ZlOiBBcHByb3ZlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkFwcHJvdmUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzczogYXBwcm92ZUluc3RydWN0aW9uLmtleXMuYWNjb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVsZWdhdGVBZGRyZXNzOiBhcHByb3ZlSW5zdHJ1Y3Rpb24ua2V5cy5kZWxlZ2F0ZS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBhcHByb3ZlSW5zdHJ1Y3Rpb24ua2V5cy5vd25lci50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBhcHByb3ZlSW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlkICYmIHByb2dyYW1JZC50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGFwcHJvdmUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgbWludEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgbWludFRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3MsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlEOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSUQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGF0YUluaXQ6IEF0YUluaXQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgICAgYXRhQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BVEFBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5Pd25lckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLlBheWVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IG1pbnRUb2tlbk5hbWUsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JRCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFJbml0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBhY2NvdW50QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzLkFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID1cbiAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2Nsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBhdXRob3JpdHlBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1tjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMuQXV0aG9yaXR5QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgY29uc3QgYXRhQ2xvc2U6IEF0YUNsb3NlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFDbG9zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNldENvbXB1dGVVbml0TGltaXQ6XG4gICAgICAgIGNvbnN0IHNldENvbXB1dGVVbml0TGltaXRQYXJhbXMgPSBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24uZGVjb2RlU2V0Q29tcHV0ZVVuaXRMaW1pdChpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHNldENvbXB1dGVVbml0TGltaXQ6IFNldENvbXB1dGVVbml0TGltaXQgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0Q29tcHV0ZVVuaXRMaW1pdCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHVuaXRzOiBzZXRDb21wdXRlVW5pdExpbWl0UGFyYW1zLnVuaXRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHNldENvbXB1dGVVbml0TGltaXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRQcmlvcml0eUZlZTpcbiAgICAgICAgY29uc3Qgc2V0Q29tcHV0ZVVuaXRQcmljZVBhcmFtcyA9IENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbi5kZWNvZGVTZXRDb21wdXRlVW5pdFByaWNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc2V0UHJpb3JpdHlGZWU6IFNldFByaW9yaXR5RmVlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldFByaW9yaXR5RmVlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZmVlOiBzZXRDb21wdXRlVW5pdFByaWNlUGFyYW1zLm1pY3JvTGFtcG9ydHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc2V0UHJpb3JpdHlGZWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NaW50VG86XG4gICAgICAgIGxldCBtaW50VG9JbnN0cnVjdGlvbjogRGVjb2RlZE1pbnRUb0luc3RydWN0aW9uO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgICAgICAgbWludFRvSW5zdHJ1Y3Rpb24gPSBkZWNvZGVNaW50VG9JbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWludFRvSW5zdHJ1Y3Rpb24gPSBkZWNvZGVNaW50VG9JbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW50QWRkcmVzc0Zvck1pbnQgPSBtaW50VG9JbnN0cnVjdGlvbi5rZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZUZvck1pbnQgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzRm9yTWludCwgaW5zdHJ1Y3Rpb25NZXRhZGF0YSwgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSk7XG4gICAgICAgIGxldCBwcm9ncmFtSURGb3JNaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSURGb3JNaW50ID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWludFRvOiBNaW50VG8gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWludFRvLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3M6IG1pbnRBZGRyZXNzRm9yTWludCxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzczogbWludFRvSW5zdHJ1Y3Rpb24ua2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3M6IG1pbnRUb0luc3RydWN0aW9uLmtleXMuYXV0aG9yaXR5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBtaW50VG9JbnN0cnVjdGlvbi5kYXRhLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbk5hbWVGb3JNaW50LFxuICAgICAgICAgICAgZGVjaW1hbFBsYWNlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSURGb3JNaW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1pbnRUbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkJ1cm46XG4gICAgICAgIGxldCBidXJuSW5zdHJ1Y3Rpb246IERlY29kZWRCdXJuSW5zdHJ1Y3Rpb247XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSAhPT0gVE9LRU5fMjAyMl9QUk9HUkFNX0lELnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICBidXJuSW5zdHJ1Y3Rpb24gPSBkZWNvZGVCdXJuSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1cm5JbnN0cnVjdGlvbiA9IGRlY29kZUJ1cm5JbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW50QWRkcmVzc0ZvckJ1cm4gPSBidXJuSW5zdHJ1Y3Rpb24ua2V5cy5taW50LnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWVGb3JCdXJuID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzc0ZvckJ1cm4sIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlERm9yQnVybjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlERm9yQnVybiA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1cm46IEJ1cm4gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQnVybixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiBtaW50QWRkcmVzc0ZvckJ1cm4sXG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzczogYnVybkluc3RydWN0aW9uLmtleXMuYWNjb3VudC5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3M6IGJ1cm5JbnN0cnVjdGlvbi5rZXlzLm93bmVyLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBidXJuSW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lRm9yQnVybixcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yQnVybixcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChidXJuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbnR5cGUgU3Rha2luZ0luc3RydWN0aW9ucyA9IHtcbiAgZGVwb3NpdFNvbD86IERlcG9zaXRTb2xQYXJhbXM7XG4gIGNyZWF0ZT86IENyZWF0ZUFjY291bnRQYXJhbXM7XG4gIGluaXRpYWxpemU/OiBJbml0aWFsaXplU3Rha2VQYXJhbXM7XG4gIGRlbGVnYXRlPzogRGVsZWdhdGVTdGFrZVBhcmFtcztcbiAgaGFzQXRhSW5pdD86IGJvb2xlYW47XG59O1xuXG50eXBlIEppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgZGVwb3NpdFNvbDogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snZGVwb3NpdFNvbCddPjtcbn07XG5cbmZ1bmN0aW9uIGlzSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBzaSBpcyBKaXRvU3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiBzaS5kZXBvc2l0U29sICE9PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgY3JlYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydjcmVhdGUnXT47XG4gIGluaXRpYWxpemU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2luaXRpYWxpemUnXT47XG59O1xuXG5mdW5jdGlvbiBpc01hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyhzaTogU3Rha2luZ0luc3RydWN0aW9ucyk6IHNpIGlzIE1hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiBzaS5jcmVhdGUgIT09IHVuZGVmaW5lZCAmJiBzaS5pbml0aWFsaXplICE9PSB1bmRlZmluZWQgJiYgc2kuZGVsZWdhdGUgPT09IHVuZGVmaW5lZDtcbn1cblxudHlwZSBOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zID0gU3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgY3JlYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydjcmVhdGUnXT47XG4gIGluaXRpYWxpemU6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2luaXRpYWxpemUnXT47XG4gIGRlbGVnYXRlOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydkZWxlZ2F0ZSddPjtcbn07XG5cbmZ1bmN0aW9uIGlzTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyhzaTogU3Rha2luZ0luc3RydWN0aW9ucyk6IHNpIGlzIE5hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gc2kuY3JlYXRlICE9PSB1bmRlZmluZWQgJiYgc2kuaW5pdGlhbGl6ZSAhPT0gdW5kZWZpbmVkICYmIHNpLmRlbGVnYXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFN0YWtpbmdUeXBlRnJvbVN0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBTb2xTdGFraW5nVHlwZUVudW0ge1xuICBjb25zdCBpc0ppdG8gPSBpc0ppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zKHNpKTtcbiAgY29uc3QgaXNNYXJpbmFkZSA9IGlzTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHNpKTtcbiAgY29uc3QgaXNOYXRpdmUgPSBpc05hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc2kpO1xuICBhc3NlcnQoW2lzSml0bywgaXNNYXJpbmFkZSwgaXNOYXRpdmVdLmZpbHRlcigoeCkgPT4geCkubGVuZ3RoID09PSAxLCAnU3Rha2luZ1R5cGUgaXMgYW1iaWd1b3VzJyk7XG4gIGlmIChpc0ppdG8pIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uSklUTztcbiAgaWYgKGlzTWFyaW5hZGUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTUFSSU5BREU7XG4gIGlmIChpc05hdGl2ZSkgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU7XG4gIGFzc2VydChmYWxzZSwgJ05vIFN0YWtpbmdUeXBlIGZvdW5kJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgdHggYW5kIGRlbGVnYXRlIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdBY3RpdmF0ZSBhbmQgTWVtbyBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBY3RpdmF0ZSB8IE1lbW8gfCBBdGFJbml0PiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQWN0aXZhdGUgfCBNZW1vIHwgQXRhSW5pdD4gPSBbXTtcbiAgY29uc3Qgc3Rha2luZ0luc3RydWN0aW9ucyA9IHt9IGFzIFN0YWtpbmdJbnN0cnVjdGlvbnM7XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHsgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbywgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9IH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNyZWF0ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUgPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVDcmVhdGVBY2NvdW50KGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nSW5pdGlhbGl6ZTpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVJbml0aWFsaXplKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlbGVnYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5EZXBvc2l0U29sOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlcG9zaXRTb2wgPSBkZWNvZGVEZXBvc2l0U29sKGluc3RydWN0aW9uKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5oYXNBdGFJbml0ID0gdHJ1ZTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdGFBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLkFUQUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb3duZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwYXllckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuUGF5ZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogZmluZFRva2VuTmFtZShpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLk1pbnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKTtcbiAgY29uc3Qgc3Rha2luZ1R5cGUgPSBnZXRTdGFraW5nVHlwZUZyb21TdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpO1xuXG4gIGxldCBzdGFraW5nQWN0aXZhdGU6IFN0YWtpbmdBY3RpdmF0ZSB8IHVuZGVmaW5lZDtcblxuICBzd2l0Y2ggKHN0YWtpbmdUeXBlKSB7XG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uSklUTzoge1xuICAgICAgYXNzZXJ0KGlzSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucykpO1xuICAgICAgY29uc3QgeyBkZXBvc2l0U29sLCBoYXNBdGFJbml0IH0gPSBzdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICAgICAgc3Rha2luZ0FjdGl2YXRlID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBkZXBvc2l0U29sLmZ1bmRpbmdBY2NvdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGRlcG9zaXRTb2wuc3Rha2VQb29sLnRvU3RyaW5nKCksXG4gICAgICAgICAgYW1vdW50OiBkZXBvc2l0U29sLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgdmFsaWRhdG9yOiBkZXBvc2l0U29sLnN0YWtlUG9vbC50b1N0cmluZygpLFxuICAgICAgICAgIGV4dHJhUGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFrZVBvb2xEYXRhOiB7XG4gICAgICAgICAgICAgIG1hbmFnZXJGZWVBY2NvdW50OiBkZXBvc2l0U29sLm1hbmFnZXJGZWVBY2NvdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIHBvb2xNaW50OiBkZXBvc2l0U29sLnBvb2xNaW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIHJlc2VydmVTdGFrZTogZGVwb3NpdFNvbC5yZXNlcnZlU3Rha2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OiAhIWhhc0F0YUluaXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERToge1xuICAgICAgYXNzZXJ0KGlzTWFyaW5hZGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpKTtcbiAgICAgIGNvbnN0IHsgY3JlYXRlLCBpbml0aWFsaXplIH0gPSBzdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICAgICAgc3Rha2luZ0FjdGl2YXRlID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBjcmVhdGUuZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBpbml0aWFsaXplLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgYW1vdW50OiBjcmVhdGUubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB2YWxpZGF0b3I6IGluaXRpYWxpemUuYXV0aG9yaXplZC5zdGFrZXIudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU6IHtcbiAgICAgIGFzc2VydChpc05hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucykpO1xuICAgICAgY29uc3QgeyBjcmVhdGUsIGluaXRpYWxpemUsIGRlbGVnYXRlIH0gPSBzdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICAgICAgc3Rha2luZ0FjdGl2YXRlID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGUsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBjcmVhdGUuZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBpbml0aWFsaXplLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgYW1vdW50OiBjcmVhdGUubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICB2YWxpZGF0b3I6IGRlbGVnYXRlLnZvdGVQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCB1bnJlYWNoYWJsZTogbmV2ZXIgPSBzdGFraW5nVHlwZTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFraW5nIHR5cGUgJHt1bnJlYWNoYWJsZX1gKTtcbiAgICB9XG4gIH1cblxuICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nQWN0aXZhdGUpO1xuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBkZWxlZ2F0ZSB0eFxuICogT25seSBzdXBwb3J0cyBOb25jZSwgU3Rha2luZ0RlbGVnYXRlXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgZGVsZWdhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWxlZ2F0ZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlbGVnYXRlPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgY29uc3Qgc3Rha2luZ0RlbGVnYXRlUGFyYW1zID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHN0YWtpbmdEZWxlZ2F0ZTogU3Rha2luZ0RlbGVnYXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWxlZ2F0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcy5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgdmFsaWRhdG9yOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMudm90ZVB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdEZWxlZ2F0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9uczogU3Rha2luZ0luc3RydWN0aW9ucykge1xuICBpZiAoc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSA9PT0gdW5kZWZpbmVkICYmIHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVwb3NpdFNvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmNyZWF0ZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgc3Rha2luZyBhY3RpdmF0ZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBjcmVhdGUgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9XG5cbiAgaWYgKCFzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlICYmICFzdGFraW5nSW5zdHJ1Y3Rpb25zLmluaXRpYWxpemUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgc3Rha2luZyBhY3RpdmF0ZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBpbml0aWFsaXplIHN0YWtlIGFjY291bnQvZGVsZWdhdGUgaW5zdHJ1Y3Rpb24nXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIFVuc3Rha2luZ0luc3RydWN0aW9ucyA9IHtcbiAgYWxsb2NhdGU/OiBBbGxvY2F0ZVBhcmFtcztcbiAgYXNzaWduPzogQXNzaWduUGFyYW1zO1xuICBzcGxpdD86IFNwbGl0U3Rha2VQYXJhbXM7XG4gIGRlYWN0aXZhdGU/OiBEZWFjdGl2YXRlU3Rha2VQYXJhbXM7XG4gIHRyYW5zZmVyPzogRGVjb2RlZFRyYW5zZmVySW5zdHJ1Y3Rpb247XG4gIHdpdGhkcmF3U3Rha2U/OiBXaXRoZHJhd1N0YWtlUGFyYW1zO1xufTtcblxudHlwZSBKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zID0gVW5zdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICB3aXRoZHJhd1N0YWtlOiBOb25OdWxsYWJsZTxVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ3dpdGhkcmF3U3Rha2UnXT47XG59O1xuXG5mdW5jdGlvbiBpc0ppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnModWk6IFVuc3Rha2luZ0luc3RydWN0aW9ucyk6IHVpIGlzIEppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gdWkud2l0aGRyYXdTdGFrZSAhPT0gdW5kZWZpbmVkICYmIHVpLmRlYWN0aXZhdGUgIT09IHVuZGVmaW5lZDtcbn1cblxudHlwZSBNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyA9IFVuc3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgdHJhbnNmZXI6IE5vbk51bGxhYmxlPFVuc3Rha2luZ0luc3RydWN0aW9uc1sndHJhbnNmZXInXT47XG59O1xuXG5mdW5jdGlvbiBpc01hcmluYWRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiB1aSBpcyBNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyB7XG4gIHJldHVybiB1aS50cmFuc2ZlciAhPT0gdW5kZWZpbmVkICYmIHVpLmRlYWN0aXZhdGUgPT09IHVuZGVmaW5lZDtcbn1cblxudHlwZSBOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIGRlYWN0aXZhdGU6IE5vbk51bGxhYmxlPFVuc3Rha2luZ0luc3RydWN0aW9uc1snZGVhY3RpdmF0ZSddPjtcbiAgc3BsaXQ6IFVuc3Rha2luZ0luc3RydWN0aW9uc1snc3BsaXQnXTtcbn07XG5cbmZ1bmN0aW9uIGlzTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiB1aSBpcyBOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gdWkud2l0aGRyYXdTdGFrZSA9PT0gdW5kZWZpbmVkICYmIHVpLmRlYWN0aXZhdGUgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0U3Rha2luZ1R5cGVGcm9tVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiBTb2xTdGFraW5nVHlwZUVudW0ge1xuICBjb25zdCBpc0ppdG8gPSBpc0ppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnModWkpO1xuICBjb25zdCBpc01hcmluYWRlID0gaXNNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aSk7XG4gIGNvbnN0IGlzTmF0aXZlID0gaXNOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnModWkpO1xuICBhc3NlcnQoW2lzSml0bywgaXNNYXJpbmFkZSwgaXNOYXRpdmVdLmZpbHRlcigoeCkgPT4geCkubGVuZ3RoID09PSAxLCAnU3Rha2luZ1R5cGUgaXMgYW1iaWd1b3VzJyk7XG4gIGlmIChpc0ppdG8pIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uSklUTztcbiAgaWYgKGlzTWFyaW5hZGUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTUFSSU5BREU7XG4gIGlmIChpc05hdGl2ZSkgcmV0dXJuIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU7XG4gIGFzc2VydChmYWxzZSwgJ05vIFN0YWtpbmdUeXBlIGZvdW5kJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIGRlYWN0aXZhdGUgc3Rha2UgdHggaW5zdHJ1Y3Rpb25zIHBhcmFtcy4gU3VwcG9ydHMgZnVsbCBzdGFrZVxuICogYWNjb3VudCBkZWFjdGl2YXRpb24gYW5kIHBhcnRpYWwgc3Rha2UgYWNjb3VudCBkZWFjdGl2YXRpb24uXG4gKlxuICogV2hlbiBwYXJ0aWFsbHkgZGVhY3RpdmF0aW5nIGEgc3Rha2UgYWNjb3VudCB0aGlzIG1ldGhvZCBleHBlY3RzIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zOiBBbGxvY2F0ZSxcbiAqIHRvIGFsbG9jYXRlIGEgbmV3IHN0YWtpbmcgYWNjb3VudCwgQXNzaWduLCB0byBhc3NpZ24gdGhlIG5ld2x5IGNyZWF0ZWQgc3Rha2luZyBhY2NvdW50IHRvIHRoZVxuICogU3Rha2UgUHJvZ3JhbSwgU3BsaXQsIHRvIHNwbGl0IHRoZSBjdXJyZW50IHN0YWtlIGFjY291bnQsIGFuZCBTdGFraW5nRGVhY3RpdmF0ZSB0byBkZWFjdGl2YXRlIHRoZVxuICogbmV3bHkgY3JlYXRlZCBzdGFrZSBhY2NvdW50LlxuICpcbiAqIFN1cHBvcnRzIE5vbmNlLCBTdGFraW5nRGVhY3RpdmF0ZSwgTWVtbywgQWxsb2NhdGUsIEFzc2lnbiwgYW5kIFNwbGl0IFNvbGFuYSBpbnN0cnVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgZGVhY3RpdmF0ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgY29pbk5hbWU/OiBzdHJpbmdcbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVhY3RpdmF0ZSB8IE1lbW8+ID0gW107XG4gIGNvbnN0IHVuc3Rha2luZ0luc3RydWN0aW9uczogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zW10gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BbGxvY2F0ZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hbGxvY2F0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYWxsb2NhdGUgPVxuICAgICAgICAgICAgU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQWxsb2NhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGFsbG9jYXRlOiBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBbGxvY2F0ZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Bc3NpZ246XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYXNzaWduID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5hc3NpZ24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVBc3NpZ24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGFzc2lnbjogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQXNzaWduKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlNwbGl0OlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnNwbGl0ID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5zcGxpdCA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlU3BsaXQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHNwbGl0OiBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmRlYWN0aXZhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmRlYWN0aXZhdGUgPVxuICAgICAgICAgICAgU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWFjdGl2YXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBkZWFjdGl2YXRlOiBTdGFrZUluc3RydWN0aW9uLmRlY29kZURlYWN0aXZhdGUoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVHJhbnNmZXI6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0udHJhbnNmZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zZmVyID1cbiAgICAgICAgICAgIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0cmFuc2ZlcjogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uV2l0aGRyYXdTdGFrZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS53aXRoZHJhd1N0YWtlID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS53aXRoZHJhd1N0YWtlID0gZGVjb2RlV2l0aGRyYXdTdGFrZShpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgd2l0aGRyYXdTdGFrZTogZGVjb2RlV2l0aGRyYXdTdGFrZShpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbiBvZiB1bnN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgICB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbik7XG4gICAgY29uc3Qgc3Rha2luZ1R5cGUgPSBnZXRTdGFraW5nVHlwZUZyb21VbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pO1xuXG4gICAgbGV0IHN0YWtpbmdEZWFjdGl2YXRlOiBTdGFraW5nRGVhY3RpdmF0ZSB8IHVuZGVmaW5lZDtcblxuICAgIHN3aXRjaCAoc3Rha2luZ1R5cGUpIHtcbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLkpJVE86IHtcbiAgICAgICAgYXNzZXJ0KGlzSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbikpO1xuICAgICAgICBjb25zdCB7IHdpdGhkcmF3U3Rha2UgfSA9IHVuc3Rha2luZ0luc3RydWN0aW9uO1xuICAgICAgICBzdGFraW5nRGVhY3RpdmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3U3Rha2UuZGVzdGluYXRpb25TdGFrZUF1dGhvcml0eS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3U3Rha2Uuc3Rha2VQb29sLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhbW91bnQ6IHdpdGhkcmF3U3Rha2UucG9vbFRva2Vucy50b1N0cmluZygpLFxuICAgICAgICAgICAgdW5zdGFraW5nQWRkcmVzczogd2l0aGRyYXdTdGFrZS5kZXN0aW5hdGlvblN0YWtlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBleHRyYVBhcmFtczoge1xuICAgICAgICAgICAgICBzdGFrZVBvb2xEYXRhOiB7XG4gICAgICAgICAgICAgICAgbWFuYWdlckZlZUFjY291bnQ6IHdpdGhkcmF3U3Rha2UubWFuYWdlckZlZUFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBwb29sTWludDogd2l0aGRyYXdTdGFrZS5wb29sTWludC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRvckxpc3RBY2NvdW50OiB3aXRoZHJhd1N0YWtlLnZhbGlkYXRvckxpc3QudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogd2l0aGRyYXdTdGFrZS52YWxpZGF0b3JTdGFrZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICB0cmFuc2ZlckF1dGhvcml0eUFkZHJlc3M6IHdpdGhkcmF3U3Rha2Uuc291cmNlVHJhbnNmZXJBdXRob3JpdHkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFOiB7XG4gICAgICAgIGFzc2VydChpc01hcmluYWRlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKSk7XG4gICAgICAgIGNvbnN0IHsgdHJhbnNmZXIgfSA9IHVuc3Rha2luZ0luc3RydWN0aW9uO1xuXG4gICAgICAgIHN0YWtpbmdEZWFjdGl2YXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgICBmcm9tQWRkcmVzczogJycsXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogJycsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiB0cmFuc2Zlci50b1B1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXIubGFtcG9ydHMudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRToge1xuICAgICAgICBhc3NlcnQoaXNOYXRpdmVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgY29uc3QgeyBkZWFjdGl2YXRlLCBzcGxpdCB9ID0gdW5zdGFraW5nSW5zdHJ1Y3Rpb247XG4gICAgICAgIHN0YWtpbmdEZWFjdGl2YXRlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ1R5cGUsXG4gICAgICAgICAgICBmcm9tQWRkcmVzczogZGVhY3RpdmF0ZS5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogc3BsaXQ/LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgfHwgZGVhY3RpdmF0ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiBzcGxpdD8ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHNwbGl0Py5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgdW5yZWFjaGFibGU6IG5ldmVyID0gc3Rha2luZ1R5cGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdGFraW5nIHR5cGUgJHt1bnJlYWNoYWJsZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVhY3RpdmF0ZSk7XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbnM6IFVuc3Rha2luZ0luc3RydWN0aW9ucykge1xuICAvLyBDYXNlcyB3aGVyZSBleGFjdGx5IG9uZSBmaWVsZCBzaG91bGQgYmUgcHJlc2VudFxuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzOiAoa2V5b2YgVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKVtdID0gW1xuICAgICdhbGxvY2F0ZScsXG4gICAgJ2Fzc2lnbicsXG4gICAgJ3NwbGl0JyxcbiAgICAnZGVhY3RpdmF0ZScsXG4gICAgJ3RyYW5zZmVyJyxcbiAgXSBhcyBjb25zdDtcbiAgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9uc0tleXMuZXZlcnkoKGspID0+ICEhdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW2tdID09PSAoayA9PT0gJ3RyYW5zZmVyJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzLmV2ZXJ5KChrKSA9PiAhIXVuc3Rha2luZ0luc3RydWN0aW9uc1trXSA9PT0gKGsgPT09ICd3aXRoZHJhd1N0YWtlJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzLmV2ZXJ5KChrKSA9PiAhIXVuc3Rha2luZ0luc3RydWN0aW9uc1trXSA9PT0gKGsgPT09ICdkZWFjdGl2YXRlJykpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2FzZXMgd2hlcmUgZGVhY3RpdmF0ZSBmaWVsZCBtdXN0IGJlIHByZXNlbnQgd2l0aCBhbm90aGVyIGZpZWxkXG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmRlYWN0aXZhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZGVhY3RpdmF0ZSBzdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH1cblxuICAvLyBUaGlzIGlzIGEgc3Rha2UgcG9vbCBpbnN0cnVjdGlvbiwgbm90IGEgcGFydGlhbCB1bnN0YWtlXG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMud2l0aGRyYXdTdGFrZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhbGxvY2F0ZSB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nXG4gICAgKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFzc2lnbikge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGFzc2lnbiB1bnN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0KSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3Npbmcgc3BsaXQgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9IGVsc2UgaWYgKFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24uYWNjb3VudFB1YmtleS50b1N0cmluZygpXG4gICkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG11c3QgYWxsb2NhdGUgYW5kIGFzc2lnbiB0aGUgc2FtZSBwdWJsaWMga2V5J1xuICAgICk7XG4gIH0gZWxzZSBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmFsbG9jYXRlLnNwYWNlICE9PSBTdGFrZVByb2dyYW0uc3BhY2UpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgYEludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB1bnN0YWtpbmcgYWNjb3VudCBtdXN0IGFsbG9jYXRlICR7U3Rha2VQcm9ncmFtLnNwYWNlfSBieXRlc2BcbiAgICApO1xuICB9IGVsc2UgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQudG9TdHJpbmcoKSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHRoZSB1bnN0YWtlIGFjY291bnQgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgU3Rha2UgUHJvZ3JhbSdcbiAgICApO1xuICB9IGVsc2UgaWYgKFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5hY2NvdW50UHVia2V5LnRvU3RyaW5nKCkgIT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG11c3QgYWxsb2NhdGUgdGhlIHVuc3Rha2luZyBhY2NvdW50Jyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnNwbGl0LnN0YWtlUHVia2V5LnRvU3RyaW5nKCkgPT09IHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zcGxpdFN0YWtlUHVia2V5LnRvU3RyaW5nKClcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdGhlIHVuc3Rha2luZyBhY2NvdW50IG11c3QgYmUgZGlmZmVyZW50IGZyb20gdGhlIFN0YWtlIEFjY291bnQnXG4gICAgKTtcbiAgfSBlbHNlIGlmICghdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnRyYW5zZmVyKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBmdW5kaW5nIG9mIHVuc3Rha2UgYWRkcmVzcyBpbnN0cnVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY3JlYXRlIHN0YWtpbmcgIHdpdGhkcmF3IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdXaXRoZHJhdywgYW5kIE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIHdpdGhkcmF3IHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nV2l0aGRyYXcgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nV2l0aGRyYXcgfCBNZW1vPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgICAgICBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgY29uc3Qgd2l0aGRyYXdJbnN0cnVjdGlvbiA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlV2l0aGRyYXcoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFraW5nV2l0aGRyYXc6IFN0YWtpbmdXaXRoZHJhdyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nV2l0aGRyYXcsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogd2l0aGRyYXdJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogd2l0aGRyYXdJbnN0cnVjdGlvbi5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB3aXRoZHJhd0luc3RydWN0aW9uLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ1dpdGhkcmF3KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG1lbW8gb2JqZWN0IGZyb20gaW5zdHJ1Y3Rpb25zIGlmIGl0IGV4aXN0c1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSB0aGUgYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYmUgcGFyc2VkXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlcj59IGluc3RydWN0aW9uSW5kZXhlcyAtIHRoZSBpbnN0cnVjdGlvbnMgaW5kZXhlcyBvZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvblxuICogQHJldHVybnMge01lbW8gfCB1bmRlZmluZWR9IC0gbWVtbyBvYmplY3Qgb3IgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGdldE1lbW8oaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sIGluc3RydWN0aW9uSW5kZXhlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IE1lbW8gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbnN0cnVjdGlvbnNMZW5ndGggPSBPYmplY3Qua2V5cyhpbnN0cnVjdGlvbkluZGV4ZXMpLmxlbmd0aDtcbiAgaWYgKGluc3RydWN0aW9ucy5sZW5ndGggPT09IGluc3RydWN0aW9uc0xlbmd0aCAmJiBpbnN0cnVjdGlvbnNbaW5zdHJ1Y3Rpb25JbmRleGVzLk1lbW9dKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXS5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICB9O1xuICB9XG59XG5cbmNvbnN0IGF0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBQYXllckFkZHJlc3M6IDAsXG4gIEFUQUFkZHJlc3M6IDEsXG4gIE93bmVyQWRkcmVzczogMixcbiAgTWludEFkZHJlc3M6IDMsXG59O1xuXG5jb25zdCBjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMgPSB7XG4gIEFjY291bnRBZGRyZXNzOiAwLFxuICBEZXN0aW5hdGlvbkFkZHJlc3M6IDEsXG4gIEF1dGhvcml0eUFkZHJlc3M6IDIsXG59O1xuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGluaXRpYWxpemUgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXSxcbiAgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZT86IGJvb2xlYW5cbik6IEFycmF5PEF0YUluaXQgfCBNZW1vIHwgTm9uY2U+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxBdGFJbml0IHwgTWVtbyB8IE5vbmNlPiA9IFtdO1xuICBsZXQgbWVtbzogTWVtbyB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIG1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3MsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlEOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSUQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhSW5pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkRlcG9zaXRTb2w6XG4gICAgICAgIC8vIEF0YUluaXQgaXMgYSBwYXJ0IG9mIHNwbC1zdGFrZS1wb29sJ3MgZGVwb3NpdFNvbCBwcm9jZXNzXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmNvbnN0IGF0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgQWNjb3VudEFkZHJlc3M6IDAsXG4gIERlc3RpbmF0aW9uQWRkcmVzczogMSxcbiAgQXV0aG9yaXR5QWRkcmVzczogMixcbn07XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gY2xvc2UgYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50IHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgU2VuZCB0eFxuICovXG5mdW5jdGlvbiBwYXJzZUF0YUNsb3NlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8QXRhQ2xvc2UgfCBOb25jZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PEF0YUNsb3NlIHwgTm9uY2U+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgYXRhQ2xvc2U6IEF0YUNsb3NlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhQ2xvc2VJbnN0cnVjdGlvbktleXNJbmRleGVzLkRlc3RpbmF0aW9uQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BdXRob3JpdHlBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFDbG9zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGF1dGhvcml6ZWQgc3Rha2luZyBhY2NvdW50IHBhcmFtc1xuICogT25seSBzdXBwb3J0cyBOb25jZSwgQXV0aG9yaXplIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGF1dGhvcml6ZSB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdBdXRob3JpemVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemUgfCBNZW1vPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplIHwgTWVtbz4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0geyB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLCBwYXJhbXM6IHsgbWVtbzogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygpIH0gfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQXV0aG9yaXplOlxuICAgICAgICBjb25zdCBhdXRob3JpemUgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZUF1dGhvcml6ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQXV0aG9yaXplLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGF1dGhvcml6ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb2xkQXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld0F1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5uZXdBdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdXaXRoZHJhd0FkZHJlc3M6IGF1dGhvcml6ZS5jdXN0b2RpYW5QdWJrZXk/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYXV0aG9yaXplZCBzdGFraW5nIGFjY291bnQgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBBdXRob3JpemUgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYXV0aG9yaXplIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0F1dGhvcml6ZVJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZT4gPSBbXTtcbiAgYXNzZXJ0KGluc3RydWN0aW9ucy5sZW5ndGggPT09IDIsICdJbnZhbGlkIG51bWJlciBvZiBpbnN0cnVjdGlvbnMnKTtcbiAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgfSxcbiAgfTtcbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICBjb25zdCBhdXRob3JpemUgPSBpbnN0cnVjdGlvbnNbMV07XG4gIGFzc2VydChhdXRob3JpemUua2V5cy5sZW5ndGggPT09IDUsICdJbnZhbGlkIG51bWJlciBvZiBrZXlzIGluIGF1dGhvcml6ZSBpbnN0cnVjdGlvbicpO1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaCh7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZSxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YWtpbmdBZGRyZXNzOiBhdXRob3JpemUua2V5c1swXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIG9sZEF1dGhvcml6ZUFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgbmV3QXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLmtleXNbM10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBjdXN0b2RpYW5BZGRyZXNzOiBhdXRob3JpemUua2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjdXN0b20gaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGNvbnRhaW5pbmcgY3VzdG9tIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEBwYXJhbSB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gaW5zdHJ1Y3Rpb25NZXRhZGF0YSAtIHRoZSBpbnN0cnVjdGlvbiBtZXRhZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIGN1c3RvbSBpbnN0cnVjdGlvbnNcbiAqL1xuZnVuY3Rpb24gcGFyc2VDdXN0b21JbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPzogSW5zdHJ1Y3Rpb25QYXJhbXNbXVxuKTogQ3VzdG9tSW5zdHJ1Y3Rpb25bXSB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQ3VzdG9tSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbnNbaV07XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG1ldGFkYXRhIGZvciB0aGlzIGluc3RydWN0aW9uIHBvc2l0aW9uXG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YSAmJlxuICAgICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXSAmJlxuICAgICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXS50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvblxuICAgICkge1xuICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXSBhcyBDdXN0b21JbnN0cnVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnZlcnQgdGhlIHJhdyBpbnN0cnVjdGlvbiB0byBDdXN0b21JbnN0cnVjdGlvbiBmb3JtYXRcbiAgICAgIGNvbnN0IGN1c3RvbUluc3RydWN0aW9uOiBDdXN0b21JbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHByb2dyYW1JZDogaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCksXG4gICAgICAgICAga2V5czogaW5zdHJ1Y3Rpb24ua2V5cy5tYXAoKGtleSkgPT4gKHtcbiAgICAgICAgICAgIHB1YmtleToga2V5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgaXNTaWduZXI6IGtleS5pc1NpZ25lcixcbiAgICAgICAgICAgIGlzV3JpdGFibGU6IGtleS5pc1dyaXRhYmxlLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkYXRhOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChjdXN0b21JbnN0cnVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRUb2tlbk5hbWUoXG4gIG1pbnRBZGRyZXNzOiBzdHJpbmcsXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgbGV0IHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29pbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNvbENvaW4gJiYgdmFsdWUudG9rZW5BZGRyZXNzID09PSBtaW50QWRkcmVzcykge1xuICAgICAgdG9rZW4gPSB2YWx1ZS5uYW1lO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKCF0b2tlbiAmJiBpbnN0cnVjdGlvbk1ldGFkYXRhKSB7XG4gICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YS5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50ICYmXG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5taW50QWRkcmVzcyA9PT0gbWludEFkZHJlc3NcbiAgICAgICkge1xuICAgICAgICB0b2tlbiA9IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyICYmXG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy50b2tlbkFkZHJlc3MgPT09IG1pbnRBZGRyZXNzXG4gICAgICApIHtcbiAgICAgICAgdG9rZW4gPSBpbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCF0b2tlbiAmJiBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKSB7XG4gICAgdG9rZW4gPSBtaW50QWRkcmVzcztcbiAgfVxuXG4gIGFzc2VydCh0b2tlbik7XG5cbiAgcmV0dXJuIHRva2VuO1xufVxuIl19