@bitgo-beta/sdk-coin-dot 2.2.8-beta.202 → 2.2.8-beta.2021

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 (293) hide show
  1. package/dist/{src → cjs/src}/dot.d.ts +25 -20
  2. package/dist/cjs/src/dot.d.ts.map +1 -0
  3. package/dist/cjs/src/dot.js +655 -0
  4. package/dist/cjs/src/index.d.ts.map +1 -0
  5. package/dist/{src → cjs/src}/index.js +6 -2
  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/{src → cjs/src}/lib/batchTransactionBuilder.d.ts +1 -0
  9. package/dist/cjs/src/lib/batchTransactionBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/batchTransactionBuilder.js +229 -0
  11. package/dist/cjs/src/lib/claimBuilder.d.ts.map +1 -0
  12. package/dist/cjs/src/lib/claimBuilder.js +117 -0
  13. package/dist/cjs/src/lib/errors.d.ts.map +1 -0
  14. package/dist/cjs/src/lib/errors.js +19 -0
  15. package/dist/{src → cjs/src}/lib/iface.d.ts +16 -13
  16. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/iface.js +128 -0
  18. package/dist/cjs/src/lib/iface_utils.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/iface_utils.js +92 -0
  20. package/dist/{src → cjs/src}/lib/index.d.ts +2 -0
  21. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/index.js +73 -0
  23. package/dist/{src → cjs/src}/lib/keyPair.d.ts +7 -0
  24. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/keyPair.js +117 -0
  26. package/dist/cjs/src/lib/nativeTransferBuilder.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/nativeTransferBuilder.js +219 -0
  28. package/dist/cjs/src/lib/proxyBuilder.d.ts.map +1 -0
  29. package/dist/cjs/src/lib/proxyBuilder.js +116 -0
  30. package/dist/cjs/src/lib/singletonRegistry.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/singletonRegistry.js +20 -0
  32. package/dist/cjs/src/lib/stakingBuilder.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/stakingBuilder.js +167 -0
  34. package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -1
  35. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/transaction.js +624 -0
  37. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -1
  38. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/transactionBuilder.js +351 -0
  40. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  41. package/dist/cjs/src/lib/transactionBuilderFactory.js +104 -0
  42. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/transferBuilder.js +11 -0
  44. package/dist/cjs/src/lib/txnSchema.d.ts.map +1 -0
  45. package/dist/cjs/src/lib/txnSchema.js +117 -0
  46. package/dist/cjs/src/lib/unnominateBuilder.d.ts.map +1 -0
  47. package/dist/cjs/src/lib/unnominateBuilder.js +48 -0
  48. package/dist/cjs/src/lib/unstakeBuilder.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/unstakeBuilder.js +87 -0
  50. package/dist/{src → cjs/src}/lib/utils.d.ts +10 -2
  51. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/utils.js +491 -0
  53. package/dist/cjs/src/lib/wasmParser.d.ts +57 -0
  54. package/dist/cjs/src/lib/wasmParser.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/wasmParser.js +345 -0
  56. package/dist/cjs/src/lib/withdrawUnstakedBuilder.d.ts.map +1 -0
  57. package/dist/cjs/src/lib/withdrawUnstakedBuilder.js +88 -0
  58. package/dist/cjs/src/register.d.ts.map +1 -0
  59. package/dist/cjs/src/register.js +11 -0
  60. package/dist/cjs/src/resources/index.d.ts +5 -0
  61. package/dist/cjs/src/resources/index.d.ts.map +1 -0
  62. package/dist/cjs/src/resources/index.js +21 -0
  63. package/dist/cjs/src/resources/mainnet.d.ts.map +1 -0
  64. package/dist/cjs/src/resources/mainnet.js +5 -0
  65. package/dist/cjs/src/resources/polkadotAssetHub.d.ts +2 -0
  66. package/dist/cjs/src/resources/polkadotAssetHub.d.ts.map +1 -0
  67. package/dist/cjs/src/resources/polkadotAssetHub.js +5 -0
  68. package/dist/cjs/src/resources/westend.d.ts.map +1 -0
  69. package/dist/cjs/src/resources/westend.js +5 -0
  70. package/dist/cjs/src/resources/westendAssetHub.d.ts +2 -0
  71. package/dist/cjs/src/resources/westendAssetHub.d.ts.map +1 -0
  72. package/dist/cjs/src/resources/westendAssetHub.js +5 -0
  73. package/dist/cjs/src/tdot.d.ts.map +1 -0
  74. package/dist/cjs/src/tdot.js +27 -0
  75. package/dist/cjs/test/fixtures.d.ts +283 -0
  76. package/dist/cjs/test/fixtures.d.ts.map +1 -0
  77. package/dist/cjs/test/fixtures.js +439 -0
  78. package/dist/cjs/test/resources/index.d.ts +141 -0
  79. package/dist/cjs/test/resources/index.d.ts.map +1 -0
  80. package/dist/cjs/test/resources/index.js +157 -0
  81. package/dist/cjs/test/resources/materialData.json +8 -0
  82. package/dist/cjs/test/resources/materialDataModified.json +8 -0
  83. package/dist/cjs/test/resources/testnet.d.ts +2 -0
  84. package/dist/cjs/test/resources/testnet.d.ts.map +1 -0
  85. package/dist/{src/resources/westend.js → cjs/test/resources/testnet.js} +3 -3
  86. package/dist/cjs/test/unit/address.d.ts +2 -0
  87. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  88. package/dist/cjs/test/unit/address.js +45 -0
  89. package/dist/cjs/test/unit/dot.d.ts +2 -0
  90. package/dist/cjs/test/unit/dot.d.ts.map +1 -0
  91. package/dist/cjs/test/unit/dot.js +1226 -0
  92. package/dist/cjs/test/unit/keypair.d.ts +2 -0
  93. package/dist/cjs/test/unit/keypair.d.ts.map +1 -0
  94. package/dist/cjs/test/unit/keypair.js +111 -0
  95. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  96. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  97. package/dist/cjs/test/unit/transaction.js +269 -0
  98. package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.d.ts +2 -0
  99. package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
  100. package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.js +265 -0
  101. package/dist/cjs/test/unit/transactionBuilder/base.d.ts +8 -0
  102. package/dist/cjs/test/unit/transactionBuilder/base.d.ts.map +1 -0
  103. package/dist/cjs/test/unit/transactionBuilder/base.js +233 -0
  104. package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.d.ts +2 -0
  105. package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.d.ts.map +1 -0
  106. package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.js +521 -0
  107. package/dist/cjs/test/unit/transactionBuilder/claimBuilder.d.ts +2 -0
  108. package/dist/cjs/test/unit/transactionBuilder/claimBuilder.d.ts.map +1 -0
  109. package/dist/cjs/test/unit/transactionBuilder/claimBuilder.js +129 -0
  110. package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.d.ts +2 -0
  111. package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.d.ts.map +1 -0
  112. package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.js +88 -0
  113. package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.d.ts +2 -0
  114. package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.d.ts.map +1 -0
  115. package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.js +59 -0
  116. package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  117. package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  118. package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.js +235 -0
  119. package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
  120. package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
  121. package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.js +107 -0
  122. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  123. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  124. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +444 -0
  125. package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.d.ts +2 -0
  126. package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.d.ts.map +1 -0
  127. package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.js +97 -0
  128. package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.d.ts +2 -0
  129. package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.d.ts.map +1 -0
  130. package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.js +116 -0
  131. package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts +2 -0
  132. package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts.map +1 -0
  133. package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.js +115 -0
  134. package/dist/cjs/test/unit/utils.d.ts +2 -0
  135. package/dist/cjs/test/unit/utils.d.ts.map +1 -0
  136. package/dist/cjs/test/unit/utils.js +117 -0
  137. package/dist/cjs/test/unit/wasmBuilderByteComparison.d.ts +22 -0
  138. package/dist/cjs/test/unit/wasmBuilderByteComparison.d.ts.map +1 -0
  139. package/dist/cjs/test/unit/wasmBuilderByteComparison.js +197 -0
  140. package/dist/cjs/test/unit/wasmParserExplanation.d.ts +15 -0
  141. package/dist/cjs/test/unit/wasmParserExplanation.d.ts.map +1 -0
  142. package/dist/cjs/test/unit/wasmParserExplanation.js +147 -0
  143. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  144. package/dist/esm/dot.d.ts +163 -0
  145. package/dist/esm/dot.d.ts.map +1 -0
  146. package/dist/esm/dot.js +615 -0
  147. package/dist/esm/index.d.ts +5 -0
  148. package/dist/esm/index.js +5 -0
  149. package/dist/esm/lib/addressInitializationBuilder.d.ts +79 -0
  150. package/dist/esm/lib/addressInitializationBuilder.js +175 -0
  151. package/dist/esm/lib/batchTransactionBuilder.d.ts +62 -0
  152. package/dist/{src → esm}/lib/batchTransactionBuilder.d.ts.map +1 -1
  153. package/dist/esm/lib/batchTransactionBuilder.js +222 -0
  154. package/dist/esm/lib/claimBuilder.d.ts +58 -0
  155. package/dist/esm/lib/claimBuilder.js +110 -0
  156. package/dist/esm/lib/errors.d.ts +8 -0
  157. package/dist/esm/lib/errors.js +14 -0
  158. package/dist/esm/lib/iface.d.ts +337 -0
  159. package/dist/esm/lib/iface.d.ts.map +1 -0
  160. package/dist/esm/lib/iface.js +125 -0
  161. package/dist/esm/lib/iface_utils.d.ts +59 -0
  162. package/dist/esm/lib/iface_utils.js +83 -0
  163. package/dist/esm/lib/index.d.ts +21 -0
  164. package/dist/{src → esm}/lib/index.d.ts.map +1 -1
  165. package/dist/esm/lib/index.js +20 -0
  166. package/dist/esm/lib/keyPair.d.ts +38 -0
  167. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  168. package/dist/esm/lib/keyPair.js +77 -0
  169. package/dist/esm/lib/nativeTransferBuilder.d.ts +84 -0
  170. package/dist/esm/lib/nativeTransferBuilder.js +212 -0
  171. package/dist/esm/lib/proxyBuilder.d.ts +54 -0
  172. package/dist/esm/lib/proxyBuilder.js +109 -0
  173. package/dist/esm/lib/singletonRegistry.d.ts +7 -0
  174. package/dist/esm/lib/singletonRegistry.js +16 -0
  175. package/dist/esm/lib/stakingBuilder.d.ts +66 -0
  176. package/dist/esm/lib/stakingBuilder.js +160 -0
  177. package/dist/esm/lib/transaction.d.ts +83 -0
  178. package/dist/esm/lib/transaction.d.ts.map +1 -0
  179. package/dist/esm/lib/transaction.js +584 -0
  180. package/dist/esm/lib/transactionBuilder.d.ts +131 -0
  181. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  182. package/dist/esm/lib/transactionBuilder.js +311 -0
  183. package/dist/esm/lib/transactionBuilderFactory.d.ts +28 -0
  184. package/dist/esm/lib/transactionBuilderFactory.js +97 -0
  185. package/dist/esm/lib/transferBuilder.d.ts +11 -0
  186. package/dist/esm/lib/transferBuilder.js +7 -0
  187. package/dist/esm/lib/txnSchema.d.ts +15 -0
  188. package/dist/esm/lib/txnSchema.js +111 -0
  189. package/dist/esm/lib/unnominateBuilder.d.ts +24 -0
  190. package/dist/esm/lib/unnominateBuilder.js +44 -0
  191. package/dist/esm/lib/unstakeBuilder.d.ts +38 -0
  192. package/dist/esm/lib/unstakeBuilder.js +80 -0
  193. package/dist/esm/lib/utils.d.ts +261 -0
  194. package/dist/esm/lib/utils.d.ts.map +1 -0
  195. package/dist/esm/lib/utils.js +451 -0
  196. package/dist/esm/lib/wasmParser.d.ts +57 -0
  197. package/dist/esm/lib/wasmParser.d.ts.map +1 -0
  198. package/dist/esm/lib/wasmParser.js +341 -0
  199. package/dist/esm/lib/withdrawUnstakedBuilder.d.ts +38 -0
  200. package/dist/esm/lib/withdrawUnstakedBuilder.js +81 -0
  201. package/dist/esm/register.d.ts +3 -0
  202. package/dist/esm/register.js +7 -0
  203. package/dist/esm/resources/index.d.ts +5 -0
  204. package/dist/{src → esm}/resources/index.d.ts.map +1 -1
  205. package/dist/esm/resources/index.js +5 -0
  206. package/dist/esm/resources/mainnet.d.ts +2 -0
  207. package/dist/esm/resources/mainnet.js +2 -0
  208. package/dist/esm/resources/polkadotAssetHub.d.ts +2 -0
  209. package/dist/esm/resources/polkadotAssetHub.d.ts.map +1 -0
  210. package/dist/esm/resources/polkadotAssetHub.js +2 -0
  211. package/dist/esm/resources/westend.d.ts +2 -0
  212. package/dist/esm/resources/westend.js +2 -0
  213. package/dist/esm/resources/westendAssetHub.d.ts +2 -0
  214. package/dist/esm/resources/westendAssetHub.d.ts.map +1 -0
  215. package/dist/esm/resources/westendAssetHub.js +2 -0
  216. package/dist/esm/tdot.d.ts +12 -0
  217. package/dist/esm/tdot.js +23 -0
  218. package/package.json +43 -21
  219. package/.eslintignore +0 -5
  220. package/.mocharc.yml +0 -8
  221. package/CHANGELOG.md +0 -656
  222. package/LICENSE +0 -191
  223. package/dist/src/dot.d.ts.map +0 -1
  224. package/dist/src/dot.js +0 -562
  225. package/dist/src/lib/addressInitializationBuilder.js +0 -184
  226. package/dist/src/lib/batchTransactionBuilder.js +0 -220
  227. package/dist/src/lib/claimBuilder.js +0 -119
  228. package/dist/src/lib/errors.js +0 -19
  229. package/dist/src/lib/iface.d.ts.map +0 -1
  230. package/dist/src/lib/iface.js +0 -128
  231. package/dist/src/lib/iface_utils.js +0 -93
  232. package/dist/src/lib/index.js +0 -57
  233. package/dist/src/lib/keyPair.d.ts.map +0 -1
  234. package/dist/src/lib/keyPair.js +0 -70
  235. package/dist/src/lib/nativeTransferBuilder.js +0 -221
  236. package/dist/src/lib/proxyBuilder.js +0 -118
  237. package/dist/src/lib/singletonRegistry.js +0 -20
  238. package/dist/src/lib/stakingBuilder.js +0 -169
  239. package/dist/src/lib/transaction.d.ts.map +0 -1
  240. package/dist/src/lib/transaction.js +0 -590
  241. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  242. package/dist/src/lib/transactionBuilder.js +0 -337
  243. package/dist/src/lib/transactionBuilderFactory.js +0 -105
  244. package/dist/src/lib/transferBuilder.js +0 -11
  245. package/dist/src/lib/txnSchema.js +0 -117
  246. package/dist/src/lib/unnominateBuilder.js +0 -50
  247. package/dist/src/lib/unstakeBuilder.js +0 -89
  248. package/dist/src/lib/utils.d.ts.map +0 -1
  249. package/dist/src/lib/utils.js +0 -458
  250. package/dist/src/lib/withdrawUnstakedBuilder.js +0 -90
  251. package/dist/src/register.js +0 -11
  252. package/dist/src/resources/index.d.ts +0 -3
  253. package/dist/src/resources/index.js +0 -15
  254. package/dist/src/resources/mainnet.js +0 -5
  255. package/dist/src/tdot.js +0 -27
  256. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  257. /package/dist/{src → cjs/src}/lib/addressInitializationBuilder.d.ts +0 -0
  258. /package/dist/{src → cjs/src}/lib/claimBuilder.d.ts +0 -0
  259. /package/dist/{src → cjs/src}/lib/errors.d.ts +0 -0
  260. /package/dist/{src → cjs/src}/lib/iface_utils.d.ts +0 -0
  261. /package/dist/{src → cjs/src}/lib/nativeTransferBuilder.d.ts +0 -0
  262. /package/dist/{src → cjs/src}/lib/proxyBuilder.d.ts +0 -0
  263. /package/dist/{src → cjs/src}/lib/singletonRegistry.d.ts +0 -0
  264. /package/dist/{src → cjs/src}/lib/stakingBuilder.d.ts +0 -0
  265. /package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +0 -0
  266. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  267. /package/dist/{src → cjs/src}/lib/txnSchema.d.ts +0 -0
  268. /package/dist/{src → cjs/src}/lib/unnominateBuilder.d.ts +0 -0
  269. /package/dist/{src → cjs/src}/lib/unstakeBuilder.d.ts +0 -0
  270. /package/dist/{src → cjs/src}/lib/withdrawUnstakedBuilder.d.ts +0 -0
  271. /package/dist/{src → cjs/src}/register.d.ts +0 -0
  272. /package/dist/{src → cjs/src}/resources/mainnet.d.ts +0 -0
  273. /package/dist/{src → cjs/src}/resources/westend.d.ts +0 -0
  274. /package/dist/{src → cjs/src}/tdot.d.ts +0 -0
  275. /package/dist/{src → esm}/index.d.ts.map +0 -0
  276. /package/dist/{src → esm}/lib/addressInitializationBuilder.d.ts.map +0 -0
  277. /package/dist/{src → esm}/lib/claimBuilder.d.ts.map +0 -0
  278. /package/dist/{src → esm}/lib/errors.d.ts.map +0 -0
  279. /package/dist/{src → esm}/lib/iface_utils.d.ts.map +0 -0
  280. /package/dist/{src → esm}/lib/nativeTransferBuilder.d.ts.map +0 -0
  281. /package/dist/{src → esm}/lib/proxyBuilder.d.ts.map +0 -0
  282. /package/dist/{src → esm}/lib/singletonRegistry.d.ts.map +0 -0
  283. /package/dist/{src → esm}/lib/stakingBuilder.d.ts.map +0 -0
  284. /package/dist/{src → esm}/lib/transactionBuilderFactory.d.ts.map +0 -0
  285. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  286. /package/dist/{src → esm}/lib/txnSchema.d.ts.map +0 -0
  287. /package/dist/{src → esm}/lib/unnominateBuilder.d.ts.map +0 -0
  288. /package/dist/{src → esm}/lib/unstakeBuilder.d.ts.map +0 -0
  289. /package/dist/{src → esm}/lib/withdrawUnstakedBuilder.d.ts.map +0 -0
  290. /package/dist/{src → esm}/register.d.ts.map +0 -0
  291. /package/dist/{src → esm}/resources/mainnet.d.ts.map +0 -0
  292. /package/dist/{src → esm}/resources/westend.d.ts.map +0 -0
  293. /package/dist/{src → esm}/tdot.d.ts.map +0 -0
@@ -0,0 +1,655 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.Dot = exports.DEFAULT_SCAN_FACTOR = void 0;
40
+ const assert_1 = __importDefault(require("assert"));
41
+ const _ = __importStar(require("lodash"));
42
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
43
+ const statics_1 = require("@bitgo-beta/statics");
44
+ const lib_1 = require("./lib");
45
+ require("@polkadot/api-augment");
46
+ const api_1 = require("@polkadot/api");
47
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
48
+ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
49
+ exports.DEFAULT_SCAN_FACTOR = 20; // default number of receive addresses to scan for funds
50
+ const dotUtils = lib_1.Utils.default;
51
+ function isEddsaSigningMaterial(value) {
52
+ if (typeof value !== 'object' || value === null) {
53
+ return false;
54
+ }
55
+ if (!('version' in value)) {
56
+ return false;
57
+ }
58
+ if (value.version === 'v1') {
59
+ return 'userPrv' in value && typeof value.userPrv === 'string';
60
+ }
61
+ if (value.version === 'v2') {
62
+ return 'encryptedUserKey' in value && typeof value.encryptedUserKey === 'string';
63
+ }
64
+ return false;
65
+ }
66
+ class Dot extends sdk_core_1.BaseCoin {
67
+ constructor(bitgo, staticsCoin) {
68
+ super(bitgo);
69
+ this.MAX_VALIDITY_DURATION = 2400;
70
+ this.SWEEP_TXN_DURATION = 64;
71
+ if (!staticsCoin) {
72
+ throw new Error('missing required constructor parameter staticsCoin');
73
+ }
74
+ this._staticsCoin = staticsCoin;
75
+ }
76
+ static createInstance(bitgo, staticsCoin) {
77
+ return new Dot(bitgo, staticsCoin);
78
+ }
79
+ getChain() {
80
+ return 'dot';
81
+ }
82
+ getBaseChain() {
83
+ return 'dot';
84
+ }
85
+ getFamily() {
86
+ return 'dot';
87
+ }
88
+ getFullName() {
89
+ return 'Polkadot';
90
+ }
91
+ getBaseFactor() {
92
+ return Math.pow(10, this._staticsCoin.decimalPlaces);
93
+ }
94
+ /**
95
+ * Flag for sending value of 0
96
+ * @returns {boolean} True if okay to send 0 value, false otherwise
97
+ */
98
+ valuelessTransferAllowed() {
99
+ return true;
100
+ }
101
+ /** @inheritDoc */
102
+ supportsTss() {
103
+ return true;
104
+ }
105
+ /** inherited doc */
106
+ getDefaultMultisigType() {
107
+ return sdk_core_1.multisigTypes.tss;
108
+ }
109
+ getMPCAlgorithm() {
110
+ return 'eddsa';
111
+ }
112
+ allowsAccountConsolidations() {
113
+ return true;
114
+ }
115
+ /**
116
+ * Generate ed25519 key pair
117
+ *
118
+ * @param seed
119
+ * @returns {Object} object with generated pub, prv
120
+ */
121
+ generateKeyPair(seed) {
122
+ const keyPair = seed ? dotUtils.keyPairFromSeed(new Uint8Array(seed)) : new lib_1.KeyPair();
123
+ const keys = keyPair.getKeys();
124
+ if (!keys.prv) {
125
+ throw new Error('Missing prv in key generation.');
126
+ }
127
+ return {
128
+ pub: keys.pub,
129
+ prv: keys.prv,
130
+ };
131
+ }
132
+ /**
133
+ * Return boolean indicating whether input is valid public key for the coin.
134
+ *
135
+ * @param {String} pub the pub to be checked
136
+ * @returns {Boolean} is it valid?
137
+ */
138
+ isValidPub(pub) {
139
+ return dotUtils.isValidPublicKey(pub);
140
+ }
141
+ /**
142
+ * Return boolean indicating whether the supplied private key is a valid dot private key
143
+ *
144
+ * @param {String} prv the prv to be checked
145
+ * @returns {Boolean} is it valid?
146
+ */
147
+ isValidPrv(prv) {
148
+ return dotUtils.isValidPrivateKey(prv);
149
+ }
150
+ /**
151
+ * Return boolean indicating whether input is valid public key for the coin
152
+ *
153
+ * @param {String} address the pub to be checked
154
+ * @returns {Boolean} is it valid?
155
+ */
156
+ isValidAddress(address) {
157
+ return dotUtils.isValidAddress(address);
158
+ }
159
+ /**
160
+ * Sign message with private key
161
+ *
162
+ * @param key
163
+ * @param message
164
+ * @return {Buffer} A signature over the given message using the given key
165
+ */
166
+ async signMessage(key, message) {
167
+ const msg = Buffer.isBuffer(message) ? message.toString('utf8') : message;
168
+ // reconstitute keys and sign
169
+ return Buffer.from(new lib_1.KeyPair({ prv: key.prv }).signMessage(msg));
170
+ }
171
+ /**
172
+ * Explain/parse transaction
173
+ * @param unsignedTransaction
174
+ */
175
+ async explainTransaction(unsignedTransaction) {
176
+ let outputAmount = 0;
177
+ unsignedTransaction.parsedTx.outputs.forEach((o) => {
178
+ outputAmount += parseInt(o.valueString, 10);
179
+ });
180
+ const explanationResult = {
181
+ displayOrder: [
182
+ 'outputAmount',
183
+ 'changeAmount',
184
+ 'outputs',
185
+ 'changeOutputs',
186
+ 'fee',
187
+ 'type',
188
+ 'sequenceId',
189
+ 'id',
190
+ 'blockNumber',
191
+ ],
192
+ sequenceId: unsignedTransaction.parsedTx.sequenceId,
193
+ fee: unsignedTransaction.feeInfo?.feeString,
194
+ id: unsignedTransaction.parsedTx.id,
195
+ type: unsignedTransaction.parsedTx.type,
196
+ outputs: unsignedTransaction.parsedTx.outputs,
197
+ blockNumber: unsignedTransaction.coinSpecific?.blockNumber,
198
+ outputAmount: outputAmount,
199
+ changeOutputs: [],
200
+ changeAmount: '0',
201
+ };
202
+ return explanationResult;
203
+ }
204
+ verifySignTransactionParams(params) {
205
+ const prv = params.prv;
206
+ const txHex = params.txPrebuild.txHex;
207
+ if (!txHex) {
208
+ throw new Error('missing txPrebuild parameter');
209
+ }
210
+ if (!_.isString(txHex)) {
211
+ throw new Error(`txPrebuild must be an object, got type ${typeof txHex}`);
212
+ }
213
+ if (!prv) {
214
+ throw new Error('missing prv parameter to sign transaction');
215
+ }
216
+ if (!_.isString(prv)) {
217
+ throw new Error(`prv must be a string, got type ${typeof prv}`);
218
+ }
219
+ if (!_.has(params, 'pubs')) {
220
+ throw new Error('missing public key parameter to sign transaction');
221
+ }
222
+ return { txHex, prv };
223
+ }
224
+ /**
225
+ * Assemble keychain and half-sign prebuilt transaction
226
+ *
227
+ * @param params
228
+ * @param params.txPrebuild {TransactionPrebuild} prebuild object returned by platform
229
+ * @param params.prv {String} user prv
230
+ * @returns {Promise<SignedTransaction>}
231
+ */
232
+ async signTransaction(params) {
233
+ const { txHex, prv } = this.verifySignTransactionParams(params);
234
+ const factory = this.getBuilder();
235
+ const txBuilder = factory.from(txHex);
236
+ const keyPair = new lib_1.KeyPair({ prv: prv });
237
+ const { referenceBlock, blockNumber, transactionVersion, sender } = params.txPrebuild.transaction;
238
+ txBuilder
239
+ .validity({ firstValid: blockNumber, maxDuration: this.MAX_VALIDITY_DURATION })
240
+ .referenceBlock(referenceBlock)
241
+ .version(transactionVersion)
242
+ .sender({ address: sender })
243
+ .sign({ key: keyPair.getKeys().prv });
244
+ const transaction = await txBuilder.build();
245
+ if (!transaction) {
246
+ throw new Error('Invalid transaction');
247
+ }
248
+ const signedTxHex = transaction.toBroadcastFormat();
249
+ return { txHex: signedTxHex };
250
+ }
251
+ async getInitializedNodeAPI() {
252
+ if (!Dot.nodeApiInitialized) {
253
+ const wsProvider = new api_1.WsProvider(sdk_core_1.Environments[this.bitgo.getEnv()].dotNodeUrls);
254
+ Dot.API = await api_1.ApiPromise.create({ provider: wsProvider });
255
+ Dot.nodeApiInitialized = true;
256
+ }
257
+ return Dot.API;
258
+ }
259
+ async getAccountInfo(walletAddr) {
260
+ const api = await this.getInitializedNodeAPI();
261
+ const { nonce, data: balance } = await api.query.system.account(walletAddr);
262
+ return { nonce: nonce.toNumber(), freeBalance: balance.free.toNumber() };
263
+ }
264
+ async getHeaderInfo() {
265
+ const api = await this.getInitializedNodeAPI();
266
+ const { number, hash } = await api.rpc.chain.getHeader();
267
+ return { headerNumber: number.toNumber(), headerHash: hash.toString() };
268
+ }
269
+ /**
270
+ *
271
+ * Estimate the fee of the transaction
272
+ *
273
+ * @param {string} destAddr destination wallet address
274
+ * @param {string} srcAddr source wallet address
275
+ * @param {string} amount amount to transfer
276
+ * @returns {number} the estimated fee the transaction will cost
277
+ *
278
+ * @see https://polkadot.js.org/docs/api/cookbook/tx#how-do-i-estimate-the-transaction-fees
279
+ */
280
+ async getFee(destAddr, srcAddr, amount) {
281
+ const api = await this.getInitializedNodeAPI();
282
+ const info = await api.tx.balances.transferAllowDeath(destAddr, amount).paymentInfo(srcAddr);
283
+ return info.partialFee.toNumber();
284
+ }
285
+ async getMaterial() {
286
+ const api = await this.getInitializedNodeAPI();
287
+ return {
288
+ genesisHash: api.genesisHash.toString(),
289
+ chainName: api.runtimeChain.toString(),
290
+ specName: api.runtimeVersion.specName.toString(),
291
+ specVersion: api.runtimeVersion.specVersion.toNumber(),
292
+ txVersion: api.runtimeVersion.transactionVersion.toNumber(),
293
+ metadata: api.runtimeMetadata.toHex(),
294
+ };
295
+ }
296
+ /**
297
+ * Builds a funds recovery transaction without BitGo
298
+ * @param {MPCRecoveryOptions} params parameters needed to construct and
299
+ * (maybe) sign the transaction
300
+ * @param {EddsaSigningMaterial} [precomputedMaterial] optional decrypted
301
+ * material from recoverConsolidations; non-matching values are ignored
302
+ *
303
+ * @returns {MPCTx} the serialized transaction hex string and index
304
+ * of the address being swept
305
+ */
306
+ async recover(params, precomputedMaterial) {
307
+ if (!params.bitgoKey) {
308
+ throw new Error('missing bitgoKey');
309
+ }
310
+ if (!params.recoveryDestination || !this.isValidAddress(params.recoveryDestination)) {
311
+ throw new Error('invalid recoveryDestination');
312
+ }
313
+ const bitgoKey = params.bitgoKey.replace(/\s/g, '');
314
+ const isUnsignedSweep = !params.userKey && !params.backupKey && !params.walletPassphrase;
315
+ const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
316
+ const index = params.index || 0;
317
+ const currPath = params.seed ? (0, sdk_lib_mpc_1.getDerivationPath)(params.seed) + `/${index}` : `m/${index}`;
318
+ const accountId = MPC.deriveUnhardened(bitgoKey, currPath).slice(0, 64);
319
+ const senderAddr = this.getAddressFromPublicKey(accountId);
320
+ const { nonce, freeBalance } = await this.getAccountInfo(senderAddr);
321
+ const destAddr = params.recoveryDestination;
322
+ const amount = freeBalance;
323
+ const partialFee = await this.getFee(destAddr, senderAddr, amount);
324
+ const value = new bignumber_js_1.default(freeBalance).minus(new bignumber_js_1.default(partialFee));
325
+ if (value.isLessThanOrEqualTo(0)) {
326
+ throw new Error('Did not find address with funds to recover');
327
+ }
328
+ // first build the unsigned txn
329
+ const { headerNumber, headerHash } = await this.getHeaderInfo();
330
+ const material = await this.getMaterial();
331
+ const validityWindow = { firstValid: headerNumber, maxDuration: this.MAX_VALIDITY_DURATION };
332
+ const txnBuilder = this.getBuilder().getTransferBuilder().material(material);
333
+ txnBuilder
334
+ .sweep(false)
335
+ .to({ address: params.recoveryDestination })
336
+ .sender({ address: senderAddr })
337
+ .validity(validityWindow)
338
+ .referenceBlock(headerHash)
339
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: nonce })
340
+ .fee({ amount: 0, type: 'tip' });
341
+ const unsignedTransaction = (await txnBuilder.build());
342
+ let serializedTx = unsignedTransaction.toBroadcastFormat();
343
+ if (!isUnsignedSweep) {
344
+ (0, assert_1.default)(params.userKey, 'missing userKey');
345
+ (0, assert_1.default)(params.backupKey, 'missing backupKey');
346
+ (0, assert_1.default)(params.walletPassphrase, 'missing wallet passphrase');
347
+ const signingMaterial = isEddsaSigningMaterial(precomputedMaterial)
348
+ ? precomputedMaterial
349
+ : await this.getEddsaSigningMaterial(params.userKey, params.walletPassphrase);
350
+ await this.addRecoverySignature(signingMaterial, params.backupKey.replace(/\s/g, ''), params.walletPassphrase, txnBuilder, accountId, unsignedTransaction, currPath, bitgoKey);
351
+ const signedTransaction = await txnBuilder.build();
352
+ serializedTx = signedTransaction.toBroadcastFormat();
353
+ }
354
+ else {
355
+ const value = new bignumber_js_1.default(freeBalance);
356
+ const walletCoin = this.getChain();
357
+ const inputs = [
358
+ {
359
+ address: unsignedTransaction.inputs[0].address,
360
+ valueString: value.toString(),
361
+ value: value.toNumber(),
362
+ },
363
+ ];
364
+ const outputs = [
365
+ {
366
+ address: unsignedTransaction.outputs[0].address,
367
+ valueString: value.toString(),
368
+ coinName: walletCoin,
369
+ },
370
+ ];
371
+ const spendAmount = value.toString();
372
+ const parsedTx = { inputs: inputs, outputs: outputs, spendAmount: spendAmount, type: '' };
373
+ const feeInfo = { fee: 0, feeString: '0' };
374
+ const transaction = {
375
+ serializedTx: serializedTx,
376
+ scanIndex: index,
377
+ coin: walletCoin,
378
+ signableHex: unsignedTransaction.signablePayload.toString('hex'),
379
+ derivationPath: currPath,
380
+ parsedTx: parsedTx,
381
+ feeInfo: feeInfo,
382
+ coinSpecific: { ...validityWindow, commonKeychain: bitgoKey },
383
+ };
384
+ const unsignedTx = { unsignedTx: transaction, signatureShares: [] };
385
+ const transactions = [unsignedTx];
386
+ const txRequest = {
387
+ transactions: transactions,
388
+ walletCoin: walletCoin,
389
+ };
390
+ const txRequests = { txRequests: [txRequest] };
391
+ return txRequests;
392
+ }
393
+ const transaction = { serializedTx: serializedTx, scanIndex: index };
394
+ return transaction;
395
+ }
396
+ /**
397
+ * Builds native DOT recoveries of receive addresses in batch without BitGo.
398
+ * Funds will be recovered to base address first. You need to initiate another sweep txn after that.
399
+ *
400
+ * @param {MPCConsolidationRecoveryOptions} params - options for consolidation recovery.
401
+ * @param {string} [params.startingScanIndex] - receive address index to start scanning from. default to 1 (inclusive).
402
+ * @param {string} [params.endingScanIndex] - receive address index to end scanning at. default to startingScanIndex + 20 (exclusive).
403
+ */
404
+ async recoverConsolidations(params) {
405
+ const isUnsignedSweep = !params.userKey && !params.backupKey && !params.walletPassphrase;
406
+ const startIdx = params.startingScanIndex || 1;
407
+ const endIdx = params.endingScanIndex || startIdx + exports.DEFAULT_SCAN_FACTOR;
408
+ if (startIdx < 1 || endIdx <= startIdx || endIdx - startIdx > 10 * exports.DEFAULT_SCAN_FACTOR) {
409
+ throw new Error(`Invalid starting or ending index to scan for addresses. startingScanIndex: ${startIdx}, endingScanIndex: ${endIdx}.`);
410
+ }
411
+ const bitgoKey = params.bitgoKey.replace(/\s/g, '');
412
+ const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
413
+ const baseIndex = 0;
414
+ const basePath = params.seed ? (0, sdk_lib_mpc_1.getDerivationPath)(params.seed) + `/${baseIndex}` : `m/${baseIndex}`;
415
+ const accountId = MPC.deriveUnhardened(bitgoKey, basePath).slice(0, 64);
416
+ const baseAddress = this.getAddressFromPublicKey(accountId);
417
+ // Detect signing material once to avoid re-decrypting the keycard on every loop iteration.
418
+ const signingMaterial = params.walletPassphrase && params.userKey
419
+ ? await this.getEddsaSigningMaterial(params.userKey.replace(/\s/g, ''), params.walletPassphrase)
420
+ : undefined;
421
+ const consolidationTransactions = [];
422
+ let lastScanIndex = startIdx;
423
+ for (let i = startIdx; i < endIdx; i++) {
424
+ const recoverParams = {
425
+ userKey: params.userKey,
426
+ backupKey: params.backupKey,
427
+ bitgoKey: params.bitgoKey,
428
+ walletPassphrase: params.walletPassphrase,
429
+ recoveryDestination: baseAddress,
430
+ seed: params.seed,
431
+ index: i,
432
+ };
433
+ let recoveryTransaction;
434
+ try {
435
+ recoveryTransaction = await this.recover(recoverParams, signingMaterial);
436
+ }
437
+ catch (e) {
438
+ if (e.message === 'Did not find address with funds to recover') {
439
+ lastScanIndex = i;
440
+ continue;
441
+ }
442
+ throw e;
443
+ }
444
+ if (isUnsignedSweep) {
445
+ consolidationTransactions.push(recoveryTransaction.txRequests[0]);
446
+ }
447
+ else {
448
+ consolidationTransactions.push(recoveryTransaction);
449
+ }
450
+ lastScanIndex = i;
451
+ }
452
+ if (consolidationTransactions.length == 0) {
453
+ throw new Error('Did not find an address with funds to recover');
454
+ }
455
+ if (isUnsignedSweep) {
456
+ // lastScanIndex will be used to inform user the last address index scanned for available funds (so they can
457
+ // appropriately adjust the scan range on the next iteration of consolidation recoveries). In the case of unsigned
458
+ // sweep consolidations, this lastScanIndex will be provided in the coinSpecific of the last txn made.
459
+ const lastTransactionCoinSpecific = {
460
+ firstValid: consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific
461
+ .firstValid,
462
+ maxDuration: consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific
463
+ .maxDuration,
464
+ commonKeychain: consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific
465
+ .commonKeychain,
466
+ lastScanIndex: lastScanIndex,
467
+ };
468
+ consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific =
469
+ lastTransactionCoinSpecific;
470
+ const consolidationSweepTransactions = { txRequests: consolidationTransactions };
471
+ return consolidationSweepTransactions;
472
+ }
473
+ return { transactions: consolidationTransactions, lastScanIndex };
474
+ }
475
+ /** inherited doc */
476
+ async createBroadcastableSweepTransaction(params) {
477
+ const req = params.signatureShares;
478
+ const broadcastableTransactions = [];
479
+ let lastScanIndex = 0;
480
+ for (let i = 0; i < req.length; i++) {
481
+ const MPC = await sdk_core_1.EDDSAMethods.getInitializedMpcInstance();
482
+ const transaction = req[i].txRequest.transactions[0].unsignedTx;
483
+ if (!req[i].ovc || !req[i].ovc[0].eddsaSignature) {
484
+ throw new Error('Missing signature(s)');
485
+ }
486
+ const signature = req[i].ovc[0].eddsaSignature;
487
+ if (!transaction.signableHex) {
488
+ throw new Error('Missing signable hex');
489
+ }
490
+ const messageBuffer = Buffer.from(transaction.signableHex, 'hex');
491
+ const result = MPC.verify(messageBuffer, signature);
492
+ if (!result) {
493
+ throw new Error('Invalid signature');
494
+ }
495
+ const signatureHex = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
496
+ if (!transaction.coinSpecific ||
497
+ !transaction.coinSpecific?.firstValid ||
498
+ !transaction.coinSpecific?.maxDuration) {
499
+ throw new Error('missing validity window');
500
+ }
501
+ const validityWindow = {
502
+ firstValid: transaction.coinSpecific?.firstValid,
503
+ maxDuration: transaction.coinSpecific?.maxDuration,
504
+ };
505
+ const material = await this.getMaterial();
506
+ if (!transaction.coinSpecific?.commonKeychain) {
507
+ throw new Error('Missing common keychain');
508
+ }
509
+ const commonKeychain = transaction.coinSpecific.commonKeychain;
510
+ if (!transaction.derivationPath) {
511
+ throw new Error('Missing derivation path');
512
+ }
513
+ const derivationPath = transaction.derivationPath;
514
+ const accountId = MPC.deriveUnhardened(commonKeychain, derivationPath).slice(0, 64);
515
+ const senderAddr = this.getAddressFromPublicKey(accountId);
516
+ const txnBuilder = this.getBuilder()
517
+ .material(material)
518
+ .from(transaction.serializedTx)
519
+ .sender({ address: senderAddr })
520
+ .validity(validityWindow);
521
+ const dotKeyPair = new lib_1.KeyPair({ pub: accountId });
522
+ txnBuilder.addSignature({ pub: dotKeyPair.getKeys().pub }, signatureHex);
523
+ const signedTransaction = await txnBuilder.build();
524
+ const serializedTx = signedTransaction.toBroadcastFormat();
525
+ broadcastableTransactions.push({
526
+ serializedTx: serializedTx,
527
+ scanIndex: transaction.scanIndex,
528
+ });
529
+ if (i === req.length - 1 && transaction.coinSpecific.lastScanIndex) {
530
+ lastScanIndex = transaction.coinSpecific.lastScanIndex;
531
+ }
532
+ }
533
+ return { transactions: broadcastableTransactions, lastScanIndex };
534
+ }
535
+ async parseTransaction(params) {
536
+ return {};
537
+ }
538
+ async isWalletAddress(params) {
539
+ return (0, sdk_core_1.verifyEddsaTssWalletAddress)(params, (address) => this.isValidAddress(address), (publicKey) => this.getAddressFromPublicKey(publicKey));
540
+ }
541
+ async verifyTransaction(params) {
542
+ const { txPrebuild, txParams, verification, wallet, reqId } = params;
543
+ if (!txParams) {
544
+ throw new Error('missing txParams');
545
+ }
546
+ if (!txPrebuild) {
547
+ throw new Error('missing txPrebuild');
548
+ }
549
+ if (!txPrebuild.txHex) {
550
+ throw new Error('missing txHex in txPrebuild');
551
+ }
552
+ const chain = this.getChain();
553
+ let txTo;
554
+ let txAmount;
555
+ let isSweep;
556
+ if (chain === 'tdot') {
557
+ const material = lib_1.Utils.default.getMaterial(statics_1.coins.get(chain));
558
+ const explained = (0, lib_1.explainDotTransaction)({ txHex: txPrebuild.txHex, material });
559
+ txTo = explained.outputs[0]?.address ?? '';
560
+ txAmount = String(explained.outputs[0]?.amount ?? '0');
561
+ isSweep = explained.methodName === 'balances.transferAll';
562
+ }
563
+ else {
564
+ const factory = this.getBuilder();
565
+ const txBuilder = factory.from(txPrebuild.txHex);
566
+ txTo = txBuilder['_to'];
567
+ txAmount = txBuilder['_amount'];
568
+ isSweep = txBuilder['_sweepFreeBalance'] === true;
569
+ }
570
+ if (verification?.consolidationToBaseAddress) {
571
+ const baseAddress = wallet?.coinSpecific()?.rootAddress || wallet?.coinSpecific()?.baseAddress;
572
+ if (!baseAddress) {
573
+ throw new Error('Unable to determine base address for consolidation');
574
+ }
575
+ if (txTo !== baseAddress) {
576
+ throw new sdk_core_1.TxIntentMismatchRecipientError(`Transaction destination address ${txTo} does not match wallet base address ${baseAddress}`, reqId, [txParams], txPrebuild.txHex, [{ address: txTo, amount: txAmount }]);
577
+ }
578
+ }
579
+ if (txParams.recipients !== undefined) {
580
+ if (txParams.recipients.length === 0) {
581
+ throw new Error('missing recipients in txParams');
582
+ }
583
+ if (Array.isArray(txParams.recipients) && txParams.recipients.length > 1) {
584
+ throw new Error(`${this.getChain()} doesn't support sending to more than 1 destination address within a single transaction. Try again, using only a single recipient.`);
585
+ }
586
+ if (txParams.recipients[0].address !== txTo) {
587
+ throw new sdk_core_1.TxIntentMismatchRecipientError(`Recipient address ${txParams.recipients[0].address} does not match transaction destination address ${txTo}`, reqId, [txParams], txPrebuild.txHex, [{ address: txTo, amount: txAmount }]);
588
+ }
589
+ if (!isSweep && txParams.recipients[0].amount !== txAmount) {
590
+ throw new sdk_core_1.TxIntentMismatchRecipientError(`Recipient amount ${txParams.recipients[0].amount} does not match transaction amount ${txAmount}`, reqId, [txParams], txPrebuild.txHex, [{ address: txTo, amount: txAmount }]);
591
+ }
592
+ }
593
+ return true;
594
+ }
595
+ getAddressFromPublicKey(Pubkey) {
596
+ return new lib_1.KeyPair({ pub: Pubkey }).getAddress(lib_1.Utils.default.getAddressFormat(this.getChain()));
597
+ }
598
+ getBuilder() {
599
+ return new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
600
+ }
601
+ /**
602
+ * Detects whether a keycard's decrypted plaintext is MPCv1 JSON or MPCv2 CBOR.
603
+ * Unsigned sweeps (no walletPassphrase) have no keycard to inspect and default to MPCv1.
604
+ */
605
+ async getEddsaSigningMaterial(userKey, walletPassphrase) {
606
+ return (0, sdk_core_1.getEddsaSigningMaterial)(userKey.replace(/\s/g, ''), walletPassphrase, this.bitgo);
607
+ }
608
+ async signDotMpcV2Recovery(params) {
609
+ return (0, sdk_core_1.signEddsaMpcV2RecoveryTx)(params);
610
+ }
611
+ /**
612
+ * Adds an MPCv1 or MPCv2 signature to a DOT transaction builder.
613
+ *
614
+ * Transaction#constructSignedPayload already prepends the 0x00 type-tag (the Substrate
615
+ * MultiSignature enum discriminant for Ed25519) to whatever signature buffer is passed to
616
+ * addSignature, so both paths here hand off the raw 64-byte signature untouched.
617
+ */
618
+ async addRecoverySignature(signingMaterial, backupKey, walletPassphrase, txnBuilder, accountId, unsignedTransaction, currPath, bitgoKey) {
619
+ const dotKeyPair = new lib_1.KeyPair({ pub: accountId });
620
+ if (signingMaterial.version === 'v2') {
621
+ const rawSig = await this.signDotMpcV2Recovery({
622
+ message: unsignedTransaction.signablePayload,
623
+ userKey: signingMaterial.encryptedUserKey,
624
+ backupKey,
625
+ walletPassphrase,
626
+ bitgoKey,
627
+ derivationPath: currPath,
628
+ bitgo: this.bitgo,
629
+ });
630
+ txnBuilder.addSignature({ pub: dotKeyPair.getKeys().pub }, rawSig);
631
+ }
632
+ else {
633
+ /** TODO BG-52419 Implement Codec for parsing */
634
+ const userSigningMaterial = JSON.parse(signingMaterial.userPrv);
635
+ const backupPrv = await (0, sdk_core_1.decryptKeychainPrivateKey)(this.bitgo, { encryptedPrv: backupKey }, walletPassphrase);
636
+ if (!backupPrv) {
637
+ throw new Error('Error decrypting backup keychain: invalid password or corrupted key');
638
+ }
639
+ const backupSigningMaterial = JSON.parse(backupPrv);
640
+ const signatureHex = await sdk_core_1.EDDSAMethods.getTSSSignature(userSigningMaterial, backupSigningMaterial, currPath, unsignedTransaction);
641
+ txnBuilder.addSignature({ pub: dotKeyPair.getKeys().pub }, signatureHex);
642
+ }
643
+ }
644
+ /** @inheritDoc */
645
+ auditDecryptedKey({ publicKey, prv, multiSigType }) {
646
+ if (multiSigType !== 'tss') {
647
+ throw new Error('Unsupported multiSigType');
648
+ }
649
+ (0, sdk_lib_mpc_1.auditEddsaPrivateKey)(prv, publicKey ?? '');
650
+ }
651
+ }
652
+ exports.Dot = Dot;
653
+ Dot.initialized = false;
654
+ Dot.nodeApiInitialized = false;
655
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsMENBQTRCO0FBQzVCLG1EQW1DOEI7QUFDOUIsaURBQStGO0FBQy9GLCtCQVFlO0FBQ2YsaUNBQStCO0FBQy9CLHVDQUF1RDtBQUV2RCxnRUFBcUM7QUFDckMseURBQWtGO0FBRXJFLFFBQUEsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLENBQUMsd0RBQXdEO0FBaUIvRixNQUFNLFFBQVEsR0FBRyxXQUFLLENBQUMsT0FBTyxDQUFDO0FBRS9CLFNBQVMsc0JBQXNCLENBQUMsS0FBYztJQUM1QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDaEQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzNCLE9BQU8sU0FBUyxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDO0lBQ2pFLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDM0IsT0FBTyxrQkFBa0IsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxDQUFDO0lBQ25GLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFhLEdBQUksU0FBUSxtQkFBUTtJQUsvQixZQUFZLEtBQWdCLEVBQUUsV0FBdUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FB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QUFtQixDQUNwQixDQUFDO1lBQ0YsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBMkI7UUFDekUsSUFBSSxZQUFZLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFBLGtDQUFvQixFQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7QUFqdEJILGtCQWt0QkM7QUFuc0JrQixlQUFXLEdBQUcsS0FBSyxBQUFSLENBQVM7QUFFcEIsc0JBQWtCLEdBQUcsS0FBSyxBQUFSLENBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBEb3RBc3NldFR5cGVzLFxuICBFZGRzYSxcbiAgRW52aXJvbm1lbnRzLFxuICBFeHBsYW5hdGlvblJlc3VsdCxcbiAgS2V5UGFpcixcbiAgTVBDQWxnb3JpdGhtLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBVbnNpZ25lZFRyYW5zYWN0aW9uLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBFRERTQU1ldGhvZHMsXG4gIEVERFNBTWV0aG9kVHlwZXMsXG4gIE1QQ1R4LFxuICBNUENSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ0NvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1N3ZWVwVHhzLFxuICBSZWNvdmVyeVR4UmVxdWVzdCxcbiAgTVBDVW5zaWduZWRUeCxcbiAgTVBDU3dlZXBSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1R4cyxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxuICBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3IsXG4gIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsIGFzIHNoYXJlZEdldEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBzaWduRWRkc2FNcGNWMlJlY292ZXJ5VHgsXG4gIEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5LFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zLCBQb2xrYWRvdFNwZWNOYW1lVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgSW50ZXJmYWNlLFxuICBLZXlQYWlyIGFzIERvdEtleVBhaXIsXG4gIE5hdGl2ZVRyYW5zZmVyQnVpbGRlcixcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksXG4gIFV0aWxzLFxuICBleHBsYWluRG90VHJhbnNhY3Rpb24sXG59IGZyb20gJy4vbGliJztcbmltcG9ydCAnQHBvbGthZG90L2FwaS1hdWdtZW50JztcbmltcG9ydCB7IEFwaVByb21pc2UsIFdzUHJvdmlkZXIgfSBmcm9tICdAcG9sa2Fkb3QvYXBpJztcbmltcG9ydCB7IE1hdGVyaWFsIH0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgYXVkaXRFZGRzYVByaXZhdGVLZXksIGdldERlcml2YXRpb25QYXRoIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TQ0FOX0ZBQ1RPUiA9IDIwOyAvLyBkZWZhdWx0IG51bWJlciBvZiByZWNlaXZlIGFkZHJlc3NlcyB0byBzY2FuIGZvciBmdW5kc1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgZXh0ZW5kcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHBydjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEhleDogc3RyaW5nO1xuICB0cmFuc2FjdGlvbjogSW50ZXJmYWNlLlR4RGF0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZmllZFRyYW5zYWN0aW9uUGFyYW1ldGVycyB7XG4gIHR4SGV4OiBzdHJpbmc7XG4gIHBydjogc3RyaW5nO1xufVxuXG5jb25zdCBkb3RVdGlscyA9IFV0aWxzLmRlZmF1bHQ7XG5cbmZ1bmN0aW9uIGlzRWRkc2FTaWduaW5nTWF0ZXJpYWwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFZGRzYVNpZ25pbmdNYXRlcmlhbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKCd2ZXJzaW9uJyBpbiB2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHZhbHVlLnZlcnNpb24gPT09ICd2MScpIHtcbiAgICByZXR1cm4gJ3VzZXJQcnYnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS51c2VyUHJ2ID09PSAnc3RyaW5nJztcbiAgfVxuICBpZiAodmFsdWUudmVyc2lvbiA9PT0gJ3YyJykge1xuICAgIHJldHVybiAnZW5jcnlwdGVkVXNlcktleScgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmVuY3J5cHRlZFVzZXJLZXkgPT09ICdzdHJpbmcnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIERvdCBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcbiAgcmVhZG9ubHkgTUFYX1ZBTElESVRZX0RVUkFUSU9OID0gMjQwMDtcbiAgcmVhZG9ubHkgU1dFRVBfVFhOX0RVUkFUSU9OID0gNjQ7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28pO1xuXG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRpY3NDb2luID0gc3RhdGljc0NvaW47XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzdGF0aWMgTVBDOiBFZGRzYTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBub2RlQXBpSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBBUEk6IEFwaVByb21pc2U7XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IERvdChiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2RvdCc7XG4gIH1cblxuICBnZXRCYXNlQ2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2RvdCc7XG4gIH1cblxuICBnZXRGYW1pbHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2RvdCc7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnUG9sa2Fkb3QnO1xuICB9XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBmb3Igc2VuZGluZyB2YWx1ZSBvZiAwXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9rYXkgdG8gc2VuZCAwIHZhbHVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy50c3M7XG4gIH1cblxuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VkZHNhJztcbiAgfVxuXG4gIGFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBlZDI1NTE5IGtleSBwYWlyXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCB3aXRoIGdlbmVyYXRlZCBwdWIsIHBydlxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IGRvdFV0aWxzLmtleVBhaXJGcm9tU2VlZChuZXcgVWludDhBcnJheShzZWVkKSkgOiBuZXcgRG90S2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwdWIgdGhlIHB1YiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZG90VXRpbHMuaXNWYWxpZFB1YmxpY0tleShwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3VwcGxpZWQgcHJpdmF0ZSBrZXkgaXMgYSB2YWxpZCBkb3QgcHJpdmF0ZSBrZXlcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBydiB0aGUgcHJ2IHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFBydihwcnY6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkb3RVdGlscy5pc1ZhbGlkUHJpdmF0ZUtleShwcnYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pblxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzcyB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRvdFV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gbWVzc2FnZSB3aXRoIHByaXZhdGUga2V5XG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHJldHVybiB7QnVmZmVyfSBBIHNpZ25hdHVyZSBvdmVyIHRoZSBnaXZlbiBtZXNzYWdlIHVzaW5nIHRoZSBnaXZlbiBrZXlcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleTogS2V5UGFpciwgbWVzc2FnZTogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCBtc2cgPSBCdWZmZXIuaXNCdWZmZXIobWVzc2FnZSkgPyBtZXNzYWdlLnRvU3RyaW5nKCd1dGY4JykgOiBtZXNzYWdlO1xuICAgIC8vIHJlY29uc3RpdHV0ZSBrZXlzIGFuZCBzaWduXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKG5ldyBEb3RLZXlQYWlyKHsgcHJ2OiBrZXkucHJ2IH0pLnNpZ25NZXNzYWdlKG1zZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW4vcGFyc2UgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHVuc2lnbmVkVHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbih1bnNpZ25lZFRyYW5zYWN0aW9uOiBVbnNpZ25lZFRyYW5zYWN0aW9uKTogUHJvbWlzZTxFeHBsYW5hdGlvblJlc3VsdD4ge1xuICAgIGxldCBvdXRwdXRBbW91bnQgPSAwO1xuICAgIHVuc2lnbmVkVHJhbnNhY3Rpb24ucGFyc2VkVHgub3V0cHV0cy5mb3JFYWNoKChvKSA9PiB7XG4gICAgICBvdXRwdXRBbW91bnQgKz0gcGFyc2VJbnQoby52YWx1ZVN0cmluZywgMTApO1xuICAgIH0pO1xuICAgIGNvbnN0IGV4cGxhbmF0aW9uUmVzdWx0OiBFeHBsYW5hdGlvblJlc3VsdCA9IHtcbiAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAnZmVlJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAnc2VxdWVuY2VJZCcsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdibG9ja051bWJlcicsXG4gICAgICBdLFxuICAgICAgc2VxdWVuY2VJZDogdW5zaWduZWRUcmFuc2FjdGlvbi5wYXJzZWRUeC5zZXF1ZW5jZUlkLFxuICAgICAgZmVlOiB1bnNpZ25lZFRyYW5zYWN0aW9uLmZlZUluZm8/LmZlZVN0cmluZyxcbiAgICAgIGlkOiB1bnNpZ25lZFRyYW5zYWN0aW9uLnBhcnNlZFR4LmlkLFxuICAgICAgdHlwZTogdW5zaWduZWRUcmFuc2FjdGlvbi5wYXJzZWRUeC50eXBlLFxuICAgICAgb3V0cHV0czogdW5zaWduZWRUcmFuc2FjdGlvbi5wYXJzZWRUeC5vdXRwdXRzLFxuICAgICAgYmxvY2tOdW1iZXI6IHVuc2lnbmVkVHJhbnNhY3Rpb24uY29pblNwZWNpZmljPy5ibG9ja051bWJlcixcbiAgICAgIG91dHB1dEFtb3VudDogb3V0cHV0QW1vdW50LFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uUmVzdWx0O1xuICB9XG5cbiAgdmVyaWZ5U2lnblRyYW5zYWN0aW9uUGFyYW1zKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFZlcmlmaWVkVHJhbnNhY3Rpb25QYXJhbWV0ZXJzIHtcbiAgICBjb25zdCBwcnYgPSBwYXJhbXMucHJ2O1xuXG4gICAgY29uc3QgdHhIZXggPSBwYXJhbXMudHhQcmVidWlsZC50eEhleDtcblxuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyh0eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhIZXh9YCk7XG4gICAgfVxuXG4gICAgaWYgKCFwcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwcnYgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocHJ2KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcnYgbXVzdCBiZSBhIHN0cmluZywgZ290IHR5cGUgJHt0eXBlb2YgcHJ2fWApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMocGFyYW1zLCAncHVicycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcHVibGljIGtleSBwYXJhbWV0ZXIgdG8gc2lnbiB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHR4SGV4LCBwcnYgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBrZXljaGFpbiBhbmQgaGFsZi1zaWduIHByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkIHtUcmFuc2FjdGlvblByZWJ1aWxkfSBwcmVidWlsZCBvYmplY3QgcmV0dXJuZWQgYnkgcGxhdGZvcm1cbiAgICogQHBhcmFtIHBhcmFtcy5wcnYge1N0cmluZ30gdXNlciBwcnZcbiAgICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+fVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB7IHR4SGV4LCBwcnYgfSA9IHRoaXMudmVyaWZ5U2lnblRyYW5zYWN0aW9uUGFyYW1zKHBhcmFtcyk7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlcigpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eEhleCk7XG4gICAgY29uc3Qga2V5UGFpciA9IG5ldyBEb3RLZXlQYWlyKHsgcHJ2OiBwcnYgfSk7XG4gICAgY29uc3QgeyByZWZlcmVuY2VCbG9jaywgYmxvY2tOdW1iZXIsIHRyYW5zYWN0aW9uVmVyc2lvbiwgc2VuZGVyIH0gPSBwYXJhbXMudHhQcmVidWlsZC50cmFuc2FjdGlvbjtcblxuICAgIHR4QnVpbGRlclxuICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiB0aGlzLk1BWF9WQUxJRElUWV9EVVJBVElPTiB9KVxuICAgICAgLnJlZmVyZW5jZUJsb2NrKHJlZmVyZW5jZUJsb2NrKVxuICAgICAgLnZlcnNpb24odHJhbnNhY3Rpb25WZXJzaW9uKVxuICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlciB9KVxuICAgICAgLnNpZ24oeyBrZXk6IGtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGlmICghdHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBzaWduZWRUeEhleCA9IHRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgcmV0dXJuIHsgdHhIZXg6IHNpZ25lZFR4SGV4IH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0SW5pdGlhbGl6ZWROb2RlQVBJKCk6IFByb21pc2U8QXBpUHJvbWlzZT4ge1xuICAgIGlmICghRG90Lm5vZGVBcGlJbml0aWFsaXplZCkge1xuICAgICAgY29uc3Qgd3NQcm92aWRlciA9IG5ldyBXc1Byb3ZpZGVyKEVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS5kb3ROb2RlVXJscyk7XG4gICAgICBEb3QuQVBJID0gYXdhaXQgQXBpUHJvbWlzZS5jcmVhdGUoeyBwcm92aWRlcjogd3NQcm92aWRlciB9KTtcbiAgICAgIERvdC5ub2RlQXBpSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gRG90LkFQSTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRBY2NvdW50SW5mbyh3YWxsZXRBZGRyOiBzdHJpbmcpOiBQcm9taXNlPHsgbm9uY2U6IG51bWJlcjsgZnJlZUJhbGFuY2U6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYXBpID0gYXdhaXQgdGhpcy5nZXRJbml0aWFsaXplZE5vZGVBUEkoKTtcbiAgICBjb25zdCB7IG5vbmNlLCBkYXRhOiBiYWxhbmNlIH0gPSBhd2FpdCBhcGkucXVlcnkuc3lzdGVtLmFjY291bnQod2FsbGV0QWRkcik7XG4gICAgcmV0dXJuIHsgbm9uY2U6IG5vbmNlLnRvTnVtYmVyKCksIGZyZWVCYWxhbmNlOiBiYWxhbmNlLmZyZWUudG9OdW1iZXIoKSB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEhlYWRlckluZm8oKTogUHJvbWlzZTx7IGhlYWRlck51bWJlcjogbnVtYmVyOyBoZWFkZXJIYXNoOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGFwaSA9IGF3YWl0IHRoaXMuZ2V0SW5pdGlhbGl6ZWROb2RlQVBJKCk7XG4gICAgY29uc3QgeyBudW1iZXIsIGhhc2ggfSA9IGF3YWl0IGFwaS5ycGMuY2hhaW4uZ2V0SGVhZGVyKCk7XG4gICAgcmV0dXJuIHsgaGVhZGVyTnVtYmVyOiBudW1iZXIudG9OdW1iZXIoKSwgaGVhZGVySGFzaDogaGFzaC50b1N0cmluZygpIH07XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogRXN0aW1hdGUgdGhlIGZlZSBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlc3RBZGRyIGRlc3RpbmF0aW9uIHdhbGxldCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcmNBZGRyIHNvdXJjZSB3YWxsZXQgYWRkcmVzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IGFtb3VudCB0byB0cmFuc2ZlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSB0aGUgZXN0aW1hdGVkIGZlZSB0aGUgdHJhbnNhY3Rpb24gd2lsbCBjb3N0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9wb2xrYWRvdC5qcy5vcmcvZG9jcy9hcGkvY29va2Jvb2svdHgjaG93LWRvLWktZXN0aW1hdGUtdGhlLXRyYW5zYWN0aW9uLWZlZXNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRGZWUoZGVzdEFkZHI6IHN0cmluZywgc3JjQWRkcjogc3RyaW5nLCBhbW91bnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgYXBpID0gYXdhaXQgdGhpcy5nZXRJbml0aWFsaXplZE5vZGVBUEkoKTtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgYXBpLnR4LmJhbGFuY2VzLnRyYW5zZmVyQWxsb3dEZWF0aChkZXN0QWRkciwgYW1vdW50KS5wYXltZW50SW5mbyhzcmNBZGRyKTtcbiAgICByZXR1cm4gaW5mby5wYXJ0aWFsRmVlLnRvTnVtYmVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0TWF0ZXJpYWwoKTogUHJvbWlzZTxNYXRlcmlhbD4ge1xuICAgIGNvbnN0IGFwaSA9IGF3YWl0IHRoaXMuZ2V0SW5pdGlhbGl6ZWROb2RlQVBJKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdlbmVzaXNIYXNoOiBhcGkuZ2VuZXNpc0hhc2gudG9TdHJpbmcoKSxcbiAgICAgIGNoYWluTmFtZTogYXBpLnJ1bnRpbWVDaGFpbi50b1N0cmluZygpLFxuICAgICAgc3BlY05hbWU6IGFwaS5ydW50aW1lVmVyc2lvbi5zcGVjTmFtZS50b1N0cmluZygpIGFzIFBvbGthZG90U3BlY05hbWVUeXBlLFxuICAgICAgc3BlY1ZlcnNpb246IGFwaS5ydW50aW1lVmVyc2lvbi5zcGVjVmVyc2lvbi50b051bWJlcigpLFxuICAgICAgdHhWZXJzaW9uOiBhcGkucnVudGltZVZlcnNpb24udHJhbnNhY3Rpb25WZXJzaW9uLnRvTnVtYmVyKCksXG4gICAgICBtZXRhZGF0YTogYXBpLnJ1bnRpbWVNZXRhZGF0YS50b0hleCgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHb1xuICAgKiBAcGFyYW0ge01QQ1JlY292ZXJ5T3B0aW9uc30gcGFyYW1zIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGNvbnN0cnVjdCBhbmRcbiAgICogKG1heWJlKSBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0VkZHNhU2lnbmluZ01hdGVyaWFsfSBbcHJlY29tcHV0ZWRNYXRlcmlhbF0gb3B0aW9uYWwgZGVjcnlwdGVkXG4gICAqIG1hdGVyaWFsIGZyb20gcmVjb3ZlckNvbnNvbGlkYXRpb25zOyBub24tbWF0Y2hpbmcgdmFsdWVzIGFyZSBpZ25vcmVkXG4gICAqXG4gICAqIEByZXR1cm5zIHtNUENUeH0gdGhlIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gaGV4IHN0cmluZyBhbmQgaW5kZXhcbiAgICogb2YgdGhlIGFkZHJlc3MgYmVpbmcgc3dlcHRcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBNUENSZWNvdmVyeU9wdGlvbnMsIHByZWNvbXB1dGVkTWF0ZXJpYWw/OiBFZGRzYVNpZ25pbmdNYXRlcmlhbCk6IFByb21pc2U8TVBDVHggfCBNUENTd2VlcFR4cz4ge1xuICAgIGlmICghcGFyYW1zLmJpdGdvS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYml0Z29LZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLnVzZXJLZXkgJiYgIXBhcmFtcy5iYWNrdXBLZXkgJiYgIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlO1xuXG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcblxuICAgIGNvbnN0IGluZGV4ID0gcGFyYW1zLmluZGV4IHx8IDA7XG4gICAgY29uc3QgY3VyclBhdGggPSBwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSArIGAvJHtpbmRleH1gIDogYG0vJHtpbmRleH1gO1xuICAgIGNvbnN0IGFjY291bnRJZCA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGJpdGdvS2V5LCBjdXJyUGF0aCkuc2xpY2UoMCwgNjQpO1xuICAgIGNvbnN0IHNlbmRlckFkZHIgPSB0aGlzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGFjY291bnRJZCk7XG5cbiAgICBjb25zdCB7IG5vbmNlLCBmcmVlQmFsYW5jZSB9ID0gYXdhaXQgdGhpcy5nZXRBY2NvdW50SW5mbyhzZW5kZXJBZGRyKTtcbiAgICBjb25zdCBkZXN0QWRkciA9IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uO1xuICAgIGNvbnN0IGFtb3VudCA9IGZyZWVCYWxhbmNlO1xuICAgIGNvbnN0IHBhcnRpYWxGZWUgPSBhd2FpdCB0aGlzLmdldEZlZShkZXN0QWRkciwgc2VuZGVyQWRkciwgYW1vdW50KTtcblxuICAgIGNvbnN0IHZhbHVlID0gbmV3IEJpZ051bWJlcihmcmVlQmFsYW5jZSkubWludXMobmV3IEJpZ051bWJlcihwYXJ0aWFsRmVlKSk7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGlkIG5vdCBmaW5kIGFkZHJlc3Mgd2l0aCBmdW5kcyB0byByZWNvdmVyJyk7XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgYnVpbGQgdGhlIHVuc2lnbmVkIHR4blxuICAgIGNvbnN0IHsgaGVhZGVyTnVtYmVyLCBoZWFkZXJIYXNoIH0gPSBhd2FpdCB0aGlzLmdldEhlYWRlckluZm8oKTtcbiAgICBjb25zdCBtYXRlcmlhbCA9IGF3YWl0IHRoaXMuZ2V0TWF0ZXJpYWwoKTtcbiAgICBjb25zdCB2YWxpZGl0eVdpbmRvdyA9IHsgZmlyc3RWYWxpZDogaGVhZGVyTnVtYmVyLCBtYXhEdXJhdGlvbjogdGhpcy5NQVhfVkFMSURJVFlfRFVSQVRJT04gfTtcblxuICAgIGNvbnN0IHR4bkJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXIoKS5nZXRUcmFuc2ZlckJ1aWxkZXIoKS5tYXRlcmlhbChtYXRlcmlhbCk7XG4gICAgdHhuQnVpbGRlclxuICAgICAgLnN3ZWVwKGZhbHNlKVxuICAgICAgLnRvKHsgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gfSlcbiAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXJBZGRyIH0pXG4gICAgICAudmFsaWRpdHkodmFsaWRpdHlXaW5kb3cpXG4gICAgICAucmVmZXJlbmNlQmxvY2soaGVhZGVySGFzaClcbiAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IG5vbmNlIH0pXG4gICAgICAuZmVlKHsgYW1vdW50OiAwLCB0eXBlOiAndGlwJyB9KTtcbiAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHR4bkJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG5cbiAgICBsZXQgc2VyaWFsaXplZFR4ID0gdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGlmICghaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBhc3NlcnQocGFyYW1zLnVzZXJLZXksICdtaXNzaW5nIHVzZXJLZXknKTtcbiAgICAgIGFzc2VydChwYXJhbXMuYmFja3VwS2V5LCAnbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICAgIGFzc2VydChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgJ21pc3Npbmcgd2FsbGV0IHBhc3NwaHJhc2UnKTtcblxuICAgICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsID0gaXNFZGRzYVNpZ25pbmdNYXRlcmlhbChwcmVjb21wdXRlZE1hdGVyaWFsKVxuICAgICAgICA/IHByZWNvbXB1dGVkTWF0ZXJpYWxcbiAgICAgICAgOiBhd2FpdCB0aGlzLmdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHBhcmFtcy51c2VyS2V5LCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICBhd2FpdCB0aGlzLmFkZFJlY292ZXJ5U2lnbmF0dXJlKFxuICAgICAgICBzaWduaW5nTWF0ZXJpYWwsXG4gICAgICAgIHBhcmFtcy5iYWNrdXBLZXkucmVwbGFjZSgvXFxzL2csICcnKSxcbiAgICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHR4bkJ1aWxkZXIsXG4gICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgdW5zaWduZWRUcmFuc2FjdGlvbixcbiAgICAgICAgY3VyclBhdGgsXG4gICAgICAgIGJpdGdvS2V5XG4gICAgICApO1xuICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0eG5CdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzZXJpYWxpemVkVHggPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5ldyBCaWdOdW1iZXIoZnJlZUJhbGFuY2UpO1xuICAgICAgY29uc3Qgd2FsbGV0Q29pbiA9IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHVuc2lnbmVkVHJhbnNhY3Rpb24uaW5wdXRzWzBdLmFkZHJlc3MsXG4gICAgICAgICAgdmFsdWVTdHJpbmc6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLnRvTnVtYmVyKCksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHVuc2lnbmVkVHJhbnNhY3Rpb24ub3V0cHV0c1swXS5hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlU3RyaW5nOiB2YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgIGNvaW5OYW1lOiB3YWxsZXRDb2luLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHNwZW5kQW1vdW50ID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0geyBpbnB1dHM6IGlucHV0cywgb3V0cHV0czogb3V0cHV0cywgc3BlbmRBbW91bnQ6IHNwZW5kQW1vdW50LCB0eXBlOiAnJyB9O1xuICAgICAgY29uc3QgZmVlSW5mbyA9IHsgZmVlOiAwLCBmZWVTdHJpbmc6ICcwJyB9O1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb246IE1QQ1R4ID0ge1xuICAgICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgc2NhbkluZGV4OiBpbmRleCxcbiAgICAgICAgY29pbjogd2FsbGV0Q29pbixcbiAgICAgICAgc2lnbmFibGVIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgZGVyaXZhdGlvblBhdGg6IGN1cnJQYXRoLFxuICAgICAgICBwYXJzZWRUeDogcGFyc2VkVHgsXG4gICAgICAgIGZlZUluZm86IGZlZUluZm8sXG4gICAgICAgIGNvaW5TcGVjaWZpYzogeyAuLi52YWxpZGl0eVdpbmRvdywgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5IH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1bnNpZ25lZFR4OiBNUENVbnNpZ25lZFR4ID0geyB1bnNpZ25lZFR4OiB0cmFuc2FjdGlvbiwgc2lnbmF0dXJlU2hhcmVzOiBbXSB9O1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb25zOiBNUENVbnNpZ25lZFR4W10gPSBbdW5zaWduZWRUeF07XG4gICAgICBjb25zdCB0eFJlcXVlc3Q6IFJlY292ZXJ5VHhSZXF1ZXN0ID0ge1xuICAgICAgICB0cmFuc2FjdGlvbnM6IHRyYW5zYWN0aW9ucyxcbiAgICAgICAgd2FsbGV0Q29pbjogd2FsbGV0Q29pbixcbiAgICAgIH07XG4gICAgICBjb25zdCB0eFJlcXVlc3RzOiBNUENTd2VlcFR4cyA9IHsgdHhSZXF1ZXN0czogW3R4UmVxdWVzdF0gfTtcbiAgICAgIHJldHVybiB0eFJlcXVlc3RzO1xuICAgIH1cbiAgICBjb25zdCB0cmFuc2FjdGlvbjogTVBDVHggPSB7IHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LCBzY2FuSW5kZXg6IGluZGV4IH07XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBuYXRpdmUgRE9UIHJlY292ZXJpZXMgb2YgcmVjZWl2ZSBhZGRyZXNzZXMgaW4gYmF0Y2ggd2l0aG91dCBCaXRHby5cbiAgICogRnVuZHMgd2lsbCBiZSByZWNvdmVyZWQgdG8gYmFzZSBhZGRyZXNzIGZpcnN0LiBZb3UgbmVlZCB0byBpbml0aWF0ZSBhbm90aGVyIHN3ZWVwIHR4biBhZnRlciB0aGF0LlxuICAgKlxuICAgKiBAcGFyYW0ge01QQ0NvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnN9IHBhcmFtcyAtIG9wdGlvbnMgZm9yIGNvbnNvbGlkYXRpb24gcmVjb3ZlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4XSAtIHJlY2VpdmUgYWRkcmVzcyBpbmRleCB0byBzdGFydCBzY2FubmluZyBmcm9tLiBkZWZhdWx0IHRvIDEgKGluY2x1c2l2ZSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLmVuZGluZ1NjYW5JbmRleF0gLSByZWNlaXZlIGFkZHJlc3MgaW5kZXggdG8gZW5kIHNjYW5uaW5nIGF0LiBkZWZhdWx0IHRvIHN0YXJ0aW5nU2NhbkluZGV4ICsgMjAgKGV4Y2x1c2l2ZSkuXG4gICAqL1xuICBhc3luYyByZWNvdmVyQ29uc29saWRhdGlvbnMocGFyYW1zOiBNUENDb25zb2xpZGF0aW9uUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxNUENUeHMgfCBNUENTd2VlcFR4cz4ge1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9ICFwYXJhbXMudXNlcktleSAmJiAhcGFyYW1zLmJhY2t1cEtleSAmJiAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgY29uc3Qgc3RhcnRJZHggPSBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXggfHwgMTtcbiAgICBjb25zdCBlbmRJZHggPSBwYXJhbXMuZW5kaW5nU2NhbkluZGV4IHx8IHN0YXJ0SWR4ICsgREVGQVVMVF9TQ0FOX0ZBQ1RPUjtcblxuICAgIGlmIChzdGFydElkeCA8IDEgfHwgZW5kSWR4IDw9IHN0YXJ0SWR4IHx8IGVuZElkeCAtIHN0YXJ0SWR4ID4gMTAgKiBERUZBVUxUX1NDQU5fRkFDVE9SKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAke3N0YXJ0SWR4fSwgZW5kaW5nU2NhbkluZGV4OiAke2VuZElkeH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gICAgY29uc3QgYmFzZUluZGV4ID0gMDtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHBhcmFtcy5zZWVkID8gZ2V0RGVyaXZhdGlvblBhdGgocGFyYW1zLnNlZWQpICsgYC8ke2Jhc2VJbmRleH1gIDogYG0vJHtiYXNlSW5kZXh9YDtcbiAgICBjb25zdCBhY2NvdW50SWQgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiaXRnb0tleSwgYmFzZVBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICBjb25zdCBiYXNlQWRkcmVzcyA9IHRoaXMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoYWNjb3VudElkKTtcblxuICAgIC8vIERldGVjdCBzaWduaW5nIG1hdGVyaWFsIG9uY2UgdG8gYXZvaWQgcmUtZGVjcnlwdGluZyB0aGUga2V5Y2FyZCBvbiBldmVyeSBsb29wIGl0ZXJhdGlvbi5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPVxuICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgcGFyYW1zLnVzZXJLZXlcbiAgICAgICAgPyBhd2FpdCB0aGlzLmdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyksIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnM6IGFueVtdID0gW107XG4gICAgbGV0IGxhc3RTY2FuSW5kZXggPSBzdGFydElkeDtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJZHg7IGkgPCBlbmRJZHg7IGkrKykge1xuICAgICAgY29uc3QgcmVjb3ZlclBhcmFtczogTVBDUmVjb3ZlcnlPcHRpb25zID0ge1xuICAgICAgICB1c2VyS2V5OiBwYXJhbXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBwYXJhbXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleTogcGFyYW1zLmJpdGdvS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogYmFzZUFkZHJlc3MsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICBpbmRleDogaSxcbiAgICAgIH07XG5cbiAgICAgIGxldCByZWNvdmVyeVRyYW5zYWN0aW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3ZlcnlUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVjb3ZlcihyZWNvdmVyUGFyYW1zLCBzaWduaW5nTWF0ZXJpYWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS5tZXNzYWdlID09PSAnRGlkIG5vdCBmaW5kIGFkZHJlc3Mgd2l0aCBmdW5kcyB0byByZWNvdmVyJykge1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggPSBpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKChyZWNvdmVyeVRyYW5zYWN0aW9uIGFzIE1QQ1N3ZWVwVHhzKS50eFJlcXVlc3RzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaChyZWNvdmVyeVRyYW5zYWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIGxhc3RTY2FuSW5kZXggPSBpO1xuICAgIH1cblxuICAgIGlmIChjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggZnVuZHMgdG8gcmVjb3ZlcicpO1xuICAgIH1cblxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIC8vIGxhc3RTY2FuSW5kZXggd2lsbCBiZSB1c2VkIHRvIGluZm9ybSB1c2VyIHRoZSBsYXN0IGFkZHJlc3MgaW5kZXggc2Nhbm5lZCBmb3IgYXZhaWxhYmxlIGZ1bmRzIChzbyB0aGV5IGNhblxuICAgICAgLy8gYXBwcm9wcmlhdGVseSBhZGp1c3QgdGhlIHNjYW4gcmFuZ2Ugb24gdGhlIG5leHQgaXRlcmF0aW9uIG9mIGNvbnNvbGlkYXRpb24gcmVjb3ZlcmllcykuIEluIHRoZSBjYXNlIG9mIHVuc2lnbmVkXG4gICAgICAvLyBzd2VlcCBjb25zb2xpZGF0aW9ucywgdGhpcyBsYXN0U2NhbkluZGV4IHdpbGwgYmUgcHJvdmlkZWQgaW4gdGhlIGNvaW5TcGVjaWZpYyBvZiB0aGUgbGFzdCB0eG4gbWFkZS5cbiAgICAgIGNvbnN0IGxhc3RUcmFuc2FjdGlvbkNvaW5TcGVjaWZpYyA9IHtcbiAgICAgICAgZmlyc3RWYWxpZDpcbiAgICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zW2NvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMubGVuZ3RoIC0gMV0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljXG4gICAgICAgICAgICAuZmlyc3RWYWxpZCxcbiAgICAgICAgbWF4RHVyYXRpb246XG4gICAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9uc1tjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmNvaW5TcGVjaWZpY1xuICAgICAgICAgICAgLm1heER1cmF0aW9uLFxuICAgICAgICBjb21tb25LZXljaGFpbjpcbiAgICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zW2NvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMubGVuZ3RoIC0gMV0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljXG4gICAgICAgICAgICAuY29tbW9uS2V5Y2hhaW4sXG4gICAgICAgIGxhc3RTY2FuSW5kZXg6IGxhc3RTY2FuSW5kZXgsXG4gICAgICB9O1xuICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9uc1tjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmNvaW5TcGVjaWZpYyA9XG4gICAgICAgIGxhc3RUcmFuc2FjdGlvbkNvaW5TcGVjaWZpYztcbiAgICAgIGNvbnN0IGNvbnNvbGlkYXRpb25Td2VlcFRyYW5zYWN0aW9uczogTVBDU3dlZXBUeHMgPSB7IHR4UmVxdWVzdHM6IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMgfTtcbiAgICAgIHJldHVybiBjb25zb2xpZGF0aW9uU3dlZXBUcmFuc2FjdGlvbnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhbnNhY3Rpb25zOiBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLCBsYXN0U2NhbkluZGV4IH07XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBhc3luYyBjcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihwYXJhbXM6IE1QQ1N3ZWVwUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxNUENUeHM+IHtcbiAgICBjb25zdCByZXEgPSBwYXJhbXMuc2lnbmF0dXJlU2hhcmVzO1xuICAgIGNvbnN0IGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnM6IE1QQ1R4W10gPSBbXTtcbiAgICBsZXQgbGFzdFNjYW5JbmRleCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcmVxW2ldLnR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICAgIGlmICghcmVxW2ldLm92YyB8fCAhcmVxW2ldLm92Y1swXS5lZGRzYVNpZ25hdHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmF0dXJlKHMpJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSByZXFbaV0ub3ZjWzBdLmVkZHNhU2lnbmF0dXJlO1xuICAgICAgaWYgKCF0cmFuc2FjdGlvbi5zaWduYWJsZUhleCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmFibGUgaGV4Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlQnVmZmVyID0gQnVmZmVyLmZyb20odHJhbnNhY3Rpb24uc2lnbmFibGVIZXghLCAnaGV4Jyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VCdWZmZXIsIHNpZ25hdHVyZSk7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzaWduYXR1cmVIZXggPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShzaWduYXR1cmUuUiwgJ2hleCcpLCBCdWZmZXIuZnJvbShzaWduYXR1cmUuc2lnbWEsICdoZXgnKV0pO1xuICAgICAgaWYgKFxuICAgICAgICAhdHJhbnNhY3Rpb24uY29pblNwZWNpZmljIHx8XG4gICAgICAgICF0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWM/LmZpcnN0VmFsaWQgfHxcbiAgICAgICAgIXRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYz8ubWF4RHVyYXRpb25cbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdmFsaWRpdHkgd2luZG93Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWxpZGl0eVdpbmRvdyA9IHtcbiAgICAgICAgZmlyc3RWYWxpZDogdHJhbnNhY3Rpb24uY29pblNwZWNpZmljPy5maXJzdFZhbGlkLFxuICAgICAgICBtYXhEdXJhdGlvbjogdHJhbnNhY3Rpb24uY29pblNwZWNpZmljPy5tYXhEdXJhdGlvbixcbiAgICAgIH07XG4gICAgICBjb25zdCBtYXRlcmlhbCA9IGF3YWl0IHRoaXMuZ2V0TWF0ZXJpYWwoKTtcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uY29pblNwZWNpZmljPy5jb21tb25LZXljaGFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgY29tbW9uIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEuY29tbW9uS2V5Y2hhaW4hIGFzIHN0cmluZztcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uZGVyaXZhdGlvblBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGRlcml2YXRpb24gcGF0aCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSB0cmFuc2FjdGlvbi5kZXJpdmF0aW9uUGF0aCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbiwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHIgPSB0aGlzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGFjY291bnRJZCk7XG4gICAgICBjb25zdCB0eG5CdWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKClcbiAgICAgICAgLm1hdGVyaWFsKG1hdGVyaWFsKVxuICAgICAgICAuZnJvbSh0cmFuc2FjdGlvbi5zZXJpYWxpemVkVHggYXMgc3RyaW5nKVxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyQWRkciB9KVxuICAgICAgICAudmFsaWRpdHkodmFsaWRpdHlXaW5kb3cpO1xuICAgICAgY29uc3QgZG90S2V5UGFpciA9IG5ldyBEb3RLZXlQYWlyKHsgcHViOiBhY2NvdW50SWQgfSk7XG4gICAgICB0eG5CdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogZG90S2V5UGFpci5nZXRLZXlzKCkucHViIH0sIHNpZ25hdHVyZUhleCk7XG4gICAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHR4bkJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnMucHVzaCh7XG4gICAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LFxuICAgICAgICBzY2FuSW5kZXg6IHRyYW5zYWN0aW9uLnNjYW5JbmRleCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaSA9PT0gcmVxLmxlbmd0aCAtIDEgJiYgdHJhbnNhY3Rpb24uY29pblNwZWNpZmljIS5sYXN0U2NhbkluZGV4KSB7XG4gICAgICAgIGxhc3RTY2FuSW5kZXggPSB0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWMhLmxhc3RTY2FuSW5kZXggYXMgbnVtYmVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB0cmFuc2FjdGlvbnM6IGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnMsIGxhc3RTY2FuSW5kZXggfTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICBwYXJhbXMsXG4gICAgICAoYWRkcmVzcykgPT4gdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSxcbiAgICAgIChwdWJsaWNLZXkpID0+IHRoaXMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkocHVibGljS2V5KVxuICAgICk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgdHhQYXJhbXMsIHZlcmlmaWNhdGlvbiwgd2FsbGV0LCByZXFJZCB9ID0gcGFyYW1zO1xuICAgIGlmICghdHhQYXJhbXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFBhcmFtcycpO1xuICAgIH1cblxuICAgIGlmICghdHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHR4UHJlYnVpbGQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhaW4gPSB0aGlzLmdldENoYWluKCk7XG4gICAgbGV0IHR4VG86IHN0cmluZztcbiAgICBsZXQgdHhBbW91bnQ6IHN0cmluZztcbiAgICBsZXQgaXNTd2VlcDogYm9vbGVhbjtcblxuICAgIGlmIChjaGFpbiA9PT0gJ3Rkb3QnKSB7XG4gICAgICBjb25zdCBtYXRlcmlhbCA9IFV0aWxzLmRlZmF1bHQuZ2V0TWF0ZXJpYWwoY29pbnMuZ2V0KGNoYWluKSk7XG4gICAgICBjb25zdCBleHBsYWluZWQgPSBleHBsYWluRG90VHJhbnNhY3Rpb24oeyB0eEhleDogdHhQcmVidWlsZC50eEhleCwgbWF0ZXJpYWwgfSk7XG4gICAgICB0eFRvID0gZXhwbGFpbmVkLm91dHB1dHNbMF0/LmFkZHJlc3MgPz8gJyc7XG4gICAgICB0eEFtb3VudCA9IFN0cmluZyhleHBsYWluZWQub3V0cHV0c1swXT8uYW1vdW50ID8/ICcwJyk7XG4gICAgICBpc1N3ZWVwID0gZXhwbGFpbmVkLm1ldGhvZE5hbWUgPT09ICdiYWxhbmNlcy50cmFuc2ZlckFsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0eFByZWJ1aWxkLnR4SGV4KSBhcyB1bmtub3duIGFzIE5hdGl2ZVRyYW5zZmVyQnVpbGRlcjtcbiAgICAgIHR4VG8gPSB0eEJ1aWxkZXJbJ190byddO1xuICAgICAgdHhBbW91bnQgPSB0eEJ1aWxkZXJbJ19hbW91bnQnXTtcbiAgICAgIGlzU3dlZXAgPSB0eEJ1aWxkZXJbJ19zd2VlcEZyZWVCYWxhbmNlJ10gPT09IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZlcmlmaWNhdGlvbj8uY29uc29saWRhdGlvblRvQmFzZUFkZHJlc3MpIHtcbiAgICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gd2FsbGV0Py5jb2luU3BlY2lmaWMoKT8ucm9vdEFkZHJlc3MgfHwgd2FsbGV0Py5jb2luU3BlY2lmaWMoKT8uYmFzZUFkZHJlc3M7XG4gICAgICBpZiAoIWJhc2VBZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRldGVybWluZSBiYXNlIGFkZHJlc3MgZm9yIGNvbnNvbGlkYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eFRvICE9PSBiYXNlQWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgVHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yKFxuICAgICAgICAgIGBUcmFuc2FjdGlvbiBkZXN0aW5hdGlvbiBhZGRyZXNzICR7dHhUb30gZG9lcyBub3QgbWF0Y2ggd2FsbGV0IGJhc2UgYWRkcmVzcyAke2Jhc2VBZGRyZXNzfWAsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgW3R4UGFyYW1zXSxcbiAgICAgICAgICB0eFByZWJ1aWxkLnR4SGV4LFxuICAgICAgICAgIFt7IGFkZHJlc3M6IHR4VG8sIGFtb3VudDogdHhBbW91bnQgfV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlY2lwaWVudHMgaW4gdHhQYXJhbXMnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHhQYXJhbXMucmVjaXBpZW50cykgJiYgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHt0aGlzLmdldENoYWluKCl9IGRvZXNuJ3Qgc3VwcG9ydCBzZW5kaW5nIHRvIG1vcmUgdGhhbiAxIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiBUcnkgYWdhaW4sIHVzaW5nIG9ubHkgYSBzaW5nbGUgcmVjaXBpZW50LmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcyAhPT0gdHhUbykge1xuICAgICAgICB0aHJvdyBuZXcgVHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yKFxuICAgICAgICAgIGBSZWNpcGllbnQgYWRkcmVzcyAke3R4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzc30gZG9lcyBub3QgbWF0Y2ggdHJhbnNhY3Rpb24gZGVzdGluYXRpb24gYWRkcmVzcyAke3R4VG99YCxcbiAgICAgICAgICByZXFJZCxcbiAgICAgICAgICBbdHhQYXJhbXNdLFxuICAgICAgICAgIHR4UHJlYnVpbGQudHhIZXgsXG4gICAgICAgICAgW3sgYWRkcmVzczogdHhUbywgYW1vdW50OiB0eEFtb3VudCB9XVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzU3dlZXAgJiYgdHhQYXJhbXMucmVjaXBpZW50c1swXS5hbW91bnQgIT09IHR4QW1vdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3IoXG4gICAgICAgICAgYFJlY2lwaWVudCBhbW91bnQgJHt0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFtb3VudH0gZG9lcyBub3QgbWF0Y2ggdHJhbnNhY3Rpb24gYW1vdW50ICR7dHhBbW91bnR9YCxcbiAgICAgICAgICByZXFJZCxcbiAgICAgICAgICBbdHhQYXJhbXNdLFxuICAgICAgICAgIHR4UHJlYnVpbGQudHhIZXgsXG4gICAgICAgICAgW3sgYWRkcmVzczogdHhUbywgYW1vdW50OiB0eEFtb3VudCB9XVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldEFkZHJlc3NGcm9tUHVibGljS2V5KFB1YmtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IERvdEtleVBhaXIoeyBwdWI6IFB1YmtleSB9KS5nZXRBZGRyZXNzKFV0aWxzLmRlZmF1bHQuZ2V0QWRkcmVzc0Zvcm1hdCh0aGlzLmdldENoYWluKCkgYXMgRG90QXNzZXRUeXBlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0cyB3aGV0aGVyIGEga2V5Y2FyZCdzIGRlY3J5cHRlZCBwbGFpbnRleHQgaXMgTVBDdjEgSlNPTiBvciBNUEN2MiBDQk9SLlxuICAgKiBVbnNpZ25lZCBzd2VlcHMgKG5vIHdhbGxldFBhc3NwaHJhc2UpIGhhdmUgbm8ga2V5Y2FyZCB0byBpbnNwZWN0IGFuZCBkZWZhdWx0IHRvIE1QQ3YxLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHVzZXJLZXk6IHN0cmluZywgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nKTogUHJvbWlzZTxFZGRzYVNpZ25pbmdNYXRlcmlhbD4ge1xuICAgIHJldHVybiBzaGFyZWRHZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyksIHdhbGxldFBhc3NwaHJhc2UsIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNpZ25Eb3RNcGNWMlJlY292ZXJ5KHBhcmFtczogUGFyYW1ldGVyczx0eXBlb2Ygc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4PlswXSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeChwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gTVBDdjEgb3IgTVBDdjIgc2lnbmF0dXJlIHRvIGEgRE9UIHRyYW5zYWN0aW9uIGJ1aWxkZXIuXG4gICAqXG4gICAqIFRyYW5zYWN0aW9uI2NvbnN0cnVjdFNpZ25lZFBheWxvYWQgYWxyZWFkeSBwcmVwZW5kcyB0aGUgMHgwMCB0eXBlLXRhZyAodGhlIFN1YnN0cmF0ZVxuICAgKiBNdWx0aVNpZ25hdHVyZSBlbnVtIGRpc2NyaW1pbmFudCBmb3IgRWQyNTUxOSkgdG8gd2hhdGV2ZXIgc2lnbmF0dXJlIGJ1ZmZlciBpcyBwYXNzZWQgdG9cbiAgICogYWRkU2lnbmF0dXJlLCBzbyBib3RoIHBhdGhzIGhlcmUgaGFuZCBvZmYgdGhlIHJhdyA2NC1ieXRlIHNpZ25hdHVyZSB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZFJlY292ZXJ5U2lnbmF0dXJlKFxuICAgIHNpZ25pbmdNYXRlcmlhbDogRWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gICAgYmFja3VwS2V5OiBzdHJpbmcsXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICAgIHR4bkJ1aWxkZXI6IE5hdGl2ZVRyYW5zZmVyQnVpbGRlcixcbiAgICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgICB1bnNpZ25lZFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbixcbiAgICBjdXJyUGF0aDogc3RyaW5nLFxuICAgIGJpdGdvS2V5OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZG90S2V5UGFpciA9IG5ldyBEb3RLZXlQYWlyKHsgcHViOiBhY2NvdW50SWQgfSk7XG5cbiAgICBpZiAoc2lnbmluZ01hdGVyaWFsLnZlcnNpb24gPT09ICd2MicpIHtcbiAgICAgIGNvbnN0IHJhd1NpZyA9IGF3YWl0IHRoaXMuc2lnbkRvdE1wY1YyUmVjb3Zlcnkoe1xuICAgICAgICBtZXNzYWdlOiB1bnNpZ25lZFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZCxcbiAgICAgICAgdXNlcktleTogc2lnbmluZ01hdGVyaWFsLmVuY3J5cHRlZFVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGRlcml2YXRpb25QYXRoOiBjdXJyUGF0aCxcbiAgICAgICAgYml0Z286IHRoaXMuYml0Z28sXG4gICAgICB9KTtcbiAgICAgIHR4bkJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBkb3RLZXlQYWlyLmdldEtleXMoKS5wdWIgfSwgcmF3U2lnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyoqIFRPRE8gQkctNTI0MTkgSW1wbGVtZW50IENvZGVjIGZvciBwYXJzaW5nICovXG4gICAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShzaWduaW5nTWF0ZXJpYWwudXNlclBydikgYXMgRUREU0FNZXRob2RUeXBlcy5Vc2VyU2lnbmluZ01hdGVyaWFsO1xuICAgICAgY29uc3QgYmFja3VwUHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleSh0aGlzLmJpdGdvLCB7IGVuY3J5cHRlZFBydjogYmFja3VwS2V5IH0sIHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgaWYgKCFiYWNrdXBQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBkZWNyeXB0aW5nIGJhY2t1cCBrZXljaGFpbjogaW52YWxpZCBwYXNzd29yZCBvciBjb3JydXB0ZWQga2V5Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKGJhY2t1cFBydikgYXMgRUREU0FNZXRob2RUeXBlcy5CYWNrdXBTaWduaW5nTWF0ZXJpYWw7XG5cbiAgICAgIGNvbnN0IHNpZ25hdHVyZUhleCA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRUU1NTaWduYXR1cmUoXG4gICAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwsXG4gICAgICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgY3VyclBhdGgsXG4gICAgICAgIHVuc2lnbmVkVHJhbnNhY3Rpb25cbiAgICAgICk7XG4gICAgICB0eG5CdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogZG90S2V5UGFpci5nZXRLZXlzKCkucHViIH0sIHNpZ25hdHVyZUhleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgcHVibGljS2V5LCBwcnYsIG11bHRpU2lnVHlwZSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcykge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cbn1cbiJdfQ==