@bitgo-beta/sdk-core 8.2.1-beta.192 → 8.2.1-beta.1921

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 (664) 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 +61 -0
  87. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
  88. package/dist/src/bitgo/address-book/address-book.js +150 -0
  89. package/dist/src/bitgo/address-book/index.d.ts +3 -0
  90. package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
  91. package/dist/src/bitgo/address-book/index.js +19 -0
  92. package/dist/src/bitgo/address-book/types.d.ts +170 -0
  93. package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
  94. package/dist/src/bitgo/address-book/types.js +3 -0
  95. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +110 -11
  96. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  97. package/dist/src/bitgo/baseCoin/baseCoin.js +169 -16
  98. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +270 -27
  99. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  100. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  101. package/dist/src/bitgo/baseCoin/index.js +6 -2
  102. package/dist/src/bitgo/bip32util.d.ts +3 -16
  103. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  104. package/dist/src/bitgo/bip32util.js +4 -56
  105. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  106. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  107. package/dist/src/bitgo/bitcoin.js +26 -13
  108. package/dist/src/bitgo/bitgoBase.d.ts +7 -3
  109. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  110. package/dist/src/bitgo/bitgoBase.js +1 -1
  111. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  112. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  113. package/dist/src/bitgo/coinFactory.js +26 -3
  114. package/dist/src/bitgo/config.d.ts +3 -95
  115. package/dist/src/bitgo/config.d.ts.map +1 -1
  116. package/dist/src/bitgo/config.js +26 -15
  117. package/dist/src/bitgo/defi/defiVault.d.ts +117 -0
  118. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  119. package/dist/src/bitgo/defi/defiVault.js +354 -0
  120. package/dist/src/bitgo/defi/iDefiVault.d.ts +80 -0
  121. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  122. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  123. package/dist/src/bitgo/defi/index.d.ts +3 -0
  124. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  125. package/dist/src/bitgo/defi/index.js +22 -0
  126. package/dist/src/bitgo/ecdh.d.ts +0 -1
  127. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  128. package/dist/src/bitgo/ecdh.js +26 -13
  129. package/dist/src/bitgo/enterprise/enterprise.d.ts +9 -4
  130. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  131. package/dist/src/bitgo/enterprise/enterprise.js +47 -21
  132. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  133. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +5 -3
  134. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  135. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  136. package/dist/src/bitgo/enterprise/index.js +6 -2
  137. package/dist/src/bitgo/environments.d.ts +68 -3
  138. package/dist/src/bitgo/environments.d.ts.map +1 -1
  139. package/dist/src/bitgo/environments.js +414 -34
  140. package/dist/src/bitgo/errors.d.ts +175 -0
  141. package/dist/src/bitgo/errors.d.ts.map +1 -1
  142. package/dist/src/bitgo/errors.js +166 -2
  143. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  144. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  145. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  146. package/dist/src/bitgo/index.d.ts +5 -1
  147. package/dist/src/bitgo/index.d.ts.map +1 -1
  148. package/dist/src/bitgo/index.js +31 -11
  149. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  150. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  151. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  152. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  153. package/dist/src/bitgo/internal/index.js +6 -2
  154. package/dist/src/bitgo/internal/internal.js +5 -6
  155. package/dist/src/bitgo/internal/keycard.d.ts +12 -8
  156. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  157. package/dist/src/bitgo/internal/keycard.js +60 -48
  158. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
  159. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  160. package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
  161. package/dist/src/bitgo/keychain/iKeychains.d.ts +108 -11
  162. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  163. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  164. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  165. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  166. package/dist/src/bitgo/keychain/index.js +7 -2
  167. package/dist/src/bitgo/keychain/keychains.d.ts +51 -7
  168. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  169. package/dist/src/bitgo/keychain/keychains.js +245 -52
  170. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  171. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  172. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  173. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  174. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  175. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  176. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  177. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  178. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  179. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  180. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  181. package/dist/src/bitgo/market/index.js +6 -2
  182. package/dist/src/bitgo/market/markets.js +23 -9
  183. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
  184. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  185. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  186. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  187. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  188. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  189. package/dist/src/bitgo/pendingApproval/pendingApproval.js +228 -110
  190. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  191. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  192. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  193. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  194. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  195. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  196. package/dist/src/bitgo/proofs/index.js +6 -0
  197. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  198. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  199. package/dist/src/bitgo/proofs/types.js +80 -0
  200. package/dist/src/bitgo/recovery/index.js +6 -2
  201. package/dist/src/bitgo/recovery/initiate.d.ts +13 -3
  202. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  203. package/dist/src/bitgo/recovery/initiate.js +49 -41
  204. package/dist/src/bitgo/safe/iSafe.d.ts +85 -0
  205. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
  206. package/dist/src/bitgo/safe/iSafe.js +3 -0
  207. package/dist/src/bitgo/safe/iSafes.d.ts +86 -0
  208. package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
  209. package/dist/src/bitgo/safe/iSafes.js +3 -0
  210. package/dist/src/bitgo/safe/index.d.ts +5 -0
  211. package/dist/src/bitgo/safe/index.d.ts.map +1 -0
  212. package/dist/src/bitgo/safe/index.js +21 -0
  213. package/dist/src/bitgo/safe/safe.d.ts +66 -0
  214. package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
  215. package/dist/src/bitgo/safe/safe.js +96 -0
  216. package/dist/src/bitgo/safe/safes.d.ts +104 -0
  217. package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
  218. package/dist/src/bitgo/safe/safes.js +294 -0
  219. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  220. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  221. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  222. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  223. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  224. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  225. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  226. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  227. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  228. package/dist/src/bitgo/staking/iStakingWallet.d.ts +178 -7
  229. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  230. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  231. package/dist/src/bitgo/staking/index.d.ts +3 -0
  232. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  233. package/dist/src/bitgo/staking/index.js +9 -2
  234. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  235. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  236. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  237. package/dist/src/bitgo/trading/iTradingAccount.d.ts +15 -1
  238. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  239. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  240. package/dist/src/bitgo/trading/index.d.ts +1 -0
  241. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  242. package/dist/src/bitgo/trading/index.js +7 -2
  243. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  244. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  245. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  246. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  247. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  248. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  249. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  250. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  251. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  252. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  253. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  254. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  255. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  256. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  257. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  258. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  259. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  260. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  261. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  262. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  263. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  264. package/dist/src/bitgo/trading/network/index.d.ts +5 -0
  265. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
  266. package/dist/src/bitgo/trading/network/index.js +21 -0
  267. package/dist/src/bitgo/trading/network/network.d.ts +36 -0
  268. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
  269. package/dist/src/bitgo/trading/network/network.js +99 -0
  270. package/dist/src/bitgo/trading/network/types.d.ts +277 -0
  271. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
  272. package/dist/src/bitgo/trading/network/types.js +3 -0
  273. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  274. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  275. package/dist/src/bitgo/trading/network/utils.js +54 -0
  276. package/dist/src/bitgo/trading/tradingAccount.d.ts +22 -1
  277. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  278. package/dist/src/bitgo/trading/tradingAccount.js +64 -7
  279. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
  280. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  281. package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
  282. package/dist/src/bitgo/tss/common.d.ts +40 -6
  283. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  284. package/dist/src/bitgo/tss/common.js +124 -17
  285. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  286. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  287. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  288. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  289. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  290. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  291. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  292. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  293. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  294. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  295. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  296. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  297. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  298. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  299. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  300. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
  301. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  302. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
  303. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  304. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  305. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  306. package/dist/src/bitgo/tss/index.d.ts +3 -2
  307. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  308. package/dist/src/bitgo/tss/index.js +26 -10
  309. package/dist/src/bitgo/tss/types.d.ts +3 -3
  310. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  311. package/dist/src/bitgo/tss/types.js +2 -2
  312. package/dist/src/bitgo/types.d.ts +3 -3
  313. package/dist/src/bitgo/types.d.ts.map +1 -1
  314. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
  315. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  316. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
  317. package/dist/src/bitgo/utils/codecProps.js +24 -11
  318. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  319. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  320. package/dist/src/bitgo/utils/codecs.js +59 -0
  321. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  322. package/dist/src/bitgo/utils/decode.js +30 -16
  323. package/dist/src/bitgo/utils/index.d.ts +4 -2
  324. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  325. package/dist/src/bitgo/utils/index.js +27 -11
  326. package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
  327. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  328. package/dist/src/bitgo/utils/messageTypes.js +17 -0
  329. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  330. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  331. package/dist/src/bitgo/utils/mpcUtils.js +160 -14
  332. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  333. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  334. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  335. package/dist/src/bitgo/utils/opengpgUtils.d.ts +10 -7
  336. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  337. package/dist/src/bitgo/utils/opengpgUtils.js +75 -62
  338. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  339. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  340. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  341. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  342. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  343. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  344. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  345. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  346. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  347. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  348. package/dist/src/bitgo/utils/triple.js +2 -3
  349. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  350. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  351. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  352. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +97 -18
  353. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  354. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +309 -46
  355. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +417 -46
  356. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  357. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  358. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  359. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  360. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  361. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  362. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  363. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  364. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +25 -51
  365. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  366. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +172 -246
  367. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +216 -0
  368. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  369. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1050 -0
  370. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  371. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  372. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +16 -0
  373. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  374. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  375. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  376. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  377. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  378. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  379. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  380. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  381. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  382. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  383. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  384. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  385. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  386. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  387. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  388. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +38 -11
  389. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  390. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +254 -96
  391. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +156 -0
  392. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  393. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +737 -0
  394. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  395. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  396. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +16 -0
  397. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
  398. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  399. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
  400. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +12 -7
  401. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  402. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  403. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  404. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  405. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  406. package/dist/src/bitgo/utils/tss/index.d.ts +3 -0
  407. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  408. package/dist/src/bitgo/utils/tss/index.js +26 -9
  409. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  410. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  411. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  412. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +33 -0
  413. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  414. package/dist/src/bitgo/utils/tss/recipientUtils.js +118 -0
  415. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  416. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  417. package/dist/src/bitgo/utils/txRequest.js +49 -0
  418. package/dist/src/bitgo/utils/util.js +24 -10
  419. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  420. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  421. package/dist/src/bitgo/utils/wallet.js +48 -0
  422. package/dist/src/bitgo/wallet/BuildParams.d.ts +80 -1
  423. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  424. package/dist/src/bitgo/wallet/BuildParams.js +83 -11
  425. package/dist/src/bitgo/wallet/iWallet.d.ts +528 -25
  426. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  427. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  428. package/dist/src/bitgo/wallet/iWallets.d.ts +298 -16
  429. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  430. package/dist/src/bitgo/wallet/iWallets.js +63 -3
  431. package/dist/src/bitgo/wallet/index.js +6 -2
  432. package/dist/src/bitgo/wallet/wallet.d.ts +353 -27
  433. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  434. package/dist/src/bitgo/wallet/wallet.js +2123 -371
  435. package/dist/src/bitgo/wallet/wallets.d.ts +93 -4
  436. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  437. package/dist/src/bitgo/wallet/wallets.js +1146 -155
  438. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  439. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  440. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  441. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  442. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  443. package/dist/src/bitgo/walletUtil/index.js +19 -0
  444. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  445. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  446. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  447. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  448. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  449. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  450. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  451. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  452. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  453. package/dist/src/bitgo/webhook/index.js +6 -2
  454. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  455. package/dist/src/coins/fiat.d.ts +45 -0
  456. package/dist/src/coins/fiat.d.ts.map +1 -0
  457. package/dist/src/coins/fiat.js +94 -0
  458. package/dist/src/coins/index.d.ts +1 -6
  459. package/dist/src/coins/index.d.ts.map +1 -1
  460. package/dist/src/coins/index.js +7 -8
  461. package/dist/src/coins/ofc.d.ts +21 -2
  462. package/dist/src/coins/ofc.d.ts.map +1 -1
  463. package/dist/src/coins/ofc.js +29 -3
  464. package/dist/src/coins/ofcToken.d.ts +15 -4
  465. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  466. package/dist/src/coins/ofcToken.js +43 -5
  467. package/dist/src/coins/susd.d.ts +3 -2
  468. package/dist/src/coins/susd.d.ts.map +1 -1
  469. package/dist/src/coins/susd.js +5 -1
  470. package/dist/src/common.js +27 -13
  471. package/dist/src/index.d.ts +7 -1
  472. package/dist/src/index.d.ts.map +1 -1
  473. package/dist/src/index.js +32 -11
  474. package/dist/src/lightning.d.ts +20 -0
  475. package/dist/src/lightning.d.ts.map +1 -0
  476. package/dist/src/lightning.js +13 -0
  477. package/dist/src/units.js +5 -6
  478. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  479. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  480. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  481. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  482. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  483. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  484. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  485. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  486. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  487. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  488. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  489. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  490. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  491. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  492. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  493. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  494. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  495. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  496. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  497. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  498. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  499. package/dist/test/unit/bitgo/defi/defiVault.js +542 -0
  500. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  501. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  502. package/dist/test/unit/bitgo/environment.js +38 -0
  503. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  504. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  505. package/dist/test/unit/bitgo/errors.js +262 -0
  506. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  507. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  508. package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
  509. package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
  510. package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
  511. package/dist/test/unit/bitgo/safe/safe.js +134 -0
  512. package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
  513. package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
  514. package/dist/test/unit/bitgo/safe/safes.js +297 -0
  515. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  516. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  517. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  518. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  519. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  520. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  521. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
  522. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  523. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  524. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  525. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  526. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  527. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  528. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  529. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  530. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  531. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  532. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  533. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  534. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +399 -0
  535. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  536. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  537. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  538. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  539. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  540. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +999 -0
  541. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  542. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  543. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  544. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  545. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  546. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  547. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  548. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  549. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1524 -0
  550. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  551. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  552. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  553. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  554. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  555. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  556. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  557. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  558. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +172 -0
  559. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  560. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  561. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  562. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  563. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  564. package/dist/test/unit/bitgo/wallet/BuildParams.js +124 -0
  565. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +30 -9
  566. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  567. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  568. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  569. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  570. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  571. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  572. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  573. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  574. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  575. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  576. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  577. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  578. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  579. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  580. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  581. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  582. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  583. package/dist/test/unit/bitgo/wallet/tokenApproval.js +201 -0
  584. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  585. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  586. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  587. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  588. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  589. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
  590. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  591. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  592. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  593. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  594. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  595. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
  596. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  597. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  598. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  599. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  600. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  601. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +670 -0
  602. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  603. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  604. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
  605. package/dist/test/unit/coins/ofc.d.ts +2 -0
  606. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  607. package/dist/test/unit/coins/ofc.js +124 -0
  608. package/dist/test/unit/lightning.d.ts +2 -0
  609. package/dist/test/unit/lightning.d.ts.map +1 -0
  610. package/dist/test/unit/lightning.js +23 -0
  611. package/dist/test/unit/units.d.ts.map +1 -1
  612. package/dist/test/unit/units.js +64 -64
  613. package/dist/tsconfig.tsbuildinfo +1 -1
  614. package/package.json +24 -21
  615. package/.eslintignore +0 -5
  616. package/CHANGELOG.md +0 -1638
  617. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  618. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  619. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  620. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  621. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  622. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  623. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  624. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  625. package/dist/src/bitgo/lightning/index.js +0 -17
  626. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  627. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  628. package/dist/src/bitgo/lightning/lightning.js +0 -111
  629. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  630. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  631. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  632. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  633. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  634. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  635. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  636. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  637. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  638. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  639. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  640. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  641. package/dist/src/coins/fiateur.d.ts +0 -31
  642. package/dist/src/coins/fiateur.d.ts.map +0 -1
  643. package/dist/src/coins/fiateur.js +0 -57
  644. package/dist/src/coins/fiatgbp.d.ts +0 -31
  645. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  646. package/dist/src/coins/fiatgbp.js +0 -57
  647. package/dist/src/coins/fiatusd.d.ts +0 -31
  648. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  649. package/dist/src/coins/fiatusd.js +0 -57
  650. package/dist/src/coins/tfiateur.d.ts +0 -11
  651. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  652. package/dist/src/coins/tfiateur.js +0 -17
  653. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  654. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  655. package/dist/src/coins/tfiatgbp.js +0 -17
  656. package/dist/src/coins/tfiatusd.d.ts +0 -11
  657. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  658. package/dist/src/coins/tfiatusd.js +0 -17
  659. package/dist/src/openssl/index.d.ts +0 -5
  660. package/dist/src/openssl/index.d.ts.map +0 -1
  661. package/dist/src/openssl/index.js +0 -9
  662. package/dist/test/unit/openssl.d.ts +0 -2
  663. package/dist/test/unit/openssl.d.ts.map +0 -1
  664. package/dist/test/unit/openssl.js +0 -39
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -11,23 +15,35 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
11
15
  }) : function(o, v) {
12
16
  o["default"] = v;
13
17
  });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
21
35
  Object.defineProperty(exports, "__esModule", { value: true });
22
36
  const paillierBigint = __importStar(require("paillier-bigint"));
23
37
  const bigintCryptoUtils = __importStar(require("bigint-crypto-utils"));
24
- const secp = __importStar(require("@noble/secp256k1"));
38
+ const secp256k1_1 = require("@noble/curves/secp256k1");
25
39
  const crypto_1 = require("crypto");
26
40
  const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
27
41
  const util_1 = require("../../util");
28
42
  const curves_1 = require("../../curves");
29
43
  const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
30
44
  const _5n = BigInt(5);
45
+ // Size of alpha and mu shares in bytes expected by the implementation of the protocol
46
+ const ALPHAMUSIZE = 768;
31
47
  /**
32
48
  * ECDSA TSS implementation supporting 2:n Threshold
33
49
  */
@@ -43,7 +59,6 @@ class Ecdsa {
43
59
  * and n-shares to be distributed to participants at their corresponding index.
44
60
  */
45
61
  async keyShare(index, threshold, numShares, seed, sync = false) {
46
- var _a, _b;
47
62
  if (!(index > 0 && index <= numShares && threshold <= numShares && threshold === 2)) {
48
63
  throw 'Invalid KeyShare Config';
49
64
  }
@@ -53,7 +68,7 @@ class Ecdsa {
53
68
  let seedWithValidLength = seed;
54
69
  if (seed && seed.length > 64) {
55
70
  // if seed length is greater than 64 bytes, hash seed to 64 bytes.
56
- seedWithValidLength = crypto_1.createHash('sha512').update(seed).digest();
71
+ seedWithValidLength = (0, crypto_1.createHash)('sha512').update(seed).digest();
57
72
  }
58
73
  // Generate additively homomorphic encryption key.
59
74
  let paillierKeyPair;
@@ -67,20 +82,21 @@ class Ecdsa {
67
82
  const { publicKey, privateKey } = paillierKeyPair;
68
83
  // Accept a 64 byte seed and create an extended private key from that seed
69
84
  const secretKey = seedWithValidLength && utxo_lib_1.bip32.fromSeed(seedWithValidLength);
70
- const u = (_a = (secretKey && secretKey.privateKey && util_1.bigIntFromU8ABE(new Uint8Array(secretKey.privateKey)))) !== null && _a !== void 0 ? _a : Ecdsa.curve.scalarRandom();
85
+ const u = (secretKey && secretKey.privateKey && (0, util_1.bigIntFromU8ABE)(new Uint8Array(secretKey.privateKey))) ??
86
+ Ecdsa.curve.scalarRandom();
71
87
  const y = Ecdsa.curve.basePointMult(u);
72
- const chaincode = (_b = (secretKey && secretKey.chainCode)) !== null && _b !== void 0 ? _b : crypto_1.randomBytes(32);
88
+ const chaincode = (secretKey && secretKey.chainCode) ?? (0, crypto_1.randomBytes)(32);
73
89
  // Compute secret shares of the private key
74
90
  const { shares: uShares, v } = Ecdsa.shamir.split(u, threshold, numShares);
75
91
  const currentParticipant = {
76
92
  i: index,
77
93
  t: threshold,
78
94
  c: numShares,
79
- l: util_1.bigIntToBufferBE(privateKey.lambda, 192).toString('hex'),
80
- m: util_1.bigIntToBufferBE(privateKey.mu, 192).toString('hex'),
81
- n: util_1.bigIntToBufferBE(publicKey.n, 384).toString('hex'),
82
- y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
83
- u: util_1.bigIntToBufferBE(uShares[index], 32).toString('hex'),
95
+ l: (0, util_1.bigIntToBufferBE)(privateKey.lambda, 192).toString('hex'),
96
+ m: (0, util_1.bigIntToBufferBE)(privateKey.mu, 192).toString('hex'),
97
+ n: (0, util_1.bigIntToBufferBE)(publicKey.n, 384).toString('hex'),
98
+ y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
99
+ u: (0, util_1.bigIntToBufferBE)(uShares[index], 32).toString('hex'),
84
100
  uu: u.toString(),
85
101
  chaincode: chaincode.toString('hex'),
86
102
  };
@@ -95,9 +111,9 @@ class Ecdsa {
95
111
  i: participantIndex,
96
112
  j: currentParticipant['i'],
97
113
  n: publicKey.n.toString(16),
98
- y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
99
- v: util_1.bigIntToBufferBE(v[0], 33).toString('hex'),
100
- u: util_1.bigIntToBufferBE(uShares[participantIndex], 32).toString('hex'),
114
+ y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
115
+ v: (0, util_1.bigIntToBufferBE)(v[0], 33).toString('hex'),
116
+ u: (0, util_1.bigIntToBufferBE)(uShares[participantIndex], 32).toString('hex'),
101
117
  chaincode: chaincode.toString('hex'),
102
118
  };
103
119
  }
@@ -114,14 +130,14 @@ class Ecdsa {
114
130
  keyCombine(pShare, nShares) {
115
131
  const allShares = [pShare, ...nShares];
116
132
  // Compute the public key.
117
- const y = allShares.map((participant) => sdk_lib_mpc_1.hexToBigInt(participant['y'])).reduce(Ecdsa.curve.pointAdd);
133
+ const y = allShares.map((participant) => (0, sdk_lib_mpc_1.hexToBigInt)(participant['y'])).reduce(Ecdsa.curve.pointAdd);
118
134
  // Add secret shares
119
- const x = allShares.map((participant) => sdk_lib_mpc_1.hexToBigInt(participant['u'])).reduce(Ecdsa.curve.scalarAdd);
135
+ const x = allShares.map((participant) => (0, sdk_lib_mpc_1.hexToBigInt)(participant['u'])).reduce(Ecdsa.curve.scalarAdd);
120
136
  // Verify shares.
121
137
  for (const share of nShares) {
122
138
  if (share.v) {
123
139
  try {
124
- Ecdsa.shamir.verify(sdk_lib_mpc_1.hexToBigInt(share.u), [sdk_lib_mpc_1.hexToBigInt(share.y), sdk_lib_mpc_1.hexToBigInt(share.v)], pShare.i);
140
+ Ecdsa.shamir.verify((0, sdk_lib_mpc_1.hexToBigInt)(share.u), [(0, sdk_lib_mpc_1.hexToBigInt)(share.y), (0, sdk_lib_mpc_1.hexToBigInt)(share.v)], pShare.i);
125
141
  }
126
142
  catch (err) {
127
143
  throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
@@ -130,10 +146,10 @@ class Ecdsa {
130
146
  }
131
147
  // Generate Schnorr proof of knowledge of the discrete log of X = xG.
132
148
  const X = Ecdsa.curve.basePointMult(x);
133
- const proofContext = crypto_1.createHash('sha256').update(util_1.bigIntToBufferBE(y, Ecdsa.curve.pointBytes)).digest();
149
+ const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(y, Ecdsa.curve.pointBytes)).digest();
134
150
  const schnorrProofX = sdk_lib_mpc_1.Schnorr.createSchnorrProof(X, x, Ecdsa.curve, proofContext);
135
151
  // Chaincode will be used in future when we add support for key derivation for ecdsa
136
- const chaincodes = [pShare, ...nShares].map(({ chaincode }) => util_1.bigIntFromBufferBE(Buffer.from(chaincode, 'hex')));
152
+ const chaincodes = [pShare, ...nShares].map(({ chaincode }) => (0, util_1.bigIntFromBufferBE)(Buffer.from(chaincode, 'hex')));
137
153
  const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) % BigInt('0x010000000000000000000000000000000000000000000000000000000000000000') // 2^256
138
154
  );
139
155
  const participants = {
@@ -142,10 +158,10 @@ class Ecdsa {
142
158
  l: pShare.l,
143
159
  m: pShare.m,
144
160
  n: pShare.n,
145
- y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
146
- x: util_1.bigIntToBufferBE(x, 32).toString('hex'),
161
+ y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
162
+ x: (0, util_1.bigIntToBufferBE)(x, 32).toString('hex'),
147
163
  schnorrProofX: schnorrProofX,
148
- chaincode: util_1.bigIntToBufferBE(chaincode, 32).toString('hex'),
164
+ chaincode: (0, util_1.bigIntToBufferBE)(chaincode, 32).toString('hex'),
149
165
  },
150
166
  yShares: {},
151
167
  };
@@ -168,17 +184,17 @@ class Ecdsa {
168
184
  * be distributed to participants at their corresponding index.
169
185
  */
170
186
  keyDerive(pShare, nShares, path) {
171
- const yValues = [pShare, ...nShares].map((share) => sdk_lib_mpc_1.hexToBigInt(share.y));
187
+ const yValues = [pShare, ...nShares].map((share) => (0, sdk_lib_mpc_1.hexToBigInt)(share.y));
172
188
  const y = yValues.reduce((partial, share) => Ecdsa.curve.pointAdd(partial, share));
173
189
  const u = BigInt(pShare.uu);
174
- let contribChaincode = sdk_lib_mpc_1.hexToBigInt(pShare.chaincode);
175
- const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) => sdk_lib_mpc_1.hexToBigInt(chaincode))];
190
+ let contribChaincode = (0, sdk_lib_mpc_1.hexToBigInt)(pShare.chaincode);
191
+ const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) => (0, sdk_lib_mpc_1.hexToBigInt)(chaincode))];
176
192
  const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) % sdk_lib_mpc_1.chaincodeBase);
177
193
  // Verify shares.
178
194
  for (const share of nShares) {
179
195
  if (share.v) {
180
196
  try {
181
- Ecdsa.shamir.verify(sdk_lib_mpc_1.hexToBigInt(share.u), [sdk_lib_mpc_1.hexToBigInt(share.y), sdk_lib_mpc_1.hexToBigInt(share.v)], pShare.i);
197
+ Ecdsa.shamir.verify((0, sdk_lib_mpc_1.hexToBigInt)(share.u), [(0, sdk_lib_mpc_1.hexToBigInt)(share.y), (0, sdk_lib_mpc_1.hexToBigInt)(share.v)], pShare.i);
182
198
  }
183
199
  catch (err) {
184
200
  throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
@@ -195,20 +211,20 @@ class Ecdsa {
195
211
  // Calculate new u values.
196
212
  const { shares: split_u, v } = Ecdsa.shamir.split(subkey.sk, pShare.t || 2, pShare.c || 3);
197
213
  // Calculate new signing key.
198
- const x = [split_u[pShare.i], ...nShares.map(({ u }) => sdk_lib_mpc_1.hexToBigInt(u))].reduce(Ecdsa.curve.scalarAdd);
214
+ const x = [split_u[pShare.i], ...nShares.map(({ u }) => (0, sdk_lib_mpc_1.hexToBigInt)(u))].reduce(Ecdsa.curve.scalarAdd);
199
215
  // Generate Schnorr proof of knowledge of the discrete log of X = xG.
200
216
  const X = Ecdsa.curve.basePointMult(x);
201
- const proofContext = crypto_1.createHash('sha256').update(util_1.bigIntToBufferBE(subkey.pk, Ecdsa.curve.pointBytes)).digest();
217
+ const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(subkey.pk, Ecdsa.curve.pointBytes)).digest();
202
218
  const schnorrProofX = sdk_lib_mpc_1.Schnorr.createSchnorrProof(X, x, Ecdsa.curve, proofContext);
203
219
  const P_i = {
204
220
  i: pShare.i,
205
221
  l: pShare.l,
206
222
  m: pShare.m,
207
223
  n: pShare.n,
208
- y: util_1.bigIntToBufferBE(subkey.pk, 33).toString('hex'),
209
- x: util_1.bigIntToBufferBE(x, 32).toString('hex'),
224
+ y: (0, util_1.bigIntToBufferBE)(subkey.pk, 33).toString('hex'),
225
+ x: (0, util_1.bigIntToBufferBE)(x, 32).toString('hex'),
210
226
  schnorrProofX: schnorrProofX,
211
- chaincode: util_1.bigIntToBufferBE(subkey.chaincode, 32).toString('hex'),
227
+ chaincode: (0, util_1.bigIntToBufferBE)(subkey.chaincode, 32).toString('hex'),
212
228
  };
213
229
  const shares = {
214
230
  xShare: P_i,
@@ -220,10 +236,10 @@ class Ecdsa {
220
236
  i: P_j.j,
221
237
  j: P_i.i,
222
238
  n: P_i.n,
223
- u: util_1.bigIntToBufferBE(split_u[P_j.j], 32).toString('hex'),
224
- y: util_1.bigIntToBufferBE(contribY, 32).toString('hex'),
225
- v: util_1.bigIntToBufferBE(v[0], 32).toString('hex'),
226
- chaincode: util_1.bigIntToBufferBE(contribChaincode, 32).toString('hex'),
239
+ u: (0, util_1.bigIntToBufferBE)(split_u[P_j.j], 32).toString('hex'),
240
+ y: (0, util_1.bigIntToBufferBE)(contribY, 32).toString('hex'),
241
+ v: (0, util_1.bigIntToBufferBE)(v[0], 32).toString('hex'),
242
+ chaincode: (0, util_1.bigIntToBufferBE)(contribChaincode, 32).toString('hex'),
227
243
  };
228
244
  }
229
245
  return shares;
@@ -247,7 +263,7 @@ class Ecdsa {
247
263
  X_i = Ecdsa.curve.pointAdd(X_i, Ecdsa.curve.pointMultiply(v, BigInt(index)));
248
264
  });
249
265
  });
250
- const proofContext = crypto_1.createHash('sha256').update(util_1.bigIntToBufferBE(Y, Ecdsa.curve.pointBytes)).digest();
266
+ const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(Y, Ecdsa.curve.pointBytes)).digest();
251
267
  return sdk_lib_mpc_1.Schnorr.verifySchnorrProof(X_i, proof, Ecdsa.curve, proofContext);
252
268
  }
253
269
  /**
@@ -263,11 +279,11 @@ class Ecdsa {
263
279
  }
264
280
  const keychain = Buffer.from(commonKeychain, 'hex');
265
281
  const derivedPublicKeychain = Ecdsa.hdTree.publicDerive({
266
- pk: util_1.bigIntFromBufferBE(keychain.slice(0, 33)),
267
- chaincode: util_1.bigIntFromBufferBE(keychain.slice(33)),
282
+ pk: (0, util_1.bigIntFromBufferBE)(keychain.slice(0, 33)),
283
+ chaincode: (0, util_1.bigIntFromBufferBE)(keychain.slice(33)),
268
284
  }, path);
269
- const derivedPk = util_1.bigIntToBufferBE(derivedPublicKeychain.pk, 33).toString('hex');
270
- const derivedChaincode = util_1.bigIntToBufferBE(derivedPublicKeychain.chaincode, 32).toString('hex');
285
+ const derivedPk = (0, util_1.bigIntToBufferBE)(derivedPublicKeychain.pk, 33).toString('hex');
286
+ const derivedChaincode = (0, util_1.bigIntToBufferBE)(derivedPublicKeychain.chaincode, 32).toString('hex');
271
287
  return derivedPk + derivedChaincode;
272
288
  }
273
289
  /**
@@ -296,15 +312,15 @@ class Ecdsa {
296
312
  * and k-share to be distributed to other participant signer
297
313
  */
298
314
  async signShare(xShare, yShare) {
299
- const pk = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(xShare.n));
315
+ const pk = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(xShare.n));
300
316
  const k = Ecdsa.curve.scalarRandom();
301
- const rk = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pk.n);
317
+ const rk = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pk.n);
302
318
  const ck = pk.encrypt(k, rk);
303
319
  const gamma = Ecdsa.curve.scalarRandom();
304
320
  const d = Ecdsa.curve.scalarMult(Ecdsa.curve.scalarSub(BigInt(yShare.j), BigInt(xShare.i)), BigInt(xShare.i));
305
321
  const w = [
306
322
  Ecdsa.curve.scalarMult(BigInt(yShare.j), BigInt(xShare.i)),
307
- sdk_lib_mpc_1.hexToBigInt(xShare['x']),
323
+ (0, sdk_lib_mpc_1.hexToBigInt)(xShare['x']),
308
324
  Ecdsa.curve.scalarInvert(d),
309
325
  ].reduce(Ecdsa.curve.scalarMult);
310
326
  const { ntilde: ntildea, h1: h1a, h2: h2a } = xShare;
@@ -318,27 +334,27 @@ class Ecdsa {
318
334
  h1: h1a,
319
335
  h2: h2a,
320
336
  p: xShare.p,
321
- k: util_1.bigIntToBufferBE(k, 32).toString('hex'),
322
- ck: util_1.bigIntToBufferBE(ck, 768).toString('hex'),
323
- w: util_1.bigIntToBufferBE(w, 32).toString('hex'),
324
- gamma: util_1.bigIntToBufferBE(gamma, 32).toString('hex'),
337
+ k: (0, util_1.bigIntToBufferBE)(k, 32).toString('hex'),
338
+ ck: (0, util_1.bigIntToBufferBE)(ck, 768).toString('hex'),
339
+ w: (0, util_1.bigIntToBufferBE)(w, 32).toString('hex'),
340
+ gamma: (0, util_1.bigIntToBufferBE)(gamma, 32).toString('hex'),
325
341
  };
326
342
  const { ntilde: ntildeb, h1: h1b, h2: h2b } = yShare;
327
343
  const proof = await sdk_lib_mpc_1.EcdsaRangeProof.prove(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pk, {
328
- ntilde: sdk_lib_mpc_1.hexToBigInt(ntildeb),
329
- h1: sdk_lib_mpc_1.hexToBigInt(h1b),
330
- h2: sdk_lib_mpc_1.hexToBigInt(h2b),
344
+ ntilde: (0, sdk_lib_mpc_1.hexToBigInt)(ntildeb),
345
+ h1: (0, sdk_lib_mpc_1.hexToBigInt)(h1b),
346
+ h2: (0, sdk_lib_mpc_1.hexToBigInt)(h2b),
331
347
  }, ck, k, rk);
332
348
  // create paillier challenge proof based on the other signers challenge
333
349
  // only send sigma if we also send challenge p
334
- const sigma = sdk_lib_mpc_1.EcdsaPaillierProof.prove(sdk_lib_mpc_1.hexToBigInt(xShare.n), sdk_lib_mpc_1.hexToBigInt(xShare.l), sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: yShare.p }).p);
350
+ const sigma = sdk_lib_mpc_1.EcdsaPaillierProof.prove((0, sdk_lib_mpc_1.hexToBigInt)(xShare.n), (0, sdk_lib_mpc_1.hexToBigInt)(xShare.l), sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: yShare.p }).p);
335
351
  const proofShare = {
336
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
337
- u: util_1.bigIntToBufferBE(proof.u, 768).toString('hex'),
338
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
339
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
340
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
341
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
352
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
353
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 768).toString('hex'),
354
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
355
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
356
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
357
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
342
358
  };
343
359
  const kShare = {
344
360
  // this share will be sent to the other participant,
@@ -351,7 +367,7 @@ class Ecdsa {
351
367
  h1: h1a,
352
368
  h2: h2a,
353
369
  p: xShare.p,
354
- k: util_1.bigIntToBufferBE(ck, 768).toString('hex'),
370
+ k: (0, util_1.bigIntToBufferBE)(ck, 768).toString('hex'),
355
371
  sigma: sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallengeProofs({ sigma: sigma }).sigma,
356
372
  proof: proofShare,
357
373
  };
@@ -386,17 +402,17 @@ class Ecdsa {
386
402
  throw new Error('Unexpected missing proof on aShareToBeSent');
387
403
  }
388
404
  // the other participants paillier public key
389
- const n = sdk_lib_mpc_1.hexToBigInt(receivedKShare.n);
390
- const pka = util_1.getPaillierPublicKey(n);
405
+ const n = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.n);
406
+ const pka = (0, util_1.getPaillierPublicKey)(n);
391
407
  // the other participant's range proof challenge
392
- const ntildea = sdk_lib_mpc_1.hexToBigInt(receivedKShare.ntilde);
393
- const h1a = sdk_lib_mpc_1.hexToBigInt(receivedKShare.h1);
394
- const h2a = sdk_lib_mpc_1.hexToBigInt(receivedKShare.h2);
408
+ const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.ntilde);
409
+ const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.h1);
410
+ const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.h2);
395
411
  // the current participant's range proof challenge
396
- const ntildeb = sdk_lib_mpc_1.hexToBigInt(shareParticipant.ntilde);
397
- const h1b = sdk_lib_mpc_1.hexToBigInt(shareParticipant.h1);
398
- const h2b = sdk_lib_mpc_1.hexToBigInt(shareParticipant.h2);
399
- const k = sdk_lib_mpc_1.hexToBigInt(receivedKShare.k);
412
+ const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.ntilde);
413
+ const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.h1);
414
+ const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.h2);
415
+ const k = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.k);
400
416
  // the current participants paillier proof challenge
401
417
  const shareParticipantPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: shareParticipant.p });
402
418
  // the other signing parties proof to the current participants paillier proof challenge
@@ -411,23 +427,23 @@ class Ecdsa {
411
427
  h1: h1b,
412
428
  h2: h2b,
413
429
  }, {
414
- z: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.z),
415
- u: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.u),
416
- w: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.w),
417
- s: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s),
418
- s1: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s1),
419
- s2: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s2),
430
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.z),
431
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.u),
432
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.w),
433
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s),
434
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s1),
435
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s2),
420
436
  }, k)) {
421
437
  throw new Error('Could not verify signing A share proof');
422
438
  }
423
439
  // MtA $k_j, \gamma_i$.
424
440
  const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
425
- const beta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
426
- const g = sdk_lib_mpc_1.hexToBigInt(shareParticipant.gamma);
427
- const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
441
+ const beta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
442
+ const g = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.gamma);
443
+ const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
428
444
  const cb = pka.encrypt(beta0, rb);
429
445
  const alpha = pka.addition(pka.multiply(k, g), cb);
430
- const alphaToBeSent = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
446
+ const alphaToBeSent = (0, util_1.bigIntToBufferBE)(alpha, ALPHAMUSIZE).toString('hex');
431
447
  // Prove $\gamma_i \in Z_{N^2}$.
432
448
  const gx = Ecdsa.curve.basePointMult(g);
433
449
  let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
@@ -436,52 +452,52 @@ class Ecdsa {
436
452
  h2: h2a,
437
453
  }, k, alpha, g, beta0, rb, gx);
438
454
  const gammaProofToBeSent = {
439
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
440
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
441
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
442
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
443
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
444
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
445
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
446
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
447
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
448
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
449
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
450
- x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
455
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
456
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
457
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
458
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
459
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
460
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
461
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
462
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
463
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
464
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
465
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
466
+ x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
451
467
  };
452
468
  // MtA $k_j, w_i$.
453
469
  const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
454
- const nu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
455
- const w = sdk_lib_mpc_1.hexToBigInt(shareParticipant.w);
456
- const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
470
+ const nu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
471
+ const w = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.w);
472
+ const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
457
473
  const cn = pka.encrypt(nu0, rn);
458
474
  const mu = pka.addition(pka.multiply(k, w), cn);
459
- const muToBeSent = util_1.bigIntToBufferBE(mu, 32).toString('hex');
475
+ const muToBeSent = (0, util_1.bigIntToBufferBE)(mu, ALPHAMUSIZE).toString('hex');
460
476
  // Prove $\w_i \in Z_{N^2}$.
461
477
  const wx = Ecdsa.curve.basePointMult(w);
462
478
  proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
463
479
  ntilde: ntildea,
464
480
  h1: h1a,
465
481
  h2: h2a,
466
- }, k, sdk_lib_mpc_1.hexToBigInt(muToBeSent), w, nu0, rn, wx);
482
+ }, k, (0, sdk_lib_mpc_1.hexToBigInt)(muToBeSent), w, nu0, rn, wx);
467
483
  const wProofToBeSent = {
468
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
469
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
470
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
471
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
472
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
473
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
474
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
475
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
476
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
477
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
478
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
479
- x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
484
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
485
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
486
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
487
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
488
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
489
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
490
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
491
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
492
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
493
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
494
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
495
+ x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
480
496
  };
481
497
  const nToBeSent = signShare.kShare.n;
482
- const ntildeToBeSent = util_1.bigIntToBufferBE(ntildeb, 384).toString('hex');
483
- const h1ToBeSent = util_1.bigIntToBufferBE(h1b, 384).toString('hex');
484
- const h2ToBeSent = util_1.bigIntToBufferBE(h2b, 384).toString('hex');
498
+ const ntildeToBeSent = (0, util_1.bigIntToBufferBE)(ntildeb, 384).toString('hex');
499
+ const h1ToBeSent = (0, util_1.bigIntToBufferBE)(h1b, 384).toString('hex');
500
+ const h2ToBeSent = (0, util_1.bigIntToBufferBE)(h2b, 384).toString('hex');
485
501
  const kToBeSent = signShare.kShare.k;
486
502
  const proofToBeSent = signShare.kShare.proof;
487
503
  const [iToBeSent, jToBeSent] = [receivedKShare.j, receivedKShare.i];
@@ -526,13 +542,13 @@ class Ecdsa {
526
542
  if (!receivedAShare.wProof) {
527
543
  throw new Error('Unexpected missing wProof on aShareToBeSent');
528
544
  }
529
- const n = sdk_lib_mpc_1.hexToBigInt(receivedAShare.n); // Paillier pub from other signer
545
+ const n = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.n); // Paillier pub from other signer
530
546
  // current participant public key
531
- const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(shares.wShare.n));
532
- const ntildea = sdk_lib_mpc_1.hexToBigInt(shares.wShare.ntilde);
533
- const h1a = sdk_lib_mpc_1.hexToBigInt(shares.wShare.h1);
534
- const h2a = sdk_lib_mpc_1.hexToBigInt(shares.wShare.h2);
535
- const ck = sdk_lib_mpc_1.hexToBigInt(shares.wShare.ck);
547
+ const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.n));
548
+ const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.ntilde);
549
+ const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.h1);
550
+ const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.h2);
551
+ const ck = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.ck);
536
552
  const shareParticipantPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: shares.wShare.p });
537
553
  const receivedPaillierChallengeProof = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallengeProofs({
538
554
  sigma: shares.aShare.sigma,
@@ -546,18 +562,18 @@ class Ecdsa {
546
562
  h1: h1a,
547
563
  h2: h2a,
548
564
  }, {
549
- z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.z),
550
- zprm: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.zprm),
551
- t: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t),
552
- v: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.v),
553
- w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.w),
554
- s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s),
555
- s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s1),
556
- s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s2),
557
- t1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t1),
558
- t2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t2),
559
- u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.u),
560
- }, ck, sdk_lib_mpc_1.hexToBigInt(receivedAShare.alpha), sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.x))) {
565
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.z),
566
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.zprm),
567
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t),
568
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.v),
569
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.w),
570
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s),
571
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s1),
572
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s2),
573
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t1),
574
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t2),
575
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.u),
576
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.x))) {
561
577
  throw new Error('could not verify signing share for gamma proof');
562
578
  }
563
579
  // Verify $\w_i \in Z_{N^2}$.
@@ -566,54 +582,54 @@ class Ecdsa {
566
582
  h1: h1a,
567
583
  h2: h2a,
568
584
  }, {
569
- z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.z),
570
- zprm: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.zprm),
571
- t: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t),
572
- v: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.v),
573
- w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.w),
574
- s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s),
575
- s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s1),
576
- s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s2),
577
- t1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t1),
578
- t2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t2),
579
- u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.u),
580
- }, ck, sdk_lib_mpc_1.hexToBigInt(receivedAShare.mu), sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.x))) {
585
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.z),
586
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.zprm),
587
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t),
588
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.v),
589
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.w),
590
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s),
591
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s1),
592
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s2),
593
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t1),
594
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t2),
595
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.u),
596
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.mu), (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.x))) {
581
597
  throw new Error('could not verify share for wProof');
582
598
  }
583
- const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(shares.wShare.l), sdk_lib_mpc_1.hexToBigInt(shares.wShare.m), pka);
584
- const gShareAlpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedAShare.alpha))), 32).toString('hex');
585
- const gShareMu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedAShare.mu))), // recheck encrypted number
599
+ const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.l), (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.m), pka);
600
+ const gShareAlpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.alpha))), 32).toString('hex');
601
+ const gShareMu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.mu))), // recheck encrypted number
586
602
  32).toString('hex');
587
603
  if (!receivedAShare.proof) {
588
604
  throw new Error('Unexpected missing proof on aShareToBeSent');
589
605
  }
590
- const pkb = util_1.getPaillierPublicKey(n);
591
- const ntildeb = sdk_lib_mpc_1.hexToBigInt(receivedAShare.ntilde);
592
- const h1b = sdk_lib_mpc_1.hexToBigInt(receivedAShare.h1);
593
- const h2b = sdk_lib_mpc_1.hexToBigInt(receivedAShare.h2);
594
- const k = sdk_lib_mpc_1.hexToBigInt(receivedAShare.k);
606
+ const pkb = (0, util_1.getPaillierPublicKey)(n);
607
+ const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.ntilde);
608
+ const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.h1);
609
+ const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.h2);
610
+ const k = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.k);
595
611
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
596
612
  ntilde: ntildea,
597
613
  h1: h1a,
598
614
  h2: h2a,
599
615
  }, {
600
- z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.z),
601
- u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.u),
602
- w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.w),
603
- s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s),
604
- s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s1),
605
- s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s2),
616
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.z),
617
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.u),
618
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.w),
619
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s),
620
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s1),
621
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s2),
606
622
  }, k)) {
607
623
  throw new Error('Could not verify signing A share proof');
608
624
  }
609
625
  // MtA $k_j, \gamma_i$.
610
626
  const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
611
- const gShareBeta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
612
- const g = sdk_lib_mpc_1.hexToBigInt(shares.wShare.gamma);
613
- const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pkb.n);
627
+ const gShareBeta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
628
+ const g = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.gamma);
629
+ const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pkb.n);
614
630
  const cb = pkb.encrypt(beta0, rb);
615
631
  const alpha = pkb.addition(pkb.multiply(k, g), cb);
616
- const alphaToBeSent = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
632
+ const alphaToBeSent = (0, util_1.bigIntToBufferBE)(alpha, ALPHAMUSIZE).toString('hex');
617
633
  // Prove $\gamma_i \in Z_{N^2}$.
618
634
  const gx = Ecdsa.curve.basePointMult(g);
619
635
  let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
@@ -622,47 +638,47 @@ class Ecdsa {
622
638
  h2: h2b,
623
639
  }, k, alpha, g, beta0, rb, gx);
624
640
  const gammaProofToBeSent = {
625
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
626
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
627
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
628
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
629
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
630
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
631
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
632
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
633
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
634
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
635
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
636
- x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
641
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
642
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
643
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
644
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
645
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
646
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
647
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
648
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
649
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
650
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
651
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
652
+ x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
637
653
  };
638
654
  // MtA $k_j, w_i$.
639
655
  const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
640
- const gShareNu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
641
- const w = sdk_lib_mpc_1.hexToBigInt(shares.wShare.w);
642
- const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pkb.n);
656
+ const gShareNu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
657
+ const w = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.w);
658
+ const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pkb.n);
643
659
  const cn = pkb.encrypt(nu0, rn);
644
660
  const mu = pkb.addition(pkb.multiply(k, w), cn);
645
- const muToBeSent = util_1.bigIntToBufferBE(mu, 32).toString('hex');
661
+ const muToBeSent = (0, util_1.bigIntToBufferBE)(mu, ALPHAMUSIZE).toString('hex');
646
662
  // Prove $\w_i \in Z_{N^2}$.
647
663
  const wx = Ecdsa.curve.basePointMult(w);
648
664
  proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
649
665
  ntilde: ntildeb,
650
666
  h1: h1b,
651
667
  h2: h2b,
652
- }, k, sdk_lib_mpc_1.hexToBigInt(muToBeSent), w, nu0, rn, wx);
668
+ }, k, (0, sdk_lib_mpc_1.hexToBigInt)(muToBeSent), w, nu0, rn, wx);
653
669
  const wProofToBeSent = {
654
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
655
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
656
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
657
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
658
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
659
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
660
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
661
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
662
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
663
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
664
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
665
- x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
670
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
671
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
672
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
673
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
674
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
675
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
676
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
677
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
678
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
679
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
680
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
681
+ x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
666
682
  };
667
683
  const [iToBeSent, jToBeSent] = [receivedAShare.j, receivedAShare.i];
668
684
  return {
@@ -703,29 +719,29 @@ class Ecdsa {
703
719
  if (!receivedMuShare.wProof) {
704
720
  throw new Error('Unexpected missing wProof on aShareToBeSent');
705
721
  }
706
- const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(shares.bShare.n));
707
- const ntildea = sdk_lib_mpc_1.hexToBigInt(shares.bShare.ntilde);
708
- const h1a = sdk_lib_mpc_1.hexToBigInt(shares.bShare.h1);
709
- const h2a = sdk_lib_mpc_1.hexToBigInt(shares.bShare.h2);
710
- const ck = sdk_lib_mpc_1.hexToBigInt(shares.bShare.ck);
722
+ const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.n));
723
+ const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.ntilde);
724
+ const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.h1);
725
+ const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.h2);
726
+ const ck = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.ck);
711
727
  // Verify $\gamma_i \in Z_{N^2}$.
712
728
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
713
729
  ntilde: ntildea,
714
730
  h1: h1a,
715
731
  h2: h2a,
716
732
  }, {
717
- z: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.z),
718
- zprm: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.zprm),
719
- t: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t),
720
- v: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.v),
721
- w: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.w),
722
- s: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s),
723
- s1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s1),
724
- s2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s2),
725
- t1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t1),
726
- t2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t2),
727
- u: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.u),
728
- }, ck, sdk_lib_mpc_1.hexToBigInt(receivedMuShare.alpha), sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.x))) {
733
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.z),
734
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.zprm),
735
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t),
736
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.v),
737
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.w),
738
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s),
739
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s1),
740
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s2),
741
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t1),
742
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t2),
743
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.u),
744
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.x))) {
729
745
  throw new Error('could not verify signing share for gamma proof');
730
746
  }
731
747
  // Verify $\w_i \in Z_{N^2}$.
@@ -734,25 +750,25 @@ class Ecdsa {
734
750
  h1: h1a,
735
751
  h2: h2a,
736
752
  }, {
737
- z: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.z),
738
- zprm: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.zprm),
739
- t: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t),
740
- v: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.v),
741
- w: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.w),
742
- s: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s),
743
- s1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s1),
744
- s2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s2),
745
- t1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t1),
746
- t2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t2),
747
- u: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.u),
748
- }, ck, sdk_lib_mpc_1.hexToBigInt(receivedMuShare.mu), sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.x))) {
753
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.z),
754
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.zprm),
755
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t),
756
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.v),
757
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.w),
758
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s),
759
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s1),
760
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s2),
761
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t1),
762
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t2),
763
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.u),
764
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.mu), (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.x))) {
749
765
  throw new Error('could not verify share for wProof');
750
766
  }
751
- const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(shares.bShare.l), sdk_lib_mpc_1.hexToBigInt(shares.bShare.m), pka);
752
- const alpha = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedMuShare.alpha));
753
- const gShareAlpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
754
- const mu = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedMuShare.mu)); // recheck encrypted number
755
- const gShareMu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
767
+ const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.l), (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.m), pka);
768
+ const alpha = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.alpha));
769
+ const gShareAlpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
770
+ const mu = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.mu)); // recheck encrypted number
771
+ const gShareMu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
756
772
  const [iToBeSent, jToBeSent] = [receivedMuShare.j, receivedMuShare.i];
757
773
  return {
758
774
  gShare: {
@@ -817,13 +833,13 @@ class Ecdsa {
817
833
  if (!aShareToBeSent.wProof) {
818
834
  throw new Error('Unexpected missing wProof on aShareToBeSent');
819
835
  }
820
- const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(bShareParticipant.n));
836
+ const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.n));
821
837
  let ntildea, h1a, h2a, ck;
822
838
  if (bShareParticipant.ntilde) {
823
- ntildea = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ntilde);
824
- h1a = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h1);
825
- h2a = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h2);
826
- ck = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ck);
839
+ ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ntilde);
840
+ h1a = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h1);
841
+ h2a = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h2);
842
+ ck = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ck);
827
843
  }
828
844
  // Verify $\gamma_i \in Z_{N^2}$.
829
845
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
@@ -831,18 +847,18 @@ class Ecdsa {
831
847
  h1: h1a,
832
848
  h2: h2a,
833
849
  }, {
834
- z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.z),
835
- zprm: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.zprm),
836
- t: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t),
837
- v: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.v),
838
- w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.w),
839
- s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s),
840
- s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s1),
841
- s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s2),
842
- t1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t1),
843
- t2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t2),
844
- u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.u),
845
- }, ck, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.alpha), sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.x))) {
850
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.z),
851
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.zprm),
852
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t),
853
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.v),
854
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.w),
855
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s),
856
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s1),
857
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s2),
858
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t1),
859
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t2),
860
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.u),
861
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.x))) {
846
862
  throw new Error('could not verify signing share for gamma proof');
847
863
  }
848
864
  // Verify $\w_i \in Z_{N^2}$.
@@ -851,27 +867,27 @@ class Ecdsa {
851
867
  h1: h1a,
852
868
  h2: h2a,
853
869
  }, {
854
- z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.z),
855
- zprm: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.zprm),
856
- t: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t),
857
- v: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.v),
858
- w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.w),
859
- s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s),
860
- s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s1),
861
- s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s2),
862
- t1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t1),
863
- t2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t2),
864
- u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.u),
865
- }, ck, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu), sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.x))) {
870
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.z),
871
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.zprm),
872
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t),
873
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.v),
874
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.w),
875
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s),
876
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s1),
877
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s2),
878
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t1),
879
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t2),
880
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.u),
881
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu), (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.x))) {
866
882
  throw new Error('could not verify share for wProof');
867
883
  }
868
- const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(bShareParticipant.l), sdk_lib_mpc_1.hexToBigInt(bShareParticipant.m), pka);
884
+ const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.l), (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.m), pka);
869
885
  const gShareParticipant = shareParticipant;
870
886
  const muShareToBeSent = shareToBeSent;
871
- const alpha = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.alpha));
872
- gShareParticipant.alpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
873
- const mu = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu)); // recheck encrypted number
874
- gShareParticipant.mu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
887
+ const alpha = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.alpha));
888
+ gShareParticipant.alpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
889
+ const mu = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu)); // recheck encrypted number
890
+ gShareParticipant.mu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
875
891
  const partialShareParticipant = shareParticipant;
876
892
  const partialShareToBeSent = muShareToBeSent;
877
893
  delete partialShareParticipant.l;
@@ -885,37 +901,37 @@ class Ecdsa {
885
901
  if (!aShareToBeSent.proof) {
886
902
  throw new Error('Unexpected missing proof on aShareToBeSent');
887
903
  }
888
- const n = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.n); // Paillier pub from other signer
889
- const pka = util_1.getPaillierPublicKey(n);
890
- const ntildea = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.ntilde);
891
- const h1a = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.h1);
892
- const h2a = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.h2);
893
- const ntildeb = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ntilde);
894
- const h1b = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h1);
895
- const h2b = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h2);
896
- const k = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.k);
904
+ const n = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.n); // Paillier pub from other signer
905
+ const pka = (0, util_1.getPaillierPublicKey)(n);
906
+ const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.ntilde);
907
+ const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.h1);
908
+ const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.h2);
909
+ const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ntilde);
910
+ const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h1);
911
+ const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h2);
912
+ const k = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.k);
897
913
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
898
914
  ntilde: ntildeb,
899
915
  h1: h1b,
900
916
  h2: h2b,
901
917
  }, {
902
- z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.z),
903
- u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.u),
904
- w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.w),
905
- s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s),
906
- s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s1),
907
- s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s2),
918
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.z),
919
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.u),
920
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.w),
921
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s),
922
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s1),
923
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s2),
908
924
  }, k)) {
909
925
  throw new Error('Could not verify signing A share proof');
910
926
  }
911
927
  // MtA $k_j, \gamma_i$.
912
928
  const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
913
- bShareParticipant.beta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
914
- const g = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.gamma);
915
- const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
929
+ bShareParticipant.beta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
930
+ const g = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.gamma);
931
+ const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
916
932
  const cb = pka.encrypt(beta0, rb);
917
933
  const alpha = pka.addition(pka.multiply(k, g), cb);
918
- aShareToBeSent.alpha = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
934
+ aShareToBeSent.alpha = (0, util_1.bigIntToBufferBE)(alpha, 32).toString('hex');
919
935
  // Prove $\gamma_i \in Z_{N^2}$.
920
936
  const gx = Ecdsa.curve.basePointMult(g);
921
937
  let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
@@ -925,49 +941,49 @@ class Ecdsa {
925
941
  }, k, alpha, g, beta0, rb, gx);
926
942
  Object.assign(aShareToBeSent, {
927
943
  gammaProof: {
928
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
929
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
930
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
931
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
932
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
933
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
934
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
935
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
936
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
937
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
938
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
939
- x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
944
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
945
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
946
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
947
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
948
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
949
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
950
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
951
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
952
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
953
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
954
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
955
+ x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
940
956
  },
941
957
  });
942
958
  // MtA $k_j, w_i$.
943
959
  const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
944
- shareParticipant.nu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
945
- const w = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.w);
946
- const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
960
+ shareParticipant.nu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
961
+ const w = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.w);
962
+ const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
947
963
  const cn = pka.encrypt(nu0, rn);
948
964
  const mu = pka.addition(pka.multiply(k, w), cn);
949
- shareToBeSent.mu = util_1.bigIntToBufferBE(mu, 32).toString('hex');
965
+ shareToBeSent.mu = (0, util_1.bigIntToBufferBE)(mu, 32).toString('hex');
950
966
  // Prove $\w_i \in Z_{N^2}$.
951
967
  const wx = Ecdsa.curve.basePointMult(w);
952
968
  proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
953
969
  ntilde: ntildea,
954
970
  h1: h1a,
955
971
  h2: h2a,
956
- }, k, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu), w, nu0, rn, wx);
972
+ }, k, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu), w, nu0, rn, wx);
957
973
  Object.assign(shareToBeSent, {
958
974
  wProof: {
959
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
960
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
961
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
962
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
963
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
964
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
965
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
966
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
967
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
968
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
969
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
970
- x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
975
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
976
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
977
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
978
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
979
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
980
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
981
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
982
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
983
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
984
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
985
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
986
+ x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
971
987
  },
972
988
  });
973
989
  if (shareParticipant.alpha) {
@@ -987,9 +1003,9 @@ class Ecdsa {
987
1003
  else {
988
1004
  Object.assign(shareToBeSent, {
989
1005
  n: kShare.n,
990
- ntilde: util_1.bigIntToBufferBE(ntildeb, 384).toString('hex'),
991
- h1: util_1.bigIntToBufferBE(h1b, 384).toString('hex'),
992
- h2: util_1.bigIntToBufferBE(h2b, 384).toString('hex'),
1006
+ ntilde: (0, util_1.bigIntToBufferBE)(ntildeb, 384).toString('hex'),
1007
+ h1: (0, util_1.bigIntToBufferBE)(h1b, 384).toString('hex'),
1008
+ h2: (0, util_1.bigIntToBufferBE)(h2b, 384).toString('hex'),
993
1009
  k: kShare.k,
994
1010
  proof: kShare.proof,
995
1011
  });
@@ -1027,13 +1043,13 @@ class Ecdsa {
1027
1043
  signCombine(shares) {
1028
1044
  const gShare = shares.gShare;
1029
1045
  const S = shares.signIndex;
1030
- const gamma = sdk_lib_mpc_1.hexToBigInt(gShare.gamma);
1031
- const alpha = sdk_lib_mpc_1.hexToBigInt(gShare.alpha);
1032
- const beta = sdk_lib_mpc_1.hexToBigInt(gShare.beta);
1033
- const mu = sdk_lib_mpc_1.hexToBigInt(gShare.mu);
1034
- const nu = sdk_lib_mpc_1.hexToBigInt(gShare.nu);
1035
- const k = sdk_lib_mpc_1.hexToBigInt(gShare.k);
1036
- const w = sdk_lib_mpc_1.hexToBigInt(gShare.w);
1046
+ const gamma = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.gamma);
1047
+ const alpha = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.alpha);
1048
+ const beta = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.beta);
1049
+ const mu = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.mu);
1050
+ const nu = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.nu);
1051
+ const k = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.k);
1052
+ const w = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.w);
1037
1053
  const delta = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, gamma), Ecdsa.curve.scalarAdd(alpha, beta));
1038
1054
  const omicron = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, w), Ecdsa.curve.scalarAdd(mu, nu));
1039
1055
  const Gamma = Ecdsa.curve.basePointMult(gamma);
@@ -1041,16 +1057,16 @@ class Ecdsa {
1041
1057
  oShare: {
1042
1058
  i: gShare.i,
1043
1059
  y: gShare.y,
1044
- k: util_1.bigIntToBufferBE(k, 32).toString('hex'),
1045
- omicron: util_1.bigIntToBufferBE(omicron, 32).toString('hex'),
1046
- delta: util_1.bigIntToBufferBE(delta, 32).toString('hex'),
1047
- Gamma: util_1.bigIntToBufferBE(Gamma, 33).toString('hex'),
1060
+ k: (0, util_1.bigIntToBufferBE)(k, 32).toString('hex'),
1061
+ omicron: (0, util_1.bigIntToBufferBE)(omicron, 32).toString('hex'),
1062
+ delta: (0, util_1.bigIntToBufferBE)(delta, 32).toString('hex'),
1063
+ Gamma: (0, util_1.bigIntToBufferBE)(Gamma, 33).toString('hex'),
1048
1064
  },
1049
1065
  dShare: {
1050
1066
  i: S.i,
1051
1067
  j: gShare.i,
1052
- delta: util_1.bigIntToBufferBE(delta, 32).toString('hex'),
1053
- Gamma: util_1.bigIntToBufferBE(Gamma, 33).toString('hex'),
1068
+ delta: (0, util_1.bigIntToBufferBE)(delta, 32).toString('hex'),
1069
+ Gamma: (0, util_1.bigIntToBufferBE)(Gamma, 33).toString('hex'),
1054
1070
  },
1055
1071
  };
1056
1072
  }
@@ -1060,26 +1076,29 @@ class Ecdsa {
1060
1076
  * @param {OShare} oShare private omicron share of current participant
1061
1077
  * @param {DShare} dShare delta share received from the other participant
1062
1078
  * @param {Hash} hash hashing algorithm implementing Node`s standard crypto hash interface
1063
- * @param shouldHash if true, we hash the provided buffer before signing
1079
+ * @param shouldHash if true, we hash the provided buffer before signing. If false, M must be exactly 32 bytes (a hash).
1064
1080
  * @returns {VAShare}
1065
1081
  */
1066
1082
  sign(M, oShare, dShare, hash, shouldHash = true) {
1067
- const m = shouldHash ? (hash || crypto_1.createHash('sha256')).update(M).digest() : M;
1068
- const delta = Ecdsa.curve.scalarAdd(sdk_lib_mpc_1.hexToBigInt(oShare.delta), sdk_lib_mpc_1.hexToBigInt(dShare.delta));
1069
- const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd(sdk_lib_mpc_1.hexToBigInt(oShare.Gamma), sdk_lib_mpc_1.hexToBigInt(dShare.Gamma)), Ecdsa.curve.scalarInvert(delta));
1070
- const pointR = secp.Point.fromHex(util_1.bigIntToBufferBE(R, 32));
1083
+ if (!shouldHash && M.length !== 32) {
1084
+ throw new Error(`When shouldHash=false, message must be exactly 32 bytes (a hash), but got ${M.length} bytes`);
1085
+ }
1086
+ const m = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(M).digest() : M;
1087
+ const delta = Ecdsa.curve.scalarAdd((0, sdk_lib_mpc_1.hexToBigInt)(oShare.delta), (0, sdk_lib_mpc_1.hexToBigInt)(dShare.delta));
1088
+ const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd((0, sdk_lib_mpc_1.hexToBigInt)(oShare.Gamma), (0, sdk_lib_mpc_1.hexToBigInt)(dShare.Gamma)), Ecdsa.curve.scalarInvert(delta));
1089
+ const pointR = secp256k1_1.secp256k1.ProjectivePoint.fromHex((0, util_1.bigIntToBufferBE)(R, 32));
1071
1090
  const r = pointR.x;
1072
- const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(util_1.bigIntFromU8ABE(m), sdk_lib_mpc_1.hexToBigInt(oShare.k)), Ecdsa.curve.scalarMult(r, sdk_lib_mpc_1.hexToBigInt(oShare.omicron)));
1091
+ const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult((0, util_1.bigIntFromU8ABE)(m), (0, sdk_lib_mpc_1.hexToBigInt)(oShare.k)), Ecdsa.curve.scalarMult(r, (0, sdk_lib_mpc_1.hexToBigInt)(oShare.omicron)));
1073
1092
  const l = Ecdsa.curve.scalarRandom();
1074
1093
  const rho = Ecdsa.curve.scalarRandom();
1075
1094
  const V = Ecdsa.curve.pointAdd(Ecdsa.curve.pointMultiply(R, s), Ecdsa.curve.basePointMult(l));
1076
1095
  const A = Ecdsa.curve.basePointMult(rho);
1077
- const comDecom_V_A = sdk_lib_mpc_1.HashCommitment.createCommitment(Buffer.concat([util_1.bigIntToBufferBE(V, Ecdsa.curve.pointBytes), util_1.bigIntToBufferBE(A, Ecdsa.curve.pointBytes)]));
1096
+ const comDecom_V_A = sdk_lib_mpc_1.HashCommitment.createCommitment(Buffer.concat([(0, util_1.bigIntToBufferBE)(V, Ecdsa.curve.pointBytes), (0, util_1.bigIntToBufferBE)(A, Ecdsa.curve.pointBytes)]));
1078
1097
  return {
1079
1098
  i: oShare.i,
1080
1099
  y: oShare.y,
1081
1100
  R: pointR.toHex(true),
1082
- s: util_1.bigIntToBufferBE(s, 32).toString('hex'),
1101
+ s: (0, util_1.bigIntToBufferBE)(s, 32).toString('hex'),
1083
1102
  m: m,
1084
1103
  l: l,
1085
1104
  rho: rho,
@@ -1097,9 +1116,9 @@ class Ecdsa {
1097
1116
  * @returns {VAShareWithProofs}
1098
1117
  */
1099
1118
  generateVAProofs(M, vaShare) {
1100
- const s = sdk_lib_mpc_1.hexToBigInt(vaShare.s);
1101
- const R = util_1.bigIntFromU8ABE(secp.Point.fromHex(vaShare.R).toRawBytes(true));
1102
- const proofContext = crypto_1.createHash('sha256').update(M).update(util_1.bigIntToBufferBE(R, Ecdsa.curve.pointBytes)).digest();
1119
+ const s = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.s);
1120
+ const R = (0, util_1.bigIntFromU8ABE)(secp256k1_1.secp256k1.ProjectivePoint.fromHex(vaShare.R).toRawBytes(true));
1121
+ const proofContext = (0, crypto_1.createHash)('sha256').update(M).update((0, util_1.bigIntToBufferBE)(R, Ecdsa.curve.pointBytes)).digest();
1103
1122
  const zkVProof = sdk_lib_mpc_1.EcdsaZkVProof.createZkVProof(vaShare.V, s, vaShare.l, R, Ecdsa.curve, proofContext);
1104
1123
  const schnorrProof = sdk_lib_mpc_1.Schnorr.createSchnorrProof(vaShare.A, vaShare.rho, Ecdsa.curve, proofContext);
1105
1124
  return {
@@ -1119,8 +1138,8 @@ class Ecdsa {
1119
1138
  publicVAShares.forEach((publicVAShare) => {
1120
1139
  if (!sdk_lib_mpc_1.HashCommitment.verifyCommitment(publicVAShare.comDecomVA.commitment, {
1121
1140
  secret: Buffer.concat([
1122
- util_1.bigIntToBufferBE(publicVAShare.V, Ecdsa.curve.pointBytes),
1123
- util_1.bigIntToBufferBE(publicVAShare.A, Ecdsa.curve.pointBytes),
1141
+ (0, util_1.bigIntToBufferBE)(publicVAShare.V, Ecdsa.curve.pointBytes),
1142
+ (0, util_1.bigIntToBufferBE)(publicVAShare.A, Ecdsa.curve.pointBytes),
1124
1143
  ]),
1125
1144
  blindingFactor: publicVAShare.comDecomVA.decommitment.blindingFactor,
1126
1145
  })) {
@@ -1129,15 +1148,15 @@ class Ecdsa {
1129
1148
  if (!sdk_lib_mpc_1.Schnorr.verifySchnorrProof(publicVAShare.A, publicVAShare.schnorrProofA, Ecdsa.curve, vaShare.proofContext)) {
1130
1149
  throw new Error('Could not verify Schnorr proof of A_i');
1131
1150
  }
1132
- if (!sdk_lib_mpc_1.EcdsaZkVProof.verifyZkVProof(publicVAShare.V, publicVAShare.zkVProofV, sdk_lib_mpc_1.hexToBigInt(vaShare.R), Ecdsa.curve, vaShare.proofContext)) {
1151
+ if (!sdk_lib_mpc_1.EcdsaZkVProof.verifyZkVProof(publicVAShare.V, publicVAShare.zkVProofV, (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.R), Ecdsa.curve, vaShare.proofContext)) {
1133
1152
  throw new Error('Could not verify ZK proof of V_i');
1134
1153
  }
1135
1154
  });
1136
- const y = sdk_lib_mpc_1.hexToBigInt(vaShare.y);
1155
+ const y = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.y);
1137
1156
  // r is R's x coordinate. R is in compressed form, so we need to slice off the first byte.
1138
- const r = sdk_lib_mpc_1.hexToBigInt(vaShare.R.slice(2));
1157
+ const r = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.R.slice(2));
1139
1158
  // Calculate aggregation of all V_i and A_i.
1140
- let V = Ecdsa.curve.pointAdd(Ecdsa.curve.pointAdd(Ecdsa.curve.basePointMult(Ecdsa.curve.scalarNegate(util_1.bigIntFromU8ABE(vaShare.m))), Ecdsa.curve.pointMultiply(y, Ecdsa.curve.scalarNegate(r))), vaShare.V);
1159
+ let V = Ecdsa.curve.pointAdd(Ecdsa.curve.pointAdd(Ecdsa.curve.basePointMult(Ecdsa.curve.scalarNegate((0, util_1.bigIntFromU8ABE)(vaShare.m))), Ecdsa.curve.pointMultiply(y, Ecdsa.curve.scalarNegate(r))), vaShare.V);
1141
1160
  let A = vaShare.A;
1142
1161
  publicVAShares.forEach((publicVAShare) => {
1143
1162
  V = Ecdsa.curve.pointAdd(V, publicVAShare.V);
@@ -1146,7 +1165,7 @@ class Ecdsa {
1146
1165
  // Calculate U_i = rho_i * V and T_i = l_i * A.
1147
1166
  const U = Ecdsa.curve.pointMultiply(V, vaShare.rho);
1148
1167
  const T = Ecdsa.curve.pointMultiply(A, vaShare.l);
1149
- const comDecom_U_T = sdk_lib_mpc_1.HashCommitment.createCommitment(Buffer.concat([util_1.bigIntToBufferBE(U, Ecdsa.curve.pointBytes), util_1.bigIntToBufferBE(T, Ecdsa.curve.pointBytes)]));
1168
+ const comDecom_U_T = sdk_lib_mpc_1.HashCommitment.createCommitment(Buffer.concat([(0, util_1.bigIntToBufferBE)(U, Ecdsa.curve.pointBytes), (0, util_1.bigIntToBufferBE)(T, Ecdsa.curve.pointBytes)]));
1150
1169
  return {
1151
1170
  ...vaShare,
1152
1171
  U,
@@ -1166,8 +1185,8 @@ class Ecdsa {
1166
1185
  publicUTShares.forEach((publicUTShare) => {
1167
1186
  if (!sdk_lib_mpc_1.HashCommitment.verifyCommitment(publicUTShare.comDecomUT.commitment, {
1168
1187
  secret: Buffer.concat([
1169
- util_1.bigIntToBufferBE(publicUTShare.U, Ecdsa.curve.pointBytes),
1170
- util_1.bigIntToBufferBE(publicUTShare.T, Ecdsa.curve.pointBytes),
1188
+ (0, util_1.bigIntToBufferBE)(publicUTShare.U, Ecdsa.curve.pointBytes),
1189
+ (0, util_1.bigIntToBufferBE)(publicUTShare.T, Ecdsa.curve.pointBytes),
1171
1190
  ]),
1172
1191
  blindingFactor: publicUTShare.comDecomUT.decommitment.blindingFactor,
1173
1192
  })) {
@@ -1193,14 +1212,14 @@ class Ecdsa {
1193
1212
  if (!isRMatching) {
1194
1213
  throw new Error('R value should be consistent across all shares');
1195
1214
  }
1196
- let s = shares.map((share) => sdk_lib_mpc_1.hexToBigInt(share['s'])).reduce(Ecdsa.curve.scalarAdd);
1215
+ let s = shares.map((share) => (0, sdk_lib_mpc_1.hexToBigInt)(share['s'])).reduce(Ecdsa.curve.scalarAdd);
1197
1216
  const recid = (R.slice(0, 2) === '03' ? 1 : 0) ^ (s > Ecdsa.curve.order() / BigInt(2) ? 1 : 0);
1198
1217
  // Normalize s.
1199
1218
  s = s > Ecdsa.curve.order() / BigInt(2) ? Ecdsa.curve.order() - s : s;
1200
1219
  return {
1201
1220
  y: shares[0]['y'],
1202
1221
  r: R.slice(2),
1203
- s: util_1.bigIntToBufferBE(s, 32).toString('hex'),
1222
+ s: (0, util_1.bigIntToBufferBE)(s, 32).toString('hex'),
1204
1223
  recid: recid,
1205
1224
  };
1206
1225
  }
@@ -1209,16 +1228,19 @@ class Ecdsa {
1209
1228
  * @param {Buffer} message
1210
1229
  * @param {Signature } signature
1211
1230
  * @param {Hash} hash hashing algorithm implementing Node`s standard crypto hash interface
1212
- * @param {boolean} shouldHash if true, we hash the provided buffer before verifying
1231
+ * @param {boolean} shouldHash if true, we hash the provided buffer before verifying. If false, message must be exactly 32 bytes (a hash).
1213
1232
  * @returns {boolean} True if signature is valid; False otherwise
1214
1233
  */
1215
1234
  verify(message, signature, hash, shouldHash = true) {
1216
- const messageToVerify = shouldHash ? (hash || crypto_1.createHash('sha256')).update(message).digest() : message;
1235
+ if (!shouldHash && message.length !== 32) {
1236
+ throw new Error(`When shouldHash=false, message must be exactly 32 bytes (a hash), but got ${message.length} bytes`);
1237
+ }
1238
+ const messageToVerify = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(message).digest() : message;
1217
1239
  return Ecdsa.curve.verify(messageToVerify, Buffer.concat([
1218
1240
  Buffer.from([signature['recid']]),
1219
- util_1.bigIntToBufferBE(sdk_lib_mpc_1.hexToBigInt(signature['r']), 32),
1220
- util_1.bigIntToBufferBE(sdk_lib_mpc_1.hexToBigInt(signature['s']), 32),
1221
- ]), sdk_lib_mpc_1.hexToBigInt(signature['y']));
1241
+ (0, util_1.bigIntToBufferBE)((0, sdk_lib_mpc_1.hexToBigInt)(signature['r']), 32),
1242
+ (0, util_1.bigIntToBufferBE)((0, sdk_lib_mpc_1.hexToBigInt)(signature['s']), 32),
1243
+ ]), (0, sdk_lib_mpc_1.hexToBigInt)(signature['y']));
1222
1244
  }
1223
1245
  /**
1224
1246
  * Deserializes a challenge and it's proofs from hex strings to bigint
@@ -1236,8 +1258,8 @@ class Ecdsa {
1236
1258
  return sdk_lib_mpc_1.EcdsaTypes.serializeNtilde(challenge);
1237
1259
  }
1238
1260
  }
1239
- exports.default = Ecdsa;
1240
1261
  Ecdsa.curve = new curves_1.Secp256k1Curve();
1241
1262
  Ecdsa.hdTree = new sdk_lib_mpc_1.Secp256k1Bip32HdTree();
1242
1263
  Ecdsa.shamir = new sdk_lib_mpc_1.Shamir(Ecdsa.curve);
1243
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBa0Q7QUFDbEQsdUVBQXlEO0FBQ3pELHVEQUF5QztBQUN6QyxtQ0FBdUQ7QUFDdkQsbURBQTZDO0FBQzdDLHFDQUF5RztBQUN6Ryx5Q0FBOEM7QUFDOUMseURBZWlDO0FBdUNqQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFdEI7O0dBRUc7QUFDSCxNQUFxQixLQUFLO0lBSXhCOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBYSxFQUFFLFNBQWlCLEVBQUUsU0FBaUIsRUFBRSxJQUFhLEVBQUUsSUFBSSxHQUFHLEtBQUs7O1FBQzdGLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNuRixNQUFNLHlCQUF5QixDQUFDO1NBQ2pDO1FBRUQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDL0IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDNUIsa0VBQWtFO1lBQ2xFLG1CQUFtQixHQUFHLG1CQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2xFO1FBRUQsa0RBQWtEO1FBQ2xELElBQUksZUFBdUMsQ0FBQztRQUM1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R0FBRzthQUNSLEVBQ0QsQ0FBQyxFQUNELEtBQUssRUFDTCxDQUFDLEVBQ0QsS0FBSyxFQUNMLEVBQUUsRUFDRixFQUFFLENBQ0gsQ0FBQztZQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO2dCQUM1QixVQUFVLEVBQUU7b0JBQ1YsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsSUFBSSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDdkQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbEQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDaEQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUM1QzthQUNGLENBQUMsQ0FBQztZQUNILGtCQUFrQjtZQUNsQixNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN0RSxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsdUJBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQzFHLEtBQUssQ0FDTixDQUFDO1lBQ0YsTUFBTSxDQUFDLEdBQUcseUJBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxNQUFNLEVBQUUsR0FBRyxNQUFNLHFDQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELGFBQWEsQ0FBQyxFQUFFLEdBQUcsdUJBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCw0QkFBNEI7WUFDNUIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsS0FBSyxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxjQUFjLENBQzFDLEtBQUssQ0FBQyxLQUFLLEVBQ1gsaUNBQW1CLEVBQ25CLEdBQUcsRUFDSDtnQkFDRSxNQUFNLEVBQUUsT0FBTztnQkFDZixFQUFFLEVBQUUsR0FBRztnQkFDUCxFQUFFLEVBQUUsR0FBRzthQUNSLEVBQ0QsQ0FBQyxFQUNELHlCQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUM5QixDQUFDLEVBQ0QsR0FBRyxFQUNILEVBQUUsRUFDRixFQUFFLENBQ0gsQ0FBQztZQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO2dCQUMzQixNQUFNLEVBQUU7b0JBQ04sQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsSUFBSSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDdkQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbEQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsRUFBRSxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDaEQsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUM1QzthQUNGLENBQUMsQ0FBQztZQUNILElBQUssZ0JBQTJCLENBQUMsS0FBSyxFQUFFO2dCQUN0QyxNQUFNLHVCQUF1QixHQUFHLGdCQUFtQyxDQUFDO2dCQUNwRSxNQUFNLG9CQUFvQixHQUFHLGFBQWdDLENBQUM7Z0JBQzlELE9BQU8sdUJBQXVCLENBQUMsTUFBTSxDQUFDO2dCQUN0QyxPQUFPLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sdUJBQXVCLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7Z0JBQ25DLE9BQU8sb0JBQW9CLENBQUMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sb0JBQW9CLENBQUMsS0FBSyxDQUFDO2FBQ25DO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO29CQUMzQixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ1gsTUFBTSxFQUFFLHVCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUN0RCxFQUFFLEVBQUUsdUJBQWdCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQzlDLEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDOUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNYLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztpQkFDcEIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUNELElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLGFBQWEsQ0FBQyxFQUFFO1lBQzFELE1BQU0sdUJBQXVCLEdBQUcsZ0JBQW1DLENBQUM7WUFDcEUsT0FBTyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7WUFDdEMsT0FBTyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxlQUFlLEdBQUcsYUFBd0IsQ0FBQztZQUNqRCxhQUFhLEdBQUc7Z0JBQ2QsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNwQixDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7YUFDVixDQUFDO1NBQ2Q7UUFDRCxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxZQUFZLEVBQUU7WUFDaEIsT0FBTztnQkFDTCxPQUFPLEVBQUUsYUFBd0I7Z0JBQ2pDLE1BQU0sRUFBRSxnQkFBMEI7YUFDbkMsQ0FBQztTQUNIO1FBQ0QsT0FBTztZQUNMLE1BQU0sRUFBRSxhQUF1QjtZQUMvQixNQUFNLEVBQUUsZ0JBQTBCO1NBQ25DLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxNQUFtQjtRQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcseUJBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcseUJBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQUcseUJBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxFQUFFLEdBQUcseUJBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsTUFBTSxFQUFFLEdBQUcseUJBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLEdBQUcseUJBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcseUJBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFHLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvQyxPQUFPO1lBQ0wsTUFBTSxFQUFFO2dCQUNOLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMxQyxPQUFPLEVBQUUsdUJBQWdCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3RELEtBQUssRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDbEQsS0FBSyxFQUFFLHVCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ25EO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDTixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsS0FBSyxFQUFFLHVCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNsRCxLQUFLLEVBQUUsdUJBQWdCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7YUFDbkQ7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsSUFBSSxDQUFDLENBQVMsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLElBQVcsRUFBRSxVQUFVLEdBQUcsSUFBSTtRQUM1RSxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLG1CQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU3RSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTFGLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUMxRSxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FDaEMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHVCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFbkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQzdCLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLHNCQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUseUJBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDakUsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLHlCQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQ3ZELENBQUM7UUFFRixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFekMsTUFBTSxZQUFZLEdBQUcsNEJBQWMsQ0FBQyxnQkFBZ0IsQ0FDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLHVCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDMUcsQ0FBQztRQUVGLE9BQU87WUFDTCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDckIsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzFDLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixHQUFHLEVBQUUsR0FBRztZQUNSLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixVQUFVLEVBQUUsWUFBWTtTQUN6QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxnQkFBZ0IsQ0FBQyxDQUFTLEVBQUUsT0FBZ0I7UUFDMUMsTUFBTSxDQUFDLEdBQUcseUJBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLEdBQUcsc0JBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFMUUsTUFBTSxZQUFZLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHVCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFakgsTUFBTSxRQUFRLEdBQUcsMkJBQWEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNyRyxNQUFNLFlBQVksR0FBRyxxQkFBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRW5HLE9BQU87WUFDTCxHQUFHLE9BQU87WUFDVixZQUFZLEVBQUUsWUFBWTtZQUMxQixTQUFTLEVBQUUsUUFBUTtZQUNuQixhQUFhLEVBQUUsWUFBWTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE9BQTBCLEVBQUUsY0FBeUM7UUFDbEYsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3ZDLElBQ0UsQ0FBQyw0QkFBYyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFO2dCQUNwRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDcEIsdUJBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztvQkFDekQsdUJBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztpQkFDMUQsQ0FBQztnQkFDRixjQUFjLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsY0FBYzthQUNyRSxDQUFDLEVBQ0Y7Z0JBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsSUFDRSxDQUFDLHFCQUFPLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUM1RztnQkFDQSxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7YUFDMUQ7WUFDRCxJQUNFLENBQUMsMkJBQWEsQ0FBQyxjQUFjLENBQzNCLGFBQWEsQ0FBQyxDQUFDLEVBQ2YsYUFBYSxDQUFDLFNBQVMsRUFDdkIseUJBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQ3RCLEtBQUssQ0FBQyxLQUFLLEVBQ1gsT0FBTyxDQUFDLFlBQVksQ0FDckIsRUFDRDtnQkFDQSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7YUFDckQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxHQUFHLHlCQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLDJGQUEyRjtRQUMzRixNQUFNLENBQUMsR0FBRyx5QkFBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDbEIsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsc0JBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUMvRSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDMUQsRUFDRCxPQUFPLENBQUMsQ0FBQyxDQUNWLENBQUM7UUFDRixJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUN2QyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztRQUVILCtDQUErQztRQUMvQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUcsNEJBQWMsQ0FBQyxnQkFBZ0IsQ0FDbEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLHVCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLHVCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDMUcsQ0FBQztRQUVGLE9BQU87WUFDTCxHQUFHLE9BQU87WUFDVixDQUFDO1lBQ0QsQ0FBQztZQUNELFVBQVUsRUFBRSxZQUFZO1NBQ3pCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxjQUFjLENBQUMsT0FBZ0IsRUFBRSxjQUErQjtRQUM5RCxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFdkIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3ZDLElBQ0UsQ0FBQyw0QkFBYyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFO2dCQUNwRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztvQkFDcEIsdUJBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztvQkFDekQsdUJBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztpQkFDMUQsQ0FBQztnQkFDRixjQUFjLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsY0FBYzthQUNyRSxDQUFDLEVBQ0Y7Z0JBQ0EsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2FBQy9EO1lBRUQsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxNQUFnQjtRQUNqQyxzQkFBc0I7UUFDdEIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyx5QkFBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFL0YsZUFBZTtRQUNmLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsT0FBTztZQUNMLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2pCLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNiLENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUMxQyxLQUFLLEVBQUUsS0FBSztTQUNiLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxPQUFlLEVBQUUsU0FBb0IsRUFBRSxJQUFXLEVBQUUsVUFBVSxHQUFHLElBQUk7UUFDMUUsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxtQkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdkcsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDdkIsZUFBZSxFQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakMsdUJBQWdCLENBQUMseUJBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsdUJBQWdCLENBQUMseUJBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDbEQsQ0FBQyxFQUNGLHlCQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFNBQXNDO1FBQzdELE9BQU8sd0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBd0M7UUFDN0QsT0FBTyx3QkFBVSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDOztBQXIvQ0gsd0JBcy9DQztBQXIvQ1EsV0FBSyxHQUFtQixJQUFJLHVCQUFjLEVBQUUsQ0FBQztBQUM3QyxZQUFNLEdBQVcsSUFBSSxrQ0FBb0IsRUFBRSxDQUFDO0FBQzVDLFlBQU0sR0FBVyxJQUFJLG9CQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGFpbGxpZXJCaWdpbnQgZnJvbSAncGFpbGxpZXItYmlnaW50JztcbmltcG9ydCAqIGFzIGJpZ2ludENyeXB0b1V0aWxzIGZyb20gJ2JpZ2ludC1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0ICogYXMgc2VjcCBmcm9tICdAbm9ibGUvc2VjcDI1NmsxJztcbmltcG9ydCB7IGNyZWF0ZUhhc2gsIEhhc2gsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRGcm9tVThBQkUsIGJpZ0ludFRvQnVmZmVyQkUsIGdldFBhaWxsaWVyUHVibGljS2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBTZWNwMjU2azFDdXJ2ZSB9IGZyb20gJy4uLy4uL2N1cnZlcyc7XG5pbXBvcnQge1xuICBFY2RzYVBhaWxsaWVyUHJvb2YsXG4gIEVjZHNhUmFuZ2VQcm9vZixcbiAgRWNkc2FUeXBlcyxcbiAgRWNkc2Faa1ZQcm9vZixcbiAgSGFzaENvbW1pdG1lbnQsXG4gIFNjaG5vcnIsXG4gIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvLFxuICBoZXhUb0JpZ0ludCxcbiAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgSERUcmVlLFxuICBTZWNwMjU2azFCaXAzMkhkVHJlZSxcbiAgY2hhaW5jb2RlQmFzZSxcbiAgU2hhbWlyLFxuICBTY2hub3JyUHJvb2YsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIEFTaGFyZSxcbiAgQlNoYXJlLFxuICBEU2hhcmUsXG4gIEdTaGFyZSxcbiAgS2V5Q29tYmluZWQsXG4gIEtleVNoYXJlLFxuICBLU2hhcmUsXG4gIE1VU2hhcmUsXG4gIE5TaGFyZSxcbiAgT1NoYXJlLFxuICBQU2hhcmUsXG4gIFB1YmxpY1VUU2hhcmUsXG4gIFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSxcbiAgU2lnbmF0dXJlLFxuICBTaWduQ29tYmluZSxcbiAgU2lnbkNvbWJpbmVSVCxcbiAgU2lnbkNvbnZlcnQsXG4gIFNpZ25Db252ZXJ0UlQsXG4gIFNpZ25Db252ZXJ0U3RlcDEsXG4gIFNpZ25Db252ZXJ0U3RlcDFSZXNwb25zZSxcbiAgU2lnbkNvbnZlcnRTdGVwMixcbiAgU2lnbkNvbnZlcnRTdGVwMlJlc3BvbnNlLFxuICBTaWduQ29udmVydFN0ZXAzLFxuICBTaWduQ29udmVydFN0ZXAzUmVzcG9uc2UsXG4gIFNpZ25TaGFyZVJULFxuICBTU2hhcmUsXG4gIFN1YmtleVNoYXJlLFxuICBVVFNoYXJlLFxuICBWQVNoYXJlV2l0aFByb29mcyxcbiAgVkFTaGFyZSxcbiAgV1NoYXJlLFxuICBYU2hhcmUsXG4gIFhTaGFyZVdpdGhDaGFsbGVuZ2VzLFxuICBZU2hhcmVXaXRoQ2hhbGxlbmdlcyxcbiAgUHVibGljVkFTaGFyZVdpdGhQcm9vZnMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG5cbi8qKlxuICogRUNEU0EgVFNTIGltcGxlbWVudGF0aW9uIHN1cHBvcnRpbmcgMjpuIFRocmVzaG9sZFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY2RzYSB7XG4gIHN0YXRpYyBjdXJ2ZTogU2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgc3RhdGljIGhkVHJlZTogSERUcmVlID0gbmV3IFNlY3AyNTZrMUJpcDMySGRUcmVlKCk7XG4gIHN0YXRpYyBzaGFtaXI6IFNoYW1pciA9IG5ldyBTaGFtaXIoRWNkc2EuY3VydmUpO1xuICAvKipcbiAgICogR2VuZXJhdGUgc2hhcmVzIGZvciBwYXJ0aWNpcGFudCBhdCBpbmRleCBhbmQgc3BsaXQga2V5cyBgKHRocmVzaG9sZCxudW1TaGFyZXMpYCB3YXlzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggcGFydGljaXBhbnQgaW5kZXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCBTaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtU2hhcmVzICBOdW1iZXIgb2Ygc2hhcmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzZWVkIG9wdGlvbmFsIDY0IGJ5dGUgc2VlZCB0byB1c2UgZm9yIGtleSBnZW5lcmF0aW9uXG4gICAqIEBwYXJhbSBzeW5jIG9wdGlvbmFsIHN5bmMgZmxhZywgaWYgdHJ1ZSB0aGVuIGEgc3luY2hyb25vdXMgdmVyc2lvbiBvZiBQYWlsbGllciBrZXkgZ2VuZXJhdGlvbiBpcyB1c2VkIHRoYXQgZG9lcyBub3Qgc3Bhd24gV29ya2VyIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEtleVNoYXJlPn0gUmV0dXJucyB0aGUgcHJpdmF0ZSBwLXNoYXJlXG4gICAqIGFuZCBuLXNoYXJlcyB0byBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGFzeW5jIGtleVNoYXJlKGluZGV4OiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyLCBudW1TaGFyZXM6IG51bWJlciwgc2VlZD86IEJ1ZmZlciwgc3luYyA9IGZhbHNlKTogUHJvbWlzZTxLZXlTaGFyZT4ge1xuICAgIGlmICghKGluZGV4ID4gMCAmJiBpbmRleCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkIDw9IG51bVNoYXJlcyAmJiB0aHJlc2hvbGQgPT09IDIpKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBLZXlTaGFyZSBDb25maWcnO1xuICAgIH1cblxuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoIDwgNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VlZCBtdXN0IGhhdmUgYSBsZW5ndGggb2YgYXQgbGVhc3QgNjQgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBsZXQgc2VlZFdpdGhWYWxpZExlbmd0aCA9IHNlZWQ7XG4gICAgaWYgKHNlZWQgJiYgc2VlZC5sZW5ndGggPiA2NCkge1xuICAgICAgLy8gaWYgc2VlZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDY0IGJ5dGVzLCBoYXNoIHNlZWQgdG8gNjQgYnl0ZXMuXG4gICAgICBzZWVkV2l0aFZhbGlkTGVuZ3RoID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlZWQpLmRpZ2VzdCgpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGFkZGl0aXZlbHkgaG9tb21vcnBoaWMgZW5jcnlwdGlvbiBrZXkuXG4gICAgbGV0IHBhaWxsaWVyS2V5UGFpcjogcGFpbGxpZXJCaWdpbnQuS2V5UGFpcjtcbiAgICBpZiAoIXN5bmMpIHtcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IGF3YWl0IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5cyhtaW5Nb2R1bHVzQml0TGVuZ3RoLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5c1N5bmMobWluTW9kdWx1c0JpdExlbmd0aCwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHVibGljS2V5LCBwcml2YXRlS2V5IH0gPSBwYWlsbGllcktleVBhaXI7XG4gICAgLy8gQWNjZXB0IGEgNjQgYnl0ZSBzZWVkIGFuZCBjcmVhdGUgYW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgZnJvbSB0aGF0IHNlZWRcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBzZWVkV2l0aFZhbGlkTGVuZ3RoICYmIGJpcDMyLmZyb21TZWVkKHNlZWRXaXRoVmFsaWRMZW5ndGgpO1xuICAgIGNvbnN0IHUgPVxuICAgICAgKHNlY3JldEtleSAmJiBzZWNyZXRLZXkucHJpdmF0ZUtleSAmJiBiaWdJbnRGcm9tVThBQkUobmV3IFVpbnQ4QXJyYXkoc2VjcmV0S2V5LnByaXZhdGVLZXkpKSkgPz9cbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHkgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHUpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IChzZWNyZXRLZXkgJiYgc2VjcmV0S2V5LmNoYWluQ29kZSkgPz8gcmFuZG9tQnl0ZXMoMzIpO1xuICAgIC8vIENvbXB1dGUgc2VjcmV0IHNoYXJlcyBvZiB0aGUgcHJpdmF0ZSBrZXlcbiAgICBjb25zdCB7IHNoYXJlczogdVNoYXJlcywgdiB9ID0gRWNkc2Euc2hhbWlyLnNwbGl0KHUsIHRocmVzaG9sZCwgbnVtU2hhcmVzKTtcbiAgICBjb25zdCBjdXJyZW50UGFydGljaXBhbnQ6IFBTaGFyZSA9IHtcbiAgICAgIGk6IGluZGV4LFxuICAgICAgdDogdGhyZXNob2xkLFxuICAgICAgYzogbnVtU2hhcmVzLFxuICAgICAgbDogYmlnSW50VG9CdWZmZXJCRShwcml2YXRlS2V5LmxhbWJkYSwgMTkyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBtOiBiaWdJbnRUb0J1ZmZlckJFKHByaXZhdGVLZXkubXUsIDE5MikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgbjogYmlnSW50VG9CdWZmZXJCRShwdWJsaWNLZXkubiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbaW5kZXhdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdXU6IHUudG9TdHJpbmcoKSxcbiAgICAgIGNoYWluY29kZTogY2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIGNvbnN0IGtleVNoYXJlOiBLZXlTaGFyZSA9IHtcbiAgICAgIHBTaGFyZTogY3VycmVudFBhcnRpY2lwYW50LFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gdVNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IHBhcnNlSW50KHNoYXJlLCAxMCk7XG4gICAgICBpZiAocGFydGljaXBhbnRJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAga2V5U2hhcmUublNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgICBpOiBwYXJ0aWNpcGFudEluZGV4LFxuICAgICAgICAgIGo6IGN1cnJlbnRQYXJ0aWNpcGFudFsnaSddLFxuICAgICAgICAgIG46IHB1YmxpY0tleS5uLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRSh2WzBdLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUodVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IGNoYWluY29kZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0gYXMgTlNoYXJlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBkYXRhIHNoYXJlZCBkdXJpbmcgdGhlIGtleSBnZW5lcmF0aW9uIHByb3RvY29sLlxuICAgKiBAcGFyYW0ge0tleVNoYXJlfSBwYXJ0aWNpcGFudFNoYXJlcyBwcml2YXRlIHAtc2hhcmUgYW5kXG4gICAqIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHJldHVybnMge0tleUNvbWJpbmVkfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHgtc2hhcmVcbiAgICogYW5kIHktc2hhcmVzIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNpZ25pbmcgc2hhcmVzLlxuICAgKi9cbiAga2V5Q29tYmluZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10pOiBLZXlDb21iaW5lZCB7XG4gICAgY29uc3QgYWxsU2hhcmVzID0gW3BTaGFyZSwgLi4ublNoYXJlc107XG4gICAgLy8gQ29tcHV0ZSB0aGUgcHVibGljIGtleS5cbiAgICBjb25zdCB5ID0gYWxsU2hhcmVzLm1hcCgocGFydGljaXBhbnQpID0+IGhleFRvQmlnSW50KHBhcnRpY2lwYW50Wyd5J10pKS5yZWR1Y2UoRWNkc2EuY3VydmUucG9pbnRBZGQpO1xuICAgIC8vIEFkZCBzZWNyZXQgc2hhcmVzXG4gICAgY29uc3QgeCA9IGFsbFNoYXJlcy5tYXAoKHBhcnRpY2lwYW50KSA9PiBoZXhUb0JpZ0ludChwYXJ0aWNpcGFudFsndSddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYpXSwgcFNoYXJlLmkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZnJvbSBwYXJ0aWNpcGFudCAke3NoYXJlLmp9LiBWZXJpZmljYXRpb24gZXJyb3I6ICR7ZXJyfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgU2Nobm9yciBwcm9vZiBvZiBrbm93bGVkZ2Ugb2YgdGhlIGRpc2NyZXRlIGxvZyBvZiBYID0geEcuXG4gICAgY29uc3QgWCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoeCk7XG5cbiAgICBjb25zdCBwcm9vZkNvbnRleHQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh5LCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSkuZGlnZXN0KCk7XG5cbiAgICBjb25zdCBzY2hub3JyUHJvb2ZYID0gU2Nobm9yci5jcmVhdGVTY2hub3JyUHJvb2YoWCwgeCwgRWNkc2EuY3VydmUsIHByb29mQ29udGV4dCk7XG5cbiAgICAvLyBDaGFpbmNvZGUgd2lsbCBiZSB1c2VkIGluIGZ1dHVyZSB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciBrZXkgZGVyaXZhdGlvbiBmb3IgZWNkc2FcbiAgICBjb25zdCBjaGFpbmNvZGVzID0gW3BTaGFyZSwgLi4ublNoYXJlc10ubWFwKCh7IGNoYWluY29kZSB9KSA9PiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oY2hhaW5jb2RlLCAnaGV4JykpKTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSBjaGFpbmNvZGVzLnJlZHVjZShcbiAgICAgIChhY2MsIGNoYWluY29kZSkgPT5cbiAgICAgICAgKGFjYyArIGNoYWluY29kZSkgJSBCaWdJbnQoJzB4MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJykgLy8gMl4yNTZcbiAgICApO1xuXG4gICAgY29uc3QgcGFydGljaXBhbnRzOiBLZXlDb21iaW5lZCA9IHtcbiAgICAgIHhTaGFyZToge1xuICAgICAgICBpOiBwU2hhcmUuaSxcbiAgICAgICAgbDogcFNoYXJlLmwsXG4gICAgICAgIG06IHBTaGFyZS5tLFxuICAgICAgICBuOiBwU2hhcmUubixcbiAgICAgICAgeTogYmlnSW50VG9CdWZmZXJCRSh5LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHgsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHNjaG5vcnJQcm9vZlg6IHNjaG5vcnJQcm9vZlgsXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShjaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgeVNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gblNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IG5TaGFyZXNbc2hhcmVdWydqJ107XG4gICAgICBwYXJ0aWNpcGFudHMueVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgaTogcFNoYXJlLmksXG4gICAgICAgIGo6IG5TaGFyZXNbc2hhcmVdWydqJ10sXG4gICAgICAgIG46IG5TaGFyZXNbc2hhcmVdWyduJ10sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFydGljaXBhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZSBzaGFyZXMgZm9yIGEgQklQLTMyIHN1YmtleS5cbiAgICogQHBhcmFtIHtQU2hhcmV9IFRoZSB1c2VyJ3MgcC1zaGFyZS5cbiAgICogQHBhcmFtIHtOU2hhcmVbXX0gVGhlIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBCSVAtMzIgcGF0aCB0byBkZXJpdmUuXG4gICAqIEByZXR1cm5zIHtTdWJrZXlTaGFyZX0gUmV0dXJucyB0aGUgcHJpdmF0ZSB4LXNoYXJlIGFuZCBuLXNoYXJlcyB0b1xuICAgKiBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGtleURlcml2ZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10sIHBhdGg6IHN0cmluZyk6IFN1YmtleVNoYXJlIHtcbiAgICBjb25zdCB5VmFsdWVzID0gW3BTaGFyZSwgLi4ublNoYXJlc10ubWFwKChzaGFyZSkgPT4gaGV4VG9CaWdJbnQoc2hhcmUueSkpO1xuICAgIGNvbnN0IHkgPSB5VmFsdWVzLnJlZHVjZSgocGFydGlhbCwgc2hhcmUpID0+IEVjZHNhLmN1cnZlLnBvaW50QWRkKHBhcnRpYWwsIHNoYXJlKSk7XG4gICAgY29uc3QgdSA9IEJpZ0ludChwU2hhcmUudXUpO1xuICAgIGxldCBjb250cmliQ2hhaW5jb2RlID0gaGV4VG9CaWdJbnQocFNoYXJlLmNoYWluY29kZSk7XG4gICAgY29uc3QgY2hhaW5jb2RlcyA9IFtjb250cmliQ2hhaW5jb2RlLCAuLi5uU2hhcmVzLm1hcCgoeyBjaGFpbmNvZGUgfSkgPT4gaGV4VG9CaWdJbnQoY2hhaW5jb2RlKSldO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGNoYWluY29kZXMucmVkdWNlKChhY2MsIGNoYWluY29kZSkgPT4gKGFjYyArIGNoYWluY29kZSkgJSBjaGFpbmNvZGVCYXNlKTtcblxuICAgIC8vIFZlcmlmeSBzaGFyZXMuXG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBuU2hhcmVzKSB7XG4gICAgICBpZiAoc2hhcmUudikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEVjZHNhLnNoYW1pci52ZXJpZnkoaGV4VG9CaWdJbnQoc2hhcmUudSksIFtoZXhUb0JpZ0ludChzaGFyZS55KSwgaGV4VG9CaWdJbnQoc2hhcmUudildLCBwU2hhcmUuaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZlcmlmeSBzaGFyZSBmcm9tIHBhcnRpY2lwYW50ICR7c2hhcmUuan0uIFZlcmlmaWNhdGlvbiBlcnJvcjogJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXJpdmUgc3Via2V5LlxuICAgIGNvbnN0IHN1YmtleSA9IEVjZHNhLmhkVHJlZS5wcml2YXRlRGVyaXZlKHsgcGs6IHksIHNrOiB1LCBjaGFpbmNvZGUgfSwgcGF0aCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHB1YmxpYyBrZXkgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNvbnRyaWJZID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChzdWJrZXkuc2spO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBjaGFpbmNvZGUgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNoYWluY29kZURlbHRhID0gKGNoYWluY29kZUJhc2UgKyBzdWJrZXkuY2hhaW5jb2RlIC0gY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2U7XG4gICAgY29udHJpYkNoYWluY29kZSA9IChjb250cmliQ2hhaW5jb2RlICsgY2hhaW5jb2RlRGVsdGEpICUgY2hhaW5jb2RlQmFzZTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgdSB2YWx1ZXMuXG4gICAgY29uc3QgeyBzaGFyZXM6IHNwbGl0X3UsIHYgfSA9IEVjZHNhLnNoYW1pci5zcGxpdChzdWJrZXkuc2ssIHBTaGFyZS50IHx8IDIsIHBTaGFyZS5jIHx8IDMpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBzaWduaW5nIGtleS5cbiAgICBjb25zdCB4ID0gW3NwbGl0X3VbcFNoYXJlLmldLCAuLi5uU2hhcmVzLm1hcCgoeyB1IH0pID0+IGhleFRvQmlnSW50KHUpKV0ucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBTY2hub3JyIHByb29mIG9mIGtub3dsZWRnZSBvZiB0aGUgZGlzY3JldGUgbG9nIG9mIFggPSB4Ry5cbiAgICBjb25zdCBYID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh4KTtcblxuICAgIGNvbnN0IHByb29mQ29udGV4dCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5waywgRWNkc2EuY3VydmUucG9pbnRCeXRlcykpLmRpZ2VzdCgpO1xuXG4gICAgY29uc3Qgc2Nobm9yclByb29mWCA9IFNjaG5vcnIuY3JlYXRlU2Nobm9yclByb29mKFgsIHgsIEVjZHNhLmN1cnZlLCBwcm9vZkNvbnRleHQpO1xuXG4gICAgY29uc3QgUF9pOiBYU2hhcmUgPSB7XG4gICAgICBpOiBwU2hhcmUuaSxcbiAgICAgIGw6IHBTaGFyZS5sLFxuICAgICAgbTogcFNoYXJlLm0sXG4gICAgICBuOiBwU2hhcmUubixcbiAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LnBrLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh4LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgc2Nobm9yclByb29mWDogc2Nobm9yclByb29mWCxcbiAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShzdWJrZXkuY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCBzaGFyZXM6IFN1YmtleVNoYXJlID0ge1xuICAgICAgeFNoYXJlOiBQX2ksXG4gICAgICBuU2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgblNoYXJlcy5sZW5ndGg7IGluZCsrKSB7XG4gICAgICBjb25zdCBQX2ogPSBuU2hhcmVzW2luZF07XG4gICAgICBzaGFyZXMublNoYXJlc1tQX2oual0gPSB7XG4gICAgICAgIGk6IFBfai5qLFxuICAgICAgICBqOiBQX2kuaSxcbiAgICAgICAgbjogUF9pLm4sXG4gICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUoc3BsaXRfdVtQX2oual0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoY29udHJpYlksIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUodlswXSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJDaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzaGFyZXM7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IFNjaG5vcnIgcHJvb2Ygb2Yga25vd2xlZGdlIG9mIHRoZSBkaXNjcmV0ZSBsb2cgb2YgWF9pID0geF9pICogRy5cbiAgICogQHBhcmFtIFkgVGhlIGNvbWJpbmVkIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBWU1NzIFRoZSBWU1Mgc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIHBhcnRpY2lwYW50cy5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpIG9mIFhfaS5cbiAgICogQHBhcmFtIHByb29mIFRoZSBzY2hub3JyIHByb29mLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGl0J3MgYSB2YWxpZCBwcm9vZiB3aXRoIHJlZ2FyZHMgdG8gWSBhbmQgVlNTcy5cbiAgICovXG4gIHZlcmlmeVNjaG5vcnJQcm9vZlgoWTogYmlnaW50LCBWU1NzOiBiaWdpbnRbXVtdLCBpbmRleDogbnVtYmVyLCBwcm9vZjogU2Nobm9yclByb29mKTogYm9vbGVhbiB7XG4gICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IFZTU3MubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgc3VwcGxpZWQgZm9yIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIFhfaSBmcm9tIHB1YmxpYyBpbmZvcm1hdGlvbi5cbiAgICBsZXQgWF9pID0gWTtcbiAgICBWU1NzLmZvckVhY2goKFZTUykgPT4ge1xuICAgICAgVlNTLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgWF9pID0gRWNkc2EuY3VydmUucG9pbnRBZGQoWF9pLCBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KHYsIEJpZ0ludChpbmRleCkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvb2ZDb250ZXh0ID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoWSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcykpLmRpZ2VzdCgpO1xuICAgIHJldHVybiBTY2hub3JyLnZlcmlmeVNjaG5vcnJQcm9vZihYX2ksIHByb29mLCBFY2RzYS5jdXJ2ZSwgcHJvb2ZDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIGEgY2hpbGQgY29tbW9uIGtleWNoYWluIGZyb20gY29tbW9uIGtleWNoYWluXG4gICAqXG4gICAqIEBwYXJhbSB7Y29tbW9uS2V5Y2hhaW59IFRoZSBjb21tb24ga2V5Y2hhaW4gYXMgYSBoZXggc3RyaW5nLlxuICAgKiBAcGFyYW0ge3BhdGh9IFRoZSBCSVAtMzIgcGF0aCB0byBkZXJpdmUuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlcml2ZWQgY29tbW9uIGtleWNoYWluIGFzIGEgaGV4IHN0cmluZy5cbiAgICovXG4gIGRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW46IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoRWNkc2EuaGRUcmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGRlcml2ZSBrZXkgd2l0aG91dCBIRFRyZWUgaW1wbGVtZW50YXRpb25cIik7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW4gPSBCdWZmZXIuZnJvbShjb21tb25LZXljaGFpbiwgJ2hleCcpO1xuXG4gICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleWNoYWluID0gRWNkc2EuaGRUcmVlLnB1YmxpY0Rlcml2ZShcbiAgICAgIHtcbiAgICAgICAgcGs6IGJpZ0ludEZyb21CdWZmZXJCRShrZXljaGFpbi5zbGljZSgwLCAzMykpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludEZyb21CdWZmZXJCRShrZXljaGFpbi5zbGljZSgzMykpLFxuICAgICAgfSxcbiAgICAgIHBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgZGVyaXZlZFBrID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHVibGljS2V5Y2hhaW4ucGssIDMzKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZGVyaXZlZENoYWluY29kZSA9IGJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1YmxpY0tleWNoYWluLmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIHJldHVybiBkZXJpdmVkUGsgKyBkZXJpdmVkQ2hhaW5jb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBnaXZlbiByYW5nZSBwcm9vZiBjaGFsbGVuZ2UgdG8gdGhlIHNoYXJlcyBwcmV2aW91c2x5IGNyZWF0ZWRcbiAgICogYnkgI2tleUNvbWJpbmUuIEdlbmVyYXRlcyBhIG5ldyBjaGFsbGVuZ2UgaWYgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0ge1hTaGFyZSB8IFlTaGFyZX0gc2hhcmUgUHJpdmF0ZSB4U2hhcmUgb3IgeVNoYXJlIG9mIHRoZSBzaWduaW5nIG9wZXJhdGlvblxuICAgKiBAcGFyYW0gcmFuZ2VQcm9vZkNoYWxsZW5nZSAtIGNoYWxsZW5nZSBnZW5lcmF0ZWQgdmlhIGdlbmVyYXRlTnRpbGRlXG4gICAqIEBwYXJhbSBwYWlsbGllclByb29mQ2hhbGxlbmdlXG4gICAqIEByZXR1cm5zIHtLZXlDb21iaW5lZH0gVGhlIHNoYXJlIHdpdGggYW1lbmRlZCBjaGFsbGVuZ2UgdmFsdWVzXG4gICAqL1xuICBhcHBlbmRDaGFsbGVuZ2U8VD4oXG4gICAgc2hhcmU6IFQsXG4gICAgcmFuZ2VQcm9vZkNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlLFxuICAgIHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZFBhaWxsaWVyQ2hhbGxlbmdlXG4gICk6IFQgJiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWRFY2RzYUNoYWxsZW5nZXMge1xuICAgIGNvbnN0IHsgbnRpbGRlLCBoMSwgaDIgfSA9IHJhbmdlUHJvb2ZDaGFsbGVuZ2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYXJlLFxuICAgICAgbnRpbGRlLFxuICAgICAgaDEsXG4gICAgICBoMixcbiAgICAgIHA6IHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2UucCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBzaWduaW5nIHNoYXJlcy5cbiAgICogQHBhcmFtIHt4U2hhcmV9IHhTaGFyZSBQcml2YXRlIHhTaGFyZSBvZiBjdXJyZW50IHBhcnRpY2lwYW50IHNpZ25lclxuICAgKiBAcGFyYW0ge1lTaGFyZX0geVNoYXJlIHlTaGFyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICogQHJldHVybnMge1NpZ25TaGFyZVJUfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHctc2hhcmVcbiAgICogYW5kIGstc2hhcmUgdG8gYmUgZGlzdHJpYnV0ZWQgdG8gb3RoZXIgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqL1xuICBhc3luYyBzaWduU2hhcmUoeFNoYXJlOiBYU2hhcmVXaXRoQ2hhbGxlbmdlcywgeVNoYXJlOiBZU2hhcmVXaXRoQ2hhbGxlbmdlcyk6IFByb21pc2U8U2lnblNoYXJlUlQ+IHtcbiAgICBjb25zdCBwayA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHhTaGFyZS5uKSk7XG5cbiAgICBjb25zdCBrID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG4gICAgY29uc3QgcmsgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhway5uKTtcbiAgICBjb25zdCBjayA9IHBrLmVuY3J5cHQoaywgcmspO1xuICAgIGNvbnN0IGdhbW1hID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG5cbiAgICBjb25zdCBkID0gRWNkc2EuY3VydmUuc2NhbGFyTXVsdChFY2RzYS5jdXJ2ZS5zY2FsYXJTdWIoQmlnSW50KHlTaGFyZS5qKSwgQmlnSW50KHhTaGFyZS5pKSksIEJpZ0ludCh4U2hhcmUuaSkpO1xuXG4gICAgY29uc3QgdyA9IFtcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQoQmlnSW50KHlTaGFyZS5qKSwgQmlnSW50KHhTaGFyZS5pKSksXG4gICAgICBoZXhUb0JpZ0ludCh4U2hhcmVbJ3gnXSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJJbnZlcnQoZCksXG4gICAgXS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyTXVsdCk7XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYSwgaDE6IGgxYSwgaDI6IGgyYSB9ID0geFNoYXJlO1xuXG4gICAgY29uc3Qgd1NoYXJlOiBXU2hhcmUgPSB7XG4gICAgICBpOiB4U2hhcmUuaSxcbiAgICAgIGw6IHhTaGFyZS5sLFxuICAgICAgbTogeFNoYXJlLm0sXG4gICAgICBuOiB4U2hhcmUubixcbiAgICAgIHk6IHhTaGFyZS55LFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBwOiB4U2hhcmUucCxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUodywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKGdhbW1hLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYiwgaDE6IGgxYiwgaDI6IGgyYiB9ID0geVNoYXJlO1xuICAgIGNvbnN0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGssXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogaGV4VG9CaWdJbnQobnRpbGRlYiksXG4gICAgICAgIGgxOiBoZXhUb0JpZ0ludChoMWIpLFxuICAgICAgICBoMjogaGV4VG9CaWdJbnQoaDJiKSxcbiAgICAgIH0sXG4gICAgICBjayxcbiAgICAgIGssXG4gICAgICBya1xuICAgICk7XG5cbiAgICAvLyBjcmVhdGUgcGFpbGxpZXIgY2hhbGxlbmdlIHByb29mIGJhc2VkIG9uIHRoZSBvdGhlciBzaWduZXJzIGNoYWxsZW5nZVxuICAgIC8vIG9ubHkgc2VuZCBzaWdtYSBpZiB3ZSBhbHNvIHNlbmQgY2hhbGxlbmdlIHBcbiAgICBjb25zdCBzaWdtYSA9IEVjZHNhUGFpbGxpZXJQcm9vZi5wcm92ZShcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZS5uKSxcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZS5sKSxcbiAgICAgIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7IHA6IHlTaGFyZS5wIH0pLnBcbiAgICApO1xuXG4gICAgY29uc3QgcHJvb2ZTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3Qga1NoYXJlOiBLU2hhcmUgPSB7XG4gICAgICAvLyB0aGlzIHNoYXJlIHdpbGwgYmUgc2VudCB0byB0aGUgb3RoZXIgcGFydGljaXBhbnQsXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIHN3YXAgdGhlIGkgYW5kIGogdmFsdWVzIGhlcmVcbiAgICAgIC8vIHNvIHRoYXQgdGhleSBrbm93IGl0J3MgdGhlaXIga1NoYXJlLCBwcm9kdWNlZCBieSB1c1xuICAgICAgaTogeVNoYXJlLmosXG4gICAgICBqOiB4U2hhcmUuaSxcbiAgICAgIG46IHBrLm4udG9TdHJpbmcoMTYpLFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBwOiB4U2hhcmUucCxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoY2ssIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgc2lnbWE6IEVjZHNhVHlwZXMuc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZnMoeyBzaWdtYTogc2lnbWEgfSkuc2lnbWEsXG4gICAgICBwcm9vZjogcHJvb2ZTaGFyZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdTaGFyZSxcbiAgICAgIGtTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXIgc2lnbmVyLlxuICAgKiBDb25uZWN0aW9uIDEuMiBpbiBodHRwczovL2x1Y2lkLmFwcC9sdWNpZGNoYXJ0LzcwNjE3ODViLWJjNWMtNDAwMi1iNTQ2LTNmNGEzNjEyZmM2Mi9lZGl0P3BhZ2U9SUFWbXZZTzRGdktjI1xuICAgKiBJZiBzaWduZXIgQSBjb21wbGV0ZWQgc2lnblNoYXJlIGluaXRpYWxseSAoaW5wdXQgdG8gdGhpcyBmbiksIHRoZW4gdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCBieSBzaWduZXIgQi5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnRTdGVwMShzaGFyZXM6IFNpZ25Db252ZXJ0U3RlcDEpOiBQcm9taXNlPFNpZ25Db252ZXJ0U3RlcDFSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlY2VpdmVkS1NoYXJlID0gc2hhcmVzLmtTaGFyZTtcbiAgICBjb25zdCB4U2hhcmUgPSBzaGFyZXMueFNoYXJlOyAvLyBjdXJyZW50UGFydGljaXBhbnQgc2VjcmV0IHhTaGFyZVxuICAgIGNvbnN0IHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMgPSB7XG4gICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgbnRpbGRlOiByZWNlaXZlZEtTaGFyZS5udGlsZGUsXG4gICAgICBoMTogcmVjZWl2ZWRLU2hhcmUuaDEsXG4gICAgICBoMjogcmVjZWl2ZWRLU2hhcmUuaDIsXG4gICAgICBwOiByZWNlaXZlZEtTaGFyZS5wLFxuICAgIH07XG4gICAgY29uc3Qgc2lnblNoYXJlID0gYXdhaXQgdGhpcy5zaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpO1xuICAgIGNvbnN0IHNoYXJlUGFydGljaXBhbnQgPSBzaWduU2hhcmUud1NoYXJlO1xuXG4gICAgaWYgKHNoYXJlUGFydGljaXBhbnQuaSAhPT0gcmVjZWl2ZWRLU2hhcmUuaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZXMgZnJvbSBzYW1lIHBhcnRpY2lwYW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRLU2hhcmUucHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIG90aGVyIHBhcnRpY2lwYW50cyBwYWlsbGllciBwdWJsaWMga2V5XG4gICAgY29uc3QgbiA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLm4pO1xuICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgIC8vIHRoZSBvdGhlciBwYXJ0aWNpcGFudCdzIHJhbmdlIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5oMik7XG5cbiAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNpcGFudCdzIHJhbmdlIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgY29uc3QgaDFiID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgY29uc3QgaDJiID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5oMik7XG5cbiAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUuayk7XG5cbiAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNpcGFudHMgcGFpbGxpZXIgcHJvb2YgY2hhbGxlbmdlXG4gICAgY29uc3Qgc2hhcmVQYXJ0aWNpcGFudFBhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2hhcmVQYXJ0aWNpcGFudC5wIH0pO1xuICAgIC8vIHRoZSBvdGhlciBzaWduaW5nIHBhcnRpZXMgcHJvb2YgdG8gdGhlIGN1cnJlbnQgcGFydGljaXBhbnRzIHBhaWxsaWVyIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IHJlY2VpdmVkUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZiA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZVByb29mcyh7XG4gICAgICBzaWdtYTogcmVjZWl2ZWRLU2hhcmUuc2lnbWEsXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgIShhd2FpdCBFY2RzYVBhaWxsaWVyUHJvb2YudmVyaWZ5KG4sIHNoYXJlUGFydGljaXBhbnRQYWlsbGllckNoYWxsZW5nZS5wLCByZWNlaXZlZFBhaWxsaWVyQ2hhbGxlbmdlUHJvb2Yuc2lnbWEpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwYWlsbGllciBwcm9vZicpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGViLFxuICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgaDI6IGgyYixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnopLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnUpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnMyKSxcbiAgICAgICAgfSxcbiAgICAgICAga1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBiZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZyA9IGhleFRvQmlnSW50KHNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgIGNvbnN0IHJiID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgIGNvbnN0IGNiID0gcGthLmVuY3J5cHQoYmV0YTAsIHJiKTtcbiAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICBjb25zdCBhbHBoYVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3QgZ3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGcpO1xuICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrYSxcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgfSxcbiAgICAgIGssXG4gICAgICBhbHBoYSxcbiAgICAgIGcsXG4gICAgICBiZXRhMCxcbiAgICAgIHJiLFxuICAgICAgZ3hcbiAgICApO1xuICAgIGNvbnN0IGdhbW1hUHJvb2ZUb0JlU2VudDogUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlID0ge1xuICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgLy8gTXRBICRrX2osIHdfaSQuXG4gICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgIGNvbnN0IG51ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG51MCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50LncpO1xuICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgIGNvbnN0IGNuID0gcGthLmVuY3J5cHQobnUwLCBybik7XG4gICAgY29uc3QgbXUgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIHcpLCBjbik7XG4gICAgY29uc3QgbXVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gUHJvdmUgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3Qgd3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHcpO1xuICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGthLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgIGgxOiBoMWEsXG4gICAgICAgIGgyOiBoMmEsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGhleFRvQmlnSW50KG11VG9CZVNlbnQpLFxuICAgICAgdyxcbiAgICAgIG51MCxcbiAgICAgIHJuLFxuICAgICAgd3hcbiAgICApO1xuICAgIGNvbnN0IHdQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUod3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IG5Ub0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUubjtcbiAgICBjb25zdCBudGlsZGVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlYiwgMzg0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgaDFUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUoaDFiLCAzODQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBoMlRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShoMmIsIDM4NCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGtUb0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUuaztcbiAgICBjb25zdCBwcm9vZlRvQmVTZW50ID0gc2lnblNoYXJlLmtTaGFyZS5wcm9vZjtcbiAgICBjb25zdCBbaVRvQmVTZW50LCBqVG9CZVNlbnRdID0gW3JlY2VpdmVkS1NoYXJlLmosIHJlY2VpdmVkS1NoYXJlLmldO1xuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHtcbiAgICAgICAgaTogaVRvQmVTZW50LFxuICAgICAgICBqOiBqVG9CZVNlbnQsXG4gICAgICAgIG50aWxkZTogbnRpbGRlVG9CZVNlbnQsXG4gICAgICAgIGgxOiBoMVRvQmVTZW50LFxuICAgICAgICBoMjogaDJUb0JlU2VudCxcbiAgICAgICAgbjogblRvQmVTZW50LFxuICAgICAgICBrOiBrVG9CZVNlbnQsXG4gICAgICAgIGFscGhhOiBhbHBoYVRvQmVTZW50LFxuICAgICAgICBtdTogbXVUb0JlU2VudCxcbiAgICAgICAgcHJvb2Y6IHByb29mVG9CZVNlbnQsXG4gICAgICAgIGdhbW1hUHJvb2Y6IGdhbW1hUHJvb2ZUb0JlU2VudCxcbiAgICAgICAgd1Byb29mOiB3UHJvb2ZUb0JlU2VudCxcbiAgICAgICAgLy8gcHJvdmlkZSB0aGUgc2hhcmUgcGFydGljaXBhbnRzIHByb29mXG4gICAgICAgIC8vIHRvIHRoZSBwYWlsbGllciBjaGFsbGVuZ2UgaW4gdGhlIHJlY2VpdmVkS1NoYXJlIGZyb20gdGhlIG90aGVyIHNpZ25lclxuICAgICAgICBzaWdtYTogc2lnblNoYXJlLmtTaGFyZS5zaWdtYSxcbiAgICAgIH0sXG4gICAgICBiU2hhcmU6IHtcbiAgICAgICAgLi4uc2hhcmVQYXJ0aWNpcGFudCxcbiAgICAgICAgYmV0YSxcbiAgICAgICAgbnUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBtdWx0aXBsaWNpdGl2ZS10by1hZGRpdGl2ZSAoTXRBKSBzaGFyZSBjb252ZXJzaW9uIHdpdGggYW5vdGhlclxuICAgKiBzaWduZXIuXG4gICAqIENvbm5lY3Rpb24gMi4xIGluIGh0dHBzOi8vbHVjaWQuYXBwL2x1Y2lkY2hhcnQvNzA2MTc4NWItYmM1Yy00MDAyLWI1NDYtM2Y0YTM2MTJmYzYyL2VkaXQ/cGFnZT1JQVZtdllPNEZ2S2MjXG4gICAqIElmIHNpZ25lciBCIGNvbXBsZXRlZCBzaWduQ29udmVydFN0ZXAxLCB0aGVuIHRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgYnkgc2lnbmVyIEEuXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0U3RlcDIoc2hhcmVzOiBTaWduQ29udmVydFN0ZXAyKTogUHJvbWlzZTxTaWduQ29udmVydFN0ZXAyUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWNlaXZlZEFTaGFyZSA9IHNoYXJlcy5hU2hhcmU7XG4gICAgaWYgKCFyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUud1Byb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgbiA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLm4pOyAvLyBQYWlsbGllciBwdWIgZnJvbSBvdGhlciBzaWduZXJcbiAgICAvLyBjdXJyZW50IHBhcnRpY2lwYW50IHB1YmxpYyBrZXlcbiAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLm4pKTtcbiAgICBjb25zdCBudGlsZGVhID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuaDEpO1xuICAgIGNvbnN0IGgyYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuaDIpO1xuICAgIGNvbnN0IGNrID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5jayk7XG5cbiAgICBjb25zdCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2UoeyBwOiBzaGFyZXMud1NoYXJlLnAgfSk7XG4gICAgY29uc3QgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlUHJvb2ZzKHtcbiAgICAgIHNpZ21hOiBzaGFyZXMuYVNoYXJlLnNpZ21hLFxuICAgIH0pO1xuICAgIGlmICghRWNkc2FQYWlsbGllclByb29mLnZlcmlmeShuLCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UucCwgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mLnNpZ21hKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIHBhaWxsaWVyIHByb29mJyk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5ICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmFscGhhKSxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgfVxuICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnpwcm0pLFxuICAgICAgICAgIHQ6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnMyKSxcbiAgICAgICAgICB0MTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudSksXG4gICAgICAgIH0sXG4gICAgICAgIGNrLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5tdSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICB9XG4gICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLmwpLCBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLm0pLCBwa2EpO1xuXG4gICAgY29uc3QgZ1NoYXJlQWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuYWxwaGEpKSksXG4gICAgICAzMlxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgZ1NoYXJlTXUgPSBiaWdJbnRUb0J1ZmZlckJFKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUubXUpKSksIC8vIHJlY2hlY2sgZW5jcnlwdGVkIG51bWJlclxuICAgICAgMzJcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUucHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IHBrYiA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYiA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmgxKTtcbiAgICBjb25zdCBoMmIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5oMik7XG4gICAgY29uc3QgayA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmspO1xuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGtiLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnopLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnUpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnMyKSxcbiAgICAgICAgfSxcbiAgICAgICAga1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBnU2hhcmVCZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5nYW1tYSk7XG4gICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Iubik7XG4gICAgY29uc3QgY2IgPSBwa2IuZW5jcnlwdChiZXRhMCwgcmIpO1xuICAgIGNvbnN0IGFscGhhID0gcGtiLmFkZGl0aW9uKHBrYi5tdWx0aXBseShrLCBnKSwgY2IpO1xuICAgIGNvbnN0IGFscGhhVG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKGFscGhhLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBjb25zdCBneCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZyk7XG4gICAgbGV0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGtiLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWIsXG4gICAgICAgIGgxOiBoMWIsXG4gICAgICAgIGgyOiBoMmIsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGFscGhhLFxuICAgICAgZyxcbiAgICAgIGJldGEwLFxuICAgICAgcmIsXG4gICAgICBneFxuICAgICk7XG4gICAgY29uc3QgZ2FtbWFQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgICAvLyBNdEEgJGtfaiwgd19pJC5cbiAgICBjb25zdCBudTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgY29uc3QgZ1NoYXJlTnUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobnUwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUudyk7XG4gICAgY29uc3Qgcm4gPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Iubik7XG4gICAgY29uc3QgY24gPSBwa2IuZW5jcnlwdChudTAsIHJuKTtcbiAgICBjb25zdCBtdSA9IHBrYi5hZGRpdGlvbihwa2IubXVsdGlwbHkoaywgdyksIGNuKTtcbiAgICBjb25zdCBtdVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShtdSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBjb25zdCB3eCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQodyk7XG4gICAgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICBwa2IsXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgaDE6IGgxYixcbiAgICAgICAgaDI6IGgyYixcbiAgICAgIH0sXG4gICAgICBrLFxuICAgICAgaGV4VG9CaWdJbnQobXVUb0JlU2VudCksXG4gICAgICB3LFxuICAgICAgbnUwLFxuICAgICAgcm4sXG4gICAgICB3eFxuICAgICk7XG4gICAgY29uc3Qgd1Byb29mVG9CZVNlbnQ6IFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW2lUb0JlU2VudCwgalRvQmVTZW50XSA9IFtyZWNlaXZlZEFTaGFyZS5qLCByZWNlaXZlZEFTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgbXVTaGFyZToge1xuICAgICAgICBpOiBpVG9CZVNlbnQsXG4gICAgICAgIGo6IGpUb0JlU2VudCxcbiAgICAgICAgYWxwaGE6IGFscGhhVG9CZVNlbnQsXG4gICAgICAgIG11OiBtdVRvQmVTZW50LFxuICAgICAgICBnYW1tYVByb29mOiBnYW1tYVByb29mVG9CZVNlbnQsXG4gICAgICAgIHdQcm9vZjogd1Byb29mVG9CZVNlbnQsXG4gICAgICB9LFxuICAgICAgZ1NoYXJlOiB7XG4gICAgICAgIGk6IHNoYXJlcy53U2hhcmUuaSxcbiAgICAgICAgbjogc2hhcmVzLndTaGFyZS5uLFxuICAgICAgICB5OiBzaGFyZXMud1NoYXJlLnksXG4gICAgICAgIGs6IHNoYXJlcy53U2hhcmUuayxcbiAgICAgICAgdzogc2hhcmVzLndTaGFyZS53LFxuICAgICAgICBnYW1tYTogc2hhcmVzLndTaGFyZS5nYW1tYSxcbiAgICAgICAgYWxwaGE6IGdTaGFyZUFscGhhLFxuICAgICAgICBtdTogZ1NoYXJlTXUsXG4gICAgICAgIGJldGE6IGdTaGFyZUJldGEsXG4gICAgICAgIG51OiBnU2hhcmVOdSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyIHNpZ25lci5cbiAgICogQ29ubmVjdGlvbiAyLjIgaW4gaHR0cHM6Ly9sdWNpZC5hcHAvbHVjaWRjaGFydC83MDYxNzg1Yi1iYzVjLTQwMDItYjU0Ni0zZjRhMzYxMmZjNjIvZWRpdD9wYWdlPUlBVm12WU80RnZLYyNcbiAgICogSWYgc2lnbmVyIEEgY29tcGxldGVkIHNpZ25Db252ZXJ0U3RlcDIsIHRoZW4gdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCBieSBzaWduZXIgQi5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnRTdGVwMyhzaGFyZXM6IFNpZ25Db252ZXJ0U3RlcDMpOiBQcm9taXNlPFNpZ25Db252ZXJ0U3RlcDNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlY2VpdmVkTXVTaGFyZSA9IHNoYXJlcy5tdVNoYXJlO1xuICAgIGlmICghcmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIGdhbW1hUHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgaWYgKCFyZWNlaXZlZE11U2hhcmUud1Byb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5uKSk7XG4gICAgY29uc3QgbnRpbGRlYSA9IGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmgyKTtcbiAgICBjb25zdCBjayA9IGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUuY2spO1xuICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgaWYgKFxuICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgejogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgdjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgczE6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgdDI6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5hbHBoYSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLngpXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBzaGFyZSBmb3IgZ2FtbWEgcHJvb2YnKTtcbiAgICB9XG4gICAgLy8gVmVyaWZ5ICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi56cHJtKSxcbiAgICAgICAgICB0OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQpLFxuICAgICAgICAgIHY6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi5zMiksXG4gICAgICAgICAgdDE6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudDEpLFxuICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnUpLFxuICAgICAgICB9LFxuICAgICAgICBjayxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLm11KSxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICB9XG4gICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmwpLCBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLm0pLCBwa2EpO1xuICAgIGNvbnN0IGFscGhhID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuYWxwaGEpKTtcbiAgICBjb25zdCBnU2hhcmVBbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGFscGhhKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBtdSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLm11IGFzIHN0cmluZykpOyAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICBjb25zdCBnU2hhcmVNdSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG11KSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IFtpVG9CZVNlbnQsIGpUb0JlU2VudF0gPSBbcmVjZWl2ZWRNdVNoYXJlLmosIHJlY2VpdmVkTXVTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgZ1NoYXJlOiB7XG4gICAgICAgIGk6IHNoYXJlcy5iU2hhcmUuaSxcbiAgICAgICAgbjogc2hhcmVzLmJTaGFyZS5uLFxuICAgICAgICB5OiBzaGFyZXMuYlNoYXJlLnksXG4gICAgICAgIGs6IHNoYXJlcy5iU2hhcmUuayxcbiAgICAgICAgdzogc2hhcmVzLmJTaGFyZS53LFxuICAgICAgICBnYW1tYTogc2hhcmVzLmJTaGFyZS5nYW1tYSxcbiAgICAgICAgYWxwaGE6IGdTaGFyZUFscGhhLFxuICAgICAgICBtdTogZ1NoYXJlTXUsXG4gICAgICAgIGJldGE6IHNoYXJlcy5iU2hhcmUuYmV0YSxcbiAgICAgICAgbnU6IHNoYXJlcy5iU2hhcmUubnUsXG4gICAgICB9LFxuICAgICAgc2lnbkluZGV4OiB7XG4gICAgICAgIGk6IGlUb0JlU2VudCxcbiAgICAgICAgajogalRvQmVTZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXIgc2lnbmVyLlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBvbmUgb2YgW3NpZ25Db252ZXJ0U3RlcDEsIHNpZ25Db252ZXJ0U3RlcDIsIHNpZ25Db252ZXJ0U3RlcDNdIGluc3RlYWRcbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnQoc2hhcmVzOiBTaWduQ29udmVydCk6IFByb21pc2U8U2lnbkNvbnZlcnRSVD4ge1xuICAgIGxldCBzaGFyZVBhcnRpY2lwYW50OiBQYXJ0aWFsPEJTaGFyZT4gfCBQYXJ0aWFsPEdTaGFyZT4sIHNoYXJlVG9CZVNlbnQ6IFBhcnRpYWw8QVNoYXJlPiB8IE1VU2hhcmU7XG4gICAgbGV0IGlzR2FtbWFTaGFyZSA9IGZhbHNlO1xuICAgIGxldCBrU2hhcmU6IFBhcnRpYWw8S1NoYXJlPiA9IHt9O1xuICAgIGlmIChzaGFyZXMueFNoYXJlICYmIHNoYXJlcy55U2hhcmUgJiYgc2hhcmVzLmtTaGFyZSkge1xuICAgICAgY29uc3QgeFNoYXJlID0gc2hhcmVzLnhTaGFyZTsgLy8gY3VycmVudFBhcnRpY2lwYW50IHNlY3JldCB4U2hhcmVcbiAgICAgIGNvbnN0IHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMgPSB7XG4gICAgICAgIC4uLnNoYXJlcy55U2hhcmUsXG4gICAgICAgIG50aWxkZTogc2hhcmVzLmtTaGFyZS5udGlsZGUsXG4gICAgICAgIGgxOiBzaGFyZXMua1NoYXJlLmgxLFxuICAgICAgICBoMjogc2hhcmVzLmtTaGFyZS5oMixcbiAgICAgICAgcDogc2hhcmVzLmtTaGFyZS5wLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNpZ25TaGFyZSA9IGF3YWl0IHRoaXMuc2lnblNoYXJlKHhTaGFyZSwgeVNoYXJlKTtcbiAgICAgIGtTaGFyZSA9IHNpZ25TaGFyZS5rU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0geyAuLi5zaGFyZXMua1NoYXJlIH0gYXMgUGFydGlhbDxBU2hhcmU+O1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudCA9IHsgLi4uc2lnblNoYXJlLndTaGFyZSB9IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICB9IGVsc2UgaWYgKChzaGFyZXMuYlNoYXJlICYmIHNoYXJlcy5tdVNoYXJlKSB8fCAoc2hhcmVzLmFTaGFyZSAmJiBzaGFyZXMud1NoYXJlKSkge1xuICAgICAgaXNHYW1tYVNoYXJlID0gdHJ1ZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSBzaGFyZXMuYVNoYXJlID8gKHsgLi4uc2hhcmVzLmFTaGFyZSB9IGFzIE1VU2hhcmUpIDogKHsgLi4uc2hhcmVzLm11U2hhcmUgfSBhcyBNVVNoYXJlKTtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQgPSBzaGFyZXMud1NoYXJlID8gKHsgLi4uc2hhcmVzLndTaGFyZSB9IGFzIFBhcnRpYWw8R1NoYXJlPikgOiAoeyAuLi5zaGFyZXMuYlNoYXJlIH0gYXMgR1NoYXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZyBmb3IgU2lnbiBDb252ZXJ0Jyk7XG4gICAgfVxuICAgIGlmIChzaGFyZVBhcnRpY2lwYW50LmkgIT09IHNoYXJlVG9CZVNlbnQuaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZXMgZnJvbSBzYW1lIHBhcnRpY2lwYW50Jyk7XG4gICAgfVxuICAgIGlmICgoc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUpLmFscGhhKSB7XG4gICAgICBjb25zdCBiU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlO1xuICAgICAgY29uc3QgYVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZTtcbiAgICAgIGlmICghYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIWFTaGFyZVRvQmVTZW50LndQcm9vZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm4pKTtcbiAgICAgIGxldCBudGlsZGVhLCBoMWEsIGgyYSwgY2s7XG4gICAgICBpZiAoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKSB7XG4gICAgICAgIG50aWxkZWEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgICAgICBoMWEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICAgIGgyYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmgyKTtcbiAgICAgICAgY2sgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5jayk7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgJFxcZ2FtbWFfaSBcXGluIFpfe05eMn0kLlxuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YueiksXG4gICAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnpwcm0pLFxuICAgICAgICAgICAgdDogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50KSxcbiAgICAgICAgICAgIHY6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudiksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zKSxcbiAgICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMyKSxcbiAgICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQxKSxcbiAgICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQyKSxcbiAgICAgICAgICAgIHU6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjayxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5hbHBoYSksXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi54KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgICBoMjogaDJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnopLFxuICAgICAgICAgICAgenBybTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnpwcm0pLFxuICAgICAgICAgICAgdDogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQpLFxuICAgICAgICAgICAgdjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnYpLFxuICAgICAgICAgICAgdzogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zMSksXG4gICAgICAgICAgICBzMjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMyKSxcbiAgICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudDEpLFxuICAgICAgICAgICAgdDI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50MiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjayxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSksXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLngpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZm9yIHdQcm9vZicpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShcbiAgICAgICAgaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubCBhcyBzdHJpbmcpLFxuICAgICAgICBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5tIGFzIHN0cmluZyksXG4gICAgICAgIHBrYVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGdTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBHU2hhcmU7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBjb25zdCBhbHBoYSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuYWxwaGEpKTtcbiAgICAgIGdTaGFyZVBhcnRpY2lwYW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UoYWxwaGEpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgbXUgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11IGFzIHN0cmluZykpOyAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICAgIGdTaGFyZVBhcnRpY2lwYW50Lm11ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobXUpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8R1NoYXJlPjtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVRvQmVTZW50ID0gbXVTaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8TVVTaGFyZT47XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubDtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5tO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmFscGhhO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm11O1xuICAgIH1cbiAgICBpZiAoKHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlKS5rKSB7XG4gICAgICBjb25zdCBiU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlO1xuICAgICAgY29uc3QgYVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZTtcbiAgICAgIGlmICghYVNoYXJlVG9CZVNlbnQucHJvb2YpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3NpbmcgcHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG4gPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5uKTsgLy8gUGFpbGxpZXIgcHViIGZyb20gb3RoZXIgc2lnbmVyXG4gICAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShuKTtcbiAgICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5udGlsZGUpO1xuICAgICAgY29uc3QgaDFhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDEpO1xuICAgICAgY29uc3QgaDJhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDIpO1xuICAgICAgY29uc3QgbnRpbGRlYiA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgICBjb25zdCBoMWIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICBjb25zdCBoMmIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuayk7XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgICBoMjogaDJiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YueiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi51KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMyKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIE10QSAka19qLCBcXGdhbW1hX2kkLlxuICAgICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgICBiU2hhcmVQYXJ0aWNpcGFudC5iZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Eubik7XG4gICAgICBjb25zdCBjYiA9IHBrYS5lbmNyeXB0KGJldGEwLCByYik7XG4gICAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICAgIGFTaGFyZVRvQmVTZW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IGd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnKTtcbiAgICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIGssXG4gICAgICAgIGFscGhhLFxuICAgICAgICBnLFxuICAgICAgICBiZXRhMCxcbiAgICAgICAgcmIsXG4gICAgICAgIGd4XG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihhU2hhcmVUb0JlU2VudCwge1xuICAgICAgICBnYW1tYVByb29mOiB7XG4gICAgICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8vIE10QSAka19qLCB3X2kkLlxuICAgICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudC5udSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShudTApKSwgMzIpLnRvU3RyaW5nKFxuICAgICAgICAnaGV4J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC53KTtcbiAgICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY24gPSBwa2EuZW5jcnlwdChudTAsIHJuKTtcbiAgICAgIGNvbnN0IG11ID0gcGthLmFkZGl0aW9uKHBrYS5tdWx0aXBseShrLCB3KSwgY24pO1xuICAgICAgc2hhcmVUb0JlU2VudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IHd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh3KTtcbiAgICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAgayxcbiAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICB3LFxuICAgICAgICBudTAsXG4gICAgICAgIHJuLFxuICAgICAgICB3eFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2hhcmVUb0JlU2VudCwge1xuICAgICAgICB3UHJvb2Y6IHtcbiAgICAgICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKChzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSkuYWxwaGEpIHtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm50aWxkZTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgxO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5jaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm47XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5udGlsZGU7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5oMTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmgyO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LnByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzaGFyZVRvQmVTZW50LCB7XG4gICAgICAgICAgbjoga1NoYXJlLm4sXG4gICAgICAgICAgbnRpbGRlOiBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGgxOiBiaWdJbnRUb0J1ZmZlckJFKGgxYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaDI6IGJpZ0ludFRvQnVmZmVyQkUoaDJiLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBrOiBrU2hhcmUuayxcbiAgICAgICAgICBwcm9vZjoga1NoYXJlLnByb29mLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoJ2FscGhhJyBpbiBzaGFyZVRvQmVTZW50KSAmJiAhKCdrJyBpbiBzaGFyZVRvQmVTZW50KSkge1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5udGlsZGU7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuY2s7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0ge1xuICAgICAgICBpOiBtdVNoYXJlVG9CZVNlbnQuaSxcbiAgICAgICAgajogbXVTaGFyZVRvQmVTZW50LmosXG4gICAgICB9IGFzIE1VU2hhcmU7XG4gICAgfVxuICAgIFtzaGFyZVRvQmVTZW50LmksIHNoYXJlVG9CZVNlbnQual0gPSBbc2hhcmVUb0JlU2VudC5qLCBzaGFyZVRvQmVTZW50LmldO1xuICAgIGlmIChpc0dhbW1hU2hhcmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG11U2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZSxcbiAgICAgICAgZ1NoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlLFxuICAgICAgYlNoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgZ2FtbWEgc2hhcmVzIHRvIGdldCB0aGUgcHJpdmF0ZSBvbWljcm9uIC8gZGVsdGEgc2hhcmVzXG4gICAqIEBwYXJhbSB7U2lnbkNvbWJpbmV9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbWJpbmVSVH1cbiAgICovXG4gIHNpZ25Db21iaW5lKHNoYXJlczogU2lnbkNvbWJpbmUpOiBTaWduQ29tYmluZVJUIHtcbiAgICBjb25zdCBnU2hhcmUgPSBzaGFyZXMuZ1NoYXJlO1xuICAgIGNvbnN0IFMgPSBzaGFyZXMuc2lnbkluZGV4O1xuICAgIGNvbnN0IGdhbW1hID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmdhbW1hKTtcbiAgICBjb25zdCBhbHBoYSA9IGhleFRvQmlnSW50KGdTaGFyZS5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9IGhleFRvQmlnSW50KGdTaGFyZS5iZXRhKTtcbiAgICBjb25zdCBtdSA9IGhleFRvQmlnSW50KGdTaGFyZS5tdSk7XG4gICAgY29uc3QgbnUgPSBoZXhUb0JpZ0ludChnU2hhcmUubnUpO1xuICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChnU2hhcmUuayk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KGdTaGFyZS53KTtcblxuICAgIGNvbnN0IGRlbHRhID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgZ2FtbWEpLCBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoYWxwaGEsIGJldGEpKTtcbiAgICBjb25zdCBvbWljcm9uID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgdyksIEVjZHNhLmN1cnZlLnNjYWxhckFkZChtdSwgbnUpKTtcbiAgICBjb25zdCBHYW1tYSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZ2FtbWEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9TaGFyZToge1xuICAgICAgICBpOiBnU2hhcmUuaSxcbiAgICAgICAgeTogZ1NoYXJlLnksXG4gICAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgb21pY3JvbjogYmlnSW50VG9CdWZmZXJCRShvbWljcm9uLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZWx0YTogYmlnSW50VG9CdWZmZXJCRShkZWx0YSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgR2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoR2FtbWEsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgZFNoYXJlOiB7XG4gICAgICAgIGk6IFMuaSxcbiAgICAgICAgajogZ1NoYXJlLmksXG4gICAgICAgIGRlbHRhOiBiaWdJbnRUb0J1ZmZlckJFKGRlbHRhLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBHYW1tYTogYmlnSW50VG9CdWZmZXJCRShHYW1tYSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IE0gTWVzc2FnZSB0byBiZSBzaWduZWRcbiAgICogQHBhcmFtIHtPU2hhcmV9IG9TaGFyZSBwcml2YXRlIG9taWNyb24gc2hhcmUgb2YgY3VycmVudCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge0RTaGFyZX0gZFNoYXJlIGRlbHRhIHNoYXJlIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0gc2hvdWxkSGFzaCBpZiB0cnVlLCB3ZSBoYXNoIHRoZSBwcm92aWRlZCBidWZmZXIgYmVmb3JlIHNpZ25pbmdcbiAgICogQHJldHVybnMge1ZBU2hhcmV9XG4gICAqL1xuICBzaWduKE06IEJ1ZmZlciwgb1NoYXJlOiBPU2hhcmUsIGRTaGFyZTogRFNoYXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBWQVNoYXJlIHtcbiAgICBjb25zdCBtID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUoTSkuZGlnZXN0KCkgOiBNO1xuXG4gICAgY29uc3QgZGVsdGEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoaGV4VG9CaWdJbnQob1NoYXJlLmRlbHRhKSwgaGV4VG9CaWdJbnQoZFNoYXJlLmRlbHRhKSk7XG5cbiAgICBjb25zdCBSID0gRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShcbiAgICAgIEVjZHNhLmN1cnZlLnBvaW50QWRkKGhleFRvQmlnSW50KG9TaGFyZS5HYW1tYSksIGhleFRvQmlnSW50KGRTaGFyZS5HYW1tYSkpLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFySW52ZXJ0KGRlbHRhKVxuICAgICk7XG4gICAgY29uc3QgcG9pbnRSID0gc2VjcC5Qb2ludC5mcm9tSGV4KGJpZ0ludFRvQnVmZmVyQkUoUiwgMzIpKTtcbiAgICBjb25zdCByID0gcG9pbnRSLng7XG5cbiAgICBjb25zdCBzID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChiaWdJbnRGcm9tVThBQkUobSksIGhleFRvQmlnSW50KG9TaGFyZS5rKSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KHIsIGhleFRvQmlnSW50KG9TaGFyZS5vbWljcm9uKSlcbiAgICApO1xuXG4gICAgY29uc3QgbCA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHJobyA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IFYgPSBFY2RzYS5jdXJ2ZS5wb2ludEFkZChFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KFIsIHMpLCBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGwpKTtcbiAgICBjb25zdCBBID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChyaG8pO1xuXG4gICAgY29uc3QgY29tRGVjb21fVl9BID0gSGFzaENvbW1pdG1lbnQuY3JlYXRlQ29tbWl0bWVudChcbiAgICAgIEJ1ZmZlci5jb25jYXQoW2JpZ0ludFRvQnVmZmVyQkUoViwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksIGJpZ0ludFRvQnVmZmVyQkUoQSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyldKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaTogb1NoYXJlLmksXG4gICAgICB5OiBvU2hhcmUueSxcbiAgICAgIFI6IHBvaW50Ui50b0hleCh0cnVlKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIG06IG0sXG4gICAgICBsOiBsLFxuICAgICAgcmhvOiByaG8sXG4gICAgICBWOiBWLFxuICAgICAgQTogQSxcbiAgICAgIGNvbURlY29tVkE6IGNvbURlY29tX1ZfQSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHByb29mcyBvZiBWX2kgYW5kIEFfaSB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBNIE1lc3NhZ2UgdG8gY29tbWl0IHRvIGFzIHBhcnQgb2YgdGhlIGNvbnRleHQgb2YgdGhlIHByb29mLlxuICAgKiAgICBUaGlzIGRvZXNuJ3QgbmVlZCB0byBiZSB0aGUgc2FtZSBtZXNzYWdlIHRoYXQgd2FzIHNpZ25lZCBpbiB0aGUgc2lnbiBmdW5jdGlvbiBhYm92ZS5cbiAgICogICAgQnV0IGl0IHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgYWxsIHBhcnRpY2lwYW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIHByb29mIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7VkFTaGFyZX0gdmFTaGFyZSBUaGUgVkFTaGFyZSB0byBwcm92ZS5cbiAgICogQHJldHVybnMge1ZBU2hhcmVXaXRoUHJvb2ZzfVxuICAgKi9cbiAgZ2VuZXJhdGVWQVByb29mcyhNOiBCdWZmZXIsIHZhU2hhcmU6IFZBU2hhcmUpOiBWQVNoYXJlV2l0aFByb29mcyB7XG4gICAgY29uc3QgcyA9IGhleFRvQmlnSW50KHZhU2hhcmUucyk7XG4gICAgY29uc3QgUiA9IGJpZ0ludEZyb21VOEFCRShzZWNwLlBvaW50LmZyb21IZXgodmFTaGFyZS5SKS50b1Jhd0J5dGVzKHRydWUpKTtcblxuICAgIGNvbnN0IHByb29mQ29udGV4dCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShNKS51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShSLCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSkuZGlnZXN0KCk7XG5cbiAgICBjb25zdCB6a1ZQcm9vZiA9IEVjZHNhWmtWUHJvb2YuY3JlYXRlWmtWUHJvb2YodmFTaGFyZS5WLCBzLCB2YVNoYXJlLmwsIFIsIEVjZHNhLmN1cnZlLCBwcm9vZkNvbnRleHQpO1xuICAgIGNvbnN0IHNjaG5vcnJQcm9vZiA9IFNjaG5vcnIuY3JlYXRlU2Nobm9yclByb29mKHZhU2hhcmUuQSwgdmFTaGFyZS5yaG8sIEVjZHNhLmN1cnZlLCBwcm9vZkNvbnRleHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhU2hhcmUsXG4gICAgICBwcm9vZkNvbnRleHQ6IHByb29mQ29udGV4dCxcbiAgICAgIHprVlByb29mVjogemtWUHJvb2YsXG4gICAgICBzY2hub3JyUHJvb2ZBOiBzY2hub3JyUHJvb2YsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgVl9pIGFuZCBBX2kgdmFsdWVzIG9mIGFsbCBvdGhlciBwYXJ0aWNpcGFudHMgZHVyaW5nIHNpZ25pbmcgcGhhc2UgNSBzdGVwcyA1QSBhbmQgNUIuXG4gICAqIEBwYXJhbSB7VkFTaGFyZVdpdGhQcm9vZnN9IHZhU2hhcmUgVl9pLCBBX2kgaW5mbyBpbmNsdWRpbmcgU1NoYXJlIHZhbHVlcyBvZiB0aGUgY3VycmVuY3QgcGFydGljaXBhbnRcbiAgICogQHBhcmFtIHtQdWJsaWNWQVNoYXJlV2l0aFByb29mc1tdfSBwdWJsaWNWQVNoYXJlcyBwdWJsaWMgVl9pLCBBX2kgaW5mbyBvZiBhbGwgb3RoZXIgcGFydGljaXBhbnRzXG4gICAqIEByZXR1cm5zIHtVVFNoYXJlfSBVX2ksIFRfaSBpbmZvIG9mIHRoZSBjdXJyZW50IHBhcnRpY2lwYW50IGlmIGFsbCB2ZXJpZmljYXRpb25zIHBhc3NcbiAgICovXG4gIHZlcmlmeVZBU2hhcmVzKHZhU2hhcmU6IFZBU2hhcmVXaXRoUHJvb2ZzLCBwdWJsaWNWQVNoYXJlczogUHVibGljVkFTaGFyZVdpdGhQcm9vZnNbXSk6IFVUU2hhcmUge1xuICAgIHB1YmxpY1ZBU2hhcmVzLmZvckVhY2goKHB1YmxpY1ZBU2hhcmUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIUhhc2hDb21taXRtZW50LnZlcmlmeUNvbW1pdG1lbnQocHVibGljVkFTaGFyZS5jb21EZWNvbVZBLmNvbW1pdG1lbnQsIHtcbiAgICAgICAgICBzZWNyZXQ6IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICAgICAgYmlnSW50VG9CdWZmZXJCRShwdWJsaWNWQVNoYXJlLlYsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpLFxuICAgICAgICAgICAgYmlnSW50VG9CdWZmZXJCRShwdWJsaWNWQVNoYXJlLkEsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIGJsaW5kaW5nRmFjdG9yOiBwdWJsaWNWQVNoYXJlLmNvbURlY29tVkEuZGVjb21taXRtZW50LmJsaW5kaW5nRmFjdG9yLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBjb21taXRtZW50IG9mIFZfaSBhbmQgQV9pJyk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgICFTY2hub3JyLnZlcmlmeVNjaG5vcnJQcm9vZihwdWJsaWNWQVNoYXJlLkEsIHB1YmxpY1ZBU2hhcmUuc2Nobm9yclByb29mQSwgRWNkc2EuY3VydmUsIHZhU2hhcmUucHJvb2ZDb250ZXh0KVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBTY2hub3JyIHByb29mIG9mIEFfaScpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2Faa1ZQcm9vZi52ZXJpZnlaa1ZQcm9vZihcbiAgICAgICAgICBwdWJsaWNWQVNoYXJlLlYsXG4gICAgICAgICAgcHVibGljVkFTaGFyZS56a1ZQcm9vZlYsXG4gICAgICAgICAgaGV4VG9CaWdJbnQodmFTaGFyZS5SKSxcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICB2YVNoYXJlLnByb29mQ29udGV4dFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IFpLIHByb29mIG9mIFZfaScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgeSA9IGhleFRvQmlnSW50KHZhU2hhcmUueSk7XG4gICAgLy8gciBpcyBSJ3MgeCBjb29yZGluYXRlLiAgUiBpcyBpbiBjb21wcmVzc2VkIGZvcm0sIHNvIHdlIG5lZWQgdG8gc2xpY2Ugb2ZmIHRoZSBmaXJzdCBieXRlLlxuICAgIGNvbnN0IHIgPSBoZXhUb0JpZ0ludCh2YVNoYXJlLlIuc2xpY2UoMikpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGFnZ3JlZ2F0aW9uIG9mIGFsbCBWX2kgYW5kIEFfaS5cbiAgICBsZXQgViA9IEVjZHNhLmN1cnZlLnBvaW50QWRkKFxuICAgICAgRWNkc2EuY3VydmUucG9pbnRBZGQoXG4gICAgICAgIEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKGJpZ0ludEZyb21VOEFCRSh2YVNoYXJlLm0pKSksXG4gICAgICAgIEVjZHNhLmN1cnZlLnBvaW50TXVsdGlwbHkoeSwgRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKHIpKVxuICAgICAgKSxcbiAgICAgIHZhU2hhcmUuVlxuICAgICk7XG4gICAgbGV0IEEgPSB2YVNoYXJlLkE7XG4gICAgcHVibGljVkFTaGFyZXMuZm9yRWFjaCgocHVibGljVkFTaGFyZSkgPT4ge1xuICAgICAgViA9IEVjZHNhLmN1cnZlLnBvaW50QWRkKFYsIHB1YmxpY1ZBU2hhcmUuVik7XG4gICAgICBBID0gRWNkc2EuY3VydmUucG9pbnRBZGQoQSwgcHVibGljVkFTaGFyZS5BKTtcbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSBVX2kgPSByaG9faSAqIFYgYW5kIFRfaSA9IGxfaSAqIEEuXG4gICAgY29uc3QgVSA9IEVjZHNhLmN1cnZlLnBvaW50TXVsdGlwbHkoViwgdmFTaGFyZS5yaG8pO1xuICAgIGNvbnN0IFQgPSBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KEEsIHZhU2hhcmUubCk7XG4gICAgY29uc3QgY29tRGVjb21fVV9UID0gSGFzaENvbW1pdG1lbnQuY3JlYXRlQ29tbWl0bWVudChcbiAgICAgIEJ1ZmZlci5jb25jYXQoW2JpZ0ludFRvQnVmZmVyQkUoVSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksIGJpZ0ludFRvQnVmZmVyQkUoVCwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyldKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFTaGFyZSxcbiAgICAgIFUsXG4gICAgICBULFxuICAgICAgY29tRGVjb21VVDogY29tRGVjb21fVV9ULFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IFVfaSBhbmQgVl9pIHZhbHVlcyBvZiBhbGwgb3RoZXIgcGFydGljaXBhbnRzIGR1cmluZyBzaWduaW5nIHBoYXNlIDUgc3RlcHMgNUMgYW5kIDVELlxuICAgKiBAcGFyYW0ge1VUU2hhcmV9IHV0U2hhcmUgVV9pLCBUX2kgaW5mbyBpbmNsdWRpbmcgU1NoYXJlIHZhbHVlcyBvZiB0aGUgY3VycmVuY3QgcGFydGljaXBhbnRcbiAgICogQHBhcmFtIHtQdWJsaWNVVFNoYXJlW119IHB1YmxpY1VUU2hhcmVzIHB1YmxpYyBVX2ksIFRfaSBpbmZvIG9mIGFsbCBvdGhlciBwYXJ0aWNpcGFudHNcbiAgICogQHJldHVybnMge1NTaGFyZX0gU1NoYXJlIG9mIHRoZSBjdXJyZW50IHBhcnRpY2lwYW50IGlmIGFsbCB2ZXJpZmljYXRpb25zIHBhc3NcbiAgICovXG4gIHZlcmlmeVVUU2hhcmVzKHV0U2hhcmU6IFVUU2hhcmUsIHB1YmxpY1VUU2hhcmVzOiBQdWJsaWNVVFNoYXJlW10pOiBTU2hhcmUge1xuICAgIGxldCBzaWdtYVUgPSB1dFNoYXJlLlU7XG4gICAgbGV0IHNpZ21hVCA9IHV0U2hhcmUuVDtcblxuICAgIHB1YmxpY1VUU2hhcmVzLmZvckVhY2goKHB1YmxpY1VUU2hhcmUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIUhhc2hDb21taXRtZW50LnZlcmlmeUNvbW1pdG1lbnQocHVibGljVVRTaGFyZS5jb21EZWNvbVVULmNvbW1pdG1lbnQsIHtcbiAgICAgICAgICBzZWNyZXQ6IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICAgICAgYmlnSW50VG9CdWZmZXJCRShwdWJsaWNVVFNoYXJlLlUsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpLFxuICAgICAgICAgICAgYmlnSW50VG9CdWZmZXJCRShwdWJsaWNVVFNoYXJlLlQsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIGJsaW5kaW5nRmFjdG9yOiBwdWJsaWNVVFNoYXJlLmNvbURlY29tVVQuZGVjb21taXRtZW50LmJsaW5kaW5nRmFjdG9yLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBjb21taXRtZW50IG9mIFVfaSBhbmQgVF9pJyk7XG4gICAgICB9XG5cbiAgICAgIHNpZ21hVSA9IEVjZHNhLmN1cnZlLnBvaW50QWRkKHNpZ21hVSwgcHVibGljVVRTaGFyZS5VKTtcbiAgICAgIHNpZ21hVCA9IEVjZHNhLmN1cnZlLnBvaW50QWRkKHNpZ21hVCwgcHVibGljVVRTaGFyZS5UKTtcbiAgICB9KTtcblxuICAgIGlmIChzaWdtYVUgIT09IHNpZ21hVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdW0gb2YgYWxsIFVfaSBkb2VzIG5vdCBtYXRjaCBzdW0gb2YgYWxsIFRfaScpO1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLnV0U2hhcmUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgZnVsbCBzaWduYXR1cmUgYnkgY29tYmluaW5nIFNpZ24gU2hhcmVzXG4gICAqIEBwYXJhbSB7U1NoYXJlW119IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbmF0dXJlfVxuICAgKi9cbiAgY29uc3RydWN0U2lnbmF0dXJlKHNoYXJlczogU1NoYXJlW10pOiBTaWduYXR1cmUge1xuICAgIC8vIEV2ZXJ5IFIgbXVzdCBtYXRjaC5cbiAgICBjb25zdCBSID0gc2hhcmVzWzBdWydSJ107XG4gICAgY29uc3QgaXNSTWF0Y2hpbmcgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gc2hhcmVbJ1InXSA9PT0gUikucmVkdWNlKChhLCBiKSA9PiBhICYmIGIpO1xuICAgIGlmICghaXNSTWF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUiB2YWx1ZSBzaG91bGQgYmUgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHNoYXJlcycpO1xuICAgIH1cblxuICAgIGxldCBzID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IGhleFRvQmlnSW50KHNoYXJlWydzJ10pKS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyQWRkKTtcbiAgICBjb25zdCByZWNpZCA9IChSLnNsaWNlKDAsIDIpID09PSAnMDMnID8gMSA6IDApIF4gKHMgPiBFY2RzYS5jdXJ2ZS5vcmRlcigpIC8gQmlnSW50KDIpID8gMSA6IDApO1xuXG4gICAgLy8gTm9ybWFsaXplIHMuXG4gICAgcyA9IHMgPiBFY2RzYS5jdXJ2ZS5vcmRlcigpIC8gQmlnSW50KDIpID8gRWNkc2EuY3VydmUub3JkZXIoKSAtIHMgOiBzO1xuICAgIHJldHVybiB7XG4gICAgICB5OiBzaGFyZXNbMF1bJ3knXSxcbiAgICAgIHI6IFIuc2xpY2UoMiksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICByZWNpZDogcmVjaWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgZWNkc2Egc2lnbmF0dXJlc1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWVzc2FnZVxuICAgKiBAcGFyYW0ge1NpZ25hdHVyZSB9IHNpZ25hdHVyZVxuICAgKiBAcGFyYW0ge0hhc2h9IGhhc2ggaGFzaGluZyBhbGdvcml0aG0gaW1wbGVtZW50aW5nIE5vZGVgcyBzdGFuZGFyZCBjcnlwdG8gaGFzaCBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRIYXNoIGlmIHRydWUsIHdlIGhhc2ggdGhlIHByb3ZpZGVkIGJ1ZmZlciBiZWZvcmUgdmVyaWZ5aW5nXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZDsgRmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2ZXJpZnkobWVzc2FnZTogQnVmZmVyLCBzaWduYXR1cmU6IFNpZ25hdHVyZSwgaGFzaD86IEhhc2gsIHNob3VsZEhhc2ggPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVzc2FnZVRvVmVyaWZ5ID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUobWVzc2FnZSkuZGlnZXN0KCkgOiBtZXNzYWdlO1xuICAgIHJldHVybiBFY2RzYS5jdXJ2ZS52ZXJpZnkoXG4gICAgICBtZXNzYWdlVG9WZXJpZnksXG4gICAgICBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgQnVmZmVyLmZyb20oW3NpZ25hdHVyZVsncmVjaWQnXV0pLFxuICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKGhleFRvQmlnSW50KHNpZ25hdHVyZVsnciddKSwgMzIpLFxuICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKGhleFRvQmlnSW50KHNpZ25hdHVyZVsncyddKSwgMzIpLFxuICAgICAgXSksXG4gICAgICBoZXhUb0JpZ0ludChzaWduYXR1cmVbJ3knXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBhIGNoYWxsZW5nZSBhbmQgaXQncyBwcm9vZnMgZnJvbSBoZXggc3RyaW5ncyB0byBiaWdpbnRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNkay1saWItbXBjIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUgaW5zdGVhZFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlKTogRWNkc2FUeXBlcy5EZXNlcmlhbGl6ZWROdGlsZGUge1xuICAgIHJldHVybiBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIGNoYWxsZW5nZSBhbmQgaXQncyBwcm9vZnMgZnJvbSBiaWcgaW50IHRvIGhleCBzdHJpbmdzLlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2RrLWxpYi1tcGMgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZSBpbnN0ZWFkXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZSk6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSB7XG4gICAgcmV0dXJuIEVjZHNhVHlwZXMuc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZSk7XG4gIH1cbn1cbiJdfQ==
1264
+ exports.default = Ecdsa;
1265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdFQUFrRDtBQUNsRCx1RUFBeUQ7QUFDekQsdURBQTREO0FBQzVELG1DQUF1RDtBQUN2RCxtREFBNkM7QUFDN0MscUNBQXlHO0FBQ3pHLHlDQUE4QztBQUM5Qyx5REFlaUM7QUF1Q2pDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixzRkFBc0Y7QUFDdEYsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBRXhCOztHQUVHO0FBQ0gsTUFBcUIsS0FBSztJQUl4Qjs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsSUFBYSxFQUFFLElBQUksR0FBRyxLQUFLO1FBQzdGLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BGLE1BQU0seUJBQXlCLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzdCLGtFQUFrRTtZQUNsRSxtQkFBbUIsR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENB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TSxFQUFFLEdBQUcsTUFBTSxJQUFBLHFDQUF1QixFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXpDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RyxNQUFNLENBQUMsR0FBRztZQUNSLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUM1QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUVyRCxNQUFNLE1BQU0sR0FBVztZQUNyQixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxNQUFNLEVBQUUsT0FBTztZQUNmLEVBQUUsRUFBRSxHQUFHO1lBQ1AsRUFBRSxFQUFFLEdBQUc7WUFDUCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUMxQyxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUM3QyxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUMxQyxLQUFLLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUNuRCxDQUFDO1FBRUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3JELE1BQU0sS0FBSyxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxLQUFLLENBQ3ZDLEtBQUssQ0FBQyxLQUFLLEVBQ1gsaUNBQW1CLEVBQ25CLEVBQUUsRUFDRjtZQUNFLE1BQU0sRUFBRSxJQUFBLHlCQUFXLEVBQUMsT0FBTyxDQUFDO1lBQzVCLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsR0FBRyxDQUFDO1lBQ3BCLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsR0FBRyxDQUFDO1NBQ3JCLEVBQ0QsRUFBRSxFQUNGLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztRQUVGLHVFQUF1RTtRQUN2RSw4Q0FBOEM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsZ0NBQWtCLENBQUMsS0FBSyxDQUNwQyxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNyQixJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNyQix3QkFBVSxDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDM0QsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHO1lBQ2pCLENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbEQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1NBQ3BELENBQUM7UUFFRixNQUFNLE1BQU0sR0FBVztZQUNyQixvREFBb0Q7WUFDcEQsNkNBQTZDO1lBQzdDLHNEQUFzRDtZQUN0RCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsRUFBRSxFQUFFLEdBQUc7WUFDUCxFQUFFLEVBQUUsR0FBRztZQUNQLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNYLENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzVDLEtBQUssRUFBRSx3QkFBVSxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUMxRSxLQUFLLEVBQUUsVUFBVTtTQUNsQixDQUFDO1FBRUYsT0FBTztZQUNMLE1BQU07WUFDTixNQUFNO1NBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBd0I7UUFDN0MsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsbUNBQW1DO1FBQ2pFLE1BQU0sTUFBTSxHQUF5QjtZQUNuQyxHQUFHLE1BQU0sQ0FBQyxNQUFNO1lBQ2hCLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTTtZQUM3QixFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUU7WUFDckIsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO1lBQ3JCLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUNwQixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFMUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELDZDQUE2QztRQUM3QyxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUEsMkJBQW9CLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsZ0RBQWdEO1FBQ2hELE1BQU0sT0FBTyxHQUFHLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTNDLGtEQUFrRDtRQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFXLEVBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUEseUJBQVcsRUFBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU3QyxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhDLG9EQUFvRDtRQUNwRCxNQUFNLGlDQUFpQyxHQUFHLHdCQUFVLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3Ryx1RkFBdUY7UUFDdkYsTUFBTSw4QkFBOEIsR0FBRyx3QkFBVSxDQUFDLGtDQUFrQyxDQUFDO1lBQ25GLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSztTQUM1QixDQUFDLENBQUM7UUFDSCxJQUNFLENBQUMsQ0FBQyxNQUFNLGdDQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsaUNBQWlDLENBQUMsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ2hILENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELElBQ0UsQ0FBQyw2QkFBZSxDQUFDLE1BQU0sQ0FDckIsS0FBSyxDQUFDLEtBQUssRUFDWCxpQ0FBbUIsRUFDbkIsR0FBRyxFQUNIO1lBQ0UsTUFBTSxFQUFFLE9BQU87WUFDZixFQUFFLEVBQUUsR0FBRztZQUNQLEVBQUUsRUFBRSxHQUFHO1NBQ1IsRUFDRDtZQUNFLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdEMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1NBQ3pDLEVBQ0QsQ0FBQyxDQUNGLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsdUJBQXVCO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0csTUFBTSxDQUFDLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSxxQ0FBdUIsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFBLHVCQUFnQixFQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0UsZ0NBQWdDO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksS0FBSyxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxjQUFjLENBQzlDLEtBQUssQ0FBQyxLQUFLLEVBQ1gsaUNBQW1CLEVBQ25CLEdBQUcsRUFDSDtZQUNFLE1BQU0sRUFBRSxPQUFPO1lBQ2YsRUFBRSxFQUFFLEdBQUc7WUFDUCxFQUFFLEVBQUUsR0FBRztTQUNSLEVBQ0QsQ0FBQyxFQUNELEtBQUssRUFDTCxDQUFDLEVBQ0QsS0FBSyxFQUNMLEVBQUUsRUFDRixFQUFFLENBQ0gsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQTZCO1lBQ25ELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxJQUFJLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDdkQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNsRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ25ELEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNuRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDaEQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDNUMsQ0FBQztRQUNGLGtCQUFrQjtRQUNsQixNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUN0RSxNQUFNLEVBQUUsR0FBRyxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pHLE1BQU0sQ0FBQyxHQUFHLElBQUEseUJBQVcsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUEscUNBQXVCLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLDRCQUE0QjtRQUM1QixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxLQUFLLEdBQUcsTUFBTSw2QkFBZSxDQUFDLGNBQWMsQ0FDMUMsS0FBSyxDQUFDLEtBQUssRUFDWCxpQ0FBbUIsRUFDbkIsR0FBRyxFQUNIO1lBQ0UsTUFBTSxFQUFFLE9BQU87WUFDZixFQUFFLEVBQUUsR0FBRztZQUNQLEVBQUUsRUFBRSxHQUFHO1NBQ1IsRUFDRCxDQUFDLEVBQ0QsSUFBQSx5QkFBVyxFQUFDLFVBQVUsQ0FBQyxFQUN2QixDQUFDLEVBQ0QsR0FBRyxFQUNILEVBQUUsRUFDRixFQUFFLENBQ0gsQ0FBQztRQUNGLE1BQU0sY0FBYyxHQUE2QjtZQUMvQyxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsSUFBSSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbEQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ25ELEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNuRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2hELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1NBQzVDLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLGNBQWMsR0FBRyxJQUFBLHVCQUFnQixFQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELE1BQU0sVUFBVSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM3QyxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTixDQUFDLEVBQUUsU0FBUztnQkFDWixDQUFDLEVBQUUsU0FBUztnQkFDWixNQUFNLEVBQUUsY0FBYztnQkFDdEIsRUFBRSxFQUFFLFVBQVU7Z0JBQ2QsRUFBRSxFQUFFLFVBQVU7Z0JBQ2QsQ0FBQyxFQUFFLFNBQVM7Z0JBQ1osQ0FBQyxFQUFFLFNBQVM7Z0JBQ1osS0FBSyxFQUFFLGFBQWE7Z0JBQ3BCLEVBQUUsRUFBRSxVQUFVO2dCQUNkLEtBQUssRUFBRSxhQUFhO2dCQUNwQixVQUFVLEVBQUUsa0JBQWtCO2dCQUM5QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsdUNBQXVDO2dCQUN2Qyx3RUFBd0U7Z0JBQ3hFLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUs7YUFDOUI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxnQkFBZ0I7Z0JBQ25CLElBQUk7Z0JBQ0osRUFBRTthQUNIO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQXdCO1FBQzdDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO1FBQzFFLGlDQUFpQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFBLDJCQUFvQixFQUFDLElBQUEseUJBQVcsRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekMsTUFBTSxpQ0FBaUMsR0FBRyx3QkFBVSxDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRyxNQUFNLDhCQUE4QixHQUFHLHdCQUFVLENBQUMsa0NBQWtDLENBQUM7WUFDbkYsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztTQUMzQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0NBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDLEVBQUUsOEJBQThCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3RyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxJQUNFLENBQUMsNkJBQWUsQ0FBQyxlQUFlLENBQzlCLEtBQUssQ0FBQyxLQUFLLEVBQ1gsaUNBQW1CLEVBQ25CLEdBQUcsRUFDSDtZQUNFLE1BQU0sRUFBRSxPQUFPO1lBQ2YsRUFBRSxFQUFFLEdBQUc7WUFDUCxFQUFFLEVBQUUsR0FBRztTQUNSLEVBQ0Q7WUFDRSxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDakQsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzNDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMzQyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzdDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0MsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzdDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDNUMsRUFDRCxFQUFFLEVBQ0YsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDakMsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQ3pDLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsNkJBQTZCO1FBQzdCLElBQ0UsQ0FBQyw2QkFBZSxDQUFDLGVBQWUsQ0FDOUIsS0FBSyxDQUFDLEtBQUssRUFDWCxpQ0FBbUIsRUFDbkIsR0FBRyxFQUNIO1lBQ0UsTUFBTSxFQUFFLE9BQU87WUFDZixFQUFFLEVBQUUsR0FBRztZQUNQLEVBQUUsRUFBRSxHQUFHO1NBQ1IsRUFDRDtZQUNFLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUM3QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDekMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDekMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4QyxFQUNELEVBQUUsRUFDRixJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUM5QixJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDckMsRUFDRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFMUcsTUFBTSxXQUFXLEdBQUcsSUFBQSx1QkFBZ0IsRUFDbEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDdkUsRUFBRSxDQUNILENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxCLE1BQU0sUUFBUSxHQUFHLElBQUEsdUJBQWdCLEVBQy9CLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsMkJBQTJCO1FBQ2pHLEVBQUUsQ0FDSCxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBQSwyQkFBb0IsRUFBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQ0UsQ0FBQyw2QkFBZSxDQUFDLE1BQU0sQ0FDckIsS0FBSyxDQUFDLEtBQUssRUFDWCxpQ0FBbUIsRUFDbkIsR0FBRyxFQUNIO1lBQ0UsTUFBTSxFQUFFLE9BQU87WUFDZixFQUFFLEVBQUUsR0FBRztZQUNQLEVBQUUsRUFBRSxHQUFHO1NBQ1IsRUFDRDtZQUNFLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdEMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1NBQ3pDLEVBQ0QsQ0FBQyxDQUNGLEVBQ0QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsdUJBQXVCO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkgsTUFBTSxDQUFDLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHFDQUF1QixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRSxnQ0FBZ0M7UUFDaEMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxLQUFLLEdBQUcsTUFBTSw2QkFBZSxDQUFDLGNBQWMsQ0FDOUMsS0FBSyxDQUFDLEtBQUssRUFDWCxpQ0FBbUIsRUFDbkIsR0FBRyxFQUNIO1lBQ0UsTUFBTSxFQUFFLE9BQU87WUFDZixFQUFFLEVBQUUsR0FBRztZQUNQLEVBQUUsRUFBRSxHQUFHO1NBQ1IsRUFDRCxDQUFDLEVBQ0QsS0FBSyxFQUNMLENBQUMsRUFDRCxLQUFLLEVBQ0wsRUFBRSxFQUNGLEVBQUUsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxrQkFBa0IsR0FBNkI7WUFDbkQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELElBQUksRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUN2RCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2xELEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNuRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ25ELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNoRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUM1QyxDQUFDO1FBQ0Ysa0JBQWtCO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sUUFBUSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0csTUFBTSxDQUFDLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHFDQUF1QixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSw0QkFBNEI7UUFDNUIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEMsS0FBSyxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxjQUFjLENBQzFDLEtBQUssQ0FBQyxLQUFLLEVBQ1gsaUNBQW1CLEVBQ25CLEdBQUcsRUFDSDtZQUNFLE1BQU0sRUFBRSxPQUFPO1lBQ2YsRUFBRSxFQUFFLEdBQUc7WUFDUCxFQUFFLEVBQUUsR0FBRztTQUNSLEVBQ0QsQ0FBQyxFQUNELElBQUEseUJBQVcsRUFBQyxVQUFVLENBQUMsRUFDdkIsQ0FBQyxFQUNELEdBQUcsRUFDSCxFQUFFLEVBQ0YsRUFBRSxDQUNILENBQUM7UUFDRixNQUFNLGNBQWMsR0FBNkI7WUFDL0MsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELElBQUksRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUN2RCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2xELEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNuRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ25ELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNoRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUM1QyxDQUFDO1FBRUYsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1AsQ0FBQyxFQUFFLFNBQVM7Z0JBQ1osQ0FBQyxFQUFFLFNBQVM7Z0JBQ1osS0FBSyxFQUFFLGFBQWE7Z0JBQ3BCLEVBQUUsRUFBRSxVQUFVO2dCQUNkLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLE1BQU0sRUFBRSxjQUFjO2FBQ3ZCO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xCLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQzFCLEtBQUssRUFBRSxXQUFXO2dCQUNsQixFQUFFLEVBQUUsUUFBUTtnQkFDWixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsRUFBRSxFQUFFLFFBQVE7YUFDYjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQXdCO1FBQzdDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFBLDJCQUFvQixFQUFDLElBQUEseUJBQVcsRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekMsaUNBQWlDO1FBQ2pDLElBQ0UsQ0FBQyw2QkFBZSxDQUFDLGVBQWUsQ0FDOUIsS0FBSyxDQUFDLEtBQUssRUFDWCxpQ0FBbUIsRUFDbkIsR0FBRyxFQUNIO1lBQ0UsTUFBTSxFQUFFLE9BQU87WUFDZixFQUFFLEVBQUUsR0FBRztZQUNQLEVBQUUsRUFBRSxHQUFHO1NBQ1IsRUFDRDtZQUNFLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxFQUFFLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNsRCxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzVDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM1QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzVDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDOUMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzlDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDOUMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUM3QyxFQUNELEVBQUUsRUFDRixJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUNsQyxJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDMUMsRUFDRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCw2QkFBNkI7UUFDN0IsSUFDRSxDQUFDLDZCQUFlLENBQUMsZUFBZSxDQUM5QixLQUFLLENBQUMsS0FBSyxFQUNYLGlDQUFtQixFQUNuQixHQUFHLEVBQ0g7WUFDRSxNQUFNLEVBQUUsT0FBTztZQUNmLEVBQUUsRUFBRSxHQUFHO1lBQ1AsRUFBRSxFQUFFLEdBQUc7U0FDUixFQUNEO1lBQ0UsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzlDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDMUMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3pDLEVBQ0QsRUFBRSxFQUNGLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEVBQy9CLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUN0QyxFQUNELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxRyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUEseUJBQVcsRUFBQyxlQUFlLENBQUMsRUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQjtRQUM3RixNQUFNLFFBQVEsR0FBRyxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVwRixNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsQixLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLO2dCQUMxQixLQUFLLEVBQUUsV0FBVztnQkFDbEIsRUFBRSxFQUFFLFFBQVE7Z0JBQ1osSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSTtnQkFDeEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTthQUNyQjtZQUNELFNBQVMsRUFBRTtnQkFDVCxDQUFDLEVBQUUsU0FBUztnQkFDWixDQUFDLEVBQUUsU0FBUzthQUNiO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBbUI7UUFDbkMsSUFBSSxnQkFBbUQsRUFBRSxhQUF3QyxDQUFDO1FBQ2xHLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLE1BQU0sR0FBb0IsRUFBRSxDQUFDO1FBQ2pDLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsbUNBQW1DO1lBQ2pFLE1BQU0sTUFBTSxHQUF5QjtnQkFDbkMsR0FBRyxNQUFNLENBQUMsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTTtnQkFDNUIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNuQixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2RCxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUMxQixhQUFhLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQXFCLENBQUM7WUFDeEQsZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQXFCLENBQUM7UUFDaEUsQ0FBQzthQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakYsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQWMsQ0FBQyxDQUFDLENBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQWMsQ0FBQztZQUN2RyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBc0IsQ0FBQyxDQUFDLENBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQWEsQ0FBQztRQUNsSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSyxhQUF3QixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BDLE1BQU0saUJBQWlCLEdBQUcsZ0JBQTBCLENBQUM7WUFDckQsTUFBTSxjQUFjLEdBQUcsYUFBdUIsQ0FBQztZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUNqRSxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBQSwyQkFBb0IsRUFBQyxJQUFBLHlCQUFXLEVBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRSxJQUFJLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMxQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixPQUFPLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoRCxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN4QyxFQUFFLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFDRCxpQ0FBaUM7WUFDakMsSUFDRSxDQUFDLDZCQUFlLENBQUMsZUFBZSxDQUM5QixLQUFLLENBQUMsS0FBSyxFQUNYLGlDQUFtQixFQUNuQixHQUFHLEVBQ0g7Z0JBQ0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsRUFBRSxFQUFFLEdBQUc7YUFDUixFQUNEO2dCQUNFLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLElBQUksRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2pELENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLEVBQUUsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLENBQUMsRUFBRSxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDNUMsRUFDRCxFQUFFLEVBQ0YsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFDakMsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQ3pDLEVBQ0QsQ0FBQztnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7WUFDcEUsQ0FBQztZQUNELDZCQUE2QjtZQUM3QixJQUNFLENBQUMsNkJBQWUsQ0FBQyxlQUFlLENBQzlCLEtBQUssQ0FBQyxLQUFLLEVBQ1gsaUNBQW1CLEVBQ25CLEdBQUcsRUFDSDtnQkFDRSxNQUFNLEVBQUUsT0FBTztnQkFDZixFQUFFLEVBQUUsR0FBRztnQkFDUCxFQUFFLEVBQUUsR0FBRzthQUNSLEVBQ0Q7Z0JBQ0UsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDN0MsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsRUFBRSxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUN4QyxFQUNELEVBQUUsRUFDRixJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUM5QixJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDckMsRUFDRCxDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxjQUFjLENBQUMsVUFBVSxDQUN0QyxJQUFBLHlCQUFXLEVBQUMsaUJBQWlCLENBQUMsQ0FBVyxDQUFDLEVBQzFDLElBQUEseUJBQVcsRUFBQyxpQkFBaUIsQ0FBQyxDQUFXLENBQUMsRUFDMUMsR0FBRyxDQUNKLENBQUM7WUFDRixNQUFNLGlCQUFpQixHQUFHLGdCQUEwQixDQUFDO1lBQ3JELE1BQU0sZUFBZSxHQUFHLGFBQXdCLENBQUM7WUFDakQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUQsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxFQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1lBQzVGLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRixNQUFNLHVCQUF1QixHQUFHLGdCQUFtQyxDQUFDO1lBQ3BFLE1BQU0sb0JBQW9CLEdBQUcsZUFBbUMsQ0FBQztZQUNqRSxPQUFPLHVCQUF1QixDQUFDLENBQUMsQ0FBQztZQUNqQyxPQUFPLHVCQUF1QixDQUFDLENBQUMsQ0FBQztZQUNqQyxPQUFPLG9CQUFvQixDQUFDLEtBQUssQ0FBQztZQUNsQyxPQUFPLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSyxhQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0saUJBQWlCLEdBQUcsZ0JBQTBCLENBQUM7WUFDckQsTUFBTSxjQUFjLEdBQUcsYUFBdUIsQ0FBQztZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7WUFDMUUsTUFBTSxHQUFHLEdBQUcsSUFBQSwyQkFBb0IsRUFBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFXLEVBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEQsTUFBTSxHQUFHLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sR0FBRyxHQUFHLElBQUEseUJBQVcsRUFBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQ0UsQ0FBQyw2QkFBZSxDQUFDLE1BQU0sQ0FDckIsS0FBSyxDQUFDLEtBQUssRUFDWCxpQ0FBbUIsRUFDbkIsR0FBRyxFQUNIO2dCQUNFLE1BQU0sRUFBRSxPQUFPO2dCQUNmLEVBQUUsRUFBRSxHQUFHO2dCQUNQLEVBQUUsRUFBRSxHQUFHO2FBQ1IsRUFDRDtnQkFDRSxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxFQUFFLEVBQUUsSUFBQSx5QkFBVyxFQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2FBQ3pDLEVBQ0QsQ0FBQyxDQUNGLEVBQ0QsQ0FBQztnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUNELHVCQUF1QjtZQUN2QixNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN4RSxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDL0csS0FBSyxDQUNOLENBQUM7WUFDRixNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHFDQUF1QixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELGNBQWMsQ0FBQyxLQUFLLEdBQUcsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25FLGdDQUFnQztZQUNoQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLEtBQUssR0FBRyxNQUFNLDZCQUFlLENBQUMsY0FBYyxDQUM5QyxLQUFLLENBQUMsS0FBSyxFQUNYLGlDQUFtQixFQUNuQixHQUFHLEVBQ0g7Z0JBQ0UsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsRUFBRSxFQUFFLEdBQUc7YUFDUixFQUNELENBQUMsRUFDRCxLQUFLLEVBQ0wsQ0FBQyxFQUNELEtBQUssRUFDTCxFQUFFLEVBQ0YsRUFBRSxDQUNILENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRTtnQkFDNUIsVUFBVSxFQUFFO29CQUNWLENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsSUFBSSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUN2RCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbEQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNoRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztpQkFDNUM7YUFDRixDQUFDLENBQUM7WUFDSCxrQkFBa0I7WUFDbEIsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7WUFDdEUsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQzFHLEtBQUssQ0FDTixDQUFDO1lBQ0YsTUFBTSxDQUFDLEdBQUcsSUFBQSx5QkFBVyxFQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBQSxxQ0FBdUIsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRCxhQUFhLENBQUMsRUFBRSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCw0QkFBNEI7WUFDNUIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsS0FBSyxHQUFHLE1BQU0sNkJBQWUsQ0FBQyxjQUFjLENBQzFDLEtBQUssQ0FBQyxLQUFLLEVBQ1gsaUNBQW1CLEVBQ25CLEdBQUcsRUFDSDtnQkFDRSxNQUFNLEVBQUUsT0FBTztnQkFDZixFQUFFLEVBQUUsR0FBRztnQkFDUCxFQUFFLEVBQUUsR0FBRzthQUNSLEVBQ0QsQ0FBQyxFQUNELElBQUEseUJBQVcsRUFBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQzlCLENBQUMsRUFDRCxHQUFHLEVBQ0gsRUFBRSxFQUNGLEVBQUUsQ0FDSCxDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7Z0JBQzNCLE1BQU0sRUFBRTtvQkFDTixDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELElBQUksRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDdkQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDakQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNqRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2xELEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDbkQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUNuRCxFQUFFLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDaEQsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQzVDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBSyxnQkFBMkIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSx1QkFBdUIsR0FBRyxnQkFBbUMsQ0FBQztnQkFDcEUsTUFBTSxvQkFBb0IsR0FBRyxhQUFnQyxDQUFDO2dCQUM5RCxPQUFPLHVCQUF1QixDQUFDLE1BQU0sQ0FBQztnQkFDdEMsT0FBTyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sdUJBQXVCLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLE9BQU8sb0JBQW9CLENBQUMsTUFBTSxDQUFDO2dCQUNuQyxPQUFPLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixPQUFPLG9CQUFvQixDQUFDLEtBQUssQ0FBQztZQUNwQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7b0JBQzNCLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDWCxNQUFNLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDdEQsRUFBRSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQzlDLEVBQUUsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUM5QyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ1gsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2lCQUNwQixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDM0QsTUFBTSx1QkFBdUIsR0FBRyxnQkFBbUMsQ0FBQztZQUNwRSxPQUFPLHVCQUF1QixDQUFDLE1BQU0sQ0FBQztZQUN0QyxPQUFPLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztZQUNsQyxPQUFPLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztZQUNsQyxPQUFPLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLGVBQWUsR0FBRyxhQUF3QixDQUFDO1lBQ2pELGFBQWEsR0FBRztnQkFDZCxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ3BCLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQzthQUNWLENBQUM7UUFDZixDQUFDO1FBQ0QsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsT0FBTztnQkFDTCxPQUFPLEVBQUUsYUFBd0I7Z0JBQ2pDLE1BQU0sRUFBRSxnQkFBMEI7YUFDbkMsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLGFBQXVCO1lBQy9CLE1BQU0sRUFBRSxnQkFBMEI7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsV0FBVyxDQUFDLE1BQW1CO1FBQzdCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDN0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUEseUJBQVcsRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBRyxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLElBQUEseUJBQVcsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLEdBQUcsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWhDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkcsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0MsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNYLENBQUMsRUFBRSxJQUFBLHVCQUFnQixFQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUMxQyxPQUFPLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDdEQsS0FBSyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xELEtBQUssRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ25EO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDTixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ1gsS0FBSyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xELEtBQUssRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ25EO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILElBQUksQ0FBQyxDQUFTLEVBQUUsTUFBYyxFQUFFLE1BQWMsRUFBRSxJQUFXLEVBQUUsVUFBVSxHQUFHLElBQUk7UUFDNUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNkVBQTZFLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDO1FBQ2pILENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTdFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUEseUJBQVcsRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTFGLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUEseUJBQVcsRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDMUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQ2hDLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxxQkFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBQSx1QkFBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRW5CLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFBLHNCQUFlLEVBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNqRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBQSx5QkFBVyxFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUN2RCxDQUFDO1FBRUYsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sWUFBWSxHQUFHLDRCQUFjLENBQUMsZ0JBQWdCLENBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFBLHVCQUFnQixFQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUMxRyxDQUFDO1FBRUYsT0FBTztZQUNMLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNYLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNYLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNyQixDQUFDLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUMxQyxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1lBQ0osR0FBRyxFQUFFLEdBQUc7WUFDUixDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1lBQ0osVUFBVSxFQUFFLFlBQVk7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQUMsQ0FBUyxFQUFFLE9BQWdCO1FBQzFDLE1BQU0sQ0FBQyxHQUFHLElBQUEseUJBQVcsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLEdBQUcsSUFBQSxzQkFBZSxFQUFDLHFCQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFcEYsTUFBTSxZQUFZLEdBQUcsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBQSx1QkFBZ0IsRUFBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWpILE1BQU0sUUFBUSxHQUFHLDJCQUFhLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckcsTUFBTSxZQUFZLEdBQUcscUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVuRyxPQUFPO1lBQ0wsR0FBRyxPQUFPO1lBQ1YsWUFBWSxFQUFFLFlBQVk7WUFDMUIsU0FBUyxFQUFFLFFBQVE7WUFDbkIsYUFBYSxFQUFFLFlBQVk7U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxPQUEwQixFQUFFLGNBQXlDO1FBQ2xGLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUN2QyxJQUNFLENBQUMsNEJBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTtnQkFDcEUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3BCLElBQUEsdUJBQWdCLEVBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztvQkFDekQsSUFBQSx1QkFBZ0IsRUFBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO2lCQUMxRCxDQUFDO2dCQUNGLGNBQWMsRUFBRSxhQUFhLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxjQUFjO2FBQ3JFLENBQUMsRUFDRixDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBQ0QsSUFDRSxDQUFDLHFCQUFPLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUM1RyxDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsSUFDRSxDQUFDLDJCQUFhLENBQUMsY0FBYyxDQUMzQixhQUFhLENBQUMsQ0FBQyxFQUNmLGFBQWEsQ0FBQyxTQUFTLEVBQ3ZCLElBQUEseUJBQVcsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQ3RCLEtBQUssQ0FBQyxLQUFLLEVBQ1gsT0FBTyxDQUFDLFlBQVksQ0FDckIsRUFDRCxDQUFDO2dCQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLDJGQUEyRjtRQUMzRixNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFXLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUNsQixLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFBLHNCQUFlLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDL0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzFELEVBQ0QsT0FBTyxDQUFDLENBQUMsQ0FDVixDQUFDO1FBQ0YsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsQixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDdkMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFFSCwrQ0FBK0M7UUFDL0MsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sWUFBWSxHQUFHLDRCQUFjLENBQUMsZ0JBQWdCLENBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFBLHVCQUFnQixFQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUMxRyxDQUFDO1FBRUYsT0FBTztZQUNMLEdBQUcsT0FBTztZQUNWLENBQUM7WUFDRCxDQUFDO1lBQ0QsVUFBVSxFQUFFLFlBQVk7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxPQUFnQixFQUFFLGNBQStCO1FBQzlELElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV2QixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDdkMsSUFDRSxDQUFDLDRCQUFjLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BFLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO29CQUNwQixJQUFBLHVCQUFnQixFQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7b0JBQ3pELElBQUEsdUJBQWdCLEVBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztpQkFDMUQsQ0FBQztnQkFDRixjQUFjLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsY0FBYzthQUNyRSxDQUFDLEVBQ0YsQ0FBQztnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUVELE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLE1BQWdCO1FBQ2pDLHNCQUFzQjtRQUN0QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFBLHlCQUFXLEVBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvRixlQUFlO1FBQ2YsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxPQUFPO1lBQ0wsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2IsQ0FBQyxFQUFFLElBQUEsdUJBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDMUMsS0FBSyxFQUFFLEtBQUs7U0FDYixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsT0FBZSxFQUFFLFNBQW9CLEVBQUUsSUFBVyxFQUFFLFVBQVUsR0FBRyxJQUFJO1FBQzFFLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUNiLDZFQUE2RSxPQUFPLENBQUMsTUFBTSxRQUFRLENBQ3BHLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN2RyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUN2QixlQUFlLEVBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFBLHVCQUFnQixFQUFDLElBQUEseUJBQVcsRUFBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBQSx1QkFBZ0IsRUFBQyxJQUFBLHlCQUFXLEVBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQ2xELENBQUMsRUFDRixJQUFBLHlCQUFXLEVBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFNBQXNDO1FBQzdELE9BQU8sd0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBd0M7UUFDN0QsT0FBTyx3QkFBVSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDOztBQTUvQ00sV0FBSyxHQUFtQixJQUFJLHVCQUFjLEVBQUUsQ0FBQztBQUM3QyxZQUFNLEdBQVcsSUFBSSxrQ0FBb0IsRUFBRSxDQUFDO0FBQzVDLFlBQU0sR0FBVyxJQUFJLG9CQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2tCQUg3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGFpbGxpZXJCaWdpbnQgZnJvbSAncGFpbGxpZXItYmlnaW50JztcbmltcG9ydCAqIGFzIGJpZ2ludENyeXB0b1V0aWxzIGZyb20gJ2JpZ2ludC1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0IHsgc2VjcDI1NmsxIGFzIHNlY3AgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpZ0ludEZyb21CdWZmZXJCRSwgYmlnSW50RnJvbVU4QUJFLCBiaWdJbnRUb0J1ZmZlckJFLCBnZXRQYWlsbGllclB1YmxpY0tleSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgU2VjcDI1NmsxQ3VydmUgfSBmcm9tICcuLi8uLi9jdXJ2ZXMnO1xuaW1wb3J0IHtcbiAgRWNkc2FQYWlsbGllclByb29mLFxuICBFY2RzYVJhbmdlUHJvb2YsXG4gIEVjZHNhVHlwZXMsXG4gIEVjZHNhWmtWUHJvb2YsXG4gIEhhc2hDb21taXRtZW50LFxuICBTY2hub3JyLFxuICByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyxcbiAgaGV4VG9CaWdJbnQsXG4gIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gIEhEVHJlZSxcbiAgU2VjcDI1NmsxQmlwMzJIZFRyZWUsXG4gIGNoYWluY29kZUJhc2UsXG4gIFNoYW1pcixcbiAgU2Nobm9yclByb29mLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQge1xuICBBU2hhcmUsXG4gIEJTaGFyZSxcbiAgRFNoYXJlLFxuICBHU2hhcmUsXG4gIEtleUNvbWJpbmVkLFxuICBLZXlTaGFyZSxcbiAgS1NoYXJlLFxuICBNVVNoYXJlLFxuICBOU2hhcmUsXG4gIE9TaGFyZSxcbiAgUFNoYXJlLFxuICBQdWJsaWNVVFNoYXJlLFxuICBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUsXG4gIFNpZ25hdHVyZSxcbiAgU2lnbkNvbWJpbmUsXG4gIFNpZ25Db21iaW5lUlQsXG4gIFNpZ25Db252ZXJ0LFxuICBTaWduQ29udmVydFJULFxuICBTaWduQ29udmVydFN0ZXAxLFxuICBTaWduQ29udmVydFN0ZXAxUmVzcG9uc2UsXG4gIFNpZ25Db252ZXJ0U3RlcDIsXG4gIFNpZ25Db252ZXJ0U3RlcDJSZXNwb25zZSxcbiAgU2lnbkNvbnZlcnRTdGVwMyxcbiAgU2lnbkNvbnZlcnRTdGVwM1Jlc3BvbnNlLFxuICBTaWduU2hhcmVSVCxcbiAgU1NoYXJlLFxuICBTdWJrZXlTaGFyZSxcbiAgVVRTaGFyZSxcbiAgVkFTaGFyZVdpdGhQcm9vZnMsXG4gIFZBU2hhcmUsXG4gIFdTaGFyZSxcbiAgWFNoYXJlLFxuICBYU2hhcmVXaXRoQ2hhbGxlbmdlcyxcbiAgWVNoYXJlV2l0aENoYWxsZW5nZXMsXG4gIFB1YmxpY1ZBU2hhcmVXaXRoUHJvb2ZzLFxufSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgXzVuID0gQmlnSW50KDUpO1xuLy8gU2l6ZSBvZiBhbHBoYSBhbmQgbXUgc2hhcmVzIGluIGJ5dGVzIGV4cGVjdGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJvdG9jb2xcbmNvbnN0IEFMUEhBTVVTSVpFID0gNzY4O1xuXG4vKipcbiAqIEVDRFNBIFRTUyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0aW5nIDI6biBUaHJlc2hvbGRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWNkc2Ege1xuICBzdGF0aWMgY3VydmU6IFNlY3AyNTZrMUN1cnZlID0gbmV3IFNlY3AyNTZrMUN1cnZlKCk7XG4gIHN0YXRpYyBoZFRyZWU6IEhEVHJlZSA9IG5ldyBTZWNwMjU2azFCaXAzMkhkVHJlZSgpO1xuICBzdGF0aWMgc2hhbWlyOiBTaGFtaXIgPSBuZXcgU2hhbWlyKEVjZHNhLmN1cnZlKTtcbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNoYXJlcyBmb3IgcGFydGljaXBhbnQgYXQgaW5kZXggYW5kIHNwbGl0IGtleXMgYCh0aHJlc2hvbGQsbnVtU2hhcmVzKWAgd2F5cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHBhcnRpY2lwYW50IGluZGV4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aHJlc2hvbGQgU2lnbmluZyB0aHJlc2hvbGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bVNoYXJlcyAgTnVtYmVyIG9mIHNoYXJlc1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gc2VlZCBvcHRpb25hbCA2NCBieXRlIHNlZWQgdG8gdXNlIGZvciBrZXkgZ2VuZXJhdGlvblxuICAgKiBAcGFyYW0gc3luYyBvcHRpb25hbCBzeW5jIGZsYWcsIGlmIHRydWUgdGhlbiBhIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgUGFpbGxpZXIga2V5IGdlbmVyYXRpb24gaXMgdXNlZCB0aGF0IGRvZXMgbm90IHNwYXduIFdvcmtlciB0aHJlYWRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlTaGFyZT59IFJldHVybnMgdGhlIHByaXZhdGUgcC1zaGFyZVxuICAgKiBhbmQgbi1zaGFyZXMgdG8gYmUgZGlzdHJpYnV0ZWQgdG8gcGFydGljaXBhbnRzIGF0IHRoZWlyIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqL1xuICBhc3luYyBrZXlTaGFyZShpbmRleDogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlciwgbnVtU2hhcmVzOiBudW1iZXIsIHNlZWQ/OiBCdWZmZXIsIHN5bmMgPSBmYWxzZSk6IFByb21pc2U8S2V5U2hhcmU+IHtcbiAgICBpZiAoIShpbmRleCA+IDAgJiYgaW5kZXggPD0gbnVtU2hhcmVzICYmIHRocmVzaG9sZCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkID09PSAyKSkge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgS2V5U2hhcmUgQ29uZmlnJztcbiAgICB9XG5cbiAgICBpZiAoc2VlZCAmJiBzZWVkLmxlbmd0aCA8IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlZWQgbXVzdCBoYXZlIGEgbGVuZ3RoIG9mIGF0IGxlYXN0IDY0IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgbGV0IHNlZWRXaXRoVmFsaWRMZW5ndGggPSBzZWVkO1xuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoID4gNjQpIHtcbiAgICAgIC8vIGlmIHNlZWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA2NCBieXRlcywgaGFzaCBzZWVkIHRvIDY0IGJ5dGVzLlxuICAgICAgc2VlZFdpdGhWYWxpZExlbmd0aCA9IGNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzZWVkKS5kaWdlc3QoKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhZGRpdGl2ZWx5IGhvbW9tb3JwaGljIGVuY3J5cHRpb24ga2V5LlxuICAgIGxldCBwYWlsbGllcktleVBhaXI6IHBhaWxsaWVyQmlnaW50LktleVBhaXI7XG4gICAgaWYgKCFzeW5jKSB7XG4gICAgICBwYWlsbGllcktleVBhaXIgPSBhd2FpdCBwYWlsbGllckJpZ2ludC5nZW5lcmF0ZVJhbmRvbUtleXMobWluTW9kdWx1c0JpdExlbmd0aCwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zeW5jXG4gICAgICBwYWlsbGllcktleVBhaXIgPSBwYWlsbGllckJpZ2ludC5nZW5lcmF0ZVJhbmRvbUtleXNTeW5jKG1pbk1vZHVsdXNCaXRMZW5ndGgsIHRydWUpO1xuICAgIH1cbiAgICBjb25zdCB7IHB1YmxpY0tleSwgcHJpdmF0ZUtleSB9ID0gcGFpbGxpZXJLZXlQYWlyO1xuICAgIC8vIEFjY2VwdCBhIDY0IGJ5dGUgc2VlZCBhbmQgY3JlYXRlIGFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGZyb20gdGhhdCBzZWVkXG4gICAgY29uc3Qgc2VjcmV0S2V5ID0gc2VlZFdpdGhWYWxpZExlbmd0aCAmJiBiaXAzMi5mcm9tU2VlZChzZWVkV2l0aFZhbGlkTGVuZ3RoKTtcbiAgICBjb25zdCB1ID1cbiAgICAgIChzZWNyZXRLZXkgJiYgc2VjcmV0S2V5LnByaXZhdGVLZXkgJiYgYmlnSW50RnJvbVU4QUJFKG5ldyBVaW50OEFycmF5KHNlY3JldEtleS5wcml2YXRlS2V5KSkpID8/XG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcbiAgICBjb25zdCB5ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh1KTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSAoc2VjcmV0S2V5ICYmIHNlY3JldEtleS5jaGFpbkNvZGUpID8/IHJhbmRvbUJ5dGVzKDMyKTtcbiAgICAvLyBDb21wdXRlIHNlY3JldCBzaGFyZXMgb2YgdGhlIHByaXZhdGUga2V5XG4gICAgY29uc3QgeyBzaGFyZXM6IHVTaGFyZXMsIHYgfSA9IEVjZHNhLnNoYW1pci5zcGxpdCh1LCB0aHJlc2hvbGQsIG51bVNoYXJlcyk7XG4gICAgY29uc3QgY3VycmVudFBhcnRpY2lwYW50OiBQU2hhcmUgPSB7XG4gICAgICBpOiBpbmRleCxcbiAgICAgIHQ6IHRocmVzaG9sZCxcbiAgICAgIGM6IG51bVNoYXJlcyxcbiAgICAgIGw6IGJpZ0ludFRvQnVmZmVyQkUocHJpdmF0ZUtleS5sYW1iZGEsIDE5MikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgbTogYmlnSW50VG9CdWZmZXJCRShwcml2YXRlS2V5Lm11LCAxOTIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIG46IGJpZ0ludFRvQnVmZmVyQkUocHVibGljS2V5Lm4sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeTogYmlnSW50VG9CdWZmZXJCRSh5LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRSh1U2hhcmVzW2luZGV4XSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHV1OiB1LnRvU3RyaW5nKCksXG4gICAgICBjaGFpbmNvZGU6IGNoYWluY29kZS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgICBjb25zdCBrZXlTaGFyZTogS2V5U2hhcmUgPSB7XG4gICAgICBwU2hhcmU6IGN1cnJlbnRQYXJ0aWNpcGFudCxcbiAgICAgIG5TaGFyZXM6IHt9LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIGluIHVTaGFyZXMpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50SW5kZXggPSBwYXJzZUludChzaGFyZSwgMTApO1xuICAgICAgaWYgKHBhcnRpY2lwYW50SW5kZXggIT09IGluZGV4KSB7XG4gICAgICAgIGtleVNoYXJlLm5TaGFyZXNbcGFydGljaXBhbnRJbmRleF0gPSB7XG4gICAgICAgICAgaTogcGFydGljaXBhbnRJbmRleCxcbiAgICAgICAgICBqOiBjdXJyZW50UGFydGljaXBhbnRbJ2knXSxcbiAgICAgICAgICBuOiBwdWJsaWNLZXkubi50b1N0cmluZygxNiksXG4gICAgICAgICAgeTogYmlnSW50VG9CdWZmZXJCRSh5LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUodlswXSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbcGFydGljaXBhbnRJbmRleF0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgY2hhaW5jb2RlOiBjaGFpbmNvZGUudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9IGFzIE5TaGFyZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleVNoYXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgZGF0YSBzaGFyZWQgZHVyaW5nIHRoZSBrZXkgZ2VuZXJhdGlvbiBwcm90b2NvbC5cbiAgICogQHBhcmFtIHtLZXlTaGFyZX0gcGFydGljaXBhbnRTaGFyZXMgcHJpdmF0ZSBwLXNoYXJlIGFuZFxuICAgKiBuLXNoYXJlcyByZWNlaXZlZCBmcm9tIGFsbCBvdGhlciBwYXJ0aWNpcGFudHMuXG4gICAqIEByZXR1cm5zIHtLZXlDb21iaW5lZH0gUmV0dXJucyB0aGUgcGFydGljaXBhbnQgcHJpdmF0ZSB4LXNoYXJlXG4gICAqIGFuZCB5LXNoYXJlcyB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBzaWduaW5nIHNoYXJlcy5cbiAgICovXG4gIGtleUNvbWJpbmUocFNoYXJlOiBQU2hhcmUsIG5TaGFyZXM6IE5TaGFyZVtdKTogS2V5Q29tYmluZWQge1xuICAgIGNvbnN0IGFsbFNoYXJlcyA9IFtwU2hhcmUsIC4uLm5TaGFyZXNdO1xuICAgIC8vIENvbXB1dGUgdGhlIHB1YmxpYyBrZXkuXG4gICAgY29uc3QgeSA9IGFsbFNoYXJlcy5tYXAoKHBhcnRpY2lwYW50KSA9PiBoZXhUb0JpZ0ludChwYXJ0aWNpcGFudFsneSddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnBvaW50QWRkKTtcbiAgICAvLyBBZGQgc2VjcmV0IHNoYXJlc1xuICAgIGNvbnN0IHggPSBhbGxTaGFyZXMubWFwKChwYXJ0aWNpcGFudCkgPT4gaGV4VG9CaWdJbnQocGFydGljaXBhbnRbJ3UnXSkpLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQpO1xuXG4gICAgLy8gVmVyaWZ5IHNoYXJlcy5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIG9mIG5TaGFyZXMpIHtcbiAgICAgIGlmIChzaGFyZS52KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRWNkc2Euc2hhbWlyLnZlcmlmeShoZXhUb0JpZ0ludChzaGFyZS51KSwgW2hleFRvQmlnSW50KHNoYXJlLnkpLCBoZXhUb0JpZ0ludChzaGFyZS52KV0sIHBTaGFyZS5pKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZyb20gcGFydGljaXBhbnQgJHtzaGFyZS5qfS4gVmVyaWZpY2F0aW9uIGVycm9yOiAke2Vycn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIFNjaG5vcnIgcHJvb2Ygb2Yga25vd2xlZGdlIG9mIHRoZSBkaXNjcmV0ZSBsb2cgb2YgWCA9IHhHLlxuICAgIGNvbnN0IFggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHgpO1xuXG4gICAgY29uc3QgcHJvb2ZDb250ZXh0ID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoeSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcykpLmRpZ2VzdCgpO1xuXG4gICAgY29uc3Qgc2Nobm9yclByb29mWCA9IFNjaG5vcnIuY3JlYXRlU2Nobm9yclByb29mKFgsIHgsIEVjZHNhLmN1cnZlLCBwcm9vZkNvbnRleHQpO1xuXG4gICAgLy8gQ2hhaW5jb2RlIHdpbGwgYmUgdXNlZCBpbiBmdXR1cmUgd2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3Iga2V5IGRlcml2YXRpb24gZm9yIGVjZHNhXG4gICAgY29uc3QgY2hhaW5jb2RlcyA9IFtwU2hhcmUsIC4uLm5TaGFyZXNdLm1hcCgoeyBjaGFpbmNvZGUgfSkgPT4gYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGNoYWluY29kZSwgJ2hleCcpKSk7XG4gICAgY29uc3QgY2hhaW5jb2RlID0gY2hhaW5jb2Rlcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBjaGFpbmNvZGUpID0+XG4gICAgICAgIChhY2MgKyBjaGFpbmNvZGUpICUgQmlnSW50KCcweDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpIC8vIDJeMjU2XG4gICAgKTtcblxuICAgIGNvbnN0IHBhcnRpY2lwYW50czogS2V5Q29tYmluZWQgPSB7XG4gICAgICB4U2hhcmU6IHtcbiAgICAgICAgaTogcFNoYXJlLmksXG4gICAgICAgIGw6IHBTaGFyZS5sLFxuICAgICAgICBtOiBwU2hhcmUubSxcbiAgICAgICAgbjogcFNoYXJlLm4sXG4gICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoeSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh4LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBzY2hub3JyUHJvb2ZYOiBzY2hub3JyUHJvb2ZYLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludFRvQnVmZmVyQkUoY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIHlTaGFyZXM6IHt9LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIGluIG5TaGFyZXMpIHtcbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50SW5kZXggPSBuU2hhcmVzW3NoYXJlXVsnaiddO1xuICAgICAgcGFydGljaXBhbnRzLnlTaGFyZXNbcGFydGljaXBhbnRJbmRleF0gPSB7XG4gICAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgICBqOiBuU2hhcmVzW3NoYXJlXVsnaiddLFxuICAgICAgICBuOiBuU2hhcmVzW3NoYXJlXVsnbiddLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRpY2lwYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgc2hhcmVzIGZvciBhIEJJUC0zMiBzdWJrZXkuXG4gICAqIEBwYXJhbSB7UFNoYXJlfSBUaGUgdXNlcidzIHAtc2hhcmUuXG4gICAqIEBwYXJhbSB7TlNoYXJlW119IFRoZSBuLXNoYXJlcyByZWNlaXZlZCBmcm9tIHRoZSBvdGhlciBwYXJ0aWNpcGFudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgQklQLTMyIHBhdGggdG8gZGVyaXZlLlxuICAgKiBAcmV0dXJucyB7U3Via2V5U2hhcmV9IFJldHVybnMgdGhlIHByaXZhdGUgeC1zaGFyZSBhbmQgbi1zaGFyZXMgdG9cbiAgICogYmUgZGlzdHJpYnV0ZWQgdG8gcGFydGljaXBhbnRzIGF0IHRoZWlyIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqL1xuICBrZXlEZXJpdmUocFNoYXJlOiBQU2hhcmUsIG5TaGFyZXM6IE5TaGFyZVtdLCBwYXRoOiBzdHJpbmcpOiBTdWJrZXlTaGFyZSB7XG4gICAgY29uc3QgeVZhbHVlcyA9IFtwU2hhcmUsIC4uLm5TaGFyZXNdLm1hcCgoc2hhcmUpID0+IGhleFRvQmlnSW50KHNoYXJlLnkpKTtcbiAgICBjb25zdCB5ID0geVZhbHVlcy5yZWR1Y2UoKHBhcnRpYWwsIHNoYXJlKSA9PiBFY2RzYS5jdXJ2ZS5wb2ludEFkZChwYXJ0aWFsLCBzaGFyZSkpO1xuICAgIGNvbnN0IHUgPSBCaWdJbnQocFNoYXJlLnV1KTtcbiAgICBsZXQgY29udHJpYkNoYWluY29kZSA9IGhleFRvQmlnSW50KHBTaGFyZS5jaGFpbmNvZGUpO1xuICAgIGNvbnN0IGNoYWluY29kZXMgPSBbY29udHJpYkNoYWluY29kZSwgLi4ublNoYXJlcy5tYXAoKHsgY2hhaW5jb2RlIH0pID0+IGhleFRvQmlnSW50KGNoYWluY29kZSkpXTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSBjaGFpbmNvZGVzLnJlZHVjZSgoYWNjLCBjaGFpbmNvZGUpID0+IChhY2MgKyBjaGFpbmNvZGUpICUgY2hhaW5jb2RlQmFzZSk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYpXSwgcFNoYXJlLmkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZnJvbSBwYXJ0aWNpcGFudCAke3NoYXJlLmp9LiBWZXJpZmljYXRpb24gZXJyb3I6ICR7ZXJyfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVyaXZlIHN1YmtleS5cbiAgICBjb25zdCBzdWJrZXkgPSBFY2RzYS5oZFRyZWUucHJpdmF0ZURlcml2ZSh7IHBrOiB5LCBzazogdSwgY2hhaW5jb2RlIH0sIHBhdGgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBwdWJsaWMga2V5IGNvbnRyaWJ1dGlvbi5cbiAgICBjb25zdCBjb250cmliWSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoc3Via2V5LnNrKTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgY2hhaW5jb2RlIGNvbnRyaWJ1dGlvbi5cbiAgICBjb25zdCBjaGFpbmNvZGVEZWx0YSA9IChjaGFpbmNvZGVCYXNlICsgc3Via2V5LmNoYWluY29kZSAtIGNoYWluY29kZSkgJSBjaGFpbmNvZGVCYXNlO1xuICAgIGNvbnRyaWJDaGFpbmNvZGUgPSAoY29udHJpYkNoYWluY29kZSArIGNoYWluY29kZURlbHRhKSAlIGNoYWluY29kZUJhc2U7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHUgdmFsdWVzLlxuICAgIGNvbnN0IHsgc2hhcmVzOiBzcGxpdF91LCB2IH0gPSBFY2RzYS5zaGFtaXIuc3BsaXQoc3Via2V5LnNrLCBwU2hhcmUudCB8fCAyLCBwU2hhcmUuYyB8fCAzKTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgc2lnbmluZyBrZXkuXG4gICAgY29uc3QgeCA9IFtzcGxpdF91W3BTaGFyZS5pXSwgLi4ublNoYXJlcy5tYXAoKHsgdSB9KSA9PiBoZXhUb0JpZ0ludCh1KSldLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQpO1xuXG4gICAgLy8gR2VuZXJhdGUgU2Nobm9yciBwcm9vZiBvZiBrbm93bGVkZ2Ugb2YgdGhlIGRpc2NyZXRlIGxvZyBvZiBYID0geEcuXG4gICAgY29uc3QgWCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoeCk7XG5cbiAgICBjb25zdCBwcm9vZkNvbnRleHQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYmlnSW50VG9CdWZmZXJCRShzdWJrZXkucGssIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpKS5kaWdlc3QoKTtcblxuICAgIGNvbnN0IHNjaG5vcnJQcm9vZlggPSBTY2hub3JyLmNyZWF0ZVNjaG5vcnJQcm9vZihYLCB4LCBFY2RzYS5jdXJ2ZSwgcHJvb2ZDb250ZXh0KTtcblxuICAgIGNvbnN0IFBfaTogWFNoYXJlID0ge1xuICAgICAgaTogcFNoYXJlLmksXG4gICAgICBsOiBwU2hhcmUubCxcbiAgICAgIG06IHBTaGFyZS5tLFxuICAgICAgbjogcFNoYXJlLm4sXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5waywgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoeCwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHNjaG5vcnJQcm9vZlg6IHNjaG5vcnJQcm9vZlgsXG4gICAgICBjaGFpbmNvZGU6IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2hhcmVzOiBTdWJrZXlTaGFyZSA9IHtcbiAgICAgIHhTaGFyZTogUF9pLFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAobGV0IGluZCA9IDA7IGluZCA8IG5TaGFyZXMubGVuZ3RoOyBpbmQrKykge1xuICAgICAgY29uc3QgUF9qID0gblNoYXJlc1tpbmRdO1xuICAgICAgc2hhcmVzLm5TaGFyZXNbUF9qLmpdID0ge1xuICAgICAgICBpOiBQX2ouaixcbiAgICAgICAgajogUF9pLmksXG4gICAgICAgIG46IFBfaS5uLFxuICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHNwbGl0X3VbUF9qLmpdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJZLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHZbMF0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShjb250cmliQ2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBTY2hub3JyIHByb29mIG9mIGtub3dsZWRnZSBvZiB0aGUgZGlzY3JldGUgbG9nIG9mIFhfaSA9IHhfaSAqIEcuXG4gICAqIEBwYXJhbSBZIFRoZSBjb21iaW5lZCBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0gVlNTcyBUaGUgVlNTIHNoYXJlcyByZWNlaXZlZCBmcm9tIGFsbCBwYXJ0aWNpcGFudHMuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaSBvZiBYX2kuXG4gICAqIEBwYXJhbSBwcm9vZiBUaGUgc2Nobm9yciBwcm9vZi5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiBpdCdzIGEgdmFsaWQgcHJvb2Ygd2l0aCByZWdhcmRzIHRvIFkgYW5kIFZTU3MuXG4gICAqL1xuICB2ZXJpZnlTY2hub3JyUHJvb2ZYKFk6IGJpZ2ludCwgVlNTczogYmlnaW50W11bXSwgaW5kZXg6IG51bWJlciwgcHJvb2Y6IFNjaG5vcnJQcm9vZik6IGJvb2xlYW4ge1xuICAgIGlmIChpbmRleCA8IDEgfHwgaW5kZXggPiBWU1NzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIHN1cHBsaWVkIGZvciBpbmRleCcpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBYX2kgZnJvbSBwdWJsaWMgaW5mb3JtYXRpb24uXG4gICAgbGV0IFhfaSA9IFk7XG4gICAgVlNTcy5mb3JFYWNoKChWU1MpID0+IHtcbiAgICAgIFZTUy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgIFhfaSA9IEVjZHNhLmN1cnZlLnBvaW50QWRkKFhfaSwgRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseSh2LCBCaWdJbnQoaW5kZXgpKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb29mQ29udGV4dCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKFksIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpKS5kaWdlc3QoKTtcbiAgICByZXR1cm4gU2Nobm9yci52ZXJpZnlTY2hub3JyUHJvb2YoWF9pLCBwcm9vZiwgRWNkc2EuY3VydmUsIHByb29mQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyBhIGNoaWxkIGNvbW1vbiBrZXljaGFpbiBmcm9tIGNvbW1vbiBrZXljaGFpblxuICAgKlxuICAgKiBAcGFyYW0ge2NvbW1vbktleWNoYWlufSBUaGUgY29tbW9uIGtleWNoYWluIGFzIGEgaGV4IHN0cmluZy5cbiAgICogQHBhcmFtIHtwYXRofSBUaGUgQklQLTMyIHBhdGggdG8gZGVyaXZlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZXJpdmVkIGNvbW1vbiBrZXljaGFpbiBhcyBhIGhleCBzdHJpbmcuXG4gICAqL1xuICBkZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleWNoYWluOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKEVjZHNhLmhkVHJlZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBkZXJpdmUga2V5IHdpdGhvdXQgSERUcmVlIGltcGxlbWVudGF0aW9uXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWluID0gQnVmZmVyLmZyb20oY29tbW9uS2V5Y2hhaW4sICdoZXgnKTtcblxuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXljaGFpbiA9IEVjZHNhLmhkVHJlZS5wdWJsaWNEZXJpdmUoXG4gICAgICB7XG4gICAgICAgIHBrOiBiaWdJbnRGcm9tQnVmZmVyQkUoa2V5Y2hhaW4uc2xpY2UoMCwgMzMpKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRGcm9tQnVmZmVyQkUoa2V5Y2hhaW4uc2xpY2UoMzMpKSxcbiAgICAgIH0sXG4gICAgICBwYXRoXG4gICAgKTtcblxuICAgIGNvbnN0IGRlcml2ZWRQayA9IGJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1YmxpY0tleWNoYWluLnBrLCAzMykudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGRlcml2ZWRDaGFpbmNvZGUgPSBiaWdJbnRUb0J1ZmZlckJFKGRlcml2ZWRQdWJsaWNLZXljaGFpbi5jaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICByZXR1cm4gZGVyaXZlZFBrICsgZGVyaXZlZENoYWluY29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgZ2l2ZW4gcmFuZ2UgcHJvb2YgY2hhbGxlbmdlIHRvIHRoZSBzaGFyZXMgcHJldmlvdXNseSBjcmVhdGVkXG4gICAqIGJ5ICNrZXlDb21iaW5lLiBHZW5lcmF0ZXMgYSBuZXcgY2hhbGxlbmdlIGlmIG5vdCBwcm92aWRlZC5cbiAgICogQHBhcmFtIHtYU2hhcmUgfCBZU2hhcmV9IHNoYXJlIFByaXZhdGUgeFNoYXJlIG9yIHlTaGFyZSBvZiB0aGUgc2lnbmluZyBvcGVyYXRpb25cbiAgICogQHBhcmFtIHJhbmdlUHJvb2ZDaGFsbGVuZ2UgLSBjaGFsbGVuZ2UgZ2VuZXJhdGVkIHZpYSBnZW5lcmF0ZU50aWxkZVxuICAgKiBAcGFyYW0gcGFpbGxpZXJQcm9vZkNoYWxsZW5nZVxuICAgKiBAcmV0dXJucyB7S2V5Q29tYmluZWR9IFRoZSBzaGFyZSB3aXRoIGFtZW5kZWQgY2hhbGxlbmdlIHZhbHVlc1xuICAgKi9cbiAgYXBwZW5kQ2hhbGxlbmdlPFQ+KFxuICAgIHNoYXJlOiBULFxuICAgIHJhbmdlUHJvb2ZDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSxcbiAgICBwYWlsbGllclByb29mQ2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWRQYWlsbGllckNoYWxsZW5nZVxuICApOiBUICYgRWNkc2FUeXBlcy5TZXJpYWxpemVkRWNkc2FDaGFsbGVuZ2VzIHtcbiAgICBjb25zdCB7IG50aWxkZSwgaDEsIGgyIH0gPSByYW5nZVByb29mQ2hhbGxlbmdlO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGFyZSxcbiAgICAgIG50aWxkZSxcbiAgICAgIGgxLFxuICAgICAgaDIsXG4gICAgICBwOiBwYWlsbGllclByb29mQ2hhbGxlbmdlLnAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgc2lnbmluZyBzaGFyZXMuXG4gICAqIEBwYXJhbSB7eFNoYXJlfSB4U2hhcmUgUHJpdmF0ZSB4U2hhcmUgb2YgY3VycmVudCBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICogQHBhcmFtIHtZU2hhcmV9IHlTaGFyZSB5U2hhcmUgY29ycmVzcG9uZGluZyB0byB0aGUgb3RoZXIgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqIEByZXR1cm5zIHtTaWduU2hhcmVSVH0gUmV0dXJucyB0aGUgcGFydGljaXBhbnQgcHJpdmF0ZSB3LXNoYXJlXG4gICAqIGFuZCBrLXNoYXJlIHRvIGJlIGRpc3RyaWJ1dGVkIHRvIG90aGVyIHBhcnRpY2lwYW50IHNpZ25lclxuICAgKi9cbiAgYXN5bmMgc2lnblNoYXJlKHhTaGFyZTogWFNoYXJlV2l0aENoYWxsZW5nZXMsIHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMpOiBQcm9taXNlPFNpZ25TaGFyZVJUPiB7XG4gICAgY29uc3QgcGsgPSBnZXRQYWlsbGllclB1YmxpY0tleShoZXhUb0JpZ0ludCh4U2hhcmUubikpO1xuXG4gICAgY29uc3QgayA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHJrID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGsubik7XG4gICAgY29uc3QgY2sgPSBway5lbmNyeXB0KGssIHJrKTtcbiAgICBjb25zdCBnYW1tYSA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuXG4gICAgY29uc3QgZCA9IEVjZHNhLmN1cnZlLnNjYWxhck11bHQoRWNkc2EuY3VydmUuc2NhbGFyU3ViKEJpZ0ludCh5U2hhcmUuaiksIEJpZ0ludCh4U2hhcmUuaSkpLCBCaWdJbnQoeFNoYXJlLmkpKTtcblxuICAgIGNvbnN0IHcgPSBbXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KEJpZ0ludCh5U2hhcmUuaiksIEJpZ0ludCh4U2hhcmUuaSkpLFxuICAgICAgaGV4VG9CaWdJbnQoeFNoYXJlWyd4J10pLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFySW52ZXJ0KGQpLFxuICAgIF0ucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhck11bHQpO1xuXG4gICAgY29uc3QgeyBudGlsZGU6IG50aWxkZWEsIGgxOiBoMWEsIGgyOiBoMmEgfSA9IHhTaGFyZTtcblxuICAgIGNvbnN0IHdTaGFyZTogV1NoYXJlID0ge1xuICAgICAgaTogeFNoYXJlLmksXG4gICAgICBsOiB4U2hhcmUubCxcbiAgICAgIG06IHhTaGFyZS5tLFxuICAgICAgbjogeFNoYXJlLm4sXG4gICAgICB5OiB4U2hhcmUueSxcbiAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgIGgxOiBoMWEsXG4gICAgICBoMjogaDJhLFxuICAgICAgcDogeFNoYXJlLnAsXG4gICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGssIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBjazogYmlnSW50VG9CdWZmZXJCRShjaywgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHcsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBnYW1tYTogYmlnSW50VG9CdWZmZXJCRShnYW1tYSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBudGlsZGU6IG50aWxkZWIsIGgxOiBoMWIsIGgyOiBoMmIgfSA9IHlTaGFyZTtcbiAgICBjb25zdCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZShcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IGhleFRvQmlnSW50KG50aWxkZWIpLFxuICAgICAgICBoMTogaGV4VG9CaWdJbnQoaDFiKSxcbiAgICAgICAgaDI6IGhleFRvQmlnSW50KGgyYiksXG4gICAgICB9LFxuICAgICAgY2ssXG4gICAgICBrLFxuICAgICAgcmtcbiAgICApO1xuXG4gICAgLy8gY3JlYXRlIHBhaWxsaWVyIGNoYWxsZW5nZSBwcm9vZiBiYXNlZCBvbiB0aGUgb3RoZXIgc2lnbmVycyBjaGFsbGVuZ2VcbiAgICAvLyBvbmx5IHNlbmQgc2lnbWEgaWYgd2UgYWxzbyBzZW5kIGNoYWxsZW5nZSBwXG4gICAgY29uc3Qgc2lnbWEgPSBFY2RzYVBhaWxsaWVyUHJvb2YucHJvdmUoXG4gICAgICBoZXhUb0JpZ0ludCh4U2hhcmUubiksXG4gICAgICBoZXhUb0JpZ0ludCh4U2hhcmUubCksXG4gICAgICBFY2RzYVR5cGVzLmRlc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2UoeyBwOiB5U2hhcmUucCB9KS5wXG4gICAgKTtcblxuICAgIGNvbnN0IHByb29mU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IGtTaGFyZTogS1NoYXJlID0ge1xuICAgICAgLy8gdGhpcyBzaGFyZSB3aWxsIGJlIHNlbnQgdG8gdGhlIG90aGVyIHBhcnRpY2lwYW50LFxuICAgICAgLy8gc28gd2UgbmVlZCB0byBzd2FwIHRoZSBpIGFuZCBqIHZhbHVlcyBoZXJlXG4gICAgICAvLyBzbyB0aGF0IHRoZXkga25vdyBpdCdzIHRoZWlyIGtTaGFyZSwgcHJvZHVjZWQgYnkgdXNcbiAgICAgIGk6IHlTaGFyZS5qLFxuICAgICAgajogeFNoYXJlLmksXG4gICAgICBuOiBway5uLnRvU3RyaW5nKDE2KSxcbiAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgIGgxOiBoMWEsXG4gICAgICBoMjogaDJhLFxuICAgICAgcDogeFNoYXJlLnAsXG4gICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHNpZ21hOiBFY2RzYVR5cGVzLnNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlUHJvb2ZzKHsgc2lnbWE6IHNpZ21hIH0pLnNpZ21hLFxuICAgICAgcHJvb2Y6IHByb29mU2hhcmUsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICB3U2hhcmUsXG4gICAgICBrU2hhcmUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyIHNpZ25lci5cbiAgICogQ29ubmVjdGlvbiAxLjIgaW4gaHR0cHM6Ly9sdWNpZC5hcHAvbHVjaWRjaGFydC83MDYxNzg1Yi1iYzVjLTQwMDItYjU0Ni0zZjRhMzYxMmZjNjIvZWRpdD9wYWdlPUlBVm12WU80RnZLYyNcbiAgICogSWYgc2lnbmVyIEEgY29tcGxldGVkIHNpZ25TaGFyZSBpbml0aWFsbHkgKGlucHV0IHRvIHRoaXMgZm4pLCB0aGVuIHRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgYnkgc2lnbmVyIEIuXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0U3RlcDEoc2hhcmVzOiBTaWduQ29udmVydFN0ZXAxKTogUHJvbWlzZTxTaWduQ29udmVydFN0ZXAxUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWNlaXZlZEtTaGFyZSA9IHNoYXJlcy5rU2hhcmU7XG4gICAgY29uc3QgeFNoYXJlID0gc2hhcmVzLnhTaGFyZTsgLy8gY3VycmVudFBhcnRpY2lwYW50IHNlY3JldCB4U2hhcmVcbiAgICBjb25zdCB5U2hhcmU6IFlTaGFyZVdpdGhDaGFsbGVuZ2VzID0ge1xuICAgICAgLi4uc2hhcmVzLnlTaGFyZSxcbiAgICAgIG50aWxkZTogcmVjZWl2ZWRLU2hhcmUubnRpbGRlLFxuICAgICAgaDE6IHJlY2VpdmVkS1NoYXJlLmgxLFxuICAgICAgaDI6IHJlY2VpdmVkS1NoYXJlLmgyLFxuICAgICAgcDogcmVjZWl2ZWRLU2hhcmUucCxcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25TaGFyZSA9IGF3YWl0IHRoaXMuc2lnblNoYXJlKHhTaGFyZSwgeVNoYXJlKTtcbiAgICBjb25zdCBzaGFyZVBhcnRpY2lwYW50ID0gc2lnblNoYXJlLndTaGFyZTtcblxuICAgIGlmIChzaGFyZVBhcnRpY2lwYW50LmkgIT09IHJlY2VpdmVkS1NoYXJlLmkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2hhcmVzIGZyb20gc2FtZSBwYXJ0aWNpcGFudCcpO1xuICAgIH1cbiAgICBpZiAoIXJlY2VpdmVkS1NoYXJlLnByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBwcm9vZiBvbiBhU2hhcmVUb0JlU2VudCcpO1xuICAgIH1cblxuICAgIC8vIHRoZSBvdGhlciBwYXJ0aWNpcGFudHMgcGFpbGxpZXIgcHVibGljIGtleVxuICAgIGNvbnN0IG4gPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5uKTtcbiAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShuKTtcbiAgICAvLyB0aGUgb3RoZXIgcGFydGljaXBhbnQncyByYW5nZSBwcm9vZiBjaGFsbGVuZ2VcbiAgICBjb25zdCBudGlsZGVhID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5oMSk7XG4gICAgY29uc3QgaDJhID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUuaDIpO1xuXG4gICAgLy8gdGhlIGN1cnJlbnQgcGFydGljaXBhbnQncyByYW5nZSBwcm9vZiBjaGFsbGVuZ2VcbiAgICBjb25zdCBudGlsZGViID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgIGNvbnN0IGgxYiA9IGhleFRvQmlnSW50KHNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgIGNvbnN0IGgyYiA9IGhleFRvQmlnSW50KHNoYXJlUGFydGljaXBhbnQuaDIpO1xuXG4gICAgY29uc3QgayA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLmspO1xuXG4gICAgLy8gdGhlIGN1cnJlbnQgcGFydGljaXBhbnRzIHBhaWxsaWVyIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IHNoYXJlUGFydGljaXBhbnRQYWlsbGllckNoYWxsZW5nZSA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7IHA6IHNoYXJlUGFydGljaXBhbnQucCB9KTtcbiAgICAvLyB0aGUgb3RoZXIgc2lnbmluZyBwYXJ0aWVzIHByb29mIHRvIHRoZSBjdXJyZW50IHBhcnRpY2lwYW50cyBwYWlsbGllciBwcm9vZiBjaGFsbGVuZ2VcbiAgICBjb25zdCByZWNlaXZlZFBhaWxsaWVyQ2hhbGxlbmdlUHJvb2YgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZnMoe1xuICAgICAgc2lnbWE6IHJlY2VpdmVkS1NoYXJlLnNpZ21hLFxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgICEoYXdhaXQgRWNkc2FQYWlsbGllclByb29mLnZlcmlmeShuLCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UucCwgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mLnNpZ21hKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcGFpbGxpZXIgcHJvb2YnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeShcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICBoMTogaDFiLFxuICAgICAgICAgIGgyOiBoMmIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi56KSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi51KSxcbiAgICAgICAgICB3OiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUucHJvb2YuczEpLFxuICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi5zMiksXG4gICAgICAgIH0sXG4gICAgICAgIGtcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICB9XG4gICAgLy8gTXRBICRrX2osIFxcZ2FtbWFfaSQuXG4gICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgY29uc3QgYmV0YSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShiZXRhMCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGcgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50LmdhbW1hKTtcbiAgICBjb25zdCByYiA9IGF3YWl0IHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHBrYS5uKTtcbiAgICBjb25zdCBjYiA9IHBrYS5lbmNyeXB0KGJldGEwLCByYik7XG4gICAgY29uc3QgYWxwaGEgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIGcpLCBjYik7XG4gICAgY29uc3QgYWxwaGFUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUoYWxwaGEsIEFMUEhBTVVTSVpFKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gUHJvdmUgJFxcZ2FtbWFfaSBcXGluIFpfe05eMn0kLlxuICAgIGNvbnN0IGd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnKTtcbiAgICBsZXQgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICBwa2EsXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgaDI6IGgyYSxcbiAgICAgIH0sXG4gICAgICBrLFxuICAgICAgYWxwaGEsXG4gICAgICBnLFxuICAgICAgYmV0YTAsXG4gICAgICByYixcbiAgICAgIGd4XG4gICAgKTtcbiAgICBjb25zdCBnYW1tYVByb29mVG9CZVNlbnQ6IFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRShneCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIC8vIE10QSAka19qLCB3X2kkLlxuICAgIGNvbnN0IG51MCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBudSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShudTApKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCB3ID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC53KTtcbiAgICBjb25zdCBybiA9IGF3YWl0IHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHBrYS5uKTtcbiAgICBjb25zdCBjbiA9IHBrYS5lbmNyeXB0KG51MCwgcm4pO1xuICAgIGNvbnN0IG11ID0gcGthLmFkZGl0aW9uKHBrYS5tdWx0aXBseShrLCB3KSwgY24pO1xuICAgIGNvbnN0IG11VG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKG11LCBBTFBIQU1VU0laRSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIFByb3ZlICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgIGNvbnN0IHd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh3KTtcbiAgICBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrYSxcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgfSxcbiAgICAgIGssXG4gICAgICBoZXhUb0JpZ0ludChtdVRvQmVTZW50KSxcbiAgICAgIHcsXG4gICAgICBudTAsXG4gICAgICBybixcbiAgICAgIHd4XG4gICAgKTtcbiAgICBjb25zdCB3UHJvb2ZUb0JlU2VudDogUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlID0ge1xuICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCBuVG9CZVNlbnQgPSBzaWduU2hhcmUua1NoYXJlLm47XG4gICAgY29uc3QgbnRpbGRlVG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGgxVG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKGgxYiwgMzg0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgaDJUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUoaDJiLCAzODQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBrVG9CZVNlbnQgPSBzaWduU2hhcmUua1NoYXJlLms7XG4gICAgY29uc3QgcHJvb2ZUb0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUucHJvb2Y7XG4gICAgY29uc3QgW2lUb0JlU2VudCwgalRvQmVTZW50XSA9IFtyZWNlaXZlZEtTaGFyZS5qLCByZWNlaXZlZEtTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgYVNoYXJlOiB7XG4gICAgICAgIGk6IGlUb0JlU2VudCxcbiAgICAgICAgajogalRvQmVTZW50LFxuICAgICAgICBudGlsZGU6IG50aWxkZVRvQmVTZW50LFxuICAgICAgICBoMTogaDFUb0JlU2VudCxcbiAgICAgICAgaDI6IGgyVG9CZVNlbnQsXG4gICAgICAgIG46IG5Ub0JlU2VudCxcbiAgICAgICAgazoga1RvQmVTZW50LFxuICAgICAgICBhbHBoYTogYWxwaGFUb0JlU2VudCxcbiAgICAgICAgbXU6IG11VG9CZVNlbnQsXG4gICAgICAgIHByb29mOiBwcm9vZlRvQmVTZW50LFxuICAgICAgICBnYW1tYVByb29mOiBnYW1tYVByb29mVG9CZVNlbnQsXG4gICAgICAgIHdQcm9vZjogd1Byb29mVG9CZVNlbnQsXG4gICAgICAgIC8vIHByb3ZpZGUgdGhlIHNoYXJlIHBhcnRpY2lwYW50cyBwcm9vZlxuICAgICAgICAvLyB0byB0aGUgcGFpbGxpZXIgY2hhbGxlbmdlIGluIHRoZSByZWNlaXZlZEtTaGFyZSBmcm9tIHRoZSBvdGhlciBzaWduZXJcbiAgICAgICAgc2lnbWE6IHNpZ25TaGFyZS5rU2hhcmUuc2lnbWEsXG4gICAgICB9LFxuICAgICAgYlNoYXJlOiB7XG4gICAgICAgIC4uLnNoYXJlUGFydGljaXBhbnQsXG4gICAgICAgIGJldGEsXG4gICAgICAgIG51LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXJcbiAgICogc2lnbmVyLlxuICAgKiBDb25uZWN0aW9uIDIuMSBpbiBodHRwczovL2x1Y2lkLmFwcC9sdWNpZGNoYXJ0LzcwNjE3ODViLWJjNWMtNDAwMi1iNTQ2LTNmNGEzNjEyZmM2Mi9lZGl0P3BhZ2U9SUFWbXZZTzRGdktjI1xuICAgKiBJZiBzaWduZXIgQiBjb21wbGV0ZWQgc2lnbkNvbnZlcnRTdGVwMSwgdGhlbiB0aGlzIHN0ZXAgaXMgY29tcGxldGVkIGJ5IHNpZ25lciBBLlxuICAgKiBAcGFyYW0ge1NpZ25Db252ZXJ0fSBzaGFyZXNcbiAgICogQHJldHVybnMge1NpZ25Db252ZXJ0UlR9XG4gICAqL1xuICBhc3luYyBzaWduQ29udmVydFN0ZXAyKHNoYXJlczogU2lnbkNvbnZlcnRTdGVwMik6IFByb21pc2U8U2lnbkNvbnZlcnRTdGVwMlJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVjZWl2ZWRBU2hhcmUgPSBzaGFyZXMuYVNoYXJlO1xuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3NpbmcgZ2FtbWFQcm9vZiBvbiBhU2hhcmVUb0JlU2VudCcpO1xuICAgIH1cbiAgICBpZiAoIXJlY2VpdmVkQVNoYXJlLndQcm9vZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3Npbmcgd1Byb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IG4gPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5uKTsgLy8gUGFpbGxpZXIgcHViIGZyb20gb3RoZXIgc2lnbmVyXG4gICAgLy8gY3VycmVudCBwYXJ0aWNpcGFudCBwdWJsaWMga2V5XG4gICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5uKSk7XG4gICAgY29uc3QgbnRpbGRlYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWEgPSBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLmgyKTtcbiAgICBjb25zdCBjayA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuY2spO1xuXG4gICAgY29uc3Qgc2hhcmVQYXJ0aWNpcGFudFBhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2hhcmVzLndTaGFyZS5wIH0pO1xuICAgIGNvbnN0IHJlY2VpdmVkUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZiA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZVByb29mcyh7XG4gICAgICBzaWdtYTogc2hhcmVzLmFTaGFyZS5zaWdtYSxcbiAgICB9KTtcbiAgICBpZiAoIUVjZHNhUGFpbGxpZXJQcm9vZi52ZXJpZnkobiwgc2hhcmVQYXJ0aWNpcGFudFBhaWxsaWVyQ2hhbGxlbmdlLnAsIHJlY2VpdmVkUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZi5zaWdtYSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaWduaW5nIHNoYXJlIGZvciBwYWlsbGllciBwcm9vZicpO1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgaWYgKFxuICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgejogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi56KSxcbiAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnpwcm0pLFxuICAgICAgICAgIHQ6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgdjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi52KSxcbiAgICAgICAgICB3OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgczE6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuczEpLFxuICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnMyKSxcbiAgICAgICAgICB0MTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgdDI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudDIpLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudSksXG4gICAgICAgIH0sXG4gICAgICAgIGNrLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5hbHBoYSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YueClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaWduaW5nIHNoYXJlIGZvciBnYW1tYSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBWZXJpZnkgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgaWYgKFxuICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgejogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi56cHJtKSxcbiAgICAgICAgICB0OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudCksXG4gICAgICAgICAgdjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YucyksXG4gICAgICAgICAgczE6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi5zMiksXG4gICAgICAgICAgdDE6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi50MSksXG4gICAgICAgICAgdDI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnUpLFxuICAgICAgICB9LFxuICAgICAgICBjayxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUubXUpLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YueClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaGFyZSBmb3Igd1Byb29mJyk7XG4gICAgfVxuICAgIGNvbnN0IHNrID0gbmV3IHBhaWxsaWVyQmlnaW50LlByaXZhdGVLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5sKSwgaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5tKSwgcGthKTtcblxuICAgIGNvbnN0IGdTaGFyZUFscGhhID0gYmlnSW50VG9CdWZmZXJCRShcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShzay5kZWNyeXB0KGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmFscGhhKSkpLFxuICAgICAgMzJcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IGdTaGFyZU11ID0gYmlnSW50VG9CdWZmZXJCRShcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShzay5kZWNyeXB0KGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLm11KSkpLCAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICAgIDMyXG4gICAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBpZiAoIXJlY2VpdmVkQVNoYXJlLnByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBwcm9vZiBvbiBhU2hhcmVUb0JlU2VudCcpO1xuICAgIH1cbiAgICBjb25zdCBwa2IgPSBnZXRQYWlsbGllclB1YmxpY0tleShuKTtcbiAgICBjb25zdCBudGlsZGViID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5oMSk7XG4gICAgY29uc3QgaDJiID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuaDIpO1xuICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5rKTtcbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeShcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYixcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi56KSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi51KSxcbiAgICAgICAgICB3OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUucHJvb2YuczEpLFxuICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi5zMiksXG4gICAgICAgIH0sXG4gICAgICAgIGtcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICB9XG4gICAgLy8gTXRBICRrX2osIFxcZ2FtbWFfaSQuXG4gICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgY29uc3QgZ1NoYXJlQmV0YSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShiZXRhMCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgZyA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuZ2FtbWEpO1xuICAgIGNvbnN0IHJiID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGtiLm4pO1xuICAgIGNvbnN0IGNiID0gcGtiLmVuY3J5cHQoYmV0YTAsIHJiKTtcbiAgICBjb25zdCBhbHBoYSA9IHBrYi5hZGRpdGlvbihwa2IubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICBjb25zdCBhbHBoYVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgQUxQSEFNVVNJWkUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3QgZ3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGcpO1xuICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrYixcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBudGlsZGViLFxuICAgICAgICBoMTogaDFiLFxuICAgICAgICBoMjogaDJiLFxuICAgICAgfSxcbiAgICAgIGssXG4gICAgICBhbHBoYSxcbiAgICAgIGcsXG4gICAgICBiZXRhMCxcbiAgICAgIHJiLFxuICAgICAgZ3hcbiAgICApO1xuICAgIGNvbnN0IGdhbW1hUHJvb2ZUb0JlU2VudDogUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlID0ge1xuICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgLy8gTXRBICRrX2osIHdfaSQuXG4gICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgIGNvbnN0IGdTaGFyZU51ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG51MCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLncpO1xuICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGtiLm4pO1xuICAgIGNvbnN0IGNuID0gcGtiLmVuY3J5cHQobnUwLCBybik7XG4gICAgY29uc3QgbXUgPSBwa2IuYWRkaXRpb24ocGtiLm11bHRpcGx5KGssIHcpLCBjbik7XG4gICAgY29uc3QgbXVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIEFMUEhBTVVTSVpFKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gUHJvdmUgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3Qgd3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHcpO1xuICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGtiLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWIsXG4gICAgICAgIGgxOiBoMWIsXG4gICAgICAgIGgyOiBoMmIsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGhleFRvQmlnSW50KG11VG9CZVNlbnQpLFxuICAgICAgdyxcbiAgICAgIG51MCxcbiAgICAgIHJuLFxuICAgICAgd3hcbiAgICApO1xuICAgIGNvbnN0IHdQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUod3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IFtpVG9CZVNlbnQsIGpUb0JlU2VudF0gPSBbcmVjZWl2ZWRBU2hhcmUuaiwgcmVjZWl2ZWRBU2hhcmUuaV07XG4gICAgcmV0dXJuIHtcbiAgICAgIG11U2hhcmU6IHtcbiAgICAgICAgaTogaVRvQmVTZW50LFxuICAgICAgICBqOiBqVG9CZVNlbnQsXG4gICAgICAgIGFscGhhOiBhbHBoYVRvQmVTZW50LFxuICAgICAgICBtdTogbXVUb0JlU2VudCxcbiAgICAgICAgZ2FtbWFQcm9vZjogZ2FtbWFQcm9vZlRvQmVTZW50LFxuICAgICAgICB3UHJvb2Y6IHdQcm9vZlRvQmVTZW50LFxuICAgICAgfSxcbiAgICAgIGdTaGFyZToge1xuICAgICAgICBpOiBzaGFyZXMud1NoYXJlLmksXG4gICAgICAgIG46IHNoYXJlcy53U2hhcmUubixcbiAgICAgICAgeTogc2hhcmVzLndTaGFyZS55LFxuICAgICAgICBrOiBzaGFyZXMud1NoYXJlLmssXG4gICAgICAgIHc6IHNoYXJlcy53U2hhcmUudyxcbiAgICAgICAgZ2FtbWE6IHNoYXJlcy53U2hhcmUuZ2FtbWEsXG4gICAgICAgIGFscGhhOiBnU2hhcmVBbHBoYSxcbiAgICAgICAgbXU6IGdTaGFyZU11LFxuICAgICAgICBiZXRhOiBnU2hhcmVCZXRhLFxuICAgICAgICBudTogZ1NoYXJlTnUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBtdWx0aXBsaWNpdGl2ZS10by1hZGRpdGl2ZSAoTXRBKSBzaGFyZSBjb252ZXJzaW9uIHdpdGggYW5vdGhlciBzaWduZXIuXG4gICAqIENvbm5lY3Rpb24gMi4yIGluIGh0dHBzOi8vbHVjaWQuYXBwL2x1Y2lkY2hhcnQvNzA2MTc4NWItYmM1Yy00MDAyLWI1NDYtM2Y0YTM2MTJmYzYyL2VkaXQ/cGFnZT1JQVZtdllPNEZ2S2MjXG4gICAqIElmIHNpZ25lciBBIGNvbXBsZXRlZCBzaWduQ29udmVydFN0ZXAyLCB0aGVuIHRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgYnkgc2lnbmVyIEIuXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0U3RlcDMoc2hhcmVzOiBTaWduQ29udmVydFN0ZXAzKTogUHJvbWlzZTxTaWduQ29udmVydFN0ZXAzUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWNlaXZlZE11U2hhcmUgPSBzaGFyZXMubXVTaGFyZTtcbiAgICBpZiAoIXJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRNdVNoYXJlLndQcm9vZikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3Npbmcgd1Byb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUubikpO1xuICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLm50aWxkZSk7XG4gICAgY29uc3QgaDFhID0gaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5oMSk7XG4gICAgY29uc3QgaDJhID0gaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5oMik7XG4gICAgY29uc3QgY2sgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmNrKTtcbiAgICAvLyBWZXJpZnkgJFxcZ2FtbWFfaSBcXGluIFpfe05eMn0kLlxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnpwcm0pLFxuICAgICAgICAgIHQ6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnQpLFxuICAgICAgICAgIHY6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnMyKSxcbiAgICAgICAgICB0MTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudDEpLFxuICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudSksXG4gICAgICAgIH0sXG4gICAgICAgIGNrLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuYWxwaGEpLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgfVxuICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5tdSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YueClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaGFyZSBmb3Igd1Byb29mJyk7XG4gICAgfVxuICAgIGNvbnN0IHNrID0gbmV3IHBhaWxsaWVyQmlnaW50LlByaXZhdGVLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5sKSwgaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5tKSwgcGthKTtcbiAgICBjb25zdCBhbHBoYSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmFscGhhKSk7XG4gICAgY29uc3QgZ1NoYXJlQWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShhbHBoYSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgbXUgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5tdSBhcyBzdHJpbmcpKTsgLy8gcmVjaGVjayBlbmNyeXB0ZWQgbnVtYmVyXG4gICAgY29uc3QgZ1NoYXJlTXUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShtdSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBbaVRvQmVTZW50LCBqVG9CZVNlbnRdID0gW3JlY2VpdmVkTXVTaGFyZS5qLCByZWNlaXZlZE11U2hhcmUuaV07XG4gICAgcmV0dXJuIHtcbiAgICAgIGdTaGFyZToge1xuICAgICAgICBpOiBzaGFyZXMuYlNoYXJlLmksXG4gICAgICAgIG46IHNoYXJlcy5iU2hhcmUubixcbiAgICAgICAgeTogc2hhcmVzLmJTaGFyZS55LFxuICAgICAgICBrOiBzaGFyZXMuYlNoYXJlLmssXG4gICAgICAgIHc6IHNoYXJlcy5iU2hhcmUudyxcbiAgICAgICAgZ2FtbWE6IHNoYXJlcy5iU2hhcmUuZ2FtbWEsXG4gICAgICAgIGFscGhhOiBnU2hhcmVBbHBoYSxcbiAgICAgICAgbXU6IGdTaGFyZU11LFxuICAgICAgICBiZXRhOiBzaGFyZXMuYlNoYXJlLmJldGEsXG4gICAgICAgIG51OiBzaGFyZXMuYlNoYXJlLm51LFxuICAgICAgfSxcbiAgICAgIHNpZ25JbmRleDoge1xuICAgICAgICBpOiBpVG9CZVNlbnQsXG4gICAgICAgIGo6IGpUb0JlU2VudCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyIHNpZ25lci5cbiAgICogQGRlcHJlY2F0ZWQgLSB1c2Ugb25lIG9mIFtzaWduQ29udmVydFN0ZXAxLCBzaWduQ29udmVydFN0ZXAyLCBzaWduQ29udmVydFN0ZXAzXSBpbnN0ZWFkXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0KHNoYXJlczogU2lnbkNvbnZlcnQpOiBQcm9taXNlPFNpZ25Db252ZXJ0UlQ+IHtcbiAgICBsZXQgc2hhcmVQYXJ0aWNpcGFudDogUGFydGlhbDxCU2hhcmU+IHwgUGFydGlhbDxHU2hhcmU+LCBzaGFyZVRvQmVTZW50OiBQYXJ0aWFsPEFTaGFyZT4gfCBNVVNoYXJlO1xuICAgIGxldCBpc0dhbW1hU2hhcmUgPSBmYWxzZTtcbiAgICBsZXQga1NoYXJlOiBQYXJ0aWFsPEtTaGFyZT4gPSB7fTtcbiAgICBpZiAoc2hhcmVzLnhTaGFyZSAmJiBzaGFyZXMueVNoYXJlICYmIHNoYXJlcy5rU2hhcmUpIHtcbiAgICAgIGNvbnN0IHhTaGFyZSA9IHNoYXJlcy54U2hhcmU7IC8vIGN1cnJlbnRQYXJ0aWNpcGFudCBzZWNyZXQgeFNoYXJlXG4gICAgICBjb25zdCB5U2hhcmU6IFlTaGFyZVdpdGhDaGFsbGVuZ2VzID0ge1xuICAgICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgICBudGlsZGU6IHNoYXJlcy5rU2hhcmUubnRpbGRlLFxuICAgICAgICBoMTogc2hhcmVzLmtTaGFyZS5oMSxcbiAgICAgICAgaDI6IHNoYXJlcy5rU2hhcmUuaDIsXG4gICAgICAgIHA6IHNoYXJlcy5rU2hhcmUucCxcbiAgICAgIH07XG4gICAgICBjb25zdCBzaWduU2hhcmUgPSBhd2FpdCB0aGlzLnNpZ25TaGFyZSh4U2hhcmUsIHlTaGFyZSk7XG4gICAgICBrU2hhcmUgPSBzaWduU2hhcmUua1NoYXJlO1xuICAgICAgc2hhcmVUb0JlU2VudCA9IHsgLi4uc2hhcmVzLmtTaGFyZSB9IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQgPSB7IC4uLnNpZ25TaGFyZS53U2hhcmUgfSBhcyBQYXJ0aWFsPEJTaGFyZT47XG4gICAgfSBlbHNlIGlmICgoc2hhcmVzLmJTaGFyZSAmJiBzaGFyZXMubXVTaGFyZSkgfHwgKHNoYXJlcy5hU2hhcmUgJiYgc2hhcmVzLndTaGFyZSkpIHtcbiAgICAgIGlzR2FtbWFTaGFyZSA9IHRydWU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0gc2hhcmVzLmFTaGFyZSA/ICh7IC4uLnNoYXJlcy5hU2hhcmUgfSBhcyBNVVNoYXJlKSA6ICh7IC4uLnNoYXJlcy5tdVNoYXJlIH0gYXMgTVVTaGFyZSk7XG4gICAgICBzaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVzLndTaGFyZSA/ICh7IC4uLnNoYXJlcy53U2hhcmUgfSBhcyBQYXJ0aWFsPEdTaGFyZT4pIDogKHsgLi4uc2hhcmVzLmJTaGFyZSB9IGFzIEdTaGFyZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25maWcgZm9yIFNpZ24gQ29udmVydCcpO1xuICAgIH1cbiAgICBpZiAoc2hhcmVQYXJ0aWNpcGFudC5pICE9PSBzaGFyZVRvQmVTZW50LmkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2hhcmVzIGZyb20gc2FtZSBwYXJ0aWNpcGFudCcpO1xuICAgIH1cbiAgICBpZiAoKHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlKS5hbHBoYSkge1xuICAgICAgY29uc3QgYlNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZTtcbiAgICAgIGNvbnN0IGFTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBBU2hhcmU7XG4gICAgICBpZiAoIWFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3NpbmcgZ2FtbWFQcm9vZiBvbiBhU2hhcmVUb0JlU2VudCcpO1xuICAgICAgfVxuICAgICAgaWYgKCFhU2hhcmVUb0JlU2VudC53UHJvb2YpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3Npbmcgd1Byb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5uKSk7XG4gICAgICBsZXQgbnRpbGRlYSwgaDFhLCBoMmEsIGNrO1xuICAgICAgaWYgKGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSkge1xuICAgICAgICBudGlsZGVhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKTtcbiAgICAgICAgaDFhID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgICAgICBoMmEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICAgIGNrID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuY2spO1xuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5ICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGlmIChcbiAgICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgICBwa2EsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnopLFxuICAgICAgICAgICAgenBybTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi56cHJtKSxcbiAgICAgICAgICAgIHQ6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgICB2OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnYpLFxuICAgICAgICAgICAgdzogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi53KSxcbiAgICAgICAgICAgIHM6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgICBzMjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zMiksXG4gICAgICAgICAgICB0MTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgICB0MjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2ssXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuYWxwaGEpLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YueClcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHZlcmlmeSBzaWduaW5nIHNoYXJlIGZvciBnYW1tYSBwcm9vZicpO1xuICAgICAgfVxuICAgICAgLy8gVmVyaWZ5ICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi56KSxcbiAgICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi56cHJtKSxcbiAgICAgICAgICAgIHQ6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50KSxcbiAgICAgICAgICAgIHY6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi52KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi53KSxcbiAgICAgICAgICAgIHM6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zKSxcbiAgICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zMiksXG4gICAgICAgICAgICB0MTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQxKSxcbiAgICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudDIpLFxuICAgICAgICAgICAgdTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2ssXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi54KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNrID0gbmV3IHBhaWxsaWVyQmlnaW50LlByaXZhdGVLZXkoXG4gICAgICAgIGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmwgYXMgc3RyaW5nKSxcbiAgICAgICAgaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubSBhcyBzdHJpbmcpLFxuICAgICAgICBwa2FcbiAgICAgICk7XG4gICAgICBjb25zdCBnU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgR1NoYXJlO1xuICAgICAgY29uc3QgbXVTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBNVVNoYXJlO1xuICAgICAgY29uc3QgYWxwaGEgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmFscGhhKSk7XG4gICAgICBnU2hhcmVQYXJ0aWNpcGFudC5hbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGFscGhhKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IG11ID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSBhcyBzdHJpbmcpKTsgLy8gcmVjaGVjayBlbmNyeXB0ZWQgbnVtYmVyXG4gICAgICBnU2hhcmVQYXJ0aWNpcGFudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG11KSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBQYXJ0aWFsPEdTaGFyZT47XG4gICAgICBjb25zdCBwYXJ0aWFsU2hhcmVUb0JlU2VudCA9IG11U2hhcmVUb0JlU2VudCBhcyBQYXJ0aWFsPE1VU2hhcmU+O1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lmw7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5hbHBoYTtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5tdTtcbiAgICB9XG4gICAgaWYgKChzaGFyZVRvQmVTZW50IGFzIEFTaGFyZSkuaykge1xuICAgICAgY29uc3QgYlNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZTtcbiAgICAgIGNvbnN0IGFTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBBU2hhcmU7XG4gICAgICBpZiAoIWFTaGFyZVRvQmVTZW50LnByb29mKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBuID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubik7IC8vIFBhaWxsaWVyIHB1YiBmcm9tIG90aGVyIHNpZ25lclxuICAgICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkobik7XG4gICAgICBjb25zdCBudGlsZGVhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubnRpbGRlKTtcbiAgICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmgxKTtcbiAgICAgIGNvbnN0IGgyYSA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmgyKTtcbiAgICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgICAgY29uc3QgaDFiID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDEpO1xuICAgICAgY29uc3QgaDJiID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuaDIpO1xuICAgICAgY29uc3QgayA9IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmspO1xuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeShcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWIsXG4gICAgICAgICAgICBoMTogaDFiLFxuICAgICAgICAgICAgaDI6IGgyYixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnopLFxuICAgICAgICAgICAgdTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YudSksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi53KSxcbiAgICAgICAgICAgIHM6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi5zMiksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBrXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBBIHNoYXJlIHByb29mJyk7XG4gICAgICB9XG4gICAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICAgIGNvbnN0IGJldGEwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgICAgYlNoYXJlUGFydGljaXBhbnQuYmV0YSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShiZXRhMCkpLCAzMikudG9TdHJpbmcoXG4gICAgICAgICdoZXgnXG4gICAgICApO1xuICAgICAgY29uc3QgZyA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmdhbW1hKTtcbiAgICAgIGNvbnN0IHJiID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY2IgPSBwa2EuZW5jcnlwdChiZXRhMCwgcmIpO1xuICAgICAgY29uc3QgYWxwaGEgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIGcpLCBjYik7XG4gICAgICBhU2hhcmVUb0JlU2VudC5hbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoYWxwaGEsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBjb25zdCBneCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZyk7XG4gICAgICBsZXQgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICBrLFxuICAgICAgICBhbHBoYSxcbiAgICAgICAgZyxcbiAgICAgICAgYmV0YTAsXG4gICAgICAgIHJiLFxuICAgICAgICBneFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oYVNoYXJlVG9CZVNlbnQsIHtcbiAgICAgICAgZ2FtbWFQcm9vZjoge1xuICAgICAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvLyBNdEEgJGtfaiwgd19pJC5cbiAgICAgIGNvbnN0IG51MCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQubnUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobnUwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCB3ID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQudyk7XG4gICAgICBjb25zdCBybiA9IGF3YWl0IHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHBrYS5uKTtcbiAgICAgIGNvbnN0IGNuID0gcGthLmVuY3J5cHQobnUwLCBybik7XG4gICAgICBjb25zdCBtdSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgdyksIGNuKTtcbiAgICAgIHNoYXJlVG9CZVNlbnQubXUgPSBiaWdJbnRUb0J1ZmZlckJFKG11LCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgLy8gUHJvdmUgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBjb25zdCB3eCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQodyk7XG4gICAgICBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIGssXG4gICAgICAgIGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11KSxcbiAgICAgICAgdyxcbiAgICAgICAgbnUwLFxuICAgICAgICBybixcbiAgICAgICAgd3hcbiAgICAgICk7XG4gICAgICBPYmplY3QuYXNzaWduKHNoYXJlVG9CZVNlbnQsIHtcbiAgICAgICAgd1Byb29mOiB7XG4gICAgICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUod3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmICgoc2hhcmVQYXJ0aWNpcGFudCBhcyBHU2hhcmUpLmFscGhhKSB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBQYXJ0aWFsPEJTaGFyZT47XG4gICAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBQYXJ0aWFsPEFTaGFyZT47XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5udGlsZGU7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5oMTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgyO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuY2s7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5uO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQubnRpbGRlO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaDE7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5oMjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lms7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5wcm9vZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2hhcmVUb0JlU2VudCwge1xuICAgICAgICAgIG46IGtTaGFyZS5uLFxuICAgICAgICAgIG50aWxkZTogYmlnSW50VG9CdWZmZXJCRShudGlsZGViLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBoMTogYmlnSW50VG9CdWZmZXJCRShoMWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGgyOiBiaWdJbnRUb0J1ZmZlckJFKGgyYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgazoga1NoYXJlLmssXG4gICAgICAgICAgcHJvb2Y6IGtTaGFyZS5wcm9vZixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghKCdhbHBoYScgaW4gc2hhcmVUb0JlU2VudCkgJiYgISgnaycgaW4gc2hhcmVUb0JlU2VudCkpIHtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBQYXJ0aWFsPEJTaGFyZT47XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubnRpbGRlO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgxO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgyO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmNrO1xuICAgICAgY29uc3QgbXVTaGFyZVRvQmVTZW50ID0gc2hhcmVUb0JlU2VudCBhcyBNVVNoYXJlO1xuICAgICAgc2hhcmVUb0JlU2VudCA9IHtcbiAgICAgICAgaTogbXVTaGFyZVRvQmVTZW50LmksXG4gICAgICAgIGo6IG11U2hhcmVUb0JlU2VudC5qLFxuICAgICAgfSBhcyBNVVNoYXJlO1xuICAgIH1cbiAgICBbc2hhcmVUb0JlU2VudC5pLCBzaGFyZVRvQmVTZW50LmpdID0gW3NoYXJlVG9CZVNlbnQuaiwgc2hhcmVUb0JlU2VudC5pXTtcbiAgICBpZiAoaXNHYW1tYVNoYXJlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtdVNoYXJlOiBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmUsXG4gICAgICAgIGdTaGFyZTogc2hhcmVQYXJ0aWNpcGFudCBhcyBHU2hhcmUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYVNoYXJlOiBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZSxcbiAgICAgIGJTaGFyZTogc2hhcmVQYXJ0aWNpcGFudCBhcyBCU2hhcmUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21iaW5lIGdhbW1hIHNoYXJlcyB0byBnZXQgdGhlIHByaXZhdGUgb21pY3JvbiAvIGRlbHRhIHNoYXJlc1xuICAgKiBAcGFyYW0ge1NpZ25Db21iaW5lfSBzaGFyZXNcbiAgICogQHJldHVybnMge1NpZ25Db21iaW5lUlR9XG4gICAqL1xuICBzaWduQ29tYmluZShzaGFyZXM6IFNpZ25Db21iaW5lKTogU2lnbkNvbWJpbmVSVCB7XG4gICAgY29uc3QgZ1NoYXJlID0gc2hhcmVzLmdTaGFyZTtcbiAgICBjb25zdCBTID0gc2hhcmVzLnNpZ25JbmRleDtcbiAgICBjb25zdCBnYW1tYSA9IGhleFRvQmlnSW50KGdTaGFyZS5nYW1tYSk7XG4gICAgY29uc3QgYWxwaGEgPSBoZXhUb0JpZ0ludChnU2hhcmUuYWxwaGEpO1xuICAgIGNvbnN0IGJldGEgPSBoZXhUb0JpZ0ludChnU2hhcmUuYmV0YSk7XG4gICAgY29uc3QgbXUgPSBoZXhUb0JpZ0ludChnU2hhcmUubXUpO1xuICAgIGNvbnN0IG51ID0gaGV4VG9CaWdJbnQoZ1NoYXJlLm51KTtcbiAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmspO1xuICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChnU2hhcmUudyk7XG5cbiAgICBjb25zdCBkZWx0YSA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KGssIGdhbW1hKSwgRWNkc2EuY3VydmUuc2NhbGFyQWRkKGFscGhhLCBiZXRhKSk7XG4gICAgY29uc3Qgb21pY3JvbiA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KGssIHcpLCBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQobXUsIG51KSk7XG4gICAgY29uc3QgR2FtbWEgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGdhbW1hKTtcblxuICAgIHJldHVybiB7XG4gICAgICBvU2hhcmU6IHtcbiAgICAgICAgaTogZ1NoYXJlLmksXG4gICAgICAgIHk6IGdTaGFyZS55LFxuICAgICAgICBrOiBiaWdJbnRUb0J1ZmZlckJFKGssIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIG9taWNyb246IGJpZ0ludFRvQnVmZmVyQkUob21pY3JvbiwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgZGVsdGE6IGJpZ0ludFRvQnVmZmVyQkUoZGVsdGEsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIEdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKEdhbW1hLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfSxcbiAgICAgIGRTaGFyZToge1xuICAgICAgICBpOiBTLmksXG4gICAgICAgIGo6IGdTaGFyZS5pLFxuICAgICAgICBkZWx0YTogYmlnSW50VG9CdWZmZXJCRShkZWx0YSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgR2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoR2FtbWEsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBNIE1lc3NhZ2UgdG8gYmUgc2lnbmVkXG4gICAqIEBwYXJhbSB7T1NoYXJlfSBvU2hhcmUgcHJpdmF0ZSBvbWljcm9uIHNoYXJlIG9mIGN1cnJlbnQgcGFydGljaXBhbnRcbiAgICogQHBhcmFtIHtEU2hhcmV9IGRTaGFyZSBkZWx0YSBzaGFyZSByZWNlaXZlZCBmcm9tIHRoZSBvdGhlciBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge0hhc2h9IGhhc2ggaGFzaGluZyBhbGdvcml0aG0gaW1wbGVtZW50aW5nIE5vZGVgcyBzdGFuZGFyZCBjcnlwdG8gaGFzaCBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHNob3VsZEhhc2ggaWYgdHJ1ZSwgd2UgaGFzaCB0aGUgcHJvdmlkZWQgYnVmZmVyIGJlZm9yZSBzaWduaW5nLiBJZiBmYWxzZSwgTSBtdXN0IGJlIGV4YWN0bHkgMzIgYnl0ZXMgKGEgaGFzaCkuXG4gICAqIEByZXR1cm5zIHtWQVNoYXJlfVxuICAgKi9cbiAgc2lnbihNOiBCdWZmZXIsIG9TaGFyZTogT1NoYXJlLCBkU2hhcmU6IERTaGFyZSwgaGFzaD86IEhhc2gsIHNob3VsZEhhc2ggPSB0cnVlKTogVkFTaGFyZSB7XG4gICAgaWYgKCFzaG91bGRIYXNoICYmIE0ubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaGVuIHNob3VsZEhhc2g9ZmFsc2UsIG1lc3NhZ2UgbXVzdCBiZSBleGFjdGx5IDMyIGJ5dGVzIChhIGhhc2gpLCBidXQgZ290ICR7TS5sZW5ndGh9IGJ5dGVzYCk7XG4gICAgfVxuICAgIGNvbnN0IG0gPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShNKS5kaWdlc3QoKSA6IE07XG5cbiAgICBjb25zdCBkZWx0YSA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChoZXhUb0JpZ0ludChvU2hhcmUuZGVsdGEpLCBoZXhUb0JpZ0ludChkU2hhcmUuZGVsdGEpKTtcblxuICAgIGNvbnN0IFIgPSBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KFxuICAgICAgRWNkc2EuY3VydmUucG9pbnRBZGQoaGV4VG9CaWdJbnQob1NoYXJlLkdhbW1hKSwgaGV4VG9CaWdJbnQoZFNoYXJlLkdhbW1hKSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJJbnZlcnQoZGVsdGEpXG4gICAgKTtcbiAgICBjb25zdCBwb2ludFIgPSBzZWNwLlByb2plY3RpdmVQb2ludC5mcm9tSGV4KGJpZ0ludFRvQnVmZmVyQkUoUiwgMzIpKTtcbiAgICBjb25zdCByID0gcG9pbnRSLng7XG5cbiAgICBjb25zdCBzID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChiaWdJbnRGcm9tVThBQkUobSksIGhleFRvQmlnSW50KG9TaGFyZS5rKSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KHIsIGhleFRvQmlnSW50KG9TaGFyZS5vbWljcm9uKSlcbiAgICApO1xuXG4gICAgY29uc3QgbCA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHJobyA9IEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IFYgPSBFY2RzYS5jdXJ2ZS5wb2ludEFkZChFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KFIsIHMpLCBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGwpKTtcbiAgICBjb25zdCBBID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChyaG8pO1xuXG4gICAgY29uc3QgY29tRGVjb21fVl9BID0gSGFzaENvbW1pdG1lbnQuY3JlYXRlQ29tbWl0bWVudChcbiAgICAgIEJ1ZmZlci5jb25jYXQoW2JpZ0ludFRvQnVmZmVyQkUoViwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksIGJpZ0ludFRvQnVmZmVyQkUoQSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyldKVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaTogb1NoYXJlLmksXG4gICAgICB5OiBvU2hhcmUueSxcbiAgICAgIFI6IHBvaW50Ui50b0hleCh0cnVlKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIG06IG0sXG4gICAgICBsOiBsLFxuICAgICAgcmhvOiByaG8sXG4gICAgICBWOiBWLFxuICAgICAgQTogQSxcbiAgICAgIGNvbURlY29tVkE6IGNvbURlY29tX1ZfQSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHByb29mcyBvZiBWX2kgYW5kIEFfaSB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBNIE1lc3NhZ2UgdG8gY29tbWl0IHRvIGFzIHBhcnQgb2YgdGhlIGNvbnRleHQgb2YgdGhlIHByb29mLlxuICAgKiAgICBUaGlzIGRvZXNuJ3QgbmVlZCB0byBiZSB0aGUgc2FtZSBtZXNzYWdlIHRoYXQgd2FzIHNpZ25lZCBpbiB0aGUgc2lnbiBmdW5jdGlvbiBhYm92ZS5cbiAgICogICAgQnV0IGl0IHNob3VsZCBiZSB0aGUgc2FtZSBmb3IgYWxsIHBhcnRpY2lwYW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIHByb29mIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7VkFTaGFyZX0gdmFTaGFyZSBUaGUgVkFTaGFyZSB0byBwcm92ZS5cbiAgICogQHJldHVybnMge1ZBU2hhcmVXaXRoUHJvb2ZzfVxuICAgKi9cbiAgZ2VuZXJhdGVWQVByb29mcyhNOiBCdWZmZXIsIHZhU2hhcmU6IFZBU2hhcmUpOiBWQVNoYXJlV2l0aFByb29mcyB7XG4gICAgY29uc3QgcyA9IGhleFRvQmlnSW50KHZhU2hhcmUucyk7XG4gICAgY29uc3QgUiA9IGJpZ0ludEZyb21VOEFCRShzZWNwLlByb2plY3RpdmVQb2ludC5mcm9tSGV4KHZhU2hhcmUuUikudG9SYXdCeXRlcyh0cnVlKSk7XG5cbiAgICBjb25zdCBwcm9vZkNvbnRleHQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoTSkudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoUiwgRWNkc2EuY3VydmUucG9pbnRCeXRlcykpLmRpZ2VzdCgpO1xuXG4gICAgY29uc3QgemtWUHJvb2YgPSBFY2RzYVprVlByb29mLmNyZWF0ZVprVlByb29mKHZhU2hhcmUuViwgcywgdmFTaGFyZS5sLCBSLCBFY2RzYS5jdXJ2ZSwgcHJvb2ZDb250ZXh0KTtcbiAgICBjb25zdCBzY2hub3JyUHJvb2YgPSBTY2hub3JyLmNyZWF0ZVNjaG5vcnJQcm9vZih2YVNoYXJlLkEsIHZhU2hhcmUucmhvLCBFY2RzYS5jdXJ2ZSwgcHJvb2ZDb250ZXh0KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi52YVNoYXJlLFxuICAgICAgcHJvb2ZDb250ZXh0OiBwcm9vZkNvbnRleHQsXG4gICAgICB6a1ZQcm9vZlY6IHprVlByb29mLFxuICAgICAgc2Nobm9yclByb29mQTogc2Nobm9yclByb29mLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IFZfaSBhbmQgQV9pIHZhbHVlcyBvZiBhbGwgb3RoZXIgcGFydGljaXBhbnRzIGR1cmluZyBzaWduaW5nIHBoYXNlIDUgc3RlcHMgNUEgYW5kIDVCLlxuICAgKiBAcGFyYW0ge1ZBU2hhcmVXaXRoUHJvb2ZzfSB2YVNoYXJlIFZfaSwgQV9pIGluZm8gaW5jbHVkaW5nIFNTaGFyZSB2YWx1ZXMgb2YgdGhlIGN1cnJlbmN0IHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7UHVibGljVkFTaGFyZVdpdGhQcm9vZnNbXX0gcHVibGljVkFTaGFyZXMgcHVibGljIFZfaSwgQV9pIGluZm8gb2YgYWxsIG90aGVyIHBhcnRpY2lwYW50c1xuICAgKiBAcmV0dXJucyB7VVRTaGFyZX0gVV9pLCBUX2kgaW5mbyBvZiB0aGUgY3VycmVudCBwYXJ0aWNpcGFudCBpZiBhbGwgdmVyaWZpY2F0aW9ucyBwYXNzXG4gICAqL1xuICB2ZXJpZnlWQVNoYXJlcyh2YVNoYXJlOiBWQVNoYXJlV2l0aFByb29mcywgcHVibGljVkFTaGFyZXM6IFB1YmxpY1ZBU2hhcmVXaXRoUHJvb2ZzW10pOiBVVFNoYXJlIHtcbiAgICBwdWJsaWNWQVNoYXJlcy5mb3JFYWNoKChwdWJsaWNWQVNoYXJlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFIYXNoQ29tbWl0bWVudC52ZXJpZnlDb21taXRtZW50KHB1YmxpY1ZBU2hhcmUuY29tRGVjb21WQS5jb21taXRtZW50LCB7XG4gICAgICAgICAgc2VjcmV0OiBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgICAgIGJpZ0ludFRvQnVmZmVyQkUocHVibGljVkFTaGFyZS5WLCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSxcbiAgICAgICAgICAgIGJpZ0ludFRvQnVmZmVyQkUocHVibGljVkFTaGFyZS5BLCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBibGluZGluZ0ZhY3RvcjogcHVibGljVkFTaGFyZS5jb21EZWNvbVZBLmRlY29tbWl0bWVudC5ibGluZGluZ0ZhY3RvcixcbiAgICAgICAgfSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB2ZXJpZnkgY29tbWl0bWVudCBvZiBWX2kgYW5kIEFfaScpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhU2Nobm9yci52ZXJpZnlTY2hub3JyUHJvb2YocHVibGljVkFTaGFyZS5BLCBwdWJsaWNWQVNoYXJlLnNjaG5vcnJQcm9vZkEsIEVjZHNhLmN1cnZlLCB2YVNoYXJlLnByb29mQ29udGV4dClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB2ZXJpZnkgU2Nobm9yciBwcm9vZiBvZiBBX2knKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIUVjZHNhWmtWUHJvb2YudmVyaWZ5WmtWUHJvb2YoXG4gICAgICAgICAgcHVibGljVkFTaGFyZS5WLFxuICAgICAgICAgIHB1YmxpY1ZBU2hhcmUuemtWUHJvb2ZWLFxuICAgICAgICAgIGhleFRvQmlnSW50KHZhU2hhcmUuUiksXG4gICAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgICAgdmFTaGFyZS5wcm9vZkNvbnRleHRcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBaSyBwcm9vZiBvZiBWX2knKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHkgPSBoZXhUb0JpZ0ludCh2YVNoYXJlLnkpO1xuICAgIC8vIHIgaXMgUidzIHggY29vcmRpbmF0ZS4gIFIgaXMgaW4gY29tcHJlc3NlZCBmb3JtLCBzbyB3ZSBuZWVkIHRvIHNsaWNlIG9mZiB0aGUgZmlyc3QgYnl0ZS5cbiAgICBjb25zdCByID0gaGV4VG9CaWdJbnQodmFTaGFyZS5SLnNsaWNlKDIpKTtcblxuICAgIC8vIENhbGN1bGF0ZSBhZ2dyZWdhdGlvbiBvZiBhbGwgVl9pIGFuZCBBX2kuXG4gICAgbGV0IFYgPSBFY2RzYS5jdXJ2ZS5wb2ludEFkZChcbiAgICAgIEVjZHNhLmN1cnZlLnBvaW50QWRkKFxuICAgICAgICBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShiaWdJbnRGcm9tVThBQkUodmFTaGFyZS5tKSkpLFxuICAgICAgICBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KHksIEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShyKSlcbiAgICAgICksXG4gICAgICB2YVNoYXJlLlZcbiAgICApO1xuICAgIGxldCBBID0gdmFTaGFyZS5BO1xuICAgIHB1YmxpY1ZBU2hhcmVzLmZvckVhY2goKHB1YmxpY1ZBU2hhcmUpID0+IHtcbiAgICAgIFYgPSBFY2RzYS5jdXJ2ZS5wb2ludEFkZChWLCBwdWJsaWNWQVNoYXJlLlYpO1xuICAgICAgQSA9IEVjZHNhLmN1cnZlLnBvaW50QWRkKEEsIHB1YmxpY1ZBU2hhcmUuQSk7XG4gICAgfSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgVV9pID0gcmhvX2kgKiBWIGFuZCBUX2kgPSBsX2kgKiBBLlxuICAgIGNvbnN0IFUgPSBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KFYsIHZhU2hhcmUucmhvKTtcbiAgICBjb25zdCBUID0gRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShBLCB2YVNoYXJlLmwpO1xuICAgIGNvbnN0IGNvbURlY29tX1VfVCA9IEhhc2hDb21taXRtZW50LmNyZWF0ZUNvbW1pdG1lbnQoXG4gICAgICBCdWZmZXIuY29uY2F0KFtiaWdJbnRUb0J1ZmZlckJFKFUsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpLCBiaWdJbnRUb0J1ZmZlckJFKFQsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpXSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhU2hhcmUsXG4gICAgICBVLFxuICAgICAgVCxcbiAgICAgIGNvbURlY29tVVQ6IGNvbURlY29tX1VfVCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBVX2kgYW5kIFZfaSB2YWx1ZXMgb2YgYWxsIG90aGVyIHBhcnRpY2lwYW50cyBkdXJpbmcgc2lnbmluZyBwaGFzZSA1IHN0ZXBzIDVDIGFuZCA1RC5cbiAgICogQHBhcmFtIHtVVFNoYXJlfSB1dFNoYXJlIFVfaSwgVF9pIGluZm8gaW5jbHVkaW5nIFNTaGFyZSB2YWx1ZXMgb2YgdGhlIGN1cnJlbmN0IHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7UHVibGljVVRTaGFyZVtdfSBwdWJsaWNVVFNoYXJlcyBwdWJsaWMgVV9pLCBUX2kgaW5mbyBvZiBhbGwgb3RoZXIgcGFydGljaXBhbnRzXG4gICAqIEByZXR1cm5zIHtTU2hhcmV9IFNTaGFyZSBvZiB0aGUgY3VycmVudCBwYXJ0aWNpcGFudCBpZiBhbGwgdmVyaWZpY2F0aW9ucyBwYXNzXG4gICAqL1xuICB2ZXJpZnlVVFNoYXJlcyh1dFNoYXJlOiBVVFNoYXJlLCBwdWJsaWNVVFNoYXJlczogUHVibGljVVRTaGFyZVtdKTogU1NoYXJlIHtcbiAgICBsZXQgc2lnbWFVID0gdXRTaGFyZS5VO1xuICAgIGxldCBzaWdtYVQgPSB1dFNoYXJlLlQ7XG5cbiAgICBwdWJsaWNVVFNoYXJlcy5mb3JFYWNoKChwdWJsaWNVVFNoYXJlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgICFIYXNoQ29tbWl0bWVudC52ZXJpZnlDb21taXRtZW50KHB1YmxpY1VUU2hhcmUuY29tRGVjb21VVC5jb21taXRtZW50LCB7XG4gICAgICAgICAgc2VjcmV0OiBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgICAgIGJpZ0ludFRvQnVmZmVyQkUocHVibGljVVRTaGFyZS5VLCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSxcbiAgICAgICAgICAgIGJpZ0ludFRvQnVmZmVyQkUocHVibGljVVRTaGFyZS5ULCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBibGluZGluZ0ZhY3RvcjogcHVibGljVVRTaGFyZS5jb21EZWNvbVVULmRlY29tbWl0bWVudC5ibGluZGluZ0ZhY3RvcixcbiAgICAgICAgfSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB2ZXJpZnkgY29tbWl0bWVudCBvZiBVX2kgYW5kIFRfaScpO1xuICAgICAgfVxuXG4gICAgICBzaWdtYVUgPSBFY2RzYS5jdXJ2ZS5wb2ludEFkZChzaWdtYVUsIHB1YmxpY1VUU2hhcmUuVSk7XG4gICAgICBzaWdtYVQgPSBFY2RzYS5jdXJ2ZS5wb2ludEFkZChzaWdtYVQsIHB1YmxpY1VUU2hhcmUuVCk7XG4gICAgfSk7XG5cbiAgICBpZiAoc2lnbWFVICE9PSBzaWdtYVQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3VtIG9mIGFsbCBVX2kgZG9lcyBub3QgbWF0Y2ggc3VtIG9mIGFsbCBUX2knKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi51dFNoYXJlIH07XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0IGZ1bGwgc2lnbmF0dXJlIGJ5IGNvbWJpbmluZyBTaWduIFNoYXJlc1xuICAgKiBAcGFyYW0ge1NTaGFyZVtdfSBzaGFyZXNcbiAgICogQHJldHVybnMge1NpZ25hdHVyZX1cbiAgICovXG4gIGNvbnN0cnVjdFNpZ25hdHVyZShzaGFyZXM6IFNTaGFyZVtdKTogU2lnbmF0dXJlIHtcbiAgICAvLyBFdmVyeSBSIG11c3QgbWF0Y2guXG4gICAgY29uc3QgUiA9IHNoYXJlc1swXVsnUiddO1xuICAgIGNvbnN0IGlzUk1hdGNoaW5nID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IHNoYXJlWydSJ10gPT09IFIpLnJlZHVjZSgoYSwgYikgPT4gYSAmJiBiKTtcbiAgICBpZiAoIWlzUk1hdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1IgdmFsdWUgc2hvdWxkIGJlIGNvbnNpc3RlbnQgYWNyb3NzIGFsbCBzaGFyZXMnKTtcbiAgICB9XG5cbiAgICBsZXQgcyA9IHNoYXJlcy5tYXAoKHNoYXJlKSA9PiBoZXhUb0JpZ0ludChzaGFyZVsncyddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG4gICAgY29uc3QgcmVjaWQgPSAoUi5zbGljZSgwLCAyKSA9PT0gJzAzJyA/IDEgOiAwKSBeIChzID4gRWNkc2EuY3VydmUub3JkZXIoKSAvIEJpZ0ludCgyKSA/IDEgOiAwKTtcblxuICAgIC8vIE5vcm1hbGl6ZSBzLlxuICAgIHMgPSBzID4gRWNkc2EuY3VydmUub3JkZXIoKSAvIEJpZ0ludCgyKSA/IEVjZHNhLmN1cnZlLm9yZGVyKCkgLSBzIDogcztcbiAgICByZXR1cm4ge1xuICAgICAgeTogc2hhcmVzWzBdWyd5J10sXG4gICAgICByOiBSLnNsaWNlKDIpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShzLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgcmVjaWQ6IHJlY2lkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IGVjZHNhIHNpZ25hdHVyZXNcbiAgICogQHBhcmFtIHtCdWZmZXJ9IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtTaWduYXR1cmUgfSBzaWduYXR1cmVcbiAgICogQHBhcmFtIHtIYXNofSBoYXNoIGhhc2hpbmcgYWxnb3JpdGhtIGltcGxlbWVudGluZyBOb2RlYHMgc3RhbmRhcmQgY3J5cHRvIGhhc2ggaW50ZXJmYWNlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkSGFzaCBpZiB0cnVlLCB3ZSBoYXNoIHRoZSBwcm92aWRlZCBidWZmZXIgYmVmb3JlIHZlcmlmeWluZy4gSWYgZmFsc2UsIG1lc3NhZ2UgbXVzdCBiZSBleGFjdGx5IDMyIGJ5dGVzIChhIGhhc2gpLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBzaWduYXR1cmUgaXMgdmFsaWQ7IEZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgdmVyaWZ5KG1lc3NhZ2U6IEJ1ZmZlciwgc2lnbmF0dXJlOiBTaWduYXR1cmUsIGhhc2g/OiBIYXNoLCBzaG91bGRIYXNoID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghc2hvdWxkSGFzaCAmJiBtZXNzYWdlLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFdoZW4gc2hvdWxkSGFzaD1mYWxzZSwgbWVzc2FnZSBtdXN0IGJlIGV4YWN0bHkgMzIgYnl0ZXMgKGEgaGFzaCksIGJ1dCBnb3QgJHttZXNzYWdlLmxlbmd0aH0gYnl0ZXNgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlVG9WZXJpZnkgPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKSA6IG1lc3NhZ2U7XG4gICAgcmV0dXJuIEVjZHNhLmN1cnZlLnZlcmlmeShcbiAgICAgIG1lc3NhZ2VUb1ZlcmlmeSxcbiAgICAgIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBCdWZmZXIuZnJvbShbc2lnbmF0dXJlWydyZWNpZCddXSksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydyJ10pLCAzMiksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydzJ10pLCAzMiksXG4gICAgICBdKSxcbiAgICAgIGhleFRvQmlnSW50KHNpZ25hdHVyZVsneSddKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGhleCBzdHJpbmdzIHRvIGJpZ2ludFxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2RrLWxpYi1tcGMgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUpOiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZSB7XG4gICAgcmV0dXJuIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGJpZyBpbnQgdG8gaGV4IHN0cmluZ3MuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZGstbGliLW1wYyBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlIGluc3RlYWRcbiAgICogQHBhcmFtIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuRGVzZXJpYWxpemVkTnRpbGRlKTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlIHtcbiAgICByZXR1cm4gRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxufVxuIl19