@bitgo-beta/sdk-core 8.2.1-beta.202 → 8.2.1-beta.2021

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (732) hide show
  1. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
  2. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
  4. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
  5. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
  6. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
  7. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
  8. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +41 -29
  9. package/dist/src/account-lib/baseCoin/enum.d.ts +58 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +109 -10
  12. package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
  13. package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
  14. package/dist/src/account-lib/baseCoin/errors.js +8 -2
  15. package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
  16. package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
  17. package/dist/src/account-lib/baseCoin/iface.js +26 -18
  18. package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
  19. package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
  20. package/dist/src/account-lib/baseCoin/index.js +8 -5
  21. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
  22. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  23. package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
  24. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
  25. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  26. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
  27. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
  28. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  29. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
  30. package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
  31. package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
  32. package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
  33. package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
  34. package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
  35. package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
  36. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
  37. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
  38. package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
  39. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
  40. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
  41. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
  42. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
  43. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
  44. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
  45. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
  46. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
  47. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
  48. package/dist/src/account-lib/index.js +23 -9
  49. package/dist/src/account-lib/mpc/index.d.ts +1 -1
  50. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  51. package/dist/src/account-lib/mpc/index.js +6 -2
  52. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
  53. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  54. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
  55. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  56. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  57. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  58. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  59. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
  60. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  61. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  62. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
  63. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  64. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  65. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  66. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
  67. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  68. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  69. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  70. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  71. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  72. package/dist/src/account-lib/mpc/util.js +24 -1
  73. package/dist/src/account-lib/staking/index.js +6 -2
  74. package/dist/src/account-lib/staking/utils.js +3 -3
  75. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  76. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  77. package/dist/src/account-lib/util/crypto.js +69 -38
  78. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
  79. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  80. package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
  81. package/dist/src/api/bip32path.js +2 -3
  82. package/dist/src/api/index.js +6 -2
  83. package/dist/src/api/types.d.ts +31 -0
  84. package/dist/src/api/types.d.ts.map +1 -1
  85. package/dist/src/api/types.js +1 -1
  86. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -1
  87. package/dist/src/bitgo/address-book/address-book.js +20 -12
  88. package/dist/src/bitgo/address-book/index.js +6 -2
  89. package/dist/src/bitgo/address-book/types.d.ts +36 -36
  90. package/dist/src/bitgo/address-book/types.d.ts.map +1 -1
  91. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +123 -12
  92. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  93. package/dist/src/bitgo/baseCoin/baseCoin.js +203 -16
  94. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +290 -27
  95. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  96. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  97. package/dist/src/bitgo/baseCoin/index.js +6 -2
  98. package/dist/src/bitgo/bip32util.d.ts +3 -16
  99. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  100. package/dist/src/bitgo/bip32util.js +4 -56
  101. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  102. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  103. package/dist/src/bitgo/bitcoin.js +26 -13
  104. package/dist/src/bitgo/bitgoBase.d.ts +17 -4
  105. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  106. package/dist/src/bitgo/bitgoBase.js +1 -1
  107. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  108. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  109. package/dist/src/bitgo/coinFactory.js +26 -3
  110. package/dist/src/bitgo/config.d.ts +3 -101
  111. package/dist/src/bitgo/config.d.ts.map +1 -1
  112. package/dist/src/bitgo/config.js +26 -15
  113. package/dist/src/bitgo/defi/defiVault.d.ts +137 -0
  114. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  115. package/dist/src/bitgo/defi/defiVault.js +379 -0
  116. package/dist/src/bitgo/defi/iDefiVault.d.ts +81 -0
  117. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  118. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  119. package/dist/src/bitgo/defi/index.d.ts +3 -0
  120. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  121. package/dist/src/bitgo/defi/index.js +22 -0
  122. package/dist/src/bitgo/ecdh.d.ts +0 -1
  123. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  124. package/dist/src/bitgo/ecdh.js +26 -13
  125. package/dist/src/bitgo/enterprise/enterprise.d.ts +9 -4
  126. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  127. package/dist/src/bitgo/enterprise/enterprise.js +47 -21
  128. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  129. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +5 -3
  130. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  131. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  132. package/dist/src/bitgo/enterprise/index.js +6 -2
  133. package/dist/src/bitgo/environments.d.ts +68 -3
  134. package/dist/src/bitgo/environments.d.ts.map +1 -1
  135. package/dist/src/bitgo/environments.js +414 -34
  136. package/dist/src/bitgo/errors.d.ts +182 -1
  137. package/dist/src/bitgo/errors.d.ts.map +1 -1
  138. package/dist/src/bitgo/errors.js +177 -3
  139. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  140. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  141. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  142. package/dist/src/bitgo/index.d.ts +5 -1
  143. package/dist/src/bitgo/index.d.ts.map +1 -1
  144. package/dist/src/bitgo/index.js +31 -11
  145. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  146. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  147. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  148. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  149. package/dist/src/bitgo/internal/index.js +6 -2
  150. package/dist/src/bitgo/internal/internal.js +5 -6
  151. package/dist/src/bitgo/internal/keycard.d.ts +12 -8
  152. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  153. package/dist/src/bitgo/internal/keycard.js +60 -48
  154. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
  155. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  156. package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
  157. package/dist/src/bitgo/keychain/iKeychains.d.ts +128 -11
  158. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  159. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  160. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  161. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  162. package/dist/src/bitgo/keychain/index.js +7 -2
  163. package/dist/src/bitgo/keychain/keychains.d.ts +55 -7
  164. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  165. package/dist/src/bitgo/keychain/keychains.js +282 -52
  166. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  167. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  168. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  169. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  170. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  171. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  172. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  173. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  174. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  175. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  176. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  177. package/dist/src/bitgo/market/index.js +6 -2
  178. package/dist/src/bitgo/market/markets.js +23 -9
  179. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +5 -1
  180. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  181. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  182. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  183. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  184. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  185. package/dist/src/bitgo/pendingApproval/pendingApproval.js +246 -111
  186. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  187. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  188. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  189. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  190. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  191. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  192. package/dist/src/bitgo/proofs/index.js +6 -0
  193. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  194. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  195. package/dist/src/bitgo/proofs/types.js +80 -0
  196. package/dist/src/bitgo/recovery/index.js +6 -2
  197. package/dist/src/bitgo/recovery/initiate.d.ts +13 -3
  198. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  199. package/dist/src/bitgo/recovery/initiate.js +49 -41
  200. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +88 -0
  201. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  202. package/dist/src/bitgo/safe/derivableEd25519Pub.js +204 -0
  203. package/dist/src/bitgo/safe/iSafe.d.ts +87 -0
  204. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
  205. package/dist/src/bitgo/safe/iSafe.js +3 -0
  206. package/dist/src/bitgo/safe/iSafes.d.ts +94 -0
  207. package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
  208. package/dist/src/bitgo/safe/iSafes.js +3 -0
  209. package/dist/src/bitgo/safe/index.d.ts +7 -0
  210. package/dist/src/bitgo/safe/index.d.ts.map +1 -0
  211. package/dist/src/bitgo/safe/index.js +23 -0
  212. package/dist/src/bitgo/safe/safe.d.ts +61 -0
  213. package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
  214. package/dist/src/bitgo/safe/safe.js +230 -0
  215. package/dist/src/bitgo/safe/safeDerivation.d.ts +30 -0
  216. package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -0
  217. package/dist/src/bitgo/safe/safeDerivation.js +122 -0
  218. package/dist/src/bitgo/safe/safes.d.ts +107 -0
  219. package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
  220. package/dist/src/bitgo/safe/safes.js +315 -0
  221. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  222. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  223. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  224. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  225. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  226. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  227. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  228. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  229. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  230. package/dist/src/bitgo/staking/iStakingWallet.d.ts +157 -8
  231. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  232. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  233. package/dist/src/bitgo/staking/index.d.ts +3 -0
  234. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  235. package/dist/src/bitgo/staking/index.js +9 -2
  236. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  237. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  238. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  239. package/dist/src/bitgo/trading/iTradingAccount.d.ts +13 -1
  240. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  241. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  242. package/dist/src/bitgo/trading/index.d.ts +1 -0
  243. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  244. package/dist/src/bitgo/trading/index.js +7 -2
  245. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  246. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  247. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  248. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  249. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  250. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  251. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  252. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  253. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  254. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  255. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  256. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  257. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  258. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  259. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  260. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  261. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  262. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  263. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  264. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  265. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  266. package/dist/src/bitgo/trading/network/index.d.ts +2 -0
  267. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -1
  268. package/dist/src/bitgo/trading/network/index.js +8 -2
  269. package/dist/src/bitgo/trading/network/network.d.ts +4 -3
  270. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
  271. package/dist/src/bitgo/trading/network/network.js +24 -27
  272. package/dist/src/bitgo/trading/network/types.d.ts +79 -46
  273. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
  274. package/dist/src/bitgo/trading/network/types.js +1 -1
  275. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  276. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  277. package/dist/src/bitgo/trading/network/utils.js +54 -0
  278. package/dist/src/bitgo/trading/tradingAccount.d.ts +15 -1
  279. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  280. package/dist/src/bitgo/trading/tradingAccount.js +55 -7
  281. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +49 -0
  282. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  283. package/dist/src/bitgo/tss/bitgoPubKeys.js +92 -0
  284. package/dist/src/bitgo/tss/common.d.ts +41 -6
  285. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  286. package/dist/src/bitgo/tss/common.js +124 -17
  287. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  288. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  289. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  290. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  291. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  292. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  293. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  294. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  295. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  296. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  297. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  298. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  299. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  300. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  301. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  302. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +42 -0
  303. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  304. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +104 -0
  305. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  306. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  307. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  308. package/dist/src/bitgo/tss/index.d.ts +3 -2
  309. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  310. package/dist/src/bitgo/tss/index.js +26 -10
  311. package/dist/src/bitgo/tss/types.d.ts +3 -3
  312. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  313. package/dist/src/bitgo/tss/types.js +2 -2
  314. package/dist/src/bitgo/types.d.ts +3 -3
  315. package/dist/src/bitgo/types.d.ts.map +1 -1
  316. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +10 -0
  317. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  318. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +76 -14
  319. package/dist/src/bitgo/utils/codecProps.js +24 -11
  320. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  321. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  322. package/dist/src/bitgo/utils/codecs.js +59 -0
  323. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  324. package/dist/src/bitgo/utils/decode.js +30 -16
  325. package/dist/src/bitgo/utils/index.d.ts +4 -2
  326. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  327. package/dist/src/bitgo/utils/index.js +27 -11
  328. package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
  329. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  330. package/dist/src/bitgo/utils/messageTypes.js +17 -0
  331. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  332. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  333. package/dist/src/bitgo/utils/mpcUtils.js +175 -14
  334. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  335. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  336. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  337. package/dist/src/bitgo/utils/opengpgUtils.d.ts +11 -7
  338. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  339. package/dist/src/bitgo/utils/opengpgUtils.js +79 -62
  340. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  341. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  342. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  343. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  344. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  345. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  346. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  347. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  348. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  349. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  350. package/dist/src/bitgo/utils/triple.js +2 -3
  351. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  352. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  353. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  354. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +94 -17
  355. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  356. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +305 -45
  357. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +432 -55
  358. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  359. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  360. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  361. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  362. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  363. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  364. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  365. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  366. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +25 -51
  367. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  368. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +173 -246
  369. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +216 -0
  370. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  371. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1053 -0
  372. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  373. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  374. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +16 -0
  375. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  376. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  377. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  378. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  379. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  380. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  381. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  382. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  383. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  384. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  385. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  386. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  387. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  388. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  389. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  390. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +38 -11
  391. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  392. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +254 -96
  393. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +204 -0
  394. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  395. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +862 -0
  396. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  397. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  398. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +16 -0
  399. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
  400. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  401. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
  402. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +12 -7
  403. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  404. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  405. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  406. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  407. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  408. package/dist/src/bitgo/utils/tss/index.d.ts +5 -0
  409. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  410. package/dist/src/bitgo/utils/tss/index.js +29 -10
  411. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  412. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  413. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  414. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +41 -0
  415. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  416. package/dist/src/bitgo/utils/tss/recipientUtils.js +142 -0
  417. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts +29 -0
  418. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts.map +1 -0
  419. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.js +126 -0
  420. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts +4 -0
  421. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts.map +1 -0
  422. package/dist/src/bitgo/utils/tss/redpallas/index.js +20 -0
  423. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +27 -0
  424. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  425. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.js +43 -0
  426. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts +45 -0
  427. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -0
  428. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.js +55 -0
  429. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts +8 -0
  430. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts.map +1 -0
  431. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.js +13 -0
  432. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts +12 -0
  433. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts.map +1 -0
  434. package/dist/src/bitgo/utils/tss/signableConsistency.js +9 -0
  435. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  436. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  437. package/dist/src/bitgo/utils/txRequest.js +49 -0
  438. package/dist/src/bitgo/utils/util.js +24 -10
  439. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  440. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  441. package/dist/src/bitgo/utils/wallet.js +48 -0
  442. package/dist/src/bitgo/v1Wallets.d.ts +170 -0
  443. package/dist/src/bitgo/v1Wallets.d.ts.map +1 -0
  444. package/dist/src/bitgo/v1Wallets.js +3 -0
  445. package/dist/src/bitgo/wallet/BuildParams.d.ts +81 -1
  446. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  447. package/dist/src/bitgo/wallet/BuildParams.js +85 -11
  448. package/dist/src/bitgo/wallet/iWallet.d.ts +580 -31
  449. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  450. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  451. package/dist/src/bitgo/wallet/iWallets.d.ts +310 -16
  452. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  453. package/dist/src/bitgo/wallet/iWallets.js +84 -3
  454. package/dist/src/bitgo/wallet/index.d.ts +1 -0
  455. package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
  456. package/dist/src/bitgo/wallet/index.js +7 -2
  457. package/dist/src/bitgo/wallet/safeKeychain.d.ts +52 -0
  458. package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -0
  459. package/dist/src/bitgo/wallet/safeKeychain.js +97 -0
  460. package/dist/src/bitgo/wallet/wallet.d.ts +365 -28
  461. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  462. package/dist/src/bitgo/wallet/wallet.js +2202 -381
  463. package/dist/src/bitgo/wallet/wallets.d.ts +93 -4
  464. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  465. package/dist/src/bitgo/wallet/wallets.js +1242 -155
  466. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  467. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  468. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  469. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  470. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  471. package/dist/src/bitgo/walletUtil/index.js +19 -0
  472. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  473. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  474. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  475. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  476. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  477. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  478. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  479. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  480. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  481. package/dist/src/bitgo/webhook/index.js +6 -2
  482. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  483. package/dist/src/coins/fiat.d.ts +45 -0
  484. package/dist/src/coins/fiat.d.ts.map +1 -0
  485. package/dist/src/coins/fiat.js +94 -0
  486. package/dist/src/coins/index.d.ts +1 -6
  487. package/dist/src/coins/index.d.ts.map +1 -1
  488. package/dist/src/coins/index.js +7 -8
  489. package/dist/src/coins/ofc.d.ts +21 -2
  490. package/dist/src/coins/ofc.d.ts.map +1 -1
  491. package/dist/src/coins/ofc.js +29 -3
  492. package/dist/src/coins/ofcToken.d.ts +15 -4
  493. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  494. package/dist/src/coins/ofcToken.js +43 -5
  495. package/dist/src/coins/susd.d.ts +3 -2
  496. package/dist/src/coins/susd.d.ts.map +1 -1
  497. package/dist/src/coins/susd.js +5 -1
  498. package/dist/src/common.js +27 -13
  499. package/dist/src/index.d.ts +9 -1
  500. package/dist/src/index.d.ts.map +1 -1
  501. package/dist/src/index.js +40 -11
  502. package/dist/src/lightning.d.ts +20 -0
  503. package/dist/src/lightning.d.ts.map +1 -0
  504. package/dist/src/lightning.js +13 -0
  505. package/dist/src/units.js +5 -6
  506. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  507. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  508. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  509. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  510. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  511. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  512. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  513. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  514. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  515. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  516. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  517. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  518. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  519. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  520. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  521. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  522. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  523. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  524. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  525. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  526. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  527. package/dist/test/unit/bitgo/defi/defiVault.js +600 -0
  528. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  529. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  530. package/dist/test/unit/bitgo/environment.js +38 -0
  531. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  532. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  533. package/dist/test/unit/bitgo/errors.js +262 -0
  534. package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
  535. package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
  536. package/dist/test/unit/bitgo/keychain/keychains.js +138 -0
  537. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  538. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  539. package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
  540. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts +2 -0
  541. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  542. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +137 -0
  543. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +197 -0
  544. package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
  545. package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
  546. package/dist/test/unit/bitgo/safe/safe.js +277 -0
  547. package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
  548. package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
  549. package/dist/test/unit/bitgo/safe/safes.js +364 -0
  550. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  551. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  552. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  553. package/dist/test/unit/bitgo/trading/network/network.test.d.ts +2 -0
  554. package/dist/test/unit/bitgo/trading/network/network.test.d.ts.map +1 -0
  555. package/dist/test/unit/bitgo/trading/network/network.test.js +136 -0
  556. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  557. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  558. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  559. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts +2 -0
  560. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  561. package/dist/test/unit/bitgo/tss/bitgoPubKeys.js +66 -0
  562. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -4
  563. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  564. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  565. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  566. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts +2 -0
  567. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts.map +1 -0
  568. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.js +106 -0
  569. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  570. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  571. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  572. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  573. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  574. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  575. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  576. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  577. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  578. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +348 -0
  579. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  580. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  581. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  582. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  583. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  584. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +999 -0
  585. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  586. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  587. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  588. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  589. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  590. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  591. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  592. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  593. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1918 -0
  594. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  595. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  596. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  597. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  598. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  599. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  600. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  601. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  602. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +374 -0
  603. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  604. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  605. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.js +80 -0
  606. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts +2 -0
  607. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts.map +1 -0
  608. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.js +279 -0
  609. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts +2 -0
  610. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts.map +1 -0
  611. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.js +111 -0
  612. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  613. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  614. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  615. package/dist/test/unit/bitgo/utils/wallet.d.ts +2 -0
  616. package/dist/test/unit/bitgo/utils/wallet.d.ts.map +1 -0
  617. package/dist/test/unit/bitgo/utils/wallet.js +55 -0
  618. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  619. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  620. package/dist/test/unit/bitgo/wallet/BuildParams.js +141 -0
  621. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +79 -9
  622. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  623. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  624. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  625. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
  626. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
  627. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
  628. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  629. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  630. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  631. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  632. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  633. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  634. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  635. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  636. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  637. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts +2 -0
  638. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts.map +1 -0
  639. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.js +20 -0
  640. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  641. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  642. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  643. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts +5 -0
  644. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts.map +1 -0
  645. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +671 -0
  646. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  647. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  648. package/dist/test/unit/bitgo/wallet/tokenApproval.js +201 -0
  649. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  650. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  651. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  652. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  653. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  654. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +69 -0
  655. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  656. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  657. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  658. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  659. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  660. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +293 -0
  661. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  662. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  663. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  664. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  665. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  666. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +675 -0
  667. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts +2 -0
  668. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts.map +1 -0
  669. package/dist/test/unit/bitgo/wallet/walletsGoAccount.js +150 -0
  670. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  671. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  672. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
  673. package/dist/test/unit/coins/ofc.d.ts +2 -0
  674. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  675. package/dist/test/unit/coins/ofc.js +124 -0
  676. package/dist/test/unit/lightning.d.ts +2 -0
  677. package/dist/test/unit/lightning.d.ts.map +1 -0
  678. package/dist/test/unit/lightning.js +23 -0
  679. package/dist/test/unit/units.d.ts.map +1 -1
  680. package/dist/test/unit/units.js +64 -64
  681. package/dist/tsconfig.tsbuildinfo +1 -1
  682. package/package.json +23 -21
  683. package/.eslintignore +0 -5
  684. package/CHANGELOG.md +0 -1712
  685. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  686. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  687. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  688. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  689. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  690. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  691. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  692. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  693. package/dist/src/bitgo/lightning/index.js +0 -17
  694. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  695. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  696. package/dist/src/bitgo/lightning/lightning.js +0 -111
  697. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  698. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  699. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  700. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  701. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  702. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  703. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  704. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  705. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  706. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  707. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  708. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  709. package/dist/src/coins/fiateur.d.ts +0 -31
  710. package/dist/src/coins/fiateur.d.ts.map +0 -1
  711. package/dist/src/coins/fiateur.js +0 -57
  712. package/dist/src/coins/fiatgbp.d.ts +0 -31
  713. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  714. package/dist/src/coins/fiatgbp.js +0 -57
  715. package/dist/src/coins/fiatusd.d.ts +0 -31
  716. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  717. package/dist/src/coins/fiatusd.js +0 -57
  718. package/dist/src/coins/tfiateur.d.ts +0 -11
  719. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  720. package/dist/src/coins/tfiateur.js +0 -17
  721. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  722. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  723. package/dist/src/coins/tfiatgbp.js +0 -17
  724. package/dist/src/coins/tfiatusd.d.ts +0 -11
  725. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  726. package/dist/src/coins/tfiatusd.js +0 -17
  727. package/dist/src/openssl/index.d.ts +0 -5
  728. package/dist/src/openssl/index.d.ts.map +0 -1
  729. package/dist/src/openssl/index.js +0 -9
  730. package/dist/test/unit/openssl.d.ts +0 -2
  731. package/dist/test/unit/openssl.d.ts.map +0 -1
  732. package/dist/test/unit/openssl.js +0 -39
@@ -0,0 +1,671 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /**
37
+ * @prettier
38
+ */
39
+ require("should");
40
+ const sinon = __importStar(require("sinon"));
41
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
42
+ const src_1 = require("../../../../src");
43
+ const baseCoin_1 = require("../../../../src/bitgo/baseCoin");
44
+ require('should-sinon');
45
+ describe('WCN-1200 safe child getUserPrv root-fetch detour', function () {
46
+ const prv = 'xprv9s21ZrQH143K3hekyNj7TciR4XNYe1kMj68W2ipjJGNHETWP7o42AjDnSPgKhdZ4x8NBAvaL72RrXjuXNdmkMqLERZza73oYugGtbLFXG8g';
47
+ const softDerivedNode = baseCoin_1.BaseCoin.deriveKeyWithSeedBip32(utxo_lib_1.bip32.fromBase58(prv), '123');
48
+ if (!softDerivedNode.key.privateKey) {
49
+ throw new Error('expected deriveKeyWithSeedBip32 to return a private key');
50
+ }
51
+ const softDerivedPrv = softDerivedNode.key.toBase58();
52
+ const hardened = (0, src_1.deriveSafeChildHardenedFromXprv)(prv, '123');
53
+ const passphrase = 'test-passphrase';
54
+ const rootKeyId = 'root-key-id';
55
+ let mockBitGo;
56
+ let mockBaseCoin;
57
+ let keychainsGetStub;
58
+ let encryptStub;
59
+ let decryptStub;
60
+ const baseWalletData = {
61
+ id: 'wallet-id',
62
+ coin: 'tbtc',
63
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
64
+ type: 'hot',
65
+ multisigType: 'onchain',
66
+ enterprise: 'ent-id',
67
+ };
68
+ beforeEach(function () {
69
+ keychainsGetStub = sinon.stub();
70
+ encryptStub = sinon.stub();
71
+ decryptStub = sinon.stub();
72
+ mockBitGo = {
73
+ encrypt: encryptStub,
74
+ decrypt: decryptStub,
75
+ url: sinon.stub().returns('https://test.bitgo.com/'),
76
+ setRequestTracer: sinon.stub(),
77
+ };
78
+ mockBaseCoin = {
79
+ getChain: sinon.stub().returns('tbtc'),
80
+ getFamily: sinon.stub().returns('btc'),
81
+ getFullName: sinon.stub().returns('Test Bitcoin'),
82
+ keychains: sinon.stub().returns({
83
+ get: keychainsGetStub,
84
+ getKeysForSigning: sinon.stub().resolves([]),
85
+ }),
86
+ deriveKeyWithSeed: sinon.stub().callsFake(({ key, seed }) => {
87
+ if (key === prv && seed === '123') {
88
+ return { key: softDerivedPrv, derivationPath: 'm/999999/...' };
89
+ }
90
+ return { key: `derived(${key},${seed})`, derivationPath: 'm/0' };
91
+ }),
92
+ url: sinon.stub().callsFake((path) => `https://test.bitgo.com/api/v2/tbtc${path}`),
93
+ supportsStaking: sinon.stub().returns(false),
94
+ supportsTss: sinon.stub().returns(false),
95
+ getMPCAlgorithm: sinon.stub(),
96
+ keyIdsForSigning: sinon.stub().returns([0, 1, 2]),
97
+ };
98
+ decryptStub.callsFake(({ input, password }) => {
99
+ if (password !== passphrase) {
100
+ return null;
101
+ }
102
+ if (typeof input === 'string' && input.startsWith('enc:')) {
103
+ return input.slice(4);
104
+ }
105
+ return null;
106
+ });
107
+ });
108
+ afterEach(function () {
109
+ sinon.restore();
110
+ });
111
+ function makeWallet(overrides = {}) {
112
+ return new src_1.Wallet(mockBitGo, mockBaseCoin, {
113
+ ...baseWalletData,
114
+ ...overrides,
115
+ });
116
+ }
117
+ describe('safeDerivation', function () {
118
+ it('builds the hardened path from the sequential mint index', function () {
119
+ (0, src_1.getSafeHardenedDerivationPath)(123).should.eql("m/123'");
120
+ (0, src_1.getSafeHardenedDerivationPath)('0').should.eql("m/0'");
121
+ });
122
+ it('rejects a non-integer index', function () {
123
+ (() => (0, src_1.getSafeHardenedDerivationPath)('abc')).should.throw(/Invalid safe derivation index/);
124
+ (() => (0, src_1.getSafeHardenedDerivationPath)('')).should.throw(/Invalid safe derivation index/);
125
+ (() => (0, src_1.getSafeHardenedDerivationPath)('1e2')).should.throw(/Invalid safe derivation index/);
126
+ });
127
+ it('hardened-derives a child that differs from soft deriveKeyWithSeed', function () {
128
+ hardened.derivationPath.should.eql("m/123'");
129
+ hardened.prv.should.not.eql(softDerivedPrv);
130
+ });
131
+ it('parses derivedFromParentWithHardenedPath as m/<n> primed', function () {
132
+ (0, src_1.parseDerivedFromParentWithHardenedPath)("m/0'").should.eql(0);
133
+ (0, src_1.parseDerivedFromParentWithHardenedPath)("m/123'").should.eql(123);
134
+ (() => (0, src_1.parseDerivedFromParentWithHardenedPath)('m/0')).should.throw(/derivedFromParentWithHardenedPath/);
135
+ (() => (0, src_1.parseDerivedFromParentWithHardenedPath)('m/999999/a/b')).should.throw(/derivedFromParentWithHardenedPath/);
136
+ (() => (0, src_1.parseDerivedFromParentWithHardenedPath)("not-a-path'")).should.throw(/derivedFromParentWithHardenedPath/);
137
+ (() => (0, src_1.parseDerivedFromParentWithHardenedPath)("m/0''")).should.throw(/derivedFromParentWithHardenedPath/);
138
+ });
139
+ });
140
+ describe('fetchRootKeychainForSafeChild', function () {
141
+ it('throws when child keychain has no parent', async function () {
142
+ await (0, src_1.fetchRootKeychainForSafeChild)(mockBaseCoin.keychains(), {
143
+ id: 'child-key',
144
+ type: 'independent',
145
+ pub: 'child-pub',
146
+ }).should.be.rejectedWith('childKeychain.parent is required to fetch the root keychain');
147
+ keychainsGetStub.notCalled.should.be.true();
148
+ });
149
+ it('throws InvalidRootKeychainSourceError when root source is backup', async function () {
150
+ keychainsGetStub.resolves({
151
+ id: rootKeyId,
152
+ source: 'backup',
153
+ encryptedPrv: 'enc:root',
154
+ type: 'independent',
155
+ pub: 'root-pub',
156
+ });
157
+ await (0, src_1.fetchRootKeychainForSafeChild)(mockBaseCoin.keychains(), {
158
+ id: 'child-key',
159
+ parent: rootKeyId,
160
+ type: 'independent',
161
+ pub: 'child-pub',
162
+ }).should.be.rejectedWith(src_1.InvalidRootKeychainSourceError);
163
+ });
164
+ it('returns the root keychain when source is user', async function () {
165
+ const root = {
166
+ id: rootKeyId,
167
+ source: 'user',
168
+ encryptedPrv: 'enc:root',
169
+ type: 'independent',
170
+ pub: 'root-pub',
171
+ };
172
+ keychainsGetStub.resolves(root);
173
+ const result = await (0, src_1.fetchRootKeychainForSafeChild)(mockBaseCoin.keychains(), {
174
+ id: 'child-key',
175
+ parent: rootKeyId,
176
+ type: 'independent',
177
+ pub: 'child-pub',
178
+ });
179
+ result.should.eql(root);
180
+ });
181
+ it('throws when root keychain has no encryptedPrv', async function () {
182
+ keychainsGetStub.resolves({
183
+ id: rootKeyId,
184
+ source: 'user',
185
+ type: 'independent',
186
+ pub: 'root-pub',
187
+ });
188
+ await (0, src_1.fetchRootKeychainForSafeChild)(mockBaseCoin.keychains(), {
189
+ id: 'child-key',
190
+ parent: rootKeyId,
191
+ type: 'independent',
192
+ pub: 'child-pub',
193
+ }).should.be.rejectedWith(/does not have property encryptedPrv/);
194
+ });
195
+ });
196
+ describe('getUserPrv', function () {
197
+ it('throws when keychain has no encryptedPrv on a non-safe wallet', async function () {
198
+ const wallet = makeWallet();
199
+ await wallet
200
+ .getUserPrv({
201
+ keychain: {
202
+ id: 'child-key',
203
+ pub: 'pub',
204
+ type: 'independent',
205
+ },
206
+ walletPassphrase: passphrase,
207
+ })
208
+ .should.be.rejectedWith('keychain does not have property encryptedPrv');
209
+ });
210
+ it('throws for a non-safe wallet even when keychain has parent', async function () {
211
+ const wallet = makeWallet();
212
+ await wallet
213
+ .getUserPrv({
214
+ keychain: {
215
+ id: 'child-key',
216
+ pub: 'pub',
217
+ type: 'independent',
218
+ parent: rootKeyId,
219
+ },
220
+ walletPassphrase: passphrase,
221
+ })
222
+ .should.be.rejectedWith('keychain does not have property encryptedPrv');
223
+ keychainsGetStub.notCalled.should.be.true();
224
+ });
225
+ it('throws for a safe wallet when keychain has no parent', async function () {
226
+ const wallet = makeWallet({ safe: 'safe-id-1' });
227
+ await wallet
228
+ .getUserPrv({
229
+ keychain: {
230
+ id: 'child-key',
231
+ pub: 'pub',
232
+ type: 'independent',
233
+ },
234
+ walletPassphrase: passphrase,
235
+ })
236
+ .should.be.rejectedWith('keychain does not have property encryptedPrv');
237
+ keychainsGetStub.notCalled.should.be.true();
238
+ });
239
+ it('fetches root and hardened-derives child key for safe owner', async function () {
240
+ const wallet = makeWallet({ safe: 'safe-id-1' });
241
+ keychainsGetStub.resolves({
242
+ id: rootKeyId,
243
+ source: 'user',
244
+ encryptedPrv: `enc:${prv}`,
245
+ type: 'independent',
246
+ pub: 'root-pub',
247
+ });
248
+ const result = await wallet.getUserPrv({
249
+ keychain: {
250
+ id: 'child-key',
251
+ pub: hardened.pub,
252
+ type: 'independent',
253
+ parent: rootKeyId,
254
+ derivedFromParentWithHardenedPath: "m/123'",
255
+ },
256
+ walletPassphrase: passphrase,
257
+ });
258
+ result.should.eql(hardened.prv);
259
+ result.should.not.eql(softDerivedPrv);
260
+ keychainsGetStub.calledOnceWithExactly({ id: rootKeyId }).should.be.true();
261
+ mockBaseCoin.deriveKeyWithSeed.notCalled.should.be.true();
262
+ });
263
+ it('requires derivedFromParentWithHardenedPath on the child keychain', async function () {
264
+ const wallet = makeWallet({ safe: 'safe-id-1' });
265
+ keychainsGetStub.resolves({
266
+ id: rootKeyId,
267
+ source: 'user',
268
+ encryptedPrv: `enc:${prv}`,
269
+ type: 'independent',
270
+ pub: 'root-pub',
271
+ });
272
+ await wallet
273
+ .getUserPrv({
274
+ keychain: {
275
+ id: 'child-key',
276
+ pub: hardened.pub,
277
+ type: 'independent',
278
+ parent: rootKeyId,
279
+ },
280
+ walletPassphrase: passphrase,
281
+ })
282
+ .should.be.rejectedWith(/missing derivedFromParentWithHardenedPath/);
283
+ });
284
+ it('fails closed when derivedFromParentWithHardenedPath does not match the registered pub', async function () {
285
+ const wallet = makeWallet({ safe: 'safe-id-1' });
286
+ keychainsGetStub.resolves({
287
+ id: rootKeyId,
288
+ source: 'user',
289
+ encryptedPrv: `enc:${prv}`,
290
+ type: 'independent',
291
+ pub: 'root-pub',
292
+ });
293
+ await wallet
294
+ .getUserPrv({
295
+ keychain: {
296
+ id: 'child-key',
297
+ pub: hardened.pub,
298
+ type: 'independent',
299
+ parent: rootKeyId,
300
+ derivedFromParentWithHardenedPath: "m/0'",
301
+ },
302
+ walletPassphrase: passphrase,
303
+ })
304
+ .should.be.rejectedWith(src_1.SafeDerivedPublicKeyMismatchError);
305
+ });
306
+ it('rejects a malformed derivedFromParentWithHardenedPath', async function () {
307
+ const wallet = makeWallet({ safe: 'safe-id-1' });
308
+ keychainsGetStub.resolves({
309
+ id: rootKeyId,
310
+ source: 'user',
311
+ encryptedPrv: `enc:${prv}`,
312
+ type: 'independent',
313
+ pub: 'root-pub',
314
+ });
315
+ await wallet
316
+ .getUserPrv({
317
+ keychain: {
318
+ id: 'child-key',
319
+ pub: hardened.pub,
320
+ type: 'independent',
321
+ parent: rootKeyId,
322
+ derivedFromParentWithHardenedPath: "not-a-path'",
323
+ },
324
+ walletPassphrase: passphrase,
325
+ })
326
+ .should.be.rejectedWith(/derivedFromParentWithHardenedPath/);
327
+ });
328
+ it('fails closed for TSS safe owner instead of returning the root prv', async function () {
329
+ const wallet = makeWallet({ safe: 'safe-id-1', multisigType: 'tss' });
330
+ await wallet
331
+ .getUserPrv({
332
+ keychain: {
333
+ id: 'child-key',
334
+ pub: 'unrelated-child-pub',
335
+ type: 'tss',
336
+ parent: rootKeyId,
337
+ derivedFromParentWithSeed: '123',
338
+ commonKeychain: 'ck',
339
+ },
340
+ walletPassphrase: passphrase,
341
+ })
342
+ .should.be.rejectedWith(src_1.SafeOwnerSigningNotImplementedError);
343
+ keychainsGetStub.notCalled.should.be.true();
344
+ mockBaseCoin.deriveKeyWithSeed.notCalled.should.be.true();
345
+ });
346
+ it('fails closed for ed25519 onchain safe owner instead of BIP32-deriving', async function () {
347
+ mockBaseCoin.getFamily.returns('xlm');
348
+ const wallet = makeWallet({ safe: 'safe-id-1', coin: 'txlm' });
349
+ await wallet
350
+ .getUserPrv({
351
+ keychain: {
352
+ id: 'child-key',
353
+ pub: 'child-pub',
354
+ type: 'independent',
355
+ parent: rootKeyId,
356
+ derivedFromParentWithSeed: '123',
357
+ },
358
+ walletPassphrase: passphrase,
359
+ })
360
+ .should.be.rejectedWith(src_1.SafeOwnerSigningNotImplementedError);
361
+ keychainsGetStub.notCalled.should.be.true();
362
+ mockBaseCoin.deriveKeyWithSeed.notCalled.should.be.true();
363
+ });
364
+ it('aborts locally when derived pub does not match registered child pub', async function () {
365
+ const wallet = makeWallet({ safe: 'safe-id-1' });
366
+ keychainsGetStub.resolves({
367
+ id: rootKeyId,
368
+ source: 'user',
369
+ encryptedPrv: `enc:${prv}`,
370
+ type: 'independent',
371
+ pub: 'root-pub',
372
+ });
373
+ await wallet
374
+ .getUserPrv({
375
+ keychain: {
376
+ id: 'child-key',
377
+ pub: 'xpub-wrong-registered-key',
378
+ type: 'independent',
379
+ parent: rootKeyId,
380
+ derivedFromParentWithHardenedPath: "m/123'",
381
+ },
382
+ walletPassphrase: passphrase,
383
+ })
384
+ .should.be.rejectedWith(src_1.SafeDerivedPublicKeyMismatchError);
385
+ });
386
+ it('decrypts child encryptedPrv as-is for wallet sharee (hardened child prv)', async function () {
387
+ const childPrv = 'child-level-prv';
388
+ const wallet = makeWallet({ safe: 'safe-id-1' });
389
+ const result = await wallet.getUserPrv({
390
+ keychain: {
391
+ id: 'child-key',
392
+ pub: 'child-pub',
393
+ type: 'independent',
394
+ parent: rootKeyId,
395
+ derivedFromParentWithSeed: '123',
396
+ encryptedPrv: `enc:${childPrv}`,
397
+ },
398
+ walletPassphrase: passphrase,
399
+ });
400
+ result.should.eql(childPrv);
401
+ keychainsGetStub.notCalled.should.be.true();
402
+ mockBaseCoin.deriveKeyWithSeed.notCalled.should.be.true();
403
+ });
404
+ it('does not auto-populate coldDerivationSeed when explicit prv and encryptedPrv are present', async function () {
405
+ const childPrv = 'child-level-prv';
406
+ const wallet = makeWallet({ safe: 'safe-id-1' });
407
+ const result = await wallet.getUserPrv({
408
+ prv: childPrv,
409
+ keychain: {
410
+ id: 'child-key',
411
+ pub: 'child-pub',
412
+ type: 'independent',
413
+ parent: rootKeyId,
414
+ derivedFromParentWithSeed: '123',
415
+ encryptedPrv: `enc:${childPrv}`,
416
+ },
417
+ });
418
+ result.should.eql(childPrv);
419
+ mockBaseCoin.deriveKeyWithSeed.notCalled.should.be.true();
420
+ });
421
+ it('still auto-populates coldDerivationSeed for SMC with params.prv and no encryptedPrv', async function () {
422
+ const wallet = makeWallet();
423
+ const result = await wallet.getUserPrv({
424
+ prv,
425
+ keychain: {
426
+ id: 'smc-key',
427
+ pub: 'smc-pub',
428
+ type: 'independent',
429
+ derivedFromParentWithSeed: '123',
430
+ },
431
+ });
432
+ result.should.eql(softDerivedPrv);
433
+ mockBaseCoin.deriveKeyWithSeed.calledOnce.should.be.true();
434
+ });
435
+ it('does not apply an explicit coldDerivationSeed after decrypting encryptedPrv', async function () {
436
+ const wallet = makeWallet();
437
+ const childPrv = prv;
438
+ const result = await wallet.getUserPrv({
439
+ keychain: {
440
+ id: 'smc-key',
441
+ pub: 'smc-pub',
442
+ type: 'independent',
443
+ encryptedPrv: `enc:${childPrv}`,
444
+ },
445
+ walletPassphrase: passphrase,
446
+ coldDerivationSeed: '123',
447
+ });
448
+ result.should.eql(childPrv);
449
+ mockBaseCoin.deriveKeyWithSeed.notCalled.should.be.true();
450
+ });
451
+ it('throws encryptedPrv error before walletPassphrase when both are missing', async function () {
452
+ const wallet = makeWallet();
453
+ await wallet
454
+ .getUserPrv({
455
+ keychain: {
456
+ id: 'child-key',
457
+ pub: 'pub',
458
+ type: 'independent',
459
+ },
460
+ })
461
+ .should.be.rejectedWith('keychain does not have property encryptedPrv');
462
+ });
463
+ });
464
+ describe('getEncryptedUserKeychain', function () {
465
+ it('still fails for a safe owner so wallet sharing cannot obtain root material', async function () {
466
+ const wallet = makeWallet({ safe: 'safe-id-1' });
467
+ keychainsGetStub.resolves({
468
+ id: 'user-key',
469
+ pub: 'child-pub',
470
+ type: 'independent',
471
+ parent: rootKeyId,
472
+ derivedFromParentWithSeed: '123',
473
+ });
474
+ await wallet.getEncryptedUserKeychain().should.be.rejectedWith(src_1.MissingEncryptedKeychainError);
475
+ keychainsGetStub.called.should.be.true();
476
+ });
477
+ });
478
+ describe('signing guards', function () {
479
+ it('getUserKeyAndSignTssTransaction allows safe child keychain without encryptedPrv', async function () {
480
+ const wallet = makeWallet({
481
+ safe: 'safe-id-1',
482
+ multisigType: 'tss',
483
+ type: 'hot',
484
+ });
485
+ const childKeychain = {
486
+ id: 'child-key',
487
+ pub: 'child-pub',
488
+ type: 'tss',
489
+ parent: rootKeyId,
490
+ commonKeychain: 'ck',
491
+ };
492
+ keychainsGetStub.resolves({
493
+ id: rootKeyId,
494
+ source: 'user',
495
+ encryptedPrv: `enc:${prv}`,
496
+ type: 'independent',
497
+ pub: 'root-pub',
498
+ });
499
+ mockBaseCoin.keychains.returns({
500
+ get: keychainsGetStub,
501
+ getKeysForSigning: sinon.stub().resolves([childKeychain]),
502
+ });
503
+ const signStub = sinon.stub(src_1.Wallet.prototype, 'signTransaction').resolves({ txHex: 'signed' });
504
+ const result = await wallet.getUserKeyAndSignTssTransaction({
505
+ txRequestId: 'tx-req',
506
+ walletPassphrase: passphrase,
507
+ });
508
+ result.should.eql({ txHex: 'signed' });
509
+ signStub.calledOnce.should.be.true();
510
+ const signArgs = signStub.firstCall.args[0];
511
+ signArgs.keychain.should.eql(childKeychain);
512
+ });
513
+ it('getUserKeyAndSignTssTransaction rejects wrong passphrase early for safe child wallets', async function () {
514
+ const wallet = makeWallet({
515
+ safe: 'safe-id-1',
516
+ multisigType: 'tss',
517
+ type: 'hot',
518
+ });
519
+ const childKeychain = {
520
+ id: 'child-key',
521
+ pub: 'child-pub',
522
+ type: 'tss',
523
+ parent: rootKeyId,
524
+ commonKeychain: 'ck',
525
+ };
526
+ keychainsGetStub.resolves({
527
+ id: rootKeyId,
528
+ source: 'user',
529
+ encryptedPrv: `enc:${prv}`,
530
+ type: 'independent',
531
+ pub: 'root-pub',
532
+ });
533
+ mockBaseCoin.keychains.returns({
534
+ get: keychainsGetStub,
535
+ getKeysForSigning: sinon.stub().resolves([childKeychain]),
536
+ });
537
+ const signStub = sinon.stub(src_1.Wallet.prototype, 'signTransaction');
538
+ await wallet
539
+ .getUserKeyAndSignTssTransaction({
540
+ txRequestId: 'tx-req',
541
+ walletPassphrase: 'wrong-passphrase',
542
+ })
543
+ .should.be.rejectedWith(src_1.IncorrectPasswordError);
544
+ signStub.notCalled.should.be.true();
545
+ keychainsGetStub.calledOnce.should.be.true();
546
+ });
547
+ it('signTransaction does not pass the root prv into TSS signing for a safe owner', async function () {
548
+ const wallet = makeWallet({
549
+ safe: 'safe-id-1',
550
+ multisigType: 'tss',
551
+ type: 'hot',
552
+ });
553
+ const childKeychain = {
554
+ id: 'child-key',
555
+ pub: 'child-pub',
556
+ type: 'tss',
557
+ parent: rootKeyId,
558
+ commonKeychain: 'ck',
559
+ };
560
+ keychainsGetStub.resolves({
561
+ id: rootKeyId,
562
+ source: 'user',
563
+ encryptedPrv: `enc:${prv}`,
564
+ type: 'independent',
565
+ pub: 'root-pub',
566
+ });
567
+ mockBaseCoin.keychains.returns({
568
+ get: keychainsGetStub,
569
+ getKeysForSigning: sinon.stub().resolves([childKeychain]),
570
+ });
571
+ mockBaseCoin.presignTransaction = sinon.stub().callsFake(async (params) => params);
572
+ mockBaseCoin.getMPCAlgorithm = sinon.stub().returns('eddsa');
573
+ const signTssStub = sinon.stub(src_1.Wallet.prototype, 'signTransactionTss').resolves({ txHex: 'signed' });
574
+ await wallet
575
+ .signTransaction({
576
+ walletPassphrase: passphrase,
577
+ txPrebuild: { txRequestId: 'tx-req' },
578
+ })
579
+ .should.be.rejectedWith(src_1.SafeOwnerSigningNotImplementedError);
580
+ signTssStub.notCalled.should.be.true();
581
+ });
582
+ });
583
+ });
584
+ describe('WCN-1200 recreateAndSignTSSTransaction safe path', function () {
585
+ afterEach(function () {
586
+ sinon.restore();
587
+ });
588
+ function makePendingApproval(wallet) {
589
+ const recreateTxRequest = sinon.stub().resolves({
590
+ apiVersion: 'lite',
591
+ txRequestId: 'tx-req',
592
+ unsignedTxs: [{ serializedTxHex: 'deadbeef', signableHex: 'ab', derivationPath: 'm/0' }],
593
+ transactions: [],
594
+ });
595
+ const pendingApproval = new src_1.PendingApproval({}, wallet.baseCoin, {
596
+ id: 'pa0',
597
+ txRequestId: 'tx-req',
598
+ info: { type: 'transactionRequest', transactionRequest: { recipients: [], coinSpecific: {} } },
599
+ state: 'pending',
600
+ creator: 'test',
601
+ }, wallet);
602
+ pendingApproval.tssUtils = { recreateTxRequest };
603
+ return { pendingApproval, recreateTxRequest };
604
+ }
605
+ it('uses getUserPrv for the safe owner (minter) instead of getPrv', async function () {
606
+ const childUserKeychain = {
607
+ id: 'child-key',
608
+ pub: 'child-pub',
609
+ type: 'tss',
610
+ parent: 'root-key-id',
611
+ derivedFromParentWithSeed: 'seed',
612
+ };
613
+ const getKeysForSigning = sinon.stub().resolves([childUserKeychain]);
614
+ const getUserPrv = sinon.stub().resolves('decryptedPrv');
615
+ const getPrv = sinon.stub().resolves('should-not-be-called');
616
+ const wallet = {
617
+ safeId: () => 'safe-id-1',
618
+ getUserPrv,
619
+ getPrv,
620
+ baseCoin: {
621
+ keychains: () => ({ getKeysForSigning }),
622
+ supportsTss: () => true,
623
+ getMPCAlgorithm: () => 'eddsa',
624
+ },
625
+ multisigTypeVersion: () => undefined,
626
+ };
627
+ const { pendingApproval, recreateTxRequest } = makePendingApproval(wallet);
628
+ const result = await pendingApproval.recreateAndSignTSSTransaction({ walletPassphrase: 'pass' }, new src_1.RequestTracer());
629
+ result.should.eql({ txHex: 'deadbeef' });
630
+ getPrv.notCalled.should.be.true();
631
+ getKeysForSigning.calledOnce.should.be.true();
632
+ getUserPrv
633
+ .calledOnceWithExactly({
634
+ keychain: childUserKeychain,
635
+ walletPassphrase: 'pass',
636
+ })
637
+ .should.be.true();
638
+ recreateTxRequest.calledOnce.should.be.true();
639
+ });
640
+ it('uses getPrv for a safe wallet sharee (child encryptedPrv already present)', async function () {
641
+ const childUserKeychain = {
642
+ id: 'child-key',
643
+ pub: 'child-pub',
644
+ type: 'tss',
645
+ parent: 'root-key-id',
646
+ derivedFromParentWithSeed: 'seed',
647
+ encryptedPrv: 'enc:sharee-prv',
648
+ };
649
+ const getKeysForSigning = sinon.stub().resolves([childUserKeychain]);
650
+ const getUserPrv = sinon.stub().resolves('should-not-be-called');
651
+ const getPrv = sinon.stub().resolves('sharee-prv');
652
+ const wallet = {
653
+ safeId: () => 'safe-id-1',
654
+ getUserPrv,
655
+ getPrv,
656
+ baseCoin: {
657
+ keychains: () => ({ getKeysForSigning }),
658
+ supportsTss: () => true,
659
+ getMPCAlgorithm: () => 'eddsa',
660
+ },
661
+ multisigTypeVersion: () => undefined,
662
+ };
663
+ const { pendingApproval, recreateTxRequest } = makePendingApproval(wallet);
664
+ const result = await pendingApproval.recreateAndSignTSSTransaction({ walletPassphrase: 'pass' }, new src_1.RequestTracer());
665
+ result.should.eql({ txHex: 'deadbeef' });
666
+ getUserPrv.notCalled.should.be.true();
667
+ getPrv.calledOnceWithExactly({ walletPassphrase: 'pass' }).should.be.true();
668
+ recreateTxRequest.calledOnce.should.be.true();
669
+ });
670
+ });
671
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZUdldFVzZXJQcnYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3VuaXQvYml0Z28vd2FsbGV0L3NhZmVHZXRVc2VyUHJ2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxrQkFBZ0I7QUFDaEIsNkNBQStCO0FBQy9CLG1EQUE2QztBQUM3Qyx5Q0FheUI7QUFDekIsNkRBQTBEO0FBRTFELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUV4QixRQUFRLENBQUMsa0RBQWtELEVBQUU7SUFDM0QsTUFBTSxHQUFHLEdBQ1AsaUhBQWlILENBQUM7SUFDcEgsTUFBTSxlQUFlLEdBQUcsbUJBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUNELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEQsTUFBTSxRQUFRLEdBQUcsSUFBQSxxQ0FBK0IsRUFBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0QsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7SUFDckMsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDO0lBRWhDLElBQUksU0FBYyxDQUFDO0lBQ25CLElBQUksWUFBaUIsQ0FBQztJQUN0QixJQUFJLGdCQUFpQyxDQUFDO0lBQ3RDLElBQUksV0FBNEIsQ0FBQztJQUNqQyxJQUFJLFdBQTRCLENBQUM7SUFFakMsTUFBTSxjQUFjLEdBQUc7UUFDckIsRUFBRSxFQUFFLFdBQVc7UUFDZixJQUFJLEVBQUUs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QU0sZUFBZSxDQUFDLDZCQUE2QixDQUNoRSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxFQUM1QixJQUFJLG1CQUFhLEVBQUUsQ0FDcEIsQ0FBQztRQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDekMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1RSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQge1xuICBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2LFxuICBmZXRjaFJvb3RLZXljaGFpbkZvclNhZmVDaGlsZCxcbiAgZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgsXG4gIHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLFxuICBJbmNvcnJlY3RQYXNzd29yZEVycm9yLFxuICBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IsXG4gIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yLFxuICBQZW5kaW5nQXBwcm92YWwsXG4gIFJlcXVlc3RUcmFjZXIsXG4gIFNhZmVEZXJpdmVkUHVibGljS2V5TWlzbWF0Y2hFcnJvcixcbiAgU2FmZU93bmVyU2lnbmluZ05vdEltcGxlbWVudGVkRXJyb3IsXG4gIFdhbGxldCxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IEJhc2VDb2luIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2Jhc2VDb2luJztcblxucmVxdWlyZSgnc2hvdWxkLXNpbm9uJyk7XG5cbmRlc2NyaWJlKCdXQ04tMTIwMCBzYWZlIGNoaWxkIGdldFVzZXJQcnYgcm9vdC1mZXRjaCBkZXRvdXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHBydiA9XG4gICAgJ3hwcnY5czIxWnJRSDE0M0szaGVreU5qN1RjaVI0WE5ZZTFrTWo2OFcyaXBqSkdOSEVUV1A3bzQyQWpEblNQZ0toZFo0eDhOQkF2YUw3MlJyWGp1WE5kbWtNcUxFUlp6YTczb1l1Z0d0YkxGWEc4Zyc7XG4gIGNvbnN0IHNvZnREZXJpdmVkTm9kZSA9IEJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkQmlwMzIoYmlwMzIuZnJvbUJhc2U1OChwcnYpLCAnMTIzJyk7XG4gIGlmICghc29mdERlcml2ZWROb2RlLmtleS5wcml2YXRlS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBkZXJpdmVLZXlXaXRoU2VlZEJpcDMyIHRvIHJldHVybiBhIHByaXZhdGUga2V5Jyk7XG4gIH1cbiAgY29uc3Qgc29mdERlcml2ZWRQcnYgPSBzb2Z0RGVyaXZlZE5vZGUua2V5LnRvQmFzZTU4KCk7XG4gIGNvbnN0IGhhcmRlbmVkID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihwcnYsICcxMjMnKTtcbiAgY29uc3QgcGFzc3BocmFzZSA9ICd0ZXN0LXBhc3NwaHJhc2UnO1xuICBjb25zdCByb290S2V5SWQgPSAncm9vdC1rZXktaWQnO1xuXG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuICBsZXQga2V5Y2hhaW5zR2V0U3R1Yjogc2lub24uU2lub25TdHViO1xuICBsZXQgZW5jcnlwdFN0dWI6IHNpbm9uLlNpbm9uU3R1YjtcbiAgbGV0IGRlY3J5cHRTdHViOiBzaW5vbi5TaW5vblN0dWI7XG5cbiAgY29uc3QgYmFzZVdhbGxldERhdGEgPSB7XG4gICAgaWQ6ICd3YWxsZXQtaWQnLFxuICAgIGNvaW46ICd0YnRjJyxcbiAgICBrZXlzOiBbJ3VzZXIta2V5JywgJ2JhY2t1cC1rZXknLCAnYml0Z28ta2V5J10sXG4gICAgdHlwZTogJ2hvdCcsXG4gICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgZW50ZXJwcmlzZTogJ2VudC1pZCcsXG4gIH07XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAga2V5Y2hhaW5zR2V0U3R1YiA9IHNpbm9uLnN0dWIoKTtcbiAgICBlbmNyeXB0U3R1YiA9IHNpbm9uLnN0dWIoKTtcbiAgICBkZWNyeXB0U3R1YiA9IHNpbm9uLnN0dWIoKTtcblxuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIGVuY3J5cHQ6IGVuY3J5cHRTdHViLFxuICAgICAgZGVjcnlwdDogZGVjcnlwdFN0dWIsXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdodHRwczovL3Rlc3QuYml0Z28uY29tLycpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBnZXRDaGFpbjogc2lub24uc3R1YigpLnJldHVybnMoJ3RidGMnKSxcbiAgICAgIGdldEZhbWlseTogc2lub24uc3R1YigpLnJldHVybnMoJ2J0YycpLFxuICAgICAgZ2V0RnVsbE5hbWU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdUZXN0IEJpdGNvaW4nKSxcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICBnZXQ6IGtleWNoYWluc0dldFN0dWIsXG4gICAgICAgIGdldEtleXNGb3JTaWduaW5nOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoW10pLFxuICAgICAgfSksXG4gICAgICBkZXJpdmVLZXlXaXRoU2VlZDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgoeyBrZXksIHNlZWQgfTogeyBrZXk6IHN0cmluZzsgc2VlZDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gcHJ2ICYmIHNlZWQgPT09ICcxMjMnKSB7XG4gICAgICAgICAgcmV0dXJuIHsga2V5OiBzb2Z0RGVyaXZlZFBydiwgZGVyaXZhdGlvblBhdGg6ICdtLzk5OTk5OS8uLi4nIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsga2V5OiBgZGVyaXZlZCgke2tleX0sJHtzZWVkfSlgLCBkZXJpdmF0aW9uUGF0aDogJ20vMCcgfTtcbiAgICAgIH0pLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcpID0+IGBodHRwczovL3Rlc3QuYml0Z28uY29tL2FwaS92Mi90YnRjJHtwYXRofWApLFxuICAgICAgc3VwcG9ydHNTdGFraW5nOiBzaW5vbi5zdHViKCkucmV0dXJucyhmYWxzZSksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCksXG4gICAgICBrZXlJZHNGb3JTaWduaW5nOiBzaW5vbi5zdHViKCkucmV0dXJucyhbMCwgMSwgMl0pLFxuICAgIH07XG5cbiAgICBkZWNyeXB0U3R1Yi5jYWxsc0Zha2UoKHsgaW5wdXQsIHBhc3N3b3JkIH06IHsgaW5wdXQ6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICBpZiAocGFzc3dvcmQgIT09IHBhc3NwaHJhc2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFydHNXaXRoKCdlbmM6JykpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LnNsaWNlKDQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBmdW5jdGlvbiBtYWtlV2FsbGV0KG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IFdhbGxldCB7XG4gICAgcmV0dXJuIG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4gYXMgdW5rbm93biBhcyBCYXNlQ29pbiwge1xuICAgICAgLi4uYmFzZVdhbGxldERhdGEsXG4gICAgICAuLi5vdmVycmlkZXMsXG4gICAgfSk7XG4gIH1cblxuICBkZXNjcmliZSgnc2FmZURlcml2YXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2J1aWxkcyB0aGUgaGFyZGVuZWQgcGF0aCBmcm9tIHRoZSBzZXF1ZW50aWFsIG1pbnQgaW5kZXgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aCgxMjMpLnNob3VsZC5lcWwoXCJtLzEyMydcIik7XG4gICAgICBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aCgnMCcpLnNob3VsZC5lcWwoXCJtLzAnXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBub24taW50ZWdlciBpbmRleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICgoKSA9PiBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aCgnYWJjJykpLnNob3VsZC50aHJvdygvSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXgvKTtcbiAgICAgICgoKSA9PiBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aCgnJykpLnNob3VsZC50aHJvdygvSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXgvKTtcbiAgICAgICgoKSA9PiBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aCgnMWUyJykpLnNob3VsZC50aHJvdygvSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXJkZW5lZC1kZXJpdmVzIGEgY2hpbGQgdGhhdCBkaWZmZXJzIGZyb20gc29mdCBkZXJpdmVLZXlXaXRoU2VlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGhhcmRlbmVkLmRlcml2YXRpb25QYXRoLnNob3VsZC5lcWwoXCJtLzEyMydcIik7XG4gICAgICBoYXJkZW5lZC5wcnYuc2hvdWxkLm5vdC5lcWwoc29mdERlcml2ZWRQcnYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3BhcnNlcyBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggYXMgbS88bj4gcHJpbWVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgoXCJtLzAnXCIpLnNob3VsZC5lcWwoMCk7XG4gICAgICBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aChcIm0vMTIzJ1wiKS5zaG91bGQuZXFsKDEyMyk7XG4gICAgICAoKCkgPT4gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgoJ20vMCcpKS5zaG91bGQudGhyb3coL2Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aC8pO1xuICAgICAgKCgpID0+IHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoKCdtLzk5OTk5OS9hL2InKSkuc2hvdWxkLnRocm93KC9kZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgvKTtcbiAgICAgICgoKSA9PiBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aChcIm5vdC1hLXBhdGgnXCIpKS5zaG91bGQudGhyb3coL2Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aC8pO1xuICAgICAgKCgpID0+IHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoKFwibS8wJydcIikpLnNob3VsZC50aHJvdygvZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmZXRjaFJvb3RLZXljaGFpbkZvclNhZmVDaGlsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgndGhyb3dzIHdoZW4gY2hpbGQga2V5Y2hhaW4gaGFzIG5vIHBhcmVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGZldGNoUm9vdEtleWNoYWluRm9yU2FmZUNoaWxkKG1vY2tCYXNlQ29pbi5rZXljaGFpbnMoKSwge1xuICAgICAgICBpZDogJ2NoaWxkLWtleScsXG4gICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHB1YjogJ2NoaWxkLXB1YicsXG4gICAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdjaGlsZEtleWNoYWluLnBhcmVudCBpcyByZXF1aXJlZCB0byBmZXRjaCB0aGUgcm9vdCBrZXljaGFpbicpO1xuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5ub3RDYWxsZWQuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgSW52YWxpZFJvb3RLZXljaGFpblNvdXJjZUVycm9yIHdoZW4gcm9vdCBzb3VyY2UgaXMgYmFja3VwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIGlkOiByb290S2V5SWQsXG4gICAgICAgIHNvdXJjZTogJ2JhY2t1cCcsXG4gICAgICAgIGVuY3J5cHRlZFBydjogJ2VuYzpyb290JyxcbiAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgcHViOiAncm9vdC1wdWInLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGZldGNoUm9vdEtleWNoYWluRm9yU2FmZUNoaWxkKG1vY2tCYXNlQ29pbi5rZXljaGFpbnMoKSwge1xuICAgICAgICBpZDogJ2NoaWxkLWtleScsXG4gICAgICAgIHBhcmVudDogcm9vdEtleUlkLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwdWI6ICdjaGlsZC1wdWInLFxuICAgICAgfSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgdGhlIHJvb3Qga2V5Y2hhaW4gd2hlbiBzb3VyY2UgaXMgdXNlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3QgPSB7XG4gICAgICAgIGlkOiByb290S2V5SWQsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6ICdlbmM6cm9vdCcsXG4gICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHB1YjogJ3Jvb3QtcHViJyxcbiAgICAgIH07XG4gICAgICBrZXljaGFpbnNHZXRTdHViLnJlc29sdmVzKHJvb3QpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaFJvb3RLZXljaGFpbkZvclNhZmVDaGlsZChtb2NrQmFzZUNvaW4ua2V5Y2hhaW5zKCksIHtcbiAgICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgICBwYXJlbnQ6IHJvb3RLZXlJZCxcbiAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgcHViOiAnY2hpbGQtcHViJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcWwocm9vdCk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gcm9vdCBrZXljaGFpbiBoYXMgbm8gZW5jcnlwdGVkUHJ2JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIGlkOiByb290S2V5SWQsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwdWI6ICdyb290LXB1YicsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgZmV0Y2hSb290S2V5Y2hhaW5Gb3JTYWZlQ2hpbGQobW9ja0Jhc2VDb2luLmtleWNoYWlucygpLCB7XG4gICAgICAgIGlkOiAnY2hpbGQta2V5JyxcbiAgICAgICAgcGFyZW50OiByb290S2V5SWQsXG4gICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHB1YjogJ2NoaWxkLXB1YicsXG4gICAgICB9KS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9kb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydi8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0VXNlclBydicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgndGhyb3dzIHdoZW4ga2V5Y2hhaW4gaGFzIG5vIGVuY3J5cHRlZFBydiBvbiBhIG5vbi1zYWZlIHdhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG1ha2VXYWxsZXQoKTtcbiAgICAgIGF3YWl0IHdhbGxldFxuICAgICAgICAuZ2V0VXNlclBydih7XG4gICAgICAgICAga2V5Y2hhaW46IHtcbiAgICAgICAgICAgIGlkOiAnY2hpbGQta2V5JyxcbiAgICAgICAgICAgIHB1YjogJ3B1YicsXG4gICAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIGZvciBhIG5vbi1zYWZlIHdhbGxldCBldmVuIHdoZW4ga2V5Y2hhaW4gaGFzIHBhcmVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG1ha2VXYWxsZXQoKTtcbiAgICAgIGF3YWl0IHdhbGxldFxuICAgICAgICAuZ2V0VXNlclBydih7XG4gICAgICAgICAga2V5Y2hhaW46IHtcbiAgICAgICAgICAgIGlkOiAnY2hpbGQta2V5JyxcbiAgICAgICAgICAgIHB1YjogJ3B1YicsXG4gICAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgICAgcGFyZW50OiByb290S2V5SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgna2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICAgIGtleWNoYWluc0dldFN0dWIubm90Q2FsbGVkLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIGZvciBhIHNhZmUgd2FsbGV0IHdoZW4ga2V5Y2hhaW4gaGFzIG5vIHBhcmVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG1ha2VXYWxsZXQoeyBzYWZlOiAnc2FmZS1pZC0xJyB9KTtcbiAgICAgIGF3YWl0IHdhbGxldFxuICAgICAgICAuZ2V0VXNlclBydih7XG4gICAgICAgICAga2V5Y2hhaW46IHtcbiAgICAgICAgICAgIGlkOiAnY2hpbGQta2V5JyxcbiAgICAgICAgICAgIHB1YjogJ3B1YicsXG4gICAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICBrZXljaGFpbnNHZXRTdHViLm5vdENhbGxlZC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZldGNoZXMgcm9vdCBhbmQgaGFyZGVuZWQtZGVyaXZlcyBjaGlsZCBrZXkgZm9yIHNhZmUgb3duZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBtYWtlV2FsbGV0KHsgc2FmZTogJ3NhZmUtaWQtMScgfSk7XG4gICAgICBrZXljaGFpbnNHZXRTdHViLnJlc29sdmVzKHtcbiAgICAgICAgaWQ6IHJvb3RLZXlJZCxcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYGVuYzoke3Bydn1gLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwdWI6ICdyb290LXB1YicsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LmdldFVzZXJQcnYoe1xuICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgIGlkOiAnY2hpbGQta2V5JyxcbiAgICAgICAgICBwdWI6IGhhcmRlbmVkLnB1YixcbiAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgIHBhcmVudDogcm9vdEtleUlkLFxuICAgICAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aDogXCJtLzEyMydcIixcbiAgICAgICAgfSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmVxbChoYXJkZW5lZC5wcnYpO1xuICAgICAgcmVzdWx0LnNob3VsZC5ub3QuZXFsKHNvZnREZXJpdmVkUHJ2KTtcbiAgICAgIGtleWNoYWluc0dldFN0dWIuY2FsbGVkT25jZVdpdGhFeGFjdGx5KHsgaWQ6IHJvb3RLZXlJZCB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgbW9ja0Jhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkLm5vdENhbGxlZC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlcXVpcmVzIGRlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCBvbiB0aGUgY2hpbGQga2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBtYWtlV2FsbGV0KHsgc2FmZTogJ3NhZmUtaWQtMScgfSk7XG4gICAgICBrZXljaGFpbnNHZXRTdHViLnJlc29sdmVzKHtcbiAgICAgICAgaWQ6IHJvb3RLZXlJZCxcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYGVuYzoke3Bydn1gLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwdWI6ICdyb290LXB1YicsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0XG4gICAgICAgIC5nZXRVc2VyUHJ2KHtcbiAgICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgICAgICAgcHViOiBoYXJkZW5lZC5wdWIsXG4gICAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgICAgcGFyZW50OiByb290S2V5SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvbWlzc2luZyBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWlscyBjbG9zZWQgd2hlbiBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ2lzdGVyZWQgcHViJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbWFrZVdhbGxldCh7IHNhZmU6ICdzYWZlLWlkLTEnIH0pO1xuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIGlkOiByb290S2V5SWQsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGBlbmM6JHtwcnZ9YCxcbiAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgcHViOiAncm9vdC1wdWInLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldFxuICAgICAgICAuZ2V0VXNlclBydih7XG4gICAgICAgICAga2V5Y2hhaW46IHtcbiAgICAgICAgICAgIGlkOiAnY2hpbGQta2V5JyxcbiAgICAgICAgICAgIHB1YjogaGFyZGVuZWQucHViLFxuICAgICAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgICAgIHBhcmVudDogcm9vdEtleUlkLFxuICAgICAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoOiBcIm0vMCdcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFNhZmVEZXJpdmVkUHVibGljS2V5TWlzbWF0Y2hFcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhIG1hbGZvcm1lZCBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBtYWtlV2FsbGV0KHsgc2FmZTogJ3NhZmUtaWQtMScgfSk7XG4gICAgICBrZXljaGFpbnNHZXRTdHViLnJlc29sdmVzKHtcbiAgICAgICAgaWQ6IHJvb3RLZXlJZCxcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYGVuYzoke3Bydn1gLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwdWI6ICdyb290LXB1YicsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0XG4gICAgICAgIC5nZXRVc2VyUHJ2KHtcbiAgICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgICAgICAgcHViOiBoYXJkZW5lZC5wdWIsXG4gICAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgICAgcGFyZW50OiByb290S2V5SWQsXG4gICAgICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGg6IFwibm90LWEtcGF0aCdcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9kZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWlscyBjbG9zZWQgZm9yIFRTUyBzYWZlIG93bmVyIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSByb290IHBydicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG1ha2VXYWxsZXQoeyBzYWZlOiAnc2FmZS1pZC0xJywgbXVsdGlzaWdUeXBlOiAndHNzJyB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0XG4gICAgICAgIC5nZXRVc2VyUHJ2KHtcbiAgICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgICAgICAgcHViOiAndW5yZWxhdGVkLWNoaWxkLXB1YicsXG4gICAgICAgICAgICB0eXBlOiAndHNzJyxcbiAgICAgICAgICAgIHBhcmVudDogcm9vdEtleUlkLFxuICAgICAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogJzEyMycsXG4gICAgICAgICAgICBjb21tb25LZXljaGFpbjogJ2NrJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFNhZmVPd25lclNpZ25pbmdOb3RJbXBsZW1lbnRlZEVycm9yKTtcbiAgICAgIGtleWNoYWluc0dldFN0dWIubm90Q2FsbGVkLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBtb2NrQmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQubm90Q2FsbGVkLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmFpbHMgY2xvc2VkIGZvciBlZDI1NTE5IG9uY2hhaW4gc2FmZSBvd25lciBpbnN0ZWFkIG9mIEJJUDMyLWRlcml2aW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0Jhc2VDb2luLmdldEZhbWlseS5yZXR1cm5zKCd4bG0nKTtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG1ha2VXYWxsZXQoeyBzYWZlOiAnc2FmZS1pZC0xJywgY29pbjogJ3R4bG0nIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRcbiAgICAgICAgLmdldFVzZXJQcnYoe1xuICAgICAgICAgIGtleWNoYWluOiB7XG4gICAgICAgICAgICBpZDogJ2NoaWxkLWtleScsXG4gICAgICAgICAgICBwdWI6ICdjaGlsZC1wdWInLFxuICAgICAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgICAgIHBhcmVudDogcm9vdEtleUlkLFxuICAgICAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogJzEyMycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChTYWZlT3duZXJTaWduaW5nTm90SW1wbGVtZW50ZWRFcnJvcik7XG4gICAgICBrZXljaGFpbnNHZXRTdHViLm5vdENhbGxlZC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgbW9ja0Jhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkLm5vdENhbGxlZC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Fib3J0cyBsb2NhbGx5IHdoZW4gZGVyaXZlZCBwdWIgZG9lcyBub3QgbWF0Y2ggcmVnaXN0ZXJlZCBjaGlsZCBwdWInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBtYWtlV2FsbGV0KHsgc2FmZTogJ3NhZmUtaWQtMScgfSk7XG4gICAgICBrZXljaGFpbnNHZXRTdHViLnJlc29sdmVzKHtcbiAgICAgICAgaWQ6IHJvb3RLZXlJZCxcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYGVuYzoke3Bydn1gLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwdWI6ICdyb290LXB1YicsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0XG4gICAgICAgIC5nZXRVc2VyUHJ2KHtcbiAgICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgICAgICAgcHViOiAneHB1Yi13cm9uZy1yZWdpc3RlcmVkLWtleScsXG4gICAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgICAgcGFyZW50OiByb290S2V5SWQsXG4gICAgICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGg6IFwibS8xMjMnXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChTYWZlRGVyaXZlZFB1YmxpY0tleU1pc21hdGNoRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlY3J5cHRzIGNoaWxkIGVuY3J5cHRlZFBydiBhcy1pcyBmb3Igd2FsbGV0IHNoYXJlZSAoaGFyZGVuZWQgY2hpbGQgcHJ2KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNoaWxkUHJ2ID0gJ2NoaWxkLWxldmVsLXBydic7XG4gICAgICBjb25zdCB3YWxsZXQgPSBtYWtlV2FsbGV0KHsgc2FmZTogJ3NhZmUtaWQtMScgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5nZXRVc2VyUHJ2KHtcbiAgICAgICAga2V5Y2hhaW46IHtcbiAgICAgICAgICBpZDogJ2NoaWxkLWtleScsXG4gICAgICAgICAgcHViOiAnY2hpbGQtcHViJyxcbiAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgIHBhcmVudDogcm9vdEtleUlkLFxuICAgICAgICAgIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6ICcxMjMnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogYGVuYzoke2NoaWxkUHJ2fWAsXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5lcWwoY2hpbGRQcnYpO1xuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5ub3RDYWxsZWQuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5kZXJpdmVLZXlXaXRoU2VlZC5ub3RDYWxsZWQuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBhdXRvLXBvcHVsYXRlIGNvbGREZXJpdmF0aW9uU2VlZCB3aGVuIGV4cGxpY2l0IHBydiBhbmQgZW5jcnlwdGVkUHJ2IGFyZSBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2hpbGRQcnYgPSAnY2hpbGQtbGV2ZWwtcHJ2JztcbiAgICAgIGNvbnN0IHdhbGxldCA9IG1ha2VXYWxsZXQoeyBzYWZlOiAnc2FmZS1pZC0xJyB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0LmdldFVzZXJQcnYoe1xuICAgICAgICBwcnY6IGNoaWxkUHJ2LFxuICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgIGlkOiAnY2hpbGQta2V5JyxcbiAgICAgICAgICBwdWI6ICdjaGlsZC1wdWInLFxuICAgICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgICAgcGFyZW50OiByb290S2V5SWQsXG4gICAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogJzEyMycsXG4gICAgICAgICAgZW5jcnlwdGVkUHJ2OiBgZW5jOiR7Y2hpbGRQcnZ9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmVxbChjaGlsZFBydik7XG4gICAgICBtb2NrQmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQubm90Q2FsbGVkLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RpbGwgYXV0by1wb3B1bGF0ZXMgY29sZERlcml2YXRpb25TZWVkIGZvciBTTUMgd2l0aCBwYXJhbXMucHJ2IGFuZCBubyBlbmNyeXB0ZWRQcnYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBtYWtlV2FsbGV0KCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdhbGxldC5nZXRVc2VyUHJ2KHtcbiAgICAgICAgcHJ2LFxuICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgIGlkOiAnc21jLWtleScsXG4gICAgICAgICAgcHViOiAnc21jLXB1YicsXG4gICAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiAnMTIzJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmVxbChzb2Z0RGVyaXZlZFBydik7XG4gICAgICBtb2NrQmFzZUNvaW4uZGVyaXZlS2V5V2l0aFNlZWQuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGFwcGx5IGFuIGV4cGxpY2l0IGNvbGREZXJpdmF0aW9uU2VlZCBhZnRlciBkZWNyeXB0aW5nIGVuY3J5cHRlZFBydicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG1ha2VXYWxsZXQoKTtcbiAgICAgIGNvbnN0IGNoaWxkUHJ2ID0gcHJ2O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuZ2V0VXNlclBydih7XG4gICAgICAgIGtleWNoYWluOiB7XG4gICAgICAgICAgaWQ6ICdzbWMta2V5JyxcbiAgICAgICAgICBwdWI6ICdzbWMtcHViJyxcbiAgICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgIGVuY3J5cHRlZFBydjogYGVuYzoke2NoaWxkUHJ2fWAsXG4gICAgICAgIH0sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2UsXG4gICAgICAgIGNvbGREZXJpdmF0aW9uU2VlZDogJzEyMycsXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5lcWwoY2hpbGRQcnYpO1xuICAgICAgbW9ja0Jhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkLm5vdENhbGxlZC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBlbmNyeXB0ZWRQcnYgZXJyb3IgYmVmb3JlIHdhbGxldFBhc3NwaHJhc2Ugd2hlbiBib3RoIGFyZSBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbWFrZVdhbGxldCgpO1xuICAgICAgYXdhaXQgd2FsbGV0XG4gICAgICAgIC5nZXRVc2VyUHJ2KHtcbiAgICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgICAgICAgcHViOiAncHViJyxcbiAgICAgICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3N0aWxsIGZhaWxzIGZvciBhIHNhZmUgb3duZXIgc28gd2FsbGV0IHNoYXJpbmcgY2Fubm90IG9idGFpbiByb290IG1hdGVyaWFsJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbWFrZVdhbGxldCh7IHNhZmU6ICdzYWZlLWlkLTEnIH0pO1xuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIGlkOiAndXNlci1rZXknLFxuICAgICAgICBwdWI6ICdjaGlsZC1wdWInLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwYXJlbnQ6IHJvb3RLZXlJZCxcbiAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogJzEyMycsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0LmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IpO1xuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5jYWxsZWQuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpZ25pbmcgZ3VhcmRzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uIGFsbG93cyBzYWZlIGNoaWxkIGtleWNoYWluIHdpdGhvdXQgZW5jcnlwdGVkUHJ2JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FsbGV0ID0gbWFrZVdhbGxldCh7XG4gICAgICAgIHNhZmU6ICdzYWZlLWlkLTEnLFxuICAgICAgICBtdWx0aXNpZ1R5cGU6ICd0c3MnLFxuICAgICAgICB0eXBlOiAnaG90JyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY2hpbGRLZXljaGFpbiA9IHtcbiAgICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgICBwdWI6ICdjaGlsZC1wdWInLFxuICAgICAgICB0eXBlOiAndHNzJyBhcyBjb25zdCxcbiAgICAgICAgcGFyZW50OiByb290S2V5SWQsXG4gICAgICAgIGNvbW1vbktleWNoYWluOiAnY2snLFxuICAgICAgfTtcbiAgICAgIGtleWNoYWluc0dldFN0dWIucmVzb2x2ZXMoe1xuICAgICAgICBpZDogcm9vdEtleUlkLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAgZW5jcnlwdGVkUHJ2OiBgZW5jOiR7cHJ2fWAsXG4gICAgICAgIHR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHB1YjogJ3Jvb3QtcHViJyxcbiAgICAgIH0pO1xuICAgICAgbW9ja0Jhc2VDb2luLmtleWNoYWlucy5yZXR1cm5zKHtcbiAgICAgICAgZ2V0OiBrZXljaGFpbnNHZXRTdHViLFxuICAgICAgICBnZXRLZXlzRm9yU2lnbmluZzogc2lub24uc3R1YigpLnJlc29sdmVzKFtjaGlsZEtleWNoYWluXSksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25TdHViID0gc2lub24uc3R1YihXYWxsZXQucHJvdG90eXBlLCAnc2lnblRyYW5zYWN0aW9uJykucmVzb2x2ZXMoeyB0eEhleDogJ3NpZ25lZCcgfSBhcyBhbnkpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXQuZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UmVxdWVzdElkOiAndHgtcmVxJyxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFzc3BocmFzZSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmVxbCh7IHR4SGV4OiAnc2lnbmVkJyB9KTtcbiAgICAgIHNpZ25TdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGNvbnN0IHNpZ25BcmdzID0gc2lnblN0dWIuZmlyc3RDYWxsLmFyZ3NbMF0gYXMgeyBrZXljaGFpbjogdHlwZW9mIGNoaWxkS2V5Y2hhaW4gfTtcbiAgICAgIHNpZ25BcmdzLmtleWNoYWluLnNob3VsZC5lcWwoY2hpbGRLZXljaGFpbik7XG4gICAgfSk7XG5cbiAgICBpdCgnZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbiByZWplY3RzIHdyb25nIHBhc3NwaHJhc2UgZWFybHkgZm9yIHNhZmUgY2hpbGQgd2FsbGV0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG1ha2VXYWxsZXQoe1xuICAgICAgICBzYWZlOiAnc2FmZS1pZC0xJyxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAndHNzJyxcbiAgICAgICAgdHlwZTogJ2hvdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNoaWxkS2V5Y2hhaW4gPSB7XG4gICAgICAgIGlkOiAnY2hpbGQta2V5JyxcbiAgICAgICAgcHViOiAnY2hpbGQtcHViJyxcbiAgICAgICAgdHlwZTogJ3RzcycgYXMgY29uc3QsXG4gICAgICAgIHBhcmVudDogcm9vdEtleUlkLFxuICAgICAgICBjb21tb25LZXljaGFpbjogJ2NrJyxcbiAgICAgIH07XG4gICAgICBrZXljaGFpbnNHZXRTdHViLnJlc29sdmVzKHtcbiAgICAgICAgaWQ6IHJvb3RLZXlJZCxcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYGVuYzoke3Bydn1gLFxuICAgICAgICB0eXBlOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICBwdWI6ICdyb290LXB1YicsXG4gICAgICB9KTtcbiAgICAgIG1vY2tCYXNlQ29pbi5rZXljaGFpbnMucmV0dXJucyh7XG4gICAgICAgIGdldDoga2V5Y2hhaW5zR2V0U3R1YixcbiAgICAgICAgZ2V0S2V5c0ZvclNpZ25pbmc6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyhbY2hpbGRLZXljaGFpbl0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBzaWduU3R1YiA9IHNpbm9uLnN0dWIoV2FsbGV0LnByb3RvdHlwZSwgJ3NpZ25UcmFuc2FjdGlvbicpO1xuXG4gICAgICBhd2FpdCB3YWxsZXRcbiAgICAgICAgLmdldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UmVxdWVzdElkOiAndHgtcmVxJyxcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnd3JvbmctcGFzc3BocmFzZScsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKEluY29ycmVjdFBhc3N3b3JkRXJyb3IpO1xuXG4gICAgICBzaWduU3R1Yi5ub3RDYWxsZWQuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleWNoYWluc0dldFN0dWIuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25UcmFuc2FjdGlvbiBkb2VzIG5vdCBwYXNzIHRoZSByb290IHBydiBpbnRvIFRTUyBzaWduaW5nIGZvciBhIHNhZmUgb3duZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YWxsZXQgPSBtYWtlV2FsbGV0KHtcbiAgICAgICAgc2FmZTogJ3NhZmUtaWQtMScsXG4gICAgICAgIG11bHRpc2lnVHlwZTogJ3RzcycsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjaGlsZEtleWNoYWluID0ge1xuICAgICAgICBpZDogJ2NoaWxkLWtleScsXG4gICAgICAgIHB1YjogJ2NoaWxkLXB1YicsXG4gICAgICAgIHR5cGU6ICd0c3MnIGFzIGNvbnN0LFxuICAgICAgICBwYXJlbnQ6IHJvb3RLZXlJZCxcbiAgICAgICAgY29tbW9uS2V5Y2hhaW46ICdjaycsXG4gICAgICB9O1xuICAgICAga2V5Y2hhaW5zR2V0U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIGlkOiByb290S2V5SWQsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGBlbmM6JHtwcnZ9YCxcbiAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgcHViOiAncm9vdC1wdWInLFxuICAgICAgfSk7XG4gICAgICBtb2NrQmFzZUNvaW4ua2V5Y2hhaW5zLnJldHVybnMoe1xuICAgICAgICBnZXQ6IGtleWNoYWluc0dldFN0dWIsXG4gICAgICAgIGdldEtleXNGb3JTaWduaW5nOiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoW2NoaWxkS2V5Y2hhaW5dKSxcbiAgICAgIH0pO1xuICAgICAgbW9ja0Jhc2VDb2luLnByZXNpZ25UcmFuc2FjdGlvbiA9IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHBhcmFtczogYW55KSA9PiBwYXJhbXMpO1xuICAgICAgbW9ja0Jhc2VDb2luLmdldE1QQ0FsZ29yaXRobSA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdlZGRzYScpO1xuICAgICAgY29uc3Qgc2lnblRzc1N0dWIgPSBzaW5vbi5zdHViKFdhbGxldC5wcm90b3R5cGUgYXMgYW55LCAnc2lnblRyYW5zYWN0aW9uVHNzJykucmVzb2x2ZXMoeyB0eEhleDogJ3NpZ25lZCcgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldFxuICAgICAgICAuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlLFxuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhSZXF1ZXN0SWQ6ICd0eC1yZXEnIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFNhZmVPd25lclNpZ25pbmdOb3RJbXBsZW1lbnRlZEVycm9yKTtcbiAgICAgIHNpZ25Uc3NTdHViLm5vdENhbGxlZC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnV0NOLTEyMDAgcmVjcmVhdGVBbmRTaWduVFNTVHJhbnNhY3Rpb24gc2FmZSBwYXRoJywgZnVuY3Rpb24gKCkge1xuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gbWFrZVBlbmRpbmdBcHByb3ZhbCh3YWxsZXQ6IGFueSkge1xuICAgIGNvbnN0IHJlY3JlYXRlVHhSZXF1ZXN0ID0gc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgIGFwaVZlcnNpb246ICdsaXRlJyxcbiAgICAgIHR4UmVxdWVzdElkOiAndHgtcmVxJyxcbiAgICAgIHVuc2lnbmVkVHhzOiBbeyBzZXJpYWxpemVkVHhIZXg6ICdkZWFkYmVlZicsIHNpZ25hYmxlSGV4OiAnYWInLCBkZXJpdmF0aW9uUGF0aDogJ20vMCcgfV0sXG4gICAgICB0cmFuc2FjdGlvbnM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IHBlbmRpbmdBcHByb3ZhbCA9IG5ldyBQZW5kaW5nQXBwcm92YWwoXG4gICAgICB7fSBhcyBhbnksXG4gICAgICB3YWxsZXQuYmFzZUNvaW4sXG4gICAgICB7XG4gICAgICAgIGlkOiAncGEwJyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eC1yZXEnLFxuICAgICAgICBpbmZvOiB7IHR5cGU6ICd0cmFuc2FjdGlvblJlcXVlc3QnLCB0cmFuc2FjdGlvblJlcXVlc3Q6IHsgcmVjaXBpZW50czogW10sIGNvaW5TcGVjaWZpYzoge30gfSB9LFxuICAgICAgICBzdGF0ZTogJ3BlbmRpbmcnLFxuICAgICAgICBjcmVhdG9yOiAndGVzdCcsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHdhbGxldFxuICAgICk7XG4gICAgKHBlbmRpbmdBcHByb3ZhbCBhcyBhbnkpLnRzc1V0aWxzID0geyByZWNyZWF0ZVR4UmVxdWVzdCB9O1xuICAgIHJldHVybiB7IHBlbmRpbmdBcHByb3ZhbCwgcmVjcmVhdGVUeFJlcXVlc3QgfTtcbiAgfVxuXG4gIGl0KCd1c2VzIGdldFVzZXJQcnYgZm9yIHRoZSBzYWZlIG93bmVyIChtaW50ZXIpIGluc3RlYWQgb2YgZ2V0UHJ2JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNoaWxkVXNlcktleWNoYWluID0ge1xuICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgcHViOiAnY2hpbGQtcHViJyxcbiAgICAgIHR5cGU6ICd0c3MnLFxuICAgICAgcGFyZW50OiAncm9vdC1rZXktaWQnLFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogJ3NlZWQnLFxuICAgIH07XG4gICAgY29uc3QgZ2V0S2V5c0ZvclNpZ25pbmcgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoW2NoaWxkVXNlcktleWNoYWluXSk7XG4gICAgY29uc3QgZ2V0VXNlclBydiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZGVjcnlwdGVkUHJ2Jyk7XG4gICAgY29uc3QgZ2V0UHJ2ID0gc2lub24uc3R1YigpLnJlc29sdmVzKCdzaG91bGQtbm90LWJlLWNhbGxlZCcpO1xuICAgIGNvbnN0IHdhbGxldDogYW55ID0ge1xuICAgICAgc2FmZUlkOiAoKSA9PiAnc2FmZS1pZC0xJyxcbiAgICAgIGdldFVzZXJQcnYsXG4gICAgICBnZXRQcnYsXG4gICAgICBiYXNlQ29pbjoge1xuICAgICAgICBrZXljaGFpbnM6ICgpID0+ICh7IGdldEtleXNGb3JTaWduaW5nIH0pLFxuICAgICAgICBzdXBwb3J0c1RzczogKCkgPT4gdHJ1ZSxcbiAgICAgICAgZ2V0TVBDQWxnb3JpdGhtOiAoKSA9PiAnZWRkc2EnLFxuICAgICAgfSxcbiAgICAgIG11bHRpc2lnVHlwZVZlcnNpb246ICgpID0+IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIGNvbnN0IHsgcGVuZGluZ0FwcHJvdmFsLCByZWNyZWF0ZVR4UmVxdWVzdCB9ID0gbWFrZVBlbmRpbmdBcHByb3ZhbCh3YWxsZXQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVuZGluZ0FwcHJvdmFsLnJlY3JlYXRlQW5kU2lnblRTU1RyYW5zYWN0aW9uKFxuICAgICAgeyB3YWxsZXRQYXNzcGhyYXNlOiAncGFzcycgfSxcbiAgICAgIG5ldyBSZXF1ZXN0VHJhY2VyKClcbiAgICApO1xuXG4gICAgcmVzdWx0LnNob3VsZC5lcWwoeyB0eEhleDogJ2RlYWRiZWVmJyB9KTtcbiAgICBnZXRQcnYubm90Q2FsbGVkLnNob3VsZC5iZS50cnVlKCk7XG4gICAgZ2V0S2V5c0ZvclNpZ25pbmcuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIGdldFVzZXJQcnZcbiAgICAgIC5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoe1xuICAgICAgICBrZXljaGFpbjogY2hpbGRVc2VyS2V5Y2hhaW4sXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzJyxcbiAgICAgIH0pXG4gICAgICAuc2hvdWxkLmJlLnRydWUoKTtcbiAgICByZWNyZWF0ZVR4UmVxdWVzdC5jYWxsZWRPbmNlLnNob3VsZC5iZS50cnVlKCk7XG4gIH0pO1xuXG4gIGl0KCd1c2VzIGdldFBydiBmb3IgYSBzYWZlIHdhbGxldCBzaGFyZWUgKGNoaWxkIGVuY3J5cHRlZFBydiBhbHJlYWR5IHByZXNlbnQpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGNoaWxkVXNlcktleWNoYWluID0ge1xuICAgICAgaWQ6ICdjaGlsZC1rZXknLFxuICAgICAgcHViOiAnY2hpbGQtcHViJyxcbiAgICAgIHR5cGU6ICd0c3MnLFxuICAgICAgcGFyZW50OiAncm9vdC1rZXktaWQnLFxuICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogJ3NlZWQnLFxuICAgICAgZW5jcnlwdGVkUHJ2OiAnZW5jOnNoYXJlZS1wcnYnLFxuICAgIH07XG4gICAgY29uc3QgZ2V0S2V5c0ZvclNpZ25pbmcgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoW2NoaWxkVXNlcktleWNoYWluXSk7XG4gICAgY29uc3QgZ2V0VXNlclBydiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnc2hvdWxkLW5vdC1iZS1jYWxsZWQnKTtcbiAgICBjb25zdCBnZXRQcnYgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ3NoYXJlZS1wcnYnKTtcbiAgICBjb25zdCB3YWxsZXQ6IGFueSA9IHtcbiAgICAgIHNhZmVJZDogKCkgPT4gJ3NhZmUtaWQtMScsXG4gICAgICBnZXRVc2VyUHJ2LFxuICAgICAgZ2V0UHJ2LFxuICAgICAgYmFzZUNvaW46IHtcbiAgICAgICAga2V5Y2hhaW5zOiAoKSA9PiAoeyBnZXRLZXlzRm9yU2lnbmluZyB9KSxcbiAgICAgICAgc3VwcG9ydHNUc3M6ICgpID0+IHRydWUsXG4gICAgICAgIGdldE1QQ0FsZ29yaXRobTogKCkgPT4gJ2VkZHNhJyxcbiAgICAgIH0sXG4gICAgICBtdWx0aXNpZ1R5cGVWZXJzaW9uOiAoKSA9PiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBjb25zdCB7IHBlbmRpbmdBcHByb3ZhbCwgcmVjcmVhdGVUeFJlcXVlc3QgfSA9IG1ha2VQZW5kaW5nQXBwcm92YWwod2FsbGV0KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBlbmRpbmdBcHByb3ZhbC5yZWNyZWF0ZUFuZFNpZ25UU1NUcmFuc2FjdGlvbihcbiAgICAgIHsgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3MnIH0sXG4gICAgICBuZXcgUmVxdWVzdFRyYWNlcigpXG4gICAgKTtcblxuICAgIHJlc3VsdC5zaG91bGQuZXFsKHsgdHhIZXg6ICdkZWFkYmVlZicgfSk7XG4gICAgZ2V0VXNlclBydi5ub3RDYWxsZWQuc2hvdWxkLmJlLnRydWUoKTtcbiAgICBnZXRQcnYuY2FsbGVkT25jZVdpdGhFeGFjdGx5KHsgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3MnIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgcmVjcmVhdGVUeFJlcXVlc3QuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICB9KTtcbn0pO1xuIl19