@bitgo-beta/abstract-utxo 1.1.1-beta.21 → 1.1.1-beta.2100

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 (829) hide show
  1. package/README.md +76 -0
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts +461 -0
  3. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  4. package/dist/cjs/src/abstractUtxoCoin.js +651 -0
  5. package/dist/cjs/src/address/fixedScript.d.ts +44 -0
  6. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  7. package/dist/cjs/src/address/fixedScript.js +108 -0
  8. package/dist/cjs/src/address/index.d.ts +2 -0
  9. package/dist/cjs/src/address/index.d.ts.map +1 -0
  10. package/dist/cjs/src/address/index.js +8 -0
  11. package/dist/{src → cjs/src}/config.d.ts +1 -0
  12. package/dist/cjs/src/config.d.ts.map +1 -0
  13. package/dist/cjs/src/config.js +14 -0
  14. package/dist/cjs/src/deriveKeyWithSeed.d.ts +12 -0
  15. package/dist/cjs/src/deriveKeyWithSeed.d.ts.map +1 -0
  16. package/dist/cjs/src/deriveKeyWithSeed.js +17 -0
  17. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +19 -0
  18. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  19. package/dist/cjs/src/descriptor/NamedDescriptor.js +77 -0
  20. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  21. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  22. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +33 -0
  23. package/dist/cjs/src/descriptor/builder/builder.d.ts +17 -0
  24. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  25. package/dist/cjs/src/descriptor/builder/builder.js +54 -0
  26. package/dist/cjs/src/descriptor/builder/index.d.ts +3 -0
  27. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  28. package/dist/cjs/src/descriptor/builder/index.js +8 -0
  29. package/dist/cjs/src/descriptor/builder/parse.d.ts +5 -0
  30. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  31. package/dist/cjs/src/descriptor/builder/parse.js +148 -0
  32. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  33. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  34. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  35. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +12 -0
  36. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  37. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  38. package/dist/cjs/src/descriptor/createWallet/index.d.ts +3 -0
  39. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  40. package/dist/cjs/src/descriptor/createWallet/index.js +19 -0
  41. package/dist/cjs/src/descriptor/descriptorWallet.d.ts +19 -0
  42. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  43. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  44. package/dist/cjs/src/descriptor/index.d.ts +9 -0
  45. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  46. package/dist/cjs/src/descriptor/index.js +53 -0
  47. package/dist/cjs/src/descriptor/validatePolicy.d.ts +22 -0
  48. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  49. package/dist/cjs/src/descriptor/validatePolicy.js +94 -0
  50. package/dist/cjs/src/impl/bch/bch.d.ts +22 -0
  51. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  52. package/dist/cjs/src/impl/bch/bch.js +43 -0
  53. package/dist/cjs/src/impl/bch/index.d.ts +3 -0
  54. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  55. package/dist/cjs/src/impl/bch/index.js +19 -0
  56. package/dist/cjs/src/impl/bch/tbch.d.ts +12 -0
  57. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  58. package/dist/cjs/src/impl/bch/tbch.js +15 -0
  59. package/dist/cjs/src/impl/bcha/bcha.d.ts +9 -0
  60. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  61. package/dist/cjs/src/impl/bcha/bcha.js +15 -0
  62. package/dist/cjs/src/impl/bcha/index.d.ts +3 -0
  63. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  64. package/dist/cjs/src/impl/bcha/index.js +19 -0
  65. package/dist/cjs/src/impl/bcha/tbcha.d.ts +12 -0
  66. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  67. package/dist/cjs/src/impl/bcha/tbcha.js +15 -0
  68. package/dist/cjs/src/impl/bsv/bsv.d.ts +9 -0
  69. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  70. package/dist/cjs/src/impl/bsv/bsv.js +15 -0
  71. package/dist/cjs/src/impl/bsv/index.d.ts +3 -0
  72. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  73. package/dist/cjs/src/impl/bsv/index.js +19 -0
  74. package/dist/cjs/src/impl/bsv/tbsv.d.ts +12 -0
  75. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  76. package/dist/cjs/src/impl/bsv/tbsv.js +15 -0
  77. package/dist/cjs/src/impl/btc/btc.d.ts +15 -0
  78. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  79. package/dist/cjs/src/impl/btc/btc.js +22 -0
  80. package/dist/cjs/src/impl/btc/index.d.ts +7 -0
  81. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  82. package/dist/cjs/src/impl/btc/index.js +23 -0
  83. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts +61 -0
  84. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  85. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +170 -0
  86. package/dist/cjs/src/impl/btc/tbtc.d.ts +12 -0
  87. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  88. package/dist/cjs/src/impl/btc/tbtc.js +15 -0
  89. package/dist/cjs/src/impl/btc/tbtc4.d.ts +12 -0
  90. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  91. package/dist/cjs/src/impl/btc/tbtc4.js +15 -0
  92. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts +12 -0
  93. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  94. package/dist/cjs/src/impl/btc/tbtcbgsig.js +15 -0
  95. package/dist/cjs/src/impl/btc/tbtcsig.d.ts +12 -0
  96. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  97. package/dist/cjs/src/impl/btc/tbtcsig.js +15 -0
  98. package/dist/cjs/src/impl/btg/btg.d.ts +9 -0
  99. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  100. package/dist/cjs/src/impl/btg/btg.js +15 -0
  101. package/dist/cjs/src/impl/btg/index.d.ts +2 -0
  102. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  103. package/dist/cjs/src/impl/btg/index.js +18 -0
  104. package/dist/cjs/src/impl/dash/dash.d.ts +9 -0
  105. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  106. package/dist/cjs/src/impl/dash/dash.js +15 -0
  107. package/dist/cjs/src/impl/dash/index.d.ts +3 -0
  108. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  109. package/dist/cjs/src/impl/dash/index.js +19 -0
  110. package/dist/cjs/src/impl/dash/tdash.d.ts +12 -0
  111. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  112. package/dist/cjs/src/impl/dash/tdash.js +15 -0
  113. package/dist/cjs/src/impl/doge/doge.d.ts +33 -0
  114. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  115. package/dist/cjs/src/impl/doge/doge.js +76 -0
  116. package/dist/cjs/src/impl/doge/index.d.ts +3 -0
  117. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  118. package/dist/cjs/src/impl/doge/index.js +19 -0
  119. package/dist/cjs/src/impl/doge/tdoge.d.ts +12 -0
  120. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  121. package/dist/cjs/src/impl/doge/tdoge.js +15 -0
  122. package/dist/cjs/src/impl/index.d.ts +10 -0
  123. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  124. package/dist/cjs/src/impl/index.js +46 -0
  125. package/dist/cjs/src/impl/ltc/index.d.ts +3 -0
  126. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  127. package/dist/cjs/src/impl/ltc/index.js +19 -0
  128. package/dist/cjs/src/impl/ltc/ltc.d.ts +8 -0
  129. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  130. package/dist/cjs/src/impl/ltc/ltc.js +15 -0
  131. package/dist/cjs/src/impl/ltc/tltc.d.ts +8 -0
  132. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  133. package/dist/cjs/src/impl/ltc/tltc.js +15 -0
  134. package/dist/cjs/src/impl/zec/index.d.ts +3 -0
  135. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  136. package/dist/cjs/src/impl/zec/index.js +19 -0
  137. package/dist/cjs/src/impl/zec/tzec.d.ts +9 -0
  138. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  139. package/dist/cjs/src/impl/zec/tzec.js +15 -0
  140. package/dist/cjs/src/impl/zec/zec.d.ts +12 -0
  141. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  142. package/dist/cjs/src/impl/zec/zec.js +15 -0
  143. package/dist/cjs/src/index.d.ts +22 -0
  144. package/dist/cjs/src/index.d.ts.map +1 -0
  145. package/dist/cjs/src/index.js +61 -0
  146. package/dist/cjs/src/keychains.d.ts +55 -0
  147. package/dist/cjs/src/keychains.d.ts.map +1 -0
  148. package/dist/cjs/src/keychains.js +143 -0
  149. package/dist/cjs/src/names.d.ts +13 -0
  150. package/dist/cjs/src/names.d.ts.map +1 -0
  151. package/dist/cjs/src/names.js +93 -0
  152. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  153. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  154. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +22 -0
  155. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts +46 -0
  156. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  157. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  158. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts +16 -0
  159. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  160. package/dist/cjs/src/offlineVault/TransactionExplanation.js +15 -0
  161. package/dist/cjs/src/offlineVault/descriptor/index.d.ts +2 -0
  162. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  163. package/dist/cjs/src/offlineVault/descriptor/index.js +18 -0
  164. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +39 -0
  165. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  166. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  167. package/dist/cjs/src/offlineVault/index.d.ts +6 -0
  168. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  169. package/dist/cjs/src/offlineVault/index.js +44 -0
  170. package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +6 -7
  171. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  172. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  173. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +158 -0
  174. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  175. package/dist/cjs/src/recovery/backupKeyRecovery.js +411 -0
  176. package/dist/{src → cjs/src}/recovery/baseApi.d.ts +3 -6
  177. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  178. package/dist/cjs/src/recovery/baseApi.js +73 -0
  179. package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -3
  180. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  181. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  182. package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +30 -30
  183. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  184. package/dist/cjs/src/recovery/crossChainRecovery.js +299 -0
  185. package/dist/{src → cjs/src}/recovery/index.d.ts +0 -1
  186. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  187. package/dist/{src → cjs/src}/recovery/index.js +6 -3
  188. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  189. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  190. package/dist/cjs/src/recovery/psbt.d.ts +62 -0
  191. package/dist/cjs/src/recovery/psbt.d.ts.map +1 -0
  192. package/dist/cjs/src/recovery/psbt.js +153 -0
  193. package/dist/cjs/src/tnumber.d.ts +4 -0
  194. package/dist/cjs/src/tnumber.d.ts.map +1 -0
  195. package/dist/cjs/src/tnumber.js +12 -0
  196. package/dist/cjs/src/transaction/bip322.d.ts +27 -0
  197. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  198. package/dist/cjs/src/transaction/bip322.js +139 -0
  199. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts +2 -0
  200. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  201. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  202. package/dist/cjs/src/transaction/decode.d.ts +21 -0
  203. package/dist/cjs/src/transaction/decode.d.ts.map +1 -0
  204. package/dist/cjs/src/transaction/decode.js +45 -0
  205. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +5 -0
  206. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  207. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +47 -0
  208. package/dist/cjs/src/transaction/descriptor/index.d.ts +7 -0
  209. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  210. package/dist/cjs/src/transaction/descriptor/index.js +14 -0
  211. package/dist/cjs/src/transaction/descriptor/parse.d.ts +18 -0
  212. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  213. package/dist/cjs/src/transaction/descriptor/parse.js +86 -0
  214. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts +14 -0
  215. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  216. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  217. package/dist/cjs/src/transaction/descriptor/recipient.d.ts +5 -0
  218. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  219. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  220. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +25 -0
  221. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  222. package/dist/cjs/src/transaction/descriptor/signPsbt.js +44 -0
  223. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +36 -0
  224. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  225. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +90 -0
  226. package/dist/cjs/src/transaction/explainTransaction.d.ts +18 -0
  227. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  228. package/dist/cjs/src/transaction/explainTransaction.js +84 -0
  229. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +24 -0
  230. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -0
  231. package/dist/cjs/src/transaction/fixedScript/SigningError.js +32 -0
  232. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
  233. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  234. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +149 -0
  235. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +47 -0
  236. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  237. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +3 -0
  238. package/dist/cjs/src/transaction/fixedScript/index.d.ts +8 -0
  239. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  240. package/dist/cjs/src/transaction/fixedScript/index.js +30 -0
  241. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts +4 -0
  242. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts.map +1 -0
  243. package/dist/cjs/src/transaction/fixedScript/musig2.js +3 -0
  244. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts +28 -0
  245. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  246. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +216 -0
  247. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts +8 -0
  248. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  249. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +227 -0
  250. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts +10 -0
  251. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  252. package/dist/cjs/src/transaction/fixedScript/replayProtection.js +44 -0
  253. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  254. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  255. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +118 -0
  256. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +22 -0
  257. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  258. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +46 -0
  259. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  260. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  261. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +182 -0
  262. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  263. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  264. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.js +20 -0
  265. package/dist/cjs/src/transaction/index.d.ts +9 -0
  266. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  267. package/dist/cjs/src/transaction/index.js +52 -0
  268. package/dist/cjs/src/transaction/outputDifference.d.ts +44 -0
  269. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  270. package/dist/cjs/src/transaction/outputDifference.js +51 -0
  271. package/dist/cjs/src/transaction/parseTransaction.d.ts +4 -0
  272. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  273. package/dist/cjs/src/transaction/parseTransaction.js +48 -0
  274. package/dist/cjs/src/transaction/recipient.d.ts +34 -0
  275. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  276. package/dist/cjs/src/transaction/recipient.js +69 -0
  277. package/dist/cjs/src/transaction/signTransaction.d.ts +6 -0
  278. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  279. package/dist/cjs/src/transaction/signTransaction.js +105 -0
  280. package/dist/cjs/src/transaction/types.d.ts +47 -0
  281. package/dist/cjs/src/transaction/types.d.ts.map +1 -0
  282. package/dist/cjs/src/transaction/types.js +3 -0
  283. package/dist/cjs/src/transaction/verifyTransaction.d.ts +4 -0
  284. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  285. package/dist/cjs/src/transaction/verifyTransaction.js +50 -0
  286. package/dist/cjs/src/unspent.d.ts +59 -0
  287. package/dist/cjs/src/unspent.d.ts.map +1 -0
  288. package/dist/cjs/src/unspent.js +20 -0
  289. package/dist/cjs/src/verifyKey.d.ts +26 -0
  290. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  291. package/dist/cjs/src/verifyKey.js +125 -0
  292. package/dist/cjs/src/wallet.d.ts +15 -0
  293. package/dist/cjs/src/wallet.d.ts.map +1 -0
  294. package/dist/cjs/src/wallet.js +8 -0
  295. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  296. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  297. package/dist/cjs/test/integration/impl/bch/bch.js +76 -0
  298. package/dist/cjs/test/unit/address.d.ts +2 -0
  299. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  300. package/dist/cjs/test/unit/address.js +201 -0
  301. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  302. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  303. package/dist/cjs/test/unit/bip322.js +481 -0
  304. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts +2 -0
  305. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts.map +1 -0
  306. package/dist/cjs/test/unit/buildSignSendLegacyFormat.js +99 -0
  307. package/dist/cjs/test/unit/coins.d.ts +2 -0
  308. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  309. package/dist/cjs/test/unit/coins.js +161 -0
  310. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  311. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  312. package/dist/cjs/test/unit/customChangeWallet.js +204 -0
  313. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts +2 -0
  314. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts.map +1 -0
  315. package/dist/cjs/test/unit/customChangeWalletFixtures.js +53 -0
  316. package/dist/cjs/test/unit/customSigner.d.ts +2 -0
  317. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  318. package/dist/cjs/test/unit/customSigner.js +99 -0
  319. package/dist/cjs/test/unit/deriveKeyWithSeed.d.ts +2 -0
  320. package/dist/cjs/test/unit/deriveKeyWithSeed.d.ts.map +1 -0
  321. package/dist/cjs/test/unit/deriveKeyWithSeed.js +56 -0
  322. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  323. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  324. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +51 -0
  325. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  326. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  327. package/dist/cjs/test/unit/descriptor/builder.js +92 -0
  328. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  329. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  330. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +53 -0
  331. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  332. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  333. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +62 -0
  334. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  335. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  336. package/dist/cjs/test/unit/descriptorAddress.js +103 -0
  337. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  338. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  339. package/dist/cjs/test/unit/explainTransaction.js +37 -0
  340. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  341. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  342. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  343. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  344. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  345. package/dist/cjs/test/unit/impl/bch/unit/bch.js +71 -0
  346. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  347. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  348. package/dist/cjs/test/unit/impl/bcha/unit/index.js +41 -0
  349. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  350. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  351. package/dist/cjs/test/unit/impl/bsv/unit/index.js +34 -0
  352. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  353. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  354. package/dist/cjs/test/unit/impl/btg/unit/index.js +33 -0
  355. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  356. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  357. package/dist/cjs/test/unit/impl/dash/unit/index.js +34 -0
  358. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  359. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  360. package/dist/cjs/test/unit/impl/doge/unit/index.js +34 -0
  361. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  362. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  363. package/dist/cjs/test/unit/impl/zec/unit/index.js +30 -0
  364. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  365. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  366. package/dist/cjs/test/unit/keySignatures.js +54 -0
  367. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  368. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  369. package/dist/cjs/test/unit/keychains.js +87 -0
  370. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  371. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  372. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  373. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  374. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  375. package/dist/cjs/test/unit/parseTransaction.js +155 -0
  376. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts +2 -0
  377. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts.map +1 -0
  378. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.js +99 -0
  379. package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
  380. package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
  381. package/dist/cjs/test/unit/postProcessPrebuild.js +65 -0
  382. package/dist/cjs/test/unit/prebuildAndSign.d.ts +2 -0
  383. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  384. package/dist/cjs/test/unit/prebuildAndSign.js +218 -0
  385. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  386. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  387. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +136 -0
  388. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
  389. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
  390. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -0
  391. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  392. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  393. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +297 -0
  394. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
  395. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
  396. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +189 -0
  397. package/dist/cjs/test/unit/recovery/mock.d.ts +37 -0
  398. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  399. package/dist/cjs/test/unit/recovery/mock.js +111 -0
  400. package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
  401. package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
  402. package/dist/cjs/test/unit/signTransaction.js +223 -0
  403. package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
  404. package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
  405. package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
  406. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  407. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  408. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +64 -0
  409. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  410. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  411. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +51 -0
  412. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  413. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  414. package/dist/cjs/test/unit/transaction/descriptor/parse.js +138 -0
  415. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  416. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  417. package/dist/cjs/test/unit/transaction/descriptor/sign.js +76 -0
  418. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts +2 -0
  419. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts.map +1 -0
  420. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.js +100 -0
  421. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts +2 -0
  422. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts.map +1 -0
  423. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.js +84 -0
  424. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  425. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  426. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +81 -0
  427. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.d.ts +2 -0
  428. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.d.ts.map +1 -0
  429. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.js +102 -0
  430. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  431. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  432. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +171 -0
  433. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
  434. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
  435. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +222 -0
  436. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts +2 -0
  437. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  438. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.js +60 -0
  439. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts +2 -0
  440. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts.map +1 -0
  441. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +98 -0
  442. package/dist/cjs/test/unit/transaction/outputDifference.d.ts +2 -0
  443. package/dist/cjs/test/unit/transaction/outputDifference.d.ts.map +1 -0
  444. package/dist/cjs/test/unit/transaction/outputDifference.js +117 -0
  445. package/dist/cjs/test/unit/transaction/recipient.d.ts +2 -0
  446. package/dist/cjs/test/unit/transaction/recipient.d.ts.map +1 -0
  447. package/dist/cjs/test/unit/transaction/recipient.js +52 -0
  448. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  449. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  450. package/dist/cjs/test/unit/transaction.js +301 -0
  451. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  452. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  453. package/dist/cjs/test/unit/txFormat.js +161 -0
  454. package/dist/cjs/test/unit/util/address.d.ts +13 -0
  455. package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
  456. package/dist/cjs/test/unit/util/address.js +15 -0
  457. package/dist/cjs/test/unit/util/assert.d.ts +3 -0
  458. package/dist/cjs/test/unit/util/assert.d.ts.map +1 -0
  459. package/dist/cjs/test/unit/util/assert.js +24 -0
  460. package/dist/cjs/test/unit/util/fixtures.d.ts +13 -0
  461. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  462. package/dist/cjs/test/unit/util/fixtures.js +105 -0
  463. package/dist/cjs/test/unit/util/index.d.ts +11 -0
  464. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  465. package/dist/cjs/test/unit/util/index.js +27 -0
  466. package/dist/cjs/test/unit/util/keychains.d.ts +55 -0
  467. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  468. package/dist/cjs/test/unit/util/keychains.js +122 -0
  469. package/dist/cjs/test/unit/util/nockBitGo.d.ts +10 -0
  470. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  471. package/dist/cjs/test/unit/util/nockBitGo.js +27 -0
  472. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  473. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  474. package/dist/cjs/test/unit/util/nockIndexerAPI.js +23 -0
  475. package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
  476. package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
  477. package/dist/cjs/test/unit/util/psbt.js +21 -0
  478. package/dist/cjs/test/unit/util/transaction.d.ts +28 -0
  479. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  480. package/dist/cjs/test/unit/util/transaction.js +131 -0
  481. package/dist/cjs/test/unit/util/unspents.d.ts +71 -0
  482. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  483. package/dist/cjs/test/unit/util/unspents.js +224 -0
  484. package/dist/cjs/test/unit/util/utxoCoins.d.ts +30 -0
  485. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  486. package/dist/cjs/test/unit/util/utxoCoins.js +175 -0
  487. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  488. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  489. package/dist/cjs/test/unit/util/wallet.js +9 -0
  490. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  491. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  492. package/dist/cjs/test/unit/verifyTransaction.js +536 -0
  493. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  494. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  495. package/dist/cjs/test/unit/wallet.js +251 -0
  496. package/dist/cjs/test/unit/webauthn.d.ts +2 -0
  497. package/dist/cjs/test/unit/webauthn.d.ts.map +1 -0
  498. package/dist/cjs/test/unit/webauthn.js +73 -0
  499. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  500. package/dist/esm/abstractUtxoCoin.d.ts +461 -0
  501. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  502. package/dist/esm/abstractUtxoCoin.js +643 -0
  503. package/dist/esm/address/fixedScript.d.ts +44 -0
  504. package/dist/esm/address/fixedScript.d.ts.map +1 -0
  505. package/dist/esm/address/fixedScript.js +100 -0
  506. package/dist/esm/address/index.d.ts +2 -0
  507. package/dist/esm/address/index.d.ts.map +1 -0
  508. package/dist/esm/address/index.js +2 -0
  509. package/dist/esm/config.d.ts +9 -0
  510. package/dist/{src → esm}/config.d.ts.map +1 -1
  511. package/dist/esm/config.js +11 -0
  512. package/dist/esm/deriveKeyWithSeed.d.ts +12 -0
  513. package/dist/esm/deriveKeyWithSeed.d.ts.map +1 -0
  514. package/dist/esm/deriveKeyWithSeed.js +14 -0
  515. package/dist/esm/descriptor/NamedDescriptor.d.ts +19 -0
  516. package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -0
  517. package/dist/esm/descriptor/NamedDescriptor.js +37 -0
  518. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  519. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  520. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  521. package/dist/esm/descriptor/builder/builder.d.ts +17 -0
  522. package/dist/esm/descriptor/builder/builder.d.ts.map +1 -0
  523. package/dist/esm/descriptor/builder/builder.js +51 -0
  524. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  525. package/dist/esm/descriptor/builder/index.d.ts.map +1 -0
  526. package/dist/esm/descriptor/builder/index.js +3 -0
  527. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  528. package/dist/esm/descriptor/builder/parse.d.ts.map +1 -0
  529. package/dist/esm/descriptor/builder/parse.js +144 -0
  530. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  531. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  532. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  533. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  534. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  535. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  536. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  537. package/dist/esm/descriptor/createWallet/index.d.ts.map +1 -0
  538. package/dist/esm/descriptor/createWallet/index.js +3 -0
  539. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  540. package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -0
  541. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  542. package/dist/esm/descriptor/index.d.ts +9 -0
  543. package/dist/esm/descriptor/index.d.ts.map +1 -0
  544. package/dist/esm/descriptor/index.js +7 -0
  545. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  546. package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -0
  547. package/dist/esm/descriptor/validatePolicy.js +82 -0
  548. package/dist/esm/impl/bch/bch.d.ts +22 -0
  549. package/dist/esm/impl/bch/bch.d.ts.map +1 -0
  550. package/dist/esm/impl/bch/bch.js +39 -0
  551. package/dist/esm/impl/bch/index.d.ts +3 -0
  552. package/dist/esm/impl/bch/index.d.ts.map +1 -0
  553. package/dist/esm/impl/bch/index.js +3 -0
  554. package/dist/esm/impl/bch/tbch.d.ts +12 -0
  555. package/dist/esm/impl/bch/tbch.d.ts.map +1 -0
  556. package/dist/esm/impl/bch/tbch.js +11 -0
  557. package/dist/esm/impl/bcha/bcha.d.ts +9 -0
  558. package/dist/esm/impl/bcha/bcha.d.ts.map +1 -0
  559. package/dist/esm/impl/bcha/bcha.js +11 -0
  560. package/dist/esm/impl/bcha/index.d.ts +3 -0
  561. package/dist/esm/impl/bcha/index.d.ts.map +1 -0
  562. package/dist/esm/impl/bcha/index.js +3 -0
  563. package/dist/esm/impl/bcha/tbcha.d.ts +12 -0
  564. package/dist/esm/impl/bcha/tbcha.d.ts.map +1 -0
  565. package/dist/esm/impl/bcha/tbcha.js +11 -0
  566. package/dist/esm/impl/bsv/bsv.d.ts +9 -0
  567. package/dist/esm/impl/bsv/bsv.d.ts.map +1 -0
  568. package/dist/esm/impl/bsv/bsv.js +11 -0
  569. package/dist/esm/impl/bsv/index.d.ts +3 -0
  570. package/dist/esm/impl/bsv/index.d.ts.map +1 -0
  571. package/dist/esm/impl/bsv/index.js +3 -0
  572. package/dist/esm/impl/bsv/tbsv.d.ts +12 -0
  573. package/dist/esm/impl/bsv/tbsv.d.ts.map +1 -0
  574. package/dist/esm/impl/bsv/tbsv.js +11 -0
  575. package/dist/esm/impl/btc/btc.d.ts +15 -0
  576. package/dist/esm/impl/btc/btc.d.ts.map +1 -0
  577. package/dist/esm/impl/btc/btc.js +18 -0
  578. package/dist/esm/impl/btc/index.d.ts +7 -0
  579. package/dist/esm/impl/btc/index.d.ts.map +1 -0
  580. package/dist/esm/impl/btc/index.js +7 -0
  581. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +61 -0
  582. package/dist/esm/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  583. package/dist/esm/impl/btc/inscriptionBuilder.js +163 -0
  584. package/dist/esm/impl/btc/tbtc.d.ts +12 -0
  585. package/dist/esm/impl/btc/tbtc.d.ts.map +1 -0
  586. package/dist/esm/impl/btc/tbtc.js +11 -0
  587. package/dist/esm/impl/btc/tbtc4.d.ts +12 -0
  588. package/dist/esm/impl/btc/tbtc4.d.ts.map +1 -0
  589. package/dist/esm/impl/btc/tbtc4.js +11 -0
  590. package/dist/esm/impl/btc/tbtcbgsig.d.ts +12 -0
  591. package/dist/esm/impl/btc/tbtcbgsig.d.ts.map +1 -0
  592. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  593. package/dist/esm/impl/btc/tbtcsig.d.ts +12 -0
  594. package/dist/esm/impl/btc/tbtcsig.d.ts.map +1 -0
  595. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  596. package/dist/esm/impl/btg/btg.d.ts +9 -0
  597. package/dist/esm/impl/btg/btg.d.ts.map +1 -0
  598. package/dist/esm/impl/btg/btg.js +11 -0
  599. package/dist/esm/impl/btg/index.d.ts +2 -0
  600. package/dist/esm/impl/btg/index.d.ts.map +1 -0
  601. package/dist/esm/impl/btg/index.js +2 -0
  602. package/dist/esm/impl/dash/dash.d.ts +9 -0
  603. package/dist/esm/impl/dash/dash.d.ts.map +1 -0
  604. package/dist/esm/impl/dash/dash.js +11 -0
  605. package/dist/esm/impl/dash/index.d.ts +3 -0
  606. package/dist/esm/impl/dash/index.d.ts.map +1 -0
  607. package/dist/esm/impl/dash/index.js +3 -0
  608. package/dist/esm/impl/dash/tdash.d.ts +12 -0
  609. package/dist/esm/impl/dash/tdash.d.ts.map +1 -0
  610. package/dist/esm/impl/dash/tdash.js +11 -0
  611. package/dist/esm/impl/doge/doge.d.ts +33 -0
  612. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  613. package/dist/esm/impl/doge/doge.js +72 -0
  614. package/dist/esm/impl/doge/index.d.ts +3 -0
  615. package/dist/esm/impl/doge/index.d.ts.map +1 -0
  616. package/dist/esm/impl/doge/index.js +3 -0
  617. package/dist/esm/impl/doge/tdoge.d.ts +12 -0
  618. package/dist/esm/impl/doge/tdoge.d.ts.map +1 -0
  619. package/dist/esm/impl/doge/tdoge.js +11 -0
  620. package/dist/esm/impl/index.d.ts +10 -0
  621. package/dist/esm/impl/index.d.ts.map +1 -0
  622. package/dist/esm/impl/index.js +10 -0
  623. package/dist/esm/impl/ltc/index.d.ts +3 -0
  624. package/dist/esm/impl/ltc/index.d.ts.map +1 -0
  625. package/dist/esm/impl/ltc/index.js +3 -0
  626. package/dist/esm/impl/ltc/ltc.d.ts +8 -0
  627. package/dist/esm/impl/ltc/ltc.d.ts.map +1 -0
  628. package/dist/esm/impl/ltc/ltc.js +11 -0
  629. package/dist/esm/impl/ltc/tltc.d.ts +8 -0
  630. package/dist/esm/impl/ltc/tltc.d.ts.map +1 -0
  631. package/dist/esm/impl/ltc/tltc.js +11 -0
  632. package/dist/esm/impl/zec/index.d.ts +3 -0
  633. package/dist/esm/impl/zec/index.d.ts.map +1 -0
  634. package/dist/esm/impl/zec/index.js +3 -0
  635. package/dist/esm/impl/zec/tzec.d.ts +9 -0
  636. package/dist/esm/impl/zec/tzec.d.ts.map +1 -0
  637. package/dist/esm/impl/zec/tzec.js +11 -0
  638. package/dist/esm/impl/zec/zec.d.ts +12 -0
  639. package/dist/esm/impl/zec/zec.d.ts.map +1 -0
  640. package/dist/esm/impl/zec/zec.js +11 -0
  641. package/dist/esm/index.d.ts +22 -0
  642. package/dist/esm/index.d.ts.map +1 -0
  643. package/dist/esm/index.js +22 -0
  644. package/dist/esm/keychains.d.ts +55 -0
  645. package/dist/esm/keychains.d.ts.map +1 -0
  646. package/dist/esm/keychains.js +98 -0
  647. package/dist/esm/names.d.ts +13 -0
  648. package/dist/esm/names.d.ts.map +1 -0
  649. package/dist/esm/names.js +83 -0
  650. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  651. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  652. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +19 -0
  653. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  654. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  655. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  656. package/dist/esm/offlineVault/TransactionExplanation.d.ts +16 -0
  657. package/dist/esm/offlineVault/TransactionExplanation.d.ts.map +1 -0
  658. package/dist/esm/offlineVault/TransactionExplanation.js +12 -0
  659. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  660. package/dist/esm/offlineVault/descriptor/index.d.ts.map +1 -0
  661. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  662. package/dist/esm/offlineVault/descriptor/transaction.d.ts +39 -0
  663. package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -0
  664. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  665. package/dist/esm/offlineVault/index.d.ts +6 -0
  666. package/dist/esm/offlineVault/index.d.ts.map +1 -0
  667. package/dist/esm/offlineVault/index.js +4 -0
  668. package/dist/esm/recovery/RecoveryProvider.d.ts +20 -0
  669. package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -0
  670. package/dist/esm/recovery/RecoveryProvider.js +19 -0
  671. package/dist/esm/recovery/backupKeyRecovery.d.ts +158 -0
  672. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -0
  673. package/dist/esm/recovery/backupKeyRecovery.js +400 -0
  674. package/dist/esm/recovery/baseApi.d.ts +24 -0
  675. package/dist/esm/recovery/baseApi.d.ts.map +1 -0
  676. package/dist/esm/recovery/baseApi.js +64 -0
  677. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  678. package/dist/esm/recovery/coingeckoApi.d.ts.map +1 -0
  679. package/dist/esm/recovery/coingeckoApi.js +40 -0
  680. package/dist/esm/recovery/crossChainRecovery.d.ts +97 -0
  681. package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -0
  682. package/dist/esm/recovery/crossChainRecovery.js +292 -0
  683. package/dist/esm/recovery/index.d.ts +7 -0
  684. package/dist/{src → esm}/recovery/index.d.ts.map +1 -1
  685. package/dist/esm/recovery/index.js +7 -0
  686. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  687. package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +1 -1
  688. package/dist/esm/recovery/mempoolApi.js +29 -0
  689. package/dist/esm/recovery/psbt.d.ts +62 -0
  690. package/dist/esm/recovery/psbt.d.ts.map +1 -0
  691. package/dist/esm/recovery/psbt.js +145 -0
  692. package/dist/esm/tnumber.d.ts +4 -0
  693. package/dist/esm/tnumber.d.ts.map +1 -0
  694. package/dist/esm/tnumber.js +9 -0
  695. package/dist/esm/transaction/bip322.d.ts +27 -0
  696. package/dist/esm/transaction/bip322.d.ts.map +1 -0
  697. package/dist/esm/transaction/bip322.js +100 -0
  698. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  699. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  700. package/dist/esm/transaction/common/verifyPayGoAmount.js +1 -0
  701. package/dist/esm/transaction/decode.d.ts +21 -0
  702. package/dist/esm/transaction/decode.d.ts.map +1 -0
  703. package/dist/esm/transaction/decode.js +39 -0
  704. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  705. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  706. package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
  707. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  708. package/dist/esm/transaction/descriptor/index.d.ts.map +1 -0
  709. package/dist/esm/transaction/descriptor/index.js +6 -0
  710. package/dist/esm/transaction/descriptor/parse.d.ts +18 -0
  711. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
  712. package/dist/esm/transaction/descriptor/parse.js +82 -0
  713. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
  714. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  715. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  716. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  717. package/dist/esm/transaction/descriptor/recipient.d.ts.map +1 -0
  718. package/dist/esm/transaction/descriptor/recipient.js +2 -0
  719. package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
  720. package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -0
  721. package/dist/esm/transaction/descriptor/signPsbt.js +39 -0
  722. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +36 -0
  723. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  724. package/dist/esm/transaction/descriptor/verifyTransaction.js +80 -0
  725. package/dist/esm/transaction/explainTransaction.d.ts +18 -0
  726. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  727. package/dist/esm/transaction/explainTransaction.js +48 -0
  728. package/dist/esm/transaction/fixedScript/SigningError.d.ts +24 -0
  729. package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -0
  730. package/dist/esm/transaction/fixedScript/SigningError.js +26 -0
  731. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
  732. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  733. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +144 -0
  734. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +47 -0
  735. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  736. package/dist/esm/transaction/fixedScript/explainTransaction.js +2 -0
  737. package/dist/esm/transaction/fixedScript/index.d.ts +8 -0
  738. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  739. package/dist/esm/transaction/fixedScript/index.js +7 -0
  740. package/dist/esm/transaction/fixedScript/musig2.d.ts +4 -0
  741. package/dist/esm/transaction/fixedScript/musig2.d.ts.map +1 -0
  742. package/dist/esm/transaction/fixedScript/musig2.js +2 -0
  743. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
  744. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  745. package/dist/esm/transaction/fixedScript/parseOutput.js +209 -0
  746. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
  747. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  748. package/dist/esm/transaction/fixedScript/parseTransaction.js +221 -0
  749. package/dist/esm/transaction/fixedScript/replayProtection.d.ts +10 -0
  750. package/dist/esm/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  751. package/dist/esm/transaction/fixedScript/replayProtection.js +38 -0
  752. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  753. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  754. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +111 -0
  755. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +22 -0
  756. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  757. package/dist/esm/transaction/fixedScript/signTransaction.js +39 -0
  758. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  759. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  760. package/dist/esm/transaction/fixedScript/verifyTransaction.js +176 -0
  761. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  762. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  763. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  764. package/dist/esm/transaction/index.d.ts +9 -0
  765. package/dist/esm/transaction/index.d.ts.map +1 -0
  766. package/dist/esm/transaction/index.js +9 -0
  767. package/dist/esm/transaction/outputDifference.d.ts +44 -0
  768. package/dist/esm/transaction/outputDifference.d.ts.map +1 -0
  769. package/dist/esm/transaction/outputDifference.js +45 -0
  770. package/dist/esm/transaction/parseTransaction.d.ts +4 -0
  771. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
  772. package/dist/esm/transaction/parseTransaction.js +12 -0
  773. package/dist/esm/transaction/recipient.d.ts +34 -0
  774. package/dist/esm/transaction/recipient.d.ts.map +1 -0
  775. package/dist/esm/transaction/recipient.js +61 -0
  776. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  777. package/dist/esm/transaction/signTransaction.d.ts.map +1 -0
  778. package/dist/esm/transaction/signTransaction.js +66 -0
  779. package/dist/esm/transaction/types.d.ts +47 -0
  780. package/dist/esm/transaction/types.d.ts.map +1 -0
  781. package/dist/esm/transaction/types.js +2 -0
  782. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  783. package/dist/esm/transaction/verifyTransaction.d.ts.map +1 -0
  784. package/dist/esm/transaction/verifyTransaction.js +14 -0
  785. package/dist/esm/unspent.d.ts +59 -0
  786. package/dist/esm/unspent.d.ts.map +1 -0
  787. package/dist/esm/unspent.js +15 -0
  788. package/dist/esm/verifyKey.d.ts +26 -0
  789. package/dist/esm/verifyKey.d.ts.map +1 -0
  790. package/dist/esm/verifyKey.js +116 -0
  791. package/dist/esm/wallet.d.ts +15 -0
  792. package/dist/esm/wallet.d.ts.map +1 -0
  793. package/dist/esm/wallet.js +5 -0
  794. package/package.json +50 -20
  795. package/.eslintignore +0 -5
  796. package/CHANGELOG.md +0 -106
  797. package/dist/src/abstractUtxoCoin.d.ts +0 -383
  798. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  799. package/dist/src/abstractUtxoCoin.js +0 -960
  800. package/dist/src/config.js +0 -13
  801. package/dist/src/index.d.ts +0 -6
  802. package/dist/src/index.d.ts.map +0 -1
  803. package/dist/src/index.js +0 -18
  804. package/dist/src/parseOutput.d.ts +0 -22
  805. package/dist/src/parseOutput.d.ts.map +0 -1
  806. package/dist/src/parseOutput.js +0 -169
  807. package/dist/src/recovery/RecoveryProvider.d.ts.map +0 -1
  808. package/dist/src/recovery/RecoveryProvider.js +0 -24
  809. package/dist/src/recovery/backupKeyRecovery.d.ts +0 -59
  810. package/dist/src/recovery/backupKeyRecovery.d.ts.map +0 -1
  811. package/dist/src/recovery/backupKeyRecovery.js +0 -290
  812. package/dist/src/recovery/baseApi.d.ts.map +0 -1
  813. package/dist/src/recovery/baseApi.js +0 -73
  814. package/dist/src/recovery/coingeckoApi.d.ts.map +0 -1
  815. package/dist/src/recovery/coingeckoApi.js +0 -47
  816. package/dist/src/recovery/crossChainRecovery.d.ts.map +0 -1
  817. package/dist/src/recovery/crossChainRecovery.js +0 -338
  818. package/dist/src/recovery/mempoolApi.js +0 -33
  819. package/dist/src/recovery/smartbitApi.d.ts +0 -11
  820. package/dist/src/recovery/smartbitApi.d.ts.map +0 -1
  821. package/dist/src/recovery/smartbitApi.js +0 -36
  822. package/dist/src/replayProtection.d.ts +0 -4
  823. package/dist/src/replayProtection.d.ts.map +0 -1
  824. package/dist/src/replayProtection.js +0 -21
  825. package/dist/src/sign.d.ts +0 -31
  826. package/dist/src/sign.d.ts.map +0 -1
  827. package/dist/src/sign.js +0 -104
  828. package/dist/tsconfig.tsbuildinfo +0 -7600
  829. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
@@ -1,960 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AbstractUtxoCoin = void 0;
4
- /**
5
- * @prettier
6
- */
7
- const utxolib = require("@bitgo-beta/utxo-lib");
8
- const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
9
- const bitcoinMessage = require("bitcoinjs-message");
10
- const crypto_1 = require("crypto");
11
- const debugLib = require("debug");
12
- const _ = require("lodash");
13
- const bignumber_js_1 = require("bignumber.js");
14
- const backupKeyRecovery_1 = require("./recovery/backupKeyRecovery");
15
- const recovery_1 = require("./recovery");
16
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
17
- const parseOutput_1 = require("./parseOutput");
18
- const debug = debugLib('bitgo:v2:utxo');
19
- const replayProtection_1 = require("./replayProtection");
20
- const sign_1 = require("./sign");
21
- const config_1 = require("./config");
22
- const { getExternalChainCode, isChainCode, scriptTypeForChain, outputScripts, toOutput, verifySignatureWithUnspent } = utxo_lib_1.bitgo;
23
- class AbstractUtxoCoin extends sdk_core_1.BaseCoin {
24
- constructor(bitgo, network, amountType = 'number') {
25
- super(bitgo);
26
- if (!utxolib.isValidNetwork(network)) {
27
- throw new Error('invalid network: please make sure to use the same version of ' +
28
- '@bitgo-beta/utxo-lib as this library when initializing an instance of this class');
29
- }
30
- this.amountType = amountType;
31
- this._network = network;
32
- }
33
- get network() {
34
- return this._network;
35
- }
36
- sweepWithSendMany() {
37
- return true;
38
- }
39
- /** @deprecated */
40
- static get validAddressTypes() {
41
- return [...outputScripts.scriptTypes2Of3];
42
- }
43
- /**
44
- * Returns the factor between the base unit and its smallest subdivison
45
- * @return {number}
46
- */
47
- getBaseFactor() {
48
- return 1e8;
49
- }
50
- /**
51
- * @deprecated
52
- */
53
- getCoinLibrary() {
54
- return utxolib;
55
- }
56
- /**
57
- * Helper to get the version number for an address
58
- */
59
- getAddressVersion(address) {
60
- // try decoding as base58 first
61
- try {
62
- const { version } = utxolib.address.fromBase58Check(address, this.network);
63
- return version;
64
- }
65
- catch (e) {
66
- // try next format
67
- }
68
- // if coin does not support script types with bech32 encoding, do not attempt to parse
69
- if (!this.supportsAddressType('p2wsh') && !this.supportsAddressType('p2tr')) {
70
- return;
71
- }
72
- // otherwise, try decoding as bech32
73
- try {
74
- const { version, prefix } = utxolib.address.fromBech32(address);
75
- if (_.isString(this.network.bech32) && prefix === this.network.bech32) {
76
- return version;
77
- }
78
- }
79
- catch (e) {
80
- // ignore errors, just fall through and return undefined
81
- }
82
- }
83
- /**
84
- * Helper to get the bech32 prefix for an address
85
- */
86
- getAddressPrefix(address) {
87
- // otherwise, try decoding as bech32
88
- try {
89
- const { prefix } = utxolib.address.fromBech32(address);
90
- return prefix;
91
- }
92
- catch (e) {
93
- // ignore errors, just fall through and return undefined
94
- }
95
- }
96
- /**
97
- * Check if an address is valid
98
- * @param address
99
- * @param forceAltScriptSupport
100
- */
101
- isValidAddress(address, forceAltScriptSupport = false) {
102
- const validVersions = [this.network.pubKeyHash, this.network.scriptHash];
103
- if (this.altScriptHash && (forceAltScriptSupport || this.supportAltScriptDestination)) {
104
- validVersions.push(this.altScriptHash);
105
- }
106
- const addressVersion = this.getAddressVersion(address);
107
- // the address version needs to be among the valid ones
108
- const addressVersionValid = _.isNumber(addressVersion) && validVersions.includes(addressVersion);
109
- const addressPrefix = this.getAddressPrefix(address);
110
- if (!this.supportsAddressType('p2wsh') || _.isUndefined(addressPrefix)) {
111
- return addressVersionValid;
112
- }
113
- // address has a potential bech32 prefix, validate that
114
- return (_.isString(this.network.bech32) && this.network.bech32 === addressPrefix && address === address.toLowerCase());
115
- }
116
- /**
117
- * Return boolean indicating whether input is valid public key for the coin.
118
- *
119
- * @param {String} pub the pub to be checked
120
- * @returns {Boolean} is it valid?
121
- */
122
- isValidPub(pub) {
123
- try {
124
- return utxo_lib_1.bip32.fromBase58(pub).isNeutered();
125
- }
126
- catch (e) {
127
- return false;
128
- }
129
- }
130
- /**
131
- * Get the latest block height
132
- * @param reqId
133
- */
134
- async getLatestBlockHeight(reqId) {
135
- if (reqId) {
136
- this.bitgo.setRequestTracer(reqId);
137
- }
138
- const chainhead = await this.bitgo.get(this.url('/public/block/latest')).result();
139
- return chainhead.height;
140
- }
141
- /**
142
- * Run custom coin logic after a transaction prebuild has been received from BitGo
143
- * @param prebuild
144
- */
145
- async postProcessPrebuild(prebuild) {
146
- if (_.isUndefined(prebuild.txHex)) {
147
- throw new Error('missing required txPrebuild property txHex');
148
- }
149
- const transaction = this.createTransactionFromHex(prebuild.txHex);
150
- if (_.isUndefined(prebuild.blockHeight)) {
151
- prebuild.blockHeight = (await this.getLatestBlockHeight());
152
- }
153
- // Lock transaction to the next block to discourage fee sniping
154
- // See: https://github.com/bitcoin/bitcoin/blob/fb0ac482eee761ec17ed2c11df11e054347a026d/src/wallet/wallet.cpp#L2133
155
- transaction.locktime = prebuild.blockHeight;
156
- return _.extend({}, prebuild, { txHex: transaction.toHex() });
157
- }
158
- /**
159
- * Find outputs that are within expected outputs but not within actual outputs, including duplicates
160
- * @param expectedOutputs
161
- * @param actualOutputs
162
- * @returns {Array}
163
- */
164
- static findMissingOutputs(expectedOutputs, actualOutputs) {
165
- const keyFunc = ({ address, amount }) => `${address}:${Number(amount)}`;
166
- const groupedOutputs = _.groupBy(expectedOutputs, keyFunc);
167
- actualOutputs.forEach((output) => {
168
- const group = groupedOutputs[keyFunc(output)];
169
- if (group) {
170
- group.pop();
171
- }
172
- });
173
- return _.flatten(_.values(groupedOutputs));
174
- }
175
- /**
176
- * Determine an address' type based on its witness and redeem script presence
177
- * @param addressDetails
178
- */
179
- static inferAddressType(addressDetails) {
180
- return isChainCode(addressDetails.chain) ? scriptTypeForChain(addressDetails.chain) : null;
181
- }
182
- createTransactionFromHex(hex) {
183
- return utxolib.bitgo.createTransactionFromHex(hex, this.network, this.amountType);
184
- }
185
- /**
186
- * Extract and fill transaction details such as internal/change spend, external spend (explicit vs. implicit), etc.
187
- * @param params
188
- * @returns {*}
189
- */
190
- async parseTransaction(params) {
191
- const { txParams, txPrebuild, wallet, verification = {}, reqId } = params;
192
- if (!_.isUndefined(verification.disableNetworking) && !_.isBoolean(verification.disableNetworking)) {
193
- throw new Error('verification.disableNetworking must be a boolean');
194
- }
195
- const disableNetworking = verification.disableNetworking;
196
- const fetchKeychains = async (wallet) => {
197
- return sdk_core_1.promiseProps({
198
- user: this.keychains().get({ id: wallet.keyIds()[sdk_core_1.KeyIndices.USER], reqId }),
199
- backup: this.keychains().get({ id: wallet.keyIds()[sdk_core_1.KeyIndices.BACKUP], reqId }),
200
- bitgo: this.keychains().get({ id: wallet.keyIds()[sdk_core_1.KeyIndices.BITGO], reqId }),
201
- });
202
- };
203
- // obtain the keychains and key signatures
204
- let keychains = verification.keychains;
205
- if (!keychains) {
206
- if (disableNetworking) {
207
- throw new Error('cannot fetch keychains without networking');
208
- }
209
- keychains = await fetchKeychains(wallet);
210
- }
211
- if (!keychains || !keychains.user || !keychains.backup || !keychains.bitgo) {
212
- throw new Error('keychains are required, but could not be fetched');
213
- }
214
- const keychainArray = [keychains.user, keychains.backup, keychains.bitgo];
215
- const keySignatures = _.get(wallet, '_wallet.keySignatures');
216
- if (_.isUndefined(txPrebuild.txHex)) {
217
- throw new Error('missing required txPrebuild property txHex');
218
- }
219
- // obtain all outputs
220
- const explanation = await this.explainTransaction({
221
- txHex: txPrebuild.txHex,
222
- txInfo: txPrebuild.txInfo,
223
- pubs: keychainArray.map((k) => k.pub),
224
- });
225
- const allOutputs = [...explanation.outputs, ...explanation.changeOutputs];
226
- // verify that each recipient from txParams has their own output
227
- const expectedOutputs = _.get(txParams, 'recipients', []).map((output) => {
228
- return { ...output, address: this.canonicalAddress(output.address) };
229
- });
230
- const missingOutputs = AbstractUtxoCoin.findMissingOutputs(expectedOutputs, allOutputs);
231
- // get the keychains from the custom change wallet if needed
232
- let customChange;
233
- const { customChangeWalletId = undefined } = wallet.coinSpecific() || {};
234
- if (customChangeWalletId) {
235
- // fetch keychains from custom change wallet for deriving addresses.
236
- // These keychains should be signed and this should be verified in verifyTransaction
237
- const customChangeKeySignatures = _.get(wallet, '_wallet.customChangeKeySignatures', {});
238
- const customChangeWallet = await this.wallets().get({ id: customChangeWalletId });
239
- const customChangeKeys = await fetchKeychains(customChangeWallet);
240
- if (!customChangeKeys) {
241
- throw new Error('failed to fetch keychains for custom change wallet');
242
- }
243
- if (customChangeKeys.user && customChangeKeys.backup && customChangeKeys.bitgo && customChangeWallet) {
244
- const customChangeKeychains = [
245
- customChangeKeys.user,
246
- customChangeKeys.backup,
247
- customChangeKeys.bitgo,
248
- ];
249
- customChange = {
250
- keys: customChangeKeychains,
251
- signatures: [
252
- customChangeKeySignatures.user,
253
- customChangeKeySignatures.backup,
254
- customChangeKeySignatures.bitgo,
255
- ],
256
- };
257
- }
258
- }
259
- /**
260
- * Loop through all the outputs and classify each of them as either internal spends
261
- * or external spends by setting the "external" property to true or false on the output object.
262
- */
263
- const allOutputDetails = await Promise.all(allOutputs.map((currentOutput) => {
264
- return parseOutput_1.parseOutput({
265
- currentOutput,
266
- coin: this,
267
- txPrebuild,
268
- verification,
269
- keychainArray,
270
- wallet,
271
- txParams,
272
- customChange,
273
- reqId,
274
- });
275
- }));
276
- const needsCustomChangeKeySignatureVerification = allOutputDetails.some((output) => output.needsCustomChangeKeySignatureVerification);
277
- const changeOutputs = _.filter(allOutputDetails, { external: false });
278
- // these are all the outputs that were not originally explicitly specified in recipients
279
- const implicitOutputs = AbstractUtxoCoin.findMissingOutputs(allOutputDetails, expectedOutputs);
280
- const explicitOutputs = AbstractUtxoCoin.findMissingOutputs(allOutputDetails, implicitOutputs);
281
- // these are all the non-wallet outputs that had been originally explicitly specified in recipients
282
- const explicitExternalOutputs = _.filter(explicitOutputs, { external: true });
283
- // this is the sum of all the originally explicitly specified non-wallet output values
284
- const explicitExternalSpendAmount = utxolib.bitgo.toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.amount), BigInt(0)), this.amountType);
285
- /**
286
- * The calculation of the implicit external spend amount pertains to verifying the pay-as-you-go-fee BitGo
287
- * automatically applies to transactions sending money out of the wallet. The logic is fairly straightforward
288
- * in that we compare the external spend amount that was specified explicitly by the user to the portion
289
- * that was specified implicitly. To protect customers from people tampering with the transaction outputs, we
290
- * define a threshold for the maximum percentage of the implicit external spend in relation to the explicit
291
- * external spend.
292
- */
293
- // make sure that all the extra addresses are change addresses
294
- // get all the additional external outputs the server added and calculate their values
295
- const implicitExternalOutputs = _.filter(implicitOutputs, { external: true });
296
- const implicitExternalSpendAmount = utxolib.bitgo.toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.amount), BigInt(0)), this.amountType);
297
- return {
298
- keychains,
299
- keySignatures,
300
- outputs: allOutputDetails,
301
- missingOutputs,
302
- explicitExternalOutputs,
303
- implicitExternalOutputs,
304
- changeOutputs,
305
- explicitExternalSpendAmount,
306
- implicitExternalSpendAmount,
307
- needsCustomChangeKeySignatureVerification,
308
- customChange,
309
- };
310
- }
311
- /**
312
- * Decrypt the wallet's user private key and verify that the claimed public key matches
313
- * @param {VerifyUserPublicKeyOptions} params
314
- * @return {boolean}
315
- * @protected
316
- */
317
- verifyUserPublicKey(params) {
318
- const { userKeychain, txParams, disableNetworking } = params;
319
- if (!userKeychain) {
320
- throw new Error('user keychain is required');
321
- }
322
- const userPub = userKeychain.pub;
323
- // decrypt the user private key so we can verify that the claimed public key is a match
324
- let userPrv = userKeychain.prv;
325
- if (_.isEmpty(userPrv)) {
326
- const encryptedPrv = userKeychain.encryptedPrv;
327
- if (encryptedPrv && !_.isEmpty(encryptedPrv)) {
328
- // if the decryption fails, it will throw an error
329
- userPrv = this.bitgo.decrypt({
330
- input: encryptedPrv,
331
- password: txParams.walletPassphrase,
332
- });
333
- }
334
- }
335
- if (!userPrv) {
336
- const errorMessage = 'user private key unavailable for verification';
337
- if (disableNetworking) {
338
- console.log(errorMessage);
339
- return false;
340
- }
341
- else {
342
- throw new Error(errorMessage);
343
- }
344
- }
345
- else {
346
- const userPrivateKey = utxo_lib_1.bip32.fromBase58(userPrv);
347
- if (userPrivateKey.toBase58() === userPrivateKey.neutered().toBase58()) {
348
- throw new Error('user private key is only public');
349
- }
350
- if (userPrivateKey.neutered().toBase58() !== userPub) {
351
- throw new Error('user private key does not match public key');
352
- }
353
- }
354
- return true;
355
- }
356
- /**
357
- * Verify signatures produced by the user key over the backup and bitgo keys.
358
- *
359
- * If set, these signatures ensure that the wallet keys cannot be changed after the wallet has been created.
360
- * @param {VerifyKeySignaturesOptions} params
361
- * @return {{backup: boolean, bitgo: boolean}}
362
- */
363
- verifyKeySignature(params) {
364
- // first, let's verify the integrity of the user key, whose public key is used for subsequent verifications
365
- const { userKeychain, keychainToVerify, keySignature } = params;
366
- if (!userKeychain) {
367
- throw new Error('user keychain is required');
368
- }
369
- if (!keychainToVerify) {
370
- throw new Error('keychain to verify is required');
371
- }
372
- if (!keySignature) {
373
- throw new Error('key signature is required');
374
- }
375
- // verify the signature against the user public key
376
- const publicKey = utxo_lib_1.bip32.fromBase58(userKeychain.pub).publicKey;
377
- const signingAddress = utxolib.address.toBase58Check(utxolib.crypto.hash160(publicKey), utxolib.networks.bitcoin.pubKeyHash, this.network);
378
- // BG-5703: use BTC mainnet prefix for all key signature operations
379
- // (this means do not pass a prefix parameter, and let it use the default prefix instead)
380
- try {
381
- return bitcoinMessage.verify(keychainToVerify.pub, signingAddress, Buffer.from(keySignature, 'hex'));
382
- }
383
- catch (e) {
384
- debug('error thrown from bitcoinmessage while verifying key signature', e);
385
- return false;
386
- }
387
- }
388
- /**
389
- * Verify signatures against the user private key over the change wallet extended keys
390
- * @param {ParsedTransaction} tx
391
- * @param {Keychain} userKeychain
392
- * @return {boolean}
393
- * @protected
394
- */
395
- verifyCustomChangeKeySignatures(tx, userKeychain) {
396
- if (!tx.customChange) {
397
- throw new Error('parsed transaction is missing required custom change verification data');
398
- }
399
- if (!Array.isArray(tx.customChange.keys) || !Array.isArray(tx.customChange.signatures)) {
400
- throw new Error('customChange property is missing keys or signatures');
401
- }
402
- for (const keyIndex of [sdk_core_1.KeyIndices.USER, sdk_core_1.KeyIndices.BACKUP, sdk_core_1.KeyIndices.BITGO]) {
403
- const keychainToVerify = tx.customChange.keys[keyIndex];
404
- const keySignature = tx.customChange.signatures[keyIndex];
405
- if (!keychainToVerify) {
406
- throw new Error(`missing required custom change ${sdk_core_1.KeyIndices[keyIndex].toLowerCase()} keychain public key`);
407
- }
408
- if (!keySignature) {
409
- throw new Error(`missing required custom change ${sdk_core_1.KeyIndices[keyIndex].toLowerCase()} keychain signature`);
410
- }
411
- if (!this.verifyKeySignature({ userKeychain, keychainToVerify, keySignature })) {
412
- debug('failed to verify custom change %s key signature!', sdk_core_1.KeyIndices[keyIndex].toLowerCase());
413
- return false;
414
- }
415
- }
416
- return true;
417
- }
418
- /**
419
- * Get the maximum percentage limit for pay-as-you-go outputs
420
- *
421
- * @protected
422
- */
423
- getPayGoLimit(allowPaygoOutput) {
424
- // allowing paygo outputs needs to be the default behavior, so only disallow paygo outputs if the
425
- // relevant verification option is both set and false
426
- if (!_.isNil(allowPaygoOutput) && !allowPaygoOutput) {
427
- return 0;
428
- }
429
- // 150 basis points is the absolute permitted maximum if paygo outputs are allowed
430
- return 0.015;
431
- }
432
- /**
433
- * Verify that a transaction prebuild complies with the original intention
434
- *
435
- * @param params
436
- * @param params.txParams params object passed to send
437
- * @param params.txPrebuild prebuild object returned by server
438
- * @param params.txPrebuild.txHex prebuilt transaction's txHex form
439
- * @param params.wallet Wallet object to obtain keys to verify against
440
- * @param params.verification Object specifying some verification parameters
441
- * @param params.verification.disableNetworking Disallow fetching any data from the internet for verification purposes
442
- * @param params.verification.keychains Pass keychains manually rather than fetching them by id
443
- * @param params.verification.addresses Address details to pass in for out-of-band verification
444
- * @returns {boolean}
445
- */
446
- async verifyTransaction(params) {
447
- const { txParams, txPrebuild, wallet, verification = { allowPaygoOutput: true }, reqId } = params;
448
- const disableNetworking = !!verification.disableNetworking;
449
- const parsedTransaction = await this.parseTransaction({
450
- txParams,
451
- txPrebuild,
452
- wallet,
453
- verification,
454
- reqId,
455
- });
456
- const keychains = parsedTransaction.keychains;
457
- // verify that the claimed user public key corresponds to the wallet's user private key
458
- let userPublicKeyVerified = false;
459
- try {
460
- // verify the user public key matches the private key - this will throw if there is no match
461
- userPublicKeyVerified = this.verifyUserPublicKey({ userKeychain: keychains.user, disableNetworking, txParams });
462
- }
463
- catch (e) {
464
- debug('failed to verify user public key!', e);
465
- }
466
- // let's verify these keychains
467
- const keySignatures = parsedTransaction.keySignatures;
468
- if (!_.isEmpty(keySignatures)) {
469
- const verify = (key, pub) => this.verifyKeySignature({ userKeychain: keychains.user, keychainToVerify: key, keySignature: pub });
470
- const isBackupKeySignatureValid = verify(keychains.backup, keySignatures.backupPub);
471
- const isBitgoKeySignatureValid = verify(keychains.bitgo, keySignatures.bitgoPub);
472
- if (!isBackupKeySignatureValid || !isBitgoKeySignatureValid) {
473
- throw new Error('secondary public key signatures invalid');
474
- }
475
- debug('successfully verified backup and bitgo key signatures');
476
- }
477
- else if (!disableNetworking) {
478
- // these keys were obtained online and their signatures were not verified
479
- // this could be dangerous
480
- console.log('unsigned keys obtained online are being used for address verification');
481
- }
482
- if (parsedTransaction.needsCustomChangeKeySignatureVerification) {
483
- if (!keychains.user || !userPublicKeyVerified) {
484
- throw new Error('transaction requires verification of user public key, but it was unable to be verified');
485
- }
486
- const customChangeKeySignaturesVerified = this.verifyCustomChangeKeySignatures(parsedTransaction, keychains.user);
487
- if (!customChangeKeySignaturesVerified) {
488
- throw new Error('transaction requires verification of custom change key signatures, but they were unable to be verified');
489
- }
490
- debug('successfully verified user public key and custom change key signatures');
491
- }
492
- const missingOutputs = parsedTransaction.missingOutputs;
493
- if (missingOutputs.length !== 0) {
494
- // there are some outputs in the recipients list that have not made it into the actual transaction
495
- throw new Error('expected outputs missing in transaction prebuild');
496
- }
497
- const intendedExternalSpend = parsedTransaction.explicitExternalSpendAmount;
498
- // this is a limit we impose for the total value that is amended to the transaction beyond what was originally intended
499
- const payAsYouGoLimit = new bignumber_js_1.default(this.getPayGoLimit(verification.allowPaygoOutput)).multipliedBy(intendedExternalSpend.toString());
500
- /*
501
- Some explanation for why we're doing what we're doing:
502
- Some customers will have an output to BitGo's PAYGo wallet added to their transaction, and we need to account for
503
- it here. To protect someone tampering with the output to make it send more than it should to BitGo, we define a
504
- threshold for the output's value above which we'll throw an error, because the paygo output should never be that
505
- high.
506
- */
507
- // make sure that all the extra addresses are change addresses
508
- // get all the additional external outputs the server added and calculate their values
509
- const nonChangeAmount = new bignumber_js_1.default(parsedTransaction.implicitExternalSpendAmount.toString());
510
- debug('Intended spend is %s, Non-change amount is %s, paygo limit is %s', intendedExternalSpend.toString(), nonChangeAmount.toString(), payAsYouGoLimit.toString());
511
- // the additional external outputs can only be BitGo's pay-as-you-go fee, but we cannot verify the wallet address
512
- if (nonChangeAmount.gt(payAsYouGoLimit)) {
513
- // there are some addresses that are outside the scope of intended recipients that are not change addresses
514
- throw new Error('prebuild attempts to spend to unintended external recipients');
515
- }
516
- const allOutputs = parsedTransaction.outputs;
517
- if (!txPrebuild.txHex) {
518
- throw new Error(`txPrebuild.txHex not set`);
519
- }
520
- const transaction = this.createTransactionFromHex(txPrebuild.txHex);
521
- const transactionCache = {};
522
- const inputs = await Promise.all(transaction.ins.map(async (currentInput) => {
523
- var _a, _b;
524
- const transactionId = Buffer.from(currentInput.hash).reverse().toString('hex');
525
- const txHex = (_b = (_a = txPrebuild.txInfo) === null || _a === void 0 ? void 0 : _a.txHexes) === null || _b === void 0 ? void 0 : _b[transactionId];
526
- if (txHex) {
527
- const localTx = this.createTransactionFromHex(txHex);
528
- if (localTx.getId() !== transactionId) {
529
- throw new Error('input transaction hex does not match id');
530
- }
531
- const currentOutput = localTx.outs[currentInput.index];
532
- const address = utxolib.address.fromOutputScript(currentOutput.script, this.network);
533
- return {
534
- address,
535
- value: currentOutput.value,
536
- valueString: currentOutput.value.toString(),
537
- };
538
- }
539
- else if (!transactionCache[transactionId]) {
540
- if (disableNetworking) {
541
- throw new Error('attempting to retrieve transaction details externally with networking disabled');
542
- }
543
- if (reqId) {
544
- this.bitgo.setRequestTracer(reqId);
545
- }
546
- transactionCache[transactionId] = await this.bitgo.get(this.url(`/public/tx/${transactionId}`)).result();
547
- }
548
- const transactionDetails = transactionCache[transactionId];
549
- return transactionDetails.outputs[currentInput.index];
550
- }));
551
- // coins (doge) that can exceed number limits (and thus will use bigint) will have the `valueString` field
552
- const inputAmount = inputs.reduce((sum, i) => sum + BigInt(this.amountType === 'bigint' ? i.valueString : i.value), BigInt(0));
553
- const outputAmount = allOutputs.reduce((sum, o) => sum + BigInt(o.amount), BigInt(0));
554
- const fee = inputAmount - outputAmount;
555
- if (fee < 0) {
556
- throw new Error(`attempting to spend ${outputAmount} satoshis, which exceeds the input amount (${inputAmount} satoshis) by ${-fee}`);
557
- }
558
- return true;
559
- }
560
- /**
561
- * Make sure an address is valid and throw an error if it's not.
562
- * @param params.address The address string on the network
563
- * @param params.addressType
564
- * @param params.keychains Keychain objects with xpubs
565
- * @param params.coinSpecific Coin-specific details for the address such as a witness script
566
- * @param params.chain Derivation chain
567
- * @param params.index Derivation index
568
- * @throws {InvalidAddressError}
569
- * @throws {InvalidAddressDerivationPropertyError}
570
- * @throws {UnexpectedAddressError}
571
- */
572
- isWalletAddress(params) {
573
- const { address, addressType, keychains, coinSpecific, chain, index } = params;
574
- if (!this.isValidAddress(address)) {
575
- throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
576
- }
577
- if ((_.isUndefined(chain) && _.isUndefined(index)) || !(_.isFinite(chain) && _.isFinite(index))) {
578
- throw new sdk_core_1.InvalidAddressDerivationPropertyError(`address validation failure: invalid chain (${chain}) or index (${index})`);
579
- }
580
- if (!_.isObject(coinSpecific)) {
581
- throw new sdk_core_1.InvalidAddressVerificationObjectPropertyError('address validation failure: coinSpecific field must be an object');
582
- }
583
- if (!keychains) {
584
- throw new Error('missing required param keychains');
585
- }
586
- const expectedAddress = this.generateAddress({
587
- addressType: addressType,
588
- keychains,
589
- threshold: 2,
590
- chain,
591
- index,
592
- });
593
- if (expectedAddress.address !== address) {
594
- throw new sdk_core_1.UnexpectedAddressError(`address validation failure: expected ${expectedAddress.address} but got ${address}`);
595
- }
596
- return true;
597
- }
598
- /**
599
- * Indicates whether coin supports a block target
600
- * @returns {boolean}
601
- */
602
- supportsBlockTarget() {
603
- return true;
604
- }
605
- /**
606
- * @param addressType
607
- * @returns true iff coin supports spending from unspentType
608
- */
609
- supportsAddressType(addressType) {
610
- return utxolib.bitgo.outputScripts.isSupportedScriptType(this.network, addressType);
611
- }
612
- /**
613
- * @param chain
614
- * @return true iff coin supports spending from chain
615
- */
616
- supportsAddressChain(chain) {
617
- return isChainCode(chain) && this.supportsAddressType(utxolib.bitgo.scriptTypeForChain(chain));
618
- }
619
- keyIdsForSigning() {
620
- return [sdk_core_1.KeyIndices.USER, sdk_core_1.KeyIndices.BACKUP, sdk_core_1.KeyIndices.BITGO];
621
- }
622
- /**
623
- * TODO(BG-11487): Remove addressType, segwit, and bech32 params in SDKv6
624
- * Generate an address for a wallet based on a set of configurations
625
- * @param params.addressType {string} Deprecated
626
- * @param params.keychains {[object]} Array of objects with xpubs
627
- * @param params.threshold {number} Minimum number of signatures
628
- * @param params.chain {number} Derivation chain (see https://github.com/BitGo/unspents/blob/master/src/codes.ts for
629
- * the corresponding address type of a given chain code)
630
- * @param params.index {number} Derivation index
631
- * @param params.segwit {boolean} Deprecated
632
- * @param params.bech32 {boolean} Deprecated
633
- * @returns {{chain: number, index: number, coin: number, coinSpecific: {outputScript, redeemScript}}}
634
- */
635
- generateAddress(params) {
636
- const { keychains, threshold, chain, index, segwit = false, bech32 = false } = params;
637
- let derivationChain = getExternalChainCode('p2sh');
638
- if (_.isNumber(chain) && _.isInteger(chain) && isChainCode(chain)) {
639
- derivationChain = chain;
640
- }
641
- function convertFlagsToAddressType() {
642
- if (isChainCode(chain)) {
643
- return utxolib.bitgo.scriptTypeForChain(chain);
644
- }
645
- if (_.isBoolean(segwit) && segwit) {
646
- return 'p2shP2wsh';
647
- }
648
- else if (_.isBoolean(bech32) && bech32) {
649
- return 'p2wsh';
650
- }
651
- else {
652
- return 'p2sh';
653
- }
654
- }
655
- const addressType = params.addressType || convertFlagsToAddressType();
656
- if (addressType !== utxolib.bitgo.scriptTypeForChain(derivationChain)) {
657
- throw new sdk_core_1.AddressTypeChainMismatchError(addressType, derivationChain);
658
- }
659
- if (!this.supportsAddressType(addressType)) {
660
- switch (addressType) {
661
- case 'p2sh':
662
- throw new Error(`internal error: p2sh should always be supported`);
663
- case 'p2shP2wsh':
664
- throw new sdk_core_1.P2shP2wshUnsupportedError();
665
- case 'p2wsh':
666
- throw new sdk_core_1.P2wshUnsupportedError();
667
- case 'p2tr':
668
- throw new sdk_core_1.P2trUnsupportedError();
669
- default:
670
- throw new sdk_core_1.UnsupportedAddressTypeError();
671
- }
672
- }
673
- let signatureThreshold = 2;
674
- if (_.isInteger(threshold)) {
675
- signatureThreshold = threshold;
676
- if (signatureThreshold <= 0) {
677
- throw new Error('threshold has to be positive');
678
- }
679
- if (signatureThreshold > keychains.length) {
680
- throw new Error('threshold cannot exceed number of keys');
681
- }
682
- }
683
- let derivationIndex = 0;
684
- if (_.isInteger(index) && index > 0) {
685
- derivationIndex = index;
686
- }
687
- const path = '0/0/' + derivationChain + '/' + derivationIndex;
688
- const hdNodes = keychains.map(({ pub }) => utxo_lib_1.bip32.fromBase58(pub));
689
- const derivedKeys = hdNodes.map((hdNode) => hdNode.derivePath(sdk_core_1.sanitizeLegacyPath(path)).publicKey);
690
- const { outputScript, redeemScript, witnessScript, address } = this.createMultiSigAddress(addressType, signatureThreshold, derivedKeys);
691
- return {
692
- address,
693
- chain: derivationChain,
694
- index: derivationIndex,
695
- coin: this.getChain(),
696
- coinSpecific: {
697
- outputScript: outputScript.toString('hex'),
698
- redeemScript: redeemScript && redeemScript.toString('hex'),
699
- witnessScript: witnessScript && witnessScript.toString('hex'),
700
- },
701
- addressType,
702
- };
703
- }
704
- /**
705
- * Assemble keychain and half-sign prebuilt transaction
706
- * @param params - {@see SignTransactionOptions}
707
- * @returns {Promise<SignedTransaction | HalfSignedUtxoTransaction>}
708
- */
709
- async signTransaction(params) {
710
- var _a;
711
- const txPrebuild = params.txPrebuild;
712
- const userPrv = params.prv;
713
- if (_.isUndefined(txPrebuild) || !_.isObject(txPrebuild)) {
714
- if (!_.isUndefined(txPrebuild) && !_.isObject(txPrebuild)) {
715
- throw new Error(`txPrebuild must be an object, got type ${typeof txPrebuild}`);
716
- }
717
- throw new Error('missing txPrebuild parameter');
718
- }
719
- const transaction = this.createTransactionFromHex(txPrebuild.txHex);
720
- if (transaction.ins.length !== txPrebuild.txInfo.unspents.length) {
721
- throw new Error('length of unspents array should equal to the number of transaction inputs');
722
- }
723
- let isLastSignature = false;
724
- if (_.isBoolean(params.isLastSignature)) {
725
- // if build is called instead of buildIncomplete, no signature placeholders are left in the sig script
726
- isLastSignature = params.isLastSignature;
727
- }
728
- if (_.isUndefined(userPrv) || !_.isString(userPrv)) {
729
- if (!_.isUndefined(userPrv)) {
730
- throw new Error(`prv must be a string, got type ${typeof userPrv}`);
731
- }
732
- throw new Error('missing prv parameter to sign transaction');
733
- }
734
- if (!params.pubs || params.pubs.length !== 3) {
735
- throw new Error(`must provide xpub array`);
736
- }
737
- const signerKeychain = utxo_lib_1.bip32.fromBase58(userPrv, utxolib.networks.bitcoin);
738
- if (signerKeychain.isNeutered()) {
739
- throw new Error('expected user private key but received public key');
740
- }
741
- debug(`Here is the public key of the xprv you used to sign: ${signerKeychain.neutered().toBase58()}`);
742
- const cosignerPub = (_a = params.cosignerPub) !== null && _a !== void 0 ? _a : params.pubs[2];
743
- const keychains = params.pubs.map((pub) => utxo_lib_1.bip32.fromBase58(pub));
744
- const cosignerKeychain = utxo_lib_1.bip32.fromBase58(cosignerPub);
745
- const signedTransaction = sign_1.signAndVerifyWalletTransaction(transaction, txPrebuild.txInfo.unspents, new utxo_lib_1.bitgo.WalletUnspentSigner(keychains, signerKeychain, cosignerKeychain), { isLastSignature });
746
- return {
747
- txHex: signedTransaction.toBuffer().toString('hex'),
748
- };
749
- }
750
- /**
751
- * @param unspent
752
- * @returns {boolean}
753
- */
754
- isBitGoTaintedUnspent(unspent) {
755
- return replayProtection_1.isReplayProtectionUnspent(unspent, this.network);
756
- }
757
- /**
758
- * @deprecated - use utxolib.bitgo.getDefaultSigHash(network) instead
759
- * @returns {number}
760
- */
761
- get defaultSigHashType() {
762
- return utxolib.bitgo.getDefaultSigHash(this.network);
763
- }
764
- /**
765
- * @deprecated - use utxolib.bitcoin.verifySignature() instead
766
- */
767
- verifySignature(transaction, inputIndex, amount, verificationSettings = {}) {
768
- if (transaction.network !== this.network) {
769
- throw new Error(`network mismatch`);
770
- }
771
- return utxolib.bitgo.verifySignature(transaction, inputIndex, amount, {
772
- signatureIndex: verificationSettings.signatureIndex,
773
- publicKey: verificationSettings.publicKey ? Buffer.from(verificationSettings.publicKey, 'hex') : undefined,
774
- });
775
- }
776
- /**
777
- * Decompose a raw transaction into useful information, such as the total amounts,
778
- * change amounts, and transaction outputs.
779
- * @param params
780
- */
781
- async explainTransaction(params) {
782
- var _a, _b, _c;
783
- const txHex = _.get(params, 'txHex');
784
- if (!txHex || !_.isString(txHex) || !txHex.match(/^([a-f0-9]{2})+$/i)) {
785
- throw new Error('invalid transaction hex, must be a valid hex string');
786
- }
787
- let transaction;
788
- try {
789
- transaction = this.createTransactionFromHex(txHex);
790
- }
791
- catch (e) {
792
- throw new Error('failed to parse transaction hex');
793
- }
794
- const id = transaction.getId();
795
- let spendAmount = utxolib.bitgo.toTNumber(0, this.amountType);
796
- let changeAmount = utxolib.bitgo.toTNumber(0, this.amountType);
797
- const explanation = {
798
- displayOrder: ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs'],
799
- id: id,
800
- outputs: [],
801
- changeOutputs: [],
802
- };
803
- const { changeAddresses = [], unspents = [] } = (_a = params.txInfo) !== null && _a !== void 0 ? _a : {};
804
- transaction.outs.forEach((currentOutput) => {
805
- const currentAddress = utxolib.address.fromOutputScript(currentOutput.script, this.network);
806
- const currentAmount = currentOutput.value;
807
- if (changeAddresses.includes(currentAddress)) {
808
- // this is change
809
- changeAmount += currentAmount;
810
- explanation.changeOutputs.push({
811
- address: currentAddress,
812
- amount: currentAmount.toString(),
813
- });
814
- return;
815
- }
816
- spendAmount += currentAmount;
817
- explanation.outputs.push({
818
- address: currentAddress,
819
- amount: currentAmount.toString(),
820
- });
821
- });
822
- explanation.outputAmount = spendAmount.toString();
823
- explanation.changeAmount = changeAmount.toString();
824
- // add fee info if available
825
- if (params.feeInfo) {
826
- explanation.displayOrder.push('fee');
827
- explanation.fee = params.feeInfo;
828
- }
829
- if (_.isInteger(transaction.locktime) && transaction.locktime > 0) {
830
- explanation.locktime = transaction.locktime;
831
- explanation.displayOrder.push('locktime');
832
- }
833
- const prevOutputs = (_b = params.txInfo) === null || _b === void 0 ? void 0 : _b.unspents.map((u) => toOutput(u, this.network));
834
- // if keys are provided, prepare the keys for input signature checking
835
- const keys = (_c = params.pubs) === null || _c === void 0 ? void 0 : _c.map((xpub) => utxo_lib_1.bip32.fromBase58(xpub));
836
- const walletKeys = keys && keys.length === 3 ? new utxo_lib_1.bitgo.RootWalletKeys(keys) : undefined;
837
- // get the number of signatures per input
838
- const inputSignatureCounts = transaction.ins.map((input, idx) => {
839
- if (unspents.length !== transaction.ins.length) {
840
- return 0;
841
- }
842
- if (!prevOutputs) {
843
- throw new Error(`invalid state`);
844
- }
845
- if (!walletKeys) {
846
- // no pub keys or incorrect number of pub keys
847
- return 0;
848
- }
849
- try {
850
- return verifySignatureWithUnspent(transaction, idx, unspents, walletKeys).filter((v) => v).length;
851
- }
852
- catch (e) {
853
- // some other error occurred and we can't validate the signatures
854
- return 0;
855
- }
856
- });
857
- explanation.inputSignatures = inputSignatureCounts;
858
- explanation.signatures = _.max(inputSignatureCounts);
859
- return explanation;
860
- }
861
- /**
862
- * Create a multisig address of a given type from a list of keychains and a signing threshold
863
- * @param addressType
864
- * @param signatureThreshold
865
- * @param keys
866
- */
867
- createMultiSigAddress(addressType, signatureThreshold, keys) {
868
- const { scriptPubKey: outputScript, redeemScript, witnessScript, } = utxolib.bitgo.outputScripts.createOutputScript2of3(keys, addressType);
869
- return {
870
- outputScript,
871
- redeemScript,
872
- witnessScript,
873
- address: utxolib.address.fromOutputScript(outputScript, this.network),
874
- };
875
- }
876
- /**
877
- * @deprecated - use {@see backupKeyRecovery}
878
- * Builds a funds recovery transaction without BitGo
879
- * @param params - {@see backupKeyRecovery}
880
- */
881
- async recover(params) {
882
- return backupKeyRecovery_1.backupKeyRecovery(this, this.bitgo, params);
883
- }
884
- /**
885
- * Recover coin that was sent to wrong chain
886
- * @param params
887
- * @param params.txid The txid of the faulty transaction
888
- * @param params.recoveryAddress address to send recovered funds to
889
- * @param params.wallet the wallet that received the funds
890
- * @param params.recoveryCoin the coin type of the wallet that received the funds
891
- * @param params.signed return a half-signed transaction (default=true)
892
- * @param params.walletPassphrase the wallet passphrase
893
- * @param params.xprv the unencrypted xprv (used instead of wallet passphrase)
894
- * @returns {*}
895
- */
896
- async recoverFromWrongChain(params) {
897
- const { txid, recoveryAddress, wallet, walletPassphrase, xprv } = params;
898
- // params.recoveryCoin used to be params.coin, backwards compatibility
899
- const recoveryCoin = params.coin || params.recoveryCoin;
900
- if (!recoveryCoin) {
901
- throw new Error('missing required object recoveryCoin');
902
- }
903
- // signed should default to true, and only be disabled if explicitly set to false (not undefined)
904
- const signed = params.signed !== false;
905
- const sourceCoinFamily = this.getFamily();
906
- const recoveryCoinFamily = recoveryCoin.getFamily();
907
- const supportedRecoveryCoins = config_1.supportedCrossChainRecoveries[sourceCoinFamily];
908
- if (_.isUndefined(supportedRecoveryCoins) || !supportedRecoveryCoins.includes(recoveryCoinFamily)) {
909
- throw new Error(`Recovery of ${sourceCoinFamily} balances from ${recoveryCoinFamily} wallets is not supported.`);
910
- }
911
- return await recovery_1.recoverCrossChain(this.bitgo, {
912
- sourceCoin: this,
913
- recoveryCoin,
914
- walletId: wallet,
915
- txid,
916
- recoveryAddress,
917
- walletPassphrase: signed ? walletPassphrase : undefined,
918
- xprv: signed ? xprv : undefined,
919
- });
920
- }
921
- /**
922
- * Generate bip32 key pair
923
- *
924
- * @param seed
925
- * @returns {Object} object with generated pub and prv
926
- */
927
- generateKeyPair(seed) {
928
- if (!seed) {
929
- // An extended private key has both a normal 256 bit private key and a 256
930
- // bit chain code, both of which must be random. 512 bits is therefore the
931
- // maximum entropy and gives us maximum security against cracking.
932
- seed = crypto_1.randomBytes(512 / 8);
933
- }
934
- const extendedKey = utxo_lib_1.bip32.fromSeed(seed);
935
- return {
936
- pub: extendedKey.neutered().toBase58(),
937
- prv: extendedKey.toBase58(),
938
- };
939
- }
940
- async getExtraPrebuildParams(buildParams) {
941
- return {};
942
- }
943
- preCreateBitGo(params) {
944
- return;
945
- }
946
- async presignTransaction(params) {
947
- return params;
948
- }
949
- async supplementGenerateWallet(walletParams, keychains) {
950
- return walletParams;
951
- }
952
- transactionDataAllowed() {
953
- return false;
954
- }
955
- valuelessTransferAllowed() {
956
- return false;
957
- }
958
- }
959
- exports.AbstractUtxoCoin = AbstractUtxoCoin;
960
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsZ0RBQWdEO0FBQ2hELG1EQUFvRTtBQUNwRSxvREFBb0Q7QUFDcEQsbUNBQXFDO0FBQ3JDLGtDQUFrQztBQUNsQyw0QkFBNEI7QUFDNUIsK0NBQXFDO0FBRXJDLG9FQUFnRjtBQUNoRix5Q0FBcUc7QUFFckcsbURBdUM4QjtBQUM5QiwrQ0FBaUU7QUFFakUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBR3hDLHlEQUErRDtBQUMvRCxpQ0FBd0Q7QUFDeEQscUNBQXlEO0FBRXpELE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSwwQkFBMEIsRUFBRSxHQUNsSCxnQkFBSyxDQUFDO0FBbUtSLE1BQXNCLGdCQUFpQixTQUFRLG1CQUFRO0lBTXJELFlBQXNCLEtBQWdCLEVBQUUsT0FBd0IsRUFBRSxhQUFrQyxRQUFRO1FBQzFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStEO2dCQUM3RCxrRkFBa0YsQ0FDckYsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE1BQU0sS0FBSyxpQkFBaUI7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QUFJLEVBQUU7WUFDVCwwRUFBMEU7WUFDMUUsMEVBQTBFO1lBQzFFLGtFQUFrRTtZQUNsRSxJQUFJLEdBQUcsb0JBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0I7UUFDRCxNQUFNLFdBQVcsR0FBRyxnQkFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxPQUFPO1lBQ0wsR0FBRyxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDdEMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUU7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsV0FBdUM7UUFDbEUsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQTZCO1FBQzFDLE9BQU87SUFDVCxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQWlDO1FBQ3hELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLENBQUMsd0JBQXdCLENBQzVCLFlBQTZDLEVBQzdDLFNBQTJCO1FBRTNCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGO0FBN25DRCw0Q0E2bkNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UsIGJpdGdvIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0ICogYXMgYml0Y29pbk1lc3NhZ2UgZnJvbSAnYml0Y29pbmpzLW1lc3NhZ2UnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgZGVidWdMaWIgZnJvbSAnZGVidWcnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5pbXBvcnQgeyBiYWNrdXBLZXlSZWNvdmVyeSwgUmVjb3ZlclBhcmFtcyB9IGZyb20gJy4vcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnknO1xuaW1wb3J0IHsgQ3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkLCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZCwgcmVjb3ZlckNyb3NzQ2hhaW4gfSBmcm9tICcuL3JlY292ZXJ5JztcblxuaW1wb3J0IHtcbiAgQWRkcmVzc0NvaW5TcGVjaWZpYyxcbiAgQWRkcmVzc1R5cGVDaGFpbk1pc21hdGNoRXJyb3IsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yLFxuICBJbnZhbGlkQWRkcmVzc0Vycm9yLFxuICBJbnZhbGlkQWRkcmVzc1ZlcmlmaWNhdGlvbk9iamVjdFByb3BlcnR5RXJyb3IsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBJVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiBhcyBCYXNlVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgSVdhbGxldCxcbiAgS2V5Y2hhaW4sXG4gIEtleWNoYWluc1RyaXBsZXQsXG4gIEtleUluZGljZXMsXG4gIFAyc2hQMndzaFVuc3VwcG9ydGVkRXJyb3IsXG4gIFAydHJVbnN1cHBvcnRlZEVycm9yLFxuICBQMndzaFVuc3VwcG9ydGVkRXJyb3IsXG4gIFBhcnNlZFRyYW5zYWN0aW9uIGFzIEJhc2VQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVjcmVhdGVCaXRHb09wdGlvbnMsXG4gIFByZXNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIHByb21pc2VQcm9wcyxcbiAgUmVxdWVzdFRyYWNlcixcbiAgc2FuaXRpemVMZWdhY3lQYXRoLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25QYXJhbXMgYXMgQmFzZVRyYW5zYWN0aW9uUGFyYW1zLFxuICBUcmFuc2FjdGlvblByZWJ1aWxkIGFzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJpcGxlLFxuICBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yLFxuICBVbnN1cHBvcnRlZEFkZHJlc3NUeXBlRXJyb3IsXG4gIFZlcmlmaWNhdGlvbk9wdGlvbnMsXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zIGFzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFdhbGxldCxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ2hhbmdlT3B0aW9ucywgcGFyc2VPdXRwdXQgfSBmcm9tICcuL3BhcnNlT3V0cHV0JztcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286djI6dXR4bycpO1xuXG5pbXBvcnQgU2NyaXB0VHlwZTJPZjMgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG5pbXBvcnQgeyBpc1JlcGxheVByb3RlY3Rpb25VbnNwZW50IH0gZnJvbSAnLi9yZXBsYXlQcm90ZWN0aW9uJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbiB9IGZyb20gJy4vc2lnbic7XG5pbXBvcnQgeyBzdXBwb3J0ZWRDcm9zc0NoYWluUmVjb3ZlcmllcyB9IGZyb20gJy4vY29uZmlnJztcblxuY29uc3QgeyBnZXRFeHRlcm5hbENoYWluQ29kZSwgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiwgb3V0cHV0U2NyaXB0cywgdG9PdXRwdXQsIHZlcmlmeVNpZ25hdHVyZVdpdGhVbnNwZW50IH0gPVxuICBiaXRnbztcbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IGJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG50eXBlIFJvb3RXYWxsZXRLZXlzID0gYml0Z28uUm9vdFdhbGxldEtleXM7XG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUFkZHJlc3NPcHRpb25zIGV4dGVuZHMgQmFzZVZlcmlmeUFkZHJlc3NPcHRpb25zIHtcbiAgY2hhaW46IG51bWJlcjtcbiAgaW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPdXRwdXQge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGFtb3VudDogc3RyaW5nIHwgbnVtYmVyO1xuICBleHRlcm5hbD86IGJvb2xlYW47XG4gIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uRXhwbGFuYXRpb248c3RyaW5nLCBzdHJpbmc+IHtcbiAgbG9ja3RpbWU6IG51bWJlcjtcbiAgb3V0cHV0czogT3V0cHV0W107XG4gIGNoYW5nZU91dHB1dHM6IE91dHB1dFtdO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgaW5wdXQgc2lnbmF0dXJlcyBwZXIgaW5wdXQuXG4gICAqL1xuICBpbnB1dFNpZ25hdHVyZXM6IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBIaWdoZXN0IGlucHV0IHNpZ25hdHVyZSBjb3VudCBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBzaWduYXR1cmVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgLyoqIE1hcHMgdHhpZCB0byB0eGhleC4gUmVxdWlyZWQgZm9yIG9mZmxpbmUgc2lnbmluZy4gKi9cbiAgdHhIZXhlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNoYW5nZUFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuICB1bnNwZW50czogVW5zcGVudDxUTnVtYmVyPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4ge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm8/OiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIGZlZUluZm8/OiBzdHJpbmc7XG4gIHB1YnM/OiBUcmlwbGU8c3RyaW5nPjtcbn1cblxuZXhwb3J0IHR5cGUgVXR4b05ldHdvcmsgPSB1dHhvbGliLk5ldHdvcms7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkIHtcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBibG9ja0hlaWdodD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblBhcmFtcyBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblBhcmFtcyB7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHdhbGxldDogSVdhbGxldDtcbiAgdmVyaWZpY2F0aW9uPzogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIEJhc2VQYXJzZWRUcmFuc2FjdGlvbiB7XG4gIGtleWNoYWluczoge1xuICAgIHVzZXI/OiBLZXljaGFpbjtcbiAgICBiYWNrdXA/OiBLZXljaGFpbjtcbiAgICBiaXRnbz86IEtleWNoYWluO1xuICB9O1xuICBrZXlTaWduYXR1cmVzOiB7XG4gICAgYmFja3VwUHViPzogc3RyaW5nO1xuICAgIGJpdGdvUHViPzogc3RyaW5nO1xuICB9O1xuICBvdXRwdXRzOiBPdXRwdXRbXTtcbiAgbWlzc2luZ091dHB1dHM6IE91dHB1dFtdO1xuICBleHBsaWNpdEV4dGVybmFsT3V0cHV0czogT3V0cHV0W107XG4gIGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzOiBPdXRwdXRbXTtcbiAgY2hhbmdlT3V0cHV0czogT3V0cHV0W107XG4gIGV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDogVE51bWJlcjtcbiAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50OiBUTnVtYmVyO1xuICBuZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvbjogYm9vbGVhbjtcbiAgY3VzdG9tQ2hhbmdlPzogQ3VzdG9tQ2hhbmdlT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUFkZHJlc3NPcHRpb25zIHtcbiAgYWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mMztcbiAga2V5Y2hhaW5zOiB7XG4gICAgcHViOiBzdHJpbmc7XG4gICAgYXNwS2V5SWQ/OiBzdHJpbmc7XG4gIH1bXTtcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICBjaGFpbj86IG51bWJlcjtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHNlZ3dpdD86IGJvb2xlYW47XG4gIGJlY2gzMj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RldGFpbHMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvaW46IHN0cmluZztcbiAgY29pblNwZWNpZmljOiBBZGRyZXNzQ29pblNwZWNpZmljO1xuICBhZGRyZXNzVHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICAvKiogVHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBiaXRnbyBzZXJ2ZXIgKi9cbiAgdHhQcmVidWlsZDoge1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gICAgdHhJbmZvOiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIH07XG4gIC8qKiB4cHJ2IG9mIHVzZXIga2V5IG9yIGJhY2t1cCBrZXkgKi9cbiAgcHJ2OiBzdHJpbmc7XG4gIC8qKiB4cHVicyB0cmlwbGUgZm9yIHdhbGxldCAodXNlciwgYmFja3VwLCBiaXRnbykgKi9cbiAgcHViczogVHJpcGxlPHN0cmluZz47XG4gIC8qKiB4cHViIGZvciBjb3NpZ25lciAoZGVmYXVsdHMgdG8gYml0Z28pICovXG4gIGNvc2lnbmVyUHViPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCBjcmVhdGVzIGZ1bGwtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGhvdXQgcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICogV2hlbiBmYWxzZSwgY3JlYXRlcyBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIHBsYWNlaG9sZGVyIHNpZ25hdHVyZXMuXG4gICAqL1xuICBpc0xhc3RTaWduYXR1cmU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2lnQWRkcmVzcyB7XG4gIG91dHB1dFNjcmlwdDogQnVmZmVyO1xuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXI7XG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXI7XG4gIGFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyRnJvbVdyb25nQ2hhaW5PcHRpb25zIHtcbiAgdHhpZDogc3RyaW5nO1xuICByZWNvdmVyeUFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIHhwcnY/OiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBjb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgcmVjb3ZlcnlDb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgc2lnbmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlLZXlTaWduYXR1cmVzT3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbj86IEtleWNoYWluO1xuICBrZXljaGFpblRvVmVyaWZ5PzogS2V5Y2hhaW47XG4gIGtleVNpZ25hdHVyZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbj86IEtleWNoYWluO1xuICBkaXNhYmxlTmV0d29ya2luZzogYm9vbGVhbjtcbiAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIEJhc2VWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVdHhvQ29pbiBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHVibGljIGFsdFNjcmlwdEhhc2g/OiBudW1iZXI7XG4gIHB1YmxpYyBzdXBwb3J0QWx0U2NyaXB0RGVzdGluYXRpb24/OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JztcbiAgcHJpdmF0ZSByZWFkb25seSBfbmV0d29yazogdXR4b2xpYi5OZXR3b3JrO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBuZXR3b3JrOiB1dHhvbGliLk5ldHdvcmssIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJykge1xuICAgIHN1cGVyKGJpdGdvKTtcbiAgICBpZiAoIXV0eG9saWIuaXNWYWxpZE5ldHdvcmsobmV0d29yaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2ludmFsaWQgbmV0d29yazogcGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgdGhlIHNhbWUgdmVyc2lvbiBvZiAnICtcbiAgICAgICAgICAnQGJpdGdvLWJldGEvdXR4by1saWIgYXMgdGhpcyBsaWJyYXJ5IHdoZW4gaW5pdGlhbGl6aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MnXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFtb3VudFR5cGUgPSBhbW91bnRUeXBlO1xuICAgIHRoaXMuX25ldHdvcmsgPSBuZXR3b3JrO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25ldHdvcms7XG4gIH1cblxuICBzd2VlcFdpdGhTZW5kTWFueSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBzdGF0aWMgZ2V0IHZhbGlkQWRkcmVzc1R5cGVzKCk6IFNjcmlwdFR5cGUyT2YzW10ge1xuICAgIHJldHVybiBbLi4ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZhY3RvciBiZXR3ZWVuIHRoZSBiYXNlIHVuaXQgYW5kIGl0cyBzbWFsbGVzdCBzdWJkaXZpc29uXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldEJhc2VGYWN0b3IoKSB7XG4gICAgcmV0dXJuIDFlODtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZ2V0Q29pbkxpYnJhcnkoKSB7XG4gICAgcmV0dXJuIHV0eG9saWI7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIGFuIGFkZHJlc3NcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBZGRyZXNzVmVyc2lvbihhZGRyZXNzOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIC8vIHRyeSBkZWNvZGluZyBhcyBiYXNlNTggZmlyc3RcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB2ZXJzaW9uIH0gPSB1dHhvbGliLmFkZHJlc3MuZnJvbUJhc2U1OENoZWNrKGFkZHJlc3MsIHRoaXMubmV0d29yayk7XG4gICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB0cnkgbmV4dCBmb3JtYXRcbiAgICB9XG5cbiAgICAvLyBpZiBjb2luIGRvZXMgbm90IHN1cHBvcnQgc2NyaXB0IHR5cGVzIHdpdGggYmVjaDMyIGVuY29kaW5nLCBkbyBub3QgYXR0ZW1wdCB0byBwYXJzZVxuICAgIGlmICghdGhpcy5zdXBwb3J0c0FkZHJlc3NUeXBlKCdwMndzaCcpICYmICF0aGlzLnN1cHBvcnRzQWRkcmVzc1R5cGUoJ3AydHInKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG90aGVyd2lzZSwgdHJ5IGRlY29kaW5nIGFzIGJlY2gzMlxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHZlcnNpb24sIHByZWZpeCB9ID0gdXR4b2xpYi5hZGRyZXNzLmZyb21CZWNoMzIoYWRkcmVzcyk7XG4gICAgICBpZiAoXy5pc1N0cmluZyh0aGlzLm5ldHdvcmsuYmVjaDMyKSAmJiBwcmVmaXggPT09IHRoaXMubmV0d29yay5iZWNoMzIpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWdub3JlIGVycm9ycywganVzdCBmYWxsIHRocm91Z2ggYW5kIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGdldCB0aGUgYmVjaDMyIHByZWZpeCBmb3IgYW4gYWRkcmVzc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFkZHJlc3NQcmVmaXgoYWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBvdGhlcndpc2UsIHRyeSBkZWNvZGluZyBhcyBiZWNoMzJcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBwcmVmaXggfSA9IHV0eG9saWIuYWRkcmVzcy5mcm9tQmVjaDMyKGFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmUgZXJyb3JzLCBqdXN0IGZhbGwgdGhyb3VnaCBhbmQgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqIEBwYXJhbSBhZGRyZXNzXG4gICAqIEBwYXJhbSBmb3JjZUFsdFNjcmlwdFN1cHBvcnRcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZm9yY2VBbHRTY3JpcHRTdXBwb3J0ID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWxpZFZlcnNpb25zOiBudW1iZXJbXSA9IFt0aGlzLm5ldHdvcmsucHViS2V5SGFzaCwgdGhpcy5uZXR3b3JrLnNjcmlwdEhhc2hdO1xuICAgIGlmICh0aGlzLmFsdFNjcmlwdEhhc2ggJiYgKGZvcmNlQWx0U2NyaXB0U3VwcG9ydCB8fCB0aGlzLnN1cHBvcnRBbHRTY3JpcHREZXN0aW5hdGlvbikpIHtcbiAgICAgIHZhbGlkVmVyc2lvbnMucHVzaCh0aGlzLmFsdFNjcmlwdEhhc2gpO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NWZXJzaW9uID0gdGhpcy5nZXRBZGRyZXNzVmVyc2lvbihhZGRyZXNzKTtcblxuICAgIC8vIHRoZSBhZGRyZXNzIHZlcnNpb24gbmVlZHMgdG8gYmUgYW1vbmcgdGhlIHZhbGlkIG9uZXNcbiAgICBjb25zdCBhZGRyZXNzVmVyc2lvblZhbGlkID0gXy5pc051bWJlcihhZGRyZXNzVmVyc2lvbikgJiYgdmFsaWRWZXJzaW9ucy5pbmNsdWRlcyhhZGRyZXNzVmVyc2lvbik7XG4gICAgY29uc3QgYWRkcmVzc1ByZWZpeCA9IHRoaXMuZ2V0QWRkcmVzc1ByZWZpeChhZGRyZXNzKTtcblxuICAgIGlmICghdGhpcy5zdXBwb3J0c0FkZHJlc3NUeXBlKCdwMndzaCcpIHx8IF8uaXNVbmRlZmluZWQoYWRkcmVzc1ByZWZpeCkpIHtcbiAgICAgIHJldHVybiBhZGRyZXNzVmVyc2lvblZhbGlkO1xuICAgIH1cblxuICAgIC8vIGFkZHJlc3MgaGFzIGEgcG90ZW50aWFsIGJlY2gzMiBwcmVmaXgsIHZhbGlkYXRlIHRoYXRcbiAgICByZXR1cm4gKFxuICAgICAgXy5pc1N0cmluZyh0aGlzLm5ldHdvcmsuYmVjaDMyKSAmJiB0aGlzLm5ldHdvcmsuYmVjaDMyID09PSBhZGRyZXNzUHJlZml4ICYmIGFkZHJlc3MgPT09IGFkZHJlc3MudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBiaXAzMi5mcm9tQmFzZTU4KHB1YikuaXNOZXV0ZXJlZCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXRlc3QgYmxvY2sgaGVpZ2h0XG4gICAqIEBwYXJhbSByZXFJZFxuICAgKi9cbiAgYXN5bmMgZ2V0TGF0ZXN0QmxvY2tIZWlnaHQocmVxSWQ/OiBSZXF1ZXN0VHJhY2VyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGNoYWluaGVhZCA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcHVibGljL2Jsb2NrL2xhdGVzdCcpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gKGNoYWluaGVhZCBhcyBhbnkpLmhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gY3VzdG9tIGNvaW4gbG9naWMgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBoYXMgYmVlbiByZWNlaXZlZCBmcm9tIEJpdEdvXG4gICAqIEBwYXJhbSBwcmVidWlsZFxuICAgKi9cbiAgYXN5bmMgcG9zdFByb2Nlc3NQcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPlxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj4+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwcmVidWlsZC50eEhleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8VE51bWJlcj4ocHJlYnVpbGQudHhIZXgpO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHByZWJ1aWxkLmJsb2NrSGVpZ2h0KSkge1xuICAgICAgcHJlYnVpbGQuYmxvY2tIZWlnaHQgPSAoYXdhaXQgdGhpcy5nZXRMYXRlc3RCbG9ja0hlaWdodCgpKSBhcyBudW1iZXI7XG4gICAgfVxuICAgIC8vIExvY2sgdHJhbnNhY3Rpb24gdG8gdGhlIG5leHQgYmxvY2sgdG8gZGlzY291cmFnZSBmZWUgc25pcGluZ1xuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYml0Y29pbi9ibG9iL2ZiMGFjNDgyZWVlNzYxZWMxN2VkMmMxMWRmMTFlMDU0MzQ3YTAyNmQvc3JjL3dhbGxldC93YWxsZXQuY3BwI0wyMTMzXG4gICAgdHJhbnNhY3Rpb24ubG9ja3RpbWUgPSBwcmVidWlsZC5ibG9ja0hlaWdodDtcbiAgICByZXR1cm4gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHR4SGV4OiB0cmFuc2FjdGlvbi50b0hleCgpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgb3V0cHV0cyB0aGF0IGFyZSB3aXRoaW4gZXhwZWN0ZWQgb3V0cHV0cyBidXQgbm90IHdpdGhpbiBhY3R1YWwgb3V0cHV0cywgaW5jbHVkaW5nIGR1cGxpY2F0ZXNcbiAgICogQHBhcmFtIGV4cGVjdGVkT3V0cHV0c1xuICAgKiBAcGFyYW0gYWN0dWFsT3V0cHV0c1xuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZpbmRNaXNzaW5nT3V0cHV0cyhleHBlY3RlZE91dHB1dHM6IE91dHB1dFtdLCBhY3R1YWxPdXRwdXRzOiBPdXRwdXRbXSk6IE91dHB1dFtdIHtcbiAgICBjb25zdCBrZXlGdW5jID0gKHsgYWRkcmVzcywgYW1vdW50IH06IE91dHB1dCk6IHN0cmluZyA9PiBgJHthZGRyZXNzfToke051bWJlcihhbW91bnQpfWA7XG4gICAgY29uc3QgZ3JvdXBlZE91dHB1dHMgPSBfLmdyb3VwQnkoZXhwZWN0ZWRPdXRwdXRzLCBrZXlGdW5jKTtcblxuICAgIGFjdHVhbE91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGdyb3VwZWRPdXRwdXRzW2tleUZ1bmMob3V0cHV0KV07XG4gICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgZ3JvdXAucG9wKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gXy5mbGF0dGVuKF8udmFsdWVzKGdyb3VwZWRPdXRwdXRzKSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGFuIGFkZHJlc3MnIHR5cGUgYmFzZWQgb24gaXRzIHdpdG5lc3MgYW5kIHJlZGVlbSBzY3JpcHQgcHJlc2VuY2VcbiAgICogQHBhcmFtIGFkZHJlc3NEZXRhaWxzXG4gICAqL1xuICBzdGF0aWMgaW5mZXJBZGRyZXNzVHlwZShhZGRyZXNzRGV0YWlsczogeyBjaGFpbjogbnVtYmVyIH0pOiBTY3JpcHRUeXBlMk9mMyB8IG51bGwge1xuICAgIHJldHVybiBpc0NoYWluQ29kZShhZGRyZXNzRGV0YWlscy5jaGFpbikgPyBzY3JpcHRUeXBlRm9yQ2hhaW4oYWRkcmVzc0RldGFpbHMuY2hhaW4pIDogbnVsbDtcbiAgfVxuXG4gIGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBoZXg6IHN0cmluZ1xuICApOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KGhleCwgdGhpcy5uZXR3b3JrLCB0aGlzLmFtb3VudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYW5kIGZpbGwgdHJhbnNhY3Rpb24gZGV0YWlscyBzdWNoIGFzIGludGVybmFsL2NoYW5nZSBzcGVuZCwgZXh0ZXJuYWwgc3BlbmQgKGV4cGxpY2l0IHZzLiBpbXBsaWNpdCksIGV0Yy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+PiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgd2FsbGV0LCB2ZXJpZmljYXRpb24gPSB7fSwgcmVxSWQgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZyBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgIH1cbiAgICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAgIGNvbnN0IGZldGNoS2V5Y2hhaW5zID0gYXN5bmMgKHdhbGxldDogSVdhbGxldCk6IFByb21pc2U8VmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10+ID0+IHtcbiAgICAgIHJldHVybiBwcm9taXNlUHJvcHMoe1xuICAgICAgICB1c2VyOiB0aGlzLmtleWNoYWlucygpLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5VU0VSXSwgcmVxSWQgfSksXG4gICAgICAgIGJhY2t1cDogdGhpcy5rZXljaGFpbnMoKS5nZXQoeyBpZDogd2FsbGV0LmtleUlkcygpW0tleUluZGljZXMuQkFDS1VQXSwgcmVxSWQgfSksXG4gICAgICAgIGJpdGdvOiB0aGlzLmtleWNoYWlucygpLmdldCh7IGlkOiB3YWxsZXQua2V5SWRzKClbS2V5SW5kaWNlcy5CSVRHT10sIHJlcUlkIH0pLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIG9idGFpbiB0aGUga2V5Y2hhaW5zIGFuZCBrZXkgc2lnbmF0dXJlc1xuICAgIGxldCBrZXljaGFpbnM6IFZlcmlmaWNhdGlvbk9wdGlvbnNbJ2tleWNoYWlucyddIHwgdW5kZWZpbmVkID0gdmVyaWZpY2F0aW9uLmtleWNoYWlucztcbiAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgaWYgKGRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGZldGNoIGtleWNoYWlucyB3aXRob3V0IG5ldHdvcmtpbmcnKTtcbiAgICAgIH1cbiAgICAgIGtleWNoYWlucyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKHdhbGxldCk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpbnMgfHwgIWtleWNoYWlucy51c2VyIHx8ICFrZXljaGFpbnMuYmFja3VwIHx8ICFrZXljaGFpbnMuYml0Z28pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW5zIGFyZSByZXF1aXJlZCwgYnV0IGNvdWxkIG5vdCBiZSBmZXRjaGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5BcnJheTogVHJpcGxlPEtleWNoYWluPiA9IFtrZXljaGFpbnMudXNlciwga2V5Y2hhaW5zLmJhY2t1cCwga2V5Y2hhaW5zLmJpdGdvXTtcblxuICAgIGNvbnN0IGtleVNpZ25hdHVyZXMgPSBfLmdldCh3YWxsZXQsICdfd2FsbGV0LmtleVNpZ25hdHVyZXMnKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQudHhIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHhQcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH1cbiAgICAvLyBvYnRhaW4gYWxsIG91dHB1dHNcbiAgICBjb25zdCBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICAgIHR4SGV4OiB0eFByZWJ1aWxkLnR4SGV4LFxuICAgICAgdHhJbmZvOiB0eFByZWJ1aWxkLnR4SW5mbyxcbiAgICAgIHB1YnM6IGtleWNoYWluQXJyYXkubWFwKChrKSA9PiBrLnB1YikgYXMgVHJpcGxlPHN0cmluZz4sXG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxPdXRwdXRzID0gWy4uLmV4cGxhbmF0aW9uLm91dHB1dHMsIC4uLmV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHNdO1xuXG4gICAgLy8gdmVyaWZ5IHRoYXQgZWFjaCByZWNpcGllbnQgZnJvbSB0eFBhcmFtcyBoYXMgdGhlaXIgb3duIG91dHB1dFxuICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0cyA9IF8uZ2V0KHR4UGFyYW1zLCAncmVjaXBpZW50cycsIFtdIGFzIFRyYW5zYWN0aW9uUmVjaXBpZW50W10pLm1hcCgob3V0cHV0KSA9PiB7XG4gICAgICByZXR1cm4geyAuLi5vdXRwdXQsIGFkZHJlc3M6IHRoaXMuY2Fub25pY2FsQWRkcmVzcyhvdXRwdXQuYWRkcmVzcykgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gQWJzdHJhY3RVdHhvQ29pbi5maW5kTWlzc2luZ091dHB1dHMoZXhwZWN0ZWRPdXRwdXRzLCBhbGxPdXRwdXRzKTtcblxuICAgIC8vIGdldCB0aGUga2V5Y2hhaW5zIGZyb20gdGhlIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0IGlmIG5lZWRlZFxuICAgIGxldCBjdXN0b21DaGFuZ2U6IEN1c3RvbUNoYW5nZU9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyBjdXN0b21DaGFuZ2VXYWxsZXRJZCA9IHVuZGVmaW5lZCB9ID0gd2FsbGV0LmNvaW5TcGVjaWZpYygpIHx8IHt9O1xuICAgIGlmIChjdXN0b21DaGFuZ2VXYWxsZXRJZCkge1xuICAgICAgLy8gZmV0Y2gga2V5Y2hhaW5zIGZyb20gY3VzdG9tIGNoYW5nZSB3YWxsZXQgZm9yIGRlcml2aW5nIGFkZHJlc3Nlcy5cbiAgICAgIC8vIFRoZXNlIGtleWNoYWlucyBzaG91bGQgYmUgc2lnbmVkIGFuZCB0aGlzIHNob3VsZCBiZSB2ZXJpZmllZCBpbiB2ZXJpZnlUcmFuc2FjdGlvblxuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcyA9IF8uZ2V0KHdhbGxldCwgJ193YWxsZXQuY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcycsIHt9KTtcbiAgICAgIGNvbnN0IGN1c3RvbUNoYW5nZVdhbGxldDogV2FsbGV0ID0gYXdhaXQgdGhpcy53YWxsZXRzKCkuZ2V0KHsgaWQ6IGN1c3RvbUNoYW5nZVdhbGxldElkIH0pO1xuICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5cyA9IGF3YWl0IGZldGNoS2V5Y2hhaW5zKGN1c3RvbUNoYW5nZVdhbGxldCk7XG5cbiAgICAgIGlmICghY3VzdG9tQ2hhbmdlS2V5cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBmZXRjaCBrZXljaGFpbnMgZm9yIGN1c3RvbSBjaGFuZ2Ugd2FsbGV0Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXN0b21DaGFuZ2VLZXlzLnVzZXIgJiYgY3VzdG9tQ2hhbmdlS2V5cy5iYWNrdXAgJiYgY3VzdG9tQ2hhbmdlS2V5cy5iaXRnbyAmJiBjdXN0b21DaGFuZ2VXYWxsZXQpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tQ2hhbmdlS2V5Y2hhaW5zOiBbS2V5Y2hhaW4sIEtleWNoYWluLCBLZXljaGFpbl0gPSBbXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cy51c2VyLFxuICAgICAgICAgIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwLFxuICAgICAgICAgIGN1c3RvbUNoYW5nZUtleXMuYml0Z28sXG4gICAgICAgIF07XG5cbiAgICAgICAgY3VzdG9tQ2hhbmdlID0ge1xuICAgICAgICAgIGtleXM6IGN1c3RvbUNoYW5nZUtleWNoYWlucyxcbiAgICAgICAgICBzaWduYXR1cmVzOiBbXG4gICAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLnVzZXIsXG4gICAgICAgICAgICBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJhY2t1cCxcbiAgICAgICAgICAgIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYml0Z28sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBvdXRwdXRzIGFuZCBjbGFzc2lmeSBlYWNoIG9mIHRoZW0gYXMgZWl0aGVyIGludGVybmFsIHNwZW5kc1xuICAgICAqIG9yIGV4dGVybmFsIHNwZW5kcyBieSBzZXR0aW5nIHRoZSBcImV4dGVybmFsXCIgcHJvcGVydHkgdG8gdHJ1ZSBvciBmYWxzZSBvbiB0aGUgb3V0cHV0IG9iamVjdC5cbiAgICAgKi9cbiAgICBjb25zdCBhbGxPdXRwdXREZXRhaWxzOiBPdXRwdXRbXSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYWxsT3V0cHV0cy5tYXAoKGN1cnJlbnRPdXRwdXQpID0+IHtcbiAgICAgICAgcmV0dXJuIHBhcnNlT3V0cHV0KHtcbiAgICAgICAgICBjdXJyZW50T3V0cHV0LFxuICAgICAgICAgIGNvaW46IHRoaXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgICB2ZXJpZmljYXRpb24sXG4gICAgICAgICAga2V5Y2hhaW5BcnJheSxcbiAgICAgICAgICB3YWxsZXQsXG4gICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgY3VzdG9tQ2hhbmdlLFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uID0gYWxsT3V0cHV0RGV0YWlscy5zb21lKFxuICAgICAgKG91dHB1dCkgPT4gb3V0cHV0Lm5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uXG4gICAgKTtcblxuICAgIGNvbnN0IGNoYW5nZU91dHB1dHMgPSBfLmZpbHRlcihhbGxPdXRwdXREZXRhaWxzLCB7IGV4dGVybmFsOiBmYWxzZSB9KTtcblxuICAgIC8vIHRoZXNlIGFyZSBhbGwgdGhlIG91dHB1dHMgdGhhdCB3ZXJlIG5vdCBvcmlnaW5hbGx5IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHJlY2lwaWVudHNcbiAgICBjb25zdCBpbXBsaWNpdE91dHB1dHMgPSBBYnN0cmFjdFV0eG9Db2luLmZpbmRNaXNzaW5nT3V0cHV0cyhhbGxPdXRwdXREZXRhaWxzLCBleHBlY3RlZE91dHB1dHMpO1xuXG4gICAgY29uc3QgZXhwbGljaXRPdXRwdXRzID0gQWJzdHJhY3RVdHhvQ29pbi5maW5kTWlzc2luZ091dHB1dHMoYWxsT3V0cHV0RGV0YWlscywgaW1wbGljaXRPdXRwdXRzKTtcblxuICAgIC8vIHRoZXNlIGFyZSBhbGwgdGhlIG5vbi13YWxsZXQgb3V0cHV0cyB0aGF0IGhhZCBiZWVuIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICAgIGNvbnN0IGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gXy5maWx0ZXIoZXhwbGljaXRPdXRwdXRzLCB7IGV4dGVybmFsOiB0cnVlIH0pO1xuXG4gICAgLy8gdGhpcyBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBub24td2FsbGV0IG91dHB1dCB2YWx1ZXNcbiAgICBjb25zdCBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnRvVE51bWJlcjxUTnVtYmVyPihcbiAgICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG86IE91dHB1dCkgPT4gc3VtICsgQmlnSW50KG8uYW1vdW50KSwgQmlnSW50KDApKSBhcyBiaWdpbnQsXG4gICAgICB0aGlzLmFtb3VudFR5cGVcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZCBhbW91bnQgcGVydGFpbnMgdG8gdmVyaWZ5aW5nIHRoZSBwYXktYXMteW91LWdvLWZlZSBCaXRHb1xuICAgICAqIGF1dG9tYXRpY2FsbHkgYXBwbGllcyB0byB0cmFuc2FjdGlvbnMgc2VuZGluZyBtb25leSBvdXQgb2YgdGhlIHdhbGxldC4gVGhlIGxvZ2ljIGlzIGZhaXJseSBzdHJhaWdodGZvcndhcmRcbiAgICAgKiBpbiB0aGF0IHdlIGNvbXBhcmUgdGhlIGV4dGVybmFsIHNwZW5kIGFtb3VudCB0aGF0IHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBieSB0aGUgdXNlciB0byB0aGUgcG9ydGlvblxuICAgICAqIHRoYXQgd2FzIHNwZWNpZmllZCBpbXBsaWNpdGx5LiBUbyBwcm90ZWN0IGN1c3RvbWVycyBmcm9tIHBlb3BsZSB0YW1wZXJpbmcgd2l0aCB0aGUgdHJhbnNhY3Rpb24gb3V0cHV0cywgd2VcbiAgICAgKiBkZWZpbmUgYSB0aHJlc2hvbGQgZm9yIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGluIHJlbGF0aW9uIHRvIHRoZSBleHBsaWNpdFxuICAgICAqIGV4dGVybmFsIHNwZW5kLlxuICAgICAqL1xuXG4gICAgLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBleHRyYSBhZGRyZXNzZXMgYXJlIGNoYW5nZSBhZGRyZXNzZXNcbiAgICAvLyBnZXQgYWxsIHRoZSBhZGRpdGlvbmFsIGV4dGVybmFsIG91dHB1dHMgdGhlIHNlcnZlciBhZGRlZCBhbmQgY2FsY3VsYXRlIHRoZWlyIHZhbHVlc1xuICAgIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzID0gXy5maWx0ZXIoaW1wbGljaXRPdXRwdXRzLCB7IGV4dGVybmFsOiB0cnVlIH0pO1xuICAgIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHV0eG9saWIuYml0Z28udG9UTnVtYmVyPFROdW1iZXI+KFxuICAgICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMucmVkdWNlKChzdW06IGJpZ2ludCwgbzogT3V0cHV0KSA9PiBzdW0gKyBCaWdJbnQoby5hbW91bnQpLCBCaWdJbnQoMCkpIGFzIGJpZ2ludCxcbiAgICAgIHRoaXMuYW1vdW50VHlwZVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAga2V5Y2hhaW5zLFxuICAgICAga2V5U2lnbmF0dXJlcyxcbiAgICAgIG91dHB1dHM6IGFsbE91dHB1dERldGFpbHMsXG4gICAgICBtaXNzaW5nT3V0cHV0cyxcbiAgICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLFxuICAgICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMsXG4gICAgICBjaGFuZ2VPdXRwdXRzLFxuICAgICAgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICAgICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICAgICAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24sXG4gICAgICBjdXN0b21DaGFuZ2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNyeXB0IHRoZSB3YWxsZXQncyB1c2VyIHByaXZhdGUga2V5IGFuZCB2ZXJpZnkgdGhhdCB0aGUgY2xhaW1lZCBwdWJsaWMga2V5IG1hdGNoZXNcbiAgICogQHBhcmFtIHtWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9uc30gcGFyYW1zXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCB2ZXJpZnlVc2VyUHVibGljS2V5KHBhcmFtczogVmVyaWZ5VXNlclB1YmxpY0tleU9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwgdHhQYXJhbXMsIGRpc2FibGVOZXR3b3JraW5nIH0gPSBwYXJhbXM7XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBrZXljaGFpbiBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJQdWIgPSB1c2VyS2V5Y2hhaW4ucHViO1xuXG4gICAgLy8gZGVjcnlwdCB0aGUgdXNlciBwcml2YXRlIGtleSBzbyB3ZSBjYW4gdmVyaWZ5IHRoYXQgdGhlIGNsYWltZWQgcHVibGljIGtleSBpcyBhIG1hdGNoXG4gICAgbGV0IHVzZXJQcnYgPSB1c2VyS2V5Y2hhaW4ucHJ2O1xuICAgIGlmIChfLmlzRW1wdHkodXNlclBydikpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoZW5jcnlwdGVkUHJ2ICYmICFfLmlzRW1wdHkoZW5jcnlwdGVkUHJ2KSkge1xuICAgICAgICAvLyBpZiB0aGUgZGVjcnlwdGlvbiBmYWlscywgaXQgd2lsbCB0aHJvdyBhbiBlcnJvclxuICAgICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogZW5jcnlwdGVkUHJ2LFxuICAgICAgICAgIHBhc3N3b3JkOiB0eFBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICd1c2VyIHByaXZhdGUga2V5IHVuYXZhaWxhYmxlIGZvciB2ZXJpZmljYXRpb24nO1xuICAgICAgaWYgKGRpc2FibGVOZXR3b3JraW5nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1c2VyUHJpdmF0ZUtleSA9IGJpcDMyLmZyb21CYXNlNTgodXNlclBydik7XG4gICAgICBpZiAodXNlclByaXZhdGVLZXkudG9CYXNlNTgoKSA9PT0gdXNlclByaXZhdGVLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBwcml2YXRlIGtleSBpcyBvbmx5IHB1YmxpYycpO1xuICAgICAgfVxuICAgICAgaWYgKHVzZXJQcml2YXRlS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSAhPT0gdXNlclB1Yikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXIgcHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggcHVibGljIGtleScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBzaWduYXR1cmVzIHByb2R1Y2VkIGJ5IHRoZSB1c2VyIGtleSBvdmVyIHRoZSBiYWNrdXAgYW5kIGJpdGdvIGtleXMuXG4gICAqXG4gICAqIElmIHNldCwgdGhlc2Ugc2lnbmF0dXJlcyBlbnN1cmUgdGhhdCB0aGUgd2FsbGV0IGtleXMgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIHdhbGxldCBoYXMgYmVlbiBjcmVhdGVkLlxuICAgKiBAcGFyYW0ge1ZlcmlmeUtleVNpZ25hdHVyZXNPcHRpb25zfSBwYXJhbXNcbiAgICogQHJldHVybiB7e2JhY2t1cDogYm9vbGVhbiwgYml0Z286IGJvb2xlYW59fVxuICAgKi9cbiAgcHJvdGVjdGVkIHZlcmlmeUtleVNpZ25hdHVyZShwYXJhbXM6IFZlcmlmeUtleVNpZ25hdHVyZXNPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgLy8gZmlyc3QsIGxldCdzIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSB1c2VyIGtleSwgd2hvc2UgcHVibGljIGtleSBpcyB1c2VkIGZvciBzdWJzZXF1ZW50IHZlcmlmaWNhdGlvbnNcbiAgICBjb25zdCB7IHVzZXJLZXljaGFpbiwga2V5Y2hhaW5Ub1ZlcmlmeSwga2V5U2lnbmF0dXJlIH0gPSBwYXJhbXM7XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndXNlciBrZXljaGFpbiBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICgha2V5Y2hhaW5Ub1ZlcmlmeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiB0byB2ZXJpZnkgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWtleVNpZ25hdHVyZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXkgc2lnbmF0dXJlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgYWdhaW5zdCB0aGUgdXNlciBwdWJsaWMga2V5XG4gICAgY29uc3QgcHVibGljS2V5ID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyS2V5Y2hhaW4ucHViKS5wdWJsaWNLZXk7XG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MudG9CYXNlNThDaGVjayhcbiAgICAgIHV0eG9saWIuY3J5cHRvLmhhc2gxNjAocHVibGljS2V5KSxcbiAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pbi5wdWJLZXlIYXNoLFxuICAgICAgdGhpcy5uZXR3b3JrXG4gICAgKTtcblxuICAgIC8vIEJHLTU3MDM6IHVzZSBCVEMgbWFpbm5ldCBwcmVmaXggZm9yIGFsbCBrZXkgc2lnbmF0dXJlIG9wZXJhdGlvbnNcbiAgICAvLyAodGhpcyBtZWFucyBkbyBub3QgcGFzcyBhIHByZWZpeCBwYXJhbWV0ZXIsIGFuZCBsZXQgaXQgdXNlIHRoZSBkZWZhdWx0IHByZWZpeCBpbnN0ZWFkKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYml0Y29pbk1lc3NhZ2UudmVyaWZ5KGtleWNoYWluVG9WZXJpZnkucHViLCBzaWduaW5nQWRkcmVzcywgQnVmZmVyLmZyb20oa2V5U2lnbmF0dXJlLCAnaGV4JykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnKCdlcnJvciB0aHJvd24gZnJvbSBiaXRjb2lubWVzc2FnZSB3aGlsZSB2ZXJpZnlpbmcga2V5IHNpZ25hdHVyZScsIGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgc2lnbmF0dXJlcyBhZ2FpbnN0IHRoZSB1c2VyIHByaXZhdGUga2V5IG92ZXIgdGhlIGNoYW5nZSB3YWxsZXQgZXh0ZW5kZWQga2V5c1xuICAgKiBAcGFyYW0ge1BhcnNlZFRyYW5zYWN0aW9ufSB0eFxuICAgKiBAcGFyYW0ge0tleWNoYWlufSB1c2VyS2V5Y2hhaW5cbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHZlcmlmeUN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgdHg6IFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+LFxuICAgIHVzZXJLZXljaGFpbjogS2V5Y2hhaW5cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0eC5jdXN0b21DaGFuZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGFyc2VkIHRyYW5zYWN0aW9uIGlzIG1pc3NpbmcgcmVxdWlyZWQgY3VzdG9tIGNoYW5nZSB2ZXJpZmljYXRpb24gZGF0YScpO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0eC5jdXN0b21DaGFuZ2Uua2V5cykgfHwgIUFycmF5LmlzQXJyYXkodHguY3VzdG9tQ2hhbmdlLnNpZ25hdHVyZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2N1c3RvbUNoYW5nZSBwcm9wZXJ0eSBpcyBtaXNzaW5nIGtleXMgb3Igc2lnbmF0dXJlcycpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5SW5kZXggb2YgW0tleUluZGljZXMuVVNFUiwgS2V5SW5kaWNlcy5CQUNLVVAsIEtleUluZGljZXMuQklUR09dKSB7XG4gICAgICBjb25zdCBrZXljaGFpblRvVmVyaWZ5ID0gdHguY3VzdG9tQ2hhbmdlLmtleXNba2V5SW5kZXhdO1xuICAgICAgY29uc3Qga2V5U2lnbmF0dXJlID0gdHguY3VzdG9tQ2hhbmdlLnNpZ25hdHVyZXNba2V5SW5kZXhdO1xuICAgICAgaWYgKCFrZXljaGFpblRvVmVyaWZ5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyByZXF1aXJlZCBjdXN0b20gY2hhbmdlICR7S2V5SW5kaWNlc1trZXlJbmRleF0udG9Mb3dlckNhc2UoKX0ga2V5Y2hhaW4gcHVibGljIGtleWApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZXlTaWduYXR1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIGN1c3RvbSBjaGFuZ2UgJHtLZXlJbmRpY2VzW2tleUluZGV4XS50b0xvd2VyQ2FzZSgpfSBrZXljaGFpbiBzaWduYXR1cmVgKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy52ZXJpZnlLZXlTaWduYXR1cmUoeyB1c2VyS2V5Y2hhaW4sIGtleWNoYWluVG9WZXJpZnksIGtleVNpZ25hdHVyZSB9KSkge1xuICAgICAgICBkZWJ1ZygnZmFpbGVkIHRvIHZlcmlmeSBjdXN0b20gY2hhbmdlICVzIGtleSBzaWduYXR1cmUhJywgS2V5SW5kaWNlc1trZXlJbmRleF0udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gcGVyY2VudGFnZSBsaW1pdCBmb3IgcGF5LWFzLXlvdS1nbyBvdXRwdXRzXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXRQYXlHb0xpbWl0KGFsbG93UGF5Z29PdXRwdXQ/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAvLyBhbGxvd2luZyBwYXlnbyBvdXRwdXRzIG5lZWRzIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBzbyBvbmx5IGRpc2FsbG93IHBheWdvIG91dHB1dHMgaWYgdGhlXG4gICAgLy8gcmVsZXZhbnQgdmVyaWZpY2F0aW9uIG9wdGlvbiBpcyBib3RoIHNldCBhbmQgZmFsc2VcbiAgICBpZiAoIV8uaXNOaWwoYWxsb3dQYXlnb091dHB1dCkgJiYgIWFsbG93UGF5Z29PdXRwdXQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvLyAxNTAgYmFzaXMgcG9pbnRzIGlzIHRoZSBhYnNvbHV0ZSBwZXJtaXR0ZWQgbWF4aW11bSBpZiBwYXlnbyBvdXRwdXRzIGFyZSBhbGxvd2VkXG4gICAgcmV0dXJuIDAuMDE1O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgY29tcGxpZXMgd2l0aCB0aGUgb3JpZ2luYWwgaW50ZW50aW9uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eFBhcmFtcyBwYXJhbXMgb2JqZWN0IHBhc3NlZCB0byBzZW5kXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZCBwcmVidWlsZCBvYmplY3QgcmV0dXJuZWQgYnkgc2VydmVyXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZC50eEhleCBwcmVidWlsdCB0cmFuc2FjdGlvbidzIHR4SGV4IGZvcm1cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXQgV2FsbGV0IG9iamVjdCB0byBvYnRhaW4ga2V5cyB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbiBPYmplY3Qgc3BlY2lmeWluZyBzb21lIHZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nIERpc2FsbG93IGZldGNoaW5nIGFueSBkYXRhIGZyb20gdGhlIGludGVybmV0IGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXNcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24ua2V5Y2hhaW5zIFBhc3Mga2V5Y2hhaW5zIG1hbnVhbGx5IHJhdGhlciB0aGFuIGZldGNoaW5nIHRoZW0gYnkgaWRcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24uYWRkcmVzc2VzIEFkZHJlc3MgZGV0YWlscyB0byBwYXNzIGluIGZvciBvdXQtb2YtYmFuZCB2ZXJpZmljYXRpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiA9IHsgYWxsb3dQYXlnb091dHB1dDogdHJ1ZSB9LCByZXFJZCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGRpc2FibGVOZXR3b3JraW5nID0gISF2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmc7XG4gICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb246IFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+ID0gYXdhaXQgdGhpcy5wYXJzZVRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICAgIHR4UGFyYW1zLFxuICAgICAgdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldCxcbiAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgIHJlcUlkLFxuICAgIH0pO1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gcGFyc2VkVHJhbnNhY3Rpb24ua2V5Y2hhaW5zO1xuXG4gICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGNsYWltZWQgdXNlciBwdWJsaWMga2V5IGNvcnJlc3BvbmRzIHRvIHRoZSB3YWxsZXQncyB1c2VyIHByaXZhdGUga2V5XG4gICAgbGV0IHVzZXJQdWJsaWNLZXlWZXJpZmllZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAvLyB2ZXJpZnkgdGhlIHVzZXIgcHVibGljIGtleSBtYXRjaGVzIHRoZSBwcml2YXRlIGtleSAtIHRoaXMgd2lsbCB0aHJvdyBpZiB0aGVyZSBpcyBubyBtYXRjaFxuICAgICAgdXNlclB1YmxpY0tleVZlcmlmaWVkID0gdGhpcy52ZXJpZnlVc2VyUHVibGljS2V5KHsgdXNlcktleWNoYWluOiBrZXljaGFpbnMudXNlciwgZGlzYWJsZU5ldHdvcmtpbmcsIHR4UGFyYW1zIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRlYnVnKCdmYWlsZWQgdG8gdmVyaWZ5IHVzZXIgcHVibGljIGtleSEnLCBlKTtcbiAgICB9XG5cbiAgICAvLyBsZXQncyB2ZXJpZnkgdGhlc2Uga2V5Y2hhaW5zXG4gICAgY29uc3Qga2V5U2lnbmF0dXJlcyA9IHBhcnNlZFRyYW5zYWN0aW9uLmtleVNpZ25hdHVyZXM7XG4gICAgaWYgKCFfLmlzRW1wdHkoa2V5U2lnbmF0dXJlcykpIHtcbiAgICAgIGNvbnN0IHZlcmlmeSA9IChrZXksIHB1YikgPT5cbiAgICAgICAgdGhpcy52ZXJpZnlLZXlTaWduYXR1cmUoeyB1c2VyS2V5Y2hhaW46IGtleWNoYWlucy51c2VyLCBrZXljaGFpblRvVmVyaWZ5OiBrZXksIGtleVNpZ25hdHVyZTogcHViIH0pO1xuICAgICAgY29uc3QgaXNCYWNrdXBLZXlTaWduYXR1cmVWYWxpZCA9IHZlcmlmeShrZXljaGFpbnMuYmFja3VwLCBrZXlTaWduYXR1cmVzLmJhY2t1cFB1Yik7XG4gICAgICBjb25zdCBpc0JpdGdvS2V5U2lnbmF0dXJlVmFsaWQgPSB2ZXJpZnkoa2V5Y2hhaW5zLmJpdGdvLCBrZXlTaWduYXR1cmVzLmJpdGdvUHViKTtcbiAgICAgIGlmICghaXNCYWNrdXBLZXlTaWduYXR1cmVWYWxpZCB8fCAhaXNCaXRnb0tleVNpZ25hdHVyZVZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2Vjb25kYXJ5IHB1YmxpYyBrZXkgc2lnbmF0dXJlcyBpbnZhbGlkJyk7XG4gICAgICB9XG4gICAgICBkZWJ1Zygnc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkIGJhY2t1cCBhbmQgYml0Z28ga2V5IHNpZ25hdHVyZXMnKTtcbiAgICB9IGVsc2UgaWYgKCFkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgLy8gdGhlc2Uga2V5cyB3ZXJlIG9idGFpbmVkIG9ubGluZSBhbmQgdGhlaXIgc2lnbmF0dXJlcyB3ZXJlIG5vdCB2ZXJpZmllZFxuICAgICAgLy8gdGhpcyBjb3VsZCBiZSBkYW5nZXJvdXNcbiAgICAgIGNvbnNvbGUubG9nKCd1bnNpZ25lZCBrZXlzIG9idGFpbmVkIG9ubGluZSBhcmUgYmVpbmcgdXNlZCBmb3IgYWRkcmVzcyB2ZXJpZmljYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkVHJhbnNhY3Rpb24ubmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24pIHtcbiAgICAgIGlmICgha2V5Y2hhaW5zLnVzZXIgfHwgIXVzZXJQdWJsaWNLZXlWZXJpZmllZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zYWN0aW9uIHJlcXVpcmVzIHZlcmlmaWNhdGlvbiBvZiB1c2VyIHB1YmxpYyBrZXksIGJ1dCBpdCB3YXMgdW5hYmxlIHRvIGJlIHZlcmlmaWVkJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzVmVyaWZpZWQgPSB0aGlzLnZlcmlmeUN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMocGFyc2VkVHJhbnNhY3Rpb24sIGtleWNoYWlucy51c2VyKTtcbiAgICAgIGlmICghY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlc1ZlcmlmaWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAndHJhbnNhY3Rpb24gcmVxdWlyZXMgdmVyaWZpY2F0aW9uIG9mIGN1c3RvbSBjaGFuZ2Uga2V5IHNpZ25hdHVyZXMsIGJ1dCB0aGV5IHdlcmUgdW5hYmxlIHRvIGJlIHZlcmlmaWVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVidWcoJ3N1Y2Nlc3NmdWxseSB2ZXJpZmllZCB1c2VyIHB1YmxpYyBrZXkgYW5kIGN1c3RvbSBjaGFuZ2Uga2V5IHNpZ25hdHVyZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9IHBhcnNlZFRyYW5zYWN0aW9uLm1pc3NpbmdPdXRwdXRzO1xuICAgIGlmIChtaXNzaW5nT3V0cHV0cy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHRoZXJlIGFyZSBzb21lIG91dHB1dHMgaW4gdGhlIHJlY2lwaWVudHMgbGlzdCB0aGF0IGhhdmUgbm90IG1hZGUgaXQgaW50byB0aGUgYWN0dWFsIHRyYW5zYWN0aW9uXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIG91dHB1dHMgbWlzc2luZyBpbiB0cmFuc2FjdGlvbiBwcmVidWlsZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVuZGVkRXh0ZXJuYWxTcGVuZCA9IHBhcnNlZFRyYW5zYWN0aW9uLmV4cGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudDtcblxuICAgIC8vIHRoaXMgaXMgYSBsaW1pdCB3ZSBpbXBvc2UgZm9yIHRoZSB0b3RhbCB2YWx1ZSB0aGF0IGlzIGFtZW5kZWQgdG8gdGhlIHRyYW5zYWN0aW9uIGJleW9uZCB3aGF0IHdhcyBvcmlnaW5hbGx5IGludGVuZGVkXG4gICAgY29uc3QgcGF5QXNZb3VHb0xpbWl0ID0gbmV3IEJpZ051bWJlcih0aGlzLmdldFBheUdvTGltaXQodmVyaWZpY2F0aW9uLmFsbG93UGF5Z29PdXRwdXQpKS5tdWx0aXBsaWVkQnkoXG4gICAgICBpbnRlbmRlZEV4dGVybmFsU3BlbmQudG9TdHJpbmcoKVxuICAgICk7XG5cbiAgICAvKlxuICAgIFNvbWUgZXhwbGFuYXRpb24gZm9yIHdoeSB3ZSdyZSBkb2luZyB3aGF0IHdlJ3JlIGRvaW5nOlxuICAgIFNvbWUgY3VzdG9tZXJzIHdpbGwgaGF2ZSBhbiBvdXRwdXQgdG8gQml0R28ncyBQQVlHbyB3YWxsZXQgYWRkZWQgdG8gdGhlaXIgdHJhbnNhY3Rpb24sIGFuZCB3ZSBuZWVkIHRvIGFjY291bnQgZm9yXG4gICAgaXQgaGVyZS4gVG8gcHJvdGVjdCBzb21lb25lIHRhbXBlcmluZyB3aXRoIHRoZSBvdXRwdXQgdG8gbWFrZSBpdCBzZW5kIG1vcmUgdGhhbiBpdCBzaG91bGQgdG8gQml0R28sIHdlIGRlZmluZSBhXG4gICAgdGhyZXNob2xkIGZvciB0aGUgb3V0cHV0J3MgdmFsdWUgYWJvdmUgd2hpY2ggd2UnbGwgdGhyb3cgYW4gZXJyb3IsIGJlY2F1c2UgdGhlIHBheWdvIG91dHB1dCBzaG91bGQgbmV2ZXIgYmUgdGhhdFxuICAgIGhpZ2guXG4gICAgICovXG5cbiAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGV4dHJhIGFkZHJlc3NlcyBhcmUgY2hhbmdlIGFkZHJlc3Nlc1xuICAgIC8vIGdldCBhbGwgdGhlIGFkZGl0aW9uYWwgZXh0ZXJuYWwgb3V0cHV0cyB0aGUgc2VydmVyIGFkZGVkIGFuZCBjYWxjdWxhdGUgdGhlaXIgdmFsdWVzXG4gICAgY29uc3Qgbm9uQ2hhbmdlQW1vdW50ID0gbmV3IEJpZ051bWJlcihwYXJzZWRUcmFuc2FjdGlvbi5pbXBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQudG9TdHJpbmcoKSk7XG5cbiAgICBkZWJ1ZyhcbiAgICAgICdJbnRlbmRlZCBzcGVuZCBpcyAlcywgTm9uLWNoYW5nZSBhbW91bnQgaXMgJXMsIHBheWdvIGxpbWl0IGlzICVzJyxcbiAgICAgIGludGVuZGVkRXh0ZXJuYWxTcGVuZC50b1N0cmluZygpLFxuICAgICAgbm9uQ2hhbmdlQW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBwYXlBc1lvdUdvTGltaXQudG9TdHJpbmcoKVxuICAgICk7XG5cbiAgICAvLyB0aGUgYWRkaXRpb25hbCBleHRlcm5hbCBvdXRwdXRzIGNhbiBvbmx5IGJlIEJpdEdvJ3MgcGF5LWFzLXlvdS1nbyBmZWUsIGJ1dCB3ZSBjYW5ub3QgdmVyaWZ5IHRoZSB3YWxsZXQgYWRkcmVzc1xuICAgIGlmIChub25DaGFuZ2VBbW91bnQuZ3QocGF5QXNZb3VHb0xpbWl0KSkge1xuICAgICAgLy8gdGhlcmUgYXJlIHNvbWUgYWRkcmVzc2VzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHNjb3BlIG9mIGludGVuZGVkIHJlY2lwaWVudHMgdGhhdCBhcmUgbm90IGNoYW5nZSBhZGRyZXNzZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJlYnVpbGQgYXR0ZW1wdHMgdG8gc3BlbmQgdG8gdW5pbnRlbmRlZCBleHRlcm5hbCByZWNpcGllbnRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsT3V0cHV0cyA9IHBhcnNlZFRyYW5zYWN0aW9uLm91dHB1dHM7XG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHR4UHJlYnVpbGQudHhIZXggbm90IHNldGApO1xuICAgIH1cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KHR4UHJlYnVpbGQudHhIZXgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uQ2FjaGUgPSB7fTtcbiAgICBjb25zdCBpbnB1dHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRyYW5zYWN0aW9uLmlucy5tYXAoYXN5bmMgKGN1cnJlbnRJbnB1dCkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbklkID0gKEJ1ZmZlci5mcm9tKGN1cnJlbnRJbnB1dC5oYXNoKS5yZXZlcnNlKCkgYXMgQnVmZmVyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgIGNvbnN0IHR4SGV4ID0gdHhQcmVidWlsZC50eEluZm8/LnR4SGV4ZXM/Llt0cmFuc2FjdGlvbklkXTtcbiAgICAgICAgaWYgKHR4SGV4KSB7XG4gICAgICAgICAgY29uc3QgbG9jYWxUeCA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KHR4SGV4KTtcbiAgICAgICAgICBpZiAobG9jYWxUeC5nZXRJZCgpICE9PSB0cmFuc2FjdGlvbklkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0IHRyYW5zYWN0aW9uIGhleCBkb2VzIG5vdCBtYXRjaCBpZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjdXJyZW50T3V0cHV0ID0gbG9jYWxUeC5vdXRzW2N1cnJlbnRJbnB1dC5pbmRleF07XG4gICAgICAgICAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KGN1cnJlbnRPdXRwdXQuc2NyaXB0LCB0aGlzLm5ldHdvcmspO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGN1cnJlbnRPdXRwdXQudmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVN0cmluZzogY3VycmVudE91dHB1dC52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRyYW5zYWN0aW9uQ2FjaGVbdHJhbnNhY3Rpb25JZF0pIHtcbiAgICAgICAgICBpZiAoZGlzYWJsZU5ldHdvcmtpbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0ZW1wdGluZyB0byByZXRyaWV2ZSB0cmFuc2FjdGlvbiBkZXRhaWxzIGV4dGVybmFsbHkgd2l0aCBuZXR3b3JraW5nIGRpc2FibGVkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXFJZCkge1xuICAgICAgICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJhbnNhY3Rpb25DYWNoZVt0cmFuc2FjdGlvbklkXSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKGAvcHVibGljL3R4LyR7dHJhbnNhY3Rpb25JZH1gKSkucmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb25EZXRhaWxzID0gdHJhbnNhY3Rpb25DYWNoZVt0cmFuc2FjdGlvbklkXTtcbiAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uRGV0YWlscy5vdXRwdXRzW2N1cnJlbnRJbnB1dC5pbmRleF07XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBjb2lucyAoZG9nZSkgdGhhdCBjYW4gZXhjZWVkIG51bWJlciBsaW1pdHMgKGFuZCB0aHVzIHdpbGwgdXNlIGJpZ2ludCkgd2lsbCBoYXZlIHRoZSBgdmFsdWVTdHJpbmdgIGZpZWxkXG4gICAgY29uc3QgaW5wdXRBbW91bnQgPSBpbnB1dHMucmVkdWNlKFxuICAgICAgKHN1bTogYmlnaW50LCBpKSA9PiBzdW0gKyBCaWdJbnQodGhpcy5hbW91bnRUeXBlID09PSAnYmlnaW50JyA/IGkudmFsdWVTdHJpbmcgOiBpLnZhbHVlKSxcbiAgICAgIEJpZ0ludCgwKVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gYWxsT3V0cHV0cy5yZWR1Y2UoKHN1bTogYmlnaW50LCBvOiBPdXRwdXQpID0+IHN1bSArIEJpZ0ludChvLmFtb3VudCksIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgZmVlID0gaW5wdXRBbW91bnQgLSBvdXRwdXRBbW91bnQ7XG5cbiAgICBpZiAoZmVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYXR0ZW1wdGluZyB0byBzcGVuZCAke291dHB1dEFtb3VudH0gc2F0b3NoaXMsIHdoaWNoIGV4Y2VlZHMgdGhlIGlucHV0IGFtb3VudCAoJHtpbnB1dEFtb3VudH0gc2F0b3NoaXMpIGJ5ICR7LWZlZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2Ugc3VyZSBhbiBhZGRyZXNzIGlzIHZhbGlkIGFuZCB0aHJvdyBhbiBlcnJvciBpZiBpdCdzIG5vdC5cbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIFRoZSBhZGRyZXNzIHN0cmluZyBvbiB0aGUgbmV0d29ya1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3NUeXBlXG4gICAqIEBwYXJhbSBwYXJhbXMua2V5Y2hhaW5zIEtleWNoYWluIG9iamVjdHMgd2l0aCB4cHVic1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvaW5TcGVjaWZpYyBDb2luLXNwZWNpZmljIGRldGFpbHMgZm9yIHRoZSBhZGRyZXNzIHN1Y2ggYXMgYSB3aXRuZXNzIHNjcmlwdFxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYWluIERlcml2YXRpb24gY2hhaW5cbiAgICogQHBhcmFtIHBhcmFtcy5pbmRleCBEZXJpdmF0aW9uIGluZGV4XG4gICAqIEB0aHJvd3Mge0ludmFsaWRBZGRyZXNzRXJyb3J9XG4gICAqIEB0aHJvd3Mge0ludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3J9XG4gICAqIEB0aHJvd3Mge1VuZXhwZWN0ZWRBZGRyZXNzRXJyb3J9XG4gICAqL1xuICBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgYWRkcmVzcywgYWRkcmVzc1R5cGUsIGtleWNoYWlucywgY29pblNwZWNpZmljLCBjaGFpbiwgaW5kZXggfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICgoXy5pc1VuZGVmaW5lZChjaGFpbikgJiYgXy5pc1VuZGVmaW5lZChpbmRleCkpIHx8ICEoXy5pc0Zpbml0ZShjaGFpbikgJiYgXy5pc0Zpbml0ZShpbmRleCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvcihcbiAgICAgICAgYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBpbnZhbGlkIGNoYWluICgke2NoYWlufSkgb3IgaW5kZXggKCR7aW5kZXh9KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzT2JqZWN0KGNvaW5TcGVjaWZpYykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc1ZlcmlmaWNhdGlvbk9iamVjdFByb3BlcnR5RXJyb3IoXG4gICAgICAgICdhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogY29pblNwZWNpZmljIGZpZWxkIG11c3QgYmUgYW4gb2JqZWN0J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGtleWNoYWlucycpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IHRoaXMuZ2VuZXJhdGVBZGRyZXNzKHtcbiAgICAgIGFkZHJlc3NUeXBlOiBhZGRyZXNzVHlwZSBhcyBTY3JpcHRUeXBlMk9mMyxcbiAgICAgIGtleWNoYWlucyxcbiAgICAgIHRocmVzaG9sZDogMixcbiAgICAgIGNoYWluLFxuICAgICAgaW5kZXgsXG4gICAgfSk7XG5cbiAgICBpZiAoZXhwZWN0ZWRBZGRyZXNzLmFkZHJlc3MgIT09IGFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKFxuICAgICAgICBgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IGV4cGVjdGVkICR7ZXhwZWN0ZWRBZGRyZXNzLmFkZHJlc3N9IGJ1dCBnb3QgJHthZGRyZXNzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgY29pbiBzdXBwb3J0cyBhIGJsb2NrIHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN1cHBvcnRzQmxvY2tUYXJnZXQoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGFkZHJlc3NUeXBlXG4gICAqIEByZXR1cm5zIHRydWUgaWZmIGNvaW4gc3VwcG9ydHMgc3BlbmRpbmcgZnJvbSB1bnNwZW50VHlwZVxuICAgKi9cbiAgc3VwcG9ydHNBZGRyZXNzVHlwZShhZGRyZXNzVHlwZTogU2NyaXB0VHlwZTJPZjMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmlzU3VwcG9ydGVkU2NyaXB0VHlwZSh0aGlzLm5ldHdvcmssIGFkZHJlc3NUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHJldHVybiB0cnVlIGlmZiBjb2luIHN1cHBvcnRzIHNwZW5kaW5nIGZyb20gY2hhaW5cbiAgICovXG4gIHN1cHBvcnRzQWRkcmVzc0NoYWluKGNoYWluOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNDaGFpbkNvZGUoY2hhaW4pICYmIHRoaXMuc3VwcG9ydHNBZGRyZXNzVHlwZSh1dHhvbGliLmJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbikpO1xuICB9XG5cbiAga2V5SWRzRm9yU2lnbmluZygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFtLZXlJbmRpY2VzLlVTRVIsIEtleUluZGljZXMuQkFDS1VQLCBLZXlJbmRpY2VzLkJJVEdPXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUT0RPKEJHLTExNDg3KTogUmVtb3ZlIGFkZHJlc3NUeXBlLCBzZWd3aXQsIGFuZCBiZWNoMzIgcGFyYW1zIGluIFNES3Y2XG4gICAqIEdlbmVyYXRlIGFuIGFkZHJlc3MgZm9yIGEgd2FsbGV0IGJhc2VkIG9uIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb25zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzc1R5cGUge3N0cmluZ30gICBEZXByZWNhdGVkXG4gICAqIEBwYXJhbSBwYXJhbXMua2V5Y2hhaW5zICAge1tvYmplY3RdfSBBcnJheSBvZiBvYmplY3RzIHdpdGggeHB1YnNcbiAgICogQHBhcmFtIHBhcmFtcy50aHJlc2hvbGQgICB7bnVtYmVyfSAgIE1pbmltdW0gbnVtYmVyIG9mIHNpZ25hdHVyZXNcbiAgICogQHBhcmFtIHBhcmFtcy5jaGFpbiAgICAgICB7bnVtYmVyfSAgIERlcml2YXRpb24gY2hhaW4gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vQml0R28vdW5zcGVudHMvYmxvYi9tYXN0ZXIvc3JjL2NvZGVzLnRzIGZvclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBhZGRyZXNzIHR5cGUgb2YgYSBnaXZlbiBjaGFpbiBjb2RlKVxuICAgKiBAcGFyYW0gcGFyYW1zLmluZGV4ICAgICAgIHtudW1iZXJ9ICAgRGVyaXZhdGlvbiBpbmRleFxuICAgKiBAcGFyYW0gcGFyYW1zLnNlZ3dpdCAgICAgIHtib29sZWFufSAgRGVwcmVjYXRlZFxuICAgKiBAcGFyYW0gcGFyYW1zLmJlY2gzMiAgICAgIHtib29sZWFufSAgRGVwcmVjYXRlZFxuICAgKiBAcmV0dXJucyB7e2NoYWluOiBudW1iZXIsIGluZGV4OiBudW1iZXIsIGNvaW46IG51bWJlciwgY29pblNwZWNpZmljOiB7b3V0cHV0U2NyaXB0LCByZWRlZW1TY3JpcHR9fX1cbiAgICovXG4gIGdlbmVyYXRlQWRkcmVzcyhwYXJhbXM6IEdlbmVyYXRlQWRkcmVzc09wdGlvbnMpOiBBZGRyZXNzRGV0YWlscyB7XG4gICAgY29uc3QgeyBrZXljaGFpbnMsIHRocmVzaG9sZCwgY2hhaW4sIGluZGV4LCBzZWd3aXQgPSBmYWxzZSwgYmVjaDMyID0gZmFsc2UgfSA9IHBhcmFtcztcbiAgICBsZXQgZGVyaXZhdGlvbkNoYWluID0gZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoJ3Ayc2gnKTtcbiAgICBpZiAoXy5pc051bWJlcihjaGFpbikgJiYgXy5pc0ludGVnZXIoY2hhaW4pICYmIGlzQ2hhaW5Db2RlKGNoYWluKSkge1xuICAgICAgZGVyaXZhdGlvbkNoYWluID0gY2hhaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29udmVydEZsYWdzVG9BZGRyZXNzVHlwZSgpOiBTY3JpcHRUeXBlMk9mMyB7XG4gICAgICBpZiAoaXNDaGFpbkNvZGUoY2hhaW4pKSB7XG4gICAgICAgIHJldHVybiB1dHhvbGliLmJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbik7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0Jvb2xlYW4oc2Vnd2l0KSAmJiBzZWd3aXQpIHtcbiAgICAgICAgcmV0dXJuICdwMnNoUDJ3c2gnO1xuICAgICAgfSBlbHNlIGlmIChfLmlzQm9vbGVhbihiZWNoMzIpICYmIGJlY2gzMikge1xuICAgICAgICByZXR1cm4gJ3Ayd3NoJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAncDJzaCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWRkcmVzc1R5cGUgPSBwYXJhbXMuYWRkcmVzc1R5cGUgfHwgY29udmVydEZsYWdzVG9BZGRyZXNzVHlwZSgpO1xuXG4gICAgaWYgKGFkZHJlc3NUeXBlICE9PSB1dHhvbGliLmJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihkZXJpdmF0aW9uQ2hhaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgQWRkcmVzc1R5cGVDaGFpbk1pc21hdGNoRXJyb3IoYWRkcmVzc1R5cGUsIGRlcml2YXRpb25DaGFpbik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN1cHBvcnRzQWRkcmVzc1R5cGUoYWRkcmVzc1R5cGUpKSB7XG4gICAgICBzd2l0Y2ggKGFkZHJlc3NUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3Ayc2gnOlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW50ZXJuYWwgZXJyb3I6IHAyc2ggc2hvdWxkIGFsd2F5cyBiZSBzdXBwb3J0ZWRgKTtcbiAgICAgICAgY2FzZSAncDJzaFAyd3NoJzpcbiAgICAgICAgICB0aHJvdyBuZXcgUDJzaFAyd3NoVW5zdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICBjYXNlICdwMndzaCc6XG4gICAgICAgICAgdGhyb3cgbmV3IFAyd3NoVW5zdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICBjYXNlICdwMnRyJzpcbiAgICAgICAgICB0aHJvdyBuZXcgUDJ0clVuc3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBZGRyZXNzVHlwZUVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHNpZ25hdHVyZVRocmVzaG9sZCA9IDI7XG4gICAgaWYgKF8uaXNJbnRlZ2VyKHRocmVzaG9sZCkpIHtcbiAgICAgIHNpZ25hdHVyZVRocmVzaG9sZCA9IHRocmVzaG9sZCBhcyBudW1iZXI7XG4gICAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkIDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgaGFzIHRvIGJlIHBvc2l0aXZlJyk7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmF0dXJlVGhyZXNob2xkID4ga2V5Y2hhaW5zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RocmVzaG9sZCBjYW5ub3QgZXhjZWVkIG51bWJlciBvZiBrZXlzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRlcml2YXRpb25JbmRleCA9IDA7XG4gICAgaWYgKF8uaXNJbnRlZ2VyKGluZGV4KSAmJiAoaW5kZXggYXMgbnVtYmVyKSA+IDApIHtcbiAgICAgIGRlcml2YXRpb25JbmRleCA9IGluZGV4IGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gJzAvMC8nICsgZGVyaXZhdGlvbkNoYWluICsgJy8nICsgZGVyaXZhdGlvbkluZGV4O1xuICAgIGNvbnN0IGhkTm9kZXMgPSBrZXljaGFpbnMubWFwKCh7IHB1YiB9KSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpO1xuICAgIGNvbnN0IGRlcml2ZWRLZXlzID0gaGROb2Rlcy5tYXAoKGhkTm9kZSkgPT4gaGROb2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHBhdGgpKS5wdWJsaWNLZXkpO1xuXG4gICAgY29uc3QgeyBvdXRwdXRTY3JpcHQsIHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCwgYWRkcmVzcyB9ID0gdGhpcy5jcmVhdGVNdWx0aVNpZ0FkZHJlc3MoXG4gICAgICBhZGRyZXNzVHlwZSxcbiAgICAgIHNpZ25hdHVyZVRocmVzaG9sZCxcbiAgICAgIGRlcml2ZWRLZXlzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZGRyZXNzLFxuICAgICAgY2hhaW46IGRlcml2YXRpb25DaGFpbixcbiAgICAgIGluZGV4OiBkZXJpdmF0aW9uSW5kZXgsXG4gICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgb3V0cHV0U2NyaXB0OiBvdXRwdXRTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICByZWRlZW1TY3JpcHQ6IHJlZGVlbVNjcmlwdCAmJiByZWRlZW1TY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB3aXRuZXNzU2NyaXB0OiB3aXRuZXNzU2NyaXB0ICYmIHdpdG5lc3NTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIGFkZHJlc3NUeXBlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIC0ge0BzZWUgU2lnblRyYW5zYWN0aW9uT3B0aW9uc31cbiAgICogQHJldHVybnMge1Byb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPn1cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eFByZWJ1aWxkID0gcGFyYW1zLnR4UHJlYnVpbGQ7XG4gICAgY29uc3QgdXNlclBydiA9IHBhcmFtcy5wcnY7XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkKSB8fCAhXy5pc09iamVjdCh0eFByZWJ1aWxkKSkge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpICYmICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhQcmVidWlsZH1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KHR4UHJlYnVpbGQudHhIZXgpO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uLmlucy5sZW5ndGggIT09IHR4UHJlYnVpbGQudHhJbmZvLnVuc3BlbnRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsZW5ndGggb2YgdW5zcGVudHMgYXJyYXkgc2hvdWxkIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb24gaW5wdXRzJyk7XG4gICAgfVxuXG4gICAgbGV0IGlzTGFzdFNpZ25hdHVyZSA9IGZhbHNlO1xuICAgIGlmIChfLmlzQm9vbGVhbihwYXJhbXMuaXNMYXN0U2lnbmF0dXJlKSkge1xuICAgICAgLy8gaWYgYnVpbGQgaXMgY2FsbGVkIGluc3RlYWQgb2YgYnVpbGRJbmNvbXBsZXRlLCBubyBzaWduYXR1cmUgcGxhY2Vob2xkZXJzIGFyZSBsZWZ0IGluIHRoZSBzaWcgc2NyaXB0XG4gICAgICBpc0xhc3RTaWduYXR1cmUgPSBwYXJhbXMuaXNMYXN0U2lnbmF0dXJlO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHVzZXJQcnYpIHx8ICFfLmlzU3RyaW5nKHVzZXJQcnYpKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodXNlclBydikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcnYgbXVzdCBiZSBhIHN0cmluZywgZ290IHR5cGUgJHt0eXBlb2YgdXNlclBydn1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwcnYgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wdWJzIHx8IHBhcmFtcy5wdWJzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgeHB1YiBhcnJheWApO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lcktleWNoYWluID0gYmlwMzIuZnJvbUJhc2U1OCh1c2VyUHJ2LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgIGlmIChzaWduZXJLZXljaGFpbi5pc05ldXRlcmVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgdXNlciBwcml2YXRlIGtleSBidXQgcmVjZWl2ZWQgcHVibGljIGtleScpO1xuICAgIH1cbiAgICBkZWJ1ZyhgSGVyZSBpcyB0aGUgcHVibGljIGtleSBvZiB0aGUgeHBydiB5b3UgdXNlZCB0byBzaWduOiAke3NpZ25lcktleWNoYWluLm5ldXRlcmVkKCkudG9CYXNlNTgoKX1gKTtcblxuICAgIGNvbnN0IGNvc2lnbmVyUHViID0gcGFyYW1zLmNvc2lnbmVyUHViID8/IHBhcmFtcy5wdWJzWzJdO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHBhcmFtcy5wdWJzLm1hcCgocHViKSA9PiBiaXAzMi5mcm9tQmFzZTU4KHB1YikpIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT47XG4gICAgY29uc3QgY29zaWduZXJLZXljaGFpbiA9IGJpcDMyLmZyb21CYXNlNTgoY29zaWduZXJQdWIpO1xuXG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduQW5kVmVyaWZ5V2FsbGV0VHJhbnNhY3Rpb24oXG4gICAgICB0cmFuc2FjdGlvbixcbiAgICAgIHR4UHJlYnVpbGQudHhJbmZvLnVuc3BlbnRzLFxuICAgICAgbmV3IGJpdGdvLldhbGxldFVuc3BlbnRTaWduZXI8Um9vdFdhbGxldEtleXM+KGtleWNoYWlucywgc2lnbmVyS2V5Y2hhaW4sIGNvc2lnbmVyS2V5Y2hhaW4pLFxuICAgICAgeyBpc0xhc3RTaWduYXR1cmUgfVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHhIZXg6IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnVmZmVyKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHVuc3BlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0JpdEdvVGFpbnRlZFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4odW5zcGVudDogVW5zcGVudDxUTnVtYmVyPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1JlcGxheVByb3RlY3Rpb25VbnNwZW50PFROdW1iZXI+KHVuc3BlbnQsIHRoaXMubmV0d29yayk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgdXR4b2xpYi5iaXRnby5nZXREZWZhdWx0U2lnSGFzaChuZXR3b3JrKSBpbnN0ZWFkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZGVmYXVsdFNpZ0hhc2hUeXBlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uZ2V0RGVmYXVsdFNpZ0hhc2godGhpcy5uZXR3b3JrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSB1dHhvbGliLmJpdGNvaW4udmVyaWZ5U2lnbmF0dXJlKCkgaW5zdGVhZFxuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlKFxuICAgIHRyYW5zYWN0aW9uOiBhbnksXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGFtb3VudDogbnVtYmVyLFxuICAgIHZlcmlmaWNhdGlvblNldHRpbmdzOiB7XG4gICAgICBzaWduYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICAgIHB1YmxpY0tleT86IHN0cmluZztcbiAgICB9ID0ge31cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHRyYW5zYWN0aW9uLm5ldHdvcmsgIT09IHRoaXMubmV0d29yaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBuZXR3b3JrIG1pc21hdGNoYCk7XG4gICAgfVxuICAgIHJldHVybiB1dHhvbGliLmJpdGdvLnZlcmlmeVNpZ25hdHVyZSh0cmFuc2FjdGlvbiwgaW5wdXRJbmRleCwgYW1vdW50LCB7XG4gICAgICBzaWduYXR1cmVJbmRleDogdmVyaWZpY2F0aW9uU2V0dGluZ3Muc2lnbmF0dXJlSW5kZXgsXG4gICAgICBwdWJsaWNLZXk6IHZlcmlmaWNhdGlvblNldHRpbmdzLnB1YmxpY0tleSA/IEJ1ZmZlci5mcm9tKHZlcmlmaWNhdGlvblNldHRpbmdzLnB1YmxpY0tleSwgJ2hleCcpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29tcG9zZSBhIHJhdyB0cmFuc2FjdGlvbiBpbnRvIHVzZWZ1bCBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdG90YWwgYW1vdW50cyxcbiAgICogY2hhbmdlIGFtb3VudHMsIGFuZCB0cmFuc2FjdGlvbiBvdXRwdXRzLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gXy5nZXQocGFyYW1zLCAndHhIZXgnKTtcbiAgICBpZiAoIXR4SGV4IHx8ICFfLmlzU3RyaW5nKHR4SGV4KSB8fCAhdHhIZXgubWF0Y2goL14oW2EtZjAtOV17Mn0pKyQvaSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0cmFuc2FjdGlvbiBoZXgsIG11c3QgYmUgYSB2YWxpZCBoZXggc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgbGV0IHRyYW5zYWN0aW9uO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHR4SGV4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBwYXJzZSB0cmFuc2FjdGlvbiBoZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHRyYW5zYWN0aW9uLmdldElkKCk7XG4gICAgbGV0IHNwZW5kQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oMCwgdGhpcy5hbW91bnRUeXBlKTtcbiAgICBsZXQgY2hhbmdlQW1vdW50ID0gdXR4b2xpYi5iaXRnby50b1ROdW1iZXI8VE51bWJlcj4oMCwgdGhpcy5hbW91bnRUeXBlKTtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IHtcbiAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cyddLFxuICAgICAgaWQ6IGlkLFxuICAgICAgb3V0cHV0czogW10gYXMgT3V0cHV0W10sXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSBhcyBPdXRwdXRbXSxcbiAgICB9IGFzIFRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG5cbiAgICBjb25zdCB7IGNoYW5nZUFkZHJlc3NlcyA9IFtdLCB1bnNwZW50cyA9IFtdIH0gPSBwYXJhbXMudHhJbmZvID8/IHt9O1xuXG4gICAgdHJhbnNhY3Rpb24ub3V0cy5mb3JFYWNoKChjdXJyZW50T3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50QWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KGN1cnJlbnRPdXRwdXQuc2NyaXB0LCB0aGlzLm5ldHdvcmspO1xuICAgICAgY29uc3QgY3VycmVudEFtb3VudCA9IGN1cnJlbnRPdXRwdXQudmFsdWU7XG5cbiAgICAgIGlmIChjaGFuZ2VBZGRyZXNzZXMuaW5jbHVkZXMoY3VycmVudEFkZHJlc3MpKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgY2hhbmdlXG4gICAgICAgIGNoYW5nZUFtb3VudCArPSBjdXJyZW50QW1vdW50O1xuICAgICAgICBleHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzLnB1c2goe1xuICAgICAgICAgIGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogY3VycmVudEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzcGVuZEFtb3VudCArPSBjdXJyZW50QW1vdW50O1xuICAgICAgZXhwbGFuYXRpb24ub3V0cHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogY3VycmVudEFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50ID0gc3BlbmRBbW91bnQudG9TdHJpbmcoKTtcbiAgICBleHBsYW5hdGlvbi5jaGFuZ2VBbW91bnQgPSBjaGFuZ2VBbW91bnQudG9TdHJpbmcoKTtcblxuICAgIC8vIGFkZCBmZWUgaW5mbyBpZiBhdmFpbGFibGVcbiAgICBpZiAocGFyYW1zLmZlZUluZm8pIHtcbiAgICAgIGV4cGxhbmF0aW9uLmRpc3BsYXlPcmRlci5wdXNoKCdmZWUnKTtcbiAgICAgIGV4cGxhbmF0aW9uLmZlZSA9IHBhcmFtcy5mZWVJbmZvO1xuICAgIH1cblxuICAgIGlmIChfLmlzSW50ZWdlcih0cmFuc2FjdGlvbi5sb2NrdGltZSkgJiYgdHJhbnNhY3Rpb24ubG9ja3RpbWUgPiAwKSB7XG4gICAgICBleHBsYW5hdGlvbi5sb2NrdGltZSA9IHRyYW5zYWN0aW9uLmxvY2t0aW1lO1xuICAgICAgZXhwbGFuYXRpb24uZGlzcGxheU9yZGVyLnB1c2goJ2xvY2t0aW1lJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldk91dHB1dHMgPSBwYXJhbXMudHhJbmZvPy51bnNwZW50cy5tYXAoKHUpID0+IHRvT3V0cHV0PFROdW1iZXI+KHUsIHRoaXMubmV0d29yaykpO1xuXG4gICAgLy8gaWYga2V5cyBhcmUgcHJvdmlkZWQsIHByZXBhcmUgdGhlIGtleXMgZm9yIGlucHV0IHNpZ25hdHVyZSBjaGVja2luZ1xuICAgIGNvbnN0IGtleXMgPSBwYXJhbXMucHVicz8ubWFwKCh4cHViKSA9PiBiaXAzMi5mcm9tQmFzZTU4KHhwdWIpKTtcbiAgICBjb25zdCB3YWxsZXRLZXlzID0ga2V5cyAmJiBrZXlzLmxlbmd0aCA9PT0gMyA/IG5ldyBiaXRnby5Sb290V2FsbGV0S2V5cyhrZXlzIGFzIFRyaXBsZTxCSVAzMkludGVyZmFjZT4pIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gZ2V0IHRoZSBudW1iZXIgb2Ygc2lnbmF0dXJlcyBwZXIgaW5wdXRcbiAgICBjb25zdCBpbnB1dFNpZ25hdHVyZUNvdW50cyA9IHRyYW5zYWN0aW9uLmlucy5tYXAoKGlucHV0LCBpZHgpOiBudW1iZXIgPT4ge1xuICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCAhPT0gdHJhbnNhY3Rpb24uaW5zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcmV2T3V0cHV0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc3RhdGVgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF3YWxsZXRLZXlzKSB7XG4gICAgICAgIC8vIG5vIHB1YiBrZXlzIG9yIGluY29ycmVjdCBudW1iZXIgb2YgcHViIGtleXNcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB2ZXJpZnlTaWduYXR1cmVXaXRoVW5zcGVudDxUTnVtYmVyPih0cmFuc2FjdGlvbiwgaWR4LCB1bnNwZW50cywgd2FsbGV0S2V5cykuZmlsdGVyKCh2KSA9PiB2KS5sZW5ndGg7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHNvbWUgb3RoZXIgZXJyb3Igb2NjdXJyZWQgYW5kIHdlIGNhbid0IHZhbGlkYXRlIHRoZSBzaWduYXR1cmVzXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXhwbGFuYXRpb24uaW5wdXRTaWduYXR1cmVzID0gaW5wdXRTaWduYXR1cmVDb3VudHM7XG4gICAgZXhwbGFuYXRpb24uc2lnbmF0dXJlcyA9IF8ubWF4KGlucHV0U2lnbmF0dXJlQ291bnRzKSBhcyBudW1iZXI7XG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG11bHRpc2lnIGFkZHJlc3Mgb2YgYSBnaXZlbiB0eXBlIGZyb20gYSBsaXN0IG9mIGtleWNoYWlucyBhbmQgYSBzaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0gYWRkcmVzc1R5cGVcbiAgICogQHBhcmFtIHNpZ25hdHVyZVRocmVzaG9sZFxuICAgKiBAcGFyYW0ga2V5c1xuICAgKi9cbiAgY3JlYXRlTXVsdGlTaWdBZGRyZXNzKGFkZHJlc3NUeXBlOiBTY3JpcHRUeXBlMk9mMywgc2lnbmF0dXJlVGhyZXNob2xkOiBudW1iZXIsIGtleXM6IEJ1ZmZlcltdKTogTXVsdGlTaWdBZGRyZXNzIHtcbiAgICBjb25zdCB7XG4gICAgICBzY3JpcHRQdWJLZXk6IG91dHB1dFNjcmlwdCxcbiAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgfSA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGtleXMsIGFkZHJlc3NUeXBlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvdXRwdXRTY3JpcHQsXG4gICAgICByZWRlZW1TY3JpcHQsXG4gICAgICB3aXRuZXNzU2NyaXB0LFxuICAgICAgYWRkcmVzczogdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQob3V0cHV0U2NyaXB0LCB0aGlzLm5ldHdvcmspLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2Uge0BzZWUgYmFja3VwS2V5UmVjb3Zlcnl9XG4gICAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAgICogQHBhcmFtIHBhcmFtcyAtIHtAc2VlIGJhY2t1cEtleVJlY292ZXJ5fVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlcihwYXJhbXM6IFJlY292ZXJQYXJhbXMpOiBSZXR1cm5UeXBlPHR5cGVvZiBiYWNrdXBLZXlSZWNvdmVyeT4ge1xuICAgIHJldHVybiBiYWNrdXBLZXlSZWNvdmVyeSh0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgY29pbiB0aGF0IHdhcyBzZW50IHRvIHdyb25nIGNoYWluXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eGlkIFRoZSB0eGlkIG9mIHRoZSBmYXVsdHkgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MgYWRkcmVzcyB0byBzZW5kIHJlY292ZXJlZCBmdW5kcyB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldCB0aGUgd2FsbGV0IHRoYXQgcmVjZWl2ZWQgdGhlIGZ1bmRzXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjb3ZlcnlDb2luIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCB0aGF0IHJlY2VpdmVkIHRoZSBmdW5kc1xuICAgKiBAcGFyYW0gcGFyYW1zLnNpZ25lZCByZXR1cm4gYSBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiAoZGVmYXVsdD10cnVlKVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMueHBydiB0aGUgdW5lbmNyeXB0ZWQgeHBydiAodXNlZCBpbnN0ZWFkIG9mIHdhbGxldCBwYXNzcGhyYXNlKVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlY292ZXJGcm9tV3JvbmdDaGFpbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFJlY292ZXJGcm9tV3JvbmdDaGFpbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlcj4gfCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPj4ge1xuICAgIGNvbnN0IHsgdHhpZCwgcmVjb3ZlcnlBZGRyZXNzLCB3YWxsZXQsIHdhbGxldFBhc3NwaHJhc2UsIHhwcnYgfSA9IHBhcmFtcztcblxuICAgIC8vIHBhcmFtcy5yZWNvdmVyeUNvaW4gdXNlZCB0byBiZSBwYXJhbXMuY29pbiwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCByZWNvdmVyeUNvaW4gPSBwYXJhbXMuY29pbiB8fCBwYXJhbXMucmVjb3ZlcnlDb2luO1xuICAgIGlmICghcmVjb3ZlcnlDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHJlY292ZXJ5Q29pbicpO1xuICAgIH1cbiAgICAvLyBzaWduZWQgc2hvdWxkIGRlZmF1bHQgdG8gdHJ1ZSwgYW5kIG9ubHkgYmUgZGlzYWJsZWQgaWYgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UgKG5vdCB1bmRlZmluZWQpXG4gICAgY29uc3Qgc2lnbmVkID0gcGFyYW1zLnNpZ25lZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBzb3VyY2VDb2luRmFtaWx5ID0gdGhpcy5nZXRGYW1pbHkoKTtcbiAgICBjb25zdCByZWNvdmVyeUNvaW5GYW1pbHkgPSByZWNvdmVyeUNvaW4uZ2V0RmFtaWx5KCk7XG4gICAgY29uc3Qgc3VwcG9ydGVkUmVjb3ZlcnlDb2lucyA9IHN1cHBvcnRlZENyb3NzQ2hhaW5SZWNvdmVyaWVzW3NvdXJjZUNvaW5GYW1pbHldO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc3VwcG9ydGVkUmVjb3ZlcnlDb2lucykgfHwgIXN1cHBvcnRlZFJlY292ZXJ5Q29pbnMuaW5jbHVkZXMocmVjb3ZlcnlDb2luRmFtaWx5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNvdmVyeSBvZiAke3NvdXJjZUNvaW5GYW1pbHl9IGJhbGFuY2VzIGZyb20gJHtyZWNvdmVyeUNvaW5GYW1pbHl9IHdhbGxldHMgaXMgbm90IHN1cHBvcnRlZC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVjb3ZlckNyb3NzQ2hhaW48VE51bWJlcj4odGhpcy5iaXRnbywge1xuICAgICAgc291cmNlQ29pbjogdGhpcyxcbiAgICAgIHJlY292ZXJ5Q29pbixcbiAgICAgIHdhbGxldElkOiB3YWxsZXQsXG4gICAgICB0eGlkLFxuICAgICAgcmVjb3ZlcnlBZGRyZXNzLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogc2lnbmVkID8gd2FsbGV0UGFzc3BocmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgIHhwcnY6IHNpZ25lZCA/IHhwcnYgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmlwMzIga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiBhbmQgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZDogQnVmZmVyKTogeyBwdWI6IHN0cmluZzsgcHJ2OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFzZWVkKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBwcml2YXRlIGtleSBoYXMgYm90aCBhIG5vcm1hbCAyNTYgYml0IHByaXZhdGUga2V5IGFuZCBhIDI1NlxuICAgICAgLy8gYml0IGNoYWluIGNvZGUsIGJvdGggb2Ygd2hpY2ggbXVzdCBiZSByYW5kb20uIDUxMiBiaXRzIGlzIHRoZXJlZm9yZSB0aGVcbiAgICAgIC8vIG1heGltdW0gZW50cm9weSBhbmQgZ2l2ZXMgdXMgbWF4aW11bSBzZWN1cml0eSBhZ2FpbnN0IGNyYWNraW5nLlxuICAgICAgc2VlZCA9IHJhbmRvbUJ5dGVzKDUxMiAvIDgpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbmRlZEtleSA9IGJpcDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGV4dGVuZGVkS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgIHBydjogZXh0ZW5kZWRLZXkudG9CYXNlNTgoKSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhidWlsZFBhcmFtczogRXh0cmFQcmVidWlsZFBhcmFtc09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByZUNyZWF0ZUJpdEdvKHBhcmFtczogUHJlY3JlYXRlQml0R29PcHRpb25zKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXN5bmMgcHJlc2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlc2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIGFzeW5jIHN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldChcbiAgICB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gICAga2V5Y2hhaW5zOiBLZXljaGFpbnNUcmlwbGV0XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHdhbGxldFBhcmFtcztcbiAgfVxuXG4gIHRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19