@bitgo/sdk-coin-dot 4.11.7 → 4.12.0

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 (316) hide show
  1. package/dist/{src → cjs/src}/dot.d.ts +0 -7
  2. package/dist/cjs/src/dot.d.ts.map +1 -0
  3. package/dist/{src → cjs/src}/dot.js +1 -1
  4. package/dist/cjs/src/index.d.ts.map +1 -0
  5. package/dist/{src → cjs/src}/index.js +1 -1
  6. package/dist/cjs/src/lib/addressInitializationBuilder.d.ts.map +1 -0
  7. package/dist/cjs/src/lib/addressInitializationBuilder.js +182 -0
  8. package/dist/cjs/src/lib/batchTransactionBuilder.d.ts.map +1 -0
  9. package/dist/cjs/src/lib/batchTransactionBuilder.js +229 -0
  10. package/dist/cjs/src/lib/claimBuilder.d.ts.map +1 -0
  11. package/dist/cjs/src/lib/claimBuilder.js +117 -0
  12. package/dist/cjs/src/lib/errors.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/errors.js +19 -0
  14. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  15. package/dist/cjs/src/lib/iface.js +128 -0
  16. package/dist/cjs/src/lib/iface_utils.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/iface_utils.js +92 -0
  18. package/dist/{src → cjs/src}/lib/index.d.ts +2 -0
  19. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  20. package/dist/{src → cjs/src}/lib/index.js +4 -2
  21. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/keyPair.js +117 -0
  23. package/dist/cjs/src/lib/nativeTransferBuilder.d.ts.map +1 -0
  24. package/dist/cjs/src/lib/nativeTransferBuilder.js +219 -0
  25. package/dist/cjs/src/lib/proxyBuilder.d.ts.map +1 -0
  26. package/dist/cjs/src/lib/proxyBuilder.js +116 -0
  27. package/dist/cjs/src/lib/singletonRegistry.d.ts.map +1 -0
  28. package/dist/cjs/src/lib/singletonRegistry.js +20 -0
  29. package/dist/cjs/src/lib/stakingBuilder.d.ts.map +1 -0
  30. package/dist/cjs/src/lib/stakingBuilder.js +167 -0
  31. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  32. package/dist/cjs/src/lib/transaction.js +624 -0
  33. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  34. package/dist/cjs/src/lib/transactionBuilder.js +351 -0
  35. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/transactionBuilderFactory.js +104 -0
  37. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  38. package/dist/cjs/src/lib/transferBuilder.js +11 -0
  39. package/dist/cjs/src/lib/txnSchema.d.ts.map +1 -0
  40. package/dist/cjs/src/lib/txnSchema.js +117 -0
  41. package/dist/cjs/src/lib/unnominateBuilder.d.ts.map +1 -0
  42. package/dist/cjs/src/lib/unnominateBuilder.js +48 -0
  43. package/dist/cjs/src/lib/unstakeBuilder.d.ts.map +1 -0
  44. package/dist/cjs/src/lib/unstakeBuilder.js +87 -0
  45. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/utils.js +491 -0
  47. package/dist/cjs/src/lib/wasmParser.d.ts +57 -0
  48. package/dist/cjs/src/lib/wasmParser.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/wasmParser.js +345 -0
  50. package/dist/cjs/src/lib/withdrawUnstakedBuilder.d.ts.map +1 -0
  51. package/dist/cjs/src/lib/withdrawUnstakedBuilder.js +88 -0
  52. package/dist/cjs/src/register.d.ts.map +1 -0
  53. package/dist/cjs/src/register.js +11 -0
  54. package/dist/cjs/src/resources/index.d.ts.map +1 -0
  55. package/dist/{src → cjs/src}/resources/index.js +1 -1
  56. package/dist/cjs/src/resources/mainnet.d.ts.map +1 -0
  57. package/dist/cjs/src/resources/mainnet.js +5 -0
  58. package/dist/cjs/src/resources/polkadotAssetHub.d.ts.map +1 -0
  59. package/dist/cjs/src/resources/polkadotAssetHub.js +5 -0
  60. package/dist/cjs/src/resources/westend.d.ts.map +1 -0
  61. package/dist/{test/resources/testnet.js → cjs/src/resources/westend.js} +3 -3
  62. package/dist/cjs/src/resources/westendAssetHub.d.ts.map +1 -0
  63. package/dist/{src → cjs/src}/resources/westendAssetHub.js +1 -1
  64. package/dist/cjs/src/tdot.d.ts.map +1 -0
  65. package/dist/cjs/src/tdot.js +27 -0
  66. package/dist/cjs/test/fixtures.d.ts.map +1 -0
  67. package/dist/cjs/test/fixtures.js +439 -0
  68. package/dist/cjs/test/resources/index.d.ts.map +1 -0
  69. package/dist/cjs/test/resources/index.js +157 -0
  70. package/dist/cjs/test/resources/testnet.d.ts.map +1 -0
  71. package/dist/{src/resources/westend.js → cjs/test/resources/testnet.js} +3 -3
  72. package/dist/{test → cjs/test}/unit/address.d.ts.map +1 -1
  73. package/dist/cjs/test/unit/address.js +45 -0
  74. package/dist/{test → cjs/test}/unit/dot.d.ts.map +1 -1
  75. package/dist/cjs/test/unit/dot.js +880 -0
  76. package/dist/{test → cjs/test}/unit/keypair.d.ts.map +1 -1
  77. package/dist/cjs/test/unit/keypair.js +111 -0
  78. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  79. package/dist/cjs/test/unit/transaction.js +269 -0
  80. package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
  81. package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.js +265 -0
  82. package/dist/cjs/test/unit/transactionBuilder/base.d.ts.map +1 -0
  83. package/dist/cjs/test/unit/transactionBuilder/base.js +233 -0
  84. package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.d.ts.map +1 -0
  85. package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.js +521 -0
  86. package/dist/cjs/test/unit/transactionBuilder/claimBuilder.d.ts.map +1 -0
  87. package/dist/cjs/test/unit/transactionBuilder/claimBuilder.js +129 -0
  88. package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.d.ts.map +1 -0
  89. package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.js +88 -0
  90. package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.d.ts.map +1 -0
  91. package/dist/{test → cjs/test}/unit/transactionBuilder/singeltonRegistry.js +1 -1
  92. package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  93. package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.js +235 -0
  94. package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
  95. package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.js +107 -0
  96. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  97. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +437 -0
  98. package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.d.ts.map +1 -0
  99. package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.js +97 -0
  100. package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.d.ts.map +1 -0
  101. package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.js +116 -0
  102. package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts.map +1 -0
  103. package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.js +115 -0
  104. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  105. package/dist/cjs/test/unit/utils.js +117 -0
  106. package/dist/cjs/test/unit/wasmBuilderByteComparison.d.ts +22 -0
  107. package/dist/cjs/test/unit/wasmBuilderByteComparison.d.ts.map +1 -0
  108. package/dist/cjs/test/unit/wasmBuilderByteComparison.js +197 -0
  109. package/dist/cjs/test/unit/wasmParserExplanation.d.ts +15 -0
  110. package/dist/cjs/test/unit/wasmParserExplanation.d.ts.map +1 -0
  111. package/dist/cjs/test/unit/wasmParserExplanation.js +147 -0
  112. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  113. package/dist/esm/dot.d.ts +147 -0
  114. package/dist/esm/dot.d.ts.map +1 -0
  115. package/dist/esm/dot.js +570 -0
  116. package/dist/esm/index.d.ts +5 -0
  117. package/dist/esm/index.js +5 -0
  118. package/dist/esm/lib/addressInitializationBuilder.d.ts +79 -0
  119. package/dist/esm/lib/addressInitializationBuilder.js +175 -0
  120. package/dist/esm/lib/batchTransactionBuilder.d.ts +62 -0
  121. package/dist/esm/lib/batchTransactionBuilder.js +222 -0
  122. package/dist/esm/lib/claimBuilder.d.ts +58 -0
  123. package/dist/esm/lib/claimBuilder.js +110 -0
  124. package/dist/esm/lib/errors.d.ts +8 -0
  125. package/dist/esm/lib/errors.js +14 -0
  126. package/dist/esm/lib/iface.d.ts +337 -0
  127. package/dist/esm/lib/iface.js +125 -0
  128. package/dist/esm/lib/iface_utils.d.ts +59 -0
  129. package/dist/esm/lib/iface_utils.js +83 -0
  130. package/dist/esm/lib/index.d.ts +21 -0
  131. package/dist/{src → esm}/lib/index.d.ts.map +1 -1
  132. package/dist/esm/lib/index.js +20 -0
  133. package/dist/esm/lib/keyPair.d.ts +38 -0
  134. package/dist/esm/lib/keyPair.js +77 -0
  135. package/dist/esm/lib/nativeTransferBuilder.d.ts +84 -0
  136. package/dist/esm/lib/nativeTransferBuilder.js +212 -0
  137. package/dist/esm/lib/proxyBuilder.d.ts +54 -0
  138. package/dist/esm/lib/proxyBuilder.js +109 -0
  139. package/dist/esm/lib/singletonRegistry.d.ts +7 -0
  140. package/dist/esm/lib/singletonRegistry.js +16 -0
  141. package/dist/esm/lib/stakingBuilder.d.ts +66 -0
  142. package/dist/esm/lib/stakingBuilder.js +160 -0
  143. package/dist/esm/lib/transaction.d.ts +83 -0
  144. package/dist/{src → esm}/lib/transaction.d.ts.map +1 -1
  145. package/dist/esm/lib/transaction.js +584 -0
  146. package/dist/esm/lib/transactionBuilder.d.ts +131 -0
  147. package/dist/esm/lib/transactionBuilder.js +311 -0
  148. package/dist/esm/lib/transactionBuilderFactory.d.ts +28 -0
  149. package/dist/esm/lib/transactionBuilderFactory.js +97 -0
  150. package/dist/esm/lib/transferBuilder.d.ts +11 -0
  151. package/dist/esm/lib/transferBuilder.js +7 -0
  152. package/dist/esm/lib/txnSchema.d.ts +15 -0
  153. package/dist/esm/lib/txnSchema.js +111 -0
  154. package/dist/esm/lib/unnominateBuilder.d.ts +24 -0
  155. package/dist/esm/lib/unnominateBuilder.js +44 -0
  156. package/dist/esm/lib/unstakeBuilder.d.ts +38 -0
  157. package/dist/esm/lib/unstakeBuilder.js +80 -0
  158. package/dist/esm/lib/utils.d.ts +261 -0
  159. package/dist/esm/lib/utils.js +451 -0
  160. package/dist/esm/lib/wasmParser.d.ts +57 -0
  161. package/dist/esm/lib/wasmParser.d.ts.map +1 -0
  162. package/dist/esm/lib/wasmParser.js +341 -0
  163. package/dist/esm/lib/withdrawUnstakedBuilder.d.ts +38 -0
  164. package/dist/esm/lib/withdrawUnstakedBuilder.js +81 -0
  165. package/dist/esm/register.d.ts +3 -0
  166. package/dist/esm/register.js +7 -0
  167. package/dist/esm/resources/index.d.ts +5 -0
  168. package/dist/esm/resources/index.js +5 -0
  169. package/dist/esm/resources/mainnet.d.ts +2 -0
  170. package/dist/esm/resources/mainnet.js +2 -0
  171. package/dist/esm/resources/polkadotAssetHub.d.ts +2 -0
  172. package/dist/esm/resources/polkadotAssetHub.js +2 -0
  173. package/dist/esm/resources/westend.d.ts +2 -0
  174. package/dist/esm/resources/westend.js +2 -0
  175. package/dist/esm/resources/westendAssetHub.d.ts +2 -0
  176. package/dist/esm/resources/westendAssetHub.js +2 -0
  177. package/dist/esm/tdot.d.ts +12 -0
  178. package/dist/esm/tdot.js +23 -0
  179. package/package.json +29 -11
  180. package/dist/src/dot.d.ts.map +0 -1
  181. package/dist/src/lib/addressInitializationBuilder.js +0 -182
  182. package/dist/src/lib/batchTransactionBuilder.js +0 -229
  183. package/dist/src/lib/claimBuilder.js +0 -117
  184. package/dist/src/lib/errors.js +0 -19
  185. package/dist/src/lib/iface.js +0 -128
  186. package/dist/src/lib/iface_utils.js +0 -92
  187. package/dist/src/lib/keyPair.js +0 -117
  188. package/dist/src/lib/nativeTransferBuilder.js +0 -219
  189. package/dist/src/lib/proxyBuilder.js +0 -116
  190. package/dist/src/lib/singletonRegistry.js +0 -20
  191. package/dist/src/lib/stakingBuilder.js +0 -167
  192. package/dist/src/lib/transaction.js +0 -610
  193. package/dist/src/lib/transactionBuilder.js +0 -351
  194. package/dist/src/lib/transactionBuilderFactory.js +0 -104
  195. package/dist/src/lib/transferBuilder.js +0 -11
  196. package/dist/src/lib/txnSchema.js +0 -117
  197. package/dist/src/lib/unnominateBuilder.js +0 -48
  198. package/dist/src/lib/unstakeBuilder.js +0 -87
  199. package/dist/src/lib/utils.js +0 -491
  200. package/dist/src/lib/withdrawUnstakedBuilder.js +0 -88
  201. package/dist/src/register.js +0 -11
  202. package/dist/src/resources/mainnet.js +0 -5
  203. package/dist/src/resources/polkadotAssetHub.js +0 -5
  204. package/dist/src/tdot.js +0 -27
  205. package/dist/test/fixtures.d.ts.map +0 -1
  206. package/dist/test/fixtures.js +0 -439
  207. package/dist/test/resources/index.d.ts.map +0 -1
  208. package/dist/test/resources/index.js +0 -157
  209. package/dist/test/resources/testnet.d.ts.map +0 -1
  210. package/dist/test/unit/address.js +0 -45
  211. package/dist/test/unit/dot.js +0 -816
  212. package/dist/test/unit/keypair.js +0 -111
  213. package/dist/test/unit/transaction.d.ts.map +0 -1
  214. package/dist/test/unit/transaction.js +0 -269
  215. package/dist/test/unit/transactionBuilder/addressInitializationBuilder.d.ts.map +0 -1
  216. package/dist/test/unit/transactionBuilder/addressInitializationBuilder.js +0 -265
  217. package/dist/test/unit/transactionBuilder/base.d.ts.map +0 -1
  218. package/dist/test/unit/transactionBuilder/base.js +0 -233
  219. package/dist/test/unit/transactionBuilder/batchTransactionBuilder.d.ts.map +0 -1
  220. package/dist/test/unit/transactionBuilder/batchTransactionBuilder.js +0 -521
  221. package/dist/test/unit/transactionBuilder/claimBuilder.d.ts.map +0 -1
  222. package/dist/test/unit/transactionBuilder/claimBuilder.js +0 -129
  223. package/dist/test/unit/transactionBuilder/proxyBuilder.d.ts.map +0 -1
  224. package/dist/test/unit/transactionBuilder/proxyBuilder.js +0 -88
  225. package/dist/test/unit/transactionBuilder/singeltonRegistry.d.ts.map +0 -1
  226. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +0 -1
  227. package/dist/test/unit/transactionBuilder/stakingBuilder.js +0 -235
  228. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +0 -1
  229. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +0 -107
  230. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  231. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -437
  232. package/dist/test/unit/transactionBuilder/unnominateBuilder.d.ts.map +0 -1
  233. package/dist/test/unit/transactionBuilder/unnominateBuilder.js +0 -97
  234. package/dist/test/unit/transactionBuilder/unstakeBuilder.d.ts.map +0 -1
  235. package/dist/test/unit/transactionBuilder/unstakeBuilder.js +0 -116
  236. package/dist/test/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts.map +0 -1
  237. package/dist/test/unit/transactionBuilder/withdrawUnstakedBuilder.js +0 -115
  238. package/dist/test/unit/utils.js +0 -117
  239. package/dist/tsconfig.tsbuildinfo +0 -1
  240. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  241. /package/dist/{src → cjs/src}/lib/addressInitializationBuilder.d.ts +0 -0
  242. /package/dist/{src → cjs/src}/lib/batchTransactionBuilder.d.ts +0 -0
  243. /package/dist/{src → cjs/src}/lib/claimBuilder.d.ts +0 -0
  244. /package/dist/{src → cjs/src}/lib/errors.d.ts +0 -0
  245. /package/dist/{src → cjs/src}/lib/iface.d.ts +0 -0
  246. /package/dist/{src → cjs/src}/lib/iface_utils.d.ts +0 -0
  247. /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
  248. /package/dist/{src → cjs/src}/lib/nativeTransferBuilder.d.ts +0 -0
  249. /package/dist/{src → cjs/src}/lib/proxyBuilder.d.ts +0 -0
  250. /package/dist/{src → cjs/src}/lib/singletonRegistry.d.ts +0 -0
  251. /package/dist/{src → cjs/src}/lib/stakingBuilder.d.ts +0 -0
  252. /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
  253. /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
  254. /package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +0 -0
  255. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  256. /package/dist/{src → cjs/src}/lib/txnSchema.d.ts +0 -0
  257. /package/dist/{src → cjs/src}/lib/unnominateBuilder.d.ts +0 -0
  258. /package/dist/{src → cjs/src}/lib/unstakeBuilder.d.ts +0 -0
  259. /package/dist/{src → cjs/src}/lib/utils.d.ts +0 -0
  260. /package/dist/{src → cjs/src}/lib/withdrawUnstakedBuilder.d.ts +0 -0
  261. /package/dist/{src → cjs/src}/register.d.ts +0 -0
  262. /package/dist/{src → cjs/src}/resources/index.d.ts +0 -0
  263. /package/dist/{src → cjs/src}/resources/mainnet.d.ts +0 -0
  264. /package/dist/{src → cjs/src}/resources/polkadotAssetHub.d.ts +0 -0
  265. /package/dist/{src → cjs/src}/resources/westend.d.ts +0 -0
  266. /package/dist/{src → cjs/src}/resources/westendAssetHub.d.ts +0 -0
  267. /package/dist/{src → cjs/src}/tdot.d.ts +0 -0
  268. /package/dist/{test → cjs/test}/fixtures.d.ts +0 -0
  269. /package/dist/{test → cjs/test}/resources/index.d.ts +0 -0
  270. /package/dist/{test → cjs/test}/resources/materialData.json +0 -0
  271. /package/dist/{test → cjs/test}/resources/materialDataModified.json +0 -0
  272. /package/dist/{test → cjs/test}/resources/testnet.d.ts +0 -0
  273. /package/dist/{test → cjs/test}/unit/address.d.ts +0 -0
  274. /package/dist/{test → cjs/test}/unit/dot.d.ts +0 -0
  275. /package/dist/{test → cjs/test}/unit/keypair.d.ts +0 -0
  276. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  277. /package/dist/{test → cjs/test}/unit/transactionBuilder/addressInitializationBuilder.d.ts +0 -0
  278. /package/dist/{test → cjs/test}/unit/transactionBuilder/base.d.ts +0 -0
  279. /package/dist/{test → cjs/test}/unit/transactionBuilder/batchTransactionBuilder.d.ts +0 -0
  280. /package/dist/{test → cjs/test}/unit/transactionBuilder/claimBuilder.d.ts +0 -0
  281. /package/dist/{test → cjs/test}/unit/transactionBuilder/proxyBuilder.d.ts +0 -0
  282. /package/dist/{test → cjs/test}/unit/transactionBuilder/singeltonRegistry.d.ts +0 -0
  283. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingBuilder.d.ts +0 -0
  284. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilderFactory.d.ts +0 -0
  285. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  286. /package/dist/{test → cjs/test}/unit/transactionBuilder/unnominateBuilder.d.ts +0 -0
  287. /package/dist/{test → cjs/test}/unit/transactionBuilder/unstakeBuilder.d.ts +0 -0
  288. /package/dist/{test → cjs/test}/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts +0 -0
  289. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  290. /package/dist/{src → esm}/index.d.ts.map +0 -0
  291. /package/dist/{src → esm}/lib/addressInitializationBuilder.d.ts.map +0 -0
  292. /package/dist/{src → esm}/lib/batchTransactionBuilder.d.ts.map +0 -0
  293. /package/dist/{src → esm}/lib/claimBuilder.d.ts.map +0 -0
  294. /package/dist/{src → esm}/lib/errors.d.ts.map +0 -0
  295. /package/dist/{src → esm}/lib/iface.d.ts.map +0 -0
  296. /package/dist/{src → esm}/lib/iface_utils.d.ts.map +0 -0
  297. /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
  298. /package/dist/{src → esm}/lib/nativeTransferBuilder.d.ts.map +0 -0
  299. /package/dist/{src → esm}/lib/proxyBuilder.d.ts.map +0 -0
  300. /package/dist/{src → esm}/lib/singletonRegistry.d.ts.map +0 -0
  301. /package/dist/{src → esm}/lib/stakingBuilder.d.ts.map +0 -0
  302. /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
  303. /package/dist/{src → esm}/lib/transactionBuilderFactory.d.ts.map +0 -0
  304. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  305. /package/dist/{src → esm}/lib/txnSchema.d.ts.map +0 -0
  306. /package/dist/{src → esm}/lib/unnominateBuilder.d.ts.map +0 -0
  307. /package/dist/{src → esm}/lib/unstakeBuilder.d.ts.map +0 -0
  308. /package/dist/{src → esm}/lib/utils.d.ts.map +0 -0
  309. /package/dist/{src → esm}/lib/withdrawUnstakedBuilder.d.ts.map +0 -0
  310. /package/dist/{src → esm}/register.d.ts.map +0 -0
  311. /package/dist/{src → esm}/resources/index.d.ts.map +0 -0
  312. /package/dist/{src → esm}/resources/mainnet.d.ts.map +0 -0
  313. /package/dist/{src → esm}/resources/polkadotAssetHub.d.ts.map +0 -0
  314. /package/dist/{src → esm}/resources/westend.d.ts.map +0 -0
  315. /package/dist/{src → esm}/resources/westendAssetHub.d.ts.map +0 -0
  316. /package/dist/{src → esm}/tdot.d.ts.map +0 -0
@@ -0,0 +1,584 @@
1
+ import { BaseTransaction, InvalidTransactionError, ParseTransactionError, SigningError, toUint8Array, TransactionType, } from '@bitgo/sdk-core';
2
+ import Keyring, { decodeAddress, encodeAddress } from '@polkadot/keyring';
3
+ import { u8aToBuffer } from '@polkadot/util';
4
+ import { construct, decode } from '@substrate/txwrapper-polkadot';
5
+ import { KeyPair } from './keyPair';
6
+ import { MethodNames, SectionNames, } from './iface';
7
+ import { getAddress, getDelegateAddress } from './iface_utils';
8
+ import utils from './utils';
9
+ import { toJsonFromWasm } from './wasmParser';
10
+ import BigNumber from 'bignumber.js';
11
+ import { EXTRINSIC_VERSION } from '@polkadot/types/extrinsic/v4/Extrinsic';
12
+ /**
13
+ * Use a dummy address as the destination of a bond or bondExtra because our inputs and outputs model
14
+ * doesn't seem to handle the concept of locking funds within a wallet as a method of transferring coins.
15
+ */
16
+ export const STAKING_DESTINATION = encodeAddress('0x0000000000000000000000000000000000000000000000000000000000000000');
17
+ export class Transaction extends BaseTransaction {
18
+ constructor(coinConfig) {
19
+ super(coinConfig);
20
+ }
21
+ /** @inheritdoc */
22
+ canSign({ key }) {
23
+ const kp = new KeyPair({ prv: key });
24
+ const addr = kp.getAddress(utils.getAddressFormat(this._coinConfig.name));
25
+ return addr === this._sender;
26
+ }
27
+ /**
28
+ * Sign a polkadot transaction and update the transaction hex
29
+ *
30
+ * @param {KeyPair} keyPair - ed signature
31
+ */
32
+ sign(keyPair) {
33
+ if (!this._dotTransaction) {
34
+ throw new InvalidTransactionError('No transaction data to sign');
35
+ }
36
+ const { prv, pub } = keyPair.getKeys();
37
+ if (!prv) {
38
+ throw new SigningError('Missing private key');
39
+ }
40
+ const signingPayload = construct.signingPayload(this._dotTransaction, {
41
+ registry: this._registry,
42
+ });
43
+ // Sign a payload. This operation should be performed on an offline device.
44
+ const keyring = new Keyring({ type: 'ed25519' });
45
+ const secretKey = new Uint8Array(Buffer.from(prv, 'hex'));
46
+ const publicKey = new Uint8Array(Buffer.from(pub, 'hex'));
47
+ const signingKeyPair = keyring.addFromPair({ secretKey, publicKey });
48
+ const txHex = utils.createSignedTx(signingKeyPair, signingPayload, this._dotTransaction, {
49
+ metadataRpc: this._dotTransaction.metadataRpc,
50
+ registry: this._registry,
51
+ });
52
+ // get signature from signed txHex generated above
53
+ this._signatures = [utils.recoverSignatureFromRawTx(txHex, { registry: this._registry })];
54
+ this._signedTransaction = txHex;
55
+ }
56
+ /**
57
+ * Adds the signature to the DOT Transaction
58
+ * @param {string} signature
59
+ */
60
+ addSignature(signature) {
61
+ this._signedTransaction = utils.serializeSignedTransaction(this._dotTransaction, signature, this._dotTransaction.metadataRpc, this._registry);
62
+ }
63
+ /**
64
+ * Returns a serialized representation of this transaction with a fake signature attached which
65
+ * can be used to estimate transaction fees.
66
+ */
67
+ fakeSign() {
68
+ return utils.serializeSignedTransaction(this._dotTransaction, Transaction.FAKE_SIGNATURE, this._dotTransaction.metadataRpc, this._registry);
69
+ }
70
+ registry(registry) {
71
+ this._registry = registry;
72
+ }
73
+ chainName(chainName) {
74
+ this._chainName = chainName;
75
+ }
76
+ sender(sender) {
77
+ this._sender = sender;
78
+ }
79
+ /** @inheritdoc */
80
+ toBroadcastFormat() {
81
+ if (!this._dotTransaction) {
82
+ throw new InvalidTransactionError('Empty transaction');
83
+ }
84
+ if (this._signedTransaction && this._signedTransaction.length > 0) {
85
+ return this._signedTransaction;
86
+ }
87
+ else {
88
+ return construct.signingPayload(this._dotTransaction, {
89
+ registry: this._registry,
90
+ });
91
+ }
92
+ }
93
+ transactionSize() {
94
+ return this.toBroadcastFormat().length / 2;
95
+ }
96
+ /** @inheritdoc */
97
+ toJson() {
98
+ if (!this._dotTransaction) {
99
+ throw new InvalidTransactionError('Empty transaction');
100
+ }
101
+ // WASM path for signed tdot transactions — validates WASM parsing against production.
102
+ // Only for signed txs because toBroadcastFormat() returns the signed extrinsic (parseable).
103
+ // Unsigned txs return a signing payload (different format), so they use the legacy path.
104
+ if (this._coinConfig.name === 'tdot' && this._signedTransaction) {
105
+ return toJsonFromWasm({
106
+ txHex: this._signedTransaction,
107
+ material: utils.getMaterial(this._coinConfig),
108
+ senderAddress: this._sender,
109
+ coinConfigName: this._coinConfig.name,
110
+ referenceBlock: this._dotTransaction.blockHash,
111
+ blockNumber: Number(this._dotTransaction.blockNumber),
112
+ });
113
+ }
114
+ const decodedTx = decode(this._dotTransaction, {
115
+ metadataRpc: this._dotTransaction.metadataRpc,
116
+ registry: this._registry,
117
+ isImmortalEra: utils.isZeroHex(this._dotTransaction.era),
118
+ });
119
+ const result = {
120
+ id: construct.txHash(this.toBroadcastFormat()),
121
+ sender: decodedTx.address,
122
+ referenceBlock: decodedTx.blockHash,
123
+ blockNumber: decodedTx.blockNumber,
124
+ genesisHash: decodedTx.genesisHash,
125
+ nonce: decodedTx.nonce,
126
+ specVersion: decodedTx.specVersion,
127
+ transactionVersion: decodedTx.transactionVersion,
128
+ eraPeriod: decodedTx.eraPeriod,
129
+ chainName: this._chainName,
130
+ tip: decodedTx.tip ? Number(decodedTx.tip) : 0,
131
+ };
132
+ if (this.type === TransactionType.Send) {
133
+ const txMethod = decodedTx.method.args;
134
+ if (utils.isProxyTransfer(txMethod)) {
135
+ const keypairReal = new KeyPair({
136
+ pub: Buffer.from(decodeAddress(getAddress(txMethod))).toString('hex'),
137
+ });
138
+ result.owner = keypairReal.getAddress(utils.getAddressFormat(this._coinConfig.name));
139
+ result.forceProxyType = txMethod.forceProxyType;
140
+ const decodedCall = utils.decodeCallMethod(this._dotTransaction, {
141
+ metadataRpc: this._dotTransaction.metadataRpc,
142
+ registry: this._registry,
143
+ });
144
+ const keypairDest = new KeyPair({
145
+ pub: Buffer.from(decodeAddress(decodedCall.dest.id)).toString('hex'),
146
+ });
147
+ result.to = keypairDest.getAddress(utils.getAddressFormat(this._coinConfig.name));
148
+ result.amount = decodedCall.value;
149
+ }
150
+ else if (utils.isTransfer(txMethod)) {
151
+ const keypairDest = new KeyPair({
152
+ pub: Buffer.from(decodeAddress(txMethod.dest.id)).toString('hex'),
153
+ });
154
+ result.to = keypairDest.getAddress(utils.getAddressFormat(this._coinConfig.name));
155
+ result.amount = txMethod.value;
156
+ }
157
+ else if (utils.isTransferAll(txMethod)) {
158
+ const keypairDest = new KeyPair({
159
+ pub: Buffer.from(decodeAddress(txMethod.dest.id)).toString('hex'),
160
+ });
161
+ result.to = keypairDest.getAddress(utils.getAddressFormat(this._coinConfig.name));
162
+ result.keepAlive = txMethod.keepAlive;
163
+ }
164
+ else {
165
+ throw new ParseTransactionError(`Serializing unknown Transfer type parameters`);
166
+ }
167
+ }
168
+ if (this.type === TransactionType.StakingActivate) {
169
+ const txMethod = decodedTx.method.args;
170
+ if (utils.isBond(txMethod)) {
171
+ const keypair = new KeyPair({
172
+ pub: Buffer.from(decodeAddress(this._sender, false, this._registry.chainSS58)).toString('hex'),
173
+ });
174
+ result.controller = keypair.getAddress(utils.getAddressFormat(this._coinConfig.name));
175
+ result.amount = txMethod.value;
176
+ const payee = txMethod.payee;
177
+ if (payee.account) {
178
+ const keypair = new KeyPair({
179
+ pub: Buffer.from(decodeAddress(payee.account, false, this._registry.chainSS58)).toString('hex'),
180
+ });
181
+ result.payee = keypair.getAddress(utils.getAddressFormat(this._coinConfig.name));
182
+ }
183
+ else {
184
+ const payeeType = utils.capitalizeFirstLetter(Object.keys(payee)[0]);
185
+ result.payee = payeeType;
186
+ }
187
+ }
188
+ else if (utils.isBondExtra(decodedTx.method.args)) {
189
+ result.amount = decodedTx.method.args.maxAdditional;
190
+ }
191
+ }
192
+ if (this.type === TransactionType.AddressInitialization) {
193
+ let txMethod;
194
+ if ((decodedTx.method?.args).delegate) {
195
+ txMethod = decodedTx.method.args;
196
+ const delegateAddress = getDelegateAddress(txMethod);
197
+ const decodedAddress = decodeAddress(delegateAddress, false, this._registry.chainSS58);
198
+ const keypair = new KeyPair({ pub: Buffer.from(decodedAddress).toString('hex') });
199
+ result.owner = keypair.getAddress(utils.getAddressFormat(this._coinConfig.name));
200
+ }
201
+ else {
202
+ txMethod = decodedTx.method.args;
203
+ result.index = txMethod.index;
204
+ }
205
+ result.method = this._dotTransaction.method;
206
+ result.proxyType = txMethod.proxyType;
207
+ result.delay = txMethod.delay;
208
+ }
209
+ if (this.type === TransactionType.StakingUnlock) {
210
+ const txMethod = decodedTx.method.args;
211
+ result.amount = txMethod.value;
212
+ }
213
+ if (this.type === TransactionType.StakingWithdraw) {
214
+ const txMethod = decodedTx.method.args;
215
+ result.numSlashingSpans = txMethod.numSlashingSpans;
216
+ }
217
+ if (this.type === TransactionType.StakingClaim) {
218
+ const txMethod = decodedTx.method.args;
219
+ result.validatorStash = txMethod.validatorStash;
220
+ result.claimEra = txMethod.era;
221
+ }
222
+ if (this.type === TransactionType.Batch) {
223
+ const txMethod = decodedTx.method.args;
224
+ result.batchCalls = txMethod.calls;
225
+ }
226
+ return result;
227
+ }
228
+ explainTransferTransaction(json, explanationResult) {
229
+ explanationResult.displayOrder?.push('owner', 'forceProxyType');
230
+ return {
231
+ ...explanationResult,
232
+ outputs: [
233
+ {
234
+ address: json.to?.toString() || '',
235
+ amount: json.amount?.toString() || '',
236
+ },
237
+ ],
238
+ owner: json.owner,
239
+ forceProxyType: json.forceProxyType,
240
+ };
241
+ }
242
+ explainStakingActivateTransaction(json, explanationResult) {
243
+ explanationResult.displayOrder?.push('payee', 'forceProxyType');
244
+ return {
245
+ ...explanationResult,
246
+ outputs: [
247
+ {
248
+ address: json.controller?.toString() || '',
249
+ amount: json.amount || '',
250
+ },
251
+ ],
252
+ payee: json.payee,
253
+ forceProxyType: json.forceProxyType,
254
+ };
255
+ }
256
+ explainAddressInitializationTransaction(json, explanationResult) {
257
+ explanationResult.displayOrder?.push('owner', 'proxyType', 'delay');
258
+ return {
259
+ ...explanationResult,
260
+ owner: json.owner,
261
+ proxyType: json.proxyType,
262
+ delay: json.delay,
263
+ };
264
+ }
265
+ explainStakingUnlockTransaction(json, explanationResult) {
266
+ return {
267
+ ...explanationResult,
268
+ outputs: [
269
+ {
270
+ address: json.sender.toString(),
271
+ amount: json.amount || '',
272
+ },
273
+ ],
274
+ };
275
+ }
276
+ /** @inheritdoc */
277
+ explainTransaction() {
278
+ const result = this.toJson();
279
+ const displayOrder = ['outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
280
+ const outputs = [];
281
+ const explanationResult = {
282
+ // txhash used to identify the transactions
283
+ id: result.id,
284
+ displayOrder,
285
+ outputAmount: result.amount?.toString() || '0',
286
+ changeAmount: '0',
287
+ changeOutputs: [],
288
+ outputs,
289
+ fee: {
290
+ fee: result.tip?.toString() || '',
291
+ type: 'tip',
292
+ },
293
+ type: this.type,
294
+ };
295
+ switch (this.type) {
296
+ case TransactionType.Send:
297
+ return this.explainTransferTransaction(result, explanationResult);
298
+ case TransactionType.StakingActivate:
299
+ return this.explainStakingActivateTransaction(result, explanationResult);
300
+ case TransactionType.AddressInitialization:
301
+ return this.explainAddressInitializationTransaction(result, explanationResult);
302
+ case TransactionType.StakingUnlock:
303
+ return this.explainStakingUnlockTransaction(result, explanationResult);
304
+ default:
305
+ throw new InvalidTransactionError('Transaction type not supported');
306
+ }
307
+ }
308
+ /**
309
+ * Load the input and output data on this transaction.
310
+ */
311
+ loadInputsAndOutputs() {
312
+ if (!this._dotTransaction) {
313
+ return;
314
+ }
315
+ const decodedTx = decode(this._dotTransaction, {
316
+ metadataRpc: this._dotTransaction.metadataRpc,
317
+ registry: this._registry,
318
+ isImmortalEra: utils.isZeroHex(this._dotTransaction.era),
319
+ });
320
+ if (this.type === TransactionType.Send) {
321
+ this.decodeInputsAndOutputsForSend(decodedTx);
322
+ }
323
+ else if (this.type === TransactionType.Batch) {
324
+ this.decodeInputsAndOutputsForBatch(decodedTx);
325
+ }
326
+ else if (this.type === TransactionType.StakingActivate) {
327
+ this.decodeInputsAndOutputsForBond(decodedTx);
328
+ }
329
+ else if (this.type === TransactionType.StakingUnlock) {
330
+ this.decodeInputsAndOutputsForUnbond(decodedTx);
331
+ }
332
+ else if (this.type === TransactionType.StakingWithdraw) {
333
+ this.decodeInputsAndOutputsForWithdrawUnbond(decodedTx);
334
+ }
335
+ }
336
+ decodeInputsAndOutputsForSend(decodedTx) {
337
+ const txMethod = decodedTx.method.args;
338
+ let to;
339
+ let value;
340
+ let from;
341
+ if (utils.isProxyTransfer(txMethod)) {
342
+ const decodedCall = utils.decodeCallMethod(this._dotTransaction, {
343
+ metadataRpc: this._dotTransaction.metadataRpc,
344
+ registry: this._registry,
345
+ });
346
+ const keypairDest = new KeyPair({
347
+ pub: Buffer.from(decodeAddress(decodedCall.dest.id)).toString('hex'),
348
+ });
349
+ const keypairFrom = new KeyPair({
350
+ pub: Buffer.from(decodeAddress(getAddress(txMethod))).toString('hex'),
351
+ });
352
+ to = keypairDest.getAddress(utils.getAddressFormat(this._coinConfig.name));
353
+ value = `${decodedCall.value}`;
354
+ from = keypairFrom.getAddress(utils.getAddressFormat(this._coinConfig.name));
355
+ }
356
+ else if (utils.isTransferAll(txMethod)) {
357
+ const keypairDest = new KeyPair({
358
+ pub: Buffer.from(decodeAddress(txMethod.dest.id)).toString('hex'),
359
+ });
360
+ to = keypairDest.getAddress(utils.getAddressFormat(this._coinConfig.name));
361
+ value = '0'; // DOT transferAll's do not deserialize amounts
362
+ from = decodedTx.address;
363
+ }
364
+ else if (utils.isTransfer(txMethod)) {
365
+ const keypairDest = new KeyPair({
366
+ pub: Buffer.from(decodeAddress(txMethod.dest.id)).toString('hex'),
367
+ });
368
+ to = keypairDest.getAddress(utils.getAddressFormat(this._coinConfig.name));
369
+ value = txMethod.value;
370
+ from = decodedTx.address;
371
+ }
372
+ else {
373
+ throw new ParseTransactionError(`Loading inputs of unknown Transfer type parameters`);
374
+ }
375
+ this._outputs = [
376
+ {
377
+ address: to,
378
+ value,
379
+ coin: this._coinConfig.name,
380
+ },
381
+ ];
382
+ this._inputs = [
383
+ {
384
+ address: from,
385
+ value,
386
+ coin: this._coinConfig.name,
387
+ },
388
+ ];
389
+ }
390
+ decodeInputsAndOutputsForBatch(decodedTx) {
391
+ const sender = decodedTx.address;
392
+ this._inputs = [];
393
+ this._outputs = [];
394
+ const txMethod = decodedTx.method.args;
395
+ if (utils.isStakingBatch(txMethod)) {
396
+ if (!txMethod.calls) {
397
+ throw new InvalidTransactionError('failed to decode calls from batch transaction');
398
+ }
399
+ const bondMethod = txMethod.calls[0].callIndex;
400
+ const decodedBondCall = this._registry.findMetaCall(toUint8Array(utils.stripHexPrefix(bondMethod)));
401
+ if (decodedBondCall.section !== SectionNames.Staking ||
402
+ (decodedBondCall.method !== MethodNames.Bond && decodedBondCall.method !== MethodNames.BondExtra)) {
403
+ throw new InvalidTransactionError('Invalid batch transaction, only staking batch calls are supported, expected first call to be bond or bond exta.');
404
+ }
405
+ const addProxyMethod = txMethod.calls[1].callIndex;
406
+ const decodedAddProxyCall = this._registry.findMetaCall(toUint8Array(utils.stripHexPrefix(addProxyMethod)));
407
+ if (decodedAddProxyCall.section !== SectionNames.Proxy || decodedAddProxyCall.method !== MethodNames.AddProxy) {
408
+ throw new InvalidTransactionError('Invalid batch transaction, only staking batch calls are supported, expected second call to be addProxy.');
409
+ }
410
+ let bondValue;
411
+ if (decodedBondCall.method === MethodNames.BondExtra && utils.isBondBatchExtra(txMethod.calls[0].args)) {
412
+ bondValue = `${txMethod.calls[0].args.max_additional}`;
413
+ }
414
+ else if (decodedBondCall.method === MethodNames.BondExtra && utils.isBondExtra(txMethod.calls[0].args)) {
415
+ bondValue = `${txMethod.calls[0].args.maxAdditional}`;
416
+ }
417
+ else {
418
+ bondValue = `${txMethod.calls[0].args.value}`;
419
+ }
420
+ const addProxyArgs = txMethod.calls[1].args;
421
+ const proxyAddress = getDelegateAddress(addProxyArgs);
422
+ this._inputs.push({
423
+ address: sender,
424
+ value: bondValue,
425
+ coin: this._coinConfig.name,
426
+ });
427
+ this._outputs.push({
428
+ address: STAKING_DESTINATION,
429
+ value: bondValue,
430
+ coin: this._coinConfig.name,
431
+ });
432
+ const addProxyCost = this.getAddProxyCost().toString(10);
433
+ this._inputs.push({
434
+ address: sender,
435
+ value: addProxyCost,
436
+ coin: this._coinConfig.name,
437
+ });
438
+ this._outputs.push({
439
+ address: proxyAddress,
440
+ value: addProxyCost,
441
+ coin: this._coinConfig.name,
442
+ });
443
+ }
444
+ else if (utils.isUnstakingBatch(txMethod)) {
445
+ if (!txMethod.calls) {
446
+ throw new InvalidTransactionError('failed to decode calls from batch transaction');
447
+ }
448
+ const removeProxyMethod = txMethod.calls[0].callIndex;
449
+ const decodedRemoveProxyCall = this._registry.findMetaCall(toUint8Array(utils.stripHexPrefix(removeProxyMethod)));
450
+ if (decodedRemoveProxyCall.section !== SectionNames.Proxy ||
451
+ decodedRemoveProxyCall.method !== MethodNames.RemoveProxy) {
452
+ throw new InvalidTransactionError('Invalid batch transaction, only staking batch calls are supported, expected first call to be removeProxy.');
453
+ }
454
+ const chillMethod = txMethod.calls[1].callIndex;
455
+ const decodedChillCall = this._registry.findMetaCall(toUint8Array(utils.stripHexPrefix(chillMethod)));
456
+ if (decodedChillCall.section !== SectionNames.Staking || decodedChillCall.method !== MethodNames.Chill) {
457
+ throw new InvalidTransactionError('Invalid batch transaction, only staking batch calls are supported, expected second call to be chill.');
458
+ }
459
+ const unstakeMethod = txMethod.calls[2].callIndex;
460
+ const decodedUnstakeCall = this._registry.findMetaCall(toUint8Array(utils.stripHexPrefix(unstakeMethod)));
461
+ if (decodedUnstakeCall.section !== SectionNames.Staking || decodedUnstakeCall.method !== MethodNames.Unbond) {
462
+ throw new InvalidTransactionError('Invalid batch transaction, only staking batch calls are supported, expected third call to be unbond.');
463
+ }
464
+ const removeProxyArgs = txMethod.calls[0].args;
465
+ const proxyAddress = getDelegateAddress(removeProxyArgs);
466
+ const removeProxyCost = this.getRemoveProxyCost().toString(10);
467
+ this._inputs.push({
468
+ address: proxyAddress,
469
+ value: removeProxyCost,
470
+ coin: this._coinConfig.name,
471
+ });
472
+ this._outputs.push({
473
+ address: sender,
474
+ value: removeProxyCost,
475
+ coin: this._coinConfig.name,
476
+ });
477
+ }
478
+ }
479
+ getRemoveProxyCost() {
480
+ return this.getAddProxyCost();
481
+ }
482
+ getAddProxyCost() {
483
+ const proxyPallet = this._registry.metadata.pallets.find((p) => p.name.toString().toLowerCase() === SectionNames.Proxy);
484
+ if (proxyPallet) {
485
+ const proxyDepositBase = this.getConstant('ProxyDepositBase', proxyPallet.constants);
486
+ const proxyDepositFactor = this.getConstant('ProxyDepositFactor', proxyPallet.constants);
487
+ return proxyDepositBase.plus(proxyDepositFactor);
488
+ }
489
+ else {
490
+ const palletNames = this._registry.metadata.pallets.map((p) => p.name.toString().toLowerCase());
491
+ throw new Error(`Could not find ${SectionNames.Proxy} pallet in [${palletNames}]`);
492
+ }
493
+ }
494
+ getConstant(name, constants) {
495
+ const constant = constants.find((c) => c.name.toString() === name);
496
+ if (constant === undefined) {
497
+ const constantNames = constants.map((p) => p.name.toString());
498
+ throw new Error(`Could not find constant ${name} in [${constantNames}]`);
499
+ }
500
+ else {
501
+ // Convert from Little-Endian to Big-Endian
502
+ const valueBe = Buffer.from(constant.value.toU8a(true).reverse()).toString('hex');
503
+ return BigNumber(valueBe, 16);
504
+ }
505
+ }
506
+ decodeInputsAndOutputsForBond(decodedTx) {
507
+ const sender = decodedTx.address;
508
+ this._inputs = [];
509
+ this._outputs = [];
510
+ const txMethod = decodedTx.method.args;
511
+ if (decodedTx.method.pallet === SectionNames.Staking) {
512
+ let bondValue = '0';
513
+ if (decodedTx.method.name === MethodNames.Bond && utils.isBond(txMethod)) {
514
+ bondValue = txMethod.value;
515
+ }
516
+ else if (decodedTx.method.name === MethodNames.BondExtra && utils.isBondExtra(txMethod)) {
517
+ bondValue = txMethod.maxAdditional;
518
+ }
519
+ else {
520
+ throw new ParseTransactionError(`Loading inputs of unknown StakingActivate type parameters`);
521
+ }
522
+ this._inputs.push({
523
+ address: sender,
524
+ value: bondValue,
525
+ coin: this._coinConfig.name,
526
+ });
527
+ this._outputs.push({
528
+ address: STAKING_DESTINATION,
529
+ value: bondValue,
530
+ coin: this._coinConfig.name,
531
+ });
532
+ }
533
+ }
534
+ decodeInputsAndOutputsForUnbond(decodedTx) {
535
+ this._inputs = [];
536
+ this._outputs = [];
537
+ }
538
+ decodeInputsAndOutputsForWithdrawUnbond(decodedTx) {
539
+ this._inputs = [];
540
+ this._outputs = [];
541
+ }
542
+ /**
543
+ * Constructs a signed payload using construct.signTx
544
+ * This method will be called during the build step if a TSS signature
545
+ * is added and will set the signTransaction which is the txHex that will be broadcasted
546
+ * As well as add the signature used to sign to the signature array in hex format
547
+ *
548
+ * @param {Buffer} signature The signature to be added to a dot transaction
549
+ */
550
+ constructSignedPayload(signature) {
551
+ // 0x00 means its an ED25519 signature
552
+ const edSignature = `0x00${signature.toString('hex')}`;
553
+ try {
554
+ this._signedTransaction = construct.signedTx(this._dotTransaction, edSignature, {
555
+ registry: this._registry,
556
+ metadataRpc: this._dotTransaction.metadataRpc,
557
+ });
558
+ }
559
+ catch (e) {
560
+ throw new SigningError(`Unable to sign dot transaction with signature ${edSignature} ` + e);
561
+ }
562
+ this._signatures = [signature.toString('hex')];
563
+ }
564
+ setTransaction(tx) {
565
+ this._dotTransaction = tx;
566
+ }
567
+ /** @inheritdoc **/
568
+ get signablePayload() {
569
+ const extrinsicPayload = this._registry.createType('ExtrinsicPayload', this._dotTransaction, {
570
+ version: EXTRINSIC_VERSION,
571
+ });
572
+ return u8aToBuffer(extrinsicPayload.toU8a({ method: true }));
573
+ }
574
+ /**
575
+ * Set the transaction type.
576
+ *
577
+ * @param {TransactionType} transactionType The transaction type to be set.
578
+ */
579
+ transactionType(transactionType) {
580
+ this._type = transactionType;
581
+ }
582
+ }
583
+ Transaction.FAKE_SIGNATURE = `0x${Buffer.from(new Uint8Array(256).fill(1)).toString('hex')}`;
584
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxlQUFlLEVBRWYsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osWUFBWSxFQUVaLGVBQWUsR0FDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdsRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFTTCxXQUFXLEVBQ1gsWUFBWSxHQVNiLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxLQUFLLE1BQU0sU0FBUyxDQUFDO0FBQzVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUMsT0FBTyxTQUFTLE1BQU0sY0FBYyxDQUFDO0FBR3JDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTNFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO0FBRXZILE1BQU0sT0FBTyxXQUFZLFNBQVEsZUFBZTtJQVM5QyxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBVztRQUN0QixNQUFNLEVBQUUsR0FBRyxJ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QUMsV0FBVzthQUM5QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxZQUFZLENBQUMsaURBQWlELFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxjQUFjLENBQUMsRUFBdUI7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLGVBQWU7UUFDakIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQzNGLE9BQU8sRUFBRSxpQkFBaUI7U0FDM0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxlQUFnQztRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQztJQUMvQixDQUFDOztBQWxuQmMsMEJBQWMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIERvdEFzc2V0VHlwZXMsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgdG9VaW50OEFycmF5LFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCBLZXlyaW5nLCB7IGRlY29kZUFkZHJlc3MsIGVuY29kZUFkZHJlc3MgfSBmcm9tICdAcG9sa2Fkb3Qva2V5cmluZyc7XG5pbXBvcnQgeyB1OGFUb0J1ZmZlciB9IGZyb20gJ0Bwb2xrYWRvdC91dGlsJztcbmltcG9ydCB7IGNvbnN0cnVjdCwgZGVjb2RlIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItcG9sa2Fkb3QnO1xuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BzdWJzdHJhdGUvdHh3cmFwcGVyLWNvcmUnO1xuaW1wb3J0IHsgVHlwZVJlZ2lzdHJ5IH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItY29yZS9saWIvdHlwZXMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQge1xuICBBZGRBbm9ueW1vdXNQcm94eUFyZ3MsXG4gIEFkZFByb3h5QXJncyxcbiAgQWRkUHJveHlCYXRjaENhbGxBcmdzLFxuICBCYXRjaEFyZ3MsXG4gIEJhdGNoQ2FsbE9iamVjdCxcbiAgQ2xhaW1BcmdzLFxuICBEZWNvZGVkVHgsXG4gIEhleFN0cmluZyxcbiAgTWV0aG9kTmFtZXMsXG4gIFNlY3Rpb25OYW1lcyxcbiAgU3Rha2VBcmdzUGF5ZWVSYXcsXG4gIFN0YWtlQmF0Y2hDYWxsQXJncyxcbiAgU3Rha2VNb3JlQXJncyxcbiAgU3Rha2VNb3JlQ2FsbEFyZ3MsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFR4RGF0YSxcbiAgVW5zdGFrZUFyZ3MsXG4gIFdpdGhkcmF3VW5zdGFrZWRBcmdzLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGdldEFkZHJlc3MsIGdldERlbGVnYXRlQWRkcmVzcyB9IGZyb20gJy4vaWZhY2VfdXRpbHMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgdG9Kc29uRnJvbVdhc20gfSBmcm9tICcuL3dhc21QYXJzZXInO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgVmVjIH0gZnJvbSAnQHBvbGthZG90L3R5cGVzJztcbmltcG9ydCB7IFBhbGxldENvbnN0YW50TWV0YWRhdGFWMTQgfSBmcm9tICdAcG9sa2Fkb3QvdHlwZXMvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFWFRSSU5TSUNfVkVSU0lPTiB9IGZyb20gJ0Bwb2xrYWRvdC90eXBlcy9leHRyaW5zaWMvdjQvRXh0cmluc2ljJztcblxuLyoqXG4gKiBVc2UgYSBkdW1teSBhZGRyZXNzIGFzIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGJvbmQgb3IgYm9uZEV4dHJhIGJlY2F1c2Ugb3VyIGlucHV0cyBhbmQgb3V0cHV0cyBtb2RlbFxuICogZG9lc24ndCBzZWVtIHRvIGhhbmRsZSB0aGUgY29uY2VwdCBvZiBsb2NraW5nIGZ1bmRzIHdpdGhpbiBhIHdhbGxldCBhcyBhIG1ldGhvZCBvZiB0cmFuc2ZlcnJpbmcgY29pbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFLSU5HX0RFU1RJTkFUSU9OID0gZW5jb2RlQWRkcmVzcygnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfZG90VHJhbnNhY3Rpb246IFVuc2lnbmVkVHJhbnNhY3Rpb247XG4gIHByaXZhdGUgX3NpZ25lZFRyYW5zYWN0aW9uPzogc3RyaW5nO1xuICBwcml2YXRlIF9yZWdpc3RyeTogVHlwZVJlZ2lzdHJ5O1xuICBwcml2YXRlIF9jaGFpbk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfc2VuZGVyOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgRkFLRV9TSUdOQVRVUkUgPSBgMHgke0J1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KDI1NikuZmlsbCgxKSkudG9TdHJpbmcoJ2hleCcpfWA7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKHsga2V5IH06IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICBjb25zdCBrcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSk7XG4gICAgY29uc3QgYWRkciA9IGtwLmdldEFkZHJlc3ModXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcykpO1xuICAgIHJldHVybiBhZGRyID09PSB0aGlzLl9zZW5kZXI7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHBvbGthZG90IHRyYW5zYWN0aW9uIGFuZCB1cGRhdGUgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXIgLSBlZCBzaWduYXR1cmVcbiAgICovXG4gIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZG90VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignTm8gdHJhbnNhY3Rpb24gZGF0YSB0byBzaWduJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJ2LCBwdWIgfSA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25pbmdQYXlsb2FkID0gY29uc3RydWN0LnNpZ25pbmdQYXlsb2FkKHRoaXMuX2RvdFRyYW5zYWN0aW9uLCB7XG4gICAgICByZWdpc3RyeTogdGhpcy5fcmVnaXN0cnksXG4gICAgfSk7XG4gICAgLy8gU2lnbiBhIHBheWxvYWQuIFRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgb24gYW4gb2ZmbGluZSBkZXZpY2UuXG4gICAgY29uc3Qga2V5cmluZyA9IG5ldyBLZXlyaW5nKHsgdHlwZTogJ2VkMjU1MTknIH0pO1xuICAgIGNvbnN0IHNlY3JldEtleSA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKTtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShwdWIsICdoZXgnKSk7XG4gICAgY29uc3Qgc2lnbmluZ0tleVBhaXIgPSBrZXlyaW5nLmFkZEZyb21QYWlyKHsgc2VjcmV0S2V5LCBwdWJsaWNLZXkgfSk7XG4gICAgY29uc3QgdHhIZXggPSB1dGlscy5jcmVhdGVTaWduZWRUeChzaWduaW5nS2V5UGFpciwgc2lnbmluZ1BheWxvYWQsIHRoaXMuX2RvdFRyYW5zYWN0aW9uLCB7XG4gICAgICBtZXRhZGF0YVJwYzogdGhpcy5fZG90VHJhbnNhY3Rpb24ubWV0YWRhdGFScGMsXG4gICAgICByZWdpc3RyeTogdGhpcy5fcmVnaXN0cnksXG4gICAgfSk7XG5cbiAgICAvLyBnZXQgc2lnbmF0dXJlIGZyb20gc2lnbmVkIHR4SGV4IGdlbmVyYXRlZCBhYm92ZVxuICAgIHRoaXMuX3NpZ25hdHVyZXMgPSBbdXRpbHMucmVjb3ZlclNpZ25hdHVyZUZyb21SYXdUeCh0eEhleCwgeyByZWdpc3RyeTogdGhpcy5fcmVnaXN0cnkgfSldO1xuICAgIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uID0gdHhIZXg7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgc2lnbmF0dXJlIHRvIHRoZSBET1QgVHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25hdHVyZVxuICAgKi9cbiAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24gPSB1dGlscy5zZXJpYWxpemVTaWduZWRUcmFuc2FjdGlvbihcbiAgICAgIHRoaXMuX2RvdFRyYW5zYWN0aW9uLFxuICAgICAgc2lnbmF0dXJlLFxuICAgICAgdGhpcy5fZG90VHJhbnNhY3Rpb24ubWV0YWRhdGFScGMsXG4gICAgICB0aGlzLl9yZWdpc3RyeVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFuc2FjdGlvbiB3aXRoIGEgZmFrZSBzaWduYXR1cmUgYXR0YWNoZWQgd2hpY2hcbiAgICogY2FuIGJlIHVzZWQgdG8gZXN0aW1hdGUgdHJhbnNhY3Rpb24gZmVlcy5cbiAgICovXG4gIGZha2VTaWduKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHV0aWxzLnNlcmlhbGl6ZVNpZ25lZFRyYW5zYWN0aW9uKFxuICAgICAgdGhpcy5fZG90VHJhbnNhY3Rpb24sXG4gICAgICBUcmFuc2FjdGlvbi5GQUtFX1NJR05BVFVSRSxcbiAgICAgIHRoaXMuX2RvdFRyYW5zYWN0aW9uLm1ldGFkYXRhUnBjLFxuICAgICAgdGhpcy5fcmVnaXN0cnlcbiAgICApO1xuICB9XG5cbiAgcmVnaXN0cnkocmVnaXN0cnk6IFR5cGVSZWdpc3RyeSk6IHZvaWQge1xuICAgIHRoaXMuX3JlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gIH1cblxuICBjaGFpbk5hbWUoY2hhaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFpbk5hbWUgPSBjaGFpbk5hbWU7XG4gIH1cblxuICBzZW5kZXIoc2VuZGVyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZW5kZXIgPSBzZW5kZXI7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2RvdFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zaWduZWRUcmFuc2FjdGlvbiAmJiB0aGlzLl9zaWduZWRUcmFuc2FjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb25zdHJ1Y3Quc2lnbmluZ1BheWxvYWQodGhpcy5fZG90VHJhbnNhY3Rpb24sIHtcbiAgICAgICAgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdHJhbnNhY3Rpb25TaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9Ccm9hZGNhc3RGb3JtYXQoKS5sZW5ndGggLyAyO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5fZG90VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyBXQVNNIHBhdGggZm9yIHNpZ25lZCB0ZG90IHRyYW5zYWN0aW9ucyDigJQgdmFsaWRhdGVzIFdBU00gcGFyc2luZyBhZ2FpbnN0IHByb2R1Y3Rpb24uXG4gICAgLy8gT25seSBmb3Igc2lnbmVkIHR4cyBiZWNhdXNlIHRvQnJvYWRjYXN0Rm9ybWF0KCkgcmV0dXJucyB0aGUgc2lnbmVkIGV4dHJpbnNpYyAocGFyc2VhYmxlKS5cbiAgICAvLyBVbnNpZ25lZCB0eHMgcmV0dXJuIGEgc2lnbmluZyBwYXlsb2FkIChkaWZmZXJlbnQgZm9ybWF0KSwgc28gdGhleSB1c2UgdGhlIGxlZ2FjeSBwYXRoLlxuICAgIGlmICh0aGlzLl9jb2luQ29uZmlnLm5hbWUgPT09ICd0ZG90JyAmJiB0aGlzLl9zaWduZWRUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIHRvSnNvbkZyb21XYXNtKHtcbiAgICAgICAgdHhIZXg6IHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgICBtYXRlcmlhbDogdXRpbHMuZ2V0TWF0ZXJpYWwodGhpcy5fY29pbkNvbmZpZyksXG4gICAgICAgIHNlbmRlckFkZHJlc3M6IHRoaXMuX3NlbmRlcixcbiAgICAgICAgY29pbkNvbmZpZ05hbWU6IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgcmVmZXJlbmNlQmxvY2s6IHRoaXMuX2RvdFRyYW5zYWN0aW9uLmJsb2NrSGFzaCxcbiAgICAgICAgYmxvY2tOdW1iZXI6IE51bWJlcih0aGlzLl9kb3RUcmFuc2FjdGlvbi5ibG9ja051bWJlciksXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZGVjb2RlZFR4ID0gZGVjb2RlKHRoaXMuX2RvdFRyYW5zYWN0aW9uLCB7XG4gICAgICBtZXRhZGF0YVJwYzogdGhpcy5fZG90VHJhbnNhY3Rpb24ubWV0YWRhdGFScGMsXG4gICAgICByZWdpc3RyeTogdGhpcy5fcmVnaXN0cnksXG4gICAgICBpc0ltbW9ydGFsRXJhOiB1dGlscy5pc1plcm9IZXgodGhpcy5fZG90VHJhbnNhY3Rpb24uZXJhKSxcbiAgICB9KSBhcyB1bmtub3duIGFzIERlY29kZWRUeDtcblxuICAgIGNvbnN0IHJlc3VsdDogVHhEYXRhID0ge1xuICAgICAgaWQ6IGNvbnN0cnVjdC50eEhhc2godGhpcy50b0Jyb2FkY2FzdEZvcm1hdCgpKSxcbiAgICAgIHNlbmRlcjogZGVjb2RlZFR4LmFkZHJlc3MsXG4gICAgICByZWZlcmVuY2VCbG9jazogZGVjb2RlZFR4LmJsb2NrSGFzaCxcbiAgICAgIGJsb2NrTnVtYmVyOiBkZWNvZGVkVHguYmxvY2tOdW1iZXIsXG4gICAgICBnZW5lc2lzSGFzaDogZGVjb2RlZFR4LmdlbmVzaXNIYXNoLFxuICAgICAgbm9uY2U6IGRlY29kZWRUeC5ub25jZSxcbiAgICAgIHNwZWNWZXJzaW9uOiBkZWNvZGVkVHguc3BlY1ZlcnNpb24sXG4gICAgICB0cmFuc2FjdGlvblZlcnNpb246IGRlY29kZWRUeC50cmFuc2FjdGlvblZlcnNpb24sXG4gICAgICBlcmFQZXJpb2Q6IGRlY29kZWRUeC5lcmFQZXJpb2QsXG4gICAgICBjaGFpbk5hbWU6IHRoaXMuX2NoYWluTmFtZSxcbiAgICAgIHRpcDogZGVjb2RlZFR4LnRpcCA/IE51bWJlcihkZWNvZGVkVHgudGlwKSA6IDAsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TZW5kKSB7XG4gICAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeC5tZXRob2QuYXJncztcbiAgICAgIGlmICh1dGlscy5pc1Byb3h5VHJhbnNmZXIodHhNZXRob2QpKSB7XG4gICAgICAgIGNvbnN0IGtleXBhaXJSZWFsID0gbmV3IEtleVBhaXIoe1xuICAgICAgICAgIHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyhnZXRBZGRyZXNzKHR4TWV0aG9kKSkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5vd25lciA9IGtleXBhaXJSZWFsLmdldEFkZHJlc3ModXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcykpO1xuICAgICAgICByZXN1bHQuZm9yY2VQcm94eVR5cGUgPSB0eE1ldGhvZC5mb3JjZVByb3h5VHlwZTtcbiAgICAgICAgY29uc3QgZGVjb2RlZENhbGwgPSB1dGlscy5kZWNvZGVDYWxsTWV0aG9kKHRoaXMuX2RvdFRyYW5zYWN0aW9uLCB7XG4gICAgICAgICAgbWV0YWRhdGFScGM6IHRoaXMuX2RvdFRyYW5zYWN0aW9uLm1ldGFkYXRhUnBjLFxuICAgICAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGtleXBhaXJEZXN0ID0gbmV3IEtleVBhaXIoe1xuICAgICAgICAgIHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyhkZWNvZGVkQ2FsbC5kZXN0LmlkKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnRvID0ga2V5cGFpckRlc3QuZ2V0QWRkcmVzcyh1dGlscy5nZXRBZGRyZXNzRm9ybWF0KHRoaXMuX2NvaW5Db25maWcubmFtZSBhcyBEb3RBc3NldFR5cGVzKSk7XG4gICAgICAgIHJlc3VsdC5hbW91bnQgPSBkZWNvZGVkQ2FsbC52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMuaXNUcmFuc2Zlcih0eE1ldGhvZCkpIHtcbiAgICAgICAgY29uc3Qga2V5cGFpckRlc3QgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgICAgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVBZGRyZXNzKHR4TWV0aG9kLmRlc3QuaWQpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQudG8gPSBrZXlwYWlyRGVzdC5nZXRBZGRyZXNzKHV0aWxzLmdldEFkZHJlc3NGb3JtYXQodGhpcy5fY29pbkNvbmZpZy5uYW1lIGFzIERvdEFzc2V0VHlwZXMpKTtcbiAgICAgICAgcmVzdWx0LmFtb3VudCA9IHR4TWV0aG9kLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh1dGlscy5pc1RyYW5zZmVyQWxsKHR4TWV0aG9kKSkge1xuICAgICAgICBjb25zdCBrZXlwYWlyRGVzdCA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3ModHhNZXRob2QuZGVzdC5pZCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC50byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcykpO1xuICAgICAgICByZXN1bHQua2VlcEFsaXZlID0gdHhNZXRob2Qua2VlcEFsaXZlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcihgU2VyaWFsaXppbmcgdW5rbm93biBUcmFuc2ZlciB0eXBlIHBhcmFtZXRlcnNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKSB7XG4gICAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeC5tZXRob2QuYXJncztcbiAgICAgIGlmICh1dGlscy5pc0JvbmQodHhNZXRob2QpKSB7XG4gICAgICAgIGNvbnN0IGtleXBhaXIgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgICAgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVBZGRyZXNzKHRoaXMuX3NlbmRlciwgZmFsc2UsIHRoaXMuX3JlZ2lzdHJ5LmNoYWluU1M1OCkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzdWx0LmNvbnRyb2xsZXIgPSBrZXlwYWlyLmdldEFkZHJlc3ModXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcykpO1xuICAgICAgICByZXN1bHQuYW1vdW50ID0gdHhNZXRob2QudmFsdWU7XG5cbiAgICAgICAgY29uc3QgcGF5ZWUgPSB0eE1ldGhvZC5wYXllZSBhcyBTdGFrZUFyZ3NQYXllZVJhdztcbiAgICAgICAgaWYgKHBheWVlLmFjY291bnQpIHtcbiAgICAgICAgICBjb25zdCBrZXlwYWlyID0gbmV3IEtleVBhaXIoe1xuICAgICAgICAgICAgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVBZGRyZXNzKHBheWVlLmFjY291bnQsIGZhbHNlLCB0aGlzLl9yZWdpc3RyeS5jaGFpblNTNTgpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzdWx0LnBheWVlID0ga2V5cGFpci5nZXRBZGRyZXNzKHV0aWxzLmdldEFkZHJlc3NGb3JtYXQodGhpcy5fY29pbkNvbmZpZy5uYW1lIGFzIERvdEFzc2V0VHlwZXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwYXllZVR5cGUgPSB1dGlscy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIoT2JqZWN0LmtleXMocGF5ZWUpWzBdKSBhcyBzdHJpbmc7XG4gICAgICAgICAgcmVzdWx0LnBheWVlID0gcGF5ZWVUeXBlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQm9uZEV4dHJhKGRlY29kZWRUeC5tZXRob2QuYXJncykpIHtcbiAgICAgICAgcmVzdWx0LmFtb3VudCA9IGRlY29kZWRUeC5tZXRob2QuYXJncy5tYXhBZGRpdGlvbmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BZGRyZXNzSW5pdGlhbGl6YXRpb24pIHtcbiAgICAgIGxldCB0eE1ldGhvZDogQWRkQW5vbnltb3VzUHJveHlBcmdzIHwgQWRkUHJveHlBcmdzO1xuICAgICAgaWYgKChkZWNvZGVkVHgubWV0aG9kPy5hcmdzIGFzIEFkZFByb3h5QXJncykuZGVsZWdhdGUpIHtcbiAgICAgICAgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3MgYXMgQWRkUHJveHlBcmdzO1xuICAgICAgICBjb25zdCBkZWxlZ2F0ZUFkZHJlc3MgPSBnZXREZWxlZ2F0ZUFkZHJlc3ModHhNZXRob2QpO1xuICAgICAgICBjb25zdCBkZWNvZGVkQWRkcmVzcyA9IGRlY29kZUFkZHJlc3MoZGVsZWdhdGVBZGRyZXNzLCBmYWxzZSwgdGhpcy5fcmVnaXN0cnkuY2hhaW5TUzU4KTtcbiAgICAgICAgY29uc3Qga2V5cGFpciA9IG5ldyBLZXlQYWlyKHsgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVkQWRkcmVzcykudG9TdHJpbmcoJ2hleCcpIH0pO1xuICAgICAgICByZXN1bHQub3duZXIgPSBrZXlwYWlyLmdldEFkZHJlc3ModXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3MgYXMgQWRkQW5vbnltb3VzUHJveHlBcmdzO1xuICAgICAgICByZXN1bHQuaW5kZXggPSB0eE1ldGhvZC5pbmRleDtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5tZXRob2QgPSB0aGlzLl9kb3RUcmFuc2FjdGlvbi5tZXRob2Q7XG4gICAgICByZXN1bHQucHJveHlUeXBlID0gdHhNZXRob2QucHJveHlUeXBlO1xuICAgICAgcmVzdWx0LmRlbGF5ID0gdHhNZXRob2QuZGVsYXk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdVbmxvY2spIHtcbiAgICAgIGNvbnN0IHR4TWV0aG9kID0gZGVjb2RlZFR4Lm1ldGhvZC5hcmdzIGFzIFVuc3Rha2VBcmdzO1xuICAgICAgcmVzdWx0LmFtb3VudCA9IHR4TWV0aG9kLnZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcpIHtcbiAgICAgIGNvbnN0IHR4TWV0aG9kID0gZGVjb2RlZFR4Lm1ldGhvZC5hcmdzIGFzIFdpdGhkcmF3VW5zdGFrZWRBcmdzO1xuICAgICAgcmVzdWx0Lm51bVNsYXNoaW5nU3BhbnMgPSB0eE1ldGhvZC5udW1TbGFzaGluZ1NwYW5zO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQ2xhaW0pIHtcbiAgICAgIGNvbnN0IHR4TWV0aG9kID0gZGVjb2RlZFR4Lm1ldGhvZC5hcmdzIGFzIENsYWltQXJncztcbiAgICAgIHJlc3VsdC52YWxpZGF0b3JTdGFzaCA9IHR4TWV0aG9kLnZhbGlkYXRvclN0YXNoO1xuICAgICAgcmVzdWx0LmNsYWltRXJhID0gdHhNZXRob2QuZXJhO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5CYXRjaCkge1xuICAgICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3MgYXMgQmF0Y2hBcmdzO1xuICAgICAgcmVzdWx0LmJhdGNoQ2FsbHMgPSB0eE1ldGhvZC5jYWxscztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZXhwbGFpblRyYW5zZmVyVHJhbnNhY3Rpb24oanNvbjogVHhEYXRhLCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGV4cGxhbmF0aW9uUmVzdWx0LmRpc3BsYXlPcmRlcj8ucHVzaCgnb3duZXInLCAnZm9yY2VQcm94eVR5cGUnKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBqc29uLnRvPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIGFtb3VudDoganNvbi5hbW91bnQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgb3duZXI6IGpzb24ub3duZXIsXG4gICAgICBmb3JjZVByb3h5VHlwZToganNvbi5mb3JjZVByb3h5VHlwZSxcbiAgICB9O1xuICB9XG5cbiAgZXhwbGFpblN0YWtpbmdBY3RpdmF0ZVRyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBleHBsYW5hdGlvblJlc3VsdC5kaXNwbGF5T3JkZXI/LnB1c2goJ3BheWVlJywgJ2ZvcmNlUHJveHlUeXBlJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczoganNvbi5jb250cm9sbGVyPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIGFtb3VudDoganNvbi5hbW91bnQgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcGF5ZWU6IGpzb24ucGF5ZWUsXG4gICAgICBmb3JjZVByb3h5VHlwZToganNvbi5mb3JjZVByb3h5VHlwZSxcbiAgICB9O1xuICB9XG5cbiAgZXhwbGFpbkFkZHJlc3NJbml0aWFsaXphdGlvblRyYW5zYWN0aW9uKFxuICAgIGpzb246IFR4RGF0YSxcbiAgICBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvblxuICApOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBleHBsYW5hdGlvblJlc3VsdC5kaXNwbGF5T3JkZXI/LnB1c2goJ293bmVyJywgJ3Byb3h5VHlwZScsICdkZWxheScpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5leHBsYW5hdGlvblJlc3VsdCxcbiAgICAgIG93bmVyOiBqc29uLm93bmVyLFxuICAgICAgcHJveHlUeXBlOiBqc29uLnByb3h5VHlwZSxcbiAgICAgIGRlbGF5OiBqc29uLmRlbGF5LFxuICAgIH07XG4gIH1cblxuICBleHBsYWluU3Rha2luZ1VubG9ja1RyYW5zYWN0aW9uKGpzb246IFR4RGF0YSwgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBqc29uLnNlbmRlci50b1N0cmluZygpLFxuICAgICAgICAgIGFtb3VudDoganNvbi5hbW91bnQgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcbiAgICBjb25zdCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IHtcbiAgICAgIC8vIHR4aGFzaCB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0cmFuc2FjdGlvbnNcbiAgICAgIGlkOiByZXN1bHQuaWQsXG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBvdXRwdXRBbW91bnQ6IHJlc3VsdC5hbW91bnQ/LnRvU3RyaW5nKCkgfHwgJzAnLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIG91dHB1dHMsXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiByZXN1bHQudGlwPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICB0eXBlOiAndGlwJyxcbiAgICAgIH0sXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgfTtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblRyYW5zZmVyVHJhbnNhY3Rpb24ocmVzdWx0LCBleHBsYW5hdGlvblJlc3VsdCk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5TdGFraW5nQWN0aXZhdGVUcmFuc2FjdGlvbihyZXN1bHQsIGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZHJlc3NJbml0aWFsaXphdGlvbjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpbkFkZHJlc3NJbml0aWFsaXphdGlvblRyYW5zYWN0aW9uKHJlc3VsdCwgZXhwbGFuYXRpb25SZXN1bHQpO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jazpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblN0YWtpbmdVbmxvY2tUcmFuc2FjdGlvbihyZXN1bHQsIGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kb3RUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkVHggPSBkZWNvZGUodGhpcy5fZG90VHJhbnNhY3Rpb24sIHtcbiAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9kb3RUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICAgIGlzSW1tb3J0YWxFcmE6IHV0aWxzLmlzWmVyb0hleCh0aGlzLl9kb3RUcmFuc2FjdGlvbi5lcmEpLFxuICAgIH0pIGFzIHVua25vd24gYXMgRGVjb2RlZFR4O1xuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIHRoaXMuZGVjb2RlSW5wdXRzQW5kT3V0cHV0c0ZvclNlbmQoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkJhdGNoKSB7XG4gICAgICB0aGlzLmRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JCYXRjaChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKSB7XG4gICAgICB0aGlzLmRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JCb25kKGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW5sb2NrKSB7XG4gICAgICB0aGlzLmRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JVbmJvbmQoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdykge1xuICAgICAgdGhpcy5kZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yV2l0aGRyYXdVbmJvbmQoZGVjb2RlZFR4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JTZW5kKGRlY29kZWRUeDogRGVjb2RlZFR4KSB7XG4gICAgY29uc3QgdHhNZXRob2QgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3M7XG4gICAgbGV0IHRvOiBzdHJpbmc7XG4gICAgbGV0IHZhbHVlOiBzdHJpbmc7XG4gICAgbGV0IGZyb206IHN0cmluZztcbiAgICBpZiAodXRpbHMuaXNQcm94eVRyYW5zZmVyKHR4TWV0aG9kKSkge1xuICAgICAgY29uc3QgZGVjb2RlZENhbGwgPSB1dGlscy5kZWNvZGVDYWxsTWV0aG9kKHRoaXMuX2RvdFRyYW5zYWN0aW9uLCB7XG4gICAgICAgIG1ldGFkYXRhUnBjOiB0aGlzLl9kb3RUcmFuc2FjdGlvbi5tZXRhZGF0YVJwYyxcbiAgICAgICAgcmVnaXN0cnk6IHRoaXMuX3JlZ2lzdHJ5LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBrZXlwYWlyRGVzdCA9IG5ldyBLZXlQYWlyKHtcbiAgICAgICAgcHViOiBCdWZmZXIuZnJvbShkZWNvZGVBZGRyZXNzKGRlY29kZWRDYWxsLmRlc3QuaWQpKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGtleXBhaXJGcm9tID0gbmV3IEtleVBhaXIoe1xuICAgICAgICBwdWI6IEJ1ZmZlci5mcm9tKGRlY29kZUFkZHJlc3MoZ2V0QWRkcmVzcyh0eE1ldGhvZCkpKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIHRvID0ga2V5cGFpckRlc3QuZ2V0QWRkcmVzcyh1dGlscy5nZXRBZGRyZXNzRm9ybWF0KHRoaXMuX2NvaW5Db25maWcubmFtZSBhcyBEb3RBc3NldFR5cGVzKSk7XG4gICAgICB2YWx1ZSA9IGAke2RlY29kZWRDYWxsLnZhbHVlfWA7XG4gICAgICBmcm9tID0ga2V5cGFpckZyb20uZ2V0QWRkcmVzcyh1dGlscy5nZXRBZGRyZXNzRm9ybWF0KHRoaXMuX2NvaW5Db25maWcubmFtZSBhcyBEb3RBc3NldFR5cGVzKSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1RyYW5zZmVyQWxsKHR4TWV0aG9kKSkge1xuICAgICAgY29uc3Qga2V5cGFpckRlc3QgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyh0eE1ldGhvZC5kZXN0LmlkKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSk7XG4gICAgICB0byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcykpO1xuICAgICAgdmFsdWUgPSAnMCc7IC8vIERPVCB0cmFuc2ZlckFsbCdzIGRvIG5vdCBkZXNlcmlhbGl6ZSBhbW91bnRzXG4gICAgICBmcm9tID0gZGVjb2RlZFR4LmFkZHJlc3M7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1RyYW5zZmVyKHR4TWV0aG9kKSkge1xuICAgICAgY29uc3Qga2V5cGFpckRlc3QgPSBuZXcgS2V5UGFpcih7XG4gICAgICAgIHB1YjogQnVmZmVyLmZyb20oZGVjb2RlQWRkcmVzcyh0eE1ldGhvZC5kZXN0LmlkKSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSk7XG4gICAgICB0byA9IGtleXBhaXJEZXN0LmdldEFkZHJlc3ModXRpbHMuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLl9jb2luQ29uZmlnLm5hbWUgYXMgRG90QXNzZXRUeXBlcykpO1xuICAgICAgdmFsdWUgPSB0eE1ldGhvZC52YWx1ZTtcbiAgICAgIGZyb20gPSBkZWNvZGVkVHguYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcihgTG9hZGluZyBpbnB1dHMgb2YgdW5rbm93biBUcmFuc2ZlciB0eXBlIHBhcmFtZXRlcnNgKTtcbiAgICB9XG4gICAgdGhpcy5fb3V0cHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdG8sXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IGZyb20sXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGRlY29kZUlucHV0c0FuZE91dHB1dHNGb3JCYXRjaChkZWNvZGVkVHg6IERlY29kZWRUeCkge1xuICAgIGNvbnN0IHNlbmRlciA9IGRlY29kZWRUeC5hZGRyZXNzO1xuICAgIHRoaXMuX2lucHV0cyA9IFtdO1xuICAgIHRoaXMuX291dHB1dHMgPSBbXTtcblxuICAgIGNvbnN0IHR4TWV0aG9kID0gZGVjb2RlZFR4Lm1ldGhvZC5hcmdzO1xuICAgIGlmICh1dGlscy5pc1N0YWtpbmdCYXRjaCh0eE1ldGhvZCkpIHtcbiAgICAgIGlmICghdHhNZXRob2QuY2FsbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdmYWlsZWQgdG8gZGVjb2RlIGNhbGxzIGZyb20gYmF0Y2ggdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9uZE1ldGhvZCA9ICh0eE1ldGhvZC5jYWxsc1swXSBhcyBCYXRjaENhbGxPYmplY3QpLmNhbGxJbmRleDtcbiAgICAgIGNvbnN0IGRlY29kZWRCb25kQ2FsbCA9IHRoaXMuX3JlZ2lzdHJ5LmZpbmRNZXRhQ2FsbCh0b1VpbnQ4QXJyYXkodXRpbHMuc3RyaXBIZXhQcmVmaXgoYm9uZE1ldGhvZCkpKTtcbiAgICAgIGlmIChcbiAgICAgICAgZGVjb2RlZEJvbmRDYWxsLnNlY3Rpb24gIT09IFNlY3Rpb25OYW1lcy5TdGFraW5nIHx8XG4gICAgICAgIChkZWNvZGVkQm9uZENhbGwubWV0aG9kICE9PSBNZXRob2ROYW1lcy5Cb25kICYmIGRlY29kZWRCb25kQ2FsbC5tZXRob2QgIT09IE1ldGhvZE5hbWVzLkJvbmRFeHRyYSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgYmF0Y2ggdHJhbnNhY3Rpb24sIG9ubHkgc3Rha2luZyBiYXRjaCBjYWxscyBhcmUgc3VwcG9ydGVkLCBleHBlY3RlZCBmaXJzdCBjYWxsIHRvIGJlIGJvbmQgb3IgYm9uZCBleHRhLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFkZFByb3h5TWV0aG9kID0gKHR4TWV0aG9kLmNhbGxzWzFdIGFzIEJhdGNoQ2FsbE9iamVjdCkuY2FsbEluZGV4O1xuICAgICAgY29uc3QgZGVjb2RlZEFkZFByb3h5Q2FsbCA9IHRoaXMuX3JlZ2lzdHJ5LmZpbmRNZXRhQ2FsbCh0b1VpbnQ4QXJyYXkodXRpbHMuc3RyaXBIZXhQcmVmaXgoYWRkUHJveHlNZXRob2QpKSk7XG4gICAgICBpZiAoZGVjb2RlZEFkZFByb3h5Q2FsbC5zZWN0aW9uICE9PSBTZWN0aW9uTmFtZXMuUHJveHkgfHwgZGVjb2RlZEFkZFByb3h5Q2FsbC5tZXRob2QgIT09IE1ldGhvZE5hbWVzLkFkZFByb3h5KSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBiYXRjaCB0cmFuc2FjdGlvbiwgb25seSBzdGFraW5nIGJhdGNoIGNhbGxzIGFyZSBzdXBwb3J0ZWQsIGV4cGVjdGVkIHNlY29uZCBjYWxsIHRvIGJlIGFkZFByb3h5LidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGJvbmRWYWx1ZTtcbiAgICAgIGlmIChkZWNvZGVkQm9uZENhbGwubWV0aG9kID09PSBNZXRob2ROYW1lcy5Cb25kRXh0cmEgJiYgdXRpbHMuaXNCb25kQmF0Y2hFeHRyYSh0eE1ldGhvZC5jYWxsc1swXS5hcmdzKSkge1xuICAgICAgICBib25kVmFsdWUgPSBgJHsodHhNZXRob2QuY2FsbHNbMF0uYXJncyBhcyBTdGFrZU1vcmVDYWxsQXJncykubWF4X2FkZGl0aW9uYWx9YDtcbiAgICAgIH0gZWxzZSBpZiAoZGVjb2RlZEJvbmRDYWxsLm1ldGhvZCA9PT0gTWV0aG9kTmFtZXMuQm9uZEV4dHJhICYmIHV0aWxzLmlzQm9uZEV4dHJhKHR4TWV0aG9kLmNhbGxzWzBdLmFyZ3MpKSB7XG4gICAgICAgIGJvbmRWYWx1ZSA9IGAkeyh0eE1ldGhvZC5jYWxsc1swXS5hcmdzIGFzIFN0YWtlTW9yZUFyZ3MpLm1heEFkZGl0aW9uYWx9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJvbmRWYWx1ZSA9IGAkeyh0eE1ldGhvZC5jYWxsc1swXS5hcmdzIGFzIFN0YWtlQmF0Y2hDYWxsQXJncykudmFsdWV9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFkZFByb3h5QXJncyA9IHR4TWV0aG9kLmNhbGxzWzFdLmFyZ3MgYXMgQWRkUHJveHlCYXRjaENhbGxBcmdzO1xuICAgICAgY29uc3QgcHJveHlBZGRyZXNzID0gZ2V0RGVsZWdhdGVBZGRyZXNzKGFkZFByb3h5QXJncyk7XG5cbiAgICAgIHRoaXMuX2lucHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyLFxuICAgICAgICB2YWx1ZTogYm9uZFZhbHVlLFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX291dHB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IFNUQUtJTkdfREVTVElOQVRJT04sXG4gICAgICAgIHZhbHVlOiBib25kVmFsdWUsXG4gICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhZGRQcm94eUNvc3QgPSB0aGlzLmdldEFkZFByb3h5Q29zdCgpLnRvU3RyaW5nKDEwKTtcbiAgICAgIHRoaXMuX2lucHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyLFxuICAgICAgICB2YWx1ZTogYWRkUHJveHlDb3N0LFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX291dHB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IHByb3h5QWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IGFkZFByb3h5Q29zdCxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc1Vuc3Rha2luZ0JhdGNoKHR4TWV0aG9kKSkge1xuICAgICAgaWYgKCF0eE1ldGhvZC5jYWxscykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2ZhaWxlZCB0byBkZWNvZGUgY2FsbHMgZnJvbSBiYXRjaCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZW1vdmVQcm94eU1ldGhvZCA9ICh0eE1ldGhvZC5jYWxsc1swXSBhcyBCYXRjaENhbGxPYmplY3QpLmNhbGxJbmRleDtcbiAgICAgIGNvbnN0IGRlY29kZWRSZW1vdmVQcm94eUNhbGwgPSB0aGlzLl9yZWdpc3RyeS5maW5kTWV0YUNhbGwodG9VaW50OEFycmF5KHV0aWxzLnN0cmlwSGV4UHJlZml4KHJlbW92ZVByb3h5TWV0aG9kKSkpO1xuICAgICAgaWYgKFxuICAgICAgICBkZWNvZGVkUmVtb3ZlUHJveHlDYWxsLnNlY3Rpb24gIT09IFNlY3Rpb25OYW1lcy5Qcm94eSB8fFxuICAgICAgICBkZWNvZGVkUmVtb3ZlUHJveHlDYWxsLm1ldGhvZCAhPT0gTWV0aG9kTmFtZXMuUmVtb3ZlUHJveHlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgYmF0Y2ggdHJhbnNhY3Rpb24sIG9ubHkgc3Rha2luZyBiYXRjaCBjYWxscyBhcmUgc3VwcG9ydGVkLCBleHBlY3RlZCBmaXJzdCBjYWxsIHRvIGJlIHJlbW92ZVByb3h5LidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxsTWV0aG9kID0gKHR4TWV0aG9kLmNhbGxzWzFdIGFzIEJhdGNoQ2FsbE9iamVjdCkuY2FsbEluZGV4O1xuICAgICAgY29uc3QgZGVjb2RlZENoaWxsQ2FsbCA9IHRoaXMuX3JlZ2lzdHJ5LmZpbmRNZXRhQ2FsbCh0b1VpbnQ4QXJyYXkodXRpbHMuc3RyaXBIZXhQcmVmaXgoY2hpbGxNZXRob2QpKSk7XG4gICAgICBpZiAoZGVjb2RlZENoaWxsQ2FsbC5zZWN0aW9uICE9PSBTZWN0aW9uTmFtZXMuU3Rha2luZyB8fCBkZWNvZGVkQ2hpbGxDYWxsLm1ldGhvZCAhPT0gTWV0aG9kTmFtZXMuQ2hpbGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICdJbnZhbGlkIGJhdGNoIHRyYW5zYWN0aW9uLCBvbmx5IHN0YWtpbmcgYmF0Y2ggY2FsbHMgYXJlIHN1cHBvcnRlZCwgZXhwZWN0ZWQgc2Vjb25kIGNhbGwgdG8gYmUgY2hpbGwuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgdW5zdGFrZU1ldGhvZCA9ICh0eE1ldGhvZC5jYWxsc1syXSBhcyBCYXRjaENhbGxPYmplY3QpLmNhbGxJbmRleDtcbiAgICAgIGNvbnN0IGRlY29kZWRVbnN0YWtlQ2FsbCA9IHRoaXMuX3JlZ2lzdHJ5LmZpbmRNZXRhQ2FsbCh0b1VpbnQ4QXJyYXkodXRpbHMuc3RyaXBIZXhQcmVmaXgodW5zdGFrZU1ldGhvZCkpKTtcbiAgICAgIGlmIChkZWNvZGVkVW5zdGFrZUNhbGwuc2VjdGlvbiAhPT0gU2VjdGlvbk5hbWVzLlN0YWtpbmcgfHwgZGVjb2RlZFVuc3Rha2VDYWxsLm1ldGhvZCAhPT0gTWV0aG9kTmFtZXMuVW5ib25kKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBiYXRjaCB0cmFuc2FjdGlvbiwgb25seSBzdGFraW5nIGJhdGNoIGNhbGxzIGFyZSBzdXBwb3J0ZWQsIGV4cGVjdGVkIHRoaXJkIGNhbGwgdG8gYmUgdW5ib25kLidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVtb3ZlUHJveHlBcmdzID0gdHhNZXRob2QuY2FsbHNbMF0uYXJncyBhcyBBZGRQcm94eUJhdGNoQ2FsbEFyZ3M7XG4gICAgICBjb25zdCBwcm94eUFkZHJlc3MgPSBnZXREZWxlZ2F0ZUFkZHJlc3MocmVtb3ZlUHJveHlBcmdzKTtcblxuICAgICAgY29uc3QgcmVtb3ZlUHJveHlDb3N0ID0gdGhpcy5nZXRSZW1vdmVQcm94eUNvc3QoKS50b1N0cmluZygxMCk7XG4gICAgICB0aGlzLl9pbnB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IHByb3h5QWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHJlbW92ZVByb3h5Q29zdCxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSk7XG4gICAgICB0aGlzLl9vdXRwdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiBzZW5kZXIsXG4gICAgICAgIHZhbHVlOiByZW1vdmVQcm94eUNvc3QsXG4gICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVtb3ZlUHJveHlDb3N0KCk6IEJpZ051bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWRkUHJveHlDb3N0KCk7XG4gIH1cblxuICBwcml2YXRlIGdldEFkZFByb3h5Q29zdCgpOiBCaWdOdW1iZXIge1xuICAgIGNvbnN0IHByb3h5UGFsbGV0ID0gdGhpcy5fcmVnaXN0cnkubWV0YWRhdGEucGFsbGV0cy5maW5kKFxuICAgICAgKHApID0+IHAubmFtZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09IFNlY3Rpb25OYW1lcy5Qcm94eVxuICAgICk7XG4gICAgaWYgKHByb3h5UGFsbGV0KSB7XG4gICAgICBjb25zdCBwcm94eURlcG9zaXRCYXNlID0gdGhpcy5nZXRDb25zdGFudCgnUHJveHlEZXBvc2l0QmFzZScsIHByb3h5UGFsbGV0LmNvbnN0YW50cyk7XG4gICAgICBjb25zdCBwcm94eURlcG9zaXRGYWN0b3IgPSB0aGlzLmdldENvbnN0YW50KCdQcm94eURlcG9zaXRGYWN0b3InLCBwcm94eVBhbGxldC5jb25zdGFudHMpO1xuICAgICAgcmV0dXJuIHByb3h5RGVwb3NpdEJhc2UucGx1cyhwcm94eURlcG9zaXRGYWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYWxsZXROYW1lcyA9IHRoaXMuX3JlZ2lzdHJ5Lm1ldGFkYXRhLnBhbGxldHMubWFwKChwKSA9PiBwLm5hbWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgJHtTZWN0aW9uTmFtZXMuUHJveHl9IHBhbGxldCBpbiBbJHtwYWxsZXROYW1lc31dYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25zdGFudChuYW1lOiBzdHJpbmcsIGNvbnN0YW50czogVmVjPFBhbGxldENvbnN0YW50TWV0YWRhdGFWMTQ+KTogQmlnTnVtYmVyIHtcbiAgICBjb25zdCBjb25zdGFudCA9IGNvbnN0YW50cy5maW5kKChjKSA9PiBjLm5hbWUudG9TdHJpbmcoKSA9PT0gbmFtZSk7XG4gICAgaWYgKGNvbnN0YW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvbnN0YW50TmFtZXMgPSBjb25zdGFudHMubWFwKChwKSA9PiBwLm5hbWUudG9TdHJpbmcoKSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGNvbnN0YW50ICR7bmFtZX0gaW4gWyR7Y29uc3RhbnROYW1lc31dYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbnZlcnQgZnJvbSBMaXR0bGUtRW5kaWFuIHRvIEJpZy1FbmRpYW5cbiAgICAgIGNvbnN0IHZhbHVlQmUgPSBCdWZmZXIuZnJvbShjb25zdGFudC52YWx1ZS50b1U4YSh0cnVlKS5yZXZlcnNlKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIHJldHVybiBCaWdOdW1iZXIodmFsdWVCZSwgMTYpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVjb2RlSW5wdXRzQW5kT3V0cHV0c0ZvckJvbmQoZGVjb2RlZFR4OiBEZWNvZGVkVHgpIHtcbiAgICBjb25zdCBzZW5kZXIgPSBkZWNvZGVkVHguYWRkcmVzcztcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgICB0aGlzLl9vdXRwdXRzID0gW107XG5cbiAgICBjb25zdCB0eE1ldGhvZCA9IGRlY29kZWRUeC5tZXRob2QuYXJncztcbiAgICBpZiAoZGVjb2RlZFR4Lm1ldGhvZC5wYWxsZXQgPT09IFNlY3Rpb25OYW1lcy5TdGFraW5nKSB7XG4gICAgICBsZXQgYm9uZFZhbHVlID0gJzAnO1xuICAgICAgaWYgKGRlY29kZWRUeC5tZXRob2QubmFtZSA9PT0gTWV0aG9kTmFtZXMuQm9uZCAmJiB1dGlscy5pc0JvbmQodHhNZXRob2QpKSB7XG4gICAgICAgIGJvbmRWYWx1ZSA9IHR4TWV0aG9kLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChkZWNvZGVkVHgubWV0aG9kLm5hbWUgPT09IE1ldGhvZE5hbWVzLkJvbmRFeHRyYSAmJiB1dGlscy5pc0JvbmRFeHRyYSh0eE1ldGhvZCkpIHtcbiAgICAgICAgYm9uZFZhbHVlID0gdHhNZXRob2QubWF4QWRkaXRpb25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYExvYWRpbmcgaW5wdXRzIG9mIHVua25vd24gU3Rha2luZ0FjdGl2YXRlIHR5cGUgcGFyYW1ldGVyc2ApO1xuICAgICAgfVxuICAgICAgdGhpcy5faW5wdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiBzZW5kZXIsXG4gICAgICAgIHZhbHVlOiBib25kVmFsdWUsXG4gICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogU1RBS0lOR19ERVNUSU5BVElPTixcbiAgICAgICAgdmFsdWU6IGJvbmRWYWx1ZSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yVW5ib25kKGRlY29kZWRUeDogRGVjb2RlZFR4KSB7XG4gICAgdGhpcy5faW5wdXRzID0gW107XG4gICAgdGhpcy5fb3V0cHV0cyA9IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGVJbnB1dHNBbmRPdXRwdXRzRm9yV2l0aGRyYXdVbmJvbmQoZGVjb2RlZFR4OiBEZWNvZGVkVHgpIHtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgICB0aGlzLl9vdXRwdXRzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHNpZ25lZCBwYXlsb2FkIHVzaW5nIGNvbnN0cnVjdC5zaWduVHhcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBidWlsZCBzdGVwIGlmIGEgVFNTIHNpZ25hdHVyZVxuICAgKiBpcyBhZGRlZCBhbmQgd2lsbCBzZXQgdGhlIHNpZ25UcmFuc2FjdGlvbiB3aGljaCBpcyB0aGUgdHhIZXggdGhhdCB3aWxsIGJlIGJyb2FkY2FzdGVkXG4gICAqIEFzIHdlbGwgYXMgYWRkIHRoZSBzaWduYXR1cmUgdXNlZCB0byBzaWduIHRvIHRoZSBzaWduYXR1cmUgYXJyYXkgaW4gaGV4IGZvcm1hdFxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgdG8gYmUgYWRkZWQgdG8gYSBkb3QgdHJhbnNhY3Rpb25cbiAgICovXG4gIGNvbnN0cnVjdFNpZ25lZFBheWxvYWQoc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAvLyAweDAwIG1lYW5zIGl0cyBhbiBFRDI1NTE5IHNpZ25hdHVyZVxuICAgIGNvbnN0IGVkU2lnbmF0dXJlID0gYDB4MDAke3NpZ25hdHVyZS50b1N0cmluZygnaGV4Jyl9YCBhcyBIZXhTdHJpbmc7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24gPSBjb25zdHJ1Y3Quc2lnbmVkVHgodGhpcy5fZG90VHJhbnNhY3Rpb24sIGVkU2lnbmF0dXJlLCB7XG4gICAgICAgIHJlZ2lzdHJ5OiB0aGlzLl9yZWdpc3RyeSxcbiAgICAgICAgbWV0YWRhdGFScGM6IHRoaXMuX2RvdFRyYW5zYWN0aW9uLm1ldGFkYXRhUnBjLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihgVW5hYmxlIHRvIHNpZ24gZG90IHRyYW5zYWN0aW9uIHdpdGggc2lnbmF0dXJlICR7ZWRTaWduYXR1cmV9IGAgKyBlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW3NpZ25hdHVyZS50b1N0cmluZygnaGV4JyldO1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFVuc2lnbmVkVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9kb3RUcmFuc2FjdGlvbiA9IHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICoqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgZXh0cmluc2ljUGF5bG9hZCA9IHRoaXMuX3JlZ2lzdHJ5LmNyZWF0ZVR5cGUoJ0V4dHJpbnNpY1BheWxvYWQnLCB0aGlzLl9kb3RUcmFuc2FjdGlvbiwge1xuICAgICAgdmVyc2lvbjogRVhUUklOU0lDX1ZFUlNJT04sXG4gICAgfSk7XG4gICAgcmV0dXJuIHU4YVRvQnVmZmVyKGV4dHJpbnNpY1BheWxvYWQudG9VOGEoeyBtZXRob2Q6IHRydWUgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXQuXG4gICAqL1xuICB0cmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG59XG4iXX0=