@bitgo/sdk-core 1.0.2-rc.0 → 1.1.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/dist/src/account-lib/baseCoin/baseKeyPair.d.ts +27 -0
  2. package/dist/src/account-lib/baseCoin/baseKeyPair.d.ts.map +1 -0
  3. package/dist/src/account-lib/baseCoin/baseKeyPair.js +3 -0
  4. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +71 -0
  5. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -0
  6. package/dist/src/account-lib/baseCoin/baseTransaction.js +69 -0
  7. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +128 -0
  8. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -0
  9. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +138 -0
  10. package/dist/src/account-lib/baseCoin/baseTransactionBuilderFactory.d.ts +29 -0
  11. package/dist/src/account-lib/baseCoin/baseTransactionBuilderFactory.d.ts.map +1 -0
  12. package/dist/src/account-lib/baseCoin/baseTransactionBuilderFactory.js +19 -0
  13. package/dist/src/account-lib/baseCoin/baseUtils.d.ts +45 -0
  14. package/dist/src/account-lib/baseCoin/baseUtils.d.ts.map +1 -0
  15. package/dist/src/account-lib/baseCoin/baseUtils.js +3 -0
  16. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +75 -0
  17. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +1 -0
  18. package/dist/src/account-lib/baseCoin/blsKeyPair.js +179 -0
  19. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +50 -0
  20. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -0
  21. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +145 -0
  22. package/dist/src/account-lib/baseCoin/enum.d.ts +45 -0
  23. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -0
  24. package/dist/src/account-lib/baseCoin/enum.js +74 -0
  25. package/dist/src/account-lib/baseCoin/errors.d.ts +59 -0
  26. package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -0
  27. package/dist/src/account-lib/baseCoin/errors.js +105 -0
  28. package/dist/src/account-lib/baseCoin/iface.d.ts +155 -0
  29. package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -0
  30. package/dist/src/account-lib/baseCoin/iface.js +38 -0
  31. package/dist/src/account-lib/baseCoin/index.d.ts +12 -0
  32. package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -0
  33. package/dist/src/account-lib/baseCoin/index.js +31 -0
  34. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +55 -0
  35. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -0
  36. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +124 -0
  37. package/dist/src/account-lib/index.d.ts +5 -0
  38. package/dist/src/account-lib/index.d.ts.map +1 -0
  39. package/dist/src/account-lib/index.js +17 -0
  40. package/dist/src/account-lib/mpc/curves/baseCurve.d.ts +19 -0
  41. package/dist/src/account-lib/mpc/curves/baseCurve.d.ts.map +1 -0
  42. package/dist/src/account-lib/mpc/curves/baseCurve.js +6 -0
  43. package/dist/src/account-lib/mpc/curves/ed25519.d.ts +17 -0
  44. package/dist/src/account-lib/mpc/curves/ed25519.d.ts.map +1 -0
  45. package/dist/src/account-lib/mpc/curves/ed25519.js +57 -0
  46. package/dist/src/account-lib/mpc/curves/index.d.ts +6 -0
  47. package/dist/src/account-lib/mpc/curves/index.d.ts.map +1 -0
  48. package/dist/src/account-lib/mpc/curves/index.js +8 -0
  49. package/dist/src/account-lib/mpc/curves/secp256k1.d.ts +17 -0
  50. package/dist/src/account-lib/mpc/curves/secp256k1.d.ts.map +1 -0
  51. package/dist/src/account-lib/mpc/curves/secp256k1.js +70 -0
  52. package/dist/src/account-lib/mpc/hdTree.d.ts +24 -0
  53. package/dist/src/account-lib/mpc/hdTree.d.ts.map +1 -0
  54. package/dist/src/account-lib/mpc/hdTree.js +94 -0
  55. package/dist/src/account-lib/mpc/index.d.ts +8 -0
  56. package/dist/src/account-lib/mpc/index.d.ts.map +1 -0
  57. package/dist/src/account-lib/mpc/index.js +23 -0
  58. package/dist/src/account-lib/mpc/shamir.d.ts +26 -0
  59. package/dist/src/account-lib/mpc/shamir.d.ts.map +1 -0
  60. package/dist/src/account-lib/mpc/shamir.js +86 -0
  61. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +25 -0
  62. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -0
  63. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +121 -0
  64. package/dist/src/account-lib/mpc/tss/ecdsa/index.d.ts +4 -0
  65. package/dist/src/account-lib/mpc/tss/ecdsa/index.d.ts.map +1 -0
  66. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +29 -0
  67. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +40 -0
  68. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -0
  69. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +3 -0
  70. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +29 -0
  71. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -0
  72. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +276 -0
  73. package/dist/src/account-lib/mpc/tss/eddsa/index.d.ts +4 -0
  74. package/dist/src/account-lib/mpc/tss/eddsa/index.d.ts.map +1 -0
  75. package/dist/src/account-lib/mpc/tss/eddsa/index.js +30 -0
  76. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +70 -0
  77. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -0
  78. package/dist/src/account-lib/mpc/tss/eddsa/types.js +3 -0
  79. package/dist/src/account-lib/mpc/tss/index.d.ts +6 -0
  80. package/dist/src/account-lib/mpc/tss/index.d.ts.map +1 -0
  81. package/dist/src/account-lib/mpc/tss/index.js +35 -0
  82. package/dist/src/account-lib/mpc/util.d.ts +8 -0
  83. package/dist/src/account-lib/mpc/util.d.ts.map +1 -0
  84. package/dist/src/account-lib/mpc/util.js +42 -0
  85. package/dist/src/account-lib/util/crypto.d.ts +106 -0
  86. package/dist/src/account-lib/util/crypto.d.ts.map +1 -0
  87. package/dist/src/account-lib/util/crypto.js +269 -0
  88. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +49 -0
  89. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -0
  90. package/dist/src/account-lib/util/ed25519KeyDeriver.js +87 -0
  91. package/dist/src/api/bip32path.d.ts +24 -0
  92. package/dist/src/api/bip32path.d.ts.map +1 -0
  93. package/dist/src/api/bip32path.js +45 -0
  94. package/dist/src/api/index.d.ts +3 -0
  95. package/dist/src/api/index.d.ts.map +1 -0
  96. package/dist/src/{v2 → api}/index.js +2 -2
  97. package/dist/src/api/types.d.ts +20 -0
  98. package/dist/src/api/types.d.ts.map +1 -0
  99. package/dist/src/api/types.js +3 -0
  100. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +230 -0
  101. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -0
  102. package/dist/src/bitgo/baseCoin/baseCoin.js +292 -0
  103. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +257 -0
  104. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -0
  105. package/dist/src/bitgo/baseCoin/iBaseCoin.js +3 -0
  106. package/dist/src/bitgo/baseCoin/index.d.ts +3 -0
  107. package/dist/src/bitgo/baseCoin/index.d.ts.map +1 -0
  108. package/dist/src/bitgo/baseCoin/index.js +15 -0
  109. package/dist/src/bitgo/bip32util.d.ts +17 -0
  110. package/dist/src/bitgo/bip32util.d.ts.map +1 -0
  111. package/dist/src/bitgo/bip32util.js +59 -0
  112. package/dist/src/bitgo/bitcoin.d.ts +16 -0
  113. package/dist/src/bitgo/bitcoin.d.ts.map +1 -0
  114. package/dist/src/bitgo/bitcoin.js +52 -0
  115. package/dist/src/bitgo/bitgoBase.d.ts +22 -0
  116. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -0
  117. package/dist/src/bitgo/bitgoBase.js +3 -0
  118. package/dist/src/bitgo/coinFactory.d.ts +31 -0
  119. package/dist/src/bitgo/coinFactory.d.ts.map +1 -0
  120. package/dist/src/bitgo/coinFactory.js +59 -0
  121. package/dist/src/bitgo/config.d.ts +8 -0
  122. package/dist/src/bitgo/config.d.ts.map +1 -0
  123. package/dist/src/bitgo/config.js +25 -0
  124. package/dist/src/bitgo/ecdh.d.ts +24 -0
  125. package/dist/src/bitgo/ecdh.d.ts.map +1 -0
  126. package/dist/src/bitgo/ecdh.js +80 -0
  127. package/dist/src/bitgo/enterprise/enterprise.d.ts +64 -0
  128. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -0
  129. package/dist/src/bitgo/enterprise/enterprise.js +120 -0
  130. package/dist/src/bitgo/enterprise/enterprises.d.ts +25 -0
  131. package/dist/src/bitgo/enterprise/enterprises.d.ts.map +1 -0
  132. package/dist/src/bitgo/enterprise/enterprises.js +70 -0
  133. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +15 -0
  134. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -0
  135. package/dist/src/bitgo/enterprise/iEnterprise.js +3 -0
  136. package/dist/src/bitgo/enterprise/iEnterprises.d.ts +10 -0
  137. package/dist/src/bitgo/enterprise/iEnterprises.d.ts.map +1 -0
  138. package/dist/src/bitgo/enterprise/iEnterprises.js +3 -0
  139. package/dist/src/bitgo/enterprise/index.d.ts +5 -0
  140. package/dist/src/bitgo/enterprise/index.d.ts.map +1 -0
  141. package/dist/src/bitgo/enterprise/index.js +17 -0
  142. package/dist/src/{v2 → bitgo}/environments.d.ts +0 -0
  143. package/dist/src/bitgo/environments.d.ts.map +1 -0
  144. package/dist/src/bitgo/environments.js +142 -0
  145. package/dist/src/bitgo/errors.d.ts +83 -0
  146. package/dist/src/bitgo/errors.d.ts.map +1 -0
  147. package/dist/src/bitgo/errors.js +163 -0
  148. package/dist/src/bitgo/index.d.ts +26 -0
  149. package/dist/src/bitgo/index.d.ts.map +1 -0
  150. package/dist/src/bitgo/index.js +51 -0
  151. package/dist/src/bitgo/internal/index.d.ts +3 -0
  152. package/dist/src/bitgo/internal/index.d.ts.map +1 -0
  153. package/dist/src/bitgo/internal/index.js +15 -0
  154. package/dist/src/bitgo/internal/internal.d.ts +19 -0
  155. package/dist/src/bitgo/internal/internal.d.ts.map +1 -0
  156. package/dist/src/bitgo/internal/internal.js +33 -0
  157. package/dist/src/bitgo/internal/keycard.d.ts +33 -0
  158. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -0
  159. package/dist/src/bitgo/internal/keycard.js +304 -0
  160. package/dist/src/bitgo/keychain/iKeychains.d.ts +118 -0
  161. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -0
  162. package/dist/src/bitgo/keychain/iKeychains.js +10 -0
  163. package/dist/src/bitgo/keychain/index.d.ts +3 -0
  164. package/dist/src/bitgo/keychain/index.d.ts.map +1 -0
  165. package/dist/src/bitgo/keychain/index.js +15 -0
  166. package/dist/src/bitgo/keychain/keychains.d.ts +90 -0
  167. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -0
  168. package/dist/src/bitgo/keychain/keychains.js +280 -0
  169. package/dist/src/bitgo/market/iMarkets.d.ts +12 -0
  170. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -0
  171. package/dist/src/bitgo/market/iMarkets.js +3 -0
  172. package/dist/src/bitgo/market/index.d.ts +3 -0
  173. package/dist/src/bitgo/market/index.d.ts.map +1 -0
  174. package/dist/src/bitgo/market/index.js +15 -0
  175. package/dist/src/bitgo/market/markets.d.ts +29 -0
  176. package/dist/src/bitgo/market/markets.d.ts.map +1 -0
  177. package/dist/src/bitgo/market/markets.js +70 -0
  178. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +73 -0
  179. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -0
  180. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +28 -0
  181. package/dist/src/bitgo/pendingApproval/iPendingApprovals.d.ts +16 -0
  182. package/dist/src/bitgo/pendingApproval/iPendingApprovals.d.ts.map +1 -0
  183. package/dist/src/bitgo/pendingApproval/iPendingApprovals.js +3 -0
  184. package/dist/src/bitgo/pendingApproval/index.d.ts +5 -0
  185. package/dist/src/bitgo/pendingApproval/index.d.ts.map +1 -0
  186. package/dist/src/bitgo/pendingApproval/index.js +17 -0
  187. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +99 -0
  188. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -0
  189. package/dist/src/bitgo/pendingApproval/pendingApproval.js +319 -0
  190. package/dist/src/bitgo/pendingApproval/pendingApprovals.d.ts +19 -0
  191. package/dist/src/bitgo/pendingApproval/pendingApprovals.d.ts.map +1 -0
  192. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +76 -0
  193. package/dist/src/bitgo/recovery/index.d.ts +2 -0
  194. package/dist/src/bitgo/recovery/index.d.ts.map +1 -0
  195. package/dist/src/bitgo/recovery/index.js +14 -0
  196. package/dist/src/bitgo/recovery/initiate.d.ts +49 -0
  197. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -0
  198. package/dist/src/bitgo/recovery/initiate.js +119 -0
  199. package/dist/src/bitgo/trading/affirmation.d.ts +35 -0
  200. package/dist/src/bitgo/trading/affirmation.d.ts.map +1 -0
  201. package/dist/src/bitgo/trading/affirmation.js +53 -0
  202. package/dist/src/bitgo/trading/affirmations.d.ts +23 -0
  203. package/dist/src/bitgo/trading/affirmations.d.ts.map +1 -0
  204. package/dist/src/bitgo/trading/affirmations.js +45 -0
  205. package/dist/src/bitgo/trading/iAffirmation.d.ts +15 -0
  206. package/dist/src/bitgo/trading/iAffirmation.d.ts.map +1 -0
  207. package/dist/src/bitgo/trading/iAffirmation.js +13 -0
  208. package/dist/src/bitgo/trading/iAffirmations.d.ts +10 -0
  209. package/dist/src/bitgo/trading/iAffirmations.d.ts.map +1 -0
  210. package/dist/src/bitgo/trading/iAffirmations.js +3 -0
  211. package/dist/src/bitgo/trading/iSettlement.d.ts +25 -0
  212. package/dist/src/bitgo/trading/iSettlement.d.ts.map +1 -0
  213. package/dist/src/bitgo/trading/iSettlement.js +17 -0
  214. package/dist/src/bitgo/trading/iSettlements.d.ts +19 -0
  215. package/dist/src/bitgo/trading/iSettlements.d.ts.map +1 -0
  216. package/dist/src/bitgo/trading/iSettlements.js +3 -0
  217. package/dist/src/bitgo/trading/iTradingAccount.d.ts +41 -0
  218. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -0
  219. package/dist/src/bitgo/trading/iTradingAccount.js +3 -0
  220. package/dist/src/bitgo/trading/iTradingPartner.d.ts +14 -0
  221. package/dist/src/bitgo/trading/iTradingPartner.d.ts.map +1 -0
  222. package/dist/src/bitgo/trading/iTradingPartner.js +17 -0
  223. package/dist/src/bitgo/trading/iTradingPartners.d.ts +15 -0
  224. package/dist/src/bitgo/trading/iTradingPartners.d.ts.map +1 -0
  225. package/dist/src/bitgo/trading/iTradingPartners.js +9 -0
  226. package/dist/src/bitgo/trading/index.d.ts +18 -0
  227. package/dist/src/bitgo/trading/index.d.ts.map +1 -0
  228. package/dist/src/bitgo/trading/index.js +30 -0
  229. package/dist/src/bitgo/trading/lock.d.ts +16 -0
  230. package/dist/src/bitgo/trading/lock.d.ts.map +1 -0
  231. package/dist/src/bitgo/trading/lock.js +12 -0
  232. package/dist/src/bitgo/trading/payload.d.ts +22 -0
  233. package/dist/src/bitgo/trading/payload.d.ts.map +1 -0
  234. package/dist/src/bitgo/trading/payload.js +3 -0
  235. package/dist/src/bitgo/trading/settlement.d.ts +16 -0
  236. package/dist/src/bitgo/trading/settlement.d.ts.map +1 -0
  237. package/dist/src/bitgo/trading/settlement.js +21 -0
  238. package/dist/src/bitgo/trading/settlements.d.ts +32 -0
  239. package/dist/src/bitgo/trading/settlements.d.ts.map +1 -0
  240. package/dist/src/bitgo/trading/settlements.js +61 -0
  241. package/dist/src/bitgo/trading/trade.d.ts +29 -0
  242. package/dist/src/bitgo/trading/trade.d.ts.map +1 -0
  243. package/dist/src/bitgo/trading/trade.js +11 -0
  244. package/dist/src/bitgo/trading/tradingAccount.d.ts +53 -0
  245. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -0
  246. package/dist/src/bitgo/trading/tradingAccount.js +127 -0
  247. package/dist/src/bitgo/trading/tradingPartner.d.ts +26 -0
  248. package/dist/src/bitgo/trading/tradingPartner.d.ts.map +1 -0
  249. package/dist/src/bitgo/trading/tradingPartner.js +31 -0
  250. package/dist/src/bitgo/trading/tradingPartners.d.ts +24 -0
  251. package/dist/src/bitgo/trading/tradingPartners.d.ts.map +1 -0
  252. package/dist/src/bitgo/trading/tradingPartners.js +32 -0
  253. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +35 -0
  254. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -0
  255. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +95 -0
  256. package/dist/src/bitgo/tss/ecdsa/index.d.ts +4 -0
  257. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -0
  258. package/dist/src/bitgo/tss/ecdsa/index.js +26 -0
  259. package/dist/src/bitgo/tss/ecdsa/types.d.ts +30 -0
  260. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -0
  261. package/dist/src/bitgo/tss/ecdsa/types.js +3 -0
  262. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +102 -0
  263. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -0
  264. package/dist/src/bitgo/tss/eddsa/eddsa.js +256 -0
  265. package/dist/src/bitgo/tss/eddsa/index.d.ts +6 -0
  266. package/dist/src/bitgo/tss/eddsa/index.d.ts.map +1 -0
  267. package/dist/src/bitgo/tss/eddsa/index.js +37 -0
  268. package/dist/src/bitgo/tss/eddsa/types.d.ts +23 -0
  269. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -0
  270. package/dist/src/bitgo/tss/eddsa/types.js +3 -0
  271. package/dist/src/bitgo/tss/index.d.ts +6 -0
  272. package/dist/src/bitgo/tss/index.d.ts.map +1 -0
  273. package/dist/src/bitgo/tss/index.js +42 -0
  274. package/dist/src/bitgo/tss/types.d.ts +6 -0
  275. package/dist/src/bitgo/tss/types.d.ts.map +1 -0
  276. package/dist/src/bitgo/tss/types.js +10 -0
  277. package/dist/src/bitgo/types.d.ts +4 -0
  278. package/dist/src/bitgo/types.d.ts.map +1 -0
  279. package/dist/src/bitgo/types.js +3 -0
  280. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +6 -0
  281. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -0
  282. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +30 -0
  283. package/dist/src/bitgo/utils/blsUtils.d.ts +51 -0
  284. package/dist/src/bitgo/utils/blsUtils.d.ts.map +1 -0
  285. package/dist/src/bitgo/utils/blsUtils.js +166 -0
  286. package/dist/src/bitgo/utils/iBlsUtils.d.ts +14 -0
  287. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +1 -0
  288. package/dist/src/bitgo/utils/iBlsUtils.js +3 -0
  289. package/dist/src/bitgo/utils/index.d.ts +12 -0
  290. package/dist/src/bitgo/utils/index.d.ts.map +1 -0
  291. package/dist/src/bitgo/utils/index.js +37 -0
  292. package/dist/src/bitgo/utils/mpcUtils.d.ts +31 -0
  293. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -0
  294. package/dist/src/bitgo/utils/mpcUtils.js +55 -0
  295. package/dist/src/bitgo/utils/opengpgUtils.d.ts +51 -0
  296. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -0
  297. package/dist/src/bitgo/utils/opengpgUtils.js +136 -0
  298. package/dist/src/bitgo/utils/promise-utils.d.ts +5 -0
  299. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -0
  300. package/dist/src/bitgo/utils/promise-utils.js +12 -0
  301. package/dist/src/bitgo/utils/triple.d.ts +3 -0
  302. package/dist/src/bitgo/utils/triple.d.ts.map +1 -0
  303. package/dist/src/bitgo/utils/triple.js +8 -0
  304. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +117 -0
  305. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -0
  306. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +351 -0
  307. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +5 -0
  308. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -0
  309. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -0
  310. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +72 -0
  311. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -0
  312. package/dist/src/bitgo/utils/tss/eddsa/types.js +10 -0
  313. package/dist/src/bitgo/utils/tss/index.d.ts +4 -0
  314. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -0
  315. package/dist/src/bitgo/utils/tss/index.js +29 -0
  316. package/dist/src/bitgo/utils/util.d.ts +77 -0
  317. package/dist/src/bitgo/utils/util.d.ts.map +1 -0
  318. package/dist/src/bitgo/utils/util.js +198 -0
  319. package/dist/src/bitgo/wallet/iWallet.d.ts +510 -0
  320. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -0
  321. package/dist/src/bitgo/wallet/iWallet.js +3 -0
  322. package/dist/src/bitgo/wallet/iWallets.d.ts +105 -0
  323. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -0
  324. package/dist/src/bitgo/wallet/iWallets.js +3 -0
  325. package/dist/src/bitgo/wallet/index.d.ts +5 -0
  326. package/dist/src/bitgo/wallet/index.d.ts.map +1 -0
  327. package/dist/src/bitgo/wallet/index.js +17 -0
  328. package/dist/src/bitgo/wallet/wallet.d.ts +650 -0
  329. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -0
  330. package/dist/src/bitgo/wallet/wallet.js +2039 -0
  331. package/dist/src/bitgo/wallet/wallets.d.ts +134 -0
  332. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -0
  333. package/dist/src/bitgo/wallet/wallets.js +605 -0
  334. package/dist/src/bitgo/webhook/iWebhooks.d.ts +26 -0
  335. package/dist/src/bitgo/webhook/iWebhooks.d.ts.map +1 -0
  336. package/dist/src/bitgo/webhook/iWebhooks.js +3 -0
  337. package/dist/src/bitgo/webhook/index.d.ts +3 -0
  338. package/dist/src/bitgo/webhook/index.d.ts.map +1 -0
  339. package/dist/src/bitgo/webhook/index.js +15 -0
  340. package/dist/src/bitgo/webhook/webhooks.d.ts +43 -0
  341. package/dist/src/bitgo/webhook/webhooks.d.ts.map +1 -0
  342. package/dist/src/bitgo/webhook/webhooks.js +102 -0
  343. package/dist/src/{bigojsError.d.ts → bitgojsError.d.ts} +1 -1
  344. package/dist/src/bitgojsError.d.ts.map +1 -0
  345. package/dist/src/bitgojsError.js +11 -0
  346. package/dist/src/common.d.ts +1 -1
  347. package/dist/src/common.d.ts.map +1 -1
  348. package/dist/src/common.js +3 -3
  349. package/dist/src/index.d.ts +4 -2
  350. package/dist/src/index.d.ts.map +1 -1
  351. package/dist/src/index.js +6 -5
  352. package/dist/tsconfig.tsbuildinfo +3501 -150
  353. package/package.json +28 -4
  354. package/CHANGELOG.md +0 -8
  355. package/dist/src/bigojsError.d.ts.map +0 -1
  356. package/dist/src/bigojsError.js +0 -11
  357. package/dist/src/v2/environments.d.ts.map +0 -1
  358. package/dist/src/v2/environments.js +0 -142
  359. package/dist/src/v2/index.d.ts +0 -3
  360. package/dist/src/v2/index.d.ts.map +0 -1
  361. package/dist/src/v2/types.d.ts +0 -2
  362. package/dist/src/v2/types.d.ts.map +0 -1
  363. package/dist/src/v2/types.js +0 -3
@@ -0,0 +1,605 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.Wallets = void 0;
23
+ /**
24
+ * @prettier
25
+ */
26
+ const bignumber_js_1 = require("bignumber.js");
27
+ const bip32 = __importStar(require("bip32"));
28
+ const _ = __importStar(require("lodash"));
29
+ const api_1 = require("../../api");
30
+ const common = __importStar(require("../../common"));
31
+ const ecdh_1 = require("../ecdh");
32
+ const utils_1 = require("../utils");
33
+ const wallet_1 = require("./wallet");
34
+ class Wallets {
35
+ constructor(bitgo, baseCoin) {
36
+ this.bitgo = bitgo;
37
+ this.baseCoin = baseCoin;
38
+ }
39
+ /**
40
+ * Get a wallet by ID (proxy for getWallet)
41
+ * @param params
42
+ */
43
+ async get(params = {}) {
44
+ return this.getWallet(params);
45
+ }
46
+ /**
47
+ * List a user's wallets
48
+ * @param params
49
+ * @returns {*}
50
+ */
51
+ async list(params = {}) {
52
+ const queryObject = {};
53
+ if (params.skip && params.prevId) {
54
+ throw new Error('cannot specify both skip and prevId');
55
+ }
56
+ if (params.getbalances) {
57
+ if (!_.isBoolean(params.getbalances)) {
58
+ throw new Error('invalid getbalances argument, expecting boolean');
59
+ }
60
+ queryObject.getbalances = params.getbalances;
61
+ }
62
+ if (params.prevId) {
63
+ if (!_.isString(params.prevId)) {
64
+ throw new Error('invalid prevId argument, expecting string');
65
+ }
66
+ queryObject.prevId = params.prevId;
67
+ }
68
+ if (params.limit) {
69
+ if (!_.isNumber(params.limit)) {
70
+ throw new Error('invalid limit argument, expecting number');
71
+ }
72
+ queryObject.limit = params.limit;
73
+ }
74
+ if (params.allTokens) {
75
+ if (!_.isBoolean(params.allTokens)) {
76
+ throw new Error('invalid allTokens argument, expecting boolean');
77
+ }
78
+ queryObject.allTokens = params.allTokens;
79
+ }
80
+ const body = (await this.bitgo.get(this.baseCoin.url('/wallet')).query(queryObject).result());
81
+ body.wallets = body.wallets.map((w) => new wallet_1.Wallet(this.bitgo, this.baseCoin, w));
82
+ return body;
83
+ }
84
+ /**
85
+ * add
86
+ * Add a new wallet (advanced mode).
87
+ * This allows you to manually submit the keys, type, m and n of the wallet
88
+ * Parameters include:
89
+ * "label": label of the wallet to be shown in UI
90
+ * "m": number of keys required to unlock wallet (2)
91
+ * "n": number of keys available on the wallet (3)
92
+ * "keys": array of keychain ids
93
+ */
94
+ async add(params = {}) {
95
+ common.validateParams(params, [], ['label', 'enterprise', 'type']);
96
+ // no need to pass keys for (single) custodial wallets
97
+ if (params.type !== 'custodial') {
98
+ if (Array.isArray(params.keys) === false || !_.isNumber(params.m) || !_.isNumber(params.n)) {
99
+ throw new Error('invalid argument');
100
+ }
101
+ // TODO: support more types of multisig
102
+ if (!this.baseCoin.isValidMofNSetup(params)) {
103
+ throw new Error('unsupported multi-sig type');
104
+ }
105
+ }
106
+ if (params.gasPrice && !_.isNumber(params.gasPrice)) {
107
+ throw new Error('invalid argument for gasPrice - number expected');
108
+ }
109
+ if (params.walletVersion && !_.isNumber(params.walletVersion)) {
110
+ throw new Error('invalid argument for walletVersion - number expected');
111
+ }
112
+ if (params.tags && Array.isArray(params.tags) === false) {
113
+ throw new Error('invalid argument for tags - array expected');
114
+ }
115
+ if (params.clientFlags && Array.isArray(params.clientFlags) === false) {
116
+ throw new Error('invalid argument for clientFlags - array expected');
117
+ }
118
+ if (params.isCold && !_.isBoolean(params.isCold)) {
119
+ throw new Error('invalid argument for isCold - boolean expected');
120
+ }
121
+ if (params.isCustodial && !_.isBoolean(params.isCustodial)) {
122
+ throw new Error('invalid argument for isCustodial - boolean expected');
123
+ }
124
+ if (params.address && (!_.isString(params.address) || !this.baseCoin.isValidAddress(params.address))) {
125
+ throw new Error('invalid argument for address - valid address string expected');
126
+ }
127
+ const walletParams = _.pick(params, [
128
+ 'label',
129
+ 'm',
130
+ 'n',
131
+ 'keys',
132
+ 'enterprise',
133
+ 'isCold',
134
+ 'isCustodial',
135
+ 'tags',
136
+ 'clientFlags',
137
+ 'type',
138
+ 'address',
139
+ 'gasPrice',
140
+ 'walletVersion',
141
+ ]);
142
+ // Additional params needed for xrp
143
+ if (params.rootPub) {
144
+ walletParams.rootPub = params.rootPub;
145
+ }
146
+ // In XRP, XLM and CSPR this private key is used only for wallet creation purposes,
147
+ // once the wallet is initialized then we update its weight to 0 making it an invalid key.
148
+ // https://www.stellar.org/developers/guides/concepts/multi-sig.html#additional-signing-keys
149
+ if (params.rootPrivateKey) {
150
+ walletParams.rootPrivateKey = params.rootPrivateKey;
151
+ }
152
+ if (params.initializationTxs) {
153
+ walletParams.initializationTxs = params.initializationTxs;
154
+ }
155
+ if (params.disableTransactionNotifications) {
156
+ walletParams.disableTransactionNotifications = params.disableTransactionNotifications;
157
+ }
158
+ if (params.multisigType) {
159
+ walletParams.multisigType = params.multisigType;
160
+ }
161
+ const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet')).send(walletParams).result();
162
+ return {
163
+ wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
164
+ };
165
+ }
166
+ /**
167
+ * Generate a new wallet
168
+ * 1. Creates the user keychain locally on the client, and encrypts it with the provided passphrase
169
+ * 2. If no pub was provided, creates the backup keychain locally on the client, and encrypts it with the provided passphrase
170
+ * 3. Uploads the encrypted user and backup keychains to BitGo
171
+ * 4. Creates the BitGo key on the service
172
+ * 5. Creates the wallet on BitGo with the 3 public keys above
173
+ * @param params
174
+ * @param params.label
175
+ * @param params.passphrase
176
+ * @param params.userKey User xpub
177
+ * @param params.backupXpub Backup xpub
178
+ * @param params.backupXpubProvider
179
+ * @param params.enterprise
180
+ * @param params.disableTransactionNotifications
181
+ * @param params.passcodeEncryptionCode
182
+ * @param params.coldDerivationSeed
183
+ * @param params.gasPrice
184
+ * @param params.disableKRSEmail
185
+ * @param params.walletVersion
186
+ * @param params.multisigType optional multisig type, 'onchain' or 'tss' or 'blsdkg'; if absent, we will defer to the coin's default type
187
+ * @returns {*}
188
+ */
189
+ async generateWallet(params = {}) {
190
+ common.validateParams(params, ['label'], ['passphrase', 'userKey', 'backupXpub']);
191
+ if (!_.isString(params.label)) {
192
+ throw new Error('missing required string parameter label');
193
+ }
194
+ const isTss = params.multisigType ? params.multisigType === 'tss' : this.baseCoin.supportsTss();
195
+ const label = params.label;
196
+ const passphrase = params.passphrase;
197
+ const canEncrypt = !!passphrase && typeof passphrase === 'string';
198
+ const isCold = !canEncrypt || !!params.userKey;
199
+ const walletParams = {
200
+ label: label,
201
+ m: 2,
202
+ n: 3,
203
+ keys: [],
204
+ isCold,
205
+ };
206
+ if (!_.isUndefined(params.passcodeEncryptionCode)) {
207
+ if (!_.isString(params.passcodeEncryptionCode)) {
208
+ throw new Error('passcodeEncryptionCode must be a string');
209
+ }
210
+ }
211
+ if (!_.isUndefined(params.enterprise)) {
212
+ if (!_.isString(params.enterprise)) {
213
+ throw new Error('invalid enterprise argument, expecting string');
214
+ }
215
+ walletParams.enterprise = params.enterprise;
216
+ }
217
+ if (isTss) {
218
+ if (!canEncrypt) {
219
+ throw new Error('cannot generate TSS keys without passphrase');
220
+ }
221
+ if (isCold) {
222
+ throw new Error('TSS cold wallets are not supported at this time');
223
+ }
224
+ if (!this.baseCoin.supportsTss()) {
225
+ throw new Error(`coin ${this.baseCoin.getFamily()} does not support TSS at this time`);
226
+ }
227
+ return this.generateMpcWallet({
228
+ multisigType: 'tss',
229
+ label,
230
+ passphrase: passphrase,
231
+ originalPasscodeEncryptionCode: params.passcodeEncryptionCode,
232
+ enterprise: params.enterprise,
233
+ });
234
+ }
235
+ const isBlsDkg = params.multisigType ? params.multisigType === 'blsdkg' : this.baseCoin.supportsBlsDkg();
236
+ if (isBlsDkg) {
237
+ if (!canEncrypt) {
238
+ throw new Error('cannot generate BLS-DKG keys without passphrase');
239
+ }
240
+ if (isCold) {
241
+ throw new Error('BLS-DKG cold wallets are not supported at this time');
242
+ }
243
+ if (!this.baseCoin.supportsBlsDkg()) {
244
+ throw new Error(`coin ${this.baseCoin.getFamily()} does not support BLS-DKG at this time`);
245
+ }
246
+ return this.generateMpcWallet({ multisigType: 'blsdkg', label, passphrase: passphrase });
247
+ }
248
+ const hasBackupXpub = !!params.backupXpub;
249
+ const hasBackupXpubProvider = !!params.backupXpubProvider;
250
+ if (hasBackupXpub && hasBackupXpubProvider) {
251
+ throw new Error('Cannot provide more than one backupXpub or backupXpubProvider flag');
252
+ }
253
+ if (params.gasPrice && params.eip1559) {
254
+ throw new Error('can not use both eip1559 and gasPrice values');
255
+ }
256
+ if (!_.isUndefined(params.disableTransactionNotifications)) {
257
+ if (!_.isBoolean(params.disableTransactionNotifications)) {
258
+ throw new Error('invalid disableTransactionNotifications argument, expecting boolean');
259
+ }
260
+ walletParams.disableTransactionNotifications = params.disableTransactionNotifications;
261
+ }
262
+ if (!_.isUndefined(params.gasPrice)) {
263
+ const gasPriceBN = new bignumber_js_1.BigNumber(params.gasPrice);
264
+ if (gasPriceBN.isNaN()) {
265
+ throw new Error('invalid gas price argument, expecting number or number as string');
266
+ }
267
+ walletParams.gasPrice = gasPriceBN.toString();
268
+ }
269
+ if (!_.isUndefined(params.eip1559) && !_.isEmpty(params.eip1559)) {
270
+ const maxFeePerGasBN = new bignumber_js_1.BigNumber(params.eip1559.maxFeePerGas);
271
+ if (maxFeePerGasBN.isNaN()) {
272
+ throw new Error('invalid max fee argument, expecting number or number as string');
273
+ }
274
+ const maxPriorityFeePerGasBN = new bignumber_js_1.BigNumber(params.eip1559.maxPriorityFeePerGas);
275
+ if (maxPriorityFeePerGasBN.isNaN()) {
276
+ throw new Error('invalid priority fee argument, expecting number or number as string');
277
+ }
278
+ walletParams.eip1559 = {
279
+ maxFeePerGas: maxFeePerGasBN.toString(),
280
+ maxPriorityFeePerGas: maxPriorityFeePerGasBN.toString(),
281
+ };
282
+ }
283
+ if (!_.isUndefined(params.disableKRSEmail)) {
284
+ if (!_.isBoolean(params.disableKRSEmail)) {
285
+ throw new Error('invalid disableKRSEmail argument, expecting boolean');
286
+ }
287
+ walletParams.disableKRSEmail = params.disableKRSEmail;
288
+ }
289
+ if (!_.isUndefined(params.walletVersion)) {
290
+ if (!_.isNumber(params.walletVersion)) {
291
+ throw new Error('invalid walletVersion provided, expecting number');
292
+ }
293
+ walletParams.walletVersion = params.walletVersion;
294
+ }
295
+ // Ensure each krsSpecific param is either a string, boolean, or number
296
+ const { krsSpecific } = params;
297
+ if (!_.isUndefined(krsSpecific)) {
298
+ Object.keys(krsSpecific).forEach((key) => {
299
+ const val = krsSpecific[key];
300
+ if (!_.isBoolean(val) && !_.isString(val) && !_.isNumber(val)) {
301
+ throw new Error('krsSpecific object contains illegal values. values must be strings, booleans, or numbers');
302
+ }
303
+ });
304
+ }
305
+ let derivationPath = undefined;
306
+ const reqId = new utils_1.RequestTracer();
307
+ // Add the user keychain
308
+ const userKeychainPromise = async () => {
309
+ let userKeychainParams;
310
+ let userKeychain;
311
+ // User provided user key
312
+ if (params.userKey) {
313
+ userKeychain = { pub: params.userKey };
314
+ userKeychainParams = userKeychain;
315
+ if (params.coldDerivationSeed) {
316
+ // the derivation only makes sense when a key already exists
317
+ const derivation = this.baseCoin.deriveKeyWithSeed({
318
+ key: params.userKey,
319
+ seed: params.coldDerivationSeed,
320
+ });
321
+ derivationPath = derivation.derivationPath;
322
+ userKeychain.pub = derivation.key;
323
+ userKeychain.derivedFromParentWithSeed = params.coldDerivationSeed;
324
+ }
325
+ }
326
+ else {
327
+ if (!canEncrypt) {
328
+ throw new Error('cannot generate user keypair without passphrase');
329
+ }
330
+ // Create the user key.
331
+ userKeychain = this.baseCoin.keychains().create();
332
+ userKeychain.encryptedPrv = this.bitgo.encrypt({ password: passphrase, input: userKeychain.prv });
333
+ userKeychainParams = {
334
+ pub: userKeychain.pub,
335
+ encryptedPrv: userKeychain.encryptedPrv,
336
+ originalPasscodeEncryptionCode: params.passcodeEncryptionCode,
337
+ };
338
+ }
339
+ userKeychainParams.reqId = reqId;
340
+ const newUserKeychain = await this.baseCoin.keychains().add(userKeychainParams);
341
+ return _.extend({}, newUserKeychain, userKeychain);
342
+ };
343
+ const backupKeychainPromise = async () => {
344
+ if (params.backupXpubProvider) {
345
+ // If requested, use a KRS or backup key provider
346
+ return this.baseCoin.keychains().createBackup({
347
+ provider: params.backupXpubProvider || 'defaultRMGBackupProvider',
348
+ disableKRSEmail: params.disableKRSEmail,
349
+ krsSpecific: params.krsSpecific,
350
+ type: this.baseCoin.getChain(),
351
+ reqId,
352
+ });
353
+ }
354
+ // User provided backup xpub
355
+ if (params.backupXpub) {
356
+ // user provided backup ethereum address
357
+ return this.baseCoin.keychains().add({
358
+ pub: params.backupXpub,
359
+ source: 'backup',
360
+ reqId,
361
+ });
362
+ }
363
+ else {
364
+ if (!canEncrypt) {
365
+ throw new Error('cannot generate backup keypair without passphrase');
366
+ }
367
+ // No provided backup xpub or address, so default to creating one here
368
+ return this.baseCoin.keychains().createBackup({ reqId });
369
+ }
370
+ };
371
+ const { userKeychain, backupKeychain, bitgoKeychain } = await utils_1.promiseProps({
372
+ userKeychain: userKeychainPromise(),
373
+ backupKeychain: backupKeychainPromise(),
374
+ bitgoKeychain: this.baseCoin.keychains().createBitGo({ enterprise: params.enterprise, reqId }),
375
+ });
376
+ walletParams.keys = [userKeychain.id, backupKeychain.id, bitgoKeychain.id];
377
+ walletParams.isCold = isCold;
378
+ const { prv } = userKeychain;
379
+ if (_.isString(prv)) {
380
+ walletParams.keySignatures = {
381
+ backup: (await this.baseCoin.signMessage({ prv }, backupKeychain.pub)).toString('hex'),
382
+ bitgo: (await this.baseCoin.signMessage({ prv }, bitgoKeychain.pub)).toString('hex'),
383
+ };
384
+ }
385
+ if (_.includes(['xrp', 'xlm', 'cspr'], this.baseCoin.getFamily()) && !_.isUndefined(params.rootPrivateKey)) {
386
+ walletParams.rootPrivateKey = params.rootPrivateKey;
387
+ }
388
+ const keychains = {
389
+ userKeychain,
390
+ backupKeychain,
391
+ bitgoKeychain,
392
+ };
393
+ const finalWalletParams = await this.baseCoin.supplementGenerateWallet(walletParams, keychains);
394
+ this.bitgo.setRequestTracer(reqId);
395
+ const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet')).send(finalWalletParams).result();
396
+ const result = {
397
+ wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
398
+ userKeychain: userKeychain,
399
+ backupKeychain: backupKeychain,
400
+ bitgoKeychain: bitgoKeychain,
401
+ };
402
+ if (!_.isUndefined(backupKeychain.prv)) {
403
+ result.warning = 'Be sure to backup the backup keychain -- it is not stored anywhere else!';
404
+ }
405
+ if (!_.isUndefined(derivationPath)) {
406
+ userKeychain.derivationPath = derivationPath;
407
+ }
408
+ return result;
409
+ }
410
+ /**
411
+ * List the user's wallet shares
412
+ * @param params
413
+ */
414
+ async listShares(params = {}) {
415
+ return await this.bitgo.get(this.baseCoin.url('/walletshare')).result();
416
+ }
417
+ /**
418
+ * Gets a wallet share information, including the encrypted sharing keychain. requires unlock if keychain is present.
419
+ * @param params
420
+ * @param params.walletShareId - the wallet share to get information on
421
+ */
422
+ async getShare(params = {}) {
423
+ common.validateParams(params, ['walletShareId'], []);
424
+ return await this.bitgo.get(this.baseCoin.url('/walletshare/' + params.walletShareId)).result();
425
+ }
426
+ /**
427
+ * Update a wallet share
428
+ * @param params.walletShareId - the wallet share to update
429
+ * @param params.state - the new state of the wallet share
430
+ * @param params
431
+ */
432
+ async updateShare(params = {}) {
433
+ common.validateParams(params, ['walletShareId'], []);
434
+ return await this.bitgo
435
+ .post(this.baseCoin.url('/walletshare/' + params.walletShareId))
436
+ .send(params)
437
+ .result();
438
+ }
439
+ /**
440
+ * Resend a wallet share invitation email
441
+ * @param params
442
+ * @param params.walletShareId - the wallet share whose invitiation should be resent
443
+ */
444
+ async resendShareInvite(params = {}) {
445
+ common.validateParams(params, ['walletShareId'], []);
446
+ const urlParts = params.walletShareId + '/resendemail';
447
+ return this.bitgo.post(this.baseCoin.url('/walletshare/' + urlParts)).result();
448
+ }
449
+ /**
450
+ * Cancel a wallet share
451
+ * @param params
452
+ * @param params.walletShareId - the wallet share to update
453
+ */
454
+ async cancelShare(params = {}) {
455
+ common.validateParams(params, ['walletShareId'], []);
456
+ return await this.bitgo
457
+ .del(this.baseCoin.url('/walletshare/' + params.walletShareId))
458
+ .send()
459
+ .result();
460
+ }
461
+ /**
462
+ * Accepts a wallet share, adding the wallet to the user's list
463
+ * Needs a user's password to decrypt the shared key
464
+ *
465
+ * @param params
466
+ * @param params.walletShareId - the wallet share to accept
467
+ * @param params.userPassword - (required if more a keychain was shared) user's password to decrypt the shared wallet
468
+ * @param params.newWalletPassphrase - new wallet passphrase for saving the shared wallet prv.
469
+ * If left blank and a wallet with more than view permissions was shared,
470
+ * then the user's login password is used.
471
+ * @param params.overrideEncryptedPrv - set only if the prv was received out-of-band.
472
+ */
473
+ async acceptShare(params = {}) {
474
+ common.validateParams(params, ['walletShareId'], ['overrideEncryptedPrv', 'userPassword', 'newWalletPassphrase']);
475
+ let encryptedPrv = params.overrideEncryptedPrv;
476
+ const walletShare = (await this.getShare({ walletShareId: params.walletShareId }));
477
+ // Return right away if there is no keychain to decrypt, or if explicit encryptedPrv was provided
478
+ if (!walletShare.keychain || !walletShare.keychain.encryptedPrv || encryptedPrv) {
479
+ return this.updateShare({
480
+ walletShareId: params.walletShareId,
481
+ state: 'accepted',
482
+ });
483
+ }
484
+ // More than viewing was requested, so we need to process the wallet keys using the shared ecdh scheme
485
+ if (_.isUndefined(params.userPassword)) {
486
+ throw new Error('userPassword param must be provided to decrypt shared key');
487
+ }
488
+ const sharingKeychain = (await this.bitgo.getECDHSharingKeychain());
489
+ if (_.isUndefined(sharingKeychain.encryptedXprv)) {
490
+ throw new Error('encryptedXprv was not found on sharing keychain');
491
+ }
492
+ // Now we have the sharing keychain, we can work out the secret used for sharing the wallet with us
493
+ sharingKeychain.prv = this.bitgo.decrypt({
494
+ password: params.userPassword,
495
+ input: sharingKeychain.encryptedXprv,
496
+ });
497
+ const secret = ecdh_1.getSharedSecret(
498
+ // Derive key by path (which is used between these 2 users only)
499
+ bip32.fromBase58(sharingKeychain.prv).derivePath(api_1.sanitizeLegacyPath(walletShare.keychain.path)), Buffer.from(walletShare.keychain.fromPubKey, 'hex')).toString('hex');
500
+ // Yes! We got the secret successfully here, now decrypt the shared wallet prv
501
+ const decryptedSharedWalletPrv = this.bitgo.decrypt({
502
+ password: secret,
503
+ input: walletShare.keychain.encryptedPrv,
504
+ });
505
+ // We will now re-encrypt the wallet with our own password
506
+ const newWalletPassphrase = params.newWalletPassphrase || params.userPassword;
507
+ encryptedPrv = this.bitgo.encrypt({
508
+ password: newWalletPassphrase,
509
+ input: decryptedSharedWalletPrv,
510
+ });
511
+ const updateParams = {
512
+ walletShareId: params.walletShareId,
513
+ state: 'accepted',
514
+ };
515
+ if (encryptedPrv) {
516
+ updateParams.encryptedPrv = encryptedPrv;
517
+ }
518
+ return this.updateShare(updateParams);
519
+ }
520
+ /**
521
+ * Get a wallet by its ID
522
+ * @param params
523
+ * @param params.id wallet id
524
+ * @returns {*}
525
+ */
526
+ async getWallet(params = {}) {
527
+ common.validateParams(params, ['id'], []);
528
+ const query = {};
529
+ if (params.allTokens) {
530
+ if (!_.isBoolean(params.allTokens)) {
531
+ throw new Error('invalid allTokens argument, expecting boolean');
532
+ }
533
+ query.allTokens = params.allTokens;
534
+ }
535
+ this.bitgo.setRequestTracer(params.reqId || new utils_1.RequestTracer());
536
+ const wallet = await this.bitgo
537
+ .get(this.baseCoin.url('/wallet/' + params.id))
538
+ .query(query)
539
+ .result();
540
+ return new wallet_1.Wallet(this.bitgo, this.baseCoin, wallet);
541
+ }
542
+ /**
543
+ * Get a wallet by its address
544
+ * @param params
545
+ * @param params.address wallet address
546
+ * @returns {*}
547
+ */
548
+ async getWalletByAddress(params = {}) {
549
+ common.validateParams(params, ['address'], []);
550
+ this.bitgo.setRequestTracer(params.reqId || new utils_1.RequestTracer());
551
+ const wallet = await this.bitgo.get(this.baseCoin.url('/wallet/address/' + params.address)).result();
552
+ return new wallet_1.Wallet(this.bitgo, this.baseCoin, wallet);
553
+ }
554
+ /**
555
+ * For any given supported coin, get total balances for all wallets of that
556
+ * coin type on the account.
557
+ * @param params
558
+ * @returns {*}
559
+ */
560
+ async getTotalBalances(params = {}) {
561
+ return await this.bitgo.get(this.baseCoin.url('/wallet/balances')).result();
562
+ }
563
+ /**
564
+ * Generates a TSS or BLS-DKG Wallet.
565
+ * @param params
566
+ * @private
567
+ */
568
+ async generateMpcWallet(params) {
569
+ const reqId = new utils_1.RequestTracer();
570
+ this.bitgo.setRequestTracer(reqId);
571
+ const walletParams = {
572
+ label: params.label,
573
+ m: 2,
574
+ n: 3,
575
+ keys: [],
576
+ isCold: false,
577
+ multisigType: params.multisigType,
578
+ enterprise: params.enterprise,
579
+ };
580
+ // Create MPC Keychains
581
+ const keychains = await this.baseCoin.keychains().createMpc({
582
+ multisigType: params.multisigType,
583
+ passphrase: params.passphrase,
584
+ enterprise: params.enterprise,
585
+ originalPasscodeEncryptionCode: params.originalPasscodeEncryptionCode,
586
+ });
587
+ const { userKeychain, backupKeychain, bitgoKeychain } = keychains;
588
+ walletParams.keys = [userKeychain.id, backupKeychain.id, bitgoKeychain.id];
589
+ // Create Wallet
590
+ const finalWalletParams = await this.baseCoin.supplementGenerateWallet(walletParams, keychains);
591
+ const newWallet = await this.bitgo.post(this.baseCoin.url('/wallet')).send(finalWalletParams).result();
592
+ const result = {
593
+ wallet: new wallet_1.Wallet(this.bitgo, this.baseCoin, newWallet),
594
+ userKeychain,
595
+ backupKeychain,
596
+ bitgoKeychain,
597
+ };
598
+ if (!_.isUndefined(backupKeychain.prv)) {
599
+ result.warning = 'Be sure to backup the backup keychain -- it is not stored anywhere else!';
600
+ }
601
+ return result;
602
+ }
603
+ }
604
+ exports.Wallets = Wallets;
605
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCwrQ0FBeUM7QUFDekMsNkNBQStCO0FBQy9CLDBDQUE0QjtBQUM1QixtQ0FBK0M7QUFDL0MscURBQXVDO0FBR3ZDLGtDQUEwQztBQUUxQyxvQ0FBdUQ7QUFhdkQscUNBQWtDO0FBRWxDLE1BQWEsT0FBTztJQUlsQixZQUFZLEtBQWdCLEVBQUUsUUFBbUI7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBMkIsRUFBRTtRQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQTRCLEVBQUU7UUFDdkMsTUFBTSxXQUFXLEdBQXNCLEVBQUUsQ0FBQztRQUUxQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7U0FDeEQ7UUFFRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFDdEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7YUFDcEU7WUFDRCxXQUFXLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7U0FDOUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFD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VUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3Qiw4QkFBOEIsRUFBRSxNQUFNLENBQUMsOEJBQThCO1NBQ3RFLENBQUMsQ0FBQztRQUNILE1BQU0sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUNsRSxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUzRSxnQkFBZ0I7UUFDaEIsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hHLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUV2RyxNQUFNLE1BQU0sR0FBd0I7WUFDbEMsTUFBTSxFQUFFLElBQUksZUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7WUFDeEQsWUFBWTtZQUNaLGNBQWM7WUFDZCxhQUFhO1NBQ2QsQ0FBQztRQUVGLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QyxNQUFNLENBQUMsT0FBTyxHQUFHLDBFQUEwRSxDQUFDO1NBQzdGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBM3BCRCwwQkEycEJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIGJpcDMyIGZyb20gJ2JpcDMyJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHNhbml0aXplTGVnYWN5UGF0aCB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi4vLi4vY29tbW9uJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCwgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyB9IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7IEtleWNoYWluIH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgcHJvbWlzZVByb3BzLCBSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgQWNjZXB0U2hhcmVPcHRpb25zLFxuICBBZGRXYWxsZXRPcHRpb25zLFxuICBHZW5lcmF0ZU1wY1dhbGxldE9wdGlvbnMsXG4gIEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgR2V0V2FsbGV0QnlBZGRyZXNzT3B0aW9ucyxcbiAgR2V0V2FsbGV0T3B0aW9ucyxcbiAgSVdhbGxldHMsXG4gIExpc3RXYWxsZXRPcHRpb25zLFxuICBVcGRhdGVTaGFyZU9wdGlvbnMsXG4gIFdhbGxldFdpdGhLZXljaGFpbnMsXG59IGZyb20gJy4vaVdhbGxldHMnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnLi93YWxsZXQnO1xuXG5leHBvcnQgY2xhc3MgV2FsbGV0cyBpbXBsZW1lbnRzIElXYWxsZXRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbikge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgd2FsbGV0IGJ5IElEIChwcm94eSBmb3IgZ2V0V2FsbGV0KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXQocGFyYW1zOiBHZXRXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHJldHVybiB0aGlzLmdldFdhbGxldChwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYSB1c2VyJ3Mgd2FsbGV0c1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgbGlzdChwYXJhbXM6IExpc3RXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPHsgd2FsbGV0czogV2FsbGV0W10gfT4ge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0OiBMaXN0V2FsbGV0T3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5za2lwICYmIHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBza2lwIGFuZCBwcmV2SWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdldGJhbGFuY2VzKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5nZXRiYWxhbmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGdldGJhbGFuY2VzIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnlPYmplY3QuZ2V0YmFsYW5jZXMgPSBwYXJhbXMuZ2V0YmFsYW5jZXM7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnlPYmplY3QucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeU9iamVjdC5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFsbFRva2Vucykge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuYWxsVG9rZW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWxsVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnlPYmplY3QuYWxsVG9rZW5zID0gcGFyYW1zLmFsbFRva2VucztcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0JykpLnF1ZXJ5KHF1ZXJ5T2JqZWN0KS5yZXN1bHQoKSkgYXMgYW55O1xuICAgIGJvZHkud2FsbGV0cyA9IGJvZHkud2FsbGV0cy5tYXAoKHcpID0+IG5ldyBXYWxsZXQodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgdykpO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZFxuICAgKiBBZGQgYSBuZXcgd2FsbGV0IChhZHZhbmNlZCBtb2RlKS5cbiAgICogVGhpcyBhbGxvd3MgeW91IHRvIG1hbnVhbGx5IHN1Ym1pdCB0aGUga2V5cywgdHlwZSwgbSBhbmQgbiBvZiB0aGUgd2FsbGV0XG4gICAqIFBhcmFtZXRlcnMgaW5jbHVkZTpcbiAgICogICAgXCJsYWJlbFwiOiBsYWJlbCBvZiB0aGUgd2FsbGV0IHRvIGJlIHNob3duIGluIFVJXG4gICAqICAgIFwibVwiOiBudW1iZXIgb2Yga2V5cyByZXF1aXJlZCB0byB1bmxvY2sgd2FsbGV0ICgyKVxuICAgKiAgICBcIm5cIjogbnVtYmVyIG9mIGtleXMgYXZhaWxhYmxlIG9uIHRoZSB3YWxsZXQgKDMpXG4gICAqICAgIFwia2V5c1wiOiBhcnJheSBvZiBrZXljaGFpbiBpZHNcbiAgICovXG4gIGFzeW5jIGFkZChwYXJhbXM6IEFkZFdhbGxldE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbGFiZWwnLCAnZW50ZXJwcmlzZScsICd0eXBlJ10pO1xuXG4gICAgLy8gbm8gbmVlZCB0byBwYXNzIGtleXMgZm9yIChzaW5nbGUpIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAgaWYgKHBhcmFtcy50eXBlICE9PSAnY3VzdG9kaWFsJykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLmtleXMpID09PSBmYWxzZSB8fCAhXy5pc051bWJlcihwYXJhbXMubSkgfHwgIV8uaXNOdW1iZXIocGFyYW1zLm4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgdHlwZXMgb2YgbXVsdGlzaWdcbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkTW9mTlNldHVwKHBhcmFtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBtdWx0aS1zaWcgdHlwZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZ2FzUHJpY2UgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmdhc1ByaWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBnYXNQcmljZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMud2FsbGV0VmVyc2lvbiAmJiAhXy5pc051bWJlcihwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3Igd2FsbGV0VmVyc2lvbiAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMudGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy50YWdzKSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgdGFncyAtIGFycmF5IGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5jbGllbnRGbGFncyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5jbGllbnRGbGFncykgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGNsaWVudEZsYWdzIC0gYXJyYXkgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmlzQ29sZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmlzQ29sZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDb2xkIC0gYm9vbGVhbiBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaXNDdXN0b2RpYWwgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pc0N1c3RvZGlhbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaXNDdXN0b2RpYWwgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzICYmICghXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykgfHwgIXRoaXMuYmFzZUNvaW4uaXNWYWxpZEFkZHJlc3MocGFyYW1zLmFkZHJlc3MpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhZGRyZXNzIC0gdmFsaWQgYWRkcmVzcyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCB3YWxsZXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbXG4gICAgICAnbGFiZWwnLFxuICAgICAgJ20nLFxuICAgICAgJ24nLFxuICAgICAgJ2tleXMnLFxuICAgICAgJ2VudGVycHJpc2UnLFxuICAgICAgJ2lzQ29sZCcsXG4gICAgICAnaXNDdXN0b2RpYWwnLFxuICAgICAgJ3RhZ3MnLFxuICAgICAgJ2NsaWVudEZsYWdzJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdnYXNQcmljZScsXG4gICAgICAnd2FsbGV0VmVyc2lvbicsXG4gICAgXSk7XG5cbiAgICAvLyBBZGRpdGlvbmFsIHBhcmFtcyBuZWVkZWQgZm9yIHhycFxuICAgIGlmIChwYXJhbXMucm9vdFB1Yikge1xuICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQdWIgPSBwYXJhbXMucm9vdFB1YjtcbiAgICB9XG5cbiAgICAvLyBJbiBYUlAsIFhMTSBhbmQgQ1NQUiB0aGlzIHByaXZhdGUga2V5IGlzIHVzZWQgb25seSBmb3Igd2FsbGV0IGNyZWF0aW9uIHB1cnBvc2VzLFxuICAgIC8vIG9uY2UgdGhlIHdhbGxldCBpcyBpbml0aWFsaXplZCB0aGVuIHdlIHVwZGF0ZSBpdHMgd2VpZ2h0IHRvIDAgbWFraW5nIGl0IGFuIGludmFsaWQga2V5LlxuICAgIC8vIGh0dHBzOi8vd3d3LnN0ZWxsYXIub3JnL2RldmVsb3BlcnMvZ3VpZGVzL2NvbmNlcHRzL211bHRpLXNpZy5odG1sI2FkZGl0aW9uYWwtc2lnbmluZy1rZXlzXG4gICAgaWYgKHBhcmFtcy5yb290UHJpdmF0ZUtleSkge1xuICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5ID0gcGFyYW1zLnJvb3RQcml2YXRlS2V5O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaW5pdGlhbGl6YXRpb25UeHMpIHtcbiAgICAgIHdhbGxldFBhcmFtcy5pbml0aWFsaXphdGlvblR4cyA9IHBhcmFtcy5pbml0aWFsaXphdGlvblR4cztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMpIHtcbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zID0gcGFyYW1zLmRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5tdWx0aXNpZ1R5cGUpIHtcbiAgICAgIHdhbGxldFBhcmFtcy5tdWx0aXNpZ1R5cGUgPSBwYXJhbXMubXVsdGlzaWdUeXBlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldCcpKS5zZW5kKHdhbGxldFBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcgd2FsbGV0XG4gICAqIDEuIENyZWF0ZXMgdGhlIHVzZXIga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuICAgKiAyLiBJZiBubyBwdWIgd2FzIHByb3ZpZGVkLCBjcmVhdGVzIHRoZSBiYWNrdXAga2V5Y2hhaW4gbG9jYWxseSBvbiB0aGUgY2xpZW50LCBhbmQgZW5jcnlwdHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgcGFzc3BocmFzZVxuICAgKiAzLiBVcGxvYWRzIHRoZSBlbmNyeXB0ZWQgdXNlciBhbmQgYmFja3VwIGtleWNoYWlucyB0byBCaXRHb1xuICAgKiA0LiBDcmVhdGVzIHRoZSBCaXRHbyBrZXkgb24gdGhlIHNlcnZpY2VcbiAgICogNS4gQ3JlYXRlcyB0aGUgd2FsbGV0IG9uIEJpdEdvIHdpdGggdGhlIDMgcHVibGljIGtleXMgYWJvdmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmxhYmVsXG4gICAqIEBwYXJhbSBwYXJhbXMucGFzc3BocmFzZVxuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJLZXkgVXNlciB4cHViXG4gICAqIEBwYXJhbSBwYXJhbXMuYmFja3VwWHB1YiBCYWNrdXAgeHB1YlxuICAgKiBAcGFyYW0gcGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlclxuICAgKiBAcGFyYW0gcGFyYW1zLmVudGVycHJpc2VcbiAgICogQHBhcmFtIHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZVxuICAgKiBAcGFyYW0gcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZFxuICAgKiBAcGFyYW0gcGFyYW1zLmdhc1ByaWNlXG4gICAqIEBwYXJhbSBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0VmVyc2lvblxuICAgKiBAcGFyYW0gcGFyYW1zLm11bHRpc2lnVHlwZSBvcHRpb25hbCBtdWx0aXNpZyB0eXBlLCAnb25jaGFpbicgb3IgJ3Rzcycgb3IgJ2Jsc2RrZyc7IGlmIGFic2VudCwgd2Ugd2lsbCBkZWZlciB0byB0aGUgY29pbidzIGRlZmF1bHQgdHlwZVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlV2FsbGV0KHBhcmFtczogR2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldFdpdGhLZXljaGFpbnM+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2xhYmVsJ10sIFsncGFzc3BocmFzZScsICd1c2VyS2V5JywgJ2JhY2t1cFhwdWInXSk7XG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5sYWJlbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGxhYmVsJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNUc3MgPSBwYXJhbXMubXVsdGlzaWdUeXBlID8gcGFyYW1zLm11bHRpc2lnVHlwZSA9PT0gJ3RzcycgOiB0aGlzLmJhc2VDb2luLnN1cHBvcnRzVHNzKCk7XG4gICAgY29uc3QgbGFiZWwgPSBwYXJhbXMubGFiZWw7XG4gICAgY29uc3QgcGFzc3BocmFzZSA9IHBhcmFtcy5wYXNzcGhyYXNlO1xuICAgIGNvbnN0IGNhbkVuY3J5cHQgPSAhIXBhc3NwaHJhc2UgJiYgdHlwZW9mIHBhc3NwaHJhc2UgPT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IGlzQ29sZCA9ICFjYW5FbmNyeXB0IHx8ICEhcGFyYW1zLnVzZXJLZXk7XG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgbTogMixcbiAgICAgIG46IDMsXG4gICAgICBrZXlzOiBbXSxcbiAgICAgIGlzQ29sZCxcbiAgICB9O1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wYXNzY29kZUVuY3J5cHRpb25Db2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3Njb2RlRW5jcnlwdGlvbkNvZGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZW50ZXJwcmlzZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZW50ZXJwcmlzZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudGVycHJpc2UgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5lbnRlcnByaXNlID0gcGFyYW1zLmVudGVycHJpc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzVHNzKSB7XG4gICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgVFNTIGtleXMgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NvbGQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUU1MgY29sZCB3YWxsZXRzIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNUc3MoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvaW4gJHt0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpfSBkb2VzIG5vdCBzdXBwb3J0IFRTUyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNcGNXYWxsZXQoe1xuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgcGFzc3BocmFzZTogcGFzc3BocmFzZSEsXG4gICAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZTogcGFyYW1zLnBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNCbHNEa2cgPSBwYXJhbXMubXVsdGlzaWdUeXBlID8gcGFyYW1zLm11bHRpc2lnVHlwZSA9PT0gJ2Jsc2RrZycgOiB0aGlzLmJhc2VDb2luLnN1cHBvcnRzQmxzRGtnKCk7XG4gICAgaWYgKGlzQmxzRGtnKSB7XG4gICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgQkxTLURLRyBrZXlzIHdpdGhvdXQgcGFzc3BocmFzZScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNDb2xkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQkxTLURLRyBjb2xkIHdhbGxldHMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c0Jsc0RrZygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgY29pbiAke3RoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCl9IGRvZXMgbm90IHN1cHBvcnQgQkxTLURLRyBhdCB0aGlzIHRpbWVgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVNcGNXYWxsZXQoeyBtdWx0aXNpZ1R5cGU6ICdibHNka2cnLCBsYWJlbCwgcGFzc3BocmFzZTogcGFzc3BocmFzZSEgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzQmFja3VwWHB1YiA9ICEhcGFyYW1zLmJhY2t1cFhwdWI7XG4gICAgY29uc3QgaGFzQmFja3VwWHB1YlByb3ZpZGVyID0gISFwYXJhbXMuYmFja3VwWHB1YlByb3ZpZGVyO1xuICAgIGlmIChoYXNCYWNrdXBYcHViICYmIGhhc0JhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvdmlkZSBtb3JlIHRoYW4gb25lIGJhY2t1cFhwdWIgb3IgYmFja3VwWHB1YlByb3ZpZGVyIGZsYWcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdhc1ByaWNlICYmIHBhcmFtcy5laXAxNTU5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgdXNlIGJvdGggZWlwMTU1OSBhbmQgZ2FzUHJpY2UgdmFsdWVzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVUcmFuc2FjdGlvbk5vdGlmaWNhdGlvbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZGlzYWJsZVRyYW5zYWN0aW9uTm90aWZpY2F0aW9ucyA9IHBhcmFtcy5kaXNhYmxlVHJhbnNhY3Rpb25Ob3RpZmljYXRpb25zO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZ2FzUHJpY2UpKSB7XG4gICAgICBjb25zdCBnYXNQcmljZUJOID0gbmV3IEJpZ051bWJlcihwYXJhbXMuZ2FzUHJpY2UpO1xuICAgICAgaWYgKGdhc1ByaWNlQk4uaXNOYU4oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZ2FzIHByaWNlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5nYXNQcmljZSA9IGdhc1ByaWNlQk4udG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmVpcDE1NTkpICYmICFfLmlzRW1wdHkocGFyYW1zLmVpcDE1NTkpKSB7XG4gICAgICBjb25zdCBtYXhGZWVQZXJHYXNCTiA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmVpcDE1NTkubWF4RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhGZWVQZXJHYXNCTi5pc05hTigpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXggZmVlIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyIG9yIG51bWJlciBhcyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1heFByaW9yaXR5RmVlUGVyR2FzQk4gPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5laXAxNTU5Lm1heFByaW9yaXR5RmVlUGVyR2FzKTtcbiAgICAgIGlmIChtYXhQcmlvcml0eUZlZVBlckdhc0JOLmlzTmFOKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByaW9yaXR5IGZlZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlciBvciBudW1iZXIgYXMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMuZWlwMTU1OSA9IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiBtYXhGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogbWF4UHJpb3JpdHlGZWVQZXJHYXNCTi50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVLUlNFbWFpbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRpc2FibGVLUlNFbWFpbCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy5kaXNhYmxlS1JTRW1haWwgPSBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMud2FsbGV0VmVyc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldFZlcnNpb24gcHJvdmlkZWQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHdhbGxldFBhcmFtcy53YWxsZXRWZXJzaW9uID0gcGFyYW1zLndhbGxldFZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGVhY2gga3JzU3BlY2lmaWMgcGFyYW0gaXMgZWl0aGVyIGEgc3RyaW5nLCBib29sZWFuLCBvciBudW1iZXJcbiAgICBjb25zdCB7IGtyc1NwZWNpZmljIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGtyc1NwZWNpZmljKSkge1xuICAgICAgT2JqZWN0LmtleXMoa3JzU3BlY2lmaWMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSBrcnNTcGVjaWZpY1trZXldO1xuICAgICAgICBpZiAoIV8uaXNCb29sZWFuKHZhbCkgJiYgIV8uaXNTdHJpbmcodmFsKSAmJiAhXy5pc051bWJlcih2YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrcnNTcGVjaWZpYyBvYmplY3QgY29udGFpbnMgaWxsZWdhbCB2YWx1ZXMuIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MsIGJvb2xlYW5zLCBvciBudW1iZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuXG4gICAgLy8gQWRkIHRoZSB1c2VyIGtleWNoYWluXG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICBsZXQgdXNlcktleWNoYWluUGFyYW1zO1xuICAgICAgbGV0IHVzZXJLZXljaGFpbjtcbiAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdXNlciBrZXlcbiAgICAgIGlmIChwYXJhbXMudXNlcktleSkge1xuICAgICAgICB1c2VyS2V5Y2hhaW4gPSB7IHB1YjogcGFyYW1zLnVzZXJLZXkgfTtcbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zID0gdXNlcktleWNoYWluO1xuICAgICAgICBpZiAocGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgICAgIC8vIHRoZSBkZXJpdmF0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBhIGtleSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAgICAgIGtleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvbi5kZXJpdmF0aW9uUGF0aDtcbiAgICAgICAgICB1c2VyS2V5Y2hhaW4ucHViID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgICAgICAgdXNlcktleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQgPSBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWNhbkVuY3J5cHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBnZW5lcmF0ZSB1c2VyIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSB1c2VyIGtleS5cbiAgICAgICAgdXNlcktleWNoYWluID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGUoKTtcbiAgICAgICAgdXNlcktleWNoYWluLmVuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBwYXNzcGhyYXNlLCBpbnB1dDogdXNlcktleWNoYWluLnBydiB9KTtcbiAgICAgICAgdXNlcktleWNoYWluUGFyYW1zID0ge1xuICAgICAgICAgIHB1YjogdXNlcktleWNoYWluLnB1YixcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMucGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdXNlcktleWNoYWluUGFyYW1zLnJlcUlkID0gcmVxSWQ7XG4gICAgICBjb25zdCBuZXdVc2VyS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmFkZCh1c2VyS2V5Y2hhaW5QYXJhbXMpO1xuICAgICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBuZXdVc2VyS2V5Y2hhaW4sIHVzZXJLZXljaGFpbik7XG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IGFzeW5jICgpOiBQcm9taXNlPEtleWNoYWluPiA9PiB7XG4gICAgICBpZiAocGFyYW1zLmJhY2t1cFhwdWJQcm92aWRlcikge1xuICAgICAgICAvLyBJZiByZXF1ZXN0ZWQsIHVzZSBhIEtSUyBvciBiYWNrdXAga2V5IHByb3ZpZGVyXG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJhY2t1cCh7XG4gICAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5iYWNrdXBYcHViUHJvdmlkZXIgfHwgJ2RlZmF1bHRSTUdCYWNrdXBQcm92aWRlcicsXG4gICAgICAgICAgZGlzYWJsZUtSU0VtYWlsOiBwYXJhbXMuZGlzYWJsZUtSU0VtYWlsLFxuICAgICAgICAgIGtyc1NwZWNpZmljOiBwYXJhbXMua3JzU3BlY2lmaWMsXG4gICAgICAgICAgdHlwZTogdGhpcy5iYXNlQ29pbi5nZXRDaGFpbigpLFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlciBwcm92aWRlZCBiYWNrdXAgeHB1YlxuICAgICAgaWYgKHBhcmFtcy5iYWNrdXBYcHViKSB7XG4gICAgICAgIC8vIHVzZXIgcHJvdmlkZWQgYmFja3VwIGV0aGVyZXVtIGFkZHJlc3NcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuYWRkKHtcbiAgICAgICAgICBwdWI6IHBhcmFtcy5iYWNrdXBYcHViLFxuICAgICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFjYW5FbmNyeXB0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZ2VuZXJhdGUgYmFja3VwIGtleXBhaXIgd2l0aG91dCBwYXNzcGhyYXNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gcHJvdmlkZWQgYmFja3VwIHhwdWIgb3IgYWRkcmVzcywgc28gZGVmYXVsdCB0byBjcmVhdGluZyBvbmUgaGVyZVxuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5jcmVhdGVCYWNrdXAoeyByZXFJZCB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgeyB1c2VyS2V5Y2hhaW4sIGJhY2t1cEtleWNoYWluLCBiaXRnb0tleWNoYWluIH06IEtleWNoYWluc1RyaXBsZXQgPSBhd2FpdCBwcm9taXNlUHJvcHMoe1xuICAgICAgdXNlcktleWNoYWluOiB1c2VyS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICBiYWNrdXBLZXljaGFpbjogYmFja3VwS2V5Y2hhaW5Qcm9taXNlKCksXG4gICAgICBiaXRnb0tleWNoYWluOiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZUJpdEdvKHsgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsIHJlcUlkIH0pLFxuICAgIH0pO1xuXG4gICAgd2FsbGV0UGFyYW1zLmtleXMgPSBbdXNlcktleWNoYWluLmlkLCBiYWNrdXBLZXljaGFpbi5pZCwgYml0Z29LZXljaGFpbi5pZF07XG5cbiAgICB3YWxsZXRQYXJhbXMuaXNDb2xkID0gaXNDb2xkO1xuXG4gICAgY29uc3QgeyBwcnYgfSA9IHVzZXJLZXljaGFpbjtcbiAgICBpZiAoXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICB3YWxsZXRQYXJhbXMua2V5U2lnbmF0dXJlcyA9IHtcbiAgICAgICAgYmFja3VwOiAoYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydiB9LCBiYWNrdXBLZXljaGFpbi5wdWIpKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGJpdGdvOiAoYXdhaXQgdGhpcy5iYXNlQ29pbi5zaWduTWVzc2FnZSh7IHBydiB9LCBiaXRnb0tleWNoYWluLnB1YikpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKF8uaW5jbHVkZXMoWyd4cnAnLCAneGxtJywgJ2NzcHInXSwgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLnJvb3RQcml2YXRlS2V5KSkge1xuICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5ID0gcGFyYW1zLnJvb3RQcml2YXRlS2V5O1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgbmV3V2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0JykpLnNlbmQoZmluYWxXYWxsZXRQYXJhbXMpLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBXYWxsZXRXaXRoS2V5Y2hhaW5zID0ge1xuICAgICAgd2FsbGV0OiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIG5ld1dhbGxldCksXG4gICAgICB1c2VyS2V5Y2hhaW46IHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluOiBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYWNrdXBLZXljaGFpbi5wcnYpKSB7XG4gICAgICByZXN1bHQud2FybmluZyA9ICdCZSBzdXJlIHRvIGJhY2t1cCB0aGUgYmFja3VwIGtleWNoYWluIC0tIGl0IGlzIG5vdCBzdG9yZWQgYW55d2hlcmUgZWxzZSEnO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChkZXJpdmF0aW9uUGF0aCkpIHtcbiAgICAgIHVzZXJLZXljaGFpbi5kZXJpdmF0aW9uUGF0aCA9IGRlcml2YXRpb25QYXRoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdXNlcidzIHdhbGxldCBzaGFyZXNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFNoYXJlcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldHNoYXJlJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB3YWxsZXQgc2hhcmUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNoYXJpbmcga2V5Y2hhaW4uIHJlcXVpcmVzIHVubG9jayBpZiBrZXljaGFpbiBpcyBwcmVzZW50LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgdG8gZ2V0IGluZm9ybWF0aW9uIG9uXG4gICAqL1xuICBhc3luYyBnZXRTaGFyZShwYXJhbXM6IHsgd2FsbGV0U2hhcmVJZD86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0U2hhcmVJZCddLCBbXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHBhcmFtcy5zdGF0ZSAtIHRoZSBuZXcgc3RhdGUgb2YgdGhlIHdhbGxldCBzaGFyZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyB1cGRhdGVTaGFyZShwYXJhbXM6IFVwZGF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0c2hhcmUvJyArIHBhcmFtcy53YWxsZXRTaGFyZUlkKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmQgYSB3YWxsZXQgc2hhcmUgaW52aXRhdGlvbiBlbWFpbFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0U2hhcmVJZCAtIHRoZSB3YWxsZXQgc2hhcmUgd2hvc2UgaW52aXRpYXRpb24gc2hvdWxkIGJlIHJlc2VudFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kU2hhcmVJbnZpdGUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgY29uc3QgdXJsUGFydHMgPSBwYXJhbXMud2FsbGV0U2hhcmVJZCArICcvcmVzZW5kZW1haWwnO1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgdXJsUGFydHMpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgYSB3YWxsZXQgc2hhcmVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFNoYXJlSWQgLSB0aGUgd2FsbGV0IHNoYXJlIHRvIHVwZGF0ZVxuICAgKi9cbiAgYXN5bmMgY2FuY2VsU2hhcmUocGFyYW1zOiB7IHdhbGxldFNoYXJlSWQ/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dhbGxldFNoYXJlSWQnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5kZWwodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXRzaGFyZS8nICsgcGFyYW1zLndhbGxldFNoYXJlSWQpKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSB3YWxsZXQgc2hhcmUsIGFkZGluZyB0aGUgd2FsbGV0IHRvIHRoZSB1c2VyJ3MgbGlzdFxuICAgKiBOZWVkcyBhIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQga2V5XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRTaGFyZUlkIC0gdGhlIHdhbGxldCBzaGFyZSB0byBhY2NlcHRcbiAgICogQHBhcmFtIHBhcmFtcy51c2VyUGFzc3dvcmQgLSAocmVxdWlyZWQgaWYgbW9yZSBhIGtleWNoYWluIHdhcyBzaGFyZWQpIHVzZXIncyBwYXNzd29yZCB0byBkZWNyeXB0IHRoZSBzaGFyZWQgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXMubmV3V2FsbGV0UGFzc3BocmFzZSAtIG5ldyB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2F2aW5nIHRoZSBzaGFyZWQgd2FsbGV0IHBydi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbGVmdCBibGFuayBhbmQgYSB3YWxsZXQgd2l0aCBtb3JlIHRoYW4gdmlldyBwZXJtaXNzaW9ucyB3YXMgc2hhcmVkLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSB1c2VyJ3MgbG9naW4gcGFzc3dvcmQgaXMgdXNlZC5cbiAgICogQHBhcmFtIHBhcmFtcy5vdmVycmlkZUVuY3J5cHRlZFBydiAtIHNldCBvbmx5IGlmIHRoZSBwcnYgd2FzIHJlY2VpdmVkIG91dC1vZi1iYW5kLlxuICAgKi9cbiAgYXN5bmMgYWNjZXB0U2hhcmUocGFyYW1zOiBBY2NlcHRTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRTaGFyZUlkJ10sIFsnb3ZlcnJpZGVFbmNyeXB0ZWRQcnYnLCAndXNlclBhc3N3b3JkJywgJ25ld1dhbGxldFBhc3NwaHJhc2UnXSk7XG5cbiAgICBsZXQgZW5jcnlwdGVkUHJ2ID0gcGFyYW1zLm92ZXJyaWRlRW5jcnlwdGVkUHJ2O1xuXG4gICAgY29uc3Qgd2FsbGV0U2hhcmUgPSAoYXdhaXQgdGhpcy5nZXRTaGFyZSh7IHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkIH0pKSBhcyBhbnk7XG5cbiAgICAvLyBSZXR1cm4gcmlnaHQgYXdheSBpZiB0aGVyZSBpcyBubyBrZXljaGFpbiB0byBkZWNyeXB0LCBvciBpZiBleHBsaWNpdCBlbmNyeXB0ZWRQcnYgd2FzIHByb3ZpZGVkXG4gICAgaWYgKCF3YWxsZXRTaGFyZS5rZXljaGFpbiB8fCAhd2FsbGV0U2hhcmUua2V5Y2hhaW4uZW5jcnlwdGVkUHJ2IHx8IGVuY3J5cHRlZFBydikge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiBwYXJhbXMud2FsbGV0U2hhcmVJZCxcbiAgICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBNb3JlIHRoYW4gdmlld2luZyB3YXMgcmVxdWVzdGVkLCBzbyB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHdhbGxldCBrZXlzIHVzaW5nIHRoZSBzaGFyZWQgZWNkaCBzY2hlbWVcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlclBhc3N3b3JkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFzc3dvcmQgcGFyYW0gbXVzdCBiZSBwcm92aWRlZCB0byBkZWNyeXB0IHNoYXJlZCBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nS2V5Y2hhaW4gPSAoYXdhaXQgdGhpcy5iaXRnby5nZXRFQ0RIU2hhcmluZ0tleWNoYWluKCkpIGFzIGFueTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChzaGFyaW5nS2V5Y2hhaW4uZW5jcnlwdGVkWHBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW5jcnlwdGVkWHBydiB3YXMgbm90IGZvdW5kIG9uIHNoYXJpbmcga2V5Y2hhaW4nKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSB0aGUgc2hhcmluZyBrZXljaGFpbiwgd2UgY2FuIHdvcmsgb3V0IHRoZSBzZWNyZXQgdXNlZCBmb3Igc2hhcmluZyB0aGUgd2FsbGV0IHdpdGggdXNcbiAgICBzaGFyaW5nS2V5Y2hhaW4ucHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBwYXJhbXMudXNlclBhc3N3b3JkLFxuICAgICAgaW5wdXQ6IHNoYXJpbmdLZXljaGFpbi5lbmNyeXB0ZWRYcHJ2LFxuICAgIH0pO1xuICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChcbiAgICAgIC8vIERlcml2ZSBrZXkgYnkgcGF0aCAod2hpY2ggaXMgdXNlZCBiZXR3ZWVuIHRoZXNlIDIgdXNlcnMgb25seSlcbiAgICAgIGJpcDMyLmZyb21CYXNlNTgoc2hhcmluZ0tleWNoYWluLnBydikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgod2FsbGV0U2hhcmUua2V5Y2hhaW4ucGF0aCkpLFxuICAgICAgQnVmZmVyLmZyb20od2FsbGV0U2hhcmUua2V5Y2hhaW4uZnJvbVB1YktleSwgJ2hleCcpXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAvLyBZZXMhIFdlIGdvdCB0aGUgc2VjcmV0IHN1Y2Nlc3NmdWxseSBoZXJlLCBub3cgZGVjcnlwdCB0aGUgc2hhcmVkIHdhbGxldCBwcnZcbiAgICBjb25zdCBkZWNyeXB0ZWRTaGFyZWRXYWxsZXRQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgcGFzc3dvcmQ6IHNlY3JldCxcbiAgICAgIGlucHV0OiB3YWxsZXRTaGFyZS5rZXljaGFpbi5lbmNyeXB0ZWRQcnYsXG4gICAgfSk7XG5cbiAgICAvLyBXZSB3aWxsIG5vdyByZS1lbmNyeXB0IHRoZSB3YWxsZXQgd2l0aCBvdXIgb3duIHBhc3N3b3JkXG4gICAgY29uc3QgbmV3V2FsbGV0UGFzc3BocmFzZSA9IHBhcmFtcy5uZXdXYWxsZXRQYXNzcGhyYXNlIHx8IHBhcmFtcy51c2VyUGFzc3dvcmQ7XG4gICAgZW5jcnlwdGVkUHJ2ID0gdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIHBhc3N3b3JkOiBuZXdXYWxsZXRQYXNzcGhyYXNlLFxuICAgICAgaW5wdXQ6IGRlY3J5cHRlZFNoYXJlZFdhbGxldFBydixcbiAgICB9KTtcbiAgICBjb25zdCB1cGRhdGVQYXJhbXM6IFVwZGF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHdhbGxldFNoYXJlSWQ6IHBhcmFtcy53YWxsZXRTaGFyZUlkLFxuICAgICAgc3RhdGU6ICdhY2NlcHRlZCcsXG4gICAgfTtcblxuICAgIGlmIChlbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHVwZGF0ZVBhcmFtcy5lbmNyeXB0ZWRQcnYgPSBlbmNyeXB0ZWRQcnY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlU2hhcmUodXBkYXRlUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB3YWxsZXQgYnkgaXRzIElEXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5pZCB3YWxsZXQgaWRcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRXYWxsZXQocGFyYW1zOiBHZXRXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10pO1xuXG4gICAgY29uc3QgcXVlcnk6IEdldFdhbGxldE9wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zLmFsbFRva2Vucykge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuYWxsVG9rZW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWxsVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuYWxsVG9rZW5zID0gcGFyYW1zLmFsbFRva2VucztcbiAgICB9XG5cbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCkpO1xuXG4gICAgY29uc3Qgd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgcGFyYW1zLmlkKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCB3YWxsZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHdhbGxldCBieSBpdHMgYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyB3YWxsZXQgYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFdhbGxldEJ5QWRkcmVzcyhwYXJhbXM6IEdldFdhbGxldEJ5QWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8V2FsbGV0PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdKTtcblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSk7XG5cbiAgICBjb25zdCB3YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC9hZGRyZXNzLycgKyBwYXJhbXMuYWRkcmVzcykpLnJlc3VsdCgpO1xuICAgIHJldHVybiBuZXcgV2FsbGV0KHRoaXMuYml0Z28sIHRoaXMuYmFzZUNvaW4sIHdhbGxldCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBnaXZlbiBzdXBwb3J0ZWQgY29pbiwgZ2V0IHRvdGFsIGJhbGFuY2VzIGZvciBhbGwgd2FsbGV0cyBvZiB0aGF0XG4gICAqIGNvaW4gdHlwZSBvbiB0aGUgYWNjb3VudC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFRvdGFsQmFsYW5jZXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0L2JhbGFuY2VzJykpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFRTUyBvciBCTFMtREtHIFdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZU1wY1dhbGxldChwYXJhbXM6IEdlbmVyYXRlTXBjV2FsbGV0T3B0aW9ucyk6IFByb21pc2U8V2FsbGV0V2l0aEtleWNoYWlucz4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgY29uc3Qgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zID0ge1xuICAgICAgbGFiZWw6IHBhcmFtcy5sYWJlbCxcbiAgICAgIG06IDIsXG4gICAgICBuOiAzLFxuICAgICAga2V5czogW10sXG4gICAgICBpc0NvbGQ6IGZhbHNlLFxuICAgICAgbXVsdGlzaWdUeXBlOiBwYXJhbXMubXVsdGlzaWdUeXBlLFxuICAgICAgZW50ZXJwcmlzZTogcGFyYW1zLmVudGVycHJpc2UsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBNUEMgS2V5Y2hhaW5zXG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmNyZWF0ZU1wYyh7XG4gICAgICBtdWx0aXNpZ1R5cGU6IHBhcmFtcy5tdWx0aXNpZ1R5cGUsXG4gICAgICBwYXNzcGhyYXNlOiBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIGVudGVycHJpc2U6IHBhcmFtcy5lbnRlcnByaXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgIH0pO1xuICAgIGNvbnN0IHsgdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbiB9ID0ga2V5Y2hhaW5zO1xuICAgIHdhbGxldFBhcmFtcy5rZXlzID0gW3VzZXJLZXljaGFpbi5pZCwgYmFja3VwS2V5Y2hhaW4uaWQsIGJpdGdvS2V5Y2hhaW4uaWRdO1xuXG4gICAgLy8gQ3JlYXRlIFdhbGxldFxuICAgIGNvbnN0IGZpbmFsV2FsbGV0UGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5zdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQod2FsbGV0UGFyYW1zLCBrZXljaGFpbnMpO1xuICAgIGNvbnN0IG5ld1dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldCcpKS5zZW5kKGZpbmFsV2FsbGV0UGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogV2FsbGV0V2l0aEtleWNoYWlucyA9IHtcbiAgICAgIHdhbGxldDogbmV3IFdhbGxldCh0aGlzLmJpdGdvLCB0aGlzLmJhc2VDb2luLCBuZXdXYWxsZXQpLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgIH07XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmFja3VwS2V5Y2hhaW4ucHJ2KSkge1xuICAgICAgcmVzdWx0Lndhcm5pbmcgPSAnQmUgc3VyZSB0byBiYWNrdXAgdGhlIGJhY2t1cCBrZXljaGFpbiAtLSBpdCBpcyBub3Qgc3RvcmVkIGFueXdoZXJlIGVsc2UhJztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=