@bitgo-beta/abstract-utxo 1.6.1-alpha.419 → 1.6.1-alpha.420

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 (761) hide show
  1. package/dist/{src → cjs/src}/abstractUtxoCoin.d.ts +12 -23
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  3. package/dist/cjs/src/abstractUtxoCoin.js +639 -0
  4. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  5. package/dist/cjs/src/address/fixedScript.js +150 -0
  6. package/dist/cjs/src/address/index.d.ts.map +1 -0
  7. package/dist/{src → cjs/src}/address/index.js +1 -1
  8. package/dist/cjs/src/config.d.ts.map +1 -0
  9. package/dist/cjs/src/config.js +14 -0
  10. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  11. package/dist/cjs/src/descriptor/NamedDescriptor.js +79 -0
  12. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  13. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +66 -0
  14. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  15. package/dist/cjs/src/descriptor/builder/builder.js +37 -0
  16. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  17. package/dist/{src → cjs/src}/descriptor/builder/index.js +1 -1
  18. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  19. package/dist/cjs/src/descriptor/builder/parse.js +116 -0
  20. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  21. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  22. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  23. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  24. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  25. package/dist/{src → cjs/src}/descriptor/createWallet/index.js +1 -1
  26. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  27. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  28. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  29. package/dist/{src → cjs/src}/descriptor/index.js +1 -1
  30. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  31. package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
  32. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  33. package/dist/cjs/src/impl/bch/bch.js +70 -0
  34. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  35. package/dist/{src → cjs/src}/impl/bch/index.js +1 -1
  36. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  37. package/dist/{src → cjs/src}/impl/bch/tbch.js +1 -1
  38. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  39. package/dist/{src → cjs/src}/impl/bcha/bcha.js +1 -1
  40. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  41. package/dist/{src → cjs/src}/impl/bcha/index.js +1 -1
  42. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  43. package/dist/{src → cjs/src}/impl/bcha/tbcha.js +1 -1
  44. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  45. package/dist/{src → cjs/src}/impl/bsv/bsv.js +1 -1
  46. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  47. package/dist/{src → cjs/src}/impl/bsv/index.js +1 -1
  48. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  49. package/dist/{src → cjs/src}/impl/bsv/tbsv.js +1 -1
  50. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  51. package/dist/{src → cjs/src}/impl/btc/btc.js +1 -1
  52. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  53. package/dist/{src → cjs/src}/impl/btc/index.js +1 -1
  54. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  55. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +183 -0
  56. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  57. package/dist/{src → cjs/src}/impl/btc/tbtc.js +1 -1
  58. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  59. package/dist/{src → cjs/src}/impl/btc/tbtc4.js +1 -1
  60. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  61. package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.js +1 -1
  62. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  63. package/dist/{src → cjs/src}/impl/btc/tbtcsig.js +1 -1
  64. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  65. package/dist/{src/impl/dash/dash.js → cjs/src/impl/btg/btg.js} +6 -6
  66. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  67. package/dist/{src → cjs/src}/impl/btg/index.js +1 -1
  68. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  69. package/dist/cjs/src/impl/dash/dash.js +48 -0
  70. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  71. package/dist/{src → cjs/src}/impl/dash/index.js +1 -1
  72. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  73. package/dist/{src → cjs/src}/impl/dash/tdash.js +1 -1
  74. package/dist/{src → cjs/src}/impl/doge/doge.d.ts +3 -2
  75. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  76. package/dist/cjs/src/impl/doge/doge.js +79 -0
  77. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  78. package/dist/{src → cjs/src}/impl/doge/index.js +1 -1
  79. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  80. package/dist/{src → cjs/src}/impl/doge/tdoge.js +1 -1
  81. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  82. package/dist/{src → cjs/src}/impl/index.js +1 -1
  83. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  84. package/dist/{src → cjs/src}/impl/ltc/index.js +1 -1
  85. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  86. package/dist/{src → cjs/src}/impl/ltc/ltc.js +1 -1
  87. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  88. package/dist/{src → cjs/src}/impl/ltc/tltc.js +1 -1
  89. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  90. package/dist/{src → cjs/src}/impl/zec/index.js +1 -1
  91. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  92. package/dist/{src → cjs/src}/impl/zec/tzec.js +1 -1
  93. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  94. package/dist/{src → cjs/src}/impl/zec/zec.js +1 -1
  95. package/dist/cjs/src/index.d.ts.map +1 -0
  96. package/dist/{src → cjs/src}/index.js +1 -1
  97. package/dist/cjs/src/keychains.d.ts.map +1 -0
  98. package/dist/cjs/src/keychains.js +104 -0
  99. package/dist/cjs/src/names.d.ts.map +1 -0
  100. package/dist/cjs/src/names.js +214 -0
  101. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  102. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +26 -0
  103. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  104. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  105. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  106. package/dist/cjs/src/offlineVault/TransactionExplanation.js +16 -0
  107. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  108. package/dist/{src → cjs/src}/offlineVault/descriptor/index.js +1 -1
  109. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  110. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  111. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  112. package/dist/{src → cjs/src}/offlineVault/index.js +1 -1
  113. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  114. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  115. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  116. package/dist/cjs/src/recovery/backupKeyRecovery.js +370 -0
  117. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  118. package/dist/cjs/src/recovery/baseApi.js +73 -0
  119. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  120. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  121. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  122. package/dist/cjs/src/recovery/crossChainRecovery.js +364 -0
  123. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  124. package/dist/{src → cjs/src}/recovery/index.js +1 -1
  125. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  126. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  127. package/dist/{src → cjs/src}/replayProtection.d.ts +1 -0
  128. package/dist/cjs/src/replayProtection.d.ts.map +1 -0
  129. package/dist/cjs/src/replayProtection.js +58 -0
  130. package/dist/cjs/src/sign.d.ts.map +1 -0
  131. package/dist/cjs/src/sign.js +205 -0
  132. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  133. package/dist/cjs/src/transaction/bip322.js +125 -0
  134. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  135. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  136. package/dist/{src → cjs/src}/transaction/descriptor/explainPsbt.d.ts +2 -2
  137. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  138. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +80 -0
  139. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  140. package/dist/{src → cjs/src}/transaction/descriptor/index.js +1 -1
  141. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  142. package/dist/cjs/src/transaction/descriptor/parse.js +116 -0
  143. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  144. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  145. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  146. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  147. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  148. package/dist/cjs/src/transaction/descriptor/signPsbt.js +43 -0
  149. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  150. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +108 -0
  151. package/dist/{src → cjs/src}/transaction/explainTransaction.d.ts +4 -3
  152. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  153. package/dist/cjs/src/transaction/explainTransaction.js +88 -0
  154. package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
  155. package/dist/cjs/src/transaction/fetchInputs.js +109 -0
  156. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
  157. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  158. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +43 -0
  159. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +63 -0
  160. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  161. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +321 -0
  162. package/dist/{src → cjs/src}/transaction/fixedScript/index.d.ts +1 -0
  163. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  164. package/dist/{src → cjs/src}/transaction/fixedScript/index.js +4 -2
  165. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  166. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +213 -0
  167. package/dist/{src → cjs/src}/transaction/fixedScript/parseTransaction.d.ts +1 -1
  168. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  169. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +203 -0
  170. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  171. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +101 -0
  172. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  173. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +198 -0
  174. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  175. package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.js +1 -1
  176. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  177. package/dist/{src → cjs/src}/transaction/index.js +1 -1
  178. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  179. package/dist/cjs/src/transaction/outputDifference.js +47 -0
  180. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  181. package/dist/{src → cjs/src}/transaction/parseTransaction.js +1 -1
  182. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  183. package/dist/cjs/src/transaction/recipient.js +88 -0
  184. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  185. package/dist/cjs/src/transaction/signTransaction.js +102 -0
  186. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  187. package/dist/{src → cjs/src}/transaction/verifyTransaction.js +1 -1
  188. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  189. package/dist/cjs/src/verifyKey.js +164 -0
  190. package/dist/cjs/src/wallet.d.ts.map +1 -0
  191. package/dist/cjs/src/wallet.js +8 -0
  192. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  193. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  194. package/dist/cjs/test/integration/impl/bch/bch.js +74 -0
  195. package/dist/cjs/test/unit/address.d.ts +2 -0
  196. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/address.js +182 -0
  198. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  199. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  200. package/dist/cjs/test/unit/bip322.js +45 -0
  201. package/dist/cjs/test/unit/coins.d.ts +2 -0
  202. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/coins.js +97 -0
  204. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  205. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  206. package/dist/cjs/test/unit/customChangeWallet.js +154 -0
  207. package/dist/cjs/test/unit/customSigner.d.ts +3 -0
  208. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  209. package/dist/cjs/test/unit/customSigner.js +108 -0
  210. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  211. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  212. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +18 -0
  213. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  214. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  215. package/dist/cjs/test/unit/descriptor/builder.js +72 -0
  216. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  217. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  218. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +20 -0
  219. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  220. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  221. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +28 -0
  222. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  223. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  224. package/dist/cjs/test/unit/descriptorAddress.js +102 -0
  225. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  226. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  227. package/dist/cjs/test/unit/explainTransaction.js +74 -0
  228. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +15 -0
  229. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +1 -0
  230. package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +51 -0
  231. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  232. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  233. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  234. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  235. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  236. package/dist/cjs/test/unit/impl/bch/unit/bch.js +138 -0
  237. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  238. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  239. package/dist/cjs/test/unit/impl/bcha/unit/index.js +47 -0
  240. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  241. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  242. package/dist/cjs/test/unit/impl/bsv/unit/index.js +32 -0
  243. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +2 -0
  244. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +1 -0
  245. package/dist/cjs/test/unit/impl/btc/unit/btc.js +220 -0
  246. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +4 -0
  247. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +1 -0
  248. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +10 -0
  249. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +2 -0
  250. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +1 -0
  251. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +18 -0
  252. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  253. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  254. package/dist/cjs/test/unit/impl/btg/unit/index.js +29 -0
  255. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  256. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  257. package/dist/cjs/test/unit/impl/dash/unit/index.js +32 -0
  258. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  259. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  260. package/dist/cjs/test/unit/impl/doge/unit/index.js +32 -0
  261. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +2 -0
  262. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +1 -0
  263. package/dist/cjs/test/unit/impl/ltc/unit/index.js +39 -0
  264. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  265. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  266. package/dist/cjs/test/unit/impl/zec/unit/index.js +29 -0
  267. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  268. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  269. package/dist/cjs/test/unit/keySignatures.js +54 -0
  270. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  271. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  272. package/dist/cjs/test/unit/keychains.js +49 -0
  273. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  274. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  275. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  276. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  277. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  278. package/dist/cjs/test/unit/parseTransaction.js +125 -0
  279. package/dist/cjs/test/unit/prebuildAndSign.d.ts +6 -0
  280. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  281. package/dist/cjs/test/unit/prebuildAndSign.js +270 -0
  282. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  283. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  284. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +285 -0
  285. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  286. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  287. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +283 -0
  288. package/dist/cjs/test/unit/recovery/mock.d.ts +30 -0
  289. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  290. package/dist/cjs/test/unit/recovery/mock.js +138 -0
  291. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  292. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  293. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +30 -0
  294. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  295. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  296. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +17 -0
  297. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts +2 -0
  298. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts.map +1 -0
  299. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.js +76 -0
  300. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  301. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  302. package/dist/cjs/test/unit/transaction/descriptor/parse.js +135 -0
  303. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  304. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  305. package/dist/cjs/test/unit/transaction/descriptor/sign.js +32 -0
  306. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  307. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  308. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +48 -0
  309. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  310. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  311. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +108 -0
  312. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  313. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  314. package/dist/cjs/test/unit/transaction.js +501 -0
  315. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  316. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  317. package/dist/cjs/test/unit/txFormat.js +162 -0
  318. package/dist/cjs/test/unit/util/fixtures.d.ts +14 -0
  319. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  320. package/dist/cjs/test/unit/util/fixtures.js +102 -0
  321. package/dist/cjs/test/unit/util/index.d.ts +7 -0
  322. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  323. package/dist/cjs/test/unit/util/index.js +23 -0
  324. package/dist/cjs/test/unit/util/keychains.d.ts +26 -0
  325. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  326. package/dist/cjs/test/unit/util/keychains.js +72 -0
  327. package/dist/cjs/test/unit/util/nockBitGo.d.ts +3 -0
  328. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  329. package/dist/cjs/test/unit/util/nockBitGo.js +11 -0
  330. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  331. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  332. package/dist/cjs/test/unit/util/nockIndexerAPI.js +56 -0
  333. package/dist/cjs/test/unit/util/transaction.d.ts +24 -0
  334. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  335. package/dist/cjs/test/unit/util/transaction.js +107 -0
  336. package/dist/cjs/test/unit/util/unspents.d.ts +13 -0
  337. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  338. package/dist/cjs/test/unit/util/unspents.js +106 -0
  339. package/dist/cjs/test/unit/util/utxoCoins.d.ts +8 -0
  340. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  341. package/dist/cjs/test/unit/util/utxoCoins.js +95 -0
  342. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  343. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  344. package/dist/cjs/test/unit/util/wallet.js +9 -0
  345. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  346. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  347. package/dist/cjs/test/unit/verifyTransaction.js +327 -0
  348. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  349. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  350. package/dist/cjs/test/unit/wallet.js +248 -0
  351. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  352. package/dist/esm/abstractUtxoCoin.d.ts +464 -0
  353. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  354. package/dist/esm/abstractUtxoCoin.js +598 -0
  355. package/dist/esm/address/fixedScript.d.ts +51 -0
  356. package/dist/esm/address/fixedScript.js +109 -0
  357. package/dist/esm/address/index.d.ts +2 -0
  358. package/dist/esm/address/index.js +2 -0
  359. package/dist/esm/config.d.ts +9 -0
  360. package/dist/esm/config.js +11 -0
  361. package/dist/esm/descriptor/NamedDescriptor.d.ts +20 -0
  362. package/dist/esm/descriptor/NamedDescriptor.js +39 -0
  363. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  364. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  365. package/dist/esm/descriptor/builder/builder.d.ts +13 -0
  366. package/dist/esm/descriptor/builder/builder.js +34 -0
  367. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  368. package/dist/esm/descriptor/builder/index.js +3 -0
  369. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  370. package/dist/esm/descriptor/builder/parse.js +112 -0
  371. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  372. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  373. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  374. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  375. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  376. package/dist/esm/descriptor/createWallet/index.js +3 -0
  377. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  378. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  379. package/dist/esm/descriptor/index.d.ts +8 -0
  380. package/dist/esm/descriptor/index.js +7 -0
  381. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  382. package/dist/esm/descriptor/validatePolicy.js +80 -0
  383. package/dist/esm/impl/bch/bch.d.ts +20 -0
  384. package/dist/esm/impl/bch/bch.js +33 -0
  385. package/dist/esm/impl/bch/index.d.ts +3 -0
  386. package/dist/esm/impl/bch/index.js +3 -0
  387. package/dist/esm/impl/bch/tbch.d.ts +10 -0
  388. package/dist/esm/impl/bch/tbch.js +11 -0
  389. package/dist/esm/impl/bcha/bcha.d.ts +9 -0
  390. package/dist/esm/impl/bcha/bcha.js +21 -0
  391. package/dist/esm/impl/bcha/index.d.ts +3 -0
  392. package/dist/esm/impl/bcha/index.js +3 -0
  393. package/dist/esm/impl/bcha/tbcha.d.ts +10 -0
  394. package/dist/esm/impl/bcha/tbcha.js +11 -0
  395. package/dist/esm/impl/bsv/bsv.d.ts +8 -0
  396. package/dist/esm/impl/bsv/bsv.js +11 -0
  397. package/dist/esm/impl/bsv/index.d.ts +3 -0
  398. package/dist/esm/impl/bsv/index.js +3 -0
  399. package/dist/esm/impl/bsv/tbsv.d.ts +10 -0
  400. package/dist/esm/impl/bsv/tbsv.js +11 -0
  401. package/dist/esm/impl/btc/btc.d.ts +13 -0
  402. package/dist/esm/impl/btc/btc.js +18 -0
  403. package/dist/esm/impl/btc/index.d.ts +7 -0
  404. package/dist/esm/impl/btc/index.js +7 -0
  405. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +51 -0
  406. package/dist/esm/impl/btc/inscriptionBuilder.js +143 -0
  407. package/dist/esm/impl/btc/tbtc.d.ts +10 -0
  408. package/dist/esm/impl/btc/tbtc.js +11 -0
  409. package/dist/esm/impl/btc/tbtc4.d.ts +10 -0
  410. package/dist/esm/impl/btc/tbtc4.js +11 -0
  411. package/dist/esm/impl/btc/tbtcbgsig.d.ts +10 -0
  412. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  413. package/dist/esm/impl/btc/tbtcsig.d.ts +10 -0
  414. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  415. package/dist/esm/impl/btg/btg.d.ts +7 -0
  416. package/dist/esm/impl/btg/btg.js +11 -0
  417. package/dist/esm/impl/btg/index.d.ts +2 -0
  418. package/dist/esm/impl/btg/index.js +2 -0
  419. package/dist/esm/impl/dash/dash.d.ts +7 -0
  420. package/dist/esm/impl/dash/dash.js +11 -0
  421. package/dist/esm/impl/dash/index.d.ts +3 -0
  422. package/dist/esm/impl/dash/index.js +3 -0
  423. package/dist/esm/impl/dash/tdash.d.ts +10 -0
  424. package/dist/esm/impl/dash/tdash.js +11 -0
  425. package/dist/esm/impl/doge/doge.d.ts +31 -0
  426. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  427. package/dist/esm/impl/doge/doge.js +75 -0
  428. package/dist/esm/impl/doge/index.d.ts +3 -0
  429. package/dist/esm/impl/doge/index.js +3 -0
  430. package/dist/esm/impl/doge/tdoge.d.ts +10 -0
  431. package/dist/esm/impl/doge/tdoge.js +11 -0
  432. package/dist/esm/impl/index.d.ts +10 -0
  433. package/dist/esm/impl/index.js +10 -0
  434. package/dist/esm/impl/ltc/index.d.ts +3 -0
  435. package/dist/esm/impl/ltc/index.js +3 -0
  436. package/dist/esm/impl/ltc/ltc.d.ts +7 -0
  437. package/dist/esm/impl/ltc/ltc.js +15 -0
  438. package/dist/esm/impl/ltc/tltc.d.ts +7 -0
  439. package/dist/esm/impl/ltc/tltc.js +14 -0
  440. package/dist/esm/impl/zec/index.d.ts +3 -0
  441. package/dist/esm/impl/zec/index.js +3 -0
  442. package/dist/esm/impl/zec/tzec.d.ts +7 -0
  443. package/dist/esm/impl/zec/tzec.js +11 -0
  444. package/dist/esm/impl/zec/zec.d.ts +10 -0
  445. package/dist/esm/impl/zec/zec.js +11 -0
  446. package/dist/esm/index.d.ts +21 -0
  447. package/dist/esm/index.js +21 -0
  448. package/dist/esm/keychains.d.ts +48 -0
  449. package/dist/esm/keychains.js +61 -0
  450. package/dist/esm/names.d.ts +26 -0
  451. package/dist/esm/names.js +171 -0
  452. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +8 -0
  453. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +23 -0
  454. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  455. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  456. package/dist/esm/offlineVault/TransactionExplanation.d.ts +15 -0
  457. package/dist/esm/offlineVault/TransactionExplanation.js +13 -0
  458. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  459. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  460. package/dist/esm/offlineVault/descriptor/transaction.d.ts +38 -0
  461. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  462. package/dist/esm/offlineVault/index.d.ts +6 -0
  463. package/dist/esm/offlineVault/index.js +4 -0
  464. package/dist/esm/recovery/RecoveryProvider.d.ts +22 -0
  465. package/dist/{src → esm}/recovery/RecoveryProvider.js +6 -9
  466. package/dist/esm/recovery/backupKeyRecovery.d.ts +88 -0
  467. package/dist/esm/recovery/backupKeyRecovery.js +329 -0
  468. package/dist/esm/recovery/baseApi.d.ts +24 -0
  469. package/dist/esm/recovery/baseApi.js +64 -0
  470. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  471. package/dist/esm/recovery/coingeckoApi.js +40 -0
  472. package/dist/esm/recovery/crossChainRecovery.d.ts +86 -0
  473. package/dist/esm/recovery/crossChainRecovery.js +325 -0
  474. package/dist/esm/recovery/index.d.ts +7 -0
  475. package/dist/esm/recovery/index.js +7 -0
  476. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  477. package/dist/esm/recovery/mempoolApi.js +29 -0
  478. package/dist/esm/replayProtection.d.ts +5 -0
  479. package/dist/esm/replayProtection.d.ts.map +1 -0
  480. package/dist/esm/replayProtection.js +20 -0
  481. package/dist/esm/sign.d.ts +54 -0
  482. package/dist/esm/sign.js +162 -0
  483. package/dist/esm/transaction/bip322.d.ts +27 -0
  484. package/dist/esm/transaction/bip322.js +86 -0
  485. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  486. package/dist/{src → esm}/transaction/common/verifyPayGoAmount.js +0 -2
  487. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  488. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  489. package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
  490. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  491. package/dist/esm/transaction/descriptor/index.js +6 -0
  492. package/dist/esm/transaction/descriptor/parse.d.ts +15 -0
  493. package/dist/esm/transaction/descriptor/parse.js +79 -0
  494. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +13 -0
  495. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  496. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  497. package/dist/{src → esm}/transaction/descriptor/recipient.js +1 -2
  498. package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
  499. package/dist/esm/transaction/descriptor/signPsbt.js +38 -0
  500. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +35 -0
  501. package/dist/esm/transaction/descriptor/verifyTransaction.js +65 -0
  502. package/dist/esm/transaction/explainTransaction.d.ts +18 -0
  503. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  504. package/dist/esm/transaction/explainTransaction.js +52 -0
  505. package/dist/esm/transaction/fetchInputs.d.ts +26 -0
  506. package/dist/esm/transaction/fetchInputs.js +72 -0
  507. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
  508. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  509. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +40 -0
  510. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +63 -0
  511. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  512. package/dist/esm/transaction/fixedScript/explainTransaction.js +284 -0
  513. package/dist/esm/transaction/fixedScript/index.d.ts +7 -0
  514. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  515. package/dist/esm/transaction/fixedScript/index.js +6 -0
  516. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +26 -0
  517. package/dist/{src → esm}/transaction/fixedScript/parseOutput.js +22 -28
  518. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +7 -0
  519. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  520. package/dist/esm/transaction/fixedScript/parseTransaction.js +164 -0
  521. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +18 -0
  522. package/dist/esm/transaction/fixedScript/signTransaction.js +95 -0
  523. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  524. package/dist/esm/transaction/fixedScript/verifyTransaction.js +159 -0
  525. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  526. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  527. package/dist/esm/transaction/index.d.ts +7 -0
  528. package/dist/esm/transaction/index.js +7 -0
  529. package/dist/esm/transaction/outputDifference.d.ts +40 -0
  530. package/dist/esm/transaction/outputDifference.js +42 -0
  531. package/dist/esm/transaction/parseTransaction.d.ts +3 -0
  532. package/dist/esm/transaction/parseTransaction.js +12 -0
  533. package/dist/esm/transaction/recipient.d.ts +29 -0
  534. package/dist/esm/transaction/recipient.js +48 -0
  535. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  536. package/dist/esm/transaction/signTransaction.js +63 -0
  537. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  538. package/dist/esm/transaction/verifyTransaction.js +14 -0
  539. package/dist/esm/verifyKey.d.ts +28 -0
  540. package/dist/esm/verifyKey.js +123 -0
  541. package/dist/esm/wallet.d.ts +15 -0
  542. package/dist/esm/wallet.js +5 -0
  543. package/package.json +32 -15
  544. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  545. package/dist/src/abstractUtxoCoin.js +0 -634
  546. package/dist/src/address/fixedScript.js +0 -150
  547. package/dist/src/config.js +0 -14
  548. package/dist/src/descriptor/NamedDescriptor.js +0 -79
  549. package/dist/src/descriptor/assertDescriptorWalletAddress.js +0 -66
  550. package/dist/src/descriptor/builder/builder.js +0 -37
  551. package/dist/src/descriptor/builder/parse.js +0 -116
  552. package/dist/src/descriptor/createWallet/createDescriptorWallet.js +0 -41
  553. package/dist/src/descriptor/createWallet/createDescriptors.js +0 -33
  554. package/dist/src/descriptor/descriptorWallet.js +0 -54
  555. package/dist/src/descriptor/validatePolicy.js +0 -92
  556. package/dist/src/impl/bch/bch.js +0 -70
  557. package/dist/src/impl/btc/inscriptionBuilder.js +0 -183
  558. package/dist/src/impl/btg/btg.js +0 -48
  559. package/dist/src/impl/doge/doge.d.ts.map +0 -1
  560. package/dist/src/impl/doge/doge.js +0 -79
  561. package/dist/src/keychains.js +0 -104
  562. package/dist/src/names.js +0 -214
  563. package/dist/src/offlineVault/OfflineVaultHalfSigned.js +0 -26
  564. package/dist/src/offlineVault/OfflineVaultSignable.js +0 -55
  565. package/dist/src/offlineVault/TransactionExplanation.js +0 -16
  566. package/dist/src/offlineVault/descriptor/transaction.js +0 -80
  567. package/dist/src/recovery/backupKeyRecovery.js +0 -370
  568. package/dist/src/recovery/baseApi.js +0 -73
  569. package/dist/src/recovery/coingeckoApi.js +0 -44
  570. package/dist/src/recovery/crossChainRecovery.js +0 -364
  571. package/dist/src/recovery/mempoolApi.js +0 -36
  572. package/dist/src/replayProtection.d.ts.map +0 -1
  573. package/dist/src/replayProtection.js +0 -53
  574. package/dist/src/sign.js +0 -205
  575. package/dist/src/transaction/bip322.js +0 -125
  576. package/dist/src/transaction/descriptor/explainPsbt.d.ts.map +0 -1
  577. package/dist/src/transaction/descriptor/explainPsbt.js +0 -80
  578. package/dist/src/transaction/descriptor/parse.js +0 -116
  579. package/dist/src/transaction/descriptor/parseToAmountType.js +0 -60
  580. package/dist/src/transaction/descriptor/signPsbt.js +0 -43
  581. package/dist/src/transaction/descriptor/verifyTransaction.js +0 -108
  582. package/dist/src/transaction/explainTransaction.d.ts.map +0 -1
  583. package/dist/src/transaction/explainTransaction.js +0 -67
  584. package/dist/src/transaction/fetchInputs.js +0 -109
  585. package/dist/src/transaction/fixedScript/explainTransaction.d.ts +0 -29
  586. package/dist/src/transaction/fixedScript/explainTransaction.d.ts.map +0 -1
  587. package/dist/src/transaction/fixedScript/explainTransaction.js +0 -321
  588. package/dist/src/transaction/fixedScript/index.d.ts.map +0 -1
  589. package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +0 -1
  590. package/dist/src/transaction/fixedScript/parseTransaction.js +0 -203
  591. package/dist/src/transaction/fixedScript/signTransaction.js +0 -101
  592. package/dist/src/transaction/fixedScript/verifyTransaction.js +0 -198
  593. package/dist/src/transaction/outputDifference.js +0 -47
  594. package/dist/src/transaction/recipient.js +0 -88
  595. package/dist/src/transaction/signTransaction.js +0 -102
  596. package/dist/src/verifyKey.js +0 -164
  597. package/dist/src/wallet.js +0 -8
  598. /package/dist/{src → cjs/src}/address/fixedScript.d.ts +0 -0
  599. /package/dist/{src → cjs/src}/address/index.d.ts +0 -0
  600. /package/dist/{src → cjs/src}/config.d.ts +0 -0
  601. /package/dist/{src → cjs/src}/descriptor/NamedDescriptor.d.ts +0 -0
  602. /package/dist/{src → cjs/src}/descriptor/assertDescriptorWalletAddress.d.ts +0 -0
  603. /package/dist/{src → cjs/src}/descriptor/builder/builder.d.ts +0 -0
  604. /package/dist/{src → cjs/src}/descriptor/builder/index.d.ts +0 -0
  605. /package/dist/{src → cjs/src}/descriptor/builder/parse.d.ts +0 -0
  606. /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptorWallet.d.ts +0 -0
  607. /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptors.d.ts +0 -0
  608. /package/dist/{src → cjs/src}/descriptor/createWallet/index.d.ts +0 -0
  609. /package/dist/{src → cjs/src}/descriptor/descriptorWallet.d.ts +0 -0
  610. /package/dist/{src → cjs/src}/descriptor/index.d.ts +0 -0
  611. /package/dist/{src → cjs/src}/descriptor/validatePolicy.d.ts +0 -0
  612. /package/dist/{src → cjs/src}/impl/bch/bch.d.ts +0 -0
  613. /package/dist/{src → cjs/src}/impl/bch/index.d.ts +0 -0
  614. /package/dist/{src → cjs/src}/impl/bch/tbch.d.ts +0 -0
  615. /package/dist/{src → cjs/src}/impl/bcha/bcha.d.ts +0 -0
  616. /package/dist/{src → cjs/src}/impl/bcha/index.d.ts +0 -0
  617. /package/dist/{src → cjs/src}/impl/bcha/tbcha.d.ts +0 -0
  618. /package/dist/{src → cjs/src}/impl/bsv/bsv.d.ts +0 -0
  619. /package/dist/{src → cjs/src}/impl/bsv/index.d.ts +0 -0
  620. /package/dist/{src → cjs/src}/impl/bsv/tbsv.d.ts +0 -0
  621. /package/dist/{src → cjs/src}/impl/btc/btc.d.ts +0 -0
  622. /package/dist/{src → cjs/src}/impl/btc/index.d.ts +0 -0
  623. /package/dist/{src → cjs/src}/impl/btc/inscriptionBuilder.d.ts +0 -0
  624. /package/dist/{src → cjs/src}/impl/btc/tbtc.d.ts +0 -0
  625. /package/dist/{src → cjs/src}/impl/btc/tbtc4.d.ts +0 -0
  626. /package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.d.ts +0 -0
  627. /package/dist/{src → cjs/src}/impl/btc/tbtcsig.d.ts +0 -0
  628. /package/dist/{src → cjs/src}/impl/btg/btg.d.ts +0 -0
  629. /package/dist/{src → cjs/src}/impl/btg/index.d.ts +0 -0
  630. /package/dist/{src → cjs/src}/impl/dash/dash.d.ts +0 -0
  631. /package/dist/{src → cjs/src}/impl/dash/index.d.ts +0 -0
  632. /package/dist/{src → cjs/src}/impl/dash/tdash.d.ts +0 -0
  633. /package/dist/{src → cjs/src}/impl/doge/index.d.ts +0 -0
  634. /package/dist/{src → cjs/src}/impl/doge/tdoge.d.ts +0 -0
  635. /package/dist/{src → cjs/src}/impl/index.d.ts +0 -0
  636. /package/dist/{src → cjs/src}/impl/ltc/index.d.ts +0 -0
  637. /package/dist/{src → cjs/src}/impl/ltc/ltc.d.ts +0 -0
  638. /package/dist/{src → cjs/src}/impl/ltc/tltc.d.ts +0 -0
  639. /package/dist/{src → cjs/src}/impl/zec/index.d.ts +0 -0
  640. /package/dist/{src → cjs/src}/impl/zec/tzec.d.ts +0 -0
  641. /package/dist/{src → cjs/src}/impl/zec/zec.d.ts +0 -0
  642. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  643. /package/dist/{src → cjs/src}/keychains.d.ts +0 -0
  644. /package/dist/{src → cjs/src}/names.d.ts +0 -0
  645. /package/dist/{src → cjs/src}/offlineVault/OfflineVaultHalfSigned.d.ts +0 -0
  646. /package/dist/{src → cjs/src}/offlineVault/OfflineVaultSignable.d.ts +0 -0
  647. /package/dist/{src → cjs/src}/offlineVault/TransactionExplanation.d.ts +0 -0
  648. /package/dist/{src → cjs/src}/offlineVault/descriptor/index.d.ts +0 -0
  649. /package/dist/{src → cjs/src}/offlineVault/descriptor/transaction.d.ts +0 -0
  650. /package/dist/{src → cjs/src}/offlineVault/index.d.ts +0 -0
  651. /package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +0 -0
  652. /package/dist/{src → cjs/src}/recovery/backupKeyRecovery.d.ts +0 -0
  653. /package/dist/{src → cjs/src}/recovery/baseApi.d.ts +0 -0
  654. /package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -0
  655. /package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +0 -0
  656. /package/dist/{src → cjs/src}/recovery/index.d.ts +0 -0
  657. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
  658. /package/dist/{src → cjs/src}/sign.d.ts +0 -0
  659. /package/dist/{src → cjs/src}/transaction/bip322.d.ts +0 -0
  660. /package/dist/{src → cjs/src}/transaction/common/verifyPayGoAmount.d.ts +0 -0
  661. /package/dist/{src → cjs/src}/transaction/descriptor/index.d.ts +0 -0
  662. /package/dist/{src → cjs/src}/transaction/descriptor/parse.d.ts +0 -0
  663. /package/dist/{src → cjs/src}/transaction/descriptor/parseToAmountType.d.ts +0 -0
  664. /package/dist/{src → cjs/src}/transaction/descriptor/recipient.d.ts +0 -0
  665. /package/dist/{src → cjs/src}/transaction/descriptor/signPsbt.d.ts +0 -0
  666. /package/dist/{src → cjs/src}/transaction/descriptor/verifyTransaction.d.ts +0 -0
  667. /package/dist/{src → cjs/src}/transaction/fetchInputs.d.ts +0 -0
  668. /package/dist/{src → cjs/src}/transaction/fixedScript/parseOutput.d.ts +0 -0
  669. /package/dist/{src → cjs/src}/transaction/fixedScript/signTransaction.d.ts +0 -0
  670. /package/dist/{src → cjs/src}/transaction/fixedScript/verifyTransaction.d.ts +0 -0
  671. /package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.d.ts +0 -0
  672. /package/dist/{src → cjs/src}/transaction/index.d.ts +0 -0
  673. /package/dist/{src → cjs/src}/transaction/outputDifference.d.ts +0 -0
  674. /package/dist/{src → cjs/src}/transaction/parseTransaction.d.ts +0 -0
  675. /package/dist/{src → cjs/src}/transaction/recipient.d.ts +0 -0
  676. /package/dist/{src → cjs/src}/transaction/signTransaction.d.ts +0 -0
  677. /package/dist/{src → cjs/src}/transaction/verifyTransaction.d.ts +0 -0
  678. /package/dist/{src → cjs/src}/verifyKey.d.ts +0 -0
  679. /package/dist/{src → cjs/src}/wallet.d.ts +0 -0
  680. /package/dist/{src → esm}/address/fixedScript.d.ts.map +0 -0
  681. /package/dist/{src → esm}/address/index.d.ts.map +0 -0
  682. /package/dist/{src → esm}/config.d.ts.map +0 -0
  683. /package/dist/{src → esm}/descriptor/NamedDescriptor.d.ts.map +0 -0
  684. /package/dist/{src → esm}/descriptor/assertDescriptorWalletAddress.d.ts.map +0 -0
  685. /package/dist/{src → esm}/descriptor/builder/builder.d.ts.map +0 -0
  686. /package/dist/{src → esm}/descriptor/builder/index.d.ts.map +0 -0
  687. /package/dist/{src → esm}/descriptor/builder/parse.d.ts.map +0 -0
  688. /package/dist/{src → esm}/descriptor/createWallet/createDescriptorWallet.d.ts.map +0 -0
  689. /package/dist/{src → esm}/descriptor/createWallet/createDescriptors.d.ts.map +0 -0
  690. /package/dist/{src → esm}/descriptor/createWallet/index.d.ts.map +0 -0
  691. /package/dist/{src → esm}/descriptor/descriptorWallet.d.ts.map +0 -0
  692. /package/dist/{src → esm}/descriptor/index.d.ts.map +0 -0
  693. /package/dist/{src → esm}/descriptor/validatePolicy.d.ts.map +0 -0
  694. /package/dist/{src → esm}/impl/bch/bch.d.ts.map +0 -0
  695. /package/dist/{src → esm}/impl/bch/index.d.ts.map +0 -0
  696. /package/dist/{src → esm}/impl/bch/tbch.d.ts.map +0 -0
  697. /package/dist/{src → esm}/impl/bcha/bcha.d.ts.map +0 -0
  698. /package/dist/{src → esm}/impl/bcha/index.d.ts.map +0 -0
  699. /package/dist/{src → esm}/impl/bcha/tbcha.d.ts.map +0 -0
  700. /package/dist/{src → esm}/impl/bsv/bsv.d.ts.map +0 -0
  701. /package/dist/{src → esm}/impl/bsv/index.d.ts.map +0 -0
  702. /package/dist/{src → esm}/impl/bsv/tbsv.d.ts.map +0 -0
  703. /package/dist/{src → esm}/impl/btc/btc.d.ts.map +0 -0
  704. /package/dist/{src → esm}/impl/btc/index.d.ts.map +0 -0
  705. /package/dist/{src → esm}/impl/btc/inscriptionBuilder.d.ts.map +0 -0
  706. /package/dist/{src → esm}/impl/btc/tbtc.d.ts.map +0 -0
  707. /package/dist/{src → esm}/impl/btc/tbtc4.d.ts.map +0 -0
  708. /package/dist/{src → esm}/impl/btc/tbtcbgsig.d.ts.map +0 -0
  709. /package/dist/{src → esm}/impl/btc/tbtcsig.d.ts.map +0 -0
  710. /package/dist/{src → esm}/impl/btg/btg.d.ts.map +0 -0
  711. /package/dist/{src → esm}/impl/btg/index.d.ts.map +0 -0
  712. /package/dist/{src → esm}/impl/dash/dash.d.ts.map +0 -0
  713. /package/dist/{src → esm}/impl/dash/index.d.ts.map +0 -0
  714. /package/dist/{src → esm}/impl/dash/tdash.d.ts.map +0 -0
  715. /package/dist/{src → esm}/impl/doge/index.d.ts.map +0 -0
  716. /package/dist/{src → esm}/impl/doge/tdoge.d.ts.map +0 -0
  717. /package/dist/{src → esm}/impl/index.d.ts.map +0 -0
  718. /package/dist/{src → esm}/impl/ltc/index.d.ts.map +0 -0
  719. /package/dist/{src → esm}/impl/ltc/ltc.d.ts.map +0 -0
  720. /package/dist/{src → esm}/impl/ltc/tltc.d.ts.map +0 -0
  721. /package/dist/{src → esm}/impl/zec/index.d.ts.map +0 -0
  722. /package/dist/{src → esm}/impl/zec/tzec.d.ts.map +0 -0
  723. /package/dist/{src → esm}/impl/zec/zec.d.ts.map +0 -0
  724. /package/dist/{src → esm}/index.d.ts.map +0 -0
  725. /package/dist/{src → esm}/keychains.d.ts.map +0 -0
  726. /package/dist/{src → esm}/names.d.ts.map +0 -0
  727. /package/dist/{src → esm}/offlineVault/OfflineVaultHalfSigned.d.ts.map +0 -0
  728. /package/dist/{src → esm}/offlineVault/OfflineVaultSignable.d.ts.map +0 -0
  729. /package/dist/{src → esm}/offlineVault/TransactionExplanation.d.ts.map +0 -0
  730. /package/dist/{src → esm}/offlineVault/descriptor/index.d.ts.map +0 -0
  731. /package/dist/{src → esm}/offlineVault/descriptor/transaction.d.ts.map +0 -0
  732. /package/dist/{src → esm}/offlineVault/index.d.ts.map +0 -0
  733. /package/dist/{src → esm}/recovery/RecoveryProvider.d.ts.map +0 -0
  734. /package/dist/{src → esm}/recovery/backupKeyRecovery.d.ts.map +0 -0
  735. /package/dist/{src → esm}/recovery/baseApi.d.ts.map +0 -0
  736. /package/dist/{src → esm}/recovery/coingeckoApi.d.ts.map +0 -0
  737. /package/dist/{src → esm}/recovery/crossChainRecovery.d.ts.map +0 -0
  738. /package/dist/{src → esm}/recovery/index.d.ts.map +0 -0
  739. /package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +0 -0
  740. /package/dist/{src → esm}/sign.d.ts.map +0 -0
  741. /package/dist/{src → esm}/transaction/bip322.d.ts.map +0 -0
  742. /package/dist/{src → esm}/transaction/common/verifyPayGoAmount.d.ts.map +0 -0
  743. /package/dist/{src → esm}/transaction/descriptor/index.d.ts.map +0 -0
  744. /package/dist/{src → esm}/transaction/descriptor/parse.d.ts.map +0 -0
  745. /package/dist/{src → esm}/transaction/descriptor/parseToAmountType.d.ts.map +0 -0
  746. /package/dist/{src → esm}/transaction/descriptor/recipient.d.ts.map +0 -0
  747. /package/dist/{src → esm}/transaction/descriptor/signPsbt.d.ts.map +0 -0
  748. /package/dist/{src → esm}/transaction/descriptor/verifyTransaction.d.ts.map +0 -0
  749. /package/dist/{src → esm}/transaction/fetchInputs.d.ts.map +0 -0
  750. /package/dist/{src → esm}/transaction/fixedScript/parseOutput.d.ts.map +0 -0
  751. /package/dist/{src → esm}/transaction/fixedScript/signTransaction.d.ts.map +0 -0
  752. /package/dist/{src → esm}/transaction/fixedScript/verifyTransaction.d.ts.map +0 -0
  753. /package/dist/{src → esm}/transaction/getPayGoVerificationPubkey.d.ts.map +0 -0
  754. /package/dist/{src → esm}/transaction/index.d.ts.map +0 -0
  755. /package/dist/{src → esm}/transaction/outputDifference.d.ts.map +0 -0
  756. /package/dist/{src → esm}/transaction/parseTransaction.d.ts.map +0 -0
  757. /package/dist/{src → esm}/transaction/recipient.d.ts.map +0 -0
  758. /package/dist/{src → esm}/transaction/signTransaction.d.ts.map +0 -0
  759. /package/dist/{src → esm}/transaction/verifyTransaction.d.ts.map +0 -0
  760. /package/dist/{src → esm}/verifyKey.d.ts.map +0 -0
  761. /package/dist/{src → esm}/wallet.d.ts.map +0 -0
@@ -1,14 +1,8 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.parseOutput = parseOutput;
7
- const debug_1 = __importDefault(require("debug"));
8
- const lodash_1 = __importDefault(require("lodash"));
9
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
- const abstractUtxoCoin_1 = require("../../abstractUtxoCoin");
11
- const debug = (0, debug_1.default)('bitgo:v2:parseoutput');
1
+ import debugLib from 'debug';
2
+ import _ from 'lodash';
3
+ import { InvalidAddressDerivationPropertyError, UnexpectedAddressError, } from '@bitgo-beta/sdk-core';
4
+ import { AbstractUtxoCoin, isWalletOutput } from '../../abstractUtxoCoin';
5
+ const debug = debugLib('bitgo:v2:parseoutput');
12
6
  /**
13
7
  * Check an address which failed initial validation to see if it's the base address of a migrated v1 bch wallet.
14
8
  *
@@ -40,7 +34,7 @@ const debug = (0, debug_1.default)('bitgo:v2:parseoutput');
40
34
  * @param currentAddress {string} address to check for externality relative to v1 wallet base address
41
35
  */
42
36
  function isMigratedAddress(wallet, currentAddress) {
43
- if (lodash_1.default.isString(wallet.migratedFrom()) && wallet.migratedFrom() === currentAddress) {
37
+ if (_.isString(wallet.migratedFrom()) && wallet.migratedFrom() === currentAddress) {
44
38
  debug('found address %s which was migrated from v1 wallet, address is not external', currentAddress);
45
39
  return true;
46
40
  }
@@ -54,7 +48,7 @@ function isMigratedAddress(wallet, currentAddress) {
54
48
  async function verifyCustomChangeAddress(params) {
55
49
  const { coin, customChangeKeys, addressType, addressDetails, currentAddress } = params;
56
50
  try {
57
- return await coin.verifyAddress(lodash_1.default.extend({ addressType }, addressDetails, {
51
+ return await coin.verifyAddress(_.extend({ addressType }, addressDetails, {
58
52
  keychains: customChangeKeys,
59
53
  address: currentAddress,
60
54
  }));
@@ -67,7 +61,7 @@ async function verifyCustomChangeAddress(params) {
67
61
  async function handleVerifyAddressError({ e, currentAddress, wallet, txParams, customChangeKeys, coin, addressDetails, addressType, considerMigratedFromAddressInternal, }) {
68
62
  // Todo: name server-side errors to avoid message-based checking [BG-5124]
69
63
  const walletAddressNotFound = e.message.includes('wallet address not found');
70
- const unexpectedAddress = e instanceof sdk_core_1.UnexpectedAddressError;
64
+ const unexpectedAddress = e instanceof UnexpectedAddressError;
71
65
  if (walletAddressNotFound || unexpectedAddress) {
72
66
  if (unexpectedAddress && !walletAddressNotFound) {
73
67
  // check to see if this is a migrated v1 bch address - it could be internal
@@ -89,7 +83,7 @@ async function handleVerifyAddressError({ e, currentAddress, wallet, txParams, c
89
83
  debug('Address %s presumed external', currentAddress);
90
84
  return { external: true };
91
85
  }
92
- else if (e instanceof sdk_core_1.InvalidAddressDerivationPropertyError && currentAddress === txParams.changeAddress) {
86
+ else if (e instanceof InvalidAddressDerivationPropertyError && currentAddress === txParams.changeAddress) {
93
87
  // expect to see this error when passing in a custom changeAddress with no chain or index
94
88
  return { external: false };
95
89
  }
@@ -103,15 +97,15 @@ async function handleVerifyAddressError({ e, currentAddress, wallet, txParams, c
103
97
  throw e;
104
98
  }
105
99
  async function fetchAddressDetails({ reqId, disableNetworking, addressDetailsPrebuild, addressDetailsVerification, currentAddress, wallet, }) {
106
- let addressDetails = lodash_1.default.extend({}, addressDetailsPrebuild, addressDetailsVerification);
100
+ let addressDetails = _.extend({}, addressDetailsPrebuild, addressDetailsVerification);
107
101
  debug('Locally available address %s details: %O', currentAddress, addressDetails);
108
- if (lodash_1.default.isEmpty(addressDetails) && !disableNetworking) {
102
+ if (_.isEmpty(addressDetails) && !disableNetworking) {
109
103
  addressDetails = await wallet.getAddress({ address: currentAddress, reqId });
110
104
  debug('Downloaded address %s details: %O', currentAddress, addressDetails);
111
105
  }
112
106
  return addressDetails;
113
107
  }
114
- async function parseOutput({ currentOutput, coin, txPrebuild, verification, keychainArray, wallet, txParams, customChange, reqId, }) {
108
+ export async function parseOutput({ currentOutput, coin, txPrebuild, verification, keychainArray, wallet, txParams, customChange, reqId, }) {
115
109
  const disableNetworking = !!verification.disableNetworking;
116
110
  const currentAddress = currentOutput.address;
117
111
  if (currentAddress === undefined) {
@@ -124,7 +118,7 @@ async function parseOutput({ currentOutput, coin, txPrebuild, verification, keyc
124
118
  }
125
119
  // attempt to grab the address details from either the prebuilt tx, or the verification params.
126
120
  // If both of these are empty, then we will try to get the address details from bitgo instead
127
- const addressDetailsPrebuild = lodash_1.default.get(txPrebuild, `txInfo.walletAddressDetails.${currentAddress}`, {});
121
+ const addressDetailsPrebuild = _.get(txPrebuild, `txInfo.walletAddressDetails.${currentAddress}`, {});
128
122
  const addressDetailsVerification = verification?.addresses?.[currentAddress] ?? {};
129
123
  debug('Parsing address details for %s', currentAddress);
130
124
  let currentAddressDetails = undefined;
@@ -138,21 +132,21 @@ async function parseOutput({ currentOutput, coin, txPrebuild, verification, keyc
138
132
  // In the case that we have a custom change wallet, we need to verify the address against the custom change keys
139
133
  // and not the wallet keys. This check is done in the handleVerifyAddressError function if this error is thrown.
140
134
  if (customChange !== undefined) {
141
- throw new sdk_core_1.UnexpectedAddressError('`address validation failure');
135
+ throw new UnexpectedAddressError('`address validation failure');
142
136
  }
143
137
  // If it is an internal address, we can skip the network request and just verify the address locally with the
144
138
  // derivation information we have. Otherwise, if the address is external, which is the only remaining case, we
145
139
  // can just return the current output as is without contacting the server.
146
- if ((0, abstractUtxoCoin_1.isWalletOutput)(currentOutput)) {
140
+ if (isWalletOutput(currentOutput)) {
147
141
  const res = await coin.isWalletAddress({
148
- addressType: abstractUtxoCoin_1.AbstractUtxoCoin.inferAddressType({ chain: currentOutput.chain }) || undefined,
142
+ addressType: AbstractUtxoCoin.inferAddressType({ chain: currentOutput.chain }) || undefined,
149
143
  keychains: keychainArray,
150
144
  address: currentAddress,
151
145
  chain: currentOutput.chain,
152
146
  index: currentOutput.index,
153
147
  });
154
148
  if (!res) {
155
- throw new sdk_core_1.UnexpectedAddressError();
149
+ throw new UnexpectedAddressError();
156
150
  }
157
151
  }
158
152
  return currentOutput;
@@ -184,20 +178,20 @@ async function parseOutput({ currentOutput, coin, txPrebuild, verification, keyc
184
178
  });
185
179
  // verify that the address is on the wallet. verifyAddress throws if
186
180
  // it fails to correctly rederive the address, meaning it's external
187
- currentAddressType = abstractUtxoCoin_1.AbstractUtxoCoin.inferAddressType(addressDetails) || undefined;
181
+ currentAddressType = AbstractUtxoCoin.inferAddressType(addressDetails) || undefined;
188
182
  currentAddressDetails = addressDetails;
189
- await coin.verifyAddress(lodash_1.default.extend({ addressType: currentAddressType }, addressDetails, {
183
+ await coin.verifyAddress(_.extend({ addressType: currentAddressType }, addressDetails, {
190
184
  keychains: keychainArray,
191
185
  address: currentAddress,
192
186
  }));
193
187
  debug('Address %s verification passed', currentAddress);
194
188
  // verify address succeeded without throwing, so the address was
195
189
  // correctly rederived from the wallet keychains, making it not external
196
- return lodash_1.default.extend({}, currentOutput, addressDetails, { external: false });
190
+ return _.extend({}, currentOutput, addressDetails, { external: false });
197
191
  }
198
192
  catch (e) {
199
193
  debug('Address %s verification threw an error:', currentAddress, e);
200
- return lodash_1.default.extend({}, currentOutput, await handleVerifyAddressError({
194
+ return _.extend({}, currentOutput, await handleVerifyAddressError({
201
195
  e,
202
196
  coin,
203
197
  currentAddress,
@@ -210,4 +204,4 @@ async function parseOutput({ currentOutput, coin, txPrebuild, verification, keyc
210
204
  }));
211
205
  }
212
206
  }
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvcGFyc2VPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE0TUEsa0NBeUhDO0FBclVELGtEQUE2QjtBQUM3QixvREFBdUI7QUFDdkIsbURBVThCO0FBRTlCLDZEQUFrRjtBQUVsRixNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBTy9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBZSxFQUFFLGNBQXNCO0lBQ2hFLElBQUksZ0JBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ2xGLEtBQUssQ0FBQyw2RUFBNkUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNyRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFVRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLHlCQUF5QixDQUFDLE1BQXdDO0lBQy9FLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDdkYsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQzdCLGdCQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsY0FBYyxFQUFFO1lBQ3hDLFNBQVMsRUFBRSxnQkFBZ0I7WUFDM0IsT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLEtBQUssQ0FBQywy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cG9ydCBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQWRkcmVzc1ZlcmlmaWNhdGlvbkRhdGEsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yLFxuICBJV2FsbGV0LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yLFxuICBWZXJpZmljYXRpb25PcHRpb25zLFxuICBJVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyaXBsZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBPdXRwdXQsIGlzV2FsbGV0T3V0cHV0IH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5cbmNvbnN0IGRlYnVnID0gZGVidWdMaWIoJ2JpdGdvOnYyOnBhcnNlb3V0cHV0Jyk7XG5cbmludGVyZmFjZSBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JSZXNwb25zZSB7XG4gIGV4dGVybmFsOiBib29sZWFuO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hlY2sgYW4gYWRkcmVzcyB3aGljaCBmYWlsZWQgaW5pdGlhbCB2YWxpZGF0aW9uIHRvIHNlZSBpZiBpdCdzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBtaWdyYXRlZCB2MSBiY2ggd2FsbGV0LlxuICpcbiAqIFRoZSB3YWxsZXQgaW4gcXVlc3Rpb24gY291bGQgYmUgYSBtaWdyYXRlZCBTYWZlSEQgQkNIIHdhbGxldCwgYW5kIHRoZSB0cmFuc2FjdGlvbiB3ZVxuICogYXJlIGN1cnJlbnRseSBwYXJzaW5nIGlzIHRyeWluZyB0byBzcGVuZCBjaGFuZ2UgYmFjayB0byB0aGUgdjEgd2FsbGV0IGJhc2UgYWRkcmVzcy5cbiAqXG4gKiBJdCBkb2VzIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWxsb3cgbmV3IGFkZHJlc3MgY3JlYXRpb24gZm9yIHRoZXNlIHdhbGxldHMsXG4gKiBhbmQgaW5zdGVhZCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHRoZSB2MSB3YWxsZXQgd2hlbiBhIG5ldyBhZGRyZXNzIGlzIHJlcXVlc3RlZC5cbiAqIElmIHRoaXMgbmV3IGFkZHJlc3MgaXMgcmVxdWVzdGVkIGZvciB0aGUgcHVycG9zZXMgb2Ygc3BlbmRpbmcgY2hhbmdlIGJhY2sgdG8gdGhlIHdhbGxldCxcbiAqIHRoZSBjaGFuZ2Ugd2lsbCBnbyB0byB0aGUgdjEgd2FsbGV0IGJhc2UgYWRkcmVzcy4gVGhpcyBhZGRyZXNzICppcyogb24gdGhlIHdhbGxldCxcbiAqIGJ1dCBpdCB3aWxsIHN0aWxsIGNhdXNlIGFuIGVycm9yIHRvIGJlIHRocm93biBieSB2ZXJpZnlBZGRyZXNzLCBzaW5jZSB0aGUgZGVyaXZhdGlvbiBwYXRoXG4gKiB1c2VkIGZvciB0aGlzIGFkZHJlc3MgaXMgbm9uLXN0YW5kYXJkLiAoSSBoYXZlIHNlZW4gdGhlc2UgYWRkcmVzc2VzIGRlcml2ZWQgdXNpbmcgcGF0aHMgbS8wLzAgYW5kIG0vMTAxLFxuICogd2hlcmVhcyB0aGUgdjIgYWRkcmVzc2VzIGFyZSBkZXJpdmVkIHVzaW5nIHBhdGggIG0vMC8wLyR7Y2hhaW59LyR7aW5kZXh9KS5cbiAqXG4gKiBUaGlzIG1lYW5zIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoaXMgY2FzZSBleHBsaWNpdGx5IGluIHRoaXMgY2F0Y2ggYmxvY2ssIGFuZCBjbGFzc2lmeVxuICogdGhlc2UgdHlwZXMgb2Ygb3V0cHV0cyBhcyBpbnRlcm5hbCBpbnN0ZWFkIG9mIGV4dGVybmFsLiBGYWlsaW5nIHRvIGRvIHNvIHdvdWxkIGNhdXNlIHRoZVxuICogdHJhbnNhY3Rpb24ncyBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIChpZSwgb3V0cHV0cyB3aGljaCBnbyB0byBhZGRyZXNzZXMgbm90IHNwZWNpZmllZCBpblxuICogdGhlIHJlY2lwaWVudHMgYXJyYXkpIHRvIGFkZCB1cCB0byBtb3JlIHRoYW4gdGhlIDE1MCBiYXNpcyBwb2ludCBsaW1pdCB3aGljaCB3ZSBlbmZvcmNlIG9uXG4gKiBwYXktYXMteW91LWdvIG91dHB1dHMgKHdoaWNoIHNob3VsZCBiZSB0aGUgb25seSBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIG9uIG91ciB0cmFuc2FjdGlvbnMpLlxuICpcbiAqIFRoZSAxNTAgYmFzaXMgcG9pbnQgbGltaXQgZm9yIGltcGxpY2l0IGV4dGVybmFsIHNlbmRzIGlzIGVuZm9yY2VkIGluIHZlcmlmeVRyYW5zYWN0aW9uLFxuICogd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBnZXQgaW5mb3JtYXRpb24gb24gdGhlIHRvdGFsIGV4dGVybmFsL2ludGVybmFsIHNwZW5kIGFtb3VudHNcbiAqIGZvciBhIHRyYW5zYWN0aW9uLiBUaGUgaWRlYSBoZXJlIGlzIHRvIHByb3RlY3QgZnJvbSB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgbWFsaWNpb3VzbHkgbW9kaWZpZWRcbiAqIHRvIGFkZCBtb3JlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kcyAoZWcsIHRvIGFuIGF0dGFja2VyLWNvbnRyb2xsZWQgd2FsbGV0KS5cbiAqXG4gKiBTZWUgdmVyaWZ5VHJhbnNhY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRyYW5zYWN0aW9uIHByZWJ1aWxkcyBhcmUgdmVyaWZpZWQgYmVmb3JlIHNpZ25pbmcuXG4gKlxuICogQHBhcmFtIHdhbGxldCB7V2FsbGV0fSB3YWxsZXQgd2hpY2ggaXMgbWFraW5nIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIGN1cnJlbnRBZGRyZXNzIHtzdHJpbmd9IGFkZHJlc3MgdG8gY2hlY2sgZm9yIGV4dGVybmFsaXR5IHJlbGF0aXZlIHRvIHYxIHdhbGxldCBiYXNlIGFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gaXNNaWdyYXRlZEFkZHJlc3Mod2FsbGV0OiBJV2FsbGV0LCBjdXJyZW50QWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChfLmlzU3RyaW5nKHdhbGxldC5taWdyYXRlZEZyb20oKSkgJiYgd2FsbGV0Lm1pZ3JhdGVkRnJvbSgpID09PSBjdXJyZW50QWRkcmVzcykge1xuICAgIGRlYnVnKCdmb3VuZCBhZGRyZXNzICVzIHdoaWNoIHdhcyBtaWdyYXRlZCBmcm9tIHYxIHdhbGxldCwgYWRkcmVzcyBpcyBub3QgZXh0ZXJuYWwnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmludGVyZmFjZSBWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9ucyB7XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIGN1c3RvbUNoYW5nZUtleXM6IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnNbJ2N1c3RvbUNoYW5nZUtleXMnXTtcbiAgYWRkcmVzc1R5cGU6IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnNbJ2FkZHJlc3NUeXBlJ107XG4gIGFkZHJlc3NEZXRhaWxzOiBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zWydhZGRyZXNzRGV0YWlscyddO1xuICBjdXJyZW50QWRkcmVzczogSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yT3B0aW9uc1snY3VycmVudEFkZHJlc3MnXTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgYW4gYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGN1c3RvbSBjaGFuZ2Uga2V5c1xuICogQHBhcmFtIHtWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzKHBhcmFtczogVmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBjb2luLCBjdXN0b21DaGFuZ2VLZXlzLCBhZGRyZXNzVHlwZSwgYWRkcmVzc0RldGFpbHMsIGN1cnJlbnRBZGRyZXNzIH0gPSBwYXJhbXM7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvaW4udmVyaWZ5QWRkcmVzcyhcbiAgICAgIF8uZXh0ZW5kKHsgYWRkcmVzc1R5cGUgfSwgYWRkcmVzc0RldGFpbHMsIHtcbiAgICAgICAga2V5Y2hhaW5zOiBjdXN0b21DaGFuZ2VLZXlzLFxuICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IGN1c3RvbSBjaGFuZ2UgYWRkcmVzcyAlcycsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnMge1xuICBlOiBFcnJvcjtcbiAgY3VycmVudEFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBJV2FsbGV0O1xuICB0eFBhcmFtczoge1xuICAgIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG4gIH07XG4gIGN1c3RvbUNoYW5nZUtleXM/OiBDdXN0b21DaGFuZ2VPcHRpb25zWydrZXlzJ107XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIGFkZHJlc3NEZXRhaWxzPzogYW55O1xuICBhZGRyZXNzVHlwZT86IHN0cmluZztcbiAgY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICBlLFxuICBjdXJyZW50QWRkcmVzcyxcbiAgd2FsbGV0LFxuICB0eFBhcmFtcyxcbiAgY3VzdG9tQ2hhbmdlS2V5cyxcbiAgY29pbixcbiAgYWRkcmVzc0RldGFpbHMsXG4gIGFkZHJlc3NUeXBlLFxuICBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbCxcbn06IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnMpOiBQcm9taXNlPEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvclJlc3BvbnNlPiB7XG4gIC8vIFRvZG86IG5hbWUgc2VydmVyLXNpZGUgZXJyb3JzIHRvIGF2b2lkIG1lc3NhZ2UtYmFzZWQgY2hlY2tpbmcgW0JHLTUxMjRdXG4gIGNvbnN0IHdhbGxldEFkZHJlc3NOb3RGb3VuZCA9IGUubWVzc2FnZS5pbmNsdWRlcygnd2FsbGV0IGFkZHJlc3Mgbm90IGZvdW5kJyk7XG4gIGNvbnN0IHVuZXhwZWN0ZWRBZGRyZXNzID0gZSBpbnN0YW5jZW9mIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3I7XG4gIGlmICh3YWxsZXRBZGRyZXNzTm90Rm91bmQgfHwgdW5leHBlY3RlZEFkZHJlc3MpIHtcbiAgICBpZiAodW5leHBlY3RlZEFkZHJlc3MgJiYgIXdhbGxldEFkZHJlc3NOb3RGb3VuZCkge1xuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBtaWdyYXRlZCB2MSBiY2ggYWRkcmVzcyAtIGl0IGNvdWxkIGJlIGludGVybmFsXG4gICAgICBjb25zdCBpc01pZ3JhdGVkID0gaXNNaWdyYXRlZEFkZHJlc3Mod2FsbGV0LCBjdXJyZW50QWRkcmVzcyk7XG4gICAgICBpZiAoaXNNaWdyYXRlZCkge1xuICAgICAgICByZXR1cm4geyBleHRlcm5hbDogY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWwgPT09IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGRlYnVnKCdBZGRyZXNzICVzIHdhcyBmb3VuZCBvbiB3YWxsZXQgYnV0IGNvdWxkIG5vdCBiZSByZWNvbnN0cnVjdGVkJywgY3VycmVudEFkZHJlc3MpO1xuXG4gICAgICAvLyBhdHRlbXB0IHRvIHZlcmlmeSBhZGRyZXNzIHVzaW5nIGN1c3RvbSBjaGFuZ2UgYWRkcmVzcyBrZXlzIGlmIHRoZSB3YWxsZXQgaGFzIHRoYXQgZmVhdHVyZSBlbmFibGVkXG4gICAgICBpZiAoXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMgJiZcbiAgICAgICAgKGF3YWl0IHZlcmlmeUN1c3RvbUNoYW5nZUFkZHJlc3MoeyBjb2luLCBhZGRyZXNzRGV0YWlscywgYWRkcmVzc1R5cGUsIGN1cnJlbnRBZGRyZXNzLCBjdXN0b21DaGFuZ2VLZXlzIH0pKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGFkZHJlc3MgaXMgdmFsaWQgYWdhaW5zdCB0aGUgY3VzdG9tIGNoYW5nZSBrZXlzLiBNYXJrIGFkZHJlc3MgYXMgbm90IGV4dGVybmFsXG4gICAgICAgIC8vIGFuZCByZXF1ZXN0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHRoZSBjdXN0b20gY2hhbmdlIGtleXNcbiAgICAgICAgZGVidWcoJ0FkZHJlc3MgJXMgdmVyaWZpZWQgYXMgZGVyaXZlZCBmcm9tIHRoZSBjdXN0b20gY2hhbmdlIGtleXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB7IGV4dGVybmFsOiBmYWxzZSwgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGUgYWRkcmVzcyB3YXMgZm91bmQsIGJ1dCBub3Qgb24gdGhlIHdhbGxldCwgd2hpY2ggc2ltcGx5IG1lYW5zIGl0J3MgZXh0ZXJuYWxcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyBwcmVzdW1lZCBleHRlcm5hbCcsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICByZXR1cm4geyBleHRlcm5hbDogdHJ1ZSB9O1xuICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yICYmIGN1cnJlbnRBZGRyZXNzID09PSB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzKSB7XG4gICAgLy8gZXhwZWN0IHRvIHNlZSB0aGlzIGVycm9yIHdoZW4gcGFzc2luZyBpbiBhIGN1c3RvbSBjaGFuZ2VBZGRyZXNzIHdpdGggbm8gY2hhaW4gb3IgaW5kZXhcbiAgICByZXR1cm4geyBleHRlcm5hbDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0FkZHJlc3MgY2xhc3NpZmljYXRpb24gZmFpbGVkIGZvciBhZGRyZXNzJywgY3VycmVudEFkZHJlc3MpO1xuICBjb25zb2xlLnRyYWNlKGUpO1xuICAvKipcbiAgICogSXQgbWlnaHQgYmUgYSBjb21wbGV0ZWx5IGludmFsaWQgYWRkcmVzcyBvciBhIGJhZCB2YWxpZGF0aW9uIGF0dGVtcHQgb3Igc29tZXRoaW5nIGVsc2UgY29tcGxldGVseSwgaW5cbiAgICogd2hpY2ggY2FzZSB3ZSBkbyBub3QgcHJvY2VlZCBhbmQgcmF0aGVyIHJldGhyb3cgdGhlIGVycm9yLCB3aGljaCBpcyBzYWZlciB0aGFuIGFzc3VtaW5nIHRoYXQgdGhlIGFkZHJlc3NcbiAgICogdmFsaWRhdGlvbiBmYWlsZWQgc2ltcGx5IGJlY2F1c2UgaXQncyBleHRlcm5hbCB0byB0aGUgd2FsbGV0LlxuICAgKi9cbiAgdGhyb3cgZTtcbn1cblxuaW50ZXJmYWNlIEZldGNoQWRkcmVzc0RldGFpbHNPcHRpb25zIHtcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbiAgZGlzYWJsZU5ldHdvcmtpbmc6IGJvb2xlYW47XG4gIGFkZHJlc3NEZXRhaWxzUHJlYnVpbGQ6IGFueTtcbiAgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb246IGFueTtcbiAgY3VycmVudEFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBJV2FsbGV0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFkZHJlc3NEZXRhaWxzKHtcbiAgcmVxSWQsXG4gIGRpc2FibGVOZXR3b3JraW5nLFxuICBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLFxuICBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbixcbiAgY3VycmVudEFkZHJlc3MsXG4gIHdhbGxldCxcbn06IEZldGNoQWRkcmVzc0RldGFpbHNPcHRpb25zKSB7XG4gIGxldCBhZGRyZXNzRGV0YWlscyA9IF8uZXh0ZW5kKHt9LCBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLCBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbik7XG4gIGRlYnVnKCdMb2NhbGx5IGF2YWlsYWJsZSBhZGRyZXNzICVzIGRldGFpbHM6ICVPJywgY3VycmVudEFkZHJlc3MsIGFkZHJlc3NEZXRhaWxzKTtcbiAgaWYgKF8uaXNFbXB0eShhZGRyZXNzRGV0YWlscykgJiYgIWRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgYWRkcmVzc0RldGFpbHMgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLCByZXFJZCB9KTtcbiAgICBkZWJ1ZygnRG93bmxvYWRlZCBhZGRyZXNzICVzIGRldGFpbHM6ICVPJywgY3VycmVudEFkZHJlc3MsIGFkZHJlc3NEZXRhaWxzKTtcbiAgfVxuICByZXR1cm4gYWRkcmVzc0RldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ2hhbmdlT3B0aW9ucyB7XG4gIGtleXM6IFRyaXBsZTx7IHB1Yjogc3RyaW5nIH0+O1xuICBzaWduYXR1cmVzOiBUcmlwbGU8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZU91dHB1dE9wdGlvbnMge1xuICBjdXJyZW50T3V0cHV0OiBPdXRwdXQ7XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHZlcmlmaWNhdGlvbjogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAga2V5Y2hhaW5BcnJheTogVHJpcGxlPHsgcHViOiBzdHJpbmcgfT47XG4gIHdhbGxldDogSVdhbGxldDtcbiAgdHhQYXJhbXM6IHtcbiAgICByZWNpcGllbnRzOiBJVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICB9O1xuICBjdXN0b21DaGFuZ2U/OiBDdXN0b21DaGFuZ2VPcHRpb25zO1xuICByZXFJZD86IElSZXF1ZXN0VHJhY2VyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VPdXRwdXQoe1xuICBjdXJyZW50T3V0cHV0LFxuICBjb2luLFxuICB0eFByZWJ1aWxkLFxuICB2ZXJpZmljYXRpb24sXG4gIGtleWNoYWluQXJyYXksXG4gIHdhbGxldCxcbiAgdHhQYXJhbXMsXG4gIGN1c3RvbUNoYW5nZSxcbiAgcmVxSWQsXG59OiBQYXJzZU91dHB1dE9wdGlvbnMpOiBQcm9taXNlPE91dHB1dD4ge1xuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9ICEhdmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nO1xuICBjb25zdCBjdXJyZW50QWRkcmVzcyA9IGN1cnJlbnRPdXRwdXQuYWRkcmVzcztcblxuICBpZiAoY3VycmVudEFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGFkZHJlc3MgaXMgdW5kZWZpbmVkLCBpdCBtZWFucyB0aGF0IHRoZSBvdXRwdXQgaGFzIGEgbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5XG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGFtb3VudCBpcyAwIGFuZCB3ZSBjYW4gc2tpcCB0aGUgcmVzdC5cbiAgICBpZiAoY3VycmVudE91dHB1dC5hbW91bnQudG9TdHJpbmcoKSAhPT0gJzAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ291dHB1dCB3aXRoIHVuZGVmaW5lZCBhZGRyZXNzIG11c3QgaGF2ZSBhbW91bnQgb2YgMCcpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudE91dHB1dDtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gZ3JhYiB0aGUgYWRkcmVzcyBkZXRhaWxzIGZyb20gZWl0aGVyIHRoZSBwcmVidWlsdCB0eCwgb3IgdGhlIHZlcmlmaWNhdGlvbiBwYXJhbXMuXG4gIC8vIElmIGJvdGggb2YgdGhlc2UgYXJlIGVtcHR5LCB0aGVuIHdlIHdpbGwgdHJ5IHRvIGdldCB0aGUgYWRkcmVzcyBkZXRhaWxzIGZyb20gYml0Z28gaW5zdGVhZFxuICBjb25zdCBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkID0gXy5nZXQodHhQcmVidWlsZCwgYHR4SW5mby53YWxsZXRBZGRyZXNzRGV0YWlscy4ke2N1cnJlbnRBZGRyZXNzfWAsIHt9KTtcbiAgY29uc3QgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb246IEFkZHJlc3NWZXJpZmljYXRpb25EYXRhID0gdmVyaWZpY2F0aW9uPy5hZGRyZXNzZXM/LltjdXJyZW50QWRkcmVzc10gPz8ge307XG4gIGRlYnVnKCdQYXJzaW5nIGFkZHJlc3MgZGV0YWlscyBmb3IgJXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gIGxldCBjdXJyZW50QWRkcmVzc0RldGFpbHMgPSB1bmRlZmluZWQ7XG4gIGxldCBjdXJyZW50QWRkcmVzc1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgY29uc3QgUkVDSVBJRU5UX1RIUkVTSE9MRCA9IDEwMDA7XG4gIHRyeSB7XG4gICAgLy8gSW4gdGhlIGNhc2Ugb2YgUFNCVHMsIHdlIGNhbiBhbHJlYWR5IGRldGVybWluZSB0aGUgaW50ZXJuYWwvZXh0ZXJuYWwgc3RhdHVzIG9mIHRoZSBvdXRwdXQgYWRkcmVzc2VzXG4gICAgLy8gYmFzZWQgb24gdGhlIGRlcml2YXRpb24gaW5mb3JtYXRpb24gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIFBTQlQuIFdlIGNhbiBzaG9ydCBjaXJjdWl0IEdFVCB2Mi53YWxsZXQuYWRkcmVzc1xuICAgIC8vIGFuZCBzYXZlIG9uIG5ldHdvcmsgcmVxdWVzdHMuIFNpbmNlIHdlIGhhdmUgdGhlIGRlcml2YXRpb24gaW5mb3JtYXRpb24gYWxyZWFkeSwgd2UgY2FuIHN0aWxsIHZlcmlmeSB0aGUgYWRkcmVzc1xuICAgIGlmIChjdXJyZW50T3V0cHV0LmV4dGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBhIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0LCB3ZSBuZWVkIHRvIHZlcmlmeSB0aGUgYWRkcmVzcyBhZ2FpbnN0IHRoZSBjdXN0b20gY2hhbmdlIGtleXNcbiAgICAgIC8vIGFuZCBub3QgdGhlIHdhbGxldCBrZXlzLiBUaGlzIGNoZWNrIGlzIGRvbmUgaW4gdGhlIGhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvciBmdW5jdGlvbiBpZiB0aGlzIGVycm9yIGlzIHRocm93bi5cbiAgICAgIGlmIChjdXN0b21DaGFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcignYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlJyk7XG4gICAgICB9XG4gICAgICAvLyBJZiBpdCBpcyBhbiBpbnRlcm5hbCBhZGRyZXNzLCB3ZSBjYW4gc2tpcCB0aGUgbmV0d29yayByZXF1ZXN0IGFuZCBqdXN0IHZlcmlmeSB0aGUgYWRkcmVzcyBsb2NhbGx5IHdpdGggdGhlXG4gICAgICAvLyBkZXJpdmF0aW9uIGluZm9ybWF0aW9uIHdlIGhhdmUuIE90aGVyd2lzZSwgaWYgdGhlIGFkZHJlc3MgaXMgZXh0ZXJuYWwsIHdoaWNoIGlzIHRoZSBvbmx5IHJlbWFpbmluZyBjYXNlLCB3ZVxuICAgICAgLy8gY2FuIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IG91dHB1dCBhcyBpcyB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIHNlcnZlci5cbiAgICAgIGlmIChpc1dhbGxldE91dHB1dChjdXJyZW50T3V0cHV0KSkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjb2luLmlzV2FsbGV0QWRkcmVzcyh7XG4gICAgICAgICAgYWRkcmVzc1R5cGU6IEFic3RyYWN0VXR4b0NvaW4uaW5mZXJBZGRyZXNzVHlwZSh7IGNoYWluOiBjdXJyZW50T3V0cHV0LmNoYWluIH0pIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBrZXljaGFpbnM6IGtleWNoYWluQXJyYXksXG4gICAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICAgICAgY2hhaW46IGN1cnJlbnRPdXRwdXQuY2hhaW4sXG4gICAgICAgICAgaW5kZXg6IGN1cnJlbnRPdXRwdXQuaW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50T3V0cHV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBrbm93biBvbiB0aGUgd2FsbGV0IGlzIHRvIGluaXRpYXRlIGEgbmV0d29yayByZXF1ZXN0IGFuZFxuICAgICAqIGZldGNoIGl0LiBTaG91bGQgdGhlIHJlcXVlc3QgZmFpbCBhbmQgcmV0dXJuIGEgNDA0LCBpdCB3aWxsIHRocm93IGFuZCB0aGVyZWZvcmUgaGFzIHRvIGJlIGNhdWdodC4gRm9yIHRoYXRcbiAgICAgKiByZWFzb24sIGFkZHJlc3Mgd2FsbGV0IG93bmVyc2hpcCBkZXRlY3Rpb24gaXMgd3JhcHBlZCBpbiBhIHRyeS9jYXRjaC4gQWRkaXRpb25hbGx5LCBvbmNlIHRoZSBhZGRyZXNzXG4gICAgICogZGV0YWlscyBhcmUgZmV0Y2hlZCBvbiB0aGUgd2FsbGV0LCBhIGxvY2FsIGFkZHJlc3MgdmFsaWRhdGlvbiBpcyBydW4sIHdob3NlIGVycm9ycyBob3dldmVyIGFyZSBnZW5lcmF0ZWRcbiAgICAgKiBjbGllbnQtc2lkZSBhbmQgY2FuIHRoZXJlZm9yZSBiZSBhbmFseXplZCB3aXRoIG1vcmUgZ3JhbnVsYXJpdHkgYW5kIHR5cGUgY2hlY2tpbmcuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBJbiBvcmRlciB0byBtaW5pbWl6ZSBBUEkgcmVxdWVzdHMsIHdlIGFzc3VtZSB0aGF0IGV4cGxpY2l0IHJlY2lwaWVudHMgYXJlIGFsd2F5cyBleHRlcm5hbCB3aGVuIHRoZVxuICAgICAqIHJlY2lwaWVudCBsaXN0IGlzID4gMTAwMCBUaGlzIGlzIG5vdCBhbHdheXMgYSB2YWxpZCBhc3N1bXB0aW9uIGFuZCBjb3VsZCBsZWFkIGdyZWF0ZXIgYXBwYXJlbnQgc3BlbmQgKGJ1dCBuZXZlciBsb3dlcilcbiAgICAgKi9cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkICYmIHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gUkVDSVBJRU5UX1RIUkVTSE9MRCkge1xuICAgICAgY29uc3QgaXNDdXJyZW50QWRkcmVzc0luUmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHMuc29tZSgocmVjaXBpZW50KSA9PlxuICAgICAgICByZWNpcGllbnQuYWRkcmVzcy5pbmNsdWRlcyhjdXJyZW50QWRkcmVzcylcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc0N1cnJlbnRBZGRyZXNzSW5SZWNpcGllbnRzKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmN1cnJlbnRPdXRwdXQgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IGF3YWl0IGZldGNoQWRkcmVzc0RldGFpbHMoe1xuICAgICAgcmVxSWQsXG4gICAgICBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbixcbiAgICAgIGFkZHJlc3NEZXRhaWxzUHJlYnVpbGQsXG4gICAgICBjdXJyZW50QWRkcmVzcyxcbiAgICAgIGRpc2FibGVOZXR3b3JraW5nLFxuICAgICAgd2FsbGV0LFxuICAgIH0pO1xuICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhZGRyZXNzIGlzIG9uIHRoZSB3YWxsZXQuIHZlcmlmeUFkZHJlc3MgdGhyb3dzIGlmXG4gICAgLy8gaXQgZmFpbHMgdG8gY29ycmVjdGx5IHJlZGVyaXZlIHRoZSBhZGRyZXNzLCBtZWFuaW5nIGl0J3MgZXh0ZXJuYWxcbiAgICBjdXJyZW50QWRkcmVzc1R5cGUgPSBBYnN0cmFjdFV0eG9Db2luLmluZmVyQWRkcmVzc1R5cGUoYWRkcmVzc0RldGFpbHMpIHx8IHVuZGVmaW5lZDtcbiAgICBjdXJyZW50QWRkcmVzc0RldGFpbHMgPSBhZGRyZXNzRGV0YWlscztcbiAgICBhd2FpdCBjb2luLnZlcmlmeUFkZHJlc3MoXG4gICAgICBfLmV4dGVuZCh7IGFkZHJlc3NUeXBlOiBjdXJyZW50QWRkcmVzc1R5cGUgfSwgYWRkcmVzc0RldGFpbHMsIHtcbiAgICAgICAga2V5Y2hhaW5zOiBrZXljaGFpbkFycmF5LFxuICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyB2ZXJpZmljYXRpb24gcGFzc2VkJywgY3VycmVudEFkZHJlc3MpO1xuXG4gICAgLy8gdmVyaWZ5IGFkZHJlc3Mgc3VjY2VlZGVkIHdpdGhvdXQgdGhyb3dpbmcsIHNvIHRoZSBhZGRyZXNzIHdhc1xuICAgIC8vIGNvcnJlY3RseSByZWRlcml2ZWQgZnJvbSB0aGUgd2FsbGV0IGtleWNoYWlucywgbWFraW5nIGl0IG5vdCBleHRlcm5hbFxuICAgIHJldHVybiBfLmV4dGVuZCh7fSwgY3VycmVudE91dHB1dCwgYWRkcmVzc0RldGFpbHMsIHsgZXh0ZXJuYWw6IGZhbHNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGVidWcoJ0FkZHJlc3MgJXMgdmVyaWZpY2F0aW9uIHRocmV3IGFuIGVycm9yOicsIGN1cnJlbnRBZGRyZXNzLCBlKTtcbiAgICByZXR1cm4gXy5leHRlbmQoXG4gICAgICB7fSxcbiAgICAgIGN1cnJlbnRPdXRwdXQsXG4gICAgICBhd2FpdCBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICAgICAgICBlLFxuICAgICAgICBjb2luLFxuICAgICAgICBjdXJyZW50QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5czogY3VzdG9tQ2hhbmdlICYmIGN1c3RvbUNoYW5nZS5rZXlzLFxuICAgICAgICBhZGRyZXNzRGV0YWlsczogY3VycmVudEFkZHJlc3NEZXRhaWxzLFxuICAgICAgICBhZGRyZXNzVHlwZTogY3VycmVudEFkZHJlc3NUeXBlLFxuICAgICAgICBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbDogdmVyaWZpY2F0aW9uLmNvbnNpZGVyTWlncmF0ZWRGcm9tQWRkcmVzc0ludGVybmFsLFxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvcGFyc2VPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxRQUFRLE1BQU0sT0FBTyxDQUFDO0FBQzdCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBR0wscUNBQXFDLEVBR3JDLHNCQUFzQixHQUl2QixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBVSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQU8vQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE1BQWUsRUFBRSxjQUFzQjtJQUNoRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ2xGLEtBQUssQ0FBQyw2RUFBNkUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNyRyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFVRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLHlCQUF5QixDQUFDLE1BQXdDO0lBQy9FLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDdkYsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxjQUFjLEVBQUU7WUFDeEMsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixPQUFPLEVBQUUsY0FBYztTQUN4QixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsS0FBSyxDQUFDLDJDQUEyQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFnQkQsS0FBSyxVQUFVLHdCQUF3QixDQUFDLEVBQ3RDLENBQUMsRUFDRCxjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsSUFBSSxFQUNKLGNBQWMsRUFDZCxXQUFXLEVBQ1gsbUNBQW1DLEdBQ0g7SUFDaEMsMEVBQTBFO0lBQzFFLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3RSxNQUFNLGlCQUFpQixHQUFHLENBQUMsWUFBWSxzQkFBc0IsQ0FBQztJQUM5RCxJQUFJLHFCQUFxQixJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDL0MsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDaEQsMkVBQTJFO1lBQzNFLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztZQUM3RCxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE9BQU8sRUFBRSxRQUFRLEVBQUUsbUNBQW1DLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDckUsQ0FBQztZQUVELEtBQUssQ0FBQywrREFBK0QsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUV2RixvR0FBb0c7WUFDcEcsSUFDRSxnQkFBZ0I7Z0JBQ2hCLENBQUMsTUFBTSx5QkFBeUIsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFDMUcsQ0FBQztnQkFDRCxnRkFBZ0Y7Z0JBQ2hGLGdFQUFnRTtnQkFDaEUsS0FBSyxDQUFDLDREQUE0RCxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNwRixPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSx5Q0FBeUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5RSxDQUFDO1FBQ0gsQ0FBQztRQUVELGlGQUFpRjtRQUNqRixLQUFLLENBQUMsOEJBQThCLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO1NBQU0sSUFBSSxDQUFDLFlBQVkscUNBQXFDLElBQUksY0FBYyxLQUFLLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzRyx5RkFBeUY7UUFDekYsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMzRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsQ0FBQztBQUNWLENBQUM7QUFXRCxLQUFLLFVBQVUsbUJBQW1CLENBQUMsRUFDakMsS0FBSyxFQUNMLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsMEJBQTBCLEVBQzFCLGNBQWMsRUFDZCxNQUFNLEdBQ3FCO0lBQzNCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLHNCQUFzQixFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDdEYsS0FBSyxDQUFDLDBDQUEwQyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3BELGNBQWMsR0FBRyxNQUFNLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0UsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQXNCRCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxFQUNoQyxhQUFhLEVBQ2IsSUFBSSxFQUNKLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLE1BQU0sRUFDTixRQUFRLEVBQ1IsWUFBWSxFQUNaLEtBQUssR0FDYztJQUNuQixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUM7SUFDM0QsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUU3QyxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNqQyx3R0FBd0c7UUFDeEcsNEZBQTRGO1FBQzVGLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwrRkFBK0Y7SUFDL0YsNkZBQTZGO0lBQzdGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsK0JBQStCLGNBQWMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLE1BQU0sMEJBQTBCLEdBQTRCLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUcsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hELElBQUkscUJBQXFCLEdBQUcsU0FBUyxDQUFDO0lBQ3RDLElBQUksa0JBQWtCLEdBQXVCLFNBQVMsQ0FBQztJQUN2RCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUNqQyxJQUFJLENBQUM7UUFDSCxzR0FBc0c7UUFDdEcsNkdBQTZHO1FBQzdHLGtIQUFrSDtRQUNsSCxJQUFJLGFBQWEsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekMsZ0hBQWdIO1lBQ2hILGdIQUFnSDtZQUNoSCxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLHNCQUFzQixDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUNELDZHQUE2RztZQUM3Ryw4R0FBOEc7WUFDOUcsMEVBQTBFO1lBQzFFLElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQztvQkFDckMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLFNBQVM7b0JBQzNGLFNBQVMsRUFBRSxhQUFhO29CQUN4QixPQUFPLEVBQUUsY0FBYztvQkFDdkIsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO29CQUMxQixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7aUJBQzNCLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ1QsTUFBTSxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUNEOzs7Ozs7V0FNRztRQUVIOzs7V0FHRztRQUNILElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztZQUMxRixNQUFNLDRCQUE0QixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDMUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQzNDLENBQUM7WUFFRixJQUFJLDRCQUE0QixFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztZQUMvQyxLQUFLO1lBQ0wsMEJBQTBCO1lBQzFCLHNCQUFzQjtZQUN0QixjQUFjO1lBQ2QsaUJBQWlCO1lBQ2pCLE1BQU07U0FDUCxDQUFDLENBQUM7UUFDSCxvRUFBb0U7UUFDcEUsb0VBQW9FO1FBQ3BFLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUNwRixxQkFBcUIsR0FBRyxjQUFjLENBQUM7UUFDdkMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUN0QixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsY0FBYyxFQUFFO1lBQzVELFNBQVMsRUFBRSxhQUFhO1lBQ3hCLE9BQU8sRUFBRSxjQUFjO1NBQ3hCLENBQUMsQ0FDSCxDQUFDO1FBQ0YsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXhELGdFQUFnRTtRQUNoRSx3RUFBd0U7UUFDeEUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxLQUFLLENBQUMseUNBQXlDLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDYixFQUFFLEVBQ0YsYUFBYSxFQUNiLE1BQU0sd0JBQXdCLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUk7WUFDSixjQUFjO1lBQ2QsTUFBTTtZQUNOLFFBQVE7WUFDUixnQkFBZ0IsRUFBRSxZQUFZLElBQUksWUFBWSxDQUFDLElBQUk7WUFDbkQsY0FBYyxFQUFFLHFCQUFxQjtZQUNyQyxXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLG1DQUFtQyxFQUFFLFlBQVksQ0FBQyxtQ0FBbUM7U0FDdEYsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkZWJ1Z0xpYiBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQWRkcmVzc1ZlcmlmaWNhdGlvbkRhdGEsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yLFxuICBJV2FsbGV0LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yLFxuICBWZXJpZmljYXRpb25PcHRpb25zLFxuICBJVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyaXBsZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBPdXRwdXQsIGlzV2FsbGV0T3V0cHV0IH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RVdHhvQ29pbic7XG5cbmNvbnN0IGRlYnVnID0gZGVidWdMaWIoJ2JpdGdvOnYyOnBhcnNlb3V0cHV0Jyk7XG5cbmludGVyZmFjZSBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JSZXNwb25zZSB7XG4gIGV4dGVybmFsOiBib29sZWFuO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hlY2sgYW4gYWRkcmVzcyB3aGljaCBmYWlsZWQgaW5pdGlhbCB2YWxpZGF0aW9uIHRvIHNlZSBpZiBpdCdzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBtaWdyYXRlZCB2MSBiY2ggd2FsbGV0LlxuICpcbiAqIFRoZSB3YWxsZXQgaW4gcXVlc3Rpb24gY291bGQgYmUgYSBtaWdyYXRlZCBTYWZlSEQgQkNIIHdhbGxldCwgYW5kIHRoZSB0cmFuc2FjdGlvbiB3ZVxuICogYXJlIGN1cnJlbnRseSBwYXJzaW5nIGlzIHRyeWluZyB0byBzcGVuZCBjaGFuZ2UgYmFjayB0byB0aGUgdjEgd2FsbGV0IGJhc2UgYWRkcmVzcy5cbiAqXG4gKiBJdCBkb2VzIHRoaXMgc2luY2Ugd2UgZG9uJ3QgYWxsb3cgbmV3IGFkZHJlc3MgY3JlYXRpb24gZm9yIHRoZXNlIHdhbGxldHMsXG4gKiBhbmQgaW5zdGVhZCByZXR1cm4gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHRoZSB2MSB3YWxsZXQgd2hlbiBhIG5ldyBhZGRyZXNzIGlzIHJlcXVlc3RlZC5cbiAqIElmIHRoaXMgbmV3IGFkZHJlc3MgaXMgcmVxdWVzdGVkIGZvciB0aGUgcHVycG9zZXMgb2Ygc3BlbmRpbmcgY2hhbmdlIGJhY2sgdG8gdGhlIHdhbGxldCxcbiAqIHRoZSBjaGFuZ2Ugd2lsbCBnbyB0byB0aGUgdjEgd2FsbGV0IGJhc2UgYWRkcmVzcy4gVGhpcyBhZGRyZXNzICppcyogb24gdGhlIHdhbGxldCxcbiAqIGJ1dCBpdCB3aWxsIHN0aWxsIGNhdXNlIGFuIGVycm9yIHRvIGJlIHRocm93biBieSB2ZXJpZnlBZGRyZXNzLCBzaW5jZSB0aGUgZGVyaXZhdGlvbiBwYXRoXG4gKiB1c2VkIGZvciB0aGlzIGFkZHJlc3MgaXMgbm9uLXN0YW5kYXJkLiAoSSBoYXZlIHNlZW4gdGhlc2UgYWRkcmVzc2VzIGRlcml2ZWQgdXNpbmcgcGF0aHMgbS8wLzAgYW5kIG0vMTAxLFxuICogd2hlcmVhcyB0aGUgdjIgYWRkcmVzc2VzIGFyZSBkZXJpdmVkIHVzaW5nIHBhdGggIG0vMC8wLyR7Y2hhaW59LyR7aW5kZXh9KS5cbiAqXG4gKiBUaGlzIG1lYW5zIHdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoaXMgY2FzZSBleHBsaWNpdGx5IGluIHRoaXMgY2F0Y2ggYmxvY2ssIGFuZCBjbGFzc2lmeVxuICogdGhlc2UgdHlwZXMgb2Ygb3V0cHV0cyBhcyBpbnRlcm5hbCBpbnN0ZWFkIG9mIGV4dGVybmFsLiBGYWlsaW5nIHRvIGRvIHNvIHdvdWxkIGNhdXNlIHRoZVxuICogdHJhbnNhY3Rpb24ncyBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIChpZSwgb3V0cHV0cyB3aGljaCBnbyB0byBhZGRyZXNzZXMgbm90IHNwZWNpZmllZCBpblxuICogdGhlIHJlY2lwaWVudHMgYXJyYXkpIHRvIGFkZCB1cCB0byBtb3JlIHRoYW4gdGhlIDE1MCBiYXNpcyBwb2ludCBsaW1pdCB3aGljaCB3ZSBlbmZvcmNlIG9uXG4gKiBwYXktYXMteW91LWdvIG91dHB1dHMgKHdoaWNoIHNob3VsZCBiZSB0aGUgb25seSBpbXBsaWNpdCBleHRlcm5hbCBvdXRwdXRzIG9uIG91ciB0cmFuc2FjdGlvbnMpLlxuICpcbiAqIFRoZSAxNTAgYmFzaXMgcG9pbnQgbGltaXQgZm9yIGltcGxpY2l0IGV4dGVybmFsIHNlbmRzIGlzIGVuZm9yY2VkIGluIHZlcmlmeVRyYW5zYWN0aW9uLFxuICogd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBnZXQgaW5mb3JtYXRpb24gb24gdGhlIHRvdGFsIGV4dGVybmFsL2ludGVybmFsIHNwZW5kIGFtb3VudHNcbiAqIGZvciBhIHRyYW5zYWN0aW9uLiBUaGUgaWRlYSBoZXJlIGlzIHRvIHByb3RlY3QgZnJvbSB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgbWFsaWNpb3VzbHkgbW9kaWZpZWRcbiAqIHRvIGFkZCBtb3JlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kcyAoZWcsIHRvIGFuIGF0dGFja2VyLWNvbnRyb2xsZWQgd2FsbGV0KS5cbiAqXG4gKiBTZWUgdmVyaWZ5VHJhbnNhY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRyYW5zYWN0aW9uIHByZWJ1aWxkcyBhcmUgdmVyaWZpZWQgYmVmb3JlIHNpZ25pbmcuXG4gKlxuICogQHBhcmFtIHdhbGxldCB7V2FsbGV0fSB3YWxsZXQgd2hpY2ggaXMgbWFraW5nIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIGN1cnJlbnRBZGRyZXNzIHtzdHJpbmd9IGFkZHJlc3MgdG8gY2hlY2sgZm9yIGV4dGVybmFsaXR5IHJlbGF0aXZlIHRvIHYxIHdhbGxldCBiYXNlIGFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gaXNNaWdyYXRlZEFkZHJlc3Mod2FsbGV0OiBJV2FsbGV0LCBjdXJyZW50QWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChfLmlzU3RyaW5nKHdhbGxldC5taWdyYXRlZEZyb20oKSkgJiYgd2FsbGV0Lm1pZ3JhdGVkRnJvbSgpID09PSBjdXJyZW50QWRkcmVzcykge1xuICAgIGRlYnVnKCdmb3VuZCBhZGRyZXNzICVzIHdoaWNoIHdhcyBtaWdyYXRlZCBmcm9tIHYxIHdhbGxldCwgYWRkcmVzcyBpcyBub3QgZXh0ZXJuYWwnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmludGVyZmFjZSBWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9ucyB7XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIGN1c3RvbUNoYW5nZUtleXM6IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnNbJ2N1c3RvbUNoYW5nZUtleXMnXTtcbiAgYWRkcmVzc1R5cGU6IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnNbJ2FkZHJlc3NUeXBlJ107XG4gIGFkZHJlc3NEZXRhaWxzOiBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zWydhZGRyZXNzRGV0YWlscyddO1xuICBjdXJyZW50QWRkcmVzczogSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yT3B0aW9uc1snY3VycmVudEFkZHJlc3MnXTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgYW4gYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGN1c3RvbSBjaGFuZ2Uga2V5c1xuICogQHBhcmFtIHtWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzKHBhcmFtczogVmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBjb2luLCBjdXN0b21DaGFuZ2VLZXlzLCBhZGRyZXNzVHlwZSwgYWRkcmVzc0RldGFpbHMsIGN1cnJlbnRBZGRyZXNzIH0gPSBwYXJhbXM7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvaW4udmVyaWZ5QWRkcmVzcyhcbiAgICAgIF8uZXh0ZW5kKHsgYWRkcmVzc1R5cGUgfSwgYWRkcmVzc0RldGFpbHMsIHtcbiAgICAgICAga2V5Y2hhaW5zOiBjdXN0b21DaGFuZ2VLZXlzLFxuICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IGN1c3RvbSBjaGFuZ2UgYWRkcmVzcyAlcycsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnMge1xuICBlOiBFcnJvcjtcbiAgY3VycmVudEFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBJV2FsbGV0O1xuICB0eFBhcmFtczoge1xuICAgIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG4gIH07XG4gIGN1c3RvbUNoYW5nZUtleXM/OiBDdXN0b21DaGFuZ2VPcHRpb25zWydrZXlzJ107XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIGFkZHJlc3NEZXRhaWxzPzogYW55O1xuICBhZGRyZXNzVHlwZT86IHN0cmluZztcbiAgY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICBlLFxuICBjdXJyZW50QWRkcmVzcyxcbiAgd2FsbGV0LFxuICB0eFBhcmFtcyxcbiAgY3VzdG9tQ2hhbmdlS2V5cyxcbiAgY29pbixcbiAgYWRkcmVzc0RldGFpbHMsXG4gIGFkZHJlc3NUeXBlLFxuICBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbCxcbn06IEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvck9wdGlvbnMpOiBQcm9taXNlPEhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvclJlc3BvbnNlPiB7XG4gIC8vIFRvZG86IG5hbWUgc2VydmVyLXNpZGUgZXJyb3JzIHRvIGF2b2lkIG1lc3NhZ2UtYmFzZWQgY2hlY2tpbmcgW0JHLTUxMjRdXG4gIGNvbnN0IHdhbGxldEFkZHJlc3NOb3RGb3VuZCA9IGUubWVzc2FnZS5pbmNsdWRlcygnd2FsbGV0IGFkZHJlc3Mgbm90IGZvdW5kJyk7XG4gIGNvbnN0IHVuZXhwZWN0ZWRBZGRyZXNzID0gZSBpbnN0YW5jZW9mIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3I7XG4gIGlmICh3YWxsZXRBZGRyZXNzTm90Rm91bmQgfHwgdW5leHBlY3RlZEFkZHJlc3MpIHtcbiAgICBpZiAodW5leHBlY3RlZEFkZHJlc3MgJiYgIXdhbGxldEFkZHJlc3NOb3RGb3VuZCkge1xuICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBtaWdyYXRlZCB2MSBiY2ggYWRkcmVzcyAtIGl0IGNvdWxkIGJlIGludGVybmFsXG4gICAgICBjb25zdCBpc01pZ3JhdGVkID0gaXNNaWdyYXRlZEFkZHJlc3Mod2FsbGV0LCBjdXJyZW50QWRkcmVzcyk7XG4gICAgICBpZiAoaXNNaWdyYXRlZCkge1xuICAgICAgICByZXR1cm4geyBleHRlcm5hbDogY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWwgPT09IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGRlYnVnKCdBZGRyZXNzICVzIHdhcyBmb3VuZCBvbiB3YWxsZXQgYnV0IGNvdWxkIG5vdCBiZSByZWNvbnN0cnVjdGVkJywgY3VycmVudEFkZHJlc3MpO1xuXG4gICAgICAvLyBhdHRlbXB0IHRvIHZlcmlmeSBhZGRyZXNzIHVzaW5nIGN1c3RvbSBjaGFuZ2UgYWRkcmVzcyBrZXlzIGlmIHRoZSB3YWxsZXQgaGFzIHRoYXQgZmVhdHVyZSBlbmFibGVkXG4gICAgICBpZiAoXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMgJiZcbiAgICAgICAgKGF3YWl0IHZlcmlmeUN1c3RvbUNoYW5nZUFkZHJlc3MoeyBjb2luLCBhZGRyZXNzRGV0YWlscywgYWRkcmVzc1R5cGUsIGN1cnJlbnRBZGRyZXNzLCBjdXN0b21DaGFuZ2VLZXlzIH0pKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGFkZHJlc3MgaXMgdmFsaWQgYWdhaW5zdCB0aGUgY3VzdG9tIGNoYW5nZSBrZXlzLiBNYXJrIGFkZHJlc3MgYXMgbm90IGV4dGVybmFsXG4gICAgICAgIC8vIGFuZCByZXF1ZXN0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHRoZSBjdXN0b20gY2hhbmdlIGtleXNcbiAgICAgICAgZGVidWcoJ0FkZHJlc3MgJXMgdmVyaWZpZWQgYXMgZGVyaXZlZCBmcm9tIHRoZSBjdXN0b20gY2hhbmdlIGtleXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgICAgIHJldHVybiB7IGV4dGVybmFsOiBmYWxzZSwgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb246IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGUgYWRkcmVzcyB3YXMgZm91bmQsIGJ1dCBub3Qgb24gdGhlIHdhbGxldCwgd2hpY2ggc2ltcGx5IG1lYW5zIGl0J3MgZXh0ZXJuYWxcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyBwcmVzdW1lZCBleHRlcm5hbCcsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICByZXR1cm4geyBleHRlcm5hbDogdHJ1ZSB9O1xuICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yICYmIGN1cnJlbnRBZGRyZXNzID09PSB0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzKSB7XG4gICAgLy8gZXhwZWN0IHRvIHNlZSB0aGlzIGVycm9yIHdoZW4gcGFzc2luZyBpbiBhIGN1c3RvbSBjaGFuZ2VBZGRyZXNzIHdpdGggbm8gY2hhaW4gb3IgaW5kZXhcbiAgICByZXR1cm4geyBleHRlcm5hbDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0FkZHJlc3MgY2xhc3NpZmljYXRpb24gZmFpbGVkIGZvciBhZGRyZXNzJywgY3VycmVudEFkZHJlc3MpO1xuICBjb25zb2xlLnRyYWNlKGUpO1xuICAvKipcbiAgICogSXQgbWlnaHQgYmUgYSBjb21wbGV0ZWx5IGludmFsaWQgYWRkcmVzcyBvciBhIGJhZCB2YWxpZGF0aW9uIGF0dGVtcHQgb3Igc29tZXRoaW5nIGVsc2UgY29tcGxldGVseSwgaW5cbiAgICogd2hpY2ggY2FzZSB3ZSBkbyBub3QgcHJvY2VlZCBhbmQgcmF0aGVyIHJldGhyb3cgdGhlIGVycm9yLCB3aGljaCBpcyBzYWZlciB0aGFuIGFzc3VtaW5nIHRoYXQgdGhlIGFkZHJlc3NcbiAgICogdmFsaWRhdGlvbiBmYWlsZWQgc2ltcGx5IGJlY2F1c2UgaXQncyBleHRlcm5hbCB0byB0aGUgd2FsbGV0LlxuICAgKi9cbiAgdGhyb3cgZTtcbn1cblxuaW50ZXJmYWNlIEZldGNoQWRkcmVzc0RldGFpbHNPcHRpb25zIHtcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbiAgZGlzYWJsZU5ldHdvcmtpbmc6IGJvb2xlYW47XG4gIGFkZHJlc3NEZXRhaWxzUHJlYnVpbGQ6IGFueTtcbiAgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb246IGFueTtcbiAgY3VycmVudEFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBJV2FsbGV0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEFkZHJlc3NEZXRhaWxzKHtcbiAgcmVxSWQsXG4gIGRpc2FibGVOZXR3b3JraW5nLFxuICBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLFxuICBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbixcbiAgY3VycmVudEFkZHJlc3MsXG4gIHdhbGxldCxcbn06IEZldGNoQWRkcmVzc0RldGFpbHNPcHRpb25zKSB7XG4gIGxldCBhZGRyZXNzRGV0YWlscyA9IF8uZXh0ZW5kKHt9LCBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkLCBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbik7XG4gIGRlYnVnKCdMb2NhbGx5IGF2YWlsYWJsZSBhZGRyZXNzICVzIGRldGFpbHM6ICVPJywgY3VycmVudEFkZHJlc3MsIGFkZHJlc3NEZXRhaWxzKTtcbiAgaWYgKF8uaXNFbXB0eShhZGRyZXNzRGV0YWlscykgJiYgIWRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgYWRkcmVzc0RldGFpbHMgPSBhd2FpdCB3YWxsZXQuZ2V0QWRkcmVzcyh7IGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLCByZXFJZCB9KTtcbiAgICBkZWJ1ZygnRG93bmxvYWRlZCBhZGRyZXNzICVzIGRldGFpbHM6ICVPJywgY3VycmVudEFkZHJlc3MsIGFkZHJlc3NEZXRhaWxzKTtcbiAgfVxuICByZXR1cm4gYWRkcmVzc0RldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ2hhbmdlT3B0aW9ucyB7XG4gIGtleXM6IFRyaXBsZTx7IHB1Yjogc3RyaW5nIH0+O1xuICBzaWduYXR1cmVzOiBUcmlwbGU8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZU91dHB1dE9wdGlvbnMge1xuICBjdXJyZW50T3V0cHV0OiBPdXRwdXQ7XG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW47XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHZlcmlmaWNhdGlvbjogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAga2V5Y2hhaW5BcnJheTogVHJpcGxlPHsgcHViOiBzdHJpbmcgfT47XG4gIHdhbGxldDogSVdhbGxldDtcbiAgdHhQYXJhbXM6IHtcbiAgICByZWNpcGllbnRzOiBJVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICB9O1xuICBjdXN0b21DaGFuZ2U/OiBDdXN0b21DaGFuZ2VPcHRpb25zO1xuICByZXFJZD86IElSZXF1ZXN0VHJhY2VyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VPdXRwdXQoe1xuICBjdXJyZW50T3V0cHV0LFxuICBjb2luLFxuICB0eFByZWJ1aWxkLFxuICB2ZXJpZmljYXRpb24sXG4gIGtleWNoYWluQXJyYXksXG4gIHdhbGxldCxcbiAgdHhQYXJhbXMsXG4gIGN1c3RvbUNoYW5nZSxcbiAgcmVxSWQsXG59OiBQYXJzZU91dHB1dE9wdGlvbnMpOiBQcm9taXNlPE91dHB1dD4ge1xuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9ICEhdmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nO1xuICBjb25zdCBjdXJyZW50QWRkcmVzcyA9IGN1cnJlbnRPdXRwdXQuYWRkcmVzcztcblxuICBpZiAoY3VycmVudEFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGFkZHJlc3MgaXMgdW5kZWZpbmVkLCBpdCBtZWFucyB0aGF0IHRoZSBvdXRwdXQgaGFzIGEgbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5XG4gICAgLy8gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGFtb3VudCBpcyAwIGFuZCB3ZSBjYW4gc2tpcCB0aGUgcmVzdC5cbiAgICBpZiAoY3VycmVudE91dHB1dC5hbW91bnQudG9TdHJpbmcoKSAhPT0gJzAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ291dHB1dCB3aXRoIHVuZGVmaW5lZCBhZGRyZXNzIG11c3QgaGF2ZSBhbW91bnQgb2YgMCcpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudE91dHB1dDtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gZ3JhYiB0aGUgYWRkcmVzcyBkZXRhaWxzIGZyb20gZWl0aGVyIHRoZSBwcmVidWlsdCB0eCwgb3IgdGhlIHZlcmlmaWNhdGlvbiBwYXJhbXMuXG4gIC8vIElmIGJvdGggb2YgdGhlc2UgYXJlIGVtcHR5LCB0aGVuIHdlIHdpbGwgdHJ5IHRvIGdldCB0aGUgYWRkcmVzcyBkZXRhaWxzIGZyb20gYml0Z28gaW5zdGVhZFxuICBjb25zdCBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkID0gXy5nZXQodHhQcmVidWlsZCwgYHR4SW5mby53YWxsZXRBZGRyZXNzRGV0YWlscy4ke2N1cnJlbnRBZGRyZXNzfWAsIHt9KTtcbiAgY29uc3QgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb246IEFkZHJlc3NWZXJpZmljYXRpb25EYXRhID0gdmVyaWZpY2F0aW9uPy5hZGRyZXNzZXM/LltjdXJyZW50QWRkcmVzc10gPz8ge307XG4gIGRlYnVnKCdQYXJzaW5nIGFkZHJlc3MgZGV0YWlscyBmb3IgJXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gIGxldCBjdXJyZW50QWRkcmVzc0RldGFpbHMgPSB1bmRlZmluZWQ7XG4gIGxldCBjdXJyZW50QWRkcmVzc1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgY29uc3QgUkVDSVBJRU5UX1RIUkVTSE9MRCA9IDEwMDA7XG4gIHRyeSB7XG4gICAgLy8gSW4gdGhlIGNhc2Ugb2YgUFNCVHMsIHdlIGNhbiBhbHJlYWR5IGRldGVybWluZSB0aGUgaW50ZXJuYWwvZXh0ZXJuYWwgc3RhdHVzIG9mIHRoZSBvdXRwdXQgYWRkcmVzc2VzXG4gICAgLy8gYmFzZWQgb24gdGhlIGRlcml2YXRpb24gaW5mb3JtYXRpb24gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIFBTQlQuIFdlIGNhbiBzaG9ydCBjaXJjdWl0IEdFVCB2Mi53YWxsZXQuYWRkcmVzc1xuICAgIC8vIGFuZCBzYXZlIG9uIG5ldHdvcmsgcmVxdWVzdHMuIFNpbmNlIHdlIGhhdmUgdGhlIGRlcml2YXRpb24gaW5mb3JtYXRpb24gYWxyZWFkeSwgd2UgY2FuIHN0aWxsIHZlcmlmeSB0aGUgYWRkcmVzc1xuICAgIGlmIChjdXJyZW50T3V0cHV0LmV4dGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgd2UgaGF2ZSBhIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0LCB3ZSBuZWVkIHRvIHZlcmlmeSB0aGUgYWRkcmVzcyBhZ2FpbnN0IHRoZSBjdXN0b20gY2hhbmdlIGtleXNcbiAgICAgIC8vIGFuZCBub3QgdGhlIHdhbGxldCBrZXlzLiBUaGlzIGNoZWNrIGlzIGRvbmUgaW4gdGhlIGhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvciBmdW5jdGlvbiBpZiB0aGlzIGVycm9yIGlzIHRocm93bi5cbiAgICAgIGlmIChjdXN0b21DaGFuZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcignYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlJyk7XG4gICAgICB9XG4gICAgICAvLyBJZiBpdCBpcyBhbiBpbnRlcm5hbCBhZGRyZXNzLCB3ZSBjYW4gc2tpcCB0aGUgbmV0d29yayByZXF1ZXN0IGFuZCBqdXN0IHZlcmlmeSB0aGUgYWRkcmVzcyBsb2NhbGx5IHdpdGggdGhlXG4gICAgICAvLyBkZXJpdmF0aW9uIGluZm9ybWF0aW9uIHdlIGhhdmUuIE90aGVyd2lzZSwgaWYgdGhlIGFkZHJlc3MgaXMgZXh0ZXJuYWwsIHdoaWNoIGlzIHRoZSBvbmx5IHJlbWFpbmluZyBjYXNlLCB3ZVxuICAgICAgLy8gY2FuIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IG91dHB1dCBhcyBpcyB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIHNlcnZlci5cbiAgICAgIGlmIChpc1dhbGxldE91dHB1dChjdXJyZW50T3V0cHV0KSkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjb2luLmlzV2FsbGV0QWRkcmVzcyh7XG4gICAgICAgICAgYWRkcmVzc1R5cGU6IEFic3RyYWN0VXR4b0NvaW4uaW5mZXJBZGRyZXNzVHlwZSh7IGNoYWluOiBjdXJyZW50T3V0cHV0LmNoYWluIH0pIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICBrZXljaGFpbnM6IGtleWNoYWluQXJyYXksXG4gICAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICAgICAgY2hhaW46IGN1cnJlbnRPdXRwdXQuY2hhaW4sXG4gICAgICAgICAgaW5kZXg6IGN1cnJlbnRPdXRwdXQuaW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50T3V0cHV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgb25seSB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBrbm93biBvbiB0aGUgd2FsbGV0IGlzIHRvIGluaXRpYXRlIGEgbmV0d29yayByZXF1ZXN0IGFuZFxuICAgICAqIGZldGNoIGl0LiBTaG91bGQgdGhlIHJlcXVlc3QgZmFpbCBhbmQgcmV0dXJuIGEgNDA0LCBpdCB3aWxsIHRocm93IGFuZCB0aGVyZWZvcmUgaGFzIHRvIGJlIGNhdWdodC4gRm9yIHRoYXRcbiAgICAgKiByZWFzb24sIGFkZHJlc3Mgd2FsbGV0IG93bmVyc2hpcCBkZXRlY3Rpb24gaXMgd3JhcHBlZCBpbiBhIHRyeS9jYXRjaC4gQWRkaXRpb25hbGx5LCBvbmNlIHRoZSBhZGRyZXNzXG4gICAgICogZGV0YWlscyBhcmUgZmV0Y2hlZCBvbiB0aGUgd2FsbGV0LCBhIGxvY2FsIGFkZHJlc3MgdmFsaWRhdGlvbiBpcyBydW4sIHdob3NlIGVycm9ycyBob3dldmVyIGFyZSBnZW5lcmF0ZWRcbiAgICAgKiBjbGllbnQtc2lkZSBhbmQgY2FuIHRoZXJlZm9yZSBiZSBhbmFseXplZCB3aXRoIG1vcmUgZ3JhbnVsYXJpdHkgYW5kIHR5cGUgY2hlY2tpbmcuXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBJbiBvcmRlciB0byBtaW5pbWl6ZSBBUEkgcmVxdWVzdHMsIHdlIGFzc3VtZSB0aGF0IGV4cGxpY2l0IHJlY2lwaWVudHMgYXJlIGFsd2F5cyBleHRlcm5hbCB3aGVuIHRoZVxuICAgICAqIHJlY2lwaWVudCBsaXN0IGlzID4gMTAwMCBUaGlzIGlzIG5vdCBhbHdheXMgYSB2YWxpZCBhc3N1bXB0aW9uIGFuZCBjb3VsZCBsZWFkIGdyZWF0ZXIgYXBwYXJlbnQgc3BlbmQgKGJ1dCBuZXZlciBsb3dlcilcbiAgICAgKi9cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkICYmIHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gUkVDSVBJRU5UX1RIUkVTSE9MRCkge1xuICAgICAgY29uc3QgaXNDdXJyZW50QWRkcmVzc0luUmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHMuc29tZSgocmVjaXBpZW50KSA9PlxuICAgICAgICByZWNpcGllbnQuYWRkcmVzcy5pbmNsdWRlcyhjdXJyZW50QWRkcmVzcylcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc0N1cnJlbnRBZGRyZXNzSW5SZWNpcGllbnRzKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmN1cnJlbnRPdXRwdXQgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IGF3YWl0IGZldGNoQWRkcmVzc0RldGFpbHMoe1xuICAgICAgcmVxSWQsXG4gICAgICBhZGRyZXNzRGV0YWlsc1ZlcmlmaWNhdGlvbixcbiAgICAgIGFkZHJlc3NEZXRhaWxzUHJlYnVpbGQsXG4gICAgICBjdXJyZW50QWRkcmVzcyxcbiAgICAgIGRpc2FibGVOZXR3b3JraW5nLFxuICAgICAgd2FsbGV0LFxuICAgIH0pO1xuICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhZGRyZXNzIGlzIG9uIHRoZSB3YWxsZXQuIHZlcmlmeUFkZHJlc3MgdGhyb3dzIGlmXG4gICAgLy8gaXQgZmFpbHMgdG8gY29ycmVjdGx5IHJlZGVyaXZlIHRoZSBhZGRyZXNzLCBtZWFuaW5nIGl0J3MgZXh0ZXJuYWxcbiAgICBjdXJyZW50QWRkcmVzc1R5cGUgPSBBYnN0cmFjdFV0eG9Db2luLmluZmVyQWRkcmVzc1R5cGUoYWRkcmVzc0RldGFpbHMpIHx8IHVuZGVmaW5lZDtcbiAgICBjdXJyZW50QWRkcmVzc0RldGFpbHMgPSBhZGRyZXNzRGV0YWlscztcbiAgICBhd2FpdCBjb2luLnZlcmlmeUFkZHJlc3MoXG4gICAgICBfLmV4dGVuZCh7IGFkZHJlc3NUeXBlOiBjdXJyZW50QWRkcmVzc1R5cGUgfSwgYWRkcmVzc0RldGFpbHMsIHtcbiAgICAgICAga2V5Y2hhaW5zOiBrZXljaGFpbkFycmF5LFxuICAgICAgICBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyB2ZXJpZmljYXRpb24gcGFzc2VkJywgY3VycmVudEFkZHJlc3MpO1xuXG4gICAgLy8gdmVyaWZ5IGFkZHJlc3Mgc3VjY2VlZGVkIHdpdGhvdXQgdGhyb3dpbmcsIHNvIHRoZSBhZGRyZXNzIHdhc1xuICAgIC8vIGNvcnJlY3RseSByZWRlcml2ZWQgZnJvbSB0aGUgd2FsbGV0IGtleWNoYWlucywgbWFraW5nIGl0IG5vdCBleHRlcm5hbFxuICAgIHJldHVybiBfLmV4dGVuZCh7fSwgY3VycmVudE91dHB1dCwgYWRkcmVzc0RldGFpbHMsIHsgZXh0ZXJuYWw6IGZhbHNlIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGVidWcoJ0FkZHJlc3MgJXMgdmVyaWZpY2F0aW9uIHRocmV3IGFuIGVycm9yOicsIGN1cnJlbnRBZGRyZXNzLCBlKTtcbiAgICByZXR1cm4gXy5leHRlbmQoXG4gICAgICB7fSxcbiAgICAgIGN1cnJlbnRPdXRwdXQsXG4gICAgICBhd2FpdCBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICAgICAgICBlLFxuICAgICAgICBjb2luLFxuICAgICAgICBjdXJyZW50QWRkcmVzcyxcbiAgICAgICAgd2FsbGV0LFxuICAgICAgICB0eFBhcmFtcyxcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5czogY3VzdG9tQ2hhbmdlICYmIGN1c3RvbUNoYW5nZS5rZXlzLFxuICAgICAgICBhZGRyZXNzRGV0YWlsczogY3VycmVudEFkZHJlc3NEZXRhaWxzLFxuICAgICAgICBhZGRyZXNzVHlwZTogY3VycmVudEFkZHJlc3NUeXBlLFxuICAgICAgICBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbDogdmVyaWZpY2F0aW9uLmNvbnNpZGVyTWlncmF0ZWRGcm9tQWRkcmVzc0ludGVybmFsLFxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ import type { AbstractUtxoCoin, ParsedTransaction, ParseTransactionOptions } from '../../abstractUtxoCoin';
2
+ import { ComparableOutput } from '../outputDifference';
3
+ export type ComparableOutputWithExternal<TValue> = ComparableOutput<TValue> & {
4
+ external: boolean | undefined;
5
+ };
6
+ export declare function parseTransaction<TNumber extends bigint | number>(coin: AbstractUtxoCoin, params: ParseTransactionOptions<TNumber>): Promise<ParsedTransaction<TNumber>>;
7
+ //# sourceMappingURL=parseTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseTransaction.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,gBAAgB,EAGhB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAoB,MAAM,qBAAqB,CAAC;AAMzE,MAAM,MAAM,4BAA4B,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG;IAC5E,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACpE,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAwMrC"}
@@ -0,0 +1,164 @@
1
+ import assert from 'assert';
2
+ import _ from 'lodash';
3
+ import * as utxolib from '@bitgo-beta/utxo-lib';
4
+ import { fetchKeychains, getKeySignatures, toKeychainTriple, UtxoNamedKeychains } from '../../keychains';
5
+ import { outputDifference } from '../outputDifference';
6
+ import { fromExtendedAddressFormatToScript, toExtendedAddressFormat } from '../recipient';
7
+ import { parseOutput } from './parseOutput';
8
+ export async function parseTransaction(coin, params) {
9
+ const { txParams, txPrebuild, wallet, verification = {}, reqId } = params;
10
+ if (!_.isUndefined(verification.disableNetworking) && !_.isBoolean(verification.disableNetworking)) {
11
+ throw new Error('verification.disableNetworking must be a boolean');
12
+ }
13
+ const disableNetworking = verification.disableNetworking;
14
+ // obtain the keychains and key signatures
15
+ let keychains = verification.keychains;
16
+ if (!keychains) {
17
+ if (disableNetworking) {
18
+ throw new Error('cannot fetch keychains without networking');
19
+ }
20
+ keychains = await fetchKeychains(coin, wallet, reqId);
21
+ }
22
+ if (!UtxoNamedKeychains.is(keychains)) {
23
+ throw new Error('invalid keychains');
24
+ }
25
+ const keychainArray = toKeychainTriple(keychains);
26
+ if (_.isUndefined(txPrebuild.txHex)) {
27
+ throw new Error('missing required txPrebuild property txHex');
28
+ }
29
+ // obtain all outputs
30
+ const explanation = await coin.explainTransaction({
31
+ txHex: txPrebuild.txHex,
32
+ txInfo: txPrebuild.txInfo,
33
+ pubs: keychainArray.map((k) => k.pub),
34
+ });
35
+ const allOutputs = [...explanation.outputs, ...explanation.changeOutputs];
36
+ let expectedOutputs;
37
+ if (txParams.rbfTxIds) {
38
+ assert(txParams.rbfTxIds.length === 1);
39
+ const txToBeReplaced = await wallet.getTransaction({ txHash: txParams.rbfTxIds[0], includeRbf: true });
40
+ expectedOutputs = txToBeReplaced.outputs.flatMap((output) => {
41
+ // For self-sends, the walletId will be the same as the wallet's id
42
+ if (output.wallet === wallet.id()) {
43
+ return [];
44
+ }
45
+ return [coin.toCanonicalTransactionRecipient(output)];
46
+ });
47
+ }
48
+ else {
49
+ // verify that each recipient from txParams has their own output
50
+ expectedOutputs = (txParams.recipients ?? []).flatMap((output) => {
51
+ if (output.address === undefined) {
52
+ if (output.amount.toString() !== '0') {
53
+ throw new Error(`Only zero amounts allowed for non-encodeable scriptPubkeys: ${output}`);
54
+ }
55
+ return [output];
56
+ }
57
+ return [{ ...output, address: coin.canonicalAddress(output.address) }];
58
+ });
59
+ if (txParams.allowExternalChangeAddress && txParams.changeAddress) {
60
+ // when an external change address is explicitly specified, count all outputs going towards that
61
+ // address in the expected outputs (regardless of the output amount)
62
+ expectedOutputs.push(...allOutputs.flatMap((output) => {
63
+ if (output.address === undefined ||
64
+ output.address !== coin.canonicalAddress(txParams.changeAddress)) {
65
+ return [];
66
+ }
67
+ return [{ ...output, address: coin.canonicalAddress(output.address) }];
68
+ }));
69
+ }
70
+ }
71
+ // get the keychains from the custom change wallet if needed
72
+ let customChange;
73
+ const { customChangeWalletId = undefined } = wallet.coinSpecific() || {};
74
+ if (customChangeWalletId) {
75
+ // fetch keychains from custom change wallet for deriving addresses.
76
+ // These keychains should be signed and this should be verified in verifyTransaction
77
+ const customChangeKeySignatures = wallet._wallet.customChangeKeySignatures;
78
+ const customChangeWallet = await coin.wallets().get({ id: customChangeWalletId });
79
+ const customChangeKeys = await fetchKeychains(coin, customChangeWallet, reqId);
80
+ if (!customChangeKeys) {
81
+ throw new Error('failed to fetch keychains for custom change wallet');
82
+ }
83
+ if (customChangeKeys.user && customChangeKeys.backup && customChangeKeys.bitgo && customChangeWallet) {
84
+ const customChangeKeychains = [
85
+ customChangeKeys.user,
86
+ customChangeKeys.backup,
87
+ customChangeKeys.bitgo,
88
+ ];
89
+ customChange = {
90
+ keys: customChangeKeychains,
91
+ signatures: [customChangeKeySignatures.user, customChangeKeySignatures.backup, customChangeKeySignatures.bitgo],
92
+ };
93
+ }
94
+ }
95
+ /**
96
+ * Loop through all the outputs and classify each of them as either internal spends
97
+ * or external spends by setting the "external" property to true or false on the output object.
98
+ */
99
+ const allOutputDetails = await Promise.all(allOutputs.map((currentOutput) => {
100
+ return parseOutput({
101
+ currentOutput,
102
+ coin,
103
+ txPrebuild,
104
+ verification,
105
+ keychainArray: toKeychainTriple(keychains),
106
+ wallet,
107
+ txParams: {
108
+ recipients: expectedOutputs,
109
+ changeAddress: txParams.changeAddress,
110
+ },
111
+ customChange,
112
+ reqId,
113
+ });
114
+ }));
115
+ const needsCustomChangeKeySignatureVerification = allOutputDetails.some((output) => output?.needsCustomChangeKeySignatureVerification);
116
+ const changeOutputs = _.filter(allOutputDetails, { external: false });
117
+ function toComparableOutputsWithExternal(outputs) {
118
+ return outputs.map((output) => ({
119
+ script: fromExtendedAddressFormatToScript(output.address, coin.network),
120
+ value: output.amount === 'max' ? 'max' : BigInt(output.amount),
121
+ external: output.external,
122
+ }));
123
+ }
124
+ const missingOutputs = outputDifference(toComparableOutputsWithExternal(expectedOutputs), toComparableOutputsWithExternal(allOutputs));
125
+ const implicitOutputs = outputDifference(toComparableOutputsWithExternal(allOutputDetails), toComparableOutputsWithExternal(expectedOutputs));
126
+ const explicitOutputs = outputDifference(toComparableOutputsWithExternal(allOutputDetails), implicitOutputs);
127
+ // these are all the non-wallet outputs that had been originally explicitly specified in recipients
128
+ const explicitExternalOutputs = explicitOutputs.filter((output) => output.external);
129
+ // this is the sum of all the originally explicitly specified non-wallet output values
130
+ const explicitExternalSpendAmount = utxolib.bitgo.toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
131
+ /**
132
+ * The calculation of the implicit external spend amount pertains to verifying the pay-as-you-go-fee BitGo
133
+ * automatically applies to transactions sending money out of the wallet. The logic is fairly straightforward
134
+ * in that we compare the external spend amount that was specified explicitly by the user to the portion
135
+ * that was specified implicitly. To protect customers from people tampering with the transaction outputs, we
136
+ * define a threshold for the maximum percentage of the implicit external spend in relation to the explicit
137
+ * external spend.
138
+ */
139
+ // make sure that all the extra addresses are change addresses
140
+ // get all the additional external outputs the server added and calculate their values
141
+ const implicitExternalOutputs = implicitOutputs.filter((output) => output.external);
142
+ const implicitExternalSpendAmount = utxolib.bitgo.toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
143
+ function toOutputs(outputs) {
144
+ return outputs.map((output) => ({
145
+ address: toExtendedAddressFormat(output.script, coin.network),
146
+ amount: output.value.toString(),
147
+ external: output.external,
148
+ }));
149
+ }
150
+ return {
151
+ keychains,
152
+ keySignatures: getKeySignatures(wallet) ?? {},
153
+ outputs: allOutputDetails,
154
+ missingOutputs: toOutputs(missingOutputs),
155
+ explicitExternalOutputs: toOutputs(explicitExternalOutputs),
156
+ implicitExternalOutputs: toOutputs(implicitExternalOutputs),
157
+ changeOutputs,
158
+ explicitExternalSpendAmount,
159
+ implicitExternalSpendAmount,
160
+ needsCustomChangeKeySignatureVerification,
161
+ customChange,
162
+ };
163
+ }
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQVNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFnQixrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZILE9BQU8sRUFBb0IsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHMUYsT0FBTyxFQUF1QixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNakUsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsSUFBc0IsRUFDdEIsTUFBd0M7SUFFeEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFFLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ25HLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUM7SUFFekQsMENBQTBDO0lBQzFDLElBQUksU0FBUyxHQUFzRSxZQUFZLENBQUMsU0FBUyxDQUFDO0lB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c3NlcnQnO1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVHJpcGxlLCBWZXJpZmljYXRpb25PcHRpb25zLCBXYWxsZXQgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdFV0eG9Db2luLFxuICBGaXhlZFNjcmlwdFdhbGxldE91dHB1dCxcbiAgT3V0cHV0LFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG59IGZyb20gJy4uLy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHsgZmV0Y2hLZXljaGFpbnMsIGdldEtleVNpZ25hdHVyZXMsIHRvS2V5Y2hhaW5UcmlwbGUsIFV0eG9LZXljaGFpbiwgVXR4b05hbWVkS2V5Y2hhaW5zIH0gZnJvbSAnLi4vLi4va2V5Y2hhaW5zJztcbmltcG9ydCB7IENvbXBhcmFibGVPdXRwdXQsIG91dHB1dERpZmZlcmVuY2UgfSBmcm9tICcuLi9vdXRwdXREaWZmZXJlbmNlJztcbmltcG9ydCB7IGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXRUb1NjcmlwdCwgdG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQgfSBmcm9tICcuLi9yZWNpcGllbnQnO1xuXG5pbXBvcnQgdHlwZSB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuL2V4cGxhaW5UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBDdXN0b21DaGFuZ2VPcHRpb25zLCBwYXJzZU91dHB1dCB9IGZyb20gJy4vcGFyc2VPdXRwdXQnO1xuXG5leHBvcnQgdHlwZSBDb21wYXJhYmxlT3V0cHV0V2l0aEV4dGVybmFsPFRWYWx1ZT4gPSBDb21wYXJhYmxlT3V0cHV0PFRWYWx1ZT4gJiB7XG4gIGV4dGVybmFsOiBib29sZWFuIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIGJpZ2ludCB8IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbik6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4+IHtcbiAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gPSB7fSwgcmVxSWQgfSA9IHBhcmFtcztcblxuICBpZiAoIV8uaXNVbmRlZmluZWQodmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nKSAmJiAhXy5pc0Jvb2xlYW4odmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nIG11c3QgYmUgYSBib29sZWFuJyk7XG4gIH1cbiAgY29uc3QgZGlzYWJsZU5ldHdvcmtpbmcgPSB2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmc7XG5cbiAgLy8gb2J0YWluIHRoZSBrZXljaGFpbnMgYW5kIGtleSBzaWduYXR1cmVzXG4gIGxldCBrZXljaGFpbnM6IFV0eG9OYW1lZEtleWNoYWlucyB8IFZlcmlmaWNhdGlvbk9wdGlvbnNbJ2tleWNoYWlucyddIHwgdW5kZWZpbmVkID0gdmVyaWZpY2F0aW9uLmtleWNoYWlucztcbiAgaWYgKCFrZXljaGFpbnMpIHtcbiAgICBpZiAoZGlzYWJsZU5ldHdvcmtpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGZldGNoIGtleWNoYWlucyB3aXRob3V0IG5ldHdvcmtpbmcnKTtcbiAgICB9XG4gICAga2V5Y2hhaW5zID0gYXdhaXQgZmV0Y2hLZXljaGFpbnMoY29pbiwgd2FsbGV0LCByZXFJZCk7XG4gIH1cblxuICBpZiAoIVV0eG9OYW1lZEtleWNoYWlucy5pcyhrZXljaGFpbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGtleWNoYWlucycpO1xuICB9XG5cbiAgY29uc3Qga2V5Y2hhaW5BcnJheTogVHJpcGxlPFV0eG9LZXljaGFpbj4gPSB0b0tleWNoYWluVHJpcGxlKGtleWNoYWlucyk7XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQodHhQcmVidWlsZC50eEhleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHhQcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICB9XG5cbiAgLy8gb2J0YWluIGFsbCBvdXRwdXRzXG4gIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgY29pbi5leHBsYWluVHJhbnNhY3Rpb248VE51bWJlcj4oe1xuICAgIHR4SGV4OiB0eFByZWJ1aWxkLnR4SGV4LFxuICAgIHR4SW5mbzogdHhQcmVidWlsZC50eEluZm8sXG4gICAgcHViczoga2V5Y2hhaW5BcnJheS5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPixcbiAgfSk7XG5cbiAgY29uc3QgYWxsT3V0cHV0cyA9IFsuLi5leHBsYW5hdGlvbi5vdXRwdXRzLCAuLi5leHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzXTtcblxuICBsZXQgZXhwZWN0ZWRPdXRwdXRzO1xuICBpZiAodHhQYXJhbXMucmJmVHhJZHMpIHtcbiAgICBhc3NlcnQodHhQYXJhbXMucmJmVHhJZHMubGVuZ3RoID09PSAxKTtcblxuICAgIGNvbnN0IHR4VG9CZVJlcGxhY2VkID0gYXdhaXQgd2FsbGV0LmdldFRyYW5zYWN0aW9uKHsgdHhIYXNoOiB0eFBhcmFtcy5yYmZUeElkc1swXSwgaW5jbHVkZVJiZjogdHJ1ZSB9KTtcbiAgICBleHBlY3RlZE91dHB1dHMgPSB0eFRvQmVSZXBsYWNlZC5vdXRwdXRzLmZsYXRNYXAoXG4gICAgICAob3V0cHV0OiB7IHZhbHVlU3RyaW5nOiBzdHJpbmc7IGFkZHJlc3M/OiBzdHJpbmc7IHdhbGxldD86IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIC8vIEZvciBzZWxmLXNlbmRzLCB0aGUgd2FsbGV0SWQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgd2FsbGV0J3MgaWRcbiAgICAgICAgaWYgKG91dHB1dC53YWxsZXQgPT09IHdhbGxldC5pZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29pbi50b0Nhbm9uaWNhbFRyYW5zYWN0aW9uUmVjaXBpZW50KG91dHB1dCldO1xuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdmVyaWZ5IHRoYXQgZWFjaCByZWNpcGllbnQgZnJvbSB0eFBhcmFtcyBoYXMgdGhlaXIgb3duIG91dHB1dFxuICAgIGV4cGVjdGVkT3V0cHV0cyA9ICh0eFBhcmFtcy5yZWNpcGllbnRzID8/IFtdKS5mbGF0TWFwKChvdXRwdXQpID0+IHtcbiAgICAgIGlmIChvdXRwdXQuYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvdXRwdXQuYW1vdW50LnRvU3RyaW5nKCkgIT09ICcwJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT25seSB6ZXJvIGFtb3VudHMgYWxsb3dlZCBmb3Igbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5czogJHtvdXRwdXR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtvdXRwdXRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFt7IC4uLm91dHB1dCwgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKSB9XTtcbiAgICB9KTtcbiAgICBpZiAodHhQYXJhbXMuYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3MgJiYgdHhQYXJhbXMuY2hhbmdlQWRkcmVzcykge1xuICAgICAgLy8gd2hlbiBhbiBleHRlcm5hbCBjaGFuZ2UgYWRkcmVzcyBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCwgY291bnQgYWxsIG91dHB1dHMgZ29pbmcgdG93YXJkcyB0aGF0XG4gICAgICAvLyBhZGRyZXNzIGluIHRoZSBleHBlY3RlZCBvdXRwdXRzIChyZWdhcmRsZXNzIG9mIHRoZSBvdXRwdXQgYW1vdW50KVxuICAgICAgZXhwZWN0ZWRPdXRwdXRzLnB1c2goXG4gICAgICAgIC4uLmFsbE91dHB1dHMuZmxhdE1hcCgob3V0cHV0KSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgb3V0cHV0LmFkZHJlc3MgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgb3V0cHV0LmFkZHJlc3MgIT09IGNvaW4uY2Fub25pY2FsQWRkcmVzcyh0eFBhcmFtcy5jaGFuZ2VBZGRyZXNzIGFzIHN0cmluZylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFt7IC4uLm91dHB1dCwgYWRkcmVzczogY29pbi5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKSB9XTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gZ2V0IHRoZSBrZXljaGFpbnMgZnJvbSB0aGUgY3VzdG9tIGNoYW5nZSB3YWxsZXQgaWYgbmVlZGVkXG4gIGxldCBjdXN0b21DaGFuZ2U6IEN1c3RvbUNoYW5nZU9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgPSB1bmRlZmluZWQgfSA9IHdhbGxldC5jb2luU3BlY2lmaWMoKSB8fCB7fTtcbiAgaWYgKGN1c3RvbUNoYW5nZVdhbGxldElkKSB7XG4gICAgLy8gZmV0Y2gga2V5Y2hhaW5zIGZyb20gY3VzdG9tIGNoYW5nZSB3YWxsZXQgZm9yIGRlcml2aW5nIGFkZHJlc3Nlcy5cbiAgICAvLyBUaGVzZSBrZXljaGFpbnMgc2hvdWxkIGJlIHNpZ25lZCBhbmQgdGhpcyBzaG91bGQgYmUgdmVyaWZpZWQgaW4gdmVyaWZ5VHJhbnNhY3Rpb25cbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzID0gd2FsbGV0Ll93YWxsZXQuY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcztcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VXYWxsZXQ6IFdhbGxldCA9IGF3YWl0IGNvaW4ud2FsbGV0cygpLmdldCh7IGlkOiBjdXN0b21DaGFuZ2VXYWxsZXRJZCB9KTtcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlzID0gYXdhaXQgZmV0Y2hLZXljaGFpbnMoY29pbiwgY3VzdG9tQ2hhbmdlV2FsbGV0LCByZXFJZCk7XG5cbiAgICBpZiAoIWN1c3RvbUNoYW5nZUtleXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGZldGNoIGtleWNoYWlucyBmb3IgY3VzdG9tIGNoYW5nZSB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tQ2hhbmdlS2V5cy51c2VyICYmIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwICYmIGN1c3RvbUNoYW5nZUtleXMuYml0Z28gJiYgY3VzdG9tQ2hhbmdlV2FsbGV0KSB7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXljaGFpbnM6IFRyaXBsZTxVdHhvS2V5Y2hhaW4+ID0gW1xuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLnVzZXIsXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvLFxuICAgICAgXTtcblxuICAgICAgY3VzdG9tQ2hhbmdlID0ge1xuICAgICAgICBrZXlzOiBjdXN0b21DaGFuZ2VLZXljaGFpbnMsXG4gICAgICAgIHNpZ25hdHVyZXM6IFtjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLnVzZXIsIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYmFja3VwLCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJpdGdvXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvb3AgdGhyb3VnaCBhbGwgdGhlIG91dHB1dHMgYW5kIGNsYXNzaWZ5IGVhY2ggb2YgdGhlbSBhcyBlaXRoZXIgaW50ZXJuYWwgc3BlbmRzXG4gICAqIG9yIGV4dGVybmFsIHNwZW5kcyBieSBzZXR0aW5nIHRoZSBcImV4dGVybmFsXCIgcHJvcGVydHkgdG8gdHJ1ZSBvciBmYWxzZSBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAgICovXG4gIGNvbnN0IGFsbE91dHB1dERldGFpbHM6IE91dHB1dFtdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgYWxsT3V0cHV0cy5tYXAoKGN1cnJlbnRPdXRwdXQpID0+IHtcbiAgICAgIHJldHVybiBwYXJzZU91dHB1dCh7XG4gICAgICAgIGN1cnJlbnRPdXRwdXQsXG4gICAgICAgIGNvaW4sXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgICAga2V5Y2hhaW5BcnJheTogdG9LZXljaGFpblRyaXBsZShrZXljaGFpbnMpLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIHR4UGFyYW1zOiB7XG4gICAgICAgICAgcmVjaXBpZW50czogZXhwZWN0ZWRPdXRwdXRzLFxuICAgICAgICAgIGNoYW5nZUFkZHJlc3M6IHR4UGFyYW1zLmNoYW5nZUFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbUNoYW5nZSxcbiAgICAgICAgcmVxSWQsXG4gICAgICB9KTtcbiAgICB9KVxuICApO1xuXG4gIGNvbnN0IG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uID0gYWxsT3V0cHV0RGV0YWlscy5zb21lKFxuICAgIChvdXRwdXQpID0+IChvdXRwdXQgYXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQpPy5uZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvblxuICApO1xuXG4gIGNvbnN0IGNoYW5nZU91dHB1dHMgPSBfLmZpbHRlcihhbGxPdXRwdXREZXRhaWxzLCB7IGV4dGVybmFsOiBmYWxzZSB9KTtcblxuICBmdW5jdGlvbiB0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKG91dHB1dHM6IE91dHB1dFtdKTogQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxiaWdpbnQgfCAnbWF4Jz5bXSB7XG4gICAgcmV0dXJuIG91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBzY3JpcHQ6IGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXRUb1NjcmlwdChvdXRwdXQuYWRkcmVzcywgY29pbi5uZXR3b3JrKSxcbiAgICAgIHZhbHVlOiBvdXRwdXQuYW1vdW50ID09PSAnbWF4JyA/ICdtYXgnIDogKEJpZ0ludChvdXRwdXQuYW1vdW50KSBhcyBiaWdpbnQgfCAnbWF4JyksXG4gICAgICBleHRlcm5hbDogb3V0cHV0LmV4dGVybmFsLFxuICAgIH0pKTtcbiAgfVxuXG4gIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShcbiAgICB0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKGV4cGVjdGVkT3V0cHV0cyksXG4gICAgdG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChhbGxPdXRwdXRzKVxuICApO1xuXG4gIGNvbnN0IGltcGxpY2l0T3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UoXG4gICAgdG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChhbGxPdXRwdXREZXRhaWxzKSxcbiAgICB0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKGV4cGVjdGVkT3V0cHV0cylcbiAgKTtcbiAgY29uc3QgZXhwbGljaXRPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZSh0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKGFsbE91dHB1dERldGFpbHMpLCBpbXBsaWNpdE91dHB1dHMpO1xuXG4gIC8vIHRoZXNlIGFyZSBhbGwgdGhlIG5vbi13YWxsZXQgb3V0cHV0cyB0aGF0IGhhZCBiZWVuIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICBjb25zdCBleHBsaWNpdEV4dGVybmFsT3V0cHV0cyA9IGV4cGxpY2l0T3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LmV4dGVybmFsKTtcbiAgLy8gdGhpcyBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBub24td2FsbGV0IG91dHB1dCB2YWx1ZXNcbiAgY29uc3QgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oXG4gICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbykgPT4gc3VtICsgQmlnSW50KG8udmFsdWUpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICBjb2luLmFtb3VudFR5cGVcbiAgKTtcblxuICAvKipcbiAgICogVGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZCBhbW91bnQgcGVydGFpbnMgdG8gdmVyaWZ5aW5nIHRoZSBwYXktYXMteW91LWdvLWZlZSBCaXRHb1xuICAgKiBhdXRvbWF0aWNhbGx5IGFwcGxpZXMgdG8gdHJhbnNhY3Rpb25zIHNlbmRpbmcgbW9uZXkgb3V0IG9mIHRoZSB3YWxsZXQuIFRoZSBsb2dpYyBpcyBmYWlybHkgc3RyYWlnaHRmb3J3YXJkXG4gICAqIGluIHRoYXQgd2UgY29tcGFyZSB0aGUgZXh0ZXJuYWwgc3BlbmQgYW1vdW50IHRoYXQgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IGJ5IHRoZSB1c2VyIHRvIHRoZSBwb3J0aW9uXG4gICAqIHRoYXQgd2FzIHNwZWNpZmllZCBpbXBsaWNpdGx5LiBUbyBwcm90ZWN0IGN1c3RvbWVycyBmcm9tIHBlb3BsZSB0YW1wZXJpbmcgd2l0aCB0aGUgdHJhbnNhY3Rpb24gb3V0cHV0cywgd2VcbiAgICogZGVmaW5lIGEgdGhyZXNob2xkIGZvciB0aGUgbWF4aW11bSBwZXJjZW50YWdlIG9mIHRoZSBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZCBpbiByZWxhdGlvbiB0byB0aGUgZXhwbGljaXRcbiAgICogZXh0ZXJuYWwgc3BlbmQuXG4gICAqL1xuXG4gIC8vIG1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgZXh0cmEgYWRkcmVzc2VzIGFyZSBjaGFuZ2UgYWRkcmVzc2VzXG4gIC8vIGdldCBhbGwgdGhlIGFkZGl0aW9uYWwgZXh0ZXJuYWwgb3V0cHV0cyB0aGUgc2VydmVyIGFkZGVkIGFuZCBjYWxjdWxhdGUgdGhlaXIgdmFsdWVzXG4gIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gaW1wbGljaXRPdXRwdXRzLmZpbHRlcigob3V0cHV0KSA9PiBvdXRwdXQuZXh0ZXJuYWwpO1xuICBjb25zdCBpbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihcbiAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cy5yZWR1Y2UoKHN1bTogYmlnaW50LCBvKSA9PiBzdW0gKyBCaWdJbnQoby52YWx1ZSksIEJpZ0ludCgwKSkgYXMgYmlnaW50LFxuICAgIGNvaW4uYW1vdW50VHlwZVxuICApO1xuXG4gIGZ1bmN0aW9uIHRvT3V0cHV0cyhvdXRwdXRzOiBDb21wYXJhYmxlT3V0cHV0V2l0aEV4dGVybmFsPGJpZ2ludCB8ICdtYXgnPltdKTogT3V0cHV0W10ge1xuICAgIHJldHVybiBvdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgYWRkcmVzczogdG9FeHRlbmRlZEFkZHJlc3NGb3JtYXQob3V0cHV0LnNjcmlwdCwgY29pbi5uZXR3b3JrKSxcbiAgICAgIGFtb3VudDogb3V0cHV0LnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICBleHRlcm5hbDogb3V0cHV0LmV4dGVybmFsLFxuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAga2V5Y2hhaW5zLFxuICAgIGtleVNpZ25hdHVyZXM6IGdldEtleVNpZ25hdHVyZXMod2FsbGV0KSA/PyB7fSxcbiAgICBvdXRwdXRzOiBhbGxPdXRwdXREZXRhaWxzLFxuICAgIG1pc3NpbmdPdXRwdXRzOiB0b091dHB1dHMobWlzc2luZ091dHB1dHMpLFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiB0b091dHB1dHMoZXhwbGljaXRFeHRlcm5hbE91dHB1dHMpLFxuICAgIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiB0b091dHB1dHMoaW1wbGljaXRFeHRlcm5hbE91dHB1dHMpLFxuICAgIGNoYW5nZU91dHB1dHMsXG4gICAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICAgIGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCxcbiAgICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbixcbiAgICBjdXN0b21DaGFuZ2UsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { BIP32Interface } from '@bitgo-beta/secp256k1';
2
+ import * as utxolib from '@bitgo-beta/utxo-lib';
3
+ import { AbstractUtxoCoin, DecodedTransaction } from '../../abstractUtxoCoin';
4
+ export declare function signTransaction<TNumber extends number | bigint>(coin: AbstractUtxoCoin, tx: DecodedTransaction<TNumber>, signerKeychain: BIP32Interface | undefined, params: {
5
+ walletId: string | undefined;
6
+ txInfo: {
7
+ unspents?: utxolib.bitgo.Unspent<TNumber>[];
8
+ } | undefined;
9
+ isLastSignature: boolean;
10
+ signingStep: 'signerNonce' | 'cosignerNonce' | 'signerSignature' | undefined;
11
+ /** deprecated */
12
+ allowNonSegwitSigningWithoutPrevTx: boolean;
13
+ pubs: string[] | undefined;
14
+ cosignerPub: string | undefined;
15
+ }): Promise<{
16
+ txHex: string;
17
+ }>;
18
+ //# sourceMappingURL=signTransaction.d.ts.map
@@ -0,0 +1,95 @@
1
+ import assert from 'assert';
2
+ import _ from 'lodash';
3
+ import { bip32 } from '@bitgo-beta/secp256k1';
4
+ import { bitgo } from '@bitgo-beta/utxo-lib';
5
+ import { isTriple } from '@bitgo-beta/sdk-core';
6
+ import { signAndVerifyPsbt, signAndVerifyWalletTransaction } from '../../sign';
7
+ /**
8
+ * Key Value: Unsigned tx id => PSBT
9
+ * It is used to cache PSBTs with taproot key path (MuSig2) inputs during external express signer is activated.
10
+ * Reason: MuSig2 signer secure nonce is cached in the UtxoPsbt object. It will be required during the signing step.
11
+ * For more info, check SignTransactionOptions.signingStep
12
+ *
13
+ * TODO BTC-276: This cache may need to be done with LRU like memory safe caching if memory issues comes up.
14
+ */
15
+ const PSBT_CACHE = new Map();
16
+ export async function signTransaction(coin, tx, signerKeychain, params) {
17
+ const isTxWithKeyPathSpendInput = tx instanceof bitgo.UtxoPsbt && bitgo.isTransactionWithKeyPathSpendInput(tx);
18
+ let isLastSignature = false;
19
+ if (_.isBoolean(params.isLastSignature)) {
20
+ // We can only be the first signature on a transaction with taproot key path spend inputs because
21
+ // we require the secret nonce in the cache of the first signer, which is impossible to retrieve if
22
+ // deserialized from a hex.
23
+ if (params.isLastSignature && isTxWithKeyPathSpendInput) {
24
+ throw new Error('Cannot be last signature on a transaction with key path spend inputs');
25
+ }
26
+ // if build is called instead of buildIncomplete, no signature placeholders are left in the sig script
27
+ isLastSignature = params.isLastSignature;
28
+ }
29
+ if (tx instanceof bitgo.UtxoPsbt && isTxWithKeyPathSpendInput) {
30
+ switch (params.signingStep) {
31
+ case 'signerNonce':
32
+ assert(signerKeychain);
33
+ tx.setAllInputsMusig2NonceHD(signerKeychain);
34
+ PSBT_CACHE.set(tx.getUnsignedTx().getId(), tx);
35
+ return { txHex: tx.toHex() };
36
+ case 'cosignerNonce':
37
+ assert(params.walletId, 'walletId is required for MuSig2 bitgo nonce');
38
+ return { txHex: (await coin.signPsbt(tx.toHex(), params.walletId)).psbt };
39
+ case 'signerSignature':
40
+ const txId = tx.getUnsignedTx().getId();
41
+ const psbt = PSBT_CACHE.get(txId);
42
+ assert(psbt, `Psbt is missing from txCache (cache size ${PSBT_CACHE.size}).
43
+ This may be due to the request being routed to a different BitGo-Express instance that for signing step 'signerNonce'.`);
44
+ PSBT_CACHE.delete(txId);
45
+ tx = psbt.combine(tx);
46
+ break;
47
+ default:
48
+ // this instance is not an external signer
49
+ assert(params.walletId, 'walletId is required for MuSig2 bitgo nonce');
50
+ assert(signerKeychain);
51
+ tx.setAllInputsMusig2NonceHD(signerKeychain);
52
+ const response = await coin.signPsbt(tx.toHex(), params.walletId);
53
+ tx.combine(bitgo.createPsbtFromHex(response.psbt, coin.network));
54
+ break;
55
+ }
56
+ }
57
+ else {
58
+ switch (params.signingStep) {
59
+ case 'signerNonce':
60
+ case 'cosignerNonce':
61
+ /**
62
+ * In certain cases, the caller of this method may not know whether the txHex contains a psbt with taproot key path spend input(s).
63
+ * Instead of throwing error, no-op and return the txHex. So that the caller can call this method in the same sequence.
64
+ */
65
+ return { txHex: tx.toHex() };
66
+ }
67
+ }
68
+ let signedTransaction;
69
+ if (tx instanceof bitgo.UtxoPsbt) {
70
+ assert(signerKeychain);
71
+ signedTransaction = signAndVerifyPsbt(tx, signerKeychain, {
72
+ isLastSignature,
73
+ });
74
+ }
75
+ else {
76
+ if (tx.ins.length !== params.txInfo?.unspents?.length) {
77
+ throw new Error('length of unspents array should equal to the number of transaction inputs');
78
+ }
79
+ if (!params.pubs || !isTriple(params.pubs)) {
80
+ throw new Error(`must provide xpub array`);
81
+ }
82
+ const keychains = params.pubs.map((pub) => bip32.fromBase58(pub));
83
+ const cosignerPub = params.cosignerPub ?? params.pubs[2];
84
+ const cosignerKeychain = bip32.fromBase58(cosignerPub);
85
+ assert(signerKeychain);
86
+ const walletSigner = new bitgo.WalletUnspentSigner(keychains, signerKeychain, cosignerKeychain);
87
+ signedTransaction = signAndVerifyWalletTransaction(tx, params.txInfo.unspents, walletSigner, {
88
+ isLastSignature,
89
+ });
90
+ }
91
+ return {
92
+ txHex: signedTransaction.toBuffer().toString('hex'),
93
+ };
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnblRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25UcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFBa0IsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxRQUFRLEVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHL0U7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFDO0FBRTdELE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxJQUFzQixFQUN0QixFQUErQixFQUMvQixjQUEwQyxFQUMxQyxNQVNDO0lBRUQsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLFlBQVksS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFL0csSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQzVCLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxpR0FBaUc7UUFDakcsbUdBQW1HO1FBQ25HLDJCQUEyQjtRQUMzQixJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUkseUJBQXlCLEVBQUUsQ0FBQztZQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUVELHNHQUFzRztRQUN0RyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUs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LEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUEyQixDQUFDO1FBQzVGLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFpQixTQUFTLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDaEgsaUJBQWlCLEdBQUcsOEJBQThCLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRTtZQUMzRixlQUFlO1NBQ2hCLENBQWtDLENBQUM7SUFDdEMsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztLQUNwRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEJJUDMySW50ZXJmYWNlLCBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBiaXRnbyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgaXNUcmlwbGUsIFRyaXBsZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgc2lnbkFuZFZlcmlmeVBzYnQsIHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NpZ24nO1xuaW1wb3J0IHsgQWJzdHJhY3RVdHhvQ29pbiwgRGVjb2RlZFRyYW5zYWN0aW9uLCBSb290V2FsbGV0S2V5cyB9IGZyb20gJy4uLy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuXG4vKipcbiAqIEtleSBWYWx1ZTogVW5zaWduZWQgdHggaWQgPT4gUFNCVFxuICogSXQgaXMgdXNlZCB0byBjYWNoZSBQU0JUcyB3aXRoIHRhcHJvb3Qga2V5IHBhdGggKE11U2lnMikgaW5wdXRzIGR1cmluZyBleHRlcm5hbCBleHByZXNzIHNpZ25lciBpcyBhY3RpdmF0ZWQuXG4gKiBSZWFzb246IE11U2lnMiBzaWduZXIgc2VjdXJlIG5vbmNlIGlzIGNhY2hlZCBpbiB0aGUgVXR4b1BzYnQgb2JqZWN0LiBJdCB3aWxsIGJlIHJlcXVpcmVkIGR1cmluZyB0aGUgc2lnbmluZyBzdGVwLlxuICogRm9yIG1vcmUgaW5mbywgY2hlY2sgU2lnblRyYW5zYWN0aW9uT3B0aW9ucy5zaWduaW5nU3RlcFxuICpcbiAqIFRPRE8gQlRDLTI3NjogVGhpcyBjYWNoZSBtYXkgbmVlZCB0byBiZSBkb25lIHdpdGggTFJVIGxpa2UgbWVtb3J5IHNhZmUgY2FjaGluZyBpZiBtZW1vcnkgaXNzdWVzIGNvbWVzIHVwLlxuICovXG5jb25zdCBQU0JUX0NBQ0hFID0gbmV3IE1hcDxzdHJpbmcsIHV0eG9saWIuYml0Z28uVXR4b1BzYnQ+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHR4OiBEZWNvZGVkVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gIHNpZ25lcktleWNoYWluOiBCSVAzMkludGVyZmFjZSB8IHVuZGVmaW5lZCxcbiAgcGFyYW1zOiB7XG4gICAgd2FsbGV0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0eEluZm86IHsgdW5zcGVudHM/OiB1dHhvbGliLmJpdGdvLlVuc3BlbnQ8VE51bWJlcj5bXSB9IHwgdW5kZWZpbmVkO1xuICAgIGlzTGFzdFNpZ25hdHVyZTogYm9vbGVhbjtcbiAgICBzaWduaW5nU3RlcDogJ3NpZ25lck5vbmNlJyB8ICdjb3NpZ25lck5vbmNlJyB8ICdzaWduZXJTaWduYXR1cmUnIHwgdW5kZWZpbmVkO1xuICAgIC8qKiBkZXByZWNhdGVkICovXG4gICAgYWxsb3dOb25TZWd3aXRTaWduaW5nV2l0aG91dFByZXZUeDogYm9vbGVhbjtcbiAgICBwdWJzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBjb3NpZ25lclB1Yjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9XG4pOiBQcm9taXNlPHsgdHhIZXg6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQgPSB0eCBpbnN0YW5jZW9mIGJpdGdvLlV0eG9Qc2J0ICYmIGJpdGdvLmlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kSW5wdXQodHgpO1xuXG4gIGxldCBpc0xhc3RTaWduYXR1cmUgPSBmYWxzZTtcbiAgaWYgKF8uaXNCb29sZWFuKHBhcmFtcy5pc0xhc3RTaWduYXR1cmUpKSB7XG4gICAgLy8gV2UgY2FuIG9ubHkgYmUgdGhlIGZpcnN0IHNpZ25hdHVyZSBvbiBhIHRyYW5zYWN0aW9uIHdpdGggdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCBpbnB1dHMgYmVjYXVzZVxuICAgIC8vIHdlIHJlcXVpcmUgdGhlIHNlY3JldCBub25jZSBpbiB0aGUgY2FjaGUgb2YgdGhlIGZpcnN0IHNpZ25lciwgd2hpY2ggaXMgaW1wb3NzaWJsZSB0byByZXRyaWV2ZSBpZlxuICAgIC8vIGRlc2VyaWFsaXplZCBmcm9tIGEgaGV4LlxuICAgIGlmIChwYXJhbXMuaXNMYXN0U2lnbmF0dXJlICYmIGlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGJlIGxhc3Qgc2lnbmF0dXJlIG9uIGEgdHJhbnNhY3Rpb24gd2l0aCBrZXkgcGF0aCBzcGVuZCBpbnB1dHMnKTtcbiAgICB9XG5cbiAgICAvLyBpZiBidWlsZCBpcyBjYWxsZWQgaW5zdGVhZCBvZiBidWlsZEluY29tcGxldGUsIG5vIHNpZ25hdHVyZSBwbGFjZWhvbGRlcnMgYXJlIGxlZnQgaW4gdGhlIHNpZyBzY3JpcHRcbiAgICBpc0xhc3RTaWduYXR1cmUgPSBwYXJhbXMuaXNMYXN0U2lnbmF0dXJlO1xuICB9XG5cbiAgaWYgKHR4IGluc3RhbmNlb2YgYml0Z28uVXR4b1BzYnQgJiYgaXNUeFdpdGhLZXlQYXRoU3BlbmRJbnB1dCkge1xuICAgIHN3aXRjaCAocGFyYW1zLnNpZ25pbmdTdGVwKSB7XG4gICAgICBjYXNlICdzaWduZXJOb25jZSc6XG4gICAgICAgIGFzc2VydChzaWduZXJLZXljaGFpbik7XG4gICAgICAgIHR4LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoc2lnbmVyS2V5Y2hhaW4pO1xuICAgICAgICBQU0JUX0NBQ0hFLnNldCh0eC5nZXRVbnNpZ25lZFR4KCkuZ2V0SWQoKSwgdHgpO1xuICAgICAgICByZXR1cm4geyB0eEhleDogdHgudG9IZXgoKSB9O1xuICAgICAgY2FzZSAnY29zaWduZXJOb25jZSc6XG4gICAgICAgIGFzc2VydChwYXJhbXMud2FsbGV0SWQsICd3YWxsZXRJZCBpcyByZXF1aXJlZCBmb3IgTXVTaWcyIGJpdGdvIG5vbmNlJyk7XG4gICAgICAgIHJldHVybiB7IHR4SGV4OiAoYXdhaXQgY29pbi5zaWduUHNidCh0eC50b0hleCgpLCBwYXJhbXMud2FsbGV0SWQpKS5wc2J0IH07XG4gICAgICBjYXNlICdzaWduZXJTaWduYXR1cmUnOlxuICAgICAgICBjb25zdCB0eElkID0gdHguZ2V0VW5zaWduZWRUeCgpLmdldElkKCk7XG4gICAgICAgIGNvbnN0IHBzYnQgPSBQU0JUX0NBQ0hFLmdldCh0eElkKTtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHBzYnQsXG4gICAgICAgICAgYFBzYnQgaXMgbWlzc2luZyBmcm9tIHR4Q2FjaGUgKGNhY2hlIHNpemUgJHtQU0JUX0NBQ0hFLnNpemV9KS5cbiAgICAgICAgICAgIFRoaXMgbWF5IGJlIGR1ZSB0byB0aGUgcmVxdWVzdCBiZWluZyByb3V0ZWQgdG8gYSBkaWZmZXJlbnQgQml0R28tRXhwcmVzcyBpbnN0YW5jZSB0aGF0IGZvciBzaWduaW5nIHN0ZXAgJ3NpZ25lck5vbmNlJy5gXG4gICAgICAgICk7XG4gICAgICAgIFBTQlRfQ0FDSEUuZGVsZXRlKHR4SWQpO1xuICAgICAgICB0eCA9IHBzYnQuY29tYmluZSh0eCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gdGhpcyBpbnN0YW5jZSBpcyBub3QgYW4gZXh0ZXJuYWwgc2lnbmVyXG4gICAgICAgIGFzc2VydChwYXJhbXMud2FsbGV0SWQsICd3YWxsZXRJZCBpcyByZXF1aXJlZCBmb3IgTXVTaWcyIGJpdGdvIG5vbmNlJyk7XG4gICAgICAgIGFzc2VydChzaWduZXJLZXljaGFpbik7XG4gICAgICAgIHR4LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQoc2lnbmVyS2V5Y2hhaW4pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvaW4uc2lnblBzYnQodHgudG9IZXgoKSwgcGFyYW1zLndhbGxldElkKTtcbiAgICAgICAgdHguY29tYmluZShiaXRnby5jcmVhdGVQc2J0RnJvbUhleChyZXNwb25zZS5wc2J0LCBjb2luLm5ldHdvcmspKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAocGFyYW1zLnNpZ25pbmdTdGVwKSB7XG4gICAgICBjYXNlICdzaWduZXJOb25jZSc6XG4gICAgICBjYXNlICdjb3NpZ25lck5vbmNlJzpcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIGNlcnRhaW4gY2FzZXMsIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgbWF5IG5vdCBrbm93IHdoZXRoZXIgdGhlIHR4SGV4IGNvbnRhaW5zIGEgcHNidCB3aXRoIHRhcHJvb3Qga2V5IHBhdGggc3BlbmQgaW5wdXQocykuXG4gICAgICAgICAqIEluc3RlYWQgb2YgdGhyb3dpbmcgZXJyb3IsIG5vLW9wIGFuZCByZXR1cm4gdGhlIHR4SGV4LiBTbyB0aGF0IHRoZSBjYWxsZXIgY2FuIGNhbGwgdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgc2VxdWVuY2UuXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4geyB0eEhleDogdHgudG9IZXgoKSB9O1xuICAgIH1cbiAgfVxuXG4gIGxldCBzaWduZWRUcmFuc2FjdGlvbjogYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD4gfCBiaXRnby5VdHhvUHNidDtcbiAgaWYgKHR4IGluc3RhbmNlb2YgYml0Z28uVXR4b1BzYnQpIHtcbiAgICBhc3NlcnQoc2lnbmVyS2V5Y2hhaW4pO1xuICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gc2lnbkFuZFZlcmlmeVBzYnQodHgsIHNpZ25lcktleWNoYWluLCB7XG4gICAgICBpc0xhc3RTaWduYXR1cmUsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR4Lmlucy5sZW5ndGggIT09IHBhcmFtcy50eEluZm8/LnVuc3BlbnRzPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGVuZ3RoIG9mIHVuc3BlbnRzIGFycmF5IHNob3VsZCBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIGlucHV0cycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnB1YnMgfHwgIWlzVHJpcGxlKHBhcmFtcy5wdWJzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgeHB1YiBhcnJheWApO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHBhcmFtcy5wdWJzLm1hcCgocHViKSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT47XG4gICAgY29uc3QgY29zaWduZXJQdWIgPSBwYXJhbXMuY29zaWduZXJQdWIgPz8gcGFyYW1zLnB1YnNbMl07XG4gICAgY29uc3QgY29zaWduZXJLZXljaGFpbiA9IGJpcDMyLmZyb21CYXNlNTgoY29zaWduZXJQdWIpO1xuXG4gICAgYXNzZXJ0KHNpZ25lcktleWNoYWluKTtcbiAgICBjb25zdCB3YWxsZXRTaWduZXIgPSBuZXcgYml0Z28uV2FsbGV0VW5zcGVudFNpZ25lcjxSb290V2FsbGV0S2V5cz4oa2V5Y2hhaW5zLCBzaWduZXJLZXljaGFpbiwgY29zaWduZXJLZXljaGFpbik7XG4gICAgc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb24odHgsIHBhcmFtcy50eEluZm8udW5zcGVudHMsIHdhbGxldFNpZ25lciwge1xuICAgICAgaXNMYXN0U2lnbmF0dXJlLFxuICAgIH0pIGFzIGJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQ+O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eEhleDogc2lnbmVkVHJhbnNhY3Rpb24udG9CdWZmZXIoKS50b1N0cmluZygnaGV4JyksXG4gIH07XG59XG4iXX0=