@bitgo-beta/sdk-core 8.2.1-beta.196 → 8.2.1-beta.1960

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 (678) 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 +54 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +101 -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 +121 -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 +279 -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 -95
  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 +117 -0
  114. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  115. package/dist/src/bitgo/defi/defiVault.js +355 -0
  116. package/dist/src/bitgo/defi/iDefiVault.d.ts +80 -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 +121 -12
  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 +258 -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 +238 -110
  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/iSafe.d.ts +85 -0
  201. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
  202. package/dist/src/bitgo/safe/iSafe.js +3 -0
  203. package/dist/src/bitgo/safe/iSafes.d.ts +89 -0
  204. package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
  205. package/dist/src/bitgo/safe/iSafes.js +3 -0
  206. package/dist/src/bitgo/safe/index.d.ts +5 -0
  207. package/dist/src/bitgo/safe/index.d.ts.map +1 -0
  208. package/dist/src/bitgo/safe/index.js +21 -0
  209. package/dist/src/bitgo/safe/safe.d.ts +66 -0
  210. package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
  211. package/dist/src/bitgo/safe/safe.js +96 -0
  212. package/dist/src/bitgo/safe/safes.d.ts +106 -0
  213. package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
  214. package/dist/src/bitgo/safe/safes.js +298 -0
  215. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  216. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  217. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  218. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  219. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  220. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  221. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  222. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  223. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  224. package/dist/src/bitgo/staking/iStakingWallet.d.ts +157 -8
  225. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  226. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  227. package/dist/src/bitgo/staking/index.d.ts +3 -0
  228. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  229. package/dist/src/bitgo/staking/index.js +9 -2
  230. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  231. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  232. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  233. package/dist/src/bitgo/trading/iTradingAccount.d.ts +13 -1
  234. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  235. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  236. package/dist/src/bitgo/trading/index.d.ts +1 -0
  237. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  238. package/dist/src/bitgo/trading/index.js +7 -2
  239. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  240. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  241. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  242. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  243. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  244. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  245. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  246. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  247. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  248. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  249. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  250. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  251. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  252. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  253. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  254. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  255. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  256. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  257. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  258. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  259. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  260. package/dist/src/bitgo/trading/network/index.d.ts +2 -0
  261. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -1
  262. package/dist/src/bitgo/trading/network/index.js +8 -2
  263. package/dist/src/bitgo/trading/network/network.d.ts +4 -3
  264. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
  265. package/dist/src/bitgo/trading/network/network.js +24 -27
  266. package/dist/src/bitgo/trading/network/types.d.ts +79 -46
  267. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
  268. package/dist/src/bitgo/trading/network/types.js +1 -1
  269. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  270. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  271. package/dist/src/bitgo/trading/network/utils.js +54 -0
  272. package/dist/src/bitgo/trading/tradingAccount.d.ts +15 -1
  273. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  274. package/dist/src/bitgo/trading/tradingAccount.js +55 -7
  275. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
  276. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  277. package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
  278. package/dist/src/bitgo/tss/common.d.ts +40 -6
  279. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  280. package/dist/src/bitgo/tss/common.js +124 -17
  281. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  282. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  283. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  284. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  285. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  286. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  287. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  288. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  289. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  290. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  291. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  292. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  293. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  294. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  295. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  296. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +42 -0
  297. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  298. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +104 -0
  299. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  300. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  301. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  302. package/dist/src/bitgo/tss/index.d.ts +3 -2
  303. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  304. package/dist/src/bitgo/tss/index.js +26 -10
  305. package/dist/src/bitgo/tss/types.d.ts +3 -3
  306. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  307. package/dist/src/bitgo/tss/types.js +2 -2
  308. package/dist/src/bitgo/types.d.ts +3 -3
  309. package/dist/src/bitgo/types.d.ts.map +1 -1
  310. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +10 -0
  311. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  312. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +76 -14
  313. package/dist/src/bitgo/utils/codecProps.js +24 -11
  314. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  315. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  316. package/dist/src/bitgo/utils/codecs.js +59 -0
  317. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  318. package/dist/src/bitgo/utils/decode.js +30 -16
  319. package/dist/src/bitgo/utils/index.d.ts +4 -2
  320. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  321. package/dist/src/bitgo/utils/index.js +27 -11
  322. package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
  323. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  324. package/dist/src/bitgo/utils/messageTypes.js +17 -0
  325. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  326. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  327. package/dist/src/bitgo/utils/mpcUtils.js +160 -14
  328. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  329. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  330. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  331. package/dist/src/bitgo/utils/opengpgUtils.d.ts +10 -7
  332. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  333. package/dist/src/bitgo/utils/opengpgUtils.js +75 -62
  334. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  335. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  336. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  337. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  338. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  339. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  340. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  341. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  342. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  343. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  344. package/dist/src/bitgo/utils/triple.js +2 -3
  345. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  346. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  347. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  348. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +90 -17
  349. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  350. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +280 -45
  351. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +420 -55
  352. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  353. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  354. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  355. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  356. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  357. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  358. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  359. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  360. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +25 -51
  361. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  362. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +173 -246
  363. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +216 -0
  364. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  365. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1049 -0
  366. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  367. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  368. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +16 -0
  369. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  370. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  371. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  372. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  373. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  374. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  375. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  376. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  377. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  378. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  379. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  380. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  381. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  382. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  383. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  384. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +38 -11
  385. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  386. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +254 -96
  387. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +156 -0
  388. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  389. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +738 -0
  390. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  391. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  392. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +16 -0
  393. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
  394. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  395. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
  396. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +12 -7
  397. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  398. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  399. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  400. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  401. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  402. package/dist/src/bitgo/utils/tss/index.d.ts +3 -0
  403. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  404. package/dist/src/bitgo/utils/tss/index.js +26 -9
  405. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  406. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  407. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  408. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +41 -0
  409. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  410. package/dist/src/bitgo/utils/tss/recipientUtils.js +139 -0
  411. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts +8 -0
  412. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts.map +1 -0
  413. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.js +13 -0
  414. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  415. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  416. package/dist/src/bitgo/utils/txRequest.js +49 -0
  417. package/dist/src/bitgo/utils/util.js +24 -10
  418. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  419. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  420. package/dist/src/bitgo/utils/wallet.js +48 -0
  421. package/dist/src/bitgo/v1Wallets.d.ts +170 -0
  422. package/dist/src/bitgo/v1Wallets.d.ts.map +1 -0
  423. package/dist/src/bitgo/v1Wallets.js +3 -0
  424. package/dist/src/bitgo/wallet/BuildParams.d.ts +80 -1
  425. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  426. package/dist/src/bitgo/wallet/BuildParams.js +83 -11
  427. package/dist/src/bitgo/wallet/iWallet.d.ts +534 -31
  428. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  429. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  430. package/dist/src/bitgo/wallet/iWallets.d.ts +308 -16
  431. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  432. package/dist/src/bitgo/wallet/iWallets.js +83 -3
  433. package/dist/src/bitgo/wallet/index.js +6 -2
  434. package/dist/src/bitgo/wallet/wallet.d.ts +349 -28
  435. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  436. package/dist/src/bitgo/wallet/wallet.js +2118 -384
  437. package/dist/src/bitgo/wallet/wallets.d.ts +93 -4
  438. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  439. package/dist/src/bitgo/wallet/wallets.js +1153 -155
  440. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  441. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  442. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  443. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  444. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  445. package/dist/src/bitgo/walletUtil/index.js +19 -0
  446. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  447. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  448. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  449. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  450. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  451. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  452. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  453. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  454. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  455. package/dist/src/bitgo/webhook/index.js +6 -2
  456. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  457. package/dist/src/coins/fiat.d.ts +45 -0
  458. package/dist/src/coins/fiat.d.ts.map +1 -0
  459. package/dist/src/coins/fiat.js +94 -0
  460. package/dist/src/coins/index.d.ts +1 -6
  461. package/dist/src/coins/index.d.ts.map +1 -1
  462. package/dist/src/coins/index.js +7 -8
  463. package/dist/src/coins/ofc.d.ts +21 -2
  464. package/dist/src/coins/ofc.d.ts.map +1 -1
  465. package/dist/src/coins/ofc.js +29 -3
  466. package/dist/src/coins/ofcToken.d.ts +15 -4
  467. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  468. package/dist/src/coins/ofcToken.js +43 -5
  469. package/dist/src/coins/susd.d.ts +3 -2
  470. package/dist/src/coins/susd.d.ts.map +1 -1
  471. package/dist/src/coins/susd.js +5 -1
  472. package/dist/src/common.js +27 -13
  473. package/dist/src/index.d.ts +7 -1
  474. package/dist/src/index.d.ts.map +1 -1
  475. package/dist/src/index.js +32 -11
  476. package/dist/src/lightning.d.ts +20 -0
  477. package/dist/src/lightning.d.ts.map +1 -0
  478. package/dist/src/lightning.js +13 -0
  479. package/dist/src/units.js +5 -6
  480. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  481. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  482. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  483. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  484. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  485. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  486. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  487. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  488. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  489. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  490. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  491. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  492. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  493. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  494. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  495. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  496. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  497. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  498. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  499. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  500. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  501. package/dist/test/unit/bitgo/defi/defiVault.js +545 -0
  502. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  503. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  504. package/dist/test/unit/bitgo/environment.js +38 -0
  505. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  506. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  507. package/dist/test/unit/bitgo/errors.js +262 -0
  508. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  509. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  510. package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
  511. package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
  512. package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
  513. package/dist/test/unit/bitgo/safe/safe.js +134 -0
  514. package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
  515. package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
  516. package/dist/test/unit/bitgo/safe/safes.js +297 -0
  517. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  518. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  519. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  520. package/dist/test/unit/bitgo/trading/network/network.test.d.ts +2 -0
  521. package/dist/test/unit/bitgo/trading/network/network.test.d.ts.map +1 -0
  522. package/dist/test/unit/bitgo/trading/network/network.test.js +136 -0
  523. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  524. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  525. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  526. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -4
  527. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  528. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  529. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  530. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  531. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  532. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  533. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  534. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  535. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  536. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  537. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  538. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  539. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +348 -0
  540. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  541. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  542. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  543. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  544. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  545. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +999 -0
  546. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  547. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  548. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  549. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  550. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  551. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  552. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  553. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  554. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1548 -0
  555. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  556. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  557. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  558. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  559. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  560. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  561. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  562. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  563. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +348 -0
  564. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  565. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  566. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  567. package/dist/test/unit/bitgo/utils/wallet.d.ts +2 -0
  568. package/dist/test/unit/bitgo/utils/wallet.d.ts.map +1 -0
  569. package/dist/test/unit/bitgo/utils/wallet.js +55 -0
  570. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  571. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  572. package/dist/test/unit/bitgo/wallet/BuildParams.js +124 -0
  573. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +30 -9
  574. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  575. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  576. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  577. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  578. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  579. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  580. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  581. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  582. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  583. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  584. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  585. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  586. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts +2 -0
  587. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts.map +1 -0
  588. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.js +20 -0
  589. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  590. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  591. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  592. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  593. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  594. package/dist/test/unit/bitgo/wallet/tokenApproval.js +201 -0
  595. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  596. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  597. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  598. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  599. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  600. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +66 -0
  601. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  602. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  603. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  604. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  605. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  606. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
  607. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  608. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  609. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  610. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  611. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  612. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +670 -0
  613. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts +2 -0
  614. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts.map +1 -0
  615. package/dist/test/unit/bitgo/wallet/walletsGoAccount.js +150 -0
  616. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  617. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  618. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
  619. package/dist/test/unit/coins/ofc.d.ts +2 -0
  620. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  621. package/dist/test/unit/coins/ofc.js +124 -0
  622. package/dist/test/unit/lightning.d.ts +2 -0
  623. package/dist/test/unit/lightning.d.ts.map +1 -0
  624. package/dist/test/unit/lightning.js +23 -0
  625. package/dist/test/unit/units.d.ts.map +1 -1
  626. package/dist/test/unit/units.js +64 -64
  627. package/dist/tsconfig.tsbuildinfo +1 -1
  628. package/package.json +23 -21
  629. package/.eslintignore +0 -5
  630. package/CHANGELOG.md +0 -1638
  631. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  632. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  633. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  634. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  635. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  636. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  637. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  638. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  639. package/dist/src/bitgo/lightning/index.js +0 -17
  640. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  641. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  642. package/dist/src/bitgo/lightning/lightning.js +0 -111
  643. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  644. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  645. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  646. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  647. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  648. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  649. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  650. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  651. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  652. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  653. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  654. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  655. package/dist/src/coins/fiateur.d.ts +0 -31
  656. package/dist/src/coins/fiateur.d.ts.map +0 -1
  657. package/dist/src/coins/fiateur.js +0 -57
  658. package/dist/src/coins/fiatgbp.d.ts +0 -31
  659. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  660. package/dist/src/coins/fiatgbp.js +0 -57
  661. package/dist/src/coins/fiatusd.d.ts +0 -31
  662. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  663. package/dist/src/coins/fiatusd.js +0 -57
  664. package/dist/src/coins/tfiateur.d.ts +0 -11
  665. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  666. package/dist/src/coins/tfiateur.js +0 -17
  667. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  668. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  669. package/dist/src/coins/tfiatgbp.js +0 -17
  670. package/dist/src/coins/tfiatusd.d.ts +0 -11
  671. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  672. package/dist/src/coins/tfiatusd.js +0 -17
  673. package/dist/src/openssl/index.d.ts +0 -5
  674. package/dist/src/openssl/index.d.ts.map +0 -1
  675. package/dist/src/openssl/index.js +0 -9
  676. package/dist/test/unit/openssl.d.ts +0 -2
  677. package/dist/test/unit/openssl.d.ts.map +0 -1
  678. package/dist/test/unit/openssl.js +0 -39
@@ -0,0 +1,545 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sinon_1 = __importDefault(require("sinon"));
7
+ const assert_1 = __importDefault(require("assert"));
8
+ require("should");
9
+ const public_types_1 = require("@bitgo/public-types");
10
+ const src_1 = require("../../../../src");
11
+ describe('DefiVault', function () {
12
+ let wallet;
13
+ let defiVault;
14
+ let mockBitGo;
15
+ let mockBaseCoin;
16
+ // Helper to create a chainable request mock
17
+ function mockRequest(result) {
18
+ return {
19
+ send: sinon_1.default.stub().returnsThis(),
20
+ set: sinon_1.default.stub().returnsThis(),
21
+ query: sinon_1.default.stub().returnsThis(),
22
+ result: sinon_1.default.stub().resolves(result),
23
+ };
24
+ }
25
+ function makeConcreteVault(id) {
26
+ return {
27
+ id,
28
+ name: 'Concrete BTC Vault',
29
+ protocol: public_types_1.VaultProtocol.CONCRETE_BTCCX,
30
+ status: 'active',
31
+ coin: 'btc',
32
+ assetToken: 'btc',
33
+ shareToken: 'cbtc',
34
+ riskManager: 'manager-1',
35
+ custodyType: 'qualified',
36
+ vaultContractAddress: '0xVaultContract',
37
+ };
38
+ }
39
+ function makeMorphoVault(id) {
40
+ return {
41
+ id,
42
+ name: 'Morpho USDC Vault',
43
+ protocol: public_types_1.VaultProtocol.MORPHO,
44
+ status: 'active',
45
+ coin: 'eth',
46
+ assetToken: 'usdc',
47
+ shareToken: 'musdc',
48
+ riskManager: 'manager-2',
49
+ custodyType: 'qualified',
50
+ vaultContractAddress: '0xMorphoVault',
51
+ };
52
+ }
53
+ beforeEach(function () {
54
+ mockBitGo = {
55
+ post: sinon_1.default.stub(),
56
+ get: sinon_1.default.stub(),
57
+ del: sinon_1.default.stub(),
58
+ url: sinon_1.default.stub().callsFake((path, version) => `https://bitgo.com/api/v${version}${path}`),
59
+ microservicesUrl: sinon_1.default.stub().callsFake((path) => `https://bitgo.com${path}`),
60
+ setRequestTracer: sinon_1.default.stub(),
61
+ };
62
+ mockBaseCoin = {
63
+ getFamily: sinon_1.default.stub().returns('eth'),
64
+ url: sinon_1.default.stub(),
65
+ keychains: sinon_1.default.stub(),
66
+ supportsTss: sinon_1.default.stub().returns(true),
67
+ getMPCAlgorithm: sinon_1.default.stub(),
68
+ };
69
+ const mockWalletData = {
70
+ id: 'test-wallet-id',
71
+ coin: 'eth',
72
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
73
+ enterprise: 'test-enterprise-id',
74
+ };
75
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
76
+ defiVault = wallet.defi;
77
+ });
78
+ afterEach(function () {
79
+ sinon_1.default.restore();
80
+ });
81
+ describe('getVaultConfig', function () {
82
+ it('should fetch vault config for a given vaultId', async function () {
83
+ const vaultConfig = {
84
+ id: 'vlt-concrete-1',
85
+ name: 'Concrete BTC Vault',
86
+ protocol: public_types_1.VaultProtocol.CONCRETE_BTCCX,
87
+ status: 'active',
88
+ coin: 'btc',
89
+ assetToken: 'btc',
90
+ shareToken: 'cbtc',
91
+ riskManager: 'manager-1',
92
+ custodyType: 'qualified',
93
+ vaultContractAddress: '0xVaultContract',
94
+ concreteConfig: {
95
+ sourceWalletId: 'src-wallet',
96
+ escrowWalletId: 'escrow-wallet',
97
+ escrowDepositAddress: '1ExampleBtcAddress',
98
+ positionWalletId: 'pos-wallet',
99
+ positionBaseAddress: '1PositionAddress',
100
+ },
101
+ };
102
+ const req = mockRequest(vaultConfig);
103
+ mockBitGo.get.returns(req);
104
+ const result = await defiVault.getVaultConfig({ vaultId: 'vlt-concrete-1' });
105
+ result.should.deepEqual(vaultConfig);
106
+ mockBitGo.get.calledWith('https://bitgo.com/api/defi-service/v1/vaults/vlt-concrete-1').should.be.true();
107
+ req.set.calledWith('enterprise-id', 'test-enterprise-id').should.be.true();
108
+ });
109
+ it('should throw if vaultId is missing', async function () {
110
+ await assert_1.default.rejects(() => defiVault.getVaultConfig({ vaultId: '' }), {
111
+ message: 'vaultId is required',
112
+ });
113
+ });
114
+ it('should propagate errors from the API (e.g. 404)', async function () {
115
+ const req = mockRequest(null);
116
+ req.result.rejects(new Error('Not Found'));
117
+ mockBitGo.get.returns(req);
118
+ await assert_1.default.rejects(() => defiVault.getVaultConfig({ vaultId: 'vlt-not-found' }), {
119
+ message: 'Not Found',
120
+ });
121
+ });
122
+ });
123
+ describe('depositToVault', function () {
124
+ describe('concrete_btccx provider', function () {
125
+ it('should call sendMany once with defi-deposit type and no recipients', async function () {
126
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-1')));
127
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany').resolves({
128
+ pendingApproval: {
129
+ id: 'pa-uuid-123',
130
+ state: 'awaitingSignature',
131
+ },
132
+ });
133
+ const result = await defiVault.depositToVault({
134
+ vaultId: 'vlt-btc-1',
135
+ amount: '5000000',
136
+ });
137
+ // Returns ConcreteDepositResult shape
138
+ result.pendingApprovalId.should.equal('pa-uuid-123');
139
+ result.state.should.equal('awaitingSignature');
140
+ // Only one sendMany call — no second deposit sendMany
141
+ sendManyStub.calledOnce.should.be.true();
142
+ const callArgs = sendManyStub.firstCall.args[0];
143
+ callArgs.type.should.equal('defi-deposit');
144
+ callArgs.defiParams.vaultId.should.equal('vlt-btc-1');
145
+ callArgs.defiParams.amount.should.equal('5000000');
146
+ callArgs.defiParams.actionType.should.equal('defi-deposit');
147
+ // No recipients key at all
148
+ assert_1.default.strictEqual(callArgs.recipients, undefined);
149
+ });
150
+ it('should pass walletPassphrase when provided', async function () {
151
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-2')));
152
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany').resolves({
153
+ pendingApproval: { id: 'pa-uuid-456', state: 'awaitingSignature' },
154
+ });
155
+ await defiVault.depositToVault({
156
+ vaultId: 'vlt-btc-2',
157
+ amount: '1000000',
158
+ walletPassphrase: 'hunter2',
159
+ });
160
+ const callArgs = sendManyStub.firstCall.args[0];
161
+ callArgs.walletPassphrase.should.equal('hunter2');
162
+ });
163
+ it('should default state to awaitingSignature when absent from pendingApproval', async function () {
164
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-3')));
165
+ sinon_1.default.stub(wallet, 'sendMany').resolves({
166
+ pendingApproval: { id: 'pa-no-state' },
167
+ });
168
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-btc-3', amount: '1000000' });
169
+ result.state.should.equal('awaitingSignature');
170
+ });
171
+ it('should throw when sendMany returns no pendingApproval', async function () {
172
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-4')));
173
+ sinon_1.default.stub(wallet, 'sendMany').resolves({ txRequest: { txRequestId: 'unexpected' } });
174
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-btc-4', amount: '1000000' }), {
175
+ message: 'defi-deposit sendMany response: unknown; unknown',
176
+ });
177
+ });
178
+ });
179
+ describe('morpho provider', function () {
180
+ it('should call sendMany for approve and deposit on happy path', async function () {
181
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
182
+ const operationId = 'op-uuid-123';
183
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
184
+ // WP writes operationId into the built tx's coinSpecific (full apiVersion),
185
+ // not into the intent — mirror that real shape here.
186
+ sendManyStub.onFirstCall().resolves({
187
+ txRequest: {
188
+ txRequestId: 'txreq-approve-1',
189
+ intent: { intentType: 'defi-approve' },
190
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
191
+ },
192
+ });
193
+ sendManyStub.onSecondCall().resolves({
194
+ txRequest: {
195
+ txRequestId: 'txreq-deposit-1',
196
+ intent: { intentType: 'defi-deposit' },
197
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
198
+ },
199
+ });
200
+ const result = await defiVault.depositToVault({
201
+ vaultId: 'vlt-galaxy-usdc',
202
+ amount: '1000000',
203
+ });
204
+ result.operationId.should.equal(operationId);
205
+ result.txRequestIds.approve.should.equal('txreq-approve-1');
206
+ result.txRequestIds.deposit.should.equal('txreq-deposit-1');
207
+ // Verify sendMany was called with correct params for approve
208
+ sendManyStub.calledTwice.should.be.true();
209
+ const approveArgs = sendManyStub.firstCall.args[0];
210
+ approveArgs.type.should.equal('defiApprove');
211
+ approveArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
212
+ approveArgs.defiParams.amount.should.equal('1000000');
213
+ // Verify sendMany was called with correct params for deposit
214
+ const depositArgs = sendManyStub.secondCall.args[0];
215
+ depositArgs.type.should.equal('defiDeposit');
216
+ depositArgs.defiParams.operationId.should.equal(operationId);
217
+ });
218
+ it('should extract operationId from the lite apiVersion coinSpecific', async function () {
219
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
220
+ const operationId = 'op-uuid-lite';
221
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
222
+ sendManyStub.onFirstCall().resolves({
223
+ txRequest: {
224
+ txRequestId: 'txreq-approve-lite',
225
+ intent: { intentType: 'defi-approve' },
226
+ unsignedTxs: [{ coinSpecific: { operationId } }],
227
+ },
228
+ });
229
+ sendManyStub.onSecondCall().resolves({
230
+ txRequest: { txRequestId: 'txreq-deposit-lite' },
231
+ });
232
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' });
233
+ result.operationId.should.equal(operationId);
234
+ const depositArgs = sendManyStub.secondCall.args[0];
235
+ depositArgs.defiParams.operationId.should.equal(operationId);
236
+ });
237
+ it('should fall back to intent.operationId for forward-compat', async function () {
238
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
239
+ const operationId = 'op-uuid-intent';
240
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
241
+ sendManyStub.onFirstCall().resolves({
242
+ txRequest: {
243
+ txRequestId: 'txreq-approve-intent',
244
+ intent: { intentType: 'defi-approve', operationId },
245
+ },
246
+ });
247
+ sendManyStub.onSecondCall().resolves({
248
+ txRequest: { txRequestId: 'txreq-deposit-intent' },
249
+ });
250
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' });
251
+ result.operationId.should.equal(operationId);
252
+ });
253
+ it('should throw when operationId is absent from the approve txRequest', async function () {
254
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
255
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
256
+ sendManyStub.onFirstCall().resolves({
257
+ txRequest: {
258
+ txRequestId: 'txreq-approve-missing',
259
+ intent: { intentType: 'defi-approve' },
260
+ transactions: [{ unsignedTx: { coinSpecific: {} } }],
261
+ },
262
+ });
263
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), {
264
+ message: 'operationId not found in approve txRequest response',
265
+ });
266
+ // Deposit sendMany must not be issued when the operationId is missing
267
+ sendManyStub.calledOnce.should.be.true();
268
+ });
269
+ // TODO(CGD-1709): Re-enable when active operation pre-flight check is restored
270
+ xit('should reject when an active operation already exists', async function () {
271
+ const preflightReq = mockRequest({
272
+ items: [{ operationId: 'existing-op-id', state: 'APPROVE_TX_REQUESTED' }],
273
+ });
274
+ mockBitGo.get.returns(preflightReq);
275
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), (err) => {
276
+ (err instanceof src_1.ActiveOperationExistsError).should.be.true();
277
+ err.operationId.should.equal('existing-op-id');
278
+ return true;
279
+ });
280
+ });
281
+ it('should propagate deposit sendMany failure without cleanup', async function () {
282
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
283
+ const operationId = 'op-uuid-456';
284
+ // Mock sendMany: approve succeeds, deposit fails
285
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
286
+ sendManyStub.onFirstCall().resolves({
287
+ txRequest: {
288
+ txRequestId: 'txreq-approve-2',
289
+ intent: { intentType: 'defi-approve' },
290
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
291
+ },
292
+ });
293
+ sendManyStub.onSecondCall().rejects(new Error('deposit creation failed'));
294
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), {
295
+ message: 'deposit creation failed',
296
+ });
297
+ // SDK does not attempt cleanup — reconciler handles orphaned approvals
298
+ mockBitGo.del.called.should.be.false();
299
+ });
300
+ it('should throw if vaultId is missing', async function () {
301
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: '', amount: '1000000' }), {
302
+ message: 'vaultId is required',
303
+ });
304
+ });
305
+ it('should throw if amount is missing', async function () {
306
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-1', amount: '' }), {
307
+ message: 'amount is required',
308
+ });
309
+ });
310
+ });
311
+ it('should throw if vaultId is missing', async function () {
312
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: '', amount: '1000000' }), {
313
+ message: 'vaultId is required',
314
+ });
315
+ });
316
+ it('should throw if amount is missing', async function () {
317
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-1')));
318
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-1', amount: '' }), {
319
+ message: 'amount is required',
320
+ });
321
+ });
322
+ });
323
+ describe('resumeDeposit', function () {
324
+ it('should issue the deposit sendMany for a partial operation', async function () {
325
+ const operation = {
326
+ operationId: 'op-resume-1',
327
+ walletId: 'test-wallet-id',
328
+ vaultId: 'vlt-galaxy-usdc',
329
+ type: 'DEPOSIT',
330
+ assetAmount: '1000000',
331
+ state: 'APPROVE_TX_REQUESTED',
332
+ txRequestId: 'txreq-approve-existing',
333
+ associatedTxRequestId: undefined,
334
+ createdAt: '2026-05-14T07:12:00Z',
335
+ updatedAt: '2026-05-14T07:12:00Z',
336
+ };
337
+ // getOperation call
338
+ const getOpReq = mockRequest(operation);
339
+ mockBitGo.get.returns(getOpReq);
340
+ // deposit sendMany
341
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
342
+ sendManyStub.resolves({
343
+ txRequest: {
344
+ txRequestId: 'txreq-deposit-resume',
345
+ intent: { intentType: 'defi-deposit', operationId: 'op-resume-1' },
346
+ },
347
+ });
348
+ const result = await defiVault.resumeDeposit({ operationId: 'op-resume-1' });
349
+ result.operationId.should.equal('op-resume-1');
350
+ result.txRequestIds.approve.should.equal('txreq-approve-existing');
351
+ result.txRequestIds.deposit.should.equal('txreq-deposit-resume');
352
+ // Verify sendMany was called with correct defiParams
353
+ const depositArgs = sendManyStub.firstCall.args[0];
354
+ depositArgs.type.should.equal('defiDeposit');
355
+ depositArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
356
+ depositArgs.defiParams.amount.should.equal('1000000');
357
+ depositArgs.defiParams.operationId.should.equal('op-resume-1');
358
+ });
359
+ it('should throw if deposit txRequest already exists', async function () {
360
+ const operation = {
361
+ operationId: 'op-already-done',
362
+ walletId: 'test-wallet-id',
363
+ vaultId: 'vlt-galaxy-usdc',
364
+ type: 'DEPOSIT',
365
+ assetAmount: '1000000',
366
+ state: 'DEPOSIT_TX_REQUESTED',
367
+ txRequestId: 'txreq-approve-x',
368
+ associatedTxRequestId: 'txreq-deposit-x',
369
+ createdAt: '2026-05-14T07:12:00Z',
370
+ updatedAt: '2026-05-14T07:12:00Z',
371
+ };
372
+ const getOpReq = mockRequest(operation);
373
+ mockBitGo.get.returns(getOpReq);
374
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: 'op-already-done' }), {
375
+ message: 'Deposit txRequest already exists for this operation; nothing to resume',
376
+ });
377
+ });
378
+ it('should throw if operationId is missing', async function () {
379
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: '' }), { message: 'operationId is required' });
380
+ });
381
+ });
382
+ describe('getOperation', function () {
383
+ it('should fetch an operation by ID', async function () {
384
+ const operation = {
385
+ operationId: 'op-get-1',
386
+ walletId: 'test-wallet-id',
387
+ vaultId: 'vlt-galaxy-usdc',
388
+ type: 'DEPOSIT',
389
+ assetAmount: '1000000',
390
+ state: 'COMPLETED',
391
+ txRequestId: 'txreq-1',
392
+ associatedTxRequestId: 'txreq-2',
393
+ createdAt: '2026-05-14T07:12:00Z',
394
+ updatedAt: '2026-05-14T07:18:00Z',
395
+ };
396
+ const req = mockRequest(operation);
397
+ mockBitGo.get.returns(req);
398
+ const result = await defiVault.getOperation({ operationId: 'op-get-1' });
399
+ result.should.deepEqual(operation);
400
+ });
401
+ it('should throw if operationId is missing', async function () {
402
+ await assert_1.default.rejects(() => defiVault.getOperation({ operationId: '' }), { message: 'operationId is required' });
403
+ });
404
+ });
405
+ describe('listOperations', function () {
406
+ it('should list operations for a vault', async function () {
407
+ const listResult = {
408
+ items: [
409
+ {
410
+ operationId: 'op-1',
411
+ walletId: 'test-wallet-id',
412
+ vaultId: 'vlt-galaxy-usdc',
413
+ type: 'DEPOSIT',
414
+ assetAmount: '1000000',
415
+ state: 'COMPLETED',
416
+ createdAt: '2026-05-14T07:12:00Z',
417
+ updatedAt: '2026-05-14T07:18:00Z',
418
+ },
419
+ ],
420
+ nextCursor: 'cursor-abc',
421
+ };
422
+ const req = mockRequest(listResult);
423
+ mockBitGo.get.returns(req);
424
+ const result = await defiVault.listOperations({
425
+ vaultId: 'vlt-galaxy-usdc',
426
+ state: 'COMPLETED',
427
+ limit: 10,
428
+ });
429
+ result.items.length.should.equal(1);
430
+ result.nextCursor.should.equal('cursor-abc');
431
+ // Verify query params
432
+ const queryArgs = req.query.firstCall.args[0];
433
+ queryArgs.vaultId.should.equal('vlt-galaxy-usdc');
434
+ queryArgs.state.should.equal('COMPLETED');
435
+ queryArgs.limit.should.equal(10);
436
+ });
437
+ it('should throw if vaultId is missing', async function () {
438
+ await assert_1.default.rejects(() => defiVault.listOperations({ vaultId: '' }), { message: 'vaultId is required' });
439
+ });
440
+ });
441
+ describe('withdrawFromVault', function () {
442
+ it('should call sendMany with defiWithdraw and return operationId + txRequestId', async function () {
443
+ const operationId = 'op-withdraw-1';
444
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
445
+ sendManyStub.resolves({
446
+ txRequest: {
447
+ txRequestId: 'txreq-withdraw-1',
448
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
449
+ },
450
+ });
451
+ const result = await defiVault.withdrawFromVault({
452
+ vaultId: 'vlt-galaxy-usdc',
453
+ amount: '500000',
454
+ });
455
+ result.operationId.should.equal(operationId);
456
+ result.txRequestId.should.equal('txreq-withdraw-1');
457
+ sendManyStub.calledOnce.should.be.true();
458
+ const args = sendManyStub.firstCall.args[0];
459
+ args.type.should.equal('defiWithdraw');
460
+ args.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
461
+ args.defiParams.amount.should.equal('500000');
462
+ });
463
+ it('should extract operationId from lite apiVersion coinSpecific', async function () {
464
+ const operationId = 'op-withdraw-lite';
465
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
466
+ sendManyStub.resolves({
467
+ txRequest: {
468
+ txRequestId: 'txreq-withdraw-lite',
469
+ unsignedTxs: [{ coinSpecific: { operationId } }],
470
+ },
471
+ });
472
+ const result = await defiVault.withdrawFromVault({ vaultId: 'vlt-galaxy-usdc', amount: '500000' });
473
+ result.operationId.should.equal(operationId);
474
+ result.txRequestId.should.equal('txreq-withdraw-lite');
475
+ });
476
+ it('should throw when operationId is absent from the withdraw txRequest response', async function () {
477
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
478
+ sendManyStub.resolves({
479
+ txRequest: {
480
+ txRequestId: 'txreq-withdraw-missing',
481
+ transactions: [{ unsignedTx: { coinSpecific: {} } }],
482
+ },
483
+ });
484
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: 'vlt-galaxy-usdc', amount: '500000' }), {
485
+ message: 'operationId not found in withdraw txRequest response',
486
+ });
487
+ });
488
+ it('should pass walletPassphrase when provided', async function () {
489
+ const operationId = 'op-withdraw-opts';
490
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
491
+ sendManyStub.resolves({
492
+ txRequest: {
493
+ txRequestId: 'txreq-withdraw-opts',
494
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
495
+ },
496
+ });
497
+ await defiVault.withdrawFromVault({
498
+ vaultId: 'vlt-galaxy-usdc',
499
+ amount: '500000',
500
+ walletPassphrase: 'test-passphrase',
501
+ });
502
+ const args = sendManyStub.firstCall.args[0];
503
+ args.walletPassphrase.should.equal('test-passphrase');
504
+ });
505
+ it('should throw if vaultId is missing', async function () {
506
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: '', amount: '500000' }), {
507
+ message: 'vaultId is required',
508
+ });
509
+ });
510
+ it('should throw if amount is missing', async function () {
511
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: 'vlt-1', amount: '' }), {
512
+ message: 'amount is required',
513
+ });
514
+ });
515
+ describe('prebuildTransactionTxRequests defiWithdraw defiParams validation', function () {
516
+ it('should throw when defiParams is missing', async function () {
517
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({ type: 'defiWithdraw' }), /defiWithdraw\.defiParams/);
518
+ });
519
+ it('should throw when vaultId is not a string', async function () {
520
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
521
+ type: 'defiWithdraw',
522
+ defiParams: { vaultId: 123, amount: '500000' },
523
+ }), /defiWithdraw\.defiParams/);
524
+ });
525
+ it('should throw when amount is not a string', async function () {
526
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
527
+ type: 'defiWithdraw',
528
+ defiParams: { vaultId: 'vlt-1', amount: 500000 },
529
+ }), /defiWithdraw\.defiParams/);
530
+ });
531
+ });
532
+ });
533
+ describe('wallet.defi getter', function () {
534
+ it('should return a DefiVault instance', function () {
535
+ const defi = wallet.defi;
536
+ (defi instanceof src_1.DefiVault).should.be.true();
537
+ });
538
+ it('should return the same instance on subsequent calls', function () {
539
+ const defi1 = wallet.defi;
540
+ const defi2 = wallet.defi;
541
+ (defi1 === defi2).should.be.true();
542
+ });
543
+ });
544
+ });
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaVZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2RlZmkvZGVmaVZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLG9EQUE0QjtBQUM1QixrQkFBZ0I7QUFDaEIsc0RBQW9EO0FBQ3BELHlDQUFnRjtBQUVoRixRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ3BCLElBQUksTUFBYyxDQUFDO0lBQ25CLElBQUksU0FBb0IsQ0FBQztJQUN6QixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFFdEIsNENBQTRDO0lBQzVDLFNBQVMsV0FBVyxDQUFDLE1BQVc7UUFDOUIsT0FBTztZQUNMLElBQUksRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2hDLEdBQUcsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQy9CLEtBQUssRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2pDLE1BQU0sRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsaUJBQWlCLENBQUMsRUFBVTtRQUNuQyxPQUFPO1lBQ0wsRUFBRTtZQUNGLElBQUksRUFBRSxvQkFBb0I7WUFDMUIsUUFBUSxFQUFFLDRCQUFhLENBQUMsY0FBYztZQUN0QyxNQUFNLEVBQUUsUUFBUTtZQUNoQixJQUFJLEVBQUUsS0FBSztZQUNYLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLG9CQUFvQixFQUFFLGlCQUFpQjtTQUN4QyxDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsZUFBZSxDQUFDLEVBQVU7UUFDakMsT0FBTztZQUNMLEVBQUU7WUFDRixJQUFJLEVBQUUsbUJBQW1CO1lBQ3pCLFFBQVEsRUFBRSw0QkFBYSxDQUFDLE1BQU07WUFDOUIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsSUFBSSxFQUFFLEtBQUs7WUFDWCxVQUFVLEVBQUUsTUFBTTtZQUNsQixVQUFVLEVBQUUsT0FBTztZQUNuQixXQUFXLEVBQUUsV0FBVztZQUN4QixXQUFXLEVBQUUsV0FBVztZQUN4QixvQkFBb0IsRUFBRSxlQUFlO1NBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQsVUFBVSxDQUFDO1FBQ1QsU0FBUyxHQUFHO1lBQ1YsSUFBSSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDbEIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsT0FBZSxFQUFFLEVBQUUsQ0FBQywwQkFBMEIsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQzFHLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztZQUN0RixnQkFBZ0IsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1NBQy9CLENBQUM7UUFFRixZQUFZLEdBQUc7WUFDYixTQUFTLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDdEMsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsU0FBUyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDdkIsV0FBVyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLGVBQWUsRUFBRSxlQUFLLENBQUMsSUFBSSxFQUFFO1NBQzlCLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRztZQUNyQixFQUFFLEVBQUUsZ0JBQWdCO1lBQ3BCLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUM7WUFDN0MsVUFBVSxFQUFFLG9CQUFvQjtTQUNqQyxDQUFDO1FBRUYsTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDN0QsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUM7UUFDUixlQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUs7WUFDdkQsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLEVBQUUsRUFBRSxnQkFBZ0I7Z0JBQ3BCLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLFFBQVEsRUFBRSw0QkFBYSxDQUFDLGNBQWM7Z0JBQ3RDLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixJQUFJLEVBQUUsS0FBSztnQkFDWCxVQUFVLEVBQUUsS0FBSztnQkFDakIsVUFBVSxFQUFFLE1BQU07Z0JBQ2xCLFdBQVcsRUFBRSxXQUFXO2dCQUN4QixXQUFXLEVBQUUsV0FBVztnQkFDeEIsb0JBQW9CLEVBQUUsaUJBQWlCO2dCQUN2QyxjQUFjLEVBQUU7b0JBQ2QsY0FBYyxFQUFFLFlBQVk7b0JBQzVCLGNBQWMsRUFBRSxlQUFlO29CQUMvQixvQkFBb0IsRUFBRSxvQkFBb0I7b0JBQzFDLGdCQUFnQixFQUFFLFlBQVk7b0JBQzlCLG1CQUFtQixFQUFFLGtCQUFrQjtpQkFDeEM7YUFDRixDQUFDO1lBRUYsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3JDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFFN0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsNkRBQTZELENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSztZQUM1QyxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDcEUsT0FBTyxFQUFFLHFCQUFxQjthQUMvQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLO1lBQ3pELE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFO2dCQUNqRixPQUFPLEVBQUUsV0FBVzthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtZQUNsQyxFQUFFLENBQUMsb0VBQW9FLEVBQUUsS0FBSztnQkFDNUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFbkUsTUFBTSxZQUFZLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUMzRCxlQUFlLEVBQUU7d0JBQ2YsRUFBRSxFQUFFLGFBQWE7d0JBQ2pCLEtBQUssRUFBRSxtQkFBbUI7cUJBQzNCO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxjQUFjLENBQUM7b0JBQzVDLE9BQU8sRUFBRSxXQUFXO29CQUNwQixNQUFNLEVBQUUsU0FBUztpQkFDbEIsQ0FBQyxDQUFDO2dCQUVILHNDQUFzQztnQkFDckMsTUFBYyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzdELE1BQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUV4RCxzREFBc0Q7Z0JBQ3RELFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFFekMsTUFBTSxRQUFRLEdBQVEsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0MsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdEQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbkQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDNUQsMkJBQTJCO2dCQUMzQixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUs7Z0JBQ3BELFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRW5FLE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztvQkFDM0QsZUFBZSxFQUFFLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7aUJBQ25FLENBQUMsQ0FBQztnQkFFSCxNQUFNLFNBQVMsQ0FBQyxjQUFjLENBQUM7b0JBQzdCLE9BQU8sRUFBRSxXQUFXO29CQUNwQixNQUFNLEVBQUUsU0FBUztvQkFDakIsZ0JBQWdCLEVBQUUsU0FBUztpQkFDNUIsQ0FBQyxDQUFDO2dCQUVILE1BQU0sUUFBUSxHQUFRLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxLQUFLO2dCQUNwRixTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVuRSxlQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUM7b0JBQ3RDLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUU7aUJBQ3ZDLENBQUMsQ0FBQztnQkFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRixNQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMxRCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRSxLQUFLO2dCQUMvRCxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVuRSxlQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUV0RixNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO29CQUNoRyxPQUFPLEVBQUUsa0RBQWtEO2lCQUM1RCxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLO2dCQUNwRSxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2RSxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7Z0JBRWxDLE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRCw0RUFBNEU7Z0JBQzVFLHFEQUFxRDtnQkFDckQsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztvQkFDbEMsU0FBUyxFQUFFO3dCQUNULFdBQVcsRUFBRSxpQkFBaUI7d0JBQzlCLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUU7d0JBQ3RDLFlBQVksRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO3FCQUNsRTtpQkFDRixDQUFDLENBQUM7Z0JBQ0gsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztvQkFDbkMsU0FBUyxFQUFFO3dCQUNULFdBQVcsRUFBRSxpQkFBaUI7d0JBQzlCLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUU7d0JBQ3RDLFlBQVksRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO3FCQUNsRTtpQkFDRixDQUFDLENBQUM7Z0JBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDO29CQUM1QyxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixNQUFNLEVBQUUsU0FBUztpQkFDbEIsQ0FBQyxDQUFDO2dCQUVGLE1BQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDckQsTUFBYyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNwRSxNQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBRXJFLDZEQUE2RDtnQkFDN0QsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMxQyxNQUFNLFdBQVcsR0FBUSxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEQsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM3QyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQy9ELFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRXRELDZEQUE2RDtnQkFDN0QsTUFBTSxXQUFXLEdBQVEsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDN0MsV0FBVyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvRCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxrRUFBa0UsRUFBRSxLQUFLO2dCQUMxRSxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2RSxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUM7Z0JBRW5DLE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNwRCxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDO29CQUNsQyxTQUFTLEVBQUU7d0JBQ1QsV0FBVyxFQUFFLG9CQUFvQjt3QkFDakMsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRTt3QkFDdEMsV0FBVyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO3FCQUNqRDtpQkFDRixDQUFDLENBQUM7Z0JBQ0gsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztvQkFDbkMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFFO2lCQUNqRCxDQUFDLENBQUM7Z0JBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUVoRyxNQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sV0FBVyxHQUFRLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxXQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9ELENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDJEQUEyRCxFQUFFLEtBQUs7Z0JBQ25FLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXZFLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDO2dCQUVyQyxNQUFNLFlBQVksR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDcEQsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztvQkFDbEMsU0FBUyxFQUFFO3dCQUNULFdBQVcsRUFBRSxzQkFBc0I7d0JBQ25DLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFO3FCQUNwRDtpQkFDRixDQUFDLENBQUM7Z0JBQ0gsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztvQkFDbkMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFO2lCQUNuRCxDQUFDLENBQUM7Z0JBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUVoRyxNQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsS0FBSztnQkFDNUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFdkUsTUFBTSxZQUFZLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3BELFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ2xDLFNBQVMsRUFBRTt3QkFDVCxXQUFXLEVBQUUsdUJBQXVCO3dCQUNwQyxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFO3dCQUN0QyxZQUFZLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO3FCQUNyRDtpQkFDRixDQUFDLENBQUM7Z0JBRUgsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO29CQUN0RyxPQUFPLEVBQUUscURBQXFEO2lCQUMvRCxDQUFDLENBQUM7Z0JBRUgsc0VBQXNFO2dCQUN0RSxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUM7WUFFSCwrRUFBK0U7WUFDL0UsR0FBRyxDQUFDLHVEQUF1RCxFQUFFLEtBQUs7Z0JBQ2hFLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQztvQkFDL0IsS0FBSyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLENBQUM7aUJBQzFFLENBQUMsQ0FBQztnQkFDSCxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFFcEMsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFDakYsQ0FBQyxHQUFVLEVBQUUsRUFBRTtvQkFDYixDQUFDLEdBQUcsWUFBWSxnQ0FBMEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzVELEdBQWtDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDL0UsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLO2dCQUNuRSxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV2RSxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7Z0JBRWxDLGlEQUFpRDtnQkFDakQsTUFBTSxZQUFZLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3BELFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ2xDLFNBQVMsRUFBRTt3QkFDVCxXQUFXLEVBQUUsaUJBQWlCO3dCQUM5QixNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFO3dCQUN0QyxZQUFZLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQztxQkFDbEU7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO2dCQUUxRSxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7b0JBQ3RHLE9BQU8sRUFBRSx5QkFBeUI7aUJBQ25DLENBQUMsQ0FBQztnQkFFSCx1RUFBdUU7Z0JBQ3ZFLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSztnQkFDNUMsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRTtvQkFDdkYsT0FBTyxFQUFFLHFCQUFxQjtpQkFDL0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSztnQkFDM0MsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDckYsT0FBTyxFQUFFLG9CQUFvQjtpQkFDOUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLO1lBQzVDLE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7Z0JBQ3ZGLE9BQU8sRUFBRSxxQkFBcUI7YUFDL0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSztZQUMzQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU3RCxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNyRixPQUFPLEVBQUUsb0JBQW9CO2FBQzlCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLO1lBQ25FLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixXQUFXLEVBQUUsYUFBYTtnQkFDMUIsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLEtBQUssRUFBRSxzQkFBc0I7Z0JBQzdCLFdBQVcsRUFBRSx3QkFBd0I7Z0JBQ3JDLHFCQUFxQixFQUFFLFNBQVM7Z0JBQ2hDLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLFNBQVMsRUFBRSxzQkFBc0I7YUFDbEMsQ0FBQztZQUVGLG9CQUFvQjtZQUNwQixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFaEMsbUJBQW1CO1lBQ25CLE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELFlBQVksQ0FBQyxRQUFRLENBQUM7Z0JBQ3BCLFNBQVMsRUFBRTtvQkFDVCxXQUFXLEVBQUUsc0JBQXNCO29CQUNuQyxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUU7aUJBQ25FO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFFNUUsTUFBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZELE1BQWMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztZQUMzRSxNQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFFMUUscURBQXFEO1lBQ3JELE1BQU0sV0FBVyxHQUFRLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3QyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDL0QsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0RCxXQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUs7WUFDMUQsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLFdBQVcsRUFBRSxpQkFBaUI7Z0JBQzlCLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLElBQUksRUFBRSxTQUFTO2dCQUNmLFdBQVcsRUFBRSxTQUFTO2dCQUN0QixLQUFLLEVBQUUsc0JBQXNCO2dCQUM3QixXQUFXLEVBQUUsaUJBQWlCO2dCQUM5QixxQkFBcUIsRUFBRSxpQkFBaUI7Z0JBQ3hDLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLFNBQVMsRUFBRSxzQkFBc0I7YUFDbEMsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVoQyxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxFQUFFO2dCQUN0RixPQUFPLEVBQUUsd0VBQXdFO2FBQ2xGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUs7WUFDaEQsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsY0FBYyxFQUFFO1FBQ3ZCLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLO1lBQ3pDLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixXQUFXLEVBQUUsVUFBVTtnQkFDdkIsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLEtBQUssRUFBRSxXQUFXO2dCQUNsQixXQUFXLEVBQUUsU0FBUztnQkFDdEIscUJBQXFCLEVBQUUsU0FBUztnQkFDaEMsU0FBUyxFQUFFLHNCQUFzQjtnQkFDakMsU0FBUyxFQUFFLHNCQUFzQjthQUNsQyxDQUFDO1lBRUYsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUs7WUFDaEQsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO1FBQ2xILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEtBQUs7WUFDNUMsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRTtvQkFDTDt3QkFDRSxXQUFXLEVBQUUsTUFBTTt3QkFDbkIsUUFBUSxFQUFFLGdCQUFnQjt3QkFDMUIsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsSUFBSSxFQUFFLFNBQVM7d0JBQ2YsV0FBVyxFQUFFLFNBQVM7d0JBQ3RCLEtBQUssRUFBRSxXQUFXO3dCQUNsQixTQUFTLEVBQUUsc0JBQXNCO3dCQUNqQyxTQUFTLEVBQUUsc0JBQXNCO3FCQUNsQztpQkFDRjtnQkFDRCxVQUFVLEVBQUUsWUFBWTthQUN6QixDQUFDO1lBRUYsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLGNBQWMsQ0FBQztnQkFDNUMsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsS0FBSyxFQUFFLFdBQVc7Z0JBQ2xCLEtBQUssRUFBRSxFQUFFO2FBQ1YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsVUFBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFOUMsc0JBQXNCO1lBQ3RCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNsRCxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEtBQUs7WUFDNUMsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsbUJBQW1CLEVBQUU7UUFDNUIsRUFBRSxDQUFDLDZFQUE2RSxFQUFFLEtBQUs7WUFDckYsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDO1lBRXBDLE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELFlBQVksQ0FBQyxRQUFRLENBQUM7Z0JBQ3BCLFNBQVMsRUFBRTtvQkFDVCxXQUFXLEVBQUUsa0JBQWtCO29CQUMvQixZQUFZLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQztpQkFDbEU7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0MsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsTUFBTSxFQUFFLFFBQVE7YUFDakIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRXBELFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksR0FBUSxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOERBQThELEVBQUUsS0FBSztZQUN0RSxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztZQUV2QyxNQUFNLFlBQVksR0FBRyxlQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRCxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUNwQixTQUFTLEVBQUU7b0JBQ1QsV0FBVyxFQUFFLHFCQUFxQjtvQkFDbEMsV0FBVyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDO2lCQUNqRDthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBRW5HLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4RUFBOEUsRUFBRSxLQUFLO1lBQ3RGLE1BQU0sWUFBWSxHQUFHLGVBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELFlBQVksQ0FBQyxRQUFRLENBQUM7Z0JBQ3BCLFNBQVMsRUFBRTtvQkFDVCxXQUFXLEVBQUUsd0JBQXdCO29CQUNyQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2lCQUNyRDthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO2dCQUN4RyxPQUFPLEVBQUUsc0RBQXNEO2FBQ2hFLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUs7WUFDcEQsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUM7WUFFdkMsTUFBTSxZQUFZLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDcEQsWUFBWSxDQUFDLFFBQVEsQ0FBQztnQkFDcEIsU0FBUyxFQUFFO29CQUNULFdBQVcsRUFBRSxxQkFBcUI7b0JBQ2xDLFlBQVksRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDO2lCQUNsRTthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDO2dCQUNoQyxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsZ0JBQWdCLEVBQUUsaUJBQWlCO2FBQ3BDLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxHQUFRLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsS0FBSztZQUM1QyxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUU7Z0JBQ3pGLE9BQU8sRUFBRSxxQkFBcUI7YUFDL0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsS0FBSztZQUMzQyxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ3hGLE9BQU8sRUFBRSxvQkFBb0I7YUFDOUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsa0VBQWtFLEVBQUU7WUFDM0UsRUFBRSxDQUFDLHlDQUF5QyxFQUFFLEtBQUs7Z0JBQ2pELE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQ2xCLEdBQUcsRUFBRSxDQUFFLE1BQWMsQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUM3RSwwQkFBMEIsQ0FDM0IsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEtBQUs7Z0JBQ25ELE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQ2xCLEdBQUcsRUFBRSxDQUNGLE1BQWMsQ0FBQyw2QkFBNkIsQ0FBQztvQkFDNUMsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtpQkFDL0MsQ0FBQyxFQUNKLDBCQUEwQixDQUMzQixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSztnQkFDbEQsTUFBTSxnQkFBTSxDQUFDLE9BQU8sQ0FDbEIsR0FBRyxFQUFFLENBQ0YsTUFBYyxDQUFDLDZCQUE2QixDQUFDO29CQUM1QyxJQUFJLEVBQUUsY0FBYztvQkFDcEIsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO2lCQUNqRCxDQUFDLEVBQ0osMEJBQTBCLENBQzNCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsb0JBQW9CLEVBQUU7UUFDN0IsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDekIsQ0FBQyxJQUFJLFlBQVksZUFBUyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRTtZQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUIsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgVmF1bHRQcm90b2NvbCB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgQWN0aXZlT3BlcmF0aW9uRXhpc3RzRXJyb3IsIERlZmlWYXVsdCwgV2FsbGV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ0RlZmlWYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgZGVmaVZhdWx0OiBEZWZpVmF1bHQ7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuXG4gIC8vIEhlbHBlciB0byBjcmVhdGUgYSBjaGFpbmFibGUgcmVxdWVzdCBtb2NrXG4gIGZ1bmN0aW9uIG1vY2tSZXF1ZXN0KHJlc3VsdDogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgc2V0OiBzaW5vbi5zdHViKCkucmV0dXJuc1RoaXMoKSxcbiAgICAgIHF1ZXJ5OiBzaW5vbi5zdHViKCkucmV0dXJuc1RoaXMoKSxcbiAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHJlc3VsdCksXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VDb25jcmV0ZVZhdWx0KGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiAnQ29uY3JldGUgQlRDIFZhdWx0JyxcbiAgICAgIHByb3RvY29sOiBWYXVsdFByb3RvY29sLkNPTkNSRVRFX0JUQ0NYLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgICAgIGNvaW46ICdidGMnLFxuICAgICAgYXNzZXRUb2tlbjogJ2J0YycsXG4gICAgICBzaGFyZVRva2VuOiAnY2J0YycsXG4gICAgICByaXNrTWFuYWdlcjogJ21hbmFnZXItMScsXG4gICAgICBjdXN0b2R5VHlwZTogJ3F1YWxpZmllZCcsXG4gICAgICB2YXVsdENvbnRyYWN0QWRkcmVzczogJzB4VmF1bHRDb250cmFjdCcsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VNb3JwaG9WYXVsdChpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogJ01vcnBobyBVU0RDIFZhdWx0JyxcbiAgICAgIHByb3RvY29sOiBWYXVsdFByb3RvY29sLk1PUlBITyxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgICBjb2luOiAnZXRoJyxcbiAgICAgIGFzc2V0VG9rZW46ICd1c2RjJyxcbiAgICAgIHNoYXJlVG9rZW46ICdtdXNkYycsXG4gICAgICByaXNrTWFuYWdlcjogJ21hbmFnZXItMicsXG4gICAgICBjdXN0b2R5VHlwZTogJ3F1YWxpZmllZCcsXG4gICAgICB2YXVsdENvbnRyYWN0QWRkcmVzczogJzB4TW9ycGhvVmF1bHQnLFxuICAgIH07XG4gIH1cblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBwb3N0OiBzaW5vbi5zdHViKCksXG4gICAgICBnZXQ6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGRlbDogc2lub24uc3R1YigpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcsIHZlcnNpb246IG51bWJlcikgPT4gYGh0dHBzOi8vYml0Z28uY29tL2FwaS92JHt2ZXJzaW9ufSR7cGF0aH1gKSxcbiAgICAgIG1pY3Jvc2VydmljZXNVcmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gYGh0dHBzOi8vYml0Z28uY29tJHtwYXRofWApLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG5cbiAgICBtb2NrQmFzZUNvaW4gPSB7XG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdldGgnKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLFxuICAgICAga2V5Y2hhaW5zOiBzaW5vbi5zdHViKCksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnModHJ1ZSksXG4gICAgICBnZXRNUENBbGdvcml0aG06IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuXG4gICAgY29uc3QgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICBpZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgIGNvaW46ICdldGgnLFxuICAgICAga2V5czogWyd1c2VyLWtleScsICdiYWNrdXAta2V5JywgJ2JpdGdvLWtleSddLFxuICAgICAgZW50ZXJwcmlzZTogJ3Rlc3QtZW50ZXJwcmlzZS1pZCcsXG4gICAgfTtcblxuICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICBkZWZpVmF1bHQgPSB3YWxsZXQuZGVmaTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRWYXVsdENvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZldGNoIHZhdWx0IGNvbmZpZyBmb3IgYSBnaXZlbiB2YXVsdElkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmF1bHRDb25maWcgPSB7XG4gICAgICAgIGlkOiAndmx0LWNvbmNyZXRlLTEnLFxuICAgICAgICBuYW1lOiAnQ29uY3JldGUgQlRDIFZhdWx0JyxcbiAgICAgICAgcHJvdG9jb2w6IFZhdWx0UHJvdG9jb2wuQ09OQ1JFVEVfQlRDQ1gsXG4gICAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgICAgIGNvaW46ICdidGMnLFxuICAgICAgICBhc3NldFRva2VuOiAnYnRjJyxcbiAgICAgICAgc2hhcmVUb2tlbjogJ2NidGMnLFxuICAgICAgICByaXNrTWFuYWdlcjogJ21hbmFnZXItMScsXG4gICAgICAgIGN1c3RvZHlUeXBlOiAncXVhbGlmaWVkJyxcbiAgICAgICAgdmF1bHRDb250cmFjdEFkZHJlc3M6ICcweFZhdWx0Q29udHJhY3QnLFxuICAgICAgICBjb25jcmV0ZUNvbmZpZzoge1xuICAgICAgICAgIHNvdXJjZVdhbGxldElkOiAnc3JjLXdhbGxldCcsXG4gICAgICAgICAgZXNjcm93V2FsbGV0SWQ6ICdlc2Nyb3ctd2FsbGV0JyxcbiAgICAgICAgICBlc2Nyb3dEZXBvc2l0QWRkcmVzczogJzFFeGFtcGxlQnRjQWRkcmVzcycsXG4gICAgICAgICAgcG9zaXRpb25XYWxsZXRJZDogJ3Bvcy13YWxsZXQnLFxuICAgICAgICAgIHBvc2l0aW9uQmFzZUFkZHJlc3M6ICcxUG9zaXRpb25BZGRyZXNzJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcSA9IG1vY2tSZXF1ZXN0KHZhdWx0Q29uZmlnKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhyZXEpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQuZ2V0VmF1bHRDb25maWcoeyB2YXVsdElkOiAndmx0LWNvbmNyZXRlLTEnIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh2YXVsdENvbmZpZyk7XG4gICAgICBtb2NrQml0R28uZ2V0LmNhbGxlZFdpdGgoJ2h0dHBzOi8vYml0Z28uY29tL2FwaS9kZWZpLXNlcnZpY2UvdjEvdmF1bHRzL3ZsdC1jb25jcmV0ZS0xJykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJlcS5zZXQuY2FsbGVkV2l0aCgnZW50ZXJwcmlzZS1pZCcsICd0ZXN0LWVudGVycHJpc2UtaWQnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZ2V0VmF1bHRDb25maWcoeyB2YXVsdElkOiAnJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAndmF1bHRJZCBpcyByZXF1aXJlZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvcGFnYXRlIGVycm9ycyBmcm9tIHRoZSBBUEkgKGUuZy4gNDA0KScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcSA9IG1vY2tSZXF1ZXN0KG51bGwpO1xuICAgICAgcmVxLnJlc3VsdC5yZWplY3RzKG5ldyBFcnJvcignTm90IEZvdW5kJykpO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHJlcSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5nZXRWYXVsdENvbmZpZyh7IHZhdWx0SWQ6ICd2bHQtbm90LWZvdW5kJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnTm90IEZvdW5kJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVwb3NpdFRvVmF1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ2NvbmNyZXRlX2J0Y2N4IHByb3ZpZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBjYWxsIHNlbmRNYW55IG9uY2Ugd2l0aCBkZWZpLWRlcG9zaXQgdHlwZSBhbmQgbm8gcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VDb25jcmV0ZVZhdWx0KCd2bHQtYnRjLTEnKSkpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKS5yZXNvbHZlcyh7XG4gICAgICAgICAgcGVuZGluZ0FwcHJvdmFsOiB7XG4gICAgICAgICAgICBpZDogJ3BhLXV1aWQtMTIzJyxcbiAgICAgICAgICAgIHN0YXRlOiAnYXdhaXRpbmdTaWduYXR1cmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1idGMtMScsXG4gICAgICAgICAgYW1vdW50OiAnNTAwMDAwMCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJldHVybnMgQ29uY3JldGVEZXBvc2l0UmVzdWx0IHNoYXBlXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5wZW5kaW5nQXBwcm92YWxJZC5zaG91bGQuZXF1YWwoJ3BhLXV1aWQtMTIzJyk7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5zdGF0ZS5zaG91bGQuZXF1YWwoJ2F3YWl0aW5nU2lnbmF0dXJlJyk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgc2VuZE1hbnkgY2FsbCDigJQgbm8gc2Vjb25kIGRlcG9zaXQgc2VuZE1hbnlcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgICBjb25zdCBjYWxsQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICBjYWxsQXJncy50eXBlLnNob3VsZC5lcXVhbCgnZGVmaS1kZXBvc2l0Jyk7XG4gICAgICAgIGNhbGxBcmdzLmRlZmlQYXJhbXMudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1idGMtMScpO1xuICAgICAgICBjYWxsQXJncy5kZWZpUGFyYW1zLmFtb3VudC5zaG91bGQuZXF1YWwoJzUwMDAwMDAnKTtcbiAgICAgICAgY2FsbEFyZ3MuZGVmaVBhcmFtcy5hY3Rpb25UeXBlLnNob3VsZC5lcXVhbCgnZGVmaS1kZXBvc2l0Jyk7XG4gICAgICAgIC8vIE5vIHJlY2lwaWVudHMga2V5IGF0IGFsbFxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbEFyZ3MucmVjaXBpZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhc3Mgd2FsbGV0UGFzc3BocmFzZSB3aGVuIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZUNvbmNyZXRlVmF1bHQoJ3ZsdC1idGMtMicpKSk7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpLnJlc29sdmVzKHtcbiAgICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHsgaWQ6ICdwYS11dWlkLTQ1NicsIHN0YXRlOiAnYXdhaXRpbmdTaWduYXR1cmUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1idGMtMicsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2h1bnRlcjInLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYWxsQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICBjYWxsQXJncy53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5lcXVhbCgnaHVudGVyMicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZGVmYXVsdCBzdGF0ZSB0byBhd2FpdGluZ1NpZ25hdHVyZSB3aGVuIGFic2VudCBmcm9tIHBlbmRpbmdBcHByb3ZhbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VDb25jcmV0ZVZhdWx0KCd2bHQtYnRjLTMnKSkpO1xuXG4gICAgICAgIHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKS5yZXNvbHZlcyh7XG4gICAgICAgICAgcGVuZGluZ0FwcHJvdmFsOiB7IGlkOiAncGEtbm8tc3RhdGUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYnRjLTMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KTtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLnN0YXRlLnNob3VsZC5lcXVhbCgnYXdhaXRpbmdTaWduYXR1cmUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gc2VuZE1hbnkgcmV0dXJucyBubyBwZW5kaW5nQXBwcm92YWwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlQ29uY3JldGVWYXVsdCgndmx0LWJ0Yy00JykpKTtcblxuICAgICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55JykucmVzb2x2ZXMoeyB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQ6ICd1bmV4cGVjdGVkJyB9IH0pO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYnRjLTQnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZWZpLWRlcG9zaXQgc2VuZE1hbnkgcmVzcG9uc2U6IHVua25vd247IHVua25vd24nLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vcnBobyBwcm92aWRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgY2FsbCBzZW5kTWFueSBmb3IgYXBwcm92ZSBhbmQgZGVwb3NpdCBvbiBoYXBweSBwYXRoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZU1vcnBob1ZhdWx0KCd2bHQtZ2FsYXh5LXVzZGMnKSkpO1xuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXV1aWQtMTIzJztcblxuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgIC8vIFdQIHdyaXRlcyBvcGVyYXRpb25JZCBpbnRvIHRoZSBidWlsdCB0eCdzIGNvaW5TcGVjaWZpYyAoZnVsbCBhcGlWZXJzaW9uKSxcbiAgICAgICAgLy8gbm90IGludG8gdGhlIGludGVudCDigJQgbWlycm9yIHRoYXQgcmVhbCBzaGFwZSBoZXJlLlxuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtMScsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIub25TZWNvbmRDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LTEnLFxuICAgICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWRlcG9zaXQnIH0sXG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFt7IHVuc2lnbmVkVHg6IHsgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoe1xuICAgICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICB9KTtcblxuICAgICAgICAocmVzdWx0IGFzIGFueSkub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKG9wZXJhdGlvbklkKTtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLnR4UmVxdWVzdElkcy5hcHByb3ZlLnNob3VsZC5lcXVhbCgndHhyZXEtYXBwcm92ZS0xJyk7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuZGVwb3NpdC5zaG91bGQuZXF1YWwoJ3R4cmVxLWRlcG9zaXQtMScpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBzZW5kTWFueSB3YXMgY2FsbGVkIHdpdGggY29ycmVjdCBwYXJhbXMgZm9yIGFwcHJvdmVcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZFR3aWNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIGNvbnN0IGFwcHJvdmVBcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICAgIGFwcHJvdmVBcmdzLnR5cGUuc2hvdWxkLmVxdWFsKCdkZWZpQXBwcm92ZScpO1xuICAgICAgICBhcHByb3ZlQXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgICAgYXBwcm92ZUFyZ3MuZGVmaVBhcmFtcy5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNlbmRNYW55IHdhcyBjYWxsZWQgd2l0aCBjb3JyZWN0IHBhcmFtcyBmb3IgZGVwb3NpdFxuICAgICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLnNlY29uZENhbGwuYXJnc1swXTtcbiAgICAgICAgZGVwb3NpdEFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlEZXBvc2l0Jyk7XG4gICAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKG9wZXJhdGlvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGV4dHJhY3Qgb3BlcmF0aW9uSWQgZnJvbSB0aGUgbGl0ZSBhcGlWZXJzaW9uIGNvaW5TcGVjaWZpYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LWdhbGF4eS11c2RjJykpKTtcblxuICAgICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC11dWlkLWxpdGUnO1xuXG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLm9uRmlyc3RDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLWxpdGUnLFxuICAgICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWFwcHJvdmUnIH0sXG4gICAgICAgICAgICB1bnNpZ25lZFR4czogW3sgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5vblNlY29uZENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7IHR4UmVxdWVzdElkOiAndHhyZXEtZGVwb3NpdC1saXRlJyB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJywgYW1vdW50OiAnMTAwMDAwMCcgfSk7XG5cbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IGRlcG9zaXRBcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuc2Vjb25kQ2FsbC5hcmdzWzBdO1xuICAgICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWxsIGJhY2sgdG8gaW50ZW50Lm9wZXJhdGlvbklkIGZvciBmb3J3YXJkLWNvbXBhdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LWdhbGF4eS11c2RjJykpKTtcblxuICAgICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC11dWlkLWludGVudCc7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtaW50ZW50JyxcbiAgICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1hcHByb3ZlJywgb3BlcmF0aW9uSWQgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgc2VuZE1hbnlTdHViLm9uU2Vjb25kQ2FsbCgpLnJlc29sdmVzKHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LWludGVudCcgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pO1xuXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBvcGVyYXRpb25JZCBpcyBhYnNlbnQgZnJvbSB0aGUgYXBwcm92ZSB0eFJlcXVlc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlTW9ycGhvVmF1bHQoJ3ZsdC1nYWxheHktdXNkYycpKSk7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtbWlzc2luZycsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHt9IH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ29wZXJhdGlvbklkIG5vdCBmb3VuZCBpbiBhcHByb3ZlIHR4UmVxdWVzdCByZXNwb25zZScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlcG9zaXQgc2VuZE1hbnkgbXVzdCBub3QgYmUgaXNzdWVkIHdoZW4gdGhlIG9wZXJhdGlvbklkIGlzIG1pc3NpbmdcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUT0RPKENHRC0xNzA5KTogUmUtZW5hYmxlIHdoZW4gYWN0aXZlIG9wZXJhdGlvbiBwcmUtZmxpZ2h0IGNoZWNrIGlzIHJlc3RvcmVkXG4gICAgICB4aXQoJ3Nob3VsZCByZWplY3Qgd2hlbiBhbiBhY3RpdmUgb3BlcmF0aW9uIGFscmVhZHkgZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBwcmVmbGlnaHRSZXEgPSBtb2NrUmVxdWVzdCh7XG4gICAgICAgICAgaXRlbXM6IFt7IG9wZXJhdGlvbklkOiAnZXhpc3Rpbmctb3AtaWQnLCBzdGF0ZTogJ0FQUFJPVkVfVFhfUkVRVUVTVEVEJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhwcmVmbGlnaHRSZXEpO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSxcbiAgICAgICAgICAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgKGVyciBpbnN0YW5jZW9mIEFjdGl2ZU9wZXJhdGlvbkV4aXN0c0Vycm9yKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICAgICAgKGVyciBhcyBBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvcikub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKCdleGlzdGluZy1vcC1pZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcHJvcGFnYXRlIGRlcG9zaXQgc2VuZE1hbnkgZmFpbHVyZSB3aXRob3V0IGNsZWFudXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlTW9ycGhvVmF1bHQoJ3ZsdC1nYWxheHktdXNkYycpKSk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSAnb3AtdXVpZC00NTYnO1xuXG4gICAgICAgIC8vIE1vY2sgc2VuZE1hbnk6IGFwcHJvdmUgc3VjY2VlZHMsIGRlcG9zaXQgZmFpbHNcbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtMicsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIub25TZWNvbmRDYWxsKCkucmVqZWN0cyhuZXcgRXJyb3IoJ2RlcG9zaXQgY3JlYXRpb24gZmFpbGVkJykpO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZXBvc2l0IGNyZWF0aW9uIGZhaWxlZCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNESyBkb2VzIG5vdCBhdHRlbXB0IGNsZWFudXAg4oCUIHJlY29uY2lsZXIgaGFuZGxlcyBvcnBoYW5lZCBhcHByb3ZhbHNcbiAgICAgICAgbW9ja0JpdEdvLmRlbC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICcnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbW91bnQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC0xJywgYW1vdW50OiAnJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgaXMgcmVxdWlyZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAnJywgYW1vdW50OiAnMTAwMDAwMCcgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGFtb3VudCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LTEnKSkpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAndmx0LTEnLCBhbW91bnQ6ICcnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXN1bWVEZXBvc2l0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaXNzdWUgdGhlIGRlcG9zaXQgc2VuZE1hbnkgZm9yIGEgcGFydGlhbCBvcGVyYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICAgIG9wZXJhdGlvbklkOiAnb3AtcmVzdW1lLTEnLFxuICAgICAgICB3YWxsZXRJZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIHR5cGU6ICdERVBPU0lUJyxcbiAgICAgICAgYXNzZXRBbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgc3RhdGU6ICdBUFBST1ZFX1RYX1JFUVVFU1RFRCcsXG4gICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtYXBwcm92ZS1leGlzdGluZycsXG4gICAgICAgIGFzc29jaWF0ZWRUeFJlcXVlc3RJZDogdW5kZWZpbmVkLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIGdldE9wZXJhdGlvbiBjYWxsXG4gICAgICBjb25zdCBnZXRPcFJlcSA9IG1vY2tSZXF1ZXN0KG9wZXJhdGlvbik7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoZ2V0T3BSZXEpO1xuXG4gICAgICAvLyBkZXBvc2l0IHNlbmRNYW55XG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWRlcG9zaXQtcmVzdW1lJyxcbiAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktZGVwb3NpdCcsIG9wZXJhdGlvbklkOiAnb3AtcmVzdW1lLTEnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LnJlc3VtZURlcG9zaXQoeyBvcGVyYXRpb25JZDogJ29wLXJlc3VtZS0xJyB9KTtcblxuICAgICAgKHJlc3VsdCBhcyBhbnkpLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbCgnb3AtcmVzdW1lLTEnKTtcbiAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuYXBwcm92ZS5zaG91bGQuZXF1YWwoJ3R4cmVxLWFwcHJvdmUtZXhpc3RpbmcnKTtcbiAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuZGVwb3NpdC5zaG91bGQuZXF1YWwoJ3R4cmVxLWRlcG9zaXQtcmVzdW1lJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBzZW5kTWFueSB3YXMgY2FsbGVkIHdpdGggY29ycmVjdCBkZWZpUGFyYW1zXG4gICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgZGVwb3NpdEFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlEZXBvc2l0Jyk7XG4gICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMuYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgZGVwb3NpdEFyZ3MuZGVmaVBhcmFtcy5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwoJ29wLXJlc3VtZS0xJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGRlcG9zaXQgdHhSZXF1ZXN0IGFscmVhZHkgZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgICBvcGVyYXRpb25JZDogJ29wLWFscmVhZHktZG9uZScsXG4gICAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgdHlwZTogJ0RFUE9TSVQnLFxuICAgICAgICBhc3NldEFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICBzdGF0ZTogJ0RFUE9TSVRfVFhfUkVRVUVTVEVEJyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLXgnLFxuICAgICAgICBhc3NvY2lhdGVkVHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LXgnLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldE9wUmVxID0gbW9ja1JlcXVlc3Qob3BlcmF0aW9uKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhnZXRPcFJlcSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5yZXN1bWVEZXBvc2l0KHsgb3BlcmF0aW9uSWQ6ICdvcC1hbHJlYWR5LWRvbmUnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdEZXBvc2l0IHR4UmVxdWVzdCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBvcGVyYXRpb247IG5vdGhpbmcgdG8gcmVzdW1lJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBvcGVyYXRpb25JZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LnJlc3VtZURlcG9zaXQoeyBvcGVyYXRpb25JZDogJycgfSksIHsgbWVzc2FnZTogJ29wZXJhdGlvbklkIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldE9wZXJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZldGNoIGFuIG9wZXJhdGlvbiBieSBJRCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6ICdvcC1nZXQtMScsXG4gICAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgdHlwZTogJ0RFUE9TSVQnLFxuICAgICAgICBhc3NldEFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICBzdGF0ZTogJ0NPTVBMRVRFRCcsXG4gICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtMScsXG4gICAgICAgIGFzc29jaWF0ZWRUeFJlcXVlc3RJZDogJ3R4cmVxLTInLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTg6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcSA9IG1vY2tSZXF1ZXN0KG9wZXJhdGlvbik7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocmVxKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmdldE9wZXJhdGlvbih7IG9wZXJhdGlvbklkOiAnb3AtZ2V0LTEnIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwob3BlcmF0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgb3BlcmF0aW9uSWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5nZXRPcGVyYXRpb24oeyBvcGVyYXRpb25JZDogJycgfSksIHsgbWVzc2FnZTogJ29wZXJhdGlvbklkIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xpc3RPcGVyYXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbGlzdCBvcGVyYXRpb25zIGZvciBhIHZhdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGlzdFJlc3VsdCA9IHtcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvcGVyYXRpb25JZDogJ29wLTEnLFxuICAgICAgICAgICAgd2FsbGV0SWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgICAgIHR5cGU6ICdERVBPU0lUJyxcbiAgICAgICAgICAgIGFzc2V0QW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgICBzdGF0ZTogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjE4OjAwWicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbmV4dEN1cnNvcjogJ2N1cnNvci1hYmMnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxID0gbW9ja1JlcXVlc3QobGlzdFJlc3VsdCk7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocmVxKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0Lmxpc3RPcGVyYXRpb25zKHtcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIHN0YXRlOiAnQ09NUExFVEVEJyxcbiAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5pdGVtcy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcmVzdWx0Lm5leHRDdXJzb3IhLnNob3VsZC5lcXVhbCgnY3Vyc29yLWFiYycpO1xuXG4gICAgICAvLyBWZXJpZnkgcXVlcnkgcGFyYW1zXG4gICAgICBjb25zdCBxdWVyeUFyZ3MgPSByZXEucXVlcnkuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBxdWVyeUFyZ3MudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1nYWxheHktdXNkYycpO1xuICAgICAgcXVlcnlBcmdzLnN0YXRlLnNob3VsZC5lcXVhbCgnQ09NUExFVEVEJyk7XG4gICAgICBxdWVyeUFyZ3MubGltaXQuc2hvdWxkLmVxdWFsKDEwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdmF1bHRJZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0Lmxpc3RPcGVyYXRpb25zKHsgdmF1bHRJZDogJycgfSksIHsgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aGRyYXdGcm9tVmF1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHNlbmRNYW55IHdpdGggZGVmaVdpdGhkcmF3IGFuZCByZXR1cm4gb3BlcmF0aW9uSWQgKyB0eFJlcXVlc3RJZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXdpdGhkcmF3LTEnO1xuXG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLXdpdGhkcmF3LTEnLFxuICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9IH1dLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC53aXRoZHJhd0Zyb21WYXVsdCh7XG4gICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgICAgcmVzdWx0LnR4UmVxdWVzdElkLnNob3VsZC5lcXVhbCgndHhyZXEtd2l0aGRyYXctMScpO1xuXG4gICAgICBzZW5kTWFueVN0dWIuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgY29uc3QgYXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYXJncy50eXBlLnNob3VsZC5lcXVhbCgnZGVmaVdpdGhkcmF3Jyk7XG4gICAgICBhcmdzLmRlZmlQYXJhbXMudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1nYWxheHktdXNkYycpO1xuICAgICAgYXJncy5kZWZpUGFyYW1zLmFtb3VudC5zaG91bGQuZXF1YWwoJzUwMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IG9wZXJhdGlvbklkIGZyb20gbGl0ZSBhcGlWZXJzaW9uIGNvaW5TcGVjaWZpYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXdpdGhkcmF3LWxpdGUnO1xuXG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLXdpdGhkcmF3LWxpdGUnLFxuICAgICAgICAgIHVuc2lnbmVkVHhzOiBbeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoeyB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJywgYW1vdW50OiAnNTAwMDAwJyB9KTtcblxuICAgICAgcmVzdWx0Lm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICByZXN1bHQudHhSZXF1ZXN0SWQuc2hvdWxkLmVxdWFsKCd0eHJlcS13aXRoZHJhdy1saXRlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gb3BlcmF0aW9uSWQgaXMgYWJzZW50IGZyb20gdGhlIHdpdGhkcmF3IHR4UmVxdWVzdCByZXNwb25zZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtd2l0aGRyYXctbWlzc2luZycsXG4gICAgICAgICAgdHJhbnNhY3Rpb25zOiBbeyB1bnNpZ25lZFR4OiB7IGNvaW5TcGVjaWZpYzoge30gfSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoeyB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJywgYW1vdW50OiAnNTAwMDAwJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnb3BlcmF0aW9uSWQgbm90IGZvdW5kIGluIHdpdGhkcmF3IHR4UmVxdWVzdCByZXNwb25zZScsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyB3YWxsZXRQYXNzcGhyYXNlIHdoZW4gcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC13aXRoZHJhdy1vcHRzJztcblxuICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHtcbiAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS13aXRoZHJhdy1vcHRzJyxcbiAgICAgICAgICB0cmFuc2FjdGlvbnM6IFt7IHVuc2lnbmVkVHg6IHsgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoe1xuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgYW1vdW50OiAnNTAwMDAwJyxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Rlc3QtcGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYXJncy53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5lcXVhbCgndGVzdC1wYXNzcGhyYXNlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHZhdWx0SWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC53aXRoZHJhd0Zyb21WYXVsdCh7IHZhdWx0SWQ6ICcnLCBhbW91bnQ6ICc1MDAwMDAnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbW91bnQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC53aXRoZHJhd0Zyb21WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtMScsIGFtb3VudDogJycgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ2Ftb3VudCBpcyByZXF1aXJlZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyBkZWZpV2l0aGRyYXcgZGVmaVBhcmFtcyB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGRlZmlQYXJhbXMgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgKCkgPT4gKHdhbGxldCBhcyBhbnkpLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHsgdHlwZTogJ2RlZmlXaXRoZHJhdycgfSksXG4gICAgICAgICAgL2RlZmlXaXRoZHJhd1xcLmRlZmlQYXJhbXMvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHZhdWx0SWQgaXMgbm90IGEgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgKHdhbGxldCBhcyBhbnkpLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHtcbiAgICAgICAgICAgICAgdHlwZTogJ2RlZmlXaXRoZHJhdycsXG4gICAgICAgICAgICAgIGRlZmlQYXJhbXM6IHsgdmF1bHRJZDogMTIzLCBhbW91bnQ6ICc1MDAwMDAnIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvZGVmaVdpdGhkcmF3XFwuZGVmaVBhcmFtcy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGlzIG5vdCBhIHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICh3YWxsZXQgYXMgYW55KS5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyh7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZWZpV2l0aGRyYXcnLFxuICAgICAgICAgICAgICBkZWZpUGFyYW1zOiB7IHZhdWx0SWQ6ICd2bHQtMScsIGFtb3VudDogNTAwMDAwIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvZGVmaVdpdGhkcmF3XFwuZGVmaVBhcmFtcy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2FsbGV0LmRlZmkgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgRGVmaVZhdWx0IGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVmaSA9IHdhbGxldC5kZWZpO1xuICAgICAgKGRlZmkgaW5zdGFuY2VvZiBEZWZpVmF1bHQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSBvbiBzdWJzZXF1ZW50IGNhbGxzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVmaTEgPSB3YWxsZXQuZGVmaTtcbiAgICAgIGNvbnN0IGRlZmkyID0gd2FsbGV0LmRlZmk7XG4gICAgICAoZGVmaTEgPT09IGRlZmkyKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19