@bitgo/abstract-utxo 10.17.0 → 10.18.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 (292) hide show
  1. package/dist/cjs/src/abstractUtxoCoin.d.ts +5 -6
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
  3. package/dist/cjs/src/abstractUtxoCoin.js +24 -5
  4. package/dist/cjs/src/address/fixedScript.d.ts +1 -5
  5. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -1
  6. package/dist/cjs/src/address/fixedScript.js +3 -5
  7. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +4 -5
  8. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -1
  9. package/dist/cjs/src/descriptor/NamedDescriptor.js +4 -6
  10. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +2 -2
  11. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
  12. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +3 -38
  13. package/dist/cjs/src/descriptor/builder/builder.d.ts +2 -3
  14. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -1
  15. package/dist/cjs/src/descriptor/builder/builder.js +1 -1
  16. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -1
  17. package/dist/cjs/src/descriptor/builder/parse.js +3 -3
  18. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +2 -2
  19. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -1
  20. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +1 -1
  21. package/dist/cjs/src/descriptor/descriptorWallet.d.ts +1 -1
  22. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -1
  23. package/dist/cjs/src/descriptor/descriptorWallet.js +1 -1
  24. package/dist/cjs/src/descriptor/index.d.ts +1 -1
  25. package/dist/cjs/src/descriptor/index.d.ts.map +1 -1
  26. package/dist/cjs/src/descriptor/index.js +1 -1
  27. package/dist/cjs/src/descriptor/validatePolicy.d.ts +3 -3
  28. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -1
  29. package/dist/cjs/src/descriptor/validatePolicy.js +3 -3
  30. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -1
  31. package/dist/cjs/src/impl/bch/bch.js +6 -38
  32. package/dist/cjs/src/impl/doge/doge.d.ts +2 -1
  33. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -1
  34. package/dist/cjs/src/impl/doge/doge.js +1 -1
  35. package/dist/cjs/src/impl/ltc/ltc.d.ts +0 -1
  36. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -1
  37. package/dist/cjs/src/impl/ltc/ltc.js +3 -41
  38. package/dist/cjs/src/impl/ltc/tltc.d.ts +0 -1
  39. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -1
  40. package/dist/cjs/src/impl/ltc/tltc.js +3 -40
  41. package/dist/cjs/src/index.d.ts +2 -0
  42. package/dist/cjs/src/index.d.ts.map +1 -1
  43. package/dist/cjs/src/index.js +3 -1
  44. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +2 -2
  45. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +3 -2
  46. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -1
  47. package/dist/cjs/src/offlineVault/descriptor/transaction.js +5 -8
  48. package/dist/cjs/src/recovery/RecoveryProvider.d.ts +1 -3
  49. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -1
  50. package/dist/cjs/src/recovery/RecoveryProvider.js +1 -1
  51. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +73 -4
  52. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
  53. package/dist/cjs/src/recovery/backupKeyRecovery.js +163 -129
  54. package/dist/cjs/src/recovery/crossChainRecovery.d.ts +5 -5
  55. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -1
  56. package/dist/cjs/src/recovery/crossChainRecovery.js +22 -121
  57. package/dist/cjs/src/recovery/psbt.d.ts +8 -31
  58. package/dist/cjs/src/recovery/psbt.d.ts.map +1 -1
  59. package/dist/cjs/src/recovery/psbt.js +14 -126
  60. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +3 -3
  61. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -1
  62. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +17 -54
  63. package/dist/cjs/src/transaction/descriptor/index.d.ts +1 -1
  64. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -1
  65. package/dist/cjs/src/transaction/descriptor/index.js +1 -1
  66. package/dist/cjs/src/transaction/descriptor/parse.d.ts +6 -4
  67. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -1
  68. package/dist/cjs/src/transaction/descriptor/parse.js +24 -50
  69. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +6 -7
  70. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -1
  71. package/dist/cjs/src/transaction/descriptor/signPsbt.js +19 -18
  72. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +4 -4
  73. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  74. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +10 -38
  75. package/dist/cjs/src/transaction/explainTransaction.d.ts +2 -1
  76. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -1
  77. package/dist/cjs/src/transaction/explainTransaction.js +3 -2
  78. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +1 -3
  79. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -1
  80. package/dist/cjs/src/transaction/fixedScript/SigningError.js +1 -1
  81. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +2 -1
  82. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
  83. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +1 -8
  84. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -1
  85. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +6 -11
  86. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +2 -2
  87. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -1
  88. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +4 -2
  89. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +1 -1
  90. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -1
  91. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +1 -1
  92. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +2 -2
  93. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
  94. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +4 -8
  95. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +6 -5
  96. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  97. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +42 -7
  98. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -1
  99. package/dist/cjs/src/transaction/signTransaction.js +10 -10
  100. package/dist/cjs/src/unspent.d.ts +55 -0
  101. package/dist/cjs/src/unspent.d.ts.map +1 -0
  102. package/dist/cjs/src/unspent.js +12 -0
  103. package/dist/cjs/src/wasmUtil.d.ts +29 -0
  104. package/dist/cjs/src/wasmUtil.d.ts.map +1 -0
  105. package/dist/cjs/src/wasmUtil.js +87 -0
  106. package/dist/cjs/test/unit/address.d.ts +1 -1
  107. package/dist/cjs/test/unit/address.d.ts.map +1 -1
  108. package/dist/cjs/test/unit/address.js +107 -137
  109. package/dist/cjs/test/unit/bip322.js +50 -1
  110. package/dist/cjs/test/unit/customSigner.js +5 -4
  111. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +37 -4
  112. package/dist/cjs/test/unit/descriptor/builder.js +10 -4
  113. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +37 -4
  114. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +40 -6
  115. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -1
  116. package/dist/cjs/test/unit/descriptorAddress.js +3 -3
  117. package/dist/cjs/test/unit/explainTransaction.js +26 -3
  118. package/dist/cjs/test/unit/keychains.js +40 -1
  119. package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
  120. package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
  121. package/dist/cjs/test/unit/postProcessPrebuild.js +62 -0
  122. package/dist/cjs/test/unit/prebuildAndSign.d.ts +0 -4
  123. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -1
  124. package/dist/cjs/test/unit/prebuildAndSign.js +12 -32
  125. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +82 -259
  126. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
  127. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
  128. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -0
  129. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +38 -35
  130. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
  131. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
  132. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +186 -0
  133. package/dist/cjs/test/unit/recovery/mock.d.ts +15 -8
  134. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -1
  135. package/dist/cjs/test/unit/recovery/mock.js +49 -77
  136. package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
  137. package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
  138. package/dist/cjs/test/unit/signTransaction.js +244 -0
  139. package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
  140. package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
  141. package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
  142. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +46 -12
  143. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -1
  144. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +38 -4
  145. package/dist/cjs/test/unit/transaction/descriptor/parse.js +22 -19
  146. package/dist/cjs/test/unit/transaction/descriptor/sign.js +60 -16
  147. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +43 -10
  148. package/dist/cjs/test/unit/transaction.js +6 -225
  149. package/dist/cjs/test/unit/util/address.d.ts +13 -0
  150. package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
  151. package/dist/cjs/test/unit/util/address.js +15 -0
  152. package/dist/cjs/test/unit/util/index.d.ts +3 -0
  153. package/dist/cjs/test/unit/util/index.d.ts.map +1 -1
  154. package/dist/cjs/test/unit/util/index.js +4 -1
  155. package/dist/cjs/test/unit/util/keychains.d.ts +29 -0
  156. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -1
  157. package/dist/cjs/test/unit/util/keychains.js +51 -1
  158. package/dist/cjs/test/unit/util/nockBitGo.d.ts +8 -1
  159. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -1
  160. package/dist/cjs/test/unit/util/nockBitGo.js +17 -1
  161. package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
  162. package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
  163. package/dist/cjs/test/unit/util/psbt.js +21 -0
  164. package/dist/cjs/test/unit/util/transaction.d.ts +8 -4
  165. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -1
  166. package/dist/cjs/test/unit/util/transaction.js +19 -1
  167. package/dist/cjs/test/unit/util/unspents.d.ts +66 -8
  168. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -1
  169. package/dist/cjs/test/unit/util/unspents.js +130 -15
  170. package/dist/cjs/test/unit/util/utxoCoins.d.ts +13 -0
  171. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -1
  172. package/dist/cjs/test/unit/util/utxoCoins.js +33 -2
  173. package/dist/cjs/test/unit/wallet.js +4 -4
  174. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  175. package/dist/esm/abstractUtxoCoin.d.ts +5 -6
  176. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
  177. package/dist/esm/abstractUtxoCoin.js +26 -7
  178. package/dist/esm/address/fixedScript.d.ts +1 -5
  179. package/dist/esm/address/fixedScript.d.ts.map +1 -1
  180. package/dist/esm/address/fixedScript.js +3 -5
  181. package/dist/esm/descriptor/NamedDescriptor.d.ts +4 -5
  182. package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -1
  183. package/dist/esm/descriptor/NamedDescriptor.js +5 -7
  184. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +2 -2
  185. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -1
  186. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +3 -5
  187. package/dist/esm/descriptor/builder/builder.d.ts +2 -3
  188. package/dist/esm/descriptor/builder/builder.d.ts.map +1 -1
  189. package/dist/esm/descriptor/builder/builder.js +1 -1
  190. package/dist/esm/descriptor/builder/parse.d.ts.map +1 -1
  191. package/dist/esm/descriptor/builder/parse.js +3 -3
  192. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +2 -2
  193. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -1
  194. package/dist/esm/descriptor/createWallet/createDescriptors.js +1 -1
  195. package/dist/esm/descriptor/descriptorWallet.d.ts +1 -1
  196. package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -1
  197. package/dist/esm/descriptor/descriptorWallet.js +1 -1
  198. package/dist/esm/descriptor/index.d.ts +1 -1
  199. package/dist/esm/descriptor/index.d.ts.map +1 -1
  200. package/dist/esm/descriptor/index.js +1 -1
  201. package/dist/esm/descriptor/validatePolicy.d.ts +3 -3
  202. package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -1
  203. package/dist/esm/descriptor/validatePolicy.js +3 -3
  204. package/dist/esm/impl/bch/bch.d.ts.map +1 -1
  205. package/dist/esm/impl/bch/bch.js +6 -5
  206. package/dist/esm/impl/doge/doge.d.ts +2 -1
  207. package/dist/esm/impl/doge/doge.d.ts.map +1 -1
  208. package/dist/esm/impl/doge/doge.js +1 -1
  209. package/dist/esm/impl/ltc/ltc.d.ts +0 -1
  210. package/dist/esm/impl/ltc/ltc.d.ts.map +1 -1
  211. package/dist/esm/impl/ltc/ltc.js +3 -8
  212. package/dist/esm/impl/ltc/tltc.d.ts +0 -1
  213. package/dist/esm/impl/ltc/tltc.d.ts.map +1 -1
  214. package/dist/esm/impl/ltc/tltc.js +3 -7
  215. package/dist/esm/index.d.ts +2 -0
  216. package/dist/esm/index.d.ts.map +1 -1
  217. package/dist/esm/index.js +3 -1
  218. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +2 -2
  219. package/dist/esm/offlineVault/descriptor/transaction.d.ts +3 -2
  220. package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -1
  221. package/dist/esm/offlineVault/descriptor/transaction.js +5 -8
  222. package/dist/esm/recovery/RecoveryProvider.d.ts +1 -3
  223. package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -1
  224. package/dist/esm/recovery/RecoveryProvider.js +1 -1
  225. package/dist/esm/recovery/backupKeyRecovery.d.ts +73 -4
  226. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
  227. package/dist/esm/recovery/backupKeyRecovery.js +165 -100
  228. package/dist/esm/recovery/crossChainRecovery.d.ts +5 -5
  229. package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -1
  230. package/dist/esm/recovery/crossChainRecovery.js +24 -90
  231. package/dist/esm/recovery/psbt.d.ts +8 -31
  232. package/dist/esm/recovery/psbt.d.ts.map +1 -1
  233. package/dist/esm/recovery/psbt.js +14 -91
  234. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +3 -3
  235. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -1
  236. package/dist/esm/transaction/descriptor/explainPsbt.js +14 -18
  237. package/dist/esm/transaction/descriptor/index.d.ts +1 -1
  238. package/dist/esm/transaction/descriptor/index.d.ts.map +1 -1
  239. package/dist/esm/transaction/descriptor/index.js +1 -1
  240. package/dist/esm/transaction/descriptor/parse.d.ts +6 -4
  241. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -1
  242. package/dist/esm/transaction/descriptor/parse.js +22 -15
  243. package/dist/esm/transaction/descriptor/signPsbt.d.ts +6 -7
  244. package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -1
  245. package/dist/esm/transaction/descriptor/signPsbt.js +19 -18
  246. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +4 -4
  247. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -1
  248. package/dist/esm/transaction/descriptor/verifyTransaction.js +10 -5
  249. package/dist/esm/transaction/explainTransaction.d.ts +2 -1
  250. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -1
  251. package/dist/esm/transaction/explainTransaction.js +3 -2
  252. package/dist/esm/transaction/fixedScript/SigningError.d.ts +1 -3
  253. package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -1
  254. package/dist/esm/transaction/fixedScript/SigningError.js +1 -1
  255. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +2 -1
  256. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -1
  257. package/dist/esm/transaction/fixedScript/explainTransaction.js +1 -8
  258. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -1
  259. package/dist/esm/transaction/fixedScript/parseOutput.js +6 -11
  260. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +2 -2
  261. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -1
  262. package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +4 -2
  263. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +1 -1
  264. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -1
  265. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +1 -1
  266. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +2 -2
  267. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
  268. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +2 -6
  269. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +6 -5
  270. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
  271. package/dist/esm/transaction/fixedScript/signTransaction.js +10 -8
  272. package/dist/esm/transaction/signTransaction.d.ts.map +1 -1
  273. package/dist/esm/transaction/signTransaction.js +10 -10
  274. package/dist/esm/unspent.d.ts +55 -0
  275. package/dist/esm/unspent.d.ts.map +1 -0
  276. package/dist/esm/unspent.js +8 -0
  277. package/dist/esm/wasmUtil.d.ts +29 -0
  278. package/dist/esm/wasmUtil.d.ts.map +1 -0
  279. package/dist/esm/wasmUtil.js +47 -0
  280. package/package.json +11 -12
  281. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +0 -2
  282. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +0 -1
  283. package/dist/cjs/test/unit/impl/btc/unit/btc.js +0 -220
  284. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +0 -4
  285. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +0 -1
  286. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +0 -10
  287. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +0 -2
  288. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +0 -1
  289. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +0 -18
  290. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +0 -2
  291. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +0 -1
  292. package/dist/cjs/test/unit/impl/ltc/unit/index.js +0 -39
@@ -43,209 +43,6 @@ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
43
43
  const sdk_core_1 = require("@bitgo/sdk-core");
44
44
  const src_1 = require("../../src");
45
45
  const util_1 = require("./util");
46
- function getScriptTypes2Of3() {
47
- return [...utxo_lib_1.bitgo.outputScripts.scriptTypes2Of3, 'taprootKeyPathSpend'];
48
- }
49
- describe(`UTXO coin signTransaction`, async function () {
50
- const bgUrl = sdk_core_1.common.Environments[util_1.defaultBitGo.getEnv()].uri;
51
- const coin = (0, util_1.getUtxoCoin)('btc');
52
- const wallet = (0, util_1.getUtxoWallet)(coin, { id: '5b34252f1bf349930e34020a00000000', coin: coin.getChain() });
53
- const rootWalletKeys = (0, util_1.getDefaultWalletKeys)();
54
- const userPrv = rootWalletKeys.user.toBase58();
55
- const pubs = util_1.keychainsBase58.map((v) => v.pub);
56
- function validatePsbt(txHex, targetSigCount, targetNonceCount) {
57
- const psbt = utxolib.bitgo.createPsbtFromHex(txHex, coin.network);
58
- psbt.data.inputs.forEach((input, index) => {
59
- const parsed = utxolib.bitgo.parsePsbtInput(input);
60
- if (parsed.scriptType === 'taprootKeyPathSpend') {
61
- assert.ok(targetNonceCount);
62
- const nonce = psbt.getProprietaryKeyVals(index, {
63
- identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
64
- subtype: utxolib.bitgo.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
65
- });
66
- assert.strictEqual(nonce.length, targetNonceCount);
67
- }
68
- const expectedSigCount = parsed.scriptType === 'p2shP2pk' || targetSigCount === 0 ? undefined : 1;
69
- assert.strictEqual(parsed.signatures?.length, expectedSigCount);
70
- });
71
- }
72
- function validateTx(txHex, unspents, targetSigCount) {
73
- const tx = utxolib.bitgo.createTransactionFromHex(txHex, coin.network);
74
- unspents.forEach((u, i) => {
75
- const sigCount = utxolib.bitgo.getStrictSignatureCount(tx.ins[i]);
76
- const expectedSigCount = utxolib.bitgo.isWalletUnspent(u) && !!targetSigCount ? 1 : 0;
77
- assert.strictEqual(sigCount, expectedSigCount);
78
- });
79
- }
80
- async function signTransaction(tx, useSigningSteps, unspents) {
81
- const isPsbt = tx instanceof utxolib.bitgo.UtxoPsbt;
82
- const isTxWithTaprootKeyPathSpend = isPsbt && utxolib.bitgo.isTransactionWithKeyPathSpendInput(tx);
83
- const txHex = tx.toHex();
84
- function nockSignPsbt(psbtHex) {
85
- const psbt = utxolib.bitgo.createPsbtFromHex(psbtHex, coin.network);
86
- return nock(bgUrl)
87
- .post(`/api/v2/${wallet.coin()}/wallet/${wallet.id()}/tx/signpsbt`, (body) => body.psbt)
88
- .reply(200, { psbt: psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo).toHex() });
89
- }
90
- if (!useSigningSteps) {
91
- let scope;
92
- if (tx instanceof utxolib.bitgo.UtxoPsbt && isTxWithTaprootKeyPathSpend) {
93
- scope = nockSignPsbt(tx.clone().setAllInputsMusig2NonceHD(rootWalletKeys.bitgo).toHex());
94
- }
95
- const psbt = await coin.signTransaction({
96
- txPrebuild: {
97
- txHex,
98
- txInfo: isPsbt ? undefined : { unspents },
99
- walletId: isTxWithTaprootKeyPathSpend ? wallet.id() : undefined,
100
- },
101
- prv: userPrv,
102
- pubs: isPsbt ? undefined : pubs,
103
- });
104
- assert.ok('txHex' in psbt);
105
- if (isPsbt) {
106
- validatePsbt(psbt.txHex, 1, 2);
107
- }
108
- else {
109
- assert.ok(unspents);
110
- validateTx(psbt.txHex, unspents, 1);
111
- }
112
- if (scope) {
113
- assert.strictEqual(scope.isDone(), true);
114
- }
115
- return;
116
- }
117
- const signerNoncePsbt = await coin.signTransaction({
118
- txPrebuild: { txHex },
119
- prv: userPrv,
120
- signingStep: 'signerNonce',
121
- });
122
- assert.ok('txHex' in signerNoncePsbt);
123
- if (isPsbt) {
124
- validatePsbt(signerNoncePsbt.txHex, 0, isTxWithTaprootKeyPathSpend ? 1 : undefined);
125
- }
126
- else {
127
- assert.ok(unspents);
128
- validateTx(signerNoncePsbt.txHex, unspents, 0);
129
- }
130
- let scope;
131
- if (isTxWithTaprootKeyPathSpend) {
132
- scope = nockSignPsbt(signerNoncePsbt.txHex);
133
- }
134
- const cosignerNoncePsbt = await coin.signTransaction({
135
- txPrebuild: { ...signerNoncePsbt, walletId: wallet.id() },
136
- signingStep: 'cosignerNonce',
137
- });
138
- assert.ok('txHex' in cosignerNoncePsbt);
139
- if (isPsbt) {
140
- validatePsbt(cosignerNoncePsbt.txHex, 0, isTxWithTaprootKeyPathSpend ? 2 : undefined);
141
- }
142
- else {
143
- assert.ok(unspents);
144
- validateTx(cosignerNoncePsbt.txHex, unspents, 0);
145
- }
146
- if (scope) {
147
- assert.strictEqual(scope.isDone(), true);
148
- }
149
- const signerSigPsbt = await coin.signTransaction({
150
- txPrebuild: { ...cosignerNoncePsbt, txInfo: isPsbt ? undefined : { unspents } },
151
- prv: userPrv,
152
- pubs: isPsbt ? undefined : pubs,
153
- signingStep: 'signerSignature',
154
- });
155
- assert.ok('txHex' in signerSigPsbt);
156
- if (isPsbt) {
157
- validatePsbt(signerSigPsbt.txHex, 1, isTxWithTaprootKeyPathSpend ? 2 : undefined);
158
- }
159
- else {
160
- assert.ok(unspents);
161
- validateTx(signerSigPsbt.txHex, unspents, 1);
162
- }
163
- }
164
- it('success when called like customSigningFunction flow - PSBT with taprootKeyPathSpend inputs', async function () {
165
- const inputs = utxo_lib_1.testutil.inputScriptTypes.map((scriptType) => ({
166
- scriptType,
167
- value: BigInt(1000),
168
- }));
169
- const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
170
- const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
171
- const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned', {
172
- p2shP2pkKey: (0, src_1.getReplayProtectionPubkeys)(coin.name)[0],
173
- });
174
- for (const v of [false, true]) {
175
- await signTransaction(psbt, v);
176
- }
177
- });
178
- it('success when called like customSigningFunction flow - PSBT without taprootKeyPathSpend inputs', async function () {
179
- const inputs = utxo_lib_1.testutil.inputScriptTypes
180
- .filter((v) => v !== 'taprootKeyPathSpend')
181
- .map((scriptType) => ({
182
- scriptType,
183
- value: BigInt(1000),
184
- }));
185
- const unspentSum = inputs.reduce((prev, cur) => prev + cur.value, BigInt(0));
186
- const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
187
- const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
188
- for (const v of [false, true]) {
189
- await signTransaction(psbt, v);
190
- }
191
- });
192
- it('success when called like customSigningFunction flow - Network Tx', async function () {
193
- const inputs = utxo_lib_1.testutil.txnInputScriptTypes
194
- .filter((v) => v !== 'p2shP2pk')
195
- .map((scriptType) => ({
196
- scriptType,
197
- value: BigInt(1000),
198
- }));
199
- const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
200
- const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
201
- const txBuilder = utxo_lib_1.testutil.constructTxnBuilder(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
202
- const unspents = inputs.map((v, i) => utxo_lib_1.testutil.toTxnUnspent(v, i, coin.network, rootWalletKeys));
203
- for (const v of [false, true]) {
204
- await signTransaction(txBuilder.buildIncomplete(), v, unspents);
205
- }
206
- });
207
- it('fails when called like customSigningFunction flow - PSBT cache miss', async function () {
208
- const inputs = [{ scriptType: 'taprootKeyPathSpend', value: BigInt(1000) }];
209
- const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
210
- const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(1000) }];
211
- const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
212
- await assert.rejects(async () => {
213
- await coin.signTransaction({
214
- txPrebuild: { txHex: psbt.toHex() },
215
- prv: userPrv,
216
- signingStep: 'signerSignature',
217
- });
218
- }, {
219
- message: `Psbt is missing from txCache (cache size 0).
220
- This may be due to the request being routed to a different BitGo-Express instance that for signing step 'signerNonce'.`,
221
- });
222
- });
223
- it('fails when unsupported locking script is used', async function () {
224
- const inputs = [
225
- { scriptType: 'p2wsh', value: BigInt(1000) },
226
- { scriptType: 'p2trMusig2', value: BigInt(1000) },
227
- ];
228
- const unspentSum = inputs.reduce((prev, curr) => prev + curr.value, BigInt(0));
229
- const outputs = [{ scriptType: 'p2sh', value: unspentSum - BigInt(500) }];
230
- const psbt = utxo_lib_1.testutil.constructPsbt(inputs, outputs, coin.network, rootWalletKeys, 'unsigned');
231
- // override the 1st PSBT input with unsupported 2 of 2 multi-sig locking script.
232
- const unspent = utxo_lib_1.testutil.toUnspent(inputs[0], 0, coin.network, rootWalletKeys);
233
- if (!utxolib.bitgo.isWalletUnspent(unspent)) {
234
- throw new Error('invalid unspent');
235
- }
236
- const { publicKeys } = rootWalletKeys.deriveForChainAndIndex(unspent.chain, unspent.index);
237
- const script2Of2 = utxolib.payments.p2ms({ m: 2, pubkeys: [publicKeys[0], publicKeys[1]] });
238
- psbt.data.inputs[0].witnessScript = script2Of2.output;
239
- await assert.rejects(async () => {
240
- await coin.signTransaction({
241
- txPrebuild: { txHex: psbt.toHex() },
242
- prv: userPrv,
243
- });
244
- }, {
245
- message: `length mismatch`,
246
- });
247
- });
248
- });
249
46
  function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
250
47
  const amountType = coin.amountType;
251
48
  const title = [
@@ -383,7 +180,8 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
383
180
  assert.ok(utxolib.bitgo.getPsbtInputScriptType(input), 'p2shP2pk');
384
181
  return;
385
182
  }
386
- const pubkeys = walletKeys.deriveForChainAndIndex(unspent.chain, unspent.index).publicKeys;
183
+ const walletUnspent = unspent;
184
+ const pubkeys = walletKeys.deriveForChainAndIndex(walletUnspent.chain, walletUnspent.index).publicKeys;
387
185
  pubkeys.forEach((pk, pkIndex) => {
388
186
  psbt.validateSignaturesOfInputCommon(index, pk).should.eql(signedBy.includes(walletKeys.triple[pkIndex]));
389
187
  });
@@ -497,32 +295,15 @@ function run(coin, inputScripts, txFormat, { decodeWith } = {}) {
497
295
  });
498
296
  }
499
297
  function runTestForCoin(coin) {
500
- getScriptTypes2Of3().forEach((type) => {
501
- ['legacy', 'psbt'].forEach((txFormat) => {
502
- if (!coin.supportsAddressType(type === 'taprootKeyPathSpend' ? 'p2trMusig2' : type)) {
503
- return;
504
- }
505
- if ((type === 'taprootKeyPathSpend' || type === 'p2trMusig2') && txFormat !== 'psbt') {
506
- return;
507
- }
508
- run(coin, [type, type], txFormat);
509
- if ((0, src_1.getReplayProtectionAddresses)(coin.name).length) {
510
- run(coin, ['p2shP2pk', type], txFormat);
511
- }
512
- if (txFormat === 'psbt') {
513
- run(coin, [type, type], txFormat, { decodeWith: 'wasm-utxo' });
514
- if ((0, src_1.getReplayProtectionAddresses)(coin.name).length) {
515
- run(coin, ['p2shP2pk', type], txFormat, { decodeWith: 'wasm-utxo' });
516
- }
517
- }
518
- });
298
+ ['legacy', 'psbt'].forEach((txFormat) => {
299
+ run(coin, (0, util_1.getScriptTypes)(coin, txFormat), txFormat, { decodeWith: 'wasm-utxo' });
519
300
  });
520
301
  }
521
302
  describe('Transaction Suite', function () {
522
- util_1.utxoCoins.forEach((coin) => {
303
+ (0, util_1.getMinUtxoCoins)().forEach((coin) => {
523
304
  describe(`${coin.getChain()}`, function () {
524
305
  runTestForCoin(coin);
525
306
  });
526
307
  });
527
308
  });
528
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQkFBZTtBQUNmLCtDQUFpQztBQUVqQywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLDZCQUE4QjtBQUM5Qiw4Q0FBa0U7QUFDbEUsZ0RBQTBEO0FBQzFELDhDQU15QjtBQUV6QixtQ0FBd0g7QUFHeEgsaUNBZ0JnQjtBQUtoQixTQUFTLGtCQUFrQjtJQUN6QixPQUFPLENBQUMsR0FBRyxnQkFBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUscUJBQXFCLENBQVUsQ0FBQztBQUNsRixDQUFDO0FBRUQsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEtBQUs7SUFDekMsTUFBTSxLQUFLLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsbUJBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUU3RCxNQUFNLElBQUksR0FBRyxJQUFBLGtCQUFXLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBQSxvQkFBYSxFQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxrQ0FBa0MsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RyxNQUFNLGNBQWMsR0FBRyxJQUFBLDJCQUFvQixHQUFFLENBQUM7SUFDOUMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQyxNQUFNLElBQUksR0FBRyxzQkFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBbUIsQ0FBQztJQUVqRSxTQUFTLFlBQVksQ0FBQyxLQUFhLEVBQUUsY0FB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QUFRLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBRUQsSUFBSSxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQy9ELElBQUksSUFBQSxrQ0FBNEIsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ25ELEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsZ0JBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN6QixRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRTtZQUM3QixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdtb2NoYSc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IG5vY2sgPSByZXF1aXJlKCdub2NrJyk7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSwgYml0Z28sIHRlc3R1dGlsIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGFkZHJlc3MgYXMgd2FzbUFkZHJlc3MgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7XG4gIGNvbW1vbixcbiAgRnVsbHlTaWduZWRUcmFuc2FjdGlvbixcbiAgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbixcbiAgVHJpcGxlLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBnZXRSZXBsYXlQcm90ZWN0aW9uQWRkcmVzc2VzLCBnZW5lcmF0ZUFkZHJlc3MsIGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IFNka0JhY2tlbmQgfSBmcm9tICcuLi8uLi9zcmMvdHJhbnNhY3Rpb24vdHlwZXMnO1xuXG5pbXBvcnQge1xuICB1dHhvQ29pbnMsXG4gIHNob3VsZEVxdWFsSlNPTixcbiAgZ2V0Rml4dHVyZSxcbiAgZ2V0VXR4b1dhbGxldCxcbiAgbW9ja1Vuc3BlbnQsXG4gIElucHV0U2NyaXB0VHlwZSxcbiAgVHJhbnNhY3Rpb25PYmosXG4gIHRyYW5zYWN0aW9uVG9PYmosXG4gIHRyYW5zYWN0aW9uSGV4VG9PYmosXG4gIGNyZWF0ZVByZWJ1aWxkVHJhbnNhY3Rpb24sXG4gIGdldERlZmF1bHRXYWxsZXRLZXlzLFxuICBnZXRVdHhvQ29pbixcbiAga2V5Y2hhaW5zQmFzZTU4LFxuICBnZXRXYWxsZXRLZXlzLFxuICBkZWZhdWx0Qml0R28sXG59IGZyb20gJy4vdXRpbCc7XG5cbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IGJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG50eXBlIFdhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBiaXRnby5XYWxsZXRVbnNwZW50PFROdW1iZXI+O1xuXG5mdW5jdGlvbiBnZXRTY3JpcHRUeXBlczJPZjMoKSB7XG4gIHJldHVybiBbLi4uYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjMsICd0YXByb290S2V5UGF0aFNwZW5kJ10gYXMgY29uc3Q7XG59XG5cbmRlc2NyaWJlKGBVVFhPIGNvaW4gc2lnblRyYW5zYWN0aW9uYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiZ1VybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbZGVmYXVsdEJpdEdvLmdldEVudigpXS51cmk7XG5cbiAgY29uc3QgY29pbiA9IGdldFV0eG9Db2luKCdidGMnKTtcbiAgY29uc3Qgd2FsbGV0ID0gZ2V0VXR4b1dhbGxldChjb2luLCB7IGlkOiAnNWIzNDI1MmYxYmYzNDk5MzBlMzQwMjBhMDAwMDAwMDAnLCBjb2luOiBjb2luLmdldENoYWluKCkgfSk7XG4gIGNvbnN0IHJvb3RXYWxsZXRLZXlzID0gZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcbiAgY29uc3QgdXNlclBydiA9IHJvb3RXYWxsZXRLZXlzLnVzZXIudG9CYXNlNTgoKTtcbiAgY29uc3QgcHVicyA9IGtleWNoYWluc0Jhc2U1OC5tYXAoKHYpID0+IHYucHViKSBhcyBUcmlwbGU8c3RyaW5nPjtcblxuICBmdW5jdGlvbiB2YWxpZGF0ZVBzYnQodHhIZXg6IHN0cmluZywgdGFyZ2V0U2lnQ291bnQ6IDAgfCAxLCB0YXJnZXROb25jZUNvdW50PzogMSB8IDIpIHtcbiAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUhleCh0eEhleCwgY29pbi5uZXR3b3JrKTtcbiAgICBwc2J0LmRhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkID0gdXR4b2xpYi5iaXRnby5wYXJzZVBzYnRJbnB1dChpbnB1dCk7XG4gICAgICBpZiAocGFyc2VkLnNjcmlwdFR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJykge1xuICAgICAgICBhc3NlcnQub2sodGFyZ2V0Tm9uY2VDb3VudCk7XG4gICAgICAgIGNvbnN0IG5vbmNlID0gcHNidC5nZXRQcm9wcmlldGFyeUtleVZhbHMoaW5kZXgsIHtcbiAgICAgICAgICBpZGVudGlmaWVyOiB1dHhvbGliLmJpdGdvLlBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUixcbiAgICAgICAgICBzdWJ0eXBlOiB1dHhvbGliLmJpdGdvLlByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUFVCX05PTkNFLFxuICAgICAgICB9KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG5vbmNlLmxlbmd0aCwgdGFyZ2V0Tm9uY2VDb3VudCk7XG4gICAgICB9XG4gICAgICBjb25zdCBleHBlY3RlZFNpZ0NvdW50ID0gcGFyc2VkLnNjcmlwdFR5cGUgPT09ICdwMnNoUDJwaycgfHwgdGFyZ2V0U2lnQ291bnQgPT09IDAgPyB1bmRlZmluZWQgOiAxO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlZC5zaWduYXR1cmVzPy5sZW5ndGgsIGV4cGVjdGVkU2lnQ291bnQpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVUeCh0eEhleDogc3RyaW5nLCB1bnNwZW50czogVW5zcGVudDxiaWdpbnQ+W10sIHRhcmdldFNpZ0NvdW50OiAwIHwgMSkge1xuICAgIGNvbnN0IHR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgodHhIZXgsIGNvaW4ubmV0d29yayk7XG4gICAgdW5zcGVudHMuZm9yRWFjaCgodSwgaSkgPT4ge1xuICAgICAgY29uc3Qgc2lnQ291bnQgPSB1dHhvbGliLmJpdGdvLmdldFN0cmljdFNpZ25hdHVyZUNvdW50KHR4Lmluc1tpXSk7XG4gICAgICBjb25zdCBleHBlY3RlZFNpZ0NvdW50ID0gdXR4b2xpYi5iaXRnby5pc1dhbGxldFVuc3BlbnQodSkgJiYgISF0YXJnZXRTaWdDb3VudCA/IDEgOiAwO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNpZ0NvdW50LCBleHBlY3RlZFNpZ0NvdW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNpZ25UcmFuc2FjdGlvbihcbiAgICB0eDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4sXG4gICAgdXNlU2lnbmluZ1N0ZXBzOiBib29sZWFuLFxuICAgIHVuc3BlbnRzPzogVW5zcGVudDxiaWdpbnQ+W11cbiAgKSB7XG4gICAgY29uc3QgaXNQc2J0ID0gdHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuICAgIGNvbnN0IGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCA9IGlzUHNidCAmJiB1dHhvbGliLmJpdGdvLmlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kSW5wdXQodHgpO1xuICAgIGNvbnN0IHR4SGV4ID0gdHgudG9IZXgoKTtcblxuICAgIGZ1bmN0aW9uIG5vY2tTaWduUHNidChwc2J0SGV4OiBzdHJpbmcpOiBub2NrLlNjb3BlIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHBzYnRIZXgsIGNvaW4ubmV0d29yayk7XG4gICAgICByZXR1cm4gbm9jayhiZ1VybClcbiAgICAgICAgLnBvc3QoYC9hcGkvdjIvJHt3YWxsZXQuY29pbigpfS93YWxsZXQvJHt3YWxsZXQuaWQoKX0vdHgvc2lnbnBzYnRgLCAoYm9keSkgPT4gYm9keS5wc2J0KVxuICAgICAgICAucmVwbHkoMjAwLCB7IHBzYnQ6IHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChyb290V2FsbGV0S2V5cy5iaXRnbykudG9IZXgoKSB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZVNpZ25pbmdTdGVwcykge1xuICAgICAgbGV0IHNjb3BlOiBub2NrLlNjb3BlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHR4IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCAmJiBpc1R4V2l0aFRhcHJvb3RLZXlQYXRoU3BlbmQpIHtcbiAgICAgICAgc2NvcGUgPSBub2NrU2lnblBzYnQodHguY2xvbmUoKS5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHJvb3RXYWxsZXRLZXlzLmJpdGdvKS50b0hleCgpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBzYnQgPSBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHtcbiAgICAgICAgICB0eEhleCxcbiAgICAgICAgICB0eEluZm86IGlzUHNidCA/IHVuZGVmaW5lZCA6IHsgdW5zcGVudHMgfSxcbiAgICAgICAgICB3YWxsZXRJZDogaXNUeFdpdGhUYXByb290S2V5UGF0aFNwZW5kID8gd2FsbGV0LmlkKCkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICAgIHBydjogdXNlclBydixcbiAgICAgICAgcHViczogaXNQc2J0ID8gdW5kZWZpbmVkIDogcHVicyxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0Lm9rKCd0eEhleCcgaW4gcHNidCk7XG4gICAgICBpZiAoaXNQc2J0KSB7XG4gICAgICAgIHZhbGlkYXRlUHNidChwc2J0LnR4SGV4LCAxLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydC5vayh1bnNwZW50cyk7XG4gICAgICAgIHZhbGlkYXRlVHgocHNidC50eEhleCwgdW5zcGVudHMsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY29wZS5pc0RvbmUoKSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmVyTm9uY2VQc2J0ID0gYXdhaXQgY29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9LFxuICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgc2lnbmluZ1N0ZXA6ICdzaWduZXJOb25jZScsXG4gICAgfSk7XG4gICAgYXNzZXJ0Lm9rKCd0eEhleCcgaW4gc2lnbmVyTm9uY2VQc2J0KTtcbiAgICBpZiAoaXNQc2J0KSB7XG4gICAgICB2YWxpZGF0ZVBzYnQoc2lnbmVyTm9uY2VQc2J0LnR4SGV4LCAwLCBpc1R4V2l0aFRhcHJvb3RLZXlQYXRoU3BlbmQgPyAxIDogdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0Lm9rKHVuc3BlbnRzKTtcbiAgICAgIHZhbGlkYXRlVHgoc2lnbmVyTm9uY2VQc2J0LnR4SGV4LCB1bnNwZW50cywgMCk7XG4gICAgfVxuXG4gICAgbGV0IHNjb3BlOiBub2NrLlNjb3BlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1R4V2l0aFRhcHJvb3RLZXlQYXRoU3BlbmQpIHtcbiAgICAgIHNjb3BlID0gbm9ja1NpZ25Qc2J0KHNpZ25lck5vbmNlUHNidC50eEhleCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29zaWduZXJOb25jZVBzYnQgPSBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnNpZ25lck5vbmNlUHNidCwgd2FsbGV0SWQ6IHdhbGxldC5pZCgpIH0sXG4gICAgICBzaWduaW5nU3RlcDogJ2Nvc2lnbmVyTm9uY2UnLFxuICAgIH0pO1xuICAgIGFzc2VydC5vaygndHhIZXgnIGluIGNvc2lnbmVyTm9uY2VQc2J0KTtcbiAgICBpZiAoaXNQc2J0KSB7XG4gICAgICB2YWxpZGF0ZVBzYnQoY29zaWduZXJOb25jZVBzYnQudHhIZXgsIDAsIGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCA/IDIgOiB1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQub2sodW5zcGVudHMpO1xuICAgICAgdmFsaWRhdGVUeChjb3NpZ25lck5vbmNlUHNidC50eEhleCwgdW5zcGVudHMsIDApO1xuICAgIH1cblxuICAgIGlmIChzY29wZSkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjb3BlLmlzRG9uZSgpLCB0cnVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZXJTaWdQc2J0ID0gYXdhaXQgY29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdHhQcmVidWlsZDogeyAuLi5jb3NpZ25lck5vbmNlUHNidCwgdHhJbmZvOiBpc1BzYnQgPyB1bmRlZmluZWQgOiB7IHVuc3BlbnRzIH0gfSxcbiAgICAgIHBydjogdXNlclBydixcbiAgICAgIHB1YnM6IGlzUHNidCA/IHVuZGVmaW5lZCA6IHB1YnMsXG4gICAgICBzaWduaW5nU3RlcDogJ3NpZ25lclNpZ25hdHVyZScsXG4gICAgfSk7XG4gICAgYXNzZXJ0Lm9rKCd0eEhleCcgaW4gc2lnbmVyU2lnUHNidCk7XG4gICAgaWYgKGlzUHNidCkge1xuICAgICAgdmFsaWRhdGVQc2J0KHNpZ25lclNpZ1BzYnQudHhIZXgsIDEsIGlzVHhXaXRoVGFwcm9vdEtleVBhdGhTcGVuZCA/IDIgOiB1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQub2sodW5zcGVudHMpO1xuICAgICAgdmFsaWRhdGVUeChzaWduZXJTaWdQc2J0LnR4SGV4LCB1bnNwZW50cywgMSk7XG4gICAgfVxuICB9XG5cbiAgaXQoJ3N1Y2Nlc3Mgd2hlbiBjYWxsZWQgbGlrZSBjdXN0b21TaWduaW5nRnVuY3Rpb24gZmxvdyAtIFBTQlQgd2l0aCB0YXByb290S2V5UGF0aFNwZW5kIGlucHV0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbnB1dHM6IHRlc3R1dGlsLklucHV0W10gPSB0ZXN0dXRpbC5pbnB1dFNjcmlwdFR5cGVzLm1hcCgoc2NyaXB0VHlwZSkgPT4gKHtcbiAgICAgIHNjcmlwdFR5cGUsXG4gICAgICB2YWx1ZTogQmlnSW50KDEwMDApLFxuICAgIH0pKTtcbiAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci52YWx1ZSwgQmlnSW50KDApKTtcbiAgICBjb25zdCBvdXRwdXRzOiB0ZXN0dXRpbC5PdXRwdXRbXSA9IFt7IHNjcmlwdFR5cGU6ICdwMnNoJywgdmFsdWU6IHVuc3BlbnRTdW0gLSBCaWdJbnQoMTAwMCkgfV07XG4gICAgY29uc3QgcHNidCA9IHRlc3R1dGlsLmNvbnN0cnVjdFBzYnQoaW5wdXRzLCBvdXRwdXRzLCBjb2luLm5ldHdvcmssIHJvb3RXYWxsZXRLZXlzLCAndW5zaWduZWQnLCB7XG4gICAgICBwMnNoUDJwa0tleTogZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMoY29pbi5uYW1lKVswXSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgdiBvZiBbZmFsc2UsIHRydWVdKSB7XG4gICAgICBhd2FpdCBzaWduVHJhbnNhY3Rpb24ocHNidCwgdik7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc3VjY2VzcyB3aGVuIGNhbGxlZCBsaWtlIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBmbG93IC0gUFNCVCB3aXRob3V0IHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0czogdGVzdHV0aWwuSW5wdXRbXSA9IHRlc3R1dGlsLmlucHV0U2NyaXB0VHlwZXNcbiAgICAgIC5maWx0ZXIoKHYpID0+IHYgIT09ICd0YXByb290S2V5UGF0aFNwZW5kJylcbiAgICAgIC5tYXAoKHNjcmlwdFR5cGUpID0+ICh7XG4gICAgICAgIHNjcmlwdFR5cGUsXG4gICAgICAgIHZhbHVlOiBCaWdJbnQoMTAwMCksXG4gICAgICB9KSk7XG4gICAgY29uc3QgdW5zcGVudFN1bSA9IGlucHV0cy5yZWR1Y2UoKHByZXY6IGJpZ2ludCwgY3VyKSA9PiBwcmV2ICsgY3VyLnZhbHVlLCBCaWdJbnQoMCkpO1xuICAgIGNvbnN0IG91dHB1dHM6IHRlc3R1dGlsLk91dHB1dFtdID0gW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogdW5zcGVudFN1bSAtIEJpZ0ludCgxMDAwKSB9XTtcbiAgICBjb25zdCBwc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChpbnB1dHMsIG91dHB1dHMsIGNvaW4ubmV0d29yaywgcm9vdFdhbGxldEtleXMsICd1bnNpZ25lZCcpO1xuXG4gICAgZm9yIChjb25zdCB2IG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgICAgIGF3YWl0IHNpZ25UcmFuc2FjdGlvbihwc2J0LCB2KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzdWNjZXNzIHdoZW4gY2FsbGVkIGxpa2UgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uIGZsb3cgLSBOZXR3b3JrIFR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0czogdGVzdHV0aWwuVHhuSW5wdXQ8YmlnaW50PltdID0gdGVzdHV0aWwudHhuSW5wdXRTY3JpcHRUeXBlc1xuICAgICAgLmZpbHRlcigodikgPT4gdiAhPT0gJ3Ayc2hQMnBrJylcbiAgICAgIC5tYXAoKHNjcmlwdFR5cGUpID0+ICh7XG4gICAgICAgIHNjcmlwdFR5cGUsXG4gICAgICAgIHZhbHVlOiBCaWdJbnQoMTAwMCksXG4gICAgICB9KSk7XG4gICAgY29uc3QgdW5zcGVudFN1bSA9IGlucHV0cy5yZWR1Y2UoKHByZXY6IGJpZ2ludCwgY3VycikgPT4gcHJldiArIGN1cnIudmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuVHhuT3V0cHV0PGJpZ2ludD5bXSA9IFt7IHNjcmlwdFR5cGU6ICdwMnNoJywgdmFsdWU6IHVuc3BlbnRTdW0gLSBCaWdJbnQoMTAwMCkgfV07XG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGVzdHV0aWwuY29uc3RydWN0VHhuQnVpbGRlcihpbnB1dHMsIG91dHB1dHMsIGNvaW4ubmV0d29yaywgcm9vdFdhbGxldEtleXMsICd1bnNpZ25lZCcpO1xuICAgIGNvbnN0IHVuc3BlbnRzID0gaW5wdXRzLm1hcCgodiwgaSkgPT4gdGVzdHV0aWwudG9UeG5VbnNwZW50KHYsIGksIGNvaW4ubmV0d29yaywgcm9vdFdhbGxldEtleXMpKTtcblxuICAgIGZvciAoY29uc3QgdiBvZiBbZmFsc2UsIHRydWVdKSB7XG4gICAgICBhd2FpdCBzaWduVHJhbnNhY3Rpb24odHhCdWlsZGVyLmJ1aWxkSW5jb21wbGV0ZSgpLCB2LCB1bnNwZW50cyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnZmFpbHMgd2hlbiBjYWxsZWQgbGlrZSBjdXN0b21TaWduaW5nRnVuY3Rpb24gZmxvdyAtIFBTQlQgY2FjaGUgbWlzcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBpbnB1dHM6IHRlc3R1dGlsLklucHV0W10gPSBbeyBzY3JpcHRUeXBlOiAndGFwcm9vdEtleVBhdGhTcGVuZCcsIHZhbHVlOiBCaWdJbnQoMTAwMCkgfV07XG4gICAgY29uc3QgdW5zcGVudFN1bSA9IGlucHV0cy5yZWR1Y2UoKHByZXY6IGJpZ2ludCwgY3VycikgPT4gcHJldiArIGN1cnIudmFsdWUsIEJpZ0ludCgwKSk7XG4gICAgY29uc3Qgb3V0cHV0czogdGVzdHV0aWwuT3V0cHV0W10gPSBbeyBzY3JpcHRUeXBlOiAncDJzaCcsIHZhbHVlOiB1bnNwZW50U3VtIC0gQmlnSW50KDEwMDApIH1dO1xuICAgIGNvbnN0IHBzYnQgPSB0ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KGlucHV0cywgb3V0cHV0cywgY29pbi5uZXR3b3JrLCByb290V2FsbGV0S2V5cywgJ3Vuc2lnbmVkJyk7XG5cbiAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgY29pbi5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IHBzYnQudG9IZXgoKSB9LFxuICAgICAgICAgIHBydjogdXNlclBydixcbiAgICAgICAgICBzaWduaW5nU3RlcDogJ3NpZ25lclNpZ25hdHVyZScsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTogYFBzYnQgaXMgbWlzc2luZyBmcm9tIHR4Q2FjaGUgKGNhY2hlIHNpemUgMCkuXG4gICAgICAgICAgICBUaGlzIG1heSBiZSBkdWUgdG8gdGhlIHJlcXVlc3QgYmVpbmcgcm91dGVkIHRvIGEgZGlmZmVyZW50IEJpdEdvLUV4cHJlc3MgaW5zdGFuY2UgdGhhdCBmb3Igc2lnbmluZyBzdGVwICdzaWduZXJOb25jZScuYCxcbiAgICAgIH1cbiAgICApO1xuICB9KTtcblxuICBpdCgnZmFpbHMgd2hlbiB1bnN1cHBvcnRlZCBsb2NraW5nIHNjcmlwdCBpcyB1c2VkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0czogdGVzdHV0aWwuSW5wdXRbXSA9IFtcbiAgICAgIHsgc2NyaXB0VHlwZTogJ3Ayd3NoJywgdmFsdWU6IEJpZ0ludCgxMDAwKSB9LFxuICAgICAgeyBzY3JpcHRUeXBlOiAncDJ0ck11c2lnMicsIHZhbHVlOiBCaWdJbnQoMTAwMCkgfSxcbiAgICBdO1xuICAgIGNvbnN0IHVuc3BlbnRTdW0gPSBpbnB1dHMucmVkdWNlKChwcmV2OiBiaWdpbnQsIGN1cnIpID0+IHByZXYgKyBjdXJyLnZhbHVlLCBCaWdJbnQoMCkpO1xuICAgIGNvbnN0IG91dHB1dHM6IHRlc3R1dGlsLk91dHB1dFtdID0gW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogdW5zcGVudFN1bSAtIEJpZ0ludCg1MDApIH1dO1xuICAgIGNvbnN0IHBzYnQgPSB0ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KGlucHV0cywgb3V0cHV0cywgY29pbi5uZXR3b3JrLCByb290V2FsbGV0S2V5cywgJ3Vuc2lnbmVkJyk7XG5cbiAgICAvLyBvdmVycmlkZSB0aGUgMXN0IFBTQlQgaW5wdXQgd2l0aCB1bnN1cHBvcnRlZCAyIG9mIDIgbXVsdGktc2lnIGxvY2tpbmcgc2NyaXB0LlxuICAgIGNvbnN0IHVuc3BlbnQgPSB0ZXN0dXRpbC50b1Vuc3BlbnQoaW5wdXRzWzBdLCAwLCBjb2luLm5ldHdvcmssIHJvb3RXYWxsZXRLZXlzKTtcbiAgICBpZiAoIXV0eG9saWIuYml0Z28uaXNXYWxsZXRVbnNwZW50KHVuc3BlbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdW5zcGVudCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHB1YmxpY0tleXMgfSA9IHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCk7XG4gICAgY29uc3Qgc2NyaXB0Mk9mMiA9IHV0eG9saWIucGF5bWVudHMucDJtcyh7IG06IDIsIHB1YmtleXM6IFtwdWJsaWNLZXlzWzBdLCBwdWJsaWNLZXlzWzFdXSB9KTtcbiAgICBwc2J0LmRhdGEuaW5wdXRzWzBdLndpdG5lc3NTY3JpcHQgPSBzY3JpcHQyT2YyLm91dHB1dDtcblxuICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBjb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogcHNidC50b0hleCgpIH0sXG4gICAgICAgICAgcHJ2OiB1c2VyUHJ2LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6IGBsZW5ndGggbWlzbWF0Y2hgLFxuICAgICAgfVxuICAgICk7XG4gIH0pO1xufSk7XG5cbmZ1bmN0aW9uIHJ1bjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgaW5wdXRTY3JpcHRzOiB0ZXN0dXRpbC5JbnB1dFNjcmlwdFR5cGVbXSxcbiAgdHhGb3JtYXQ6ICdsZWdhY3knIHwgJ3BzYnQnLFxuICB7IGRlY29kZVdpdGggfTogeyBkZWNvZGVXaXRoPzogU2RrQmFja2VuZCB9ID0ge31cbikge1xuICBjb25zdCBhbW91bnRUeXBlID0gY29pbi5hbW91bnRUeXBlO1xuICBjb25zdCB0aXRsZSA9IFtcbiAgICBpbnB1dFNjcmlwdHMuam9pbignLCcpLFxuICAgIGB0eEZvcm1hdD0ke3R4Rm9ybWF0fWAsXG4gICAgYGFtb3VudFR5cGU9JHthbW91bnRUeXBlfWAsXG4gICAgZGVjb2RlV2l0aCA/IGBkZWNvZGVXaXRoPSR7ZGVjb2RlV2l0aH1gIDogJycsXG4gIF07XG4gIGRlc2NyaWJlKGAke3RpdGxlLmpvaW4oJyAnKX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2RlZmF1bHRCaXRHby5nZXRFbnYoKV0udXJpO1xuXG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQgPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKTtcbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aFJlcGxheVByb3RlY3Rpb24gPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3Ayc2hQMnBrJyk7XG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhQMnRyID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICdwMnRyJyk7XG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhQMnRyTXVzaWcyID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICdwMnRyTXVzaWcyJyk7XG5cbiAgICBjb25zdCB2YWx1ZSA9IChhbW91bnRUeXBlID09PSAnYmlnaW50JyA/IEJpZ0ludCgnMTA5OTk5OTk4MDAwMDAwMDEnKSA6IDFlOCkgYXMgVE51bWJlcjtcbiAgICBjb25zdCB3YWxsZXQgPSBnZXRVdHhvV2FsbGV0KGNvaW4sIHsgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSB9KTtcbiAgICBjb25zdCB3YWxsZXRLZXlzID0gZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcblxuICAgIGNvbnN0IGZ1bGxTaWduID0gIShpc1RyYW5zYWN0aW9uV2l0aFJlcGxheVByb3RlY3Rpb24gfHwgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQpO1xuXG4gICAgZnVuY3Rpb24gZ2V0VW5zcGVudHNGb3JQc2J0KCk6IFVuc3BlbnQ8YmlnaW50PltdIHtcbiAgICAgIHJldHVybiBpbnB1dFNjcmlwdHMubWFwKCh0LCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gdGVzdHV0aWwudG9VbnNwZW50KFxuICAgICAgICAgIHsgc2NyaXB0VHlwZTogdCwgdmFsdWU6IHQgPT09ICdwMnNoUDJwaycgPyBCaWdJbnQoMTAwMCkgOiBCaWdJbnQodmFsdWUpIH0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgY29pbi5uZXR3b3JrLFxuICAgICAgICAgIHdhbGxldEtleXNcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvVHhuSW5wdXRTY3JpcHRUeXBlKHR5cGU6IHRlc3R1dGlsLklucHV0U2NyaXB0VHlwZSk6IElucHV0U2NyaXB0VHlwZSB7XG4gICAgICByZXR1cm4gdHlwZSA9PT0gJ3Ayc2hQMnBrJyA/ICdyZXBsYXlQcm90ZWN0aW9uJyA6IHR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyA/ICdwMnRyTXVzaWcyJyA6IHR5cGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VW5zcGVudHMoKTogVW5zcGVudDxUTnVtYmVyPltdIHtcbiAgICAgIHJldHVybiBpbnB1dFNjcmlwdHMubWFwKCh0eXBlLCBpKSA9PlxuICAgICAgICBtb2NrVW5zcGVudDxUTnVtYmVyPihjb2luLm5ldHdvcmssIHdhbGxldEtleXMsIHRvVHhuSW5wdXRTY3JpcHRUeXBlKHR5cGUpLCBpLCB2YWx1ZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0T3V0cHV0QWRkcmVzcyhyb290V2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVBZGRyZXNzKGNvaW4ubmFtZSwge1xuICAgICAgICBrZXljaGFpbnM6IHJvb3RXYWxsZXRLZXlzLnRyaXBsZS5tYXAoKGspID0+ICh7IHB1Yjogay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSkpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2lnblBhcmFtcyhcbiAgICAgIHByZWJ1aWxkSGV4OiBzdHJpbmcsXG4gICAgICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgY29zaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgZGVjb2RlV2l0aDogU2RrQmFja2VuZCB8IHVuZGVmaW5lZFxuICAgICk6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICAgICAgY29uc3QgdHhJbmZvID0ge1xuICAgICAgICB1bnNwZW50czogdHhGb3JtYXQgPT09ICdwc2J0JyA/IHVuZGVmaW5lZCA6IGdldFVuc3BlbnRzKCksXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHdhbGxldElkOiBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCA/IHdhbGxldC5pZCgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR4SGV4OiBwcmVidWlsZEhleCxcbiAgICAgICAgICB0eEluZm8sXG4gICAgICAgICAgZGVjb2RlV2l0aCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJ2OiBzaWduZXIudG9CYXNlNTgoKSxcbiAgICAgICAgcHViczogd2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSksXG4gICAgICAgIGNvc2lnbmVyUHViOiBjb3NpZ25lci5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICB9IGFzIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKFxuICAgICAgcHJlYnVpbGQ6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgICAgIHNpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBjb3NpZ25lcjogQklQMzJJbnRlcmZhY2VcbiAgICApOiBQcm9taXNlPEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+IHtcbiAgICAgIGxldCBzY29wZTogbm9jay5TY29wZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwcmVidWlsZCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgJiYgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQpIHtcbiAgICAgICAgY29uc3QgcHNidCA9IHByZWJ1aWxkLmNsb25lKCkuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChjb3NpZ25lcik7XG4gICAgICAgIHNjb3BlID0gbm9jayhiZ1VybClcbiAgICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zaWducHNidGAsIChib2R5KSA9PiBib2R5LnBzYnQpXG4gICAgICAgICAgLnJlcGx5KDIwMCwgeyBwc2J0OiBwc2J0LnRvSGV4KCkgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGhhbGYtc2lnbiB3aXRoIHRoZSB1c2VyIGtleVxuICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oXG4gICAgICAgIGdldFNpZ25QYXJhbXMocHJlYnVpbGQudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JyksIHNpZ25lciwgY29zaWduZXIsIGRlY29kZVdpdGgpXG4gICAgICApKSBhcyBQcm9taXNlPEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+O1xuXG4gICAgICBpZiAoc2NvcGUpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjb3BlLmlzRG9uZSgpLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICBoYWxmU2lnbmVkOiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICAgICAgc2lnbmVyOiBCSVAzMkludGVyZmFjZSxcbiAgICAgIGNvc2lnbmVyOiBCSVAzMkludGVyZmFjZVxuICAgICk6IFByb21pc2U8RnVsbHlTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgICAgcmV0dXJuIChhd2FpdCB3YWxsZXQuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgLi4uZ2V0U2lnblBhcmFtcyhoYWxmU2lnbmVkLnR4SGV4LCBzaWduZXIsIGNvc2lnbmVyLCBkZWNvZGVXaXRoKSxcbiAgICAgICAgaXNMYXN0U2lnbmF0dXJlOiB0cnVlLFxuICAgICAgfSkpIGFzIEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgdHlwZSBUcmFuc2FjdGlvblN0YWdlcyA9IHtcbiAgICAgIHByZWJ1aWxkOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQ7XG4gICAgICBoYWxmU2lnbmVkVXNlckJhY2t1cD86IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb247XG4gICAgICBoYWxmU2lnbmVkVXNlckJpdEdvOiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uO1xuICAgICAgZnVsbFNpZ25lZFVzZXJCYWNrdXA/OiBGdWxseVNpZ25lZFRyYW5zYWN0aW9uO1xuICAgICAgZnVsbFNpZ25lZFVzZXJCaXRHbz86IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfTtcblxuICAgIHR5cGUgVHJhbnNhY3Rpb25PYmpTdGFnZXMgPSBSZWNvcmQ8a2V5b2YgVHJhbnNhY3Rpb25TdGFnZXMsIFRyYW5zYWN0aW9uT2JqPjtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVByZWJ1aWxkUHNidCgpIHtcbiAgICAgIGNvbnN0IGlucHV0cyA9IGlucHV0U2NyaXB0cy5tYXAoXG4gICAgICAgICh0KTogdGVzdHV0aWwuSW5wdXQgPT4gKHtcbiAgICAgICAgICBzY3JpcHRUeXBlOiB0LFxuICAgICAgICAgIHZhbHVlOiB0ID09PSAncDJzaFAycGsnID8gQmlnSW50KDEwMDApIDogQmlnSW50KHZhbHVlKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci52YWx1ZSwgQmlnSW50KDApKTtcbiAgICAgIGNvbnN0IG91dHB1dHM6IHRlc3R1dGlsLk91dHB1dFtdID0gW1xuICAgICAgICB7IGFkZHJlc3M6IGdldE91dHB1dEFkZHJlc3MoZ2V0V2FsbGV0S2V5cygndGVzdCcpKSwgdmFsdWU6IHVuc3BlbnRTdW0gLSBCaWdJbnQoMTAwMCkgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBwc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChpbnB1dHMsIG91dHB1dHMsIGNvaW4ubmV0d29yaywgd2FsbGV0S2V5cywgJ3Vuc2lnbmVkJywge1xuICAgICAgICBwMnNoUDJwa0tleTogZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMoY29pbi5uYW1lKVswXSxcbiAgICAgIH0pO1xuICAgICAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCB3YWxsZXRLZXlzKTtcbiAgICAgIHJldHVybiBwc2J0O1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uU3RhZ2VzKCk6IFByb21pc2U8VHJhbnNhY3Rpb25TdGFnZXM+IHtcbiAgICAgIGNvbnN0IHByZWJ1aWxkID1cbiAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgID8gY3JlYXRlUHJlYnVpbGRQc2J0KClcbiAgICAgICAgICA6IGNyZWF0ZVByZWJ1aWxkVHJhbnNhY3Rpb248VE51bWJlcj4oY29pbi5uZXR3b3JrLCBnZXRVbnNwZW50cygpLCBnZXRPdXRwdXRBZGRyZXNzKHdhbGxldEtleXMpKTtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFVzZXJCaXRHbyA9IGF3YWl0IGNyZWF0ZUhhbGZTaWduZWRUcmFuc2FjdGlvbihwcmVidWlsZCwgd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJpdGdvKTtcbiAgICAgIGNvbnN0IGZ1bGxTaWduZWRVc2VyQml0R28gPVxuICAgICAgICBmdWxsU2lnbiAmJiAhaXNUcmFuc2FjdGlvbldpdGhQMnRyTXVzaWcyXG4gICAgICAgICAgPyBhd2FpdCBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oaGFsZlNpZ25lZFVzZXJCaXRHbywgd2FsbGV0S2V5cy5iaXRnbywgd2FsbGV0S2V5cy51c2VyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkVXNlckJhY2t1cCA9XG4gICAgICAgICFpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCAmJiAhKHR4Rm9ybWF0ID09PSAncHNidCcgJiYgaXNUcmFuc2FjdGlvbldpdGhQMnRyKVxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKHByZWJ1aWxkLCB3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFVzZXJCYWNrdXAgPVxuICAgICAgICBmdWxsU2lnbiAmJiBoYWxmU2lnbmVkVXNlckJhY2t1cFxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlRnVsbFNpZ25lZFRyYW5zYWN0aW9uKGhhbGZTaWduZWRVc2VyQmFja3VwLCB3YWxsZXRLZXlzLmJhY2t1cCwgd2FsbGV0S2V5cy51c2VyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmVidWlsZCxcbiAgICAgICAgaGFsZlNpZ25lZFVzZXJCYWNrdXAsXG4gICAgICAgIGhhbGZTaWduZWRVc2VyQml0R28sXG4gICAgICAgIGZ1bGxTaWduZWRVc2VyQmFja3VwLFxuICAgICAgICBmdWxsU2lnbmVkVXNlckJpdEdvLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNhY3Rpb25TdGFnZXM6IFRyYW5zYWN0aW9uU3RhZ2VzO1xuXG4gICAgYmVmb3JlKCdwcmVwYXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb25TdGFnZXMgPSBhd2FpdCBnZXRUcmFuc2FjdGlvblN0YWdlcygpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKG5vY2suY2xlYW5BbGwpO1xuXG4gICAgaXQoJ21hdGNoIGZpeHR1cmVzJywgYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1vY2hhLkNvbnRleHQpIHtcbiAgICAgIGlmICh0eEZvcm1hdCA9PT0gJ3BzYnQnKSB7XG4gICAgICAgIC8vIFRPRE8gKG1heWJlKSAtIG9uY2UgZnVsbCBQU0JUIHN1cHBvcnQgaXMgYWRkZWQgdG8gYWJzdHJhY3QtdXR4byBtb2R1bGUsIGN1c3RvbSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIFBTQlQgY2FuIGJlIGNyZWF0ZWQgYW5kIHRlc3RlZCBoZXJlLlxuICAgICAgICAvLyBzaWduYXR1cmVzIG9mIHRhcHJvb3RLZXlQYXRoU3BlbmRzIGFyZSByYW5kb20gc2luY2UgcmFuZG9tIG5hdHVyZSBvZiBNdVNpZzIgbm9uY2UsIHNvIHBzYnQgaGV4IGNvbXBhcmlzb24gYWxzbyB3b250IHdvcmsuXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0b1RyYW5zYWN0aW9uU3RhZ2VzT2JqKHN0YWdlczogVHJhbnNhY3Rpb25TdGFnZXMpOiBUcmFuc2FjdGlvbk9ialN0YWdlcyB7XG4gICAgICAgIHJldHVybiBfLm1hcFZhbHVlcyhzdGFnZXMsICh2KSA9PlxuICAgICAgICAgIHYgPT09IHVuZGVmaW5lZCB8fCB2IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogdiBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uXG4gICAgICAgICAgICA/IHRyYW5zYWN0aW9uVG9PYmo8VE51bWJlcj4odilcbiAgICAgICAgICAgIDogdHJhbnNhY3Rpb25IZXhUb09iaih2LnR4SGV4LCBjb2luLm5ldHdvcmssIGFtb3VudFR5cGUpXG4gICAgICAgICkgYXMgVHJhbnNhY3Rpb25PYmpTdGFnZXM7XG4gICAgICB9XG5cbiAgICAgIHNob3VsZEVxdWFsSlNPTihcbiAgICAgICAgdG9UcmFuc2FjdGlvblN0YWdlc09iaih0cmFuc2FjdGlvblN0YWdlcyksXG4gICAgICAgIGF3YWl0IGdldEZpeHR1cmUoXG4gICAgICAgICAgY29pbixcbiAgICAgICAgICBgdHJhbnNhY3Rpb25zLSR7aW5wdXRTY3JpcHRzLm1hcCgodCkgPT4gdG9UeG5JbnB1dFNjcmlwdFR5cGUodCkpLmpvaW4oJy0nKX1gLFxuICAgICAgICAgIHRvVHJhbnNhY3Rpb25TdGFnZXNPYmoodHJhbnNhY3Rpb25TdGFnZXMpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHNidFZhbGlkU2lnbmF0dXJlcyh0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiwgc2lnbmVkQnk6IEJJUDMySW50ZXJmYWNlW10pIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4LnR4SGV4LCBjb2luLm5ldHdvcmspO1xuICAgICAgY29uc3QgdW5zcGVudHMgPSBnZXRVbnNwZW50c0ZvclBzYnQoKTtcbiAgICAgIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbmRleF07XG4gICAgICAgIGlmICghdXR4b2xpYi5iaXRnby5pc1dhbGxldFVuc3BlbnQodW5zcGVudCkpIHtcbiAgICAgICAgICBhc3NlcnQub2sodXR4b2xpYi5iaXRnby5nZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KSwgJ3Ayc2hQMnBrJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB1YmtleXMgPSB3YWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgodW5zcGVudC5jaGFpbiwgdW5zcGVudC5pbmRleCkucHVibGljS2V5cztcbiAgICAgICAgcHVia2V5cy5mb3JFYWNoKChwaywgcGtJbmRleCkgPT4ge1xuICAgICAgICAgIHBzYnQudmFsaWRhdGVTaWduYXR1cmVzT2ZJbnB1dENvbW1vbihpbmRleCwgcGspLnNob3VsZC5lcWwoc2lnbmVkQnkuaW5jbHVkZXMod2FsbGV0S2V5cy50cmlwbGVbcGtJbmRleF0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0ZXN0VmFsaWRTaWduYXR1cmVzKFxuICAgICAgdHg6IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24gfCBGdWxseVNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgc2lnbmVkQnk6IEJJUDMySW50ZXJmYWNlW10sXG4gICAgICBzaWduOiAnaGFsZnNpZ25lZCcgfCAnZnVsbHNpZ25lZCdcbiAgICApIHtcbiAgICAgIGlmICh0eEZvcm1hdCA9PT0gJ3BzYnQnICYmIHNpZ24gPT09ICdoYWxmc2lnbmVkJykge1xuICAgICAgICB0ZXN0UHNidFZhbGlkU2lnbmF0dXJlcyh0eCwgc2lnbmVkQnkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1bnNwZW50cyA9XG4gICAgICAgIHR4Rm9ybWF0ID09PSAncHNidCdcbiAgICAgICAgICA/IGdldFVuc3BlbnRzRm9yUHNidCgpLm1hcCgodSkgPT4gKHsgLi4udSwgdmFsdWU6IGJpdGdvLnRvVE51bWJlcih1LnZhbHVlLCBhbW91bnRUeXBlKSBhcyBUTnVtYmVyIH0pKVxuICAgICAgICAgIDogZ2V0VW5zcGVudHMoKTtcbiAgICAgIGNvbnN0IHByZXZPdXRwdXRzID0gdW5zcGVudHMubWFwKFxuICAgICAgICAodSk6IHV0eG9saWIuVHhPdXRwdXQ8VE51bWJlcj4gPT4gKHtcbiAgICAgICAgICBzY3JpcHQ6IEJ1ZmZlci5mcm9tKHdhc21BZGRyZXNzLnRvT3V0cHV0U2NyaXB0V2l0aENvaW4odS5hZGRyZXNzLCBjb2luLm5hbWUpKSxcbiAgICAgICAgICB2YWx1ZTogdS52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXI8VE51bWJlcj4oXG4gICAgICAgIEJ1ZmZlci5mcm9tKHR4LnR4SGV4LCAnaGV4JyksXG4gICAgICAgIGNvaW4ubmV0d29yayxcbiAgICAgICAgeyBhbW91bnRUeXBlIH1cbiAgICAgICk7XG4gICAgICB0cmFuc2FjdGlvbi5pbnMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbnB1dFNjcmlwdHNbaW5kZXhdID09PSAncDJzaFAycGsnKSB7XG4gICAgICAgICAgYXNzZXJ0Lm9rKGNvaW4uaXNCaXRHb1RhaW50ZWRVbnNwZW50KHVuc3BlbnRzW2luZGV4XSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbmRleF0gYXMgV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcbiAgICAgICAgY29uc3QgcHVia2V5cyA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh1bnNwZW50LmNoYWluLCB1bnNwZW50LmluZGV4KS5wdWJsaWNLZXlzO1xuXG4gICAgICAgIHB1YmtleXMuZm9yRWFjaCgocGssIHBrSW5kZXgpID0+IHtcbiAgICAgICAgICB1dHhvbGliLmJpdGdvXG4gICAgICAgICAgICAudmVyaWZ5U2lnbmF0dXJlPFROdW1iZXI+KFxuICAgICAgICAgICAgICB0cmFuc2FjdGlvbixcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHByZXZPdXRwdXRzW2luZGV4XS52YWx1ZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHB1YmxpY0tleTogcGssXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByZXZPdXRwdXRzXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc2hvdWxkLmVxbChzaWduZWRCeS5pbmNsdWRlcyh3YWxsZXRLZXlzLnRyaXBsZVtwa0luZGV4XSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RFeHBsYWluVHgoXG4gICAgICBzdGFnZU5hbWU6IHN0cmluZyxcbiAgICAgIHR4SGV4OiBzdHJpbmcsXG4gICAgICB1bnNwZW50czogdXR4b2xpYi5iaXRnby5VbnNwZW50PFROdW1iZXI+W10sXG4gICAgICBwdWJzOiBUcmlwbGU8c3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICB1bnNwZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAgcHVicyxcbiAgICAgICAgZGVjb2RlV2l0aCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFByb3BlcnRpZXMgPSBbJ2lkJywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0QW1vdW50J107XG5cbiAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICBleHBlY3RlZFByb3BlcnRpZXMucHVzaCgnZGlzcGxheU9yZGVyJywgJ2lucHV0U2lnbmF0dXJlcycsICdzaWduYXR1cmVzJyk7XG4gICAgICB9XG5cbiAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoLi4uZXhwZWN0ZWRQcm9wZXJ0aWVzKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRTaWduYXR1cmVDb3VudCA9XG4gICAgICAgIHN0YWdlTmFtZSA9PT0gJ3ByZWJ1aWxkJyB8fCBwdWJzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdoYWxmU2lnbmVkJylcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdmdWxsU2lnbmVkJylcbiAgICAgICAgICA/IDJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCdpbnB1dFNpZ25hdHVyZXMnIGluIGV4cGxhbmF0aW9uKSB7XG4gICAgICAgIGV4cGxhbmF0aW9uLmlucHV0U2lnbmF0dXJlcy5zaG91bGQuZXFsKFxuICAgICAgICAgIC8vIEZJWE1FKEJHLTM1MTU0KTogaW1wbGVtZW50IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHJlcGxheSBwcm90ZWN0aW9uIGlucHV0c1xuICAgICAgICAgIGlucHV0U2NyaXB0cy5tYXAoKHR5cGUpID0+ICh0eXBlID09PSAncDJzaFAycGsnID8gMCA6IGV4cGVjdGVkU2lnbmF0dXJlQ291bnQpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCdzaWduYXR1cmVzJyBpbiBleHBsYW5hdGlvbikge1xuICAgICAgICBleHBsYW5hdGlvbi5zaWduYXR1cmVzLnNob3VsZC5lcWwoZXhwZWN0ZWRTaWduYXR1cmVDb3VudCk7XG4gICAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXFsKCcwJyk7IC8vIG5vIGNoYW5nZSBhZGRyZXNzZXMgZ2l2ZW5cbiAgICAgIH1cbiAgICAgIGxldCBleHBlY3RlZE91dHB1dEFtb3VudCA9XG4gICAgICAgIEJpZ0ludCgodHhGb3JtYXQgPT09ICdwc2J0JyA/IGdldFVuc3BlbnRzRm9yUHNidCgpIDogZ2V0VW5zcGVudHMoKSkubGVuZ3RoKSAqIEJpZ0ludCh2YWx1ZSk7XG4gICAgICBpbnB1dFNjcmlwdHMuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICAgIC8vIHJlcGxheVByb3RlY3Rpb24gdW5zcGVudHMgaGF2ZSB2YWx1ZSAxMDAwXG4gICAgICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICBleHBlY3RlZE91dHB1dEFtb3VudCArPSBCaWdJbnQoMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KDEwMDApOyAvLyBmZWUgb2YgMTAwMFxuICAgICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LnNob3VsZC5lcWwoZXhwZWN0ZWRPdXRwdXRBbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaXQoJ2hhdmUgdmFsaWQgc2lnbmF0dXJlIGZvciBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5oYWxmU2lnbmVkVXNlckJhY2t1cCkge1xuICAgICAgICB0ZXN0VmFsaWRTaWduYXR1cmVzKHRyYW5zYWN0aW9uU3RhZ2VzLmhhbGZTaWduZWRVc2VyQmFja3VwLCBbd2FsbGV0S2V5cy51c2VyXSwgJ2hhbGZzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuaGFsZlNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlcl0sICdoYWxmc2lnbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSB2YWxpZCBzaWduYXR1cmVzIGZvciBmdWxsLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghZnVsbFNpZ24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhZ2VzLmZ1bGxTaWduZWRVc2VyQmFja3VwKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCYWNrdXAsIFt3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwXSwgJ2Z1bGxzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5mdWxsU2lnbmVkVXNlckJpdEdvKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iaXRnb10sICdmdWxsc2lnbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yIGV4cGxhaW5UcmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgc3RhZ2VUeF0gb2YgT2JqZWN0LmVudHJpZXModHJhbnNhY3Rpb25TdGFnZXMpKSB7XG4gICAgICAgIGlmICghc3RhZ2VUeCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAgIHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHx8IHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvblxuICAgICAgICAgICAgPyBzdGFnZVR4LnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICA6IHN0YWdlVHgudHhIZXg7XG5cbiAgICAgICAgY29uc3QgcHVicyA9IHdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9XG4gICAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgICAgPyBnZXRVbnNwZW50c0ZvclBzYnQoKS5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBiaXRnby50b1ROdW1iZXIodS52YWx1ZSwgYW1vdW50VHlwZSkgYXMgVE51bWJlciB9KSlcbiAgICAgICAgICAgIDogZ2V0VW5zcGVudHMoKTtcbiAgICAgICAgYXdhaXQgdGVzdEV4cGxhaW5UeChzdGFnZU5hbWUsIHR4SGV4LCB1bnNwZW50cywgcHVicyk7XG4gICAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICAgIGF3YWl0IHRlc3RFeHBsYWluVHgoc3RhZ2VOYW1lLCB0eEhleCwgdW5zcGVudHMsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RGb3JDb2luKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pIHtcbiAgZ2V0U2NyaXB0VHlwZXMyT2YzKCkuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgIChbJ2xlZ2FjeScsICdwc2J0J10gYXMgY29uc3QpLmZvckVhY2goKHR4Rm9ybWF0KSA9PiB7XG4gICAgICBpZiAoIWNvaW4uc3VwcG9ydHNBZGRyZXNzVHlwZSh0eXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAncDJ0ck11c2lnMicgOiB0eXBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICgodHlwZSA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnIHx8IHR5cGUgPT09ICdwMnRyTXVzaWcyJykgJiYgdHhGb3JtYXQgIT09ICdwc2J0Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJ1bihjb2luLCBbdHlwZSwgdHlwZV0sIHR4Rm9ybWF0KTtcbiAgICAgIGlmIChnZXRSZXBsYXlQcm90ZWN0aW9uQWRkcmVzc2VzKGNvaW4ubmFtZSkubGVuZ3RoKSB7XG4gICAgICAgIHJ1bihjb2luLCBbJ3Ayc2hQMnBrJywgdHlwZV0sIHR4Rm9ybWF0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR4Rm9ybWF0ID09PSAncHNidCcpIHtcbiAgICAgICAgcnVuKGNvaW4sIFt0eXBlLCB0eXBlXSwgdHhGb3JtYXQsIHsgZGVjb2RlV2l0aDogJ3dhc20tdXR4bycgfSk7XG4gICAgICAgIGlmIChnZXRSZXBsYXlQcm90ZWN0aW9uQWRkcmVzc2VzKGNvaW4ubmFtZSkubGVuZ3RoKSB7XG4gICAgICAgICAgcnVuKGNvaW4sIFsncDJzaFAycGsnLCB0eXBlXSwgdHhGb3JtYXQsIHsgZGVjb2RlV2l0aDogJ3dhc20tdXR4bycgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdWl0ZScsIGZ1bmN0aW9uICgpIHtcbiAgdXR4b0NvaW5zLmZvckVhY2goKGNvaW4pID0+IHtcbiAgICBkZXNjcmliZShgJHtjb2luLmdldENoYWluKCl9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgcnVuVGVzdEZvckNvaW4oY29pbik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpQkFBZTtBQUNmLCtDQUFpQztBQUVqQywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLDZCQUE4QjtBQUM5Qiw4Q0FBa0U7QUFDbEUsZ0RBQTBEO0FBQzFELDhDQU15QjtBQUV6QixtQ0FBMEY7QUFJMUYsaUNBZWdCO0FBRWhCLFNBQVMsR0FBRyxDQUNWLElBQXNCLEVBQ3RCLFlBQXdDLEVBQ3hDLFFBQTJCLEVBQzNCLEVBQUUsVUFBVSxLQUFrQyxFQUFFO0lBRWhELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQUc7UUFDWixZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN0QixZQUFZLFFBQVEsRUFBRTtRQUN0QixjQUFjLFVBQVUsRUFBRTtRQUMxQixVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7S0FDN0MsQ0FBQztJQUNGLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtRQUM3QixNQUFNLEtBQUssR0FBRyxpQkFBTSxDQUFDLFlBQVksQ0FBQyxtQkFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBRTdELE1BQU0sNkJBQTZCLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLHFCQUFxQixDQUFDLENBQUM7UUFDNUYsTUFBTSxpQ0FBaUMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssVUFBVSxD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LENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ21vY2hhJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBiaXRnbywgdGVzdHV0aWwgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcyB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHtcbiAgY29tbW9uLFxuICBGdWxseVNpZ25lZFRyYW5zYWN0aW9uLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBUcmlwbGUsXG4gIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4sIGdlbmVyYXRlQWRkcmVzcywgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgU2RrQmFja2VuZCB9IGZyb20gJy4uLy4uL3NyYy90cmFuc2FjdGlvbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFVuc3BlbnQsIFdhbGxldFVuc3BlbnQgfSBmcm9tICcuLi8uLi9zcmMvdW5zcGVudCc7XG5cbmltcG9ydCB7XG4gIHNob3VsZEVxdWFsSlNPTixcbiAgZ2V0Rml4dHVyZSxcbiAgZ2V0VXR4b1dhbGxldCxcbiAgbW9ja1Vuc3BlbnQsXG4gIElucHV0U2NyaXB0VHlwZSxcbiAgVHJhbnNhY3Rpb25PYmosXG4gIHRyYW5zYWN0aW9uVG9PYmosXG4gIHRyYW5zYWN0aW9uSGV4VG9PYmosXG4gIGNyZWF0ZVByZWJ1aWxkVHJhbnNhY3Rpb24sXG4gIGdldERlZmF1bHRXYWxsZXRLZXlzLFxuICBnZXRXYWxsZXRLZXlzLFxuICBkZWZhdWx0Qml0R28sXG4gIGdldE1pblV0eG9Db2lucyxcbiAgZ2V0U2NyaXB0VHlwZXMsXG59IGZyb20gJy4vdXRpbCc7XG5cbmZ1bmN0aW9uIHJ1bjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgaW5wdXRTY3JpcHRzOiB0ZXN0dXRpbC5JbnB1dFNjcmlwdFR5cGVbXSxcbiAgdHhGb3JtYXQ6ICdsZWdhY3knIHwgJ3BzYnQnLFxuICB7IGRlY29kZVdpdGggfTogeyBkZWNvZGVXaXRoPzogU2RrQmFja2VuZCB9ID0ge31cbikge1xuICBjb25zdCBhbW91bnRUeXBlID0gY29pbi5hbW91bnRUeXBlO1xuICBjb25zdCB0aXRsZSA9IFtcbiAgICBpbnB1dFNjcmlwdHMuam9pbignLCcpLFxuICAgIGB0eEZvcm1hdD0ke3R4Rm9ybWF0fWAsXG4gICAgYGFtb3VudFR5cGU9JHthbW91bnRUeXBlfWAsXG4gICAgZGVjb2RlV2l0aCA/IGBkZWNvZGVXaXRoPSR7ZGVjb2RlV2l0aH1gIDogJycsXG4gIF07XG4gIGRlc2NyaWJlKGAke3RpdGxlLmpvaW4oJyAnKX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmdVcmwgPSBjb21tb24uRW52aXJvbm1lbnRzW2RlZmF1bHRCaXRHby5nZXRFbnYoKV0udXJpO1xuXG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQgPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKTtcbiAgICBjb25zdCBpc1RyYW5zYWN0aW9uV2l0aFJlcGxheVByb3RlY3Rpb24gPSBpbnB1dFNjcmlwdHMuc29tZSgocykgPT4gcyA9PT0gJ3Ayc2hQMnBrJyk7XG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhQMnRyID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICdwMnRyJyk7XG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbldpdGhQMnRyTXVzaWcyID0gaW5wdXRTY3JpcHRzLnNvbWUoKHMpID0+IHMgPT09ICdwMnRyTXVzaWcyJyk7XG5cbiAgICBjb25zdCB2YWx1ZSA9IChhbW91bnRUeXBlID09PSAnYmlnaW50JyA/IEJpZ0ludCgnMTA5OTk5OTk4MDAwMDAwMDEnKSA6IDFlOCkgYXMgVE51bWJlcjtcbiAgICBjb25zdCB3YWxsZXQgPSBnZXRVdHhvV2FsbGV0KGNvaW4sIHsgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsIGNvaW46IGNvaW4uZ2V0Q2hhaW4oKSB9KTtcbiAgICBjb25zdCB3YWxsZXRLZXlzID0gZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcblxuICAgIGNvbnN0IGZ1bGxTaWduID0gIShpc1RyYW5zYWN0aW9uV2l0aFJlcGxheVByb3RlY3Rpb24gfHwgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQpO1xuXG4gICAgZnVuY3Rpb24gZ2V0VW5zcGVudHNGb3JQc2J0KCk6IFVuc3BlbnQ8YmlnaW50PltdIHtcbiAgICAgIHJldHVybiBpbnB1dFNjcmlwdHMubWFwKCh0LCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gdGVzdHV0aWwudG9VbnNwZW50KFxuICAgICAgICAgIHsgc2NyaXB0VHlwZTogdCwgdmFsdWU6IHQgPT09ICdwMnNoUDJwaycgPyBCaWdJbnQoMTAwMCkgOiBCaWdJbnQodmFsdWUpIH0sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgY29pbi5uZXR3b3JrLFxuICAgICAgICAgIHdhbGxldEtleXNcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvVHhuSW5wdXRTY3JpcHRUeXBlKHR5cGU6IHRlc3R1dGlsLklucHV0U2NyaXB0VHlwZSk6IElucHV0U2NyaXB0VHlwZSB7XG4gICAgICByZXR1cm4gdHlwZSA9PT0gJ3Ayc2hQMnBrJyA/ICdyZXBsYXlQcm90ZWN0aW9uJyA6IHR5cGUgPT09ICd0YXByb290S2V5UGF0aFNwZW5kJyA/ICdwMnRyTXVzaWcyJyA6IHR5cGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VW5zcGVudHMoKTogVW5zcGVudDxUTnVtYmVyPltdIHtcbiAgICAgIHJldHVybiBpbnB1dFNjcmlwdHMubWFwKCh0eXBlLCBpKSA9PlxuICAgICAgICBtb2NrVW5zcGVudDxUTnVtYmVyPihjb2luLm5ldHdvcmssIHdhbGxldEtleXMsIHRvVHhuSW5wdXRTY3JpcHRUeXBlKHR5cGUpLCBpLCB2YWx1ZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0T3V0cHV0QWRkcmVzcyhyb290V2FsbGV0S2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZ2VuZXJhdGVBZGRyZXNzKGNvaW4ubmFtZSwge1xuICAgICAgICBrZXljaGFpbnM6IHJvb3RXYWxsZXRLZXlzLnRyaXBsZS5tYXAoKGspID0+ICh7IHB1Yjogay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSkpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2lnblBhcmFtcyhcbiAgICAgIHByZWJ1aWxkSGV4OiBzdHJpbmcsXG4gICAgICBzaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgY29zaWduZXI6IEJJUDMySW50ZXJmYWNlLFxuICAgICAgZGVjb2RlV2l0aDogU2RrQmFja2VuZCB8IHVuZGVmaW5lZFxuICAgICk6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICAgICAgY29uc3QgdHhJbmZvID0ge1xuICAgICAgICB1bnNwZW50czogdHhGb3JtYXQgPT09ICdwc2J0JyA/IHVuZGVmaW5lZCA6IGdldFVuc3BlbnRzKCksXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICAgIHdhbGxldElkOiBpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCA/IHdhbGxldC5pZCgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHR4SGV4OiBwcmVidWlsZEhleCxcbiAgICAgICAgICB0eEluZm8sXG4gICAgICAgICAgZGVjb2RlV2l0aCxcbiAgICAgICAgfSxcbiAgICAgICAgcHJ2OiBzaWduZXIudG9CYXNlNTgoKSxcbiAgICAgICAgcHViczogd2FsbGV0S2V5cy50cmlwbGUubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSksXG4gICAgICAgIGNvc2lnbmVyUHViOiBjb3NpZ25lci5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgICB9IGFzIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKFxuICAgICAgcHJlYnVpbGQ6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+IHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgICAgIHNpZ25lcjogQklQMzJJbnRlcmZhY2UsXG4gICAgICBjb3NpZ25lcjogQklQMzJJbnRlcmZhY2VcbiAgICApOiBQcm9taXNlPEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+IHtcbiAgICAgIGxldCBzY29wZTogbm9jay5TY29wZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChwcmVidWlsZCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQgJiYgaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmQpIHtcbiAgICAgICAgY29uc3QgcHNidCA9IHByZWJ1aWxkLmNsb25lKCkuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChjb3NpZ25lcik7XG4gICAgICAgIHNjb3BlID0gbm9jayhiZ1VybClcbiAgICAgICAgICAucG9zdChgL2FwaS92Mi8ke3dhbGxldC5jb2luKCl9L3dhbGxldC8ke3dhbGxldC5pZCgpfS90eC9zaWducHNidGAsIChib2R5KSA9PiBib2R5LnBzYnQpXG4gICAgICAgICAgLnJlcGx5KDIwMCwgeyBwc2J0OiBwc2J0LnRvSGV4KCkgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGhhbGYtc2lnbiB3aXRoIHRoZSB1c2VyIGtleVxuICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHdhbGxldC5zaWduVHJhbnNhY3Rpb24oXG4gICAgICAgIGdldFNpZ25QYXJhbXMocHJlYnVpbGQudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JyksIHNpZ25lciwgY29zaWduZXIsIGRlY29kZVdpdGgpXG4gICAgICApKSBhcyBQcm9taXNlPEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+O1xuXG4gICAgICBpZiAoc2NvcGUpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNjb3BlLmlzRG9uZSgpLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oXG4gICAgICBoYWxmU2lnbmVkOiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICAgICAgc2lnbmVyOiBCSVAzMkludGVyZmFjZSxcbiAgICAgIGNvc2lnbmVyOiBCSVAzMkludGVyZmFjZVxuICAgICk6IFByb21pc2U8RnVsbHlTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgICAgcmV0dXJuIChhd2FpdCB3YWxsZXQuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgLi4uZ2V0U2lnblBhcmFtcyhoYWxmU2lnbmVkLnR4SGV4LCBzaWduZXIsIGNvc2lnbmVyLCBkZWNvZGVXaXRoKSxcbiAgICAgICAgaXNMYXN0U2lnbmF0dXJlOiB0cnVlLFxuICAgICAgfSkpIGFzIEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfVxuXG4gICAgdHlwZSBUcmFuc2FjdGlvblN0YWdlcyA9IHtcbiAgICAgIHByZWJ1aWxkOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQ7XG4gICAgICBoYWxmU2lnbmVkVXNlckJhY2t1cD86IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb247XG4gICAgICBoYWxmU2lnbmVkVXNlckJpdEdvOiBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uO1xuICAgICAgZnVsbFNpZ25lZFVzZXJCYWNrdXA/OiBGdWxseVNpZ25lZFRyYW5zYWN0aW9uO1xuICAgICAgZnVsbFNpZ25lZFVzZXJCaXRHbz86IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfTtcblxuICAgIHR5cGUgVHJhbnNhY3Rpb25PYmpTdGFnZXMgPSBSZWNvcmQ8a2V5b2YgVHJhbnNhY3Rpb25TdGFnZXMsIFRyYW5zYWN0aW9uT2JqPjtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVByZWJ1aWxkUHNidCgpIHtcbiAgICAgIGNvbnN0IGlucHV0cyA9IGlucHV0U2NyaXB0cy5tYXAoXG4gICAgICAgICh0KTogdGVzdHV0aWwuSW5wdXQgPT4gKHtcbiAgICAgICAgICBzY3JpcHRUeXBlOiB0LFxuICAgICAgICAgIHZhbHVlOiB0ID09PSAncDJzaFAycGsnID8gQmlnSW50KDEwMDApIDogQmlnSW50KHZhbHVlKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCB1bnNwZW50U3VtID0gaW5wdXRzLnJlZHVjZSgocHJldjogYmlnaW50LCBjdXJyKSA9PiBwcmV2ICsgY3Vyci52YWx1ZSwgQmlnSW50KDApKTtcbiAgICAgIGNvbnN0IG91dHB1dHM6IHRlc3R1dGlsLk91dHB1dFtdID0gW1xuICAgICAgICB7IGFkZHJlc3M6IGdldE91dHB1dEFkZHJlc3MoZ2V0V2FsbGV0S2V5cygndGVzdCcpKSwgdmFsdWU6IHVuc3BlbnRTdW0gLSBCaWdJbnQoMTAwMCkgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBwc2J0ID0gdGVzdHV0aWwuY29uc3RydWN0UHNidChpbnB1dHMsIG91dHB1dHMsIGNvaW4ubmV0d29yaywgd2FsbGV0S2V5cywgJ3Vuc2lnbmVkJywge1xuICAgICAgICBwMnNoUDJwa0tleTogZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMoY29pbi5uYW1lKVswXSxcbiAgICAgIH0pO1xuICAgICAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCB3YWxsZXRLZXlzKTtcbiAgICAgIHJldHVybiBwc2J0O1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uU3RhZ2VzKCk6IFByb21pc2U8VHJhbnNhY3Rpb25TdGFnZXM+IHtcbiAgICAgIGNvbnN0IHByZWJ1aWxkID1cbiAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgID8gY3JlYXRlUHJlYnVpbGRQc2J0KClcbiAgICAgICAgICA6IGNyZWF0ZVByZWJ1aWxkVHJhbnNhY3Rpb248VE51bWJlcj4oY29pbi5uZXR3b3JrLCBnZXRVbnNwZW50cygpLCBnZXRPdXRwdXRBZGRyZXNzKHdhbGxldEtleXMpKTtcblxuICAgICAgY29uc3QgaGFsZlNpZ25lZFVzZXJCaXRHbyA9IGF3YWl0IGNyZWF0ZUhhbGZTaWduZWRUcmFuc2FjdGlvbihwcmVidWlsZCwgd2FsbGV0S2V5cy51c2VyLCB3YWxsZXRLZXlzLmJpdGdvKTtcbiAgICAgIGNvbnN0IGZ1bGxTaWduZWRVc2VyQml0R28gPVxuICAgICAgICBmdWxsU2lnbiAmJiAhaXNUcmFuc2FjdGlvbldpdGhQMnRyTXVzaWcyXG4gICAgICAgICAgPyBhd2FpdCBjcmVhdGVGdWxsU2lnbmVkVHJhbnNhY3Rpb24oaGFsZlNpZ25lZFVzZXJCaXRHbywgd2FsbGV0S2V5cy5iaXRnbywgd2FsbGV0S2V5cy51c2VyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBoYWxmU2lnbmVkVXNlckJhY2t1cCA9XG4gICAgICAgICFpc1RyYW5zYWN0aW9uV2l0aEtleVBhdGhTcGVuZCAmJiAhKHR4Rm9ybWF0ID09PSAncHNidCcgJiYgaXNUcmFuc2FjdGlvbldpdGhQMnRyKVxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlSGFsZlNpZ25lZFRyYW5zYWN0aW9uKHByZWJ1aWxkLCB3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZnVsbFNpZ25lZFVzZXJCYWNrdXAgPVxuICAgICAgICBmdWxsU2lnbiAmJiBoYWxmU2lnbmVkVXNlckJhY2t1cFxuICAgICAgICAgID8gYXdhaXQgY3JlYXRlRnVsbFNpZ25lZFRyYW5zYWN0aW9uKGhhbGZTaWduZWRVc2VyQmFja3VwLCB3YWxsZXRLZXlzLmJhY2t1cCwgd2FsbGV0S2V5cy51c2VyKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmVidWlsZCxcbiAgICAgICAgaGFsZlNpZ25lZFVzZXJCYWNrdXAsXG4gICAgICAgIGhhbGZTaWduZWRVc2VyQml0R28sXG4gICAgICAgIGZ1bGxTaWduZWRVc2VyQmFja3VwLFxuICAgICAgICBmdWxsU2lnbmVkVXNlckJpdEdvLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNhY3Rpb25TdGFnZXM6IFRyYW5zYWN0aW9uU3RhZ2VzO1xuXG4gICAgYmVmb3JlKCdwcmVwYXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgdHJhbnNhY3Rpb25TdGFnZXMgPSBhd2FpdCBnZXRUcmFuc2FjdGlvblN0YWdlcygpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKG5vY2suY2xlYW5BbGwpO1xuXG4gICAgaXQoJ21hdGNoIGZpeHR1cmVzJywgYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1vY2hhLkNvbnRleHQpIHtcbiAgICAgIGlmICh0eEZvcm1hdCA9PT0gJ3BzYnQnKSB7XG4gICAgICAgIC8vIFRPRE8gKG1heWJlKSAtIG9uY2UgZnVsbCBQU0JUIHN1cHBvcnQgaXMgYWRkZWQgdG8gYWJzdHJhY3QtdXR4byBtb2R1bGUsIGN1c3RvbSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIFBTQlQgY2FuIGJlIGNyZWF0ZWQgYW5kIHRlc3RlZCBoZXJlLlxuICAgICAgICAvLyBzaWduYXR1cmVzIG9mIHRhcHJvb3RLZXlQYXRoU3BlbmRzIGFyZSByYW5kb20gc2luY2UgcmFuZG9tIG5hdHVyZSBvZiBNdVNpZzIgbm9uY2UsIHNvIHBzYnQgaGV4IGNvbXBhcmlzb24gYWxzbyB3b250IHdvcmsuXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0b1RyYW5zYWN0aW9uU3RhZ2VzT2JqKHN0YWdlczogVHJhbnNhY3Rpb25TdGFnZXMpOiBUcmFuc2FjdGlvbk9ialN0YWdlcyB7XG4gICAgICAgIHJldHVybiBfLm1hcFZhbHVlcyhzdGFnZXMsICh2KSA9PlxuICAgICAgICAgIHYgPT09IHVuZGVmaW5lZCB8fCB2IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidFxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogdiBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uXG4gICAgICAgICAgICA/IHRyYW5zYWN0aW9uVG9PYmo8VE51bWJlcj4odilcbiAgICAgICAgICAgIDogdHJhbnNhY3Rpb25IZXhUb09iaih2LnR4SGV4LCBjb2luLm5ldHdvcmssIGFtb3VudFR5cGUpXG4gICAgICAgICkgYXMgVHJhbnNhY3Rpb25PYmpTdGFnZXM7XG4gICAgICB9XG5cbiAgICAgIHNob3VsZEVxdWFsSlNPTihcbiAgICAgICAgdG9UcmFuc2FjdGlvblN0YWdlc09iaih0cmFuc2FjdGlvblN0YWdlcyksXG4gICAgICAgIGF3YWl0IGdldEZpeHR1cmUoXG4gICAgICAgICAgY29pbixcbiAgICAgICAgICBgdHJhbnNhY3Rpb25zLSR7aW5wdXRTY3JpcHRzLm1hcCgodCkgPT4gdG9UeG5JbnB1dFNjcmlwdFR5cGUodCkpLmpvaW4oJy0nKX1gLFxuICAgICAgICAgIHRvVHJhbnNhY3Rpb25TdGFnZXNPYmoodHJhbnNhY3Rpb25TdGFnZXMpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiB0ZXN0UHNidFZhbGlkU2lnbmF0dXJlcyh0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiwgc2lnbmVkQnk6IEJJUDMySW50ZXJmYWNlW10pIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4LnR4SGV4LCBjb2luLm5ldHdvcmspO1xuICAgICAgY29uc3QgdW5zcGVudHMgPSBnZXRVbnNwZW50c0ZvclBzYnQoKTtcbiAgICAgIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVuc3BlbnQgPSB1bnNwZW50c1tpbmRleF07XG4gICAgICAgIGlmICghdXR4b2xpYi5iaXRnby5pc1dhbGxldFVuc3BlbnQodW5zcGVudCkpIHtcbiAgICAgICAgICBhc3NlcnQub2sodXR4b2xpYi5iaXRnby5nZXRQc2J0SW5wdXRTY3JpcHRUeXBlKGlucHV0KSwgJ3Ayc2hQMnBrJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhbGxldFVuc3BlbnQgPSB1bnNwZW50IGFzIFdhbGxldFVuc3BlbnQ8YmlnaW50PjtcbiAgICAgICAgY29uc3QgcHVia2V5cyA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCh3YWxsZXRVbnNwZW50LmNoYWluLCB3YWxsZXRVbnNwZW50LmluZGV4KS5wdWJsaWNLZXlzO1xuICAgICAgICBwdWJrZXlzLmZvckVhY2goKHBrLCBwa0luZGV4KSA9PiB7XG4gICAgICAgICAgcHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0Q29tbW9uKGluZGV4LCBwaykuc2hvdWxkLmVxbChzaWduZWRCeS5pbmNsdWRlcyh3YWxsZXRLZXlzLnRyaXBsZVtwa0luZGV4XSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRlc3RWYWxpZFNpZ25hdHVyZXMoXG4gICAgICB0eDogSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbiB8IEZ1bGx5U2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICBzaWduZWRCeTogQklQMzJJbnRlcmZhY2VbXSxcbiAgICAgIHNpZ246ICdoYWxmc2lnbmVkJyB8ICdmdWxsc2lnbmVkJ1xuICAgICkge1xuICAgICAgaWYgKHR4Rm9ybWF0ID09PSAncHNidCcgJiYgc2lnbiA9PT0gJ2hhbGZzaWduZWQnKSB7XG4gICAgICAgIHRlc3RQc2J0VmFsaWRTaWduYXR1cmVzKHR4LCBzaWduZWRCeSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVuc3BlbnRzID1cbiAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgID8gZ2V0VW5zcGVudHNGb3JQc2J0KCkubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogYml0Z28udG9UTnVtYmVyKHUudmFsdWUsIGFtb3VudFR5cGUpIGFzIFROdW1iZXIgfSkpXG4gICAgICAgICAgOiBnZXRVbnNwZW50cygpO1xuICAgICAgY29uc3QgcHJldk91dHB1dHMgPSB1bnNwZW50cy5tYXAoXG4gICAgICAgICh1KTogdXR4b2xpYi5UeE91dHB1dDxUTnVtYmVyPiA9PiAoe1xuICAgICAgICAgIHNjcmlwdDogQnVmZmVyLmZyb20od2FzbUFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoQ29pbih1LmFkZHJlc3MsIGNvaW4ubmFtZSkpLFxuICAgICAgICAgIHZhbHVlOiB1LnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcjxUTnVtYmVyPihcbiAgICAgICAgQnVmZmVyLmZyb20odHgudHhIZXgsICdoZXgnKSxcbiAgICAgICAgY29pbi5uZXR3b3JrLFxuICAgICAgICB7IGFtb3VudFR5cGUgfVxuICAgICAgKTtcbiAgICAgIHRyYW5zYWN0aW9uLmlucy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGlucHV0U2NyaXB0c1tpbmRleF0gPT09ICdwMnNoUDJwaycpIHtcbiAgICAgICAgICBhc3NlcnQub2soY29pbi5pc0JpdEdvVGFpbnRlZFVuc3BlbnQodW5zcGVudHNbaW5kZXhdKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHVuc3BlbnRzW2luZGV4XSBhcyBXYWxsZXRVbnNwZW50PFROdW1iZXI+O1xuICAgICAgICBjb25zdCBwdWJrZXlzID0gd2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KHVuc3BlbnQuY2hhaW4sIHVuc3BlbnQuaW5kZXgpLnB1YmxpY0tleXM7XG5cbiAgICAgICAgcHVia2V5cy5mb3JFYWNoKChwaywgcGtJbmRleCkgPT4ge1xuICAgICAgICAgIHV0eG9saWIuYml0Z29cbiAgICAgICAgICAgIC52ZXJpZnlTaWduYXR1cmU8VE51bWJlcj4oXG4gICAgICAgICAgICAgIHRyYW5zYWN0aW9uLFxuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgcHJldk91dHB1dHNbaW5kZXhdLnZhbHVlLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHVibGljS2V5OiBwayxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcHJldk91dHB1dHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zaG91bGQuZXFsKHNpZ25lZEJ5LmluY2x1ZGVzKHdhbGxldEtleXMudHJpcGxlW3BrSW5kZXhdKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gdGVzdEV4cGxhaW5UeChcbiAgICAgIHN0YWdlTmFtZTogc3RyaW5nLFxuICAgICAgdHhIZXg6IHN0cmluZyxcbiAgICAgIHVuc3BlbnRzOiBVbnNwZW50PFROdW1iZXI+W10sXG4gICAgICBwdWJzOiBUcmlwbGU8c3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCBjb2luLmV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICB0eEluZm86IHtcbiAgICAgICAgICB1bnNwZW50cyxcbiAgICAgICAgfSxcbiAgICAgICAgcHVicyxcbiAgICAgICAgZGVjb2RlV2l0aCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFByb3BlcnRpZXMgPSBbJ2lkJywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0QW1vdW50J107XG5cbiAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICBleHBlY3RlZFByb3BlcnRpZXMucHVzaCgnZGlzcGxheU9yZGVyJywgJ2lucHV0U2lnbmF0dXJlcycsICdzaWduYXR1cmVzJyk7XG4gICAgICB9XG5cbiAgICAgIGV4cGxhbmF0aW9uLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoLi4uZXhwZWN0ZWRQcm9wZXJ0aWVzKTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWRTaWduYXR1cmVDb3VudCA9XG4gICAgICAgIHN0YWdlTmFtZSA9PT0gJ3ByZWJ1aWxkJyB8fCBwdWJzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdoYWxmU2lnbmVkJylcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IHN0YWdlTmFtZS5zdGFydHNXaXRoKCdmdWxsU2lnbmVkJylcbiAgICAgICAgICA/IDJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCdpbnB1dFNpZ25hdHVyZXMnIGluIGV4cGxhbmF0aW9uKSB7XG4gICAgICAgIGV4cGxhbmF0aW9uLmlucHV0U2lnbmF0dXJlcy5zaG91bGQuZXFsKFxuICAgICAgICAgIC8vIEZJWE1FKEJHLTM1MTU0KTogaW1wbGVtZW50IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHJlcGxheSBwcm90ZWN0aW9uIGlucHV0c1xuICAgICAgICAgIGlucHV0U2NyaXB0cy5tYXAoKHR5cGUpID0+ICh0eXBlID09PSAncDJzaFAycGsnID8gMCA6IGV4cGVjdGVkU2lnbmF0dXJlQ291bnQpKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCdzaWduYXR1cmVzJyBpbiBleHBsYW5hdGlvbikge1xuICAgICAgICBleHBsYW5hdGlvbi5zaWduYXR1cmVzLnNob3VsZC5lcWwoZXhwZWN0ZWRTaWduYXR1cmVDb3VudCk7XG4gICAgICAgIGV4cGxhbmF0aW9uLmNoYW5nZUFtb3VudC5zaG91bGQuZXFsKCcwJyk7IC8vIG5vIGNoYW5nZSBhZGRyZXNzZXMgZ2l2ZW5cbiAgICAgIH1cbiAgICAgIGxldCBleHBlY3RlZE91dHB1dEFtb3VudCA9XG4gICAgICAgIEJpZ0ludCgodHhGb3JtYXQgPT09ICdwc2J0JyA/IGdldFVuc3BlbnRzRm9yUHNidCgpIDogZ2V0VW5zcGVudHMoKSkubGVuZ3RoKSAqIEJpZ0ludCh2YWx1ZSk7XG4gICAgICBpbnB1dFNjcmlwdHMuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3Ayc2hQMnBrJykge1xuICAgICAgICAgIC8vIHJlcGxheVByb3RlY3Rpb24gdW5zcGVudHMgaGF2ZSB2YWx1ZSAxMDAwXG4gICAgICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICBleHBlY3RlZE91dHB1dEFtb3VudCArPSBCaWdJbnQoMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZXhwZWN0ZWRPdXRwdXRBbW91bnQgLT0gQmlnSW50KDEwMDApOyAvLyBmZWUgb2YgMTAwMFxuICAgICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50LnNob3VsZC5lcWwoZXhwZWN0ZWRPdXRwdXRBbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaXQoJ2hhdmUgdmFsaWQgc2lnbmF0dXJlIGZvciBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5oYWxmU2lnbmVkVXNlckJhY2t1cCkge1xuICAgICAgICB0ZXN0VmFsaWRTaWduYXR1cmVzKHRyYW5zYWN0aW9uU3RhZ2VzLmhhbGZTaWduZWRVc2VyQmFja3VwLCBbd2FsbGV0S2V5cy51c2VyXSwgJ2hhbGZzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuaGFsZlNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlcl0sICdoYWxmc2lnbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSB2YWxpZCBzaWduYXR1cmVzIGZvciBmdWxsLXNpZ25lZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghZnVsbFNpZ24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhZ2VzLmZ1bGxTaWduZWRVc2VyQmFja3VwKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCYWNrdXAsIFt3YWxsZXRLZXlzLnVzZXIsIHdhbGxldEtleXMuYmFja3VwXSwgJ2Z1bGxzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvblN0YWdlcy5mdWxsU2lnbmVkVXNlckJpdEdvKSB7XG4gICAgICAgIHRlc3RWYWxpZFNpZ25hdHVyZXModHJhbnNhY3Rpb25TdGFnZXMuZnVsbFNpZ25lZFVzZXJCaXRHbywgW3dhbGxldEtleXMudXNlciwgd2FsbGV0S2V5cy5iaXRnb10sICdmdWxsc2lnbmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnaGF2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yIGV4cGxhaW5UcmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgc3RhZ2VUeF0gb2YgT2JqZWN0LmVudHJpZXModHJhbnNhY3Rpb25TdGFnZXMpKSB7XG4gICAgICAgIGlmICghc3RhZ2VUeCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAgIHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHx8IHN0YWdlVHggaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvblxuICAgICAgICAgICAgPyBzdGFnZVR4LnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICA6IHN0YWdlVHgudHhIZXg7XG5cbiAgICAgICAgY29uc3QgcHVicyA9IHdhbGxldEtleXMudHJpcGxlLm1hcCgoaykgPT4gay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkpIGFzIFRyaXBsZTxzdHJpbmc+O1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9XG4gICAgICAgICAgdHhGb3JtYXQgPT09ICdwc2J0J1xuICAgICAgICAgICAgPyBnZXRVbnNwZW50c0ZvclBzYnQoKS5tYXAoKHUpID0+ICh7IC4uLnUsIHZhbHVlOiBiaXRnby50b1ROdW1iZXIodS52YWx1ZSwgYW1vdW50VHlwZSkgYXMgVE51bWJlciB9KSlcbiAgICAgICAgICAgIDogZ2V0VW5zcGVudHMoKTtcbiAgICAgICAgYXdhaXQgdGVzdEV4cGxhaW5UeChzdGFnZU5hbWUsIHR4SGV4LCB1bnNwZW50cywgcHVicyk7XG4gICAgICAgIGlmIChkZWNvZGVXaXRoICE9PSAnd2FzbS11dHhvJykge1xuICAgICAgICAgIGF3YWl0IHRlc3RFeHBsYWluVHgoc3RhZ2VOYW1lLCB0eEhleCwgdW5zcGVudHMsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RGb3JDb2luKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pIHtcbiAgKFsnbGVnYWN5JywgJ3BzYnQnXSBhcyBjb25zdCkuZm9yRWFjaCgodHhGb3JtYXQpID0+IHtcbiAgICBydW4oY29pbiwgZ2V0U2NyaXB0VHlwZXMoY29pbiwgdHhGb3JtYXQpLCB0eEZvcm1hdCwgeyBkZWNvZGVXaXRoOiAnd2FzbS11dHhvJyB9KTtcbiAgfSk7XG59XG5cbmRlc2NyaWJlKCdUcmFuc2FjdGlvbiBTdWl0ZScsIGZ1bmN0aW9uICgpIHtcbiAgZ2V0TWluVXR4b0NvaW5zKCkuZm9yRWFjaCgoY29pbikgPT4ge1xuICAgIGRlc2NyaWJlKGAke2NvaW4uZ2V0Q2hhaW4oKX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBydW5UZXN0Rm9yQ29pbihjb2luKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import * as utxolib from '@bitgo/utxo-lib';
2
+ import { fixedScriptWallet, type CoinName } from '@bitgo/wasm-utxo';
3
+ type UtxolibRootWalletKeys = utxolib.bitgo.RootWalletKeys;
4
+ type WasmRootWalletKeys = fixedScriptWallet.RootWalletKeys;
5
+ type RootWalletKeys = UtxolibRootWalletKeys | WasmRootWalletKeys;
6
+ /**
7
+ * Generate a wallet address from RootWalletKeys.
8
+ * Supports both utxolib and wasm-utxo RootWalletKeys.
9
+ * Utxolib keys are converted to wasm-utxo keys for address generation.
10
+ */
11
+ export declare function getWalletAddress(coinName: CoinName, walletKeys: RootWalletKeys, chain?: 0 | 30 | 1 | 10 | 11 | 20 | 21 | 31 | 40 | 41, index?: number): string;
12
+ export {};
13
+ //# sourceMappingURL=address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../../../test/unit/util/address.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIpE,KAAK,qBAAqB,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;AAC1D,KAAK,kBAAkB,GAAG,iBAAiB,CAAC,cAAc,CAAC;AAC3D,KAAK,cAAc,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;AAIjE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,cAAc,EAC1B,KAAK,gDAAe,EACpB,KAAK,SAAI,GACR,MAAM,CAER"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getWalletAddress = getWalletAddress;
4
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
5
+ const { ChainCode } = wasm_utxo_1.fixedScriptWallet;
6
+ const defaultChain = ChainCode.value('p2sh', 'external');
7
+ /**
8
+ * Generate a wallet address from RootWalletKeys.
9
+ * Supports both utxolib and wasm-utxo RootWalletKeys.
10
+ * Utxolib keys are converted to wasm-utxo keys for address generation.
11
+ */
12
+ function getWalletAddress(coinName, walletKeys, chain = defaultChain, index = 0) {
13
+ return wasm_utxo_1.fixedScriptWallet.address(walletKeys, chain, index, coinName);
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsL2FkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQkEsNENBT0M7QUF0QkQsZ0RBQW9FO0FBRXBFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyw2QkFBaUIsQ0FBQztBQU14QyxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUV6RDs7OztHQUlHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLFFBQWtCLEVBQ2xCLFVBQTBCLEVBQzFCLEtBQUssR0FBRyxZQUFZLEVBQ3BCLEtBQUssR0FBRyxDQUFDO0lBRVQsT0FBTyw2QkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IGZpeGVkU2NyaXB0V2FsbGV0LCB0eXBlIENvaW5OYW1lIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmNvbnN0IHsgQ2hhaW5Db2RlIH0gPSBmaXhlZFNjcmlwdFdhbGxldDtcblxudHlwZSBVdHhvbGliUm9vdFdhbGxldEtleXMgPSB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzO1xudHlwZSBXYXNtUm9vdFdhbGxldEtleXMgPSBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cztcbnR5cGUgUm9vdFdhbGxldEtleXMgPSBVdHhvbGliUm9vdFdhbGxldEtleXMgfCBXYXNtUm9vdFdhbGxldEtleXM7XG5cbmNvbnN0IGRlZmF1bHRDaGFpbiA9IENoYWluQ29kZS52YWx1ZSgncDJzaCcsICdleHRlcm5hbCcpO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgd2FsbGV0IGFkZHJlc3MgZnJvbSBSb290V2FsbGV0S2V5cy5cbiAqIFN1cHBvcnRzIGJvdGggdXR4b2xpYiBhbmQgd2FzbS11dHhvIFJvb3RXYWxsZXRLZXlzLlxuICogVXR4b2xpYiBrZXlzIGFyZSBjb252ZXJ0ZWQgdG8gd2FzbS11dHhvIGtleXMgZm9yIGFkZHJlc3MgZ2VuZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhbGxldEFkZHJlc3MoXG4gIGNvaW5OYW1lOiBDb2luTmFtZSxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIGNoYWluID0gZGVmYXVsdENoYWluLFxuICBpbmRleCA9IDBcbik6IHN0cmluZyB7XG4gIHJldHVybiBmaXhlZFNjcmlwdFdhbGxldC5hZGRyZXNzKHdhbGxldEtleXMsIGNoYWluLCBpbmRleCwgY29pbk5hbWUpO1xufVxuIl19
@@ -4,4 +4,7 @@ export * from './keychains';
4
4
  export * from './wallet';
5
5
  export * from './unspents';
6
6
  export * from './transaction';
7
+ export * from './psbt';
8
+ export * from './address';
9
+ export * from './nockBitGo';
7
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../test/unit/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../test/unit/util/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
@@ -20,4 +20,7 @@ __exportStar(require("./keychains"), exports);
20
20
  __exportStar(require("./wallet"), exports);
21
21
  __exportStar(require("./unspents"), exports);
22
22
  __exportStar(require("./transaction"), exports);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvdXRpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQTRCO0FBQzVCLDZDQUEyQjtBQUMzQiw4Q0FBNEI7QUFDNUIsMkNBQXlCO0FBQ3pCLDZDQUEyQjtBQUMzQixnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3V0eG9Db2lucyc7XG5leHBvcnQgKiBmcm9tICcuL2ZpeHR1cmVzJztcbmV4cG9ydCAqIGZyb20gJy4va2V5Y2hhaW5zJztcbmV4cG9ydCAqIGZyb20gJy4vd2FsbGV0JztcbmV4cG9ydCAqIGZyb20gJy4vdW5zcGVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc2FjdGlvbic7XG4iXX0=
23
+ __exportStar(require("./psbt"), exports);
24
+ __exportStar(require("./address"), exports);
25
+ __exportStar(require("./nockBitGo"), exports);
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvdXRpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQTRCO0FBQzVCLDZDQUEyQjtBQUMzQiw4Q0FBNEI7QUFDNUIsMkNBQXlCO0FBQ3pCLDZDQUEyQjtBQUMzQixnREFBOEI7QUFDOUIseUNBQXVCO0FBQ3ZCLDRDQUEwQjtBQUMxQiw4Q0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3V0eG9Db2lucyc7XG5leHBvcnQgKiBmcm9tICcuL2ZpeHR1cmVzJztcbmV4cG9ydCAqIGZyb20gJy4va2V5Y2hhaW5zJztcbmV4cG9ydCAqIGZyb20gJy4vd2FsbGV0JztcbmV4cG9ydCAqIGZyb20gJy4vdW5zcGVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc2FjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3BzYnQnO1xuZXhwb3J0ICogZnJvbSAnLi9hZGRyZXNzJztcbmV4cG9ydCAqIGZyb20gJy4vbm9ja0JpdEdvJztcbiJdfQ==
@@ -1,5 +1,6 @@
1
1
  import { Triple } from '@bitgo/sdk-core';
2
2
  import { BIP32Interface, bitgo } from '@bitgo/utxo-lib';
3
+ import { BIP32 as WasmBIP32, fixedScriptWallet } from '@bitgo/wasm-utxo';
3
4
  type RootWalletKeys = bitgo.RootWalletKeys;
4
5
  export type KeychainBase58 = {
5
6
  pub: string;
@@ -22,5 +23,33 @@ export declare function getDefaultWalletKeys(): RootWalletKeys;
22
23
  export declare function getDefaultWalletUnspentSigner(): bitgo.WalletUnspentSigner<RootWalletKeys>;
23
24
  export declare function encryptKeychain(password: string, keychain: KeychainBase58): string;
24
25
  export declare function getWalletKeys(seed: string): RootWalletKeys;
26
+ /**
27
+ * Create test wallet keys from a seed string.
28
+ * Uses the same seed generation as getWalletKeys (getSeed('seed/i'))
29
+ * to ensure compatibility with existing test fixtures.
30
+ */
31
+ export declare function createTestWalletKeys(seed: string): {
32
+ xpubs: Triple<string>;
33
+ xprivs: Triple<string>;
34
+ };
35
+ /**
36
+ * Create wasm-utxo RootWalletKeys from a seed string.
37
+ * Optionally specify custom derivation prefixes.
38
+ */
39
+ export declare function createWasmWalletKeys(seed: string, derivationPrefixes?: Triple<string>): {
40
+ walletKeys: fixedScriptWallet.RootWalletKeys;
41
+ xpubs: Triple<WasmBIP32>;
42
+ xprivs: Triple<WasmBIP32>;
43
+ };
44
+ /**
45
+ * Get wasm-utxo RootWalletKeys from the default hardcoded keychains.
46
+ * Use this when you need wallet keys that match existing test fixtures.
47
+ * Optionally specify custom derivation prefixes.
48
+ */
49
+ export declare function getDefaultWasmWalletKeys(derivationPrefixes?: Triple<string>): {
50
+ walletKeys: fixedScriptWallet.RootWalletKeys;
51
+ xpubs: Triple<WasmBIP32>;
52
+ xprivs: Triple<WasmBIP32>;
53
+ };
25
54
  export {};
26
55
  //# sourceMappingURL=keychains.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"keychains.d.ts","sourceRoot":"","sources":["../../../../../test/unit/util/keychains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,OAAO,EAAS,cAAc,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE/D,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC;CACnB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,cAAc,GAAG,cAAc,CAQlE;AAED,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,CAWpG;AAED,eAAO,MAAM,QAAQ,UAA8B,CAAC;AAEpD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,CAalD,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAMjB,CAAC;AAE7B,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,GAC3B,KAAK,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAE3C;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAErD;AAED,wBAAgB,6BAA6B,IAAI,KAAK,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAEzF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,CAElF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAI1D"}
1
+ {"version":3,"file":"keychains.d.ts","sourceRoot":"","sources":["../../../../../test/unit/util/keychains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,OAAO,EAAS,cAAc,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEzE,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC;CACnB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,cAAc,GAAG,cAAc,CAQlE;AAED,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,CAWpG;AAED,eAAO,MAAM,QAAQ,UAA8B,CAAC;AAEpD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,cAAc,CAalD,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAMjB,CAAC;AAE7B,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,GAC3B,KAAK,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAE3C;AAED,wBAAgB,oBAAoB,IAAI,cAAc,CAErD;AAED,wBAAgB,6BAA6B,IAAI,KAAK,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAEzF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,CAElF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAI1D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;CACxB,CAQA;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,kBAAkB,GAAE,MAAM,CAAC,MAAM,CAA+B,GAC/D;IACD,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;CAC3B,CAYA;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,kBAAkB,GAAE,MAAM,CAAC,MAAM,CAA+B,GAAG;IAC1G,UAAU,EAAE,iBAAiB,CAAC,cAAc,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;CAC3B,CAWA"}