@bitgo-beta/sdk-coin-dot 2.2.8-beta.183 → 2.2.8-beta.1831

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 (292) hide show
  1. package/dist/{src → cjs/src}/dot.d.ts +8 -19
  2. package/dist/cjs/src/dot.d.ts.map +1 -0
  3. package/dist/cjs/src/dot.js +623 -0
  4. package/dist/cjs/src/index.d.ts.map +1 -0
  5. package/dist/{src → cjs/src}/index.js +6 -2
  6. package/dist/cjs/src/lib/addressInitializationBuilder.d.ts.map +1 -0
  7. package/dist/cjs/src/lib/addressInitializationBuilder.js +182 -0
  8. package/dist/{src → cjs/src}/lib/batchTransactionBuilder.d.ts +1 -0
  9. package/dist/cjs/src/lib/batchTransactionBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/batchTransactionBuilder.js +229 -0
  11. package/dist/cjs/src/lib/claimBuilder.d.ts.map +1 -0
  12. package/dist/cjs/src/lib/claimBuilder.js +117 -0
  13. package/dist/cjs/src/lib/errors.d.ts.map +1 -0
  14. package/dist/cjs/src/lib/errors.js +19 -0
  15. package/dist/{src → cjs/src}/lib/iface.d.ts +16 -13
  16. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/iface.js +128 -0
  18. package/dist/cjs/src/lib/iface_utils.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/iface_utils.js +92 -0
  20. package/dist/{src → cjs/src}/lib/index.d.ts +2 -0
  21. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/index.js +73 -0
  23. package/dist/{src → cjs/src}/lib/keyPair.d.ts +7 -0
  24. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/keyPair.js +117 -0
  26. package/dist/cjs/src/lib/nativeTransferBuilder.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/nativeTransferBuilder.js +219 -0
  28. package/dist/cjs/src/lib/proxyBuilder.d.ts.map +1 -0
  29. package/dist/cjs/src/lib/proxyBuilder.js +116 -0
  30. package/dist/cjs/src/lib/singletonRegistry.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/singletonRegistry.js +20 -0
  32. package/dist/cjs/src/lib/stakingBuilder.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/stakingBuilder.js +167 -0
  34. package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -1
  35. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/transaction.js +624 -0
  37. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -1
  38. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/transactionBuilder.js +351 -0
  40. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  41. package/dist/cjs/src/lib/transactionBuilderFactory.js +104 -0
  42. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/transferBuilder.js +11 -0
  44. package/dist/cjs/src/lib/txnSchema.d.ts.map +1 -0
  45. package/dist/cjs/src/lib/txnSchema.js +117 -0
  46. package/dist/cjs/src/lib/unnominateBuilder.d.ts.map +1 -0
  47. package/dist/cjs/src/lib/unnominateBuilder.js +48 -0
  48. package/dist/cjs/src/lib/unstakeBuilder.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/unstakeBuilder.js +87 -0
  50. package/dist/{src → cjs/src}/lib/utils.d.ts +10 -2
  51. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/utils.js +491 -0
  53. package/dist/cjs/src/lib/wasmParser.d.ts +57 -0
  54. package/dist/cjs/src/lib/wasmParser.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/wasmParser.js +345 -0
  56. package/dist/cjs/src/lib/withdrawUnstakedBuilder.d.ts.map +1 -0
  57. package/dist/cjs/src/lib/withdrawUnstakedBuilder.js +88 -0
  58. package/dist/cjs/src/register.d.ts.map +1 -0
  59. package/dist/cjs/src/register.js +11 -0
  60. package/dist/cjs/src/resources/index.d.ts +5 -0
  61. package/dist/cjs/src/resources/index.d.ts.map +1 -0
  62. package/dist/cjs/src/resources/index.js +21 -0
  63. package/dist/cjs/src/resources/mainnet.d.ts.map +1 -0
  64. package/dist/cjs/src/resources/mainnet.js +5 -0
  65. package/dist/cjs/src/resources/polkadotAssetHub.d.ts +2 -0
  66. package/dist/cjs/src/resources/polkadotAssetHub.d.ts.map +1 -0
  67. package/dist/cjs/src/resources/polkadotAssetHub.js +5 -0
  68. package/dist/cjs/src/resources/westend.d.ts.map +1 -0
  69. package/dist/cjs/src/resources/westend.js +5 -0
  70. package/dist/cjs/src/resources/westendAssetHub.d.ts +2 -0
  71. package/dist/cjs/src/resources/westendAssetHub.d.ts.map +1 -0
  72. package/dist/cjs/src/resources/westendAssetHub.js +5 -0
  73. package/dist/cjs/src/tdot.d.ts.map +1 -0
  74. package/dist/cjs/src/tdot.js +27 -0
  75. package/dist/cjs/test/fixtures.d.ts +283 -0
  76. package/dist/cjs/test/fixtures.d.ts.map +1 -0
  77. package/dist/cjs/test/fixtures.js +439 -0
  78. package/dist/cjs/test/resources/index.d.ts +141 -0
  79. package/dist/cjs/test/resources/index.d.ts.map +1 -0
  80. package/dist/cjs/test/resources/index.js +157 -0
  81. package/dist/cjs/test/resources/materialData.json +8 -0
  82. package/dist/cjs/test/resources/materialDataModified.json +8 -0
  83. package/dist/cjs/test/resources/testnet.d.ts +2 -0
  84. package/dist/cjs/test/resources/testnet.d.ts.map +1 -0
  85. package/dist/{src/resources/westend.js → cjs/test/resources/testnet.js} +3 -3
  86. package/dist/cjs/test/unit/address.d.ts +2 -0
  87. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  88. package/dist/cjs/test/unit/address.js +45 -0
  89. package/dist/cjs/test/unit/dot.d.ts +2 -0
  90. package/dist/cjs/test/unit/dot.d.ts.map +1 -0
  91. package/dist/cjs/test/unit/dot.js +953 -0
  92. package/dist/cjs/test/unit/keypair.d.ts +2 -0
  93. package/dist/cjs/test/unit/keypair.d.ts.map +1 -0
  94. package/dist/cjs/test/unit/keypair.js +111 -0
  95. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  96. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  97. package/dist/cjs/test/unit/transaction.js +269 -0
  98. package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.d.ts +2 -0
  99. package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
  100. package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.js +265 -0
  101. package/dist/cjs/test/unit/transactionBuilder/base.d.ts +8 -0
  102. package/dist/cjs/test/unit/transactionBuilder/base.d.ts.map +1 -0
  103. package/dist/cjs/test/unit/transactionBuilder/base.js +233 -0
  104. package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.d.ts +2 -0
  105. package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.d.ts.map +1 -0
  106. package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.js +521 -0
  107. package/dist/cjs/test/unit/transactionBuilder/claimBuilder.d.ts +2 -0
  108. package/dist/cjs/test/unit/transactionBuilder/claimBuilder.d.ts.map +1 -0
  109. package/dist/cjs/test/unit/transactionBuilder/claimBuilder.js +129 -0
  110. package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.d.ts +2 -0
  111. package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.d.ts.map +1 -0
  112. package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.js +88 -0
  113. package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.d.ts +2 -0
  114. package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.d.ts.map +1 -0
  115. package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.js +59 -0
  116. package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  117. package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  118. package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.js +235 -0
  119. package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
  120. package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
  121. package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.js +107 -0
  122. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  123. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  124. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +437 -0
  125. package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.d.ts +2 -0
  126. package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.d.ts.map +1 -0
  127. package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.js +97 -0
  128. package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.d.ts +2 -0
  129. package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.d.ts.map +1 -0
  130. package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.js +116 -0
  131. package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts +2 -0
  132. package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts.map +1 -0
  133. package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.js +115 -0
  134. package/dist/cjs/test/unit/utils.d.ts +2 -0
  135. package/dist/cjs/test/unit/utils.d.ts.map +1 -0
  136. package/dist/cjs/test/unit/utils.js +117 -0
  137. package/dist/cjs/test/unit/wasmBuilderByteComparison.d.ts +22 -0
  138. package/dist/cjs/test/unit/wasmBuilderByteComparison.d.ts.map +1 -0
  139. package/dist/cjs/test/unit/wasmBuilderByteComparison.js +197 -0
  140. package/dist/cjs/test/unit/wasmParserExplanation.d.ts +15 -0
  141. package/dist/cjs/test/unit/wasmParserExplanation.d.ts.map +1 -0
  142. package/dist/cjs/test/unit/wasmParserExplanation.js +147 -0
  143. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  144. package/dist/esm/dot.d.ts +147 -0
  145. package/dist/esm/dot.d.ts.map +1 -0
  146. package/dist/esm/dot.js +583 -0
  147. package/dist/esm/index.d.ts +5 -0
  148. package/dist/esm/index.js +5 -0
  149. package/dist/esm/lib/addressInitializationBuilder.d.ts +79 -0
  150. package/dist/esm/lib/addressInitializationBuilder.js +175 -0
  151. package/dist/esm/lib/batchTransactionBuilder.d.ts +62 -0
  152. package/dist/{src → esm}/lib/batchTransactionBuilder.d.ts.map +1 -1
  153. package/dist/esm/lib/batchTransactionBuilder.js +222 -0
  154. package/dist/esm/lib/claimBuilder.d.ts +58 -0
  155. package/dist/esm/lib/claimBuilder.js +110 -0
  156. package/dist/esm/lib/errors.d.ts +8 -0
  157. package/dist/esm/lib/errors.js +14 -0
  158. package/dist/esm/lib/iface.d.ts +337 -0
  159. package/dist/esm/lib/iface.d.ts.map +1 -0
  160. package/dist/esm/lib/iface.js +125 -0
  161. package/dist/esm/lib/iface_utils.d.ts +59 -0
  162. package/dist/esm/lib/iface_utils.js +83 -0
  163. package/dist/esm/lib/index.d.ts +21 -0
  164. package/dist/{src → esm}/lib/index.d.ts.map +1 -1
  165. package/dist/esm/lib/index.js +20 -0
  166. package/dist/esm/lib/keyPair.d.ts +38 -0
  167. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  168. package/dist/esm/lib/keyPair.js +77 -0
  169. package/dist/esm/lib/nativeTransferBuilder.d.ts +84 -0
  170. package/dist/esm/lib/nativeTransferBuilder.js +212 -0
  171. package/dist/esm/lib/proxyBuilder.d.ts +54 -0
  172. package/dist/esm/lib/proxyBuilder.js +109 -0
  173. package/dist/esm/lib/singletonRegistry.d.ts +7 -0
  174. package/dist/esm/lib/singletonRegistry.js +16 -0
  175. package/dist/esm/lib/stakingBuilder.d.ts +66 -0
  176. package/dist/esm/lib/stakingBuilder.js +160 -0
  177. package/dist/esm/lib/transaction.d.ts +83 -0
  178. package/dist/esm/lib/transaction.d.ts.map +1 -0
  179. package/dist/esm/lib/transaction.js +584 -0
  180. package/dist/esm/lib/transactionBuilder.d.ts +131 -0
  181. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  182. package/dist/esm/lib/transactionBuilder.js +311 -0
  183. package/dist/esm/lib/transactionBuilderFactory.d.ts +28 -0
  184. package/dist/esm/lib/transactionBuilderFactory.js +97 -0
  185. package/dist/esm/lib/transferBuilder.d.ts +11 -0
  186. package/dist/esm/lib/transferBuilder.js +7 -0
  187. package/dist/esm/lib/txnSchema.d.ts +15 -0
  188. package/dist/esm/lib/txnSchema.js +111 -0
  189. package/dist/esm/lib/unnominateBuilder.d.ts +24 -0
  190. package/dist/esm/lib/unnominateBuilder.js +44 -0
  191. package/dist/esm/lib/unstakeBuilder.d.ts +38 -0
  192. package/dist/esm/lib/unstakeBuilder.js +80 -0
  193. package/dist/esm/lib/utils.d.ts +261 -0
  194. package/dist/esm/lib/utils.d.ts.map +1 -0
  195. package/dist/esm/lib/utils.js +451 -0
  196. package/dist/esm/lib/wasmParser.d.ts +57 -0
  197. package/dist/esm/lib/wasmParser.d.ts.map +1 -0
  198. package/dist/esm/lib/wasmParser.js +341 -0
  199. package/dist/esm/lib/withdrawUnstakedBuilder.d.ts +38 -0
  200. package/dist/esm/lib/withdrawUnstakedBuilder.js +81 -0
  201. package/dist/esm/register.d.ts +3 -0
  202. package/dist/esm/register.js +7 -0
  203. package/dist/esm/resources/index.d.ts +5 -0
  204. package/dist/{src → esm}/resources/index.d.ts.map +1 -1
  205. package/dist/esm/resources/index.js +5 -0
  206. package/dist/esm/resources/mainnet.d.ts +2 -0
  207. package/dist/esm/resources/mainnet.js +2 -0
  208. package/dist/esm/resources/polkadotAssetHub.d.ts +2 -0
  209. package/dist/esm/resources/polkadotAssetHub.d.ts.map +1 -0
  210. package/dist/esm/resources/polkadotAssetHub.js +2 -0
  211. package/dist/esm/resources/westend.d.ts +2 -0
  212. package/dist/esm/resources/westend.js +2 -0
  213. package/dist/esm/resources/westendAssetHub.d.ts +2 -0
  214. package/dist/esm/resources/westendAssetHub.d.ts.map +1 -0
  215. package/dist/esm/resources/westendAssetHub.js +2 -0
  216. package/dist/esm/tdot.d.ts +12 -0
  217. package/dist/esm/tdot.js +23 -0
  218. package/package.json +43 -21
  219. package/.eslintignore +0 -5
  220. package/.mocharc.yml +0 -8
  221. package/CHANGELOG.md +0 -578
  222. package/dist/src/dot.d.ts.map +0 -1
  223. package/dist/src/dot.js +0 -562
  224. package/dist/src/lib/addressInitializationBuilder.js +0 -184
  225. package/dist/src/lib/batchTransactionBuilder.js +0 -220
  226. package/dist/src/lib/claimBuilder.js +0 -119
  227. package/dist/src/lib/errors.js +0 -19
  228. package/dist/src/lib/iface.d.ts.map +0 -1
  229. package/dist/src/lib/iface.js +0 -128
  230. package/dist/src/lib/iface_utils.js +0 -93
  231. package/dist/src/lib/index.js +0 -57
  232. package/dist/src/lib/keyPair.d.ts.map +0 -1
  233. package/dist/src/lib/keyPair.js +0 -70
  234. package/dist/src/lib/nativeTransferBuilder.js +0 -221
  235. package/dist/src/lib/proxyBuilder.js +0 -118
  236. package/dist/src/lib/singletonRegistry.js +0 -20
  237. package/dist/src/lib/stakingBuilder.js +0 -169
  238. package/dist/src/lib/transaction.d.ts.map +0 -1
  239. package/dist/src/lib/transaction.js +0 -590
  240. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  241. package/dist/src/lib/transactionBuilder.js +0 -337
  242. package/dist/src/lib/transactionBuilderFactory.js +0 -105
  243. package/dist/src/lib/transferBuilder.js +0 -11
  244. package/dist/src/lib/txnSchema.js +0 -117
  245. package/dist/src/lib/unnominateBuilder.js +0 -50
  246. package/dist/src/lib/unstakeBuilder.js +0 -89
  247. package/dist/src/lib/utils.d.ts.map +0 -1
  248. package/dist/src/lib/utils.js +0 -458
  249. package/dist/src/lib/withdrawUnstakedBuilder.js +0 -90
  250. package/dist/src/register.js +0 -11
  251. package/dist/src/resources/index.d.ts +0 -3
  252. package/dist/src/resources/index.js +0 -15
  253. package/dist/src/resources/mainnet.js +0 -5
  254. package/dist/src/tdot.js +0 -27
  255. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  256. /package/dist/{src → cjs/src}/lib/addressInitializationBuilder.d.ts +0 -0
  257. /package/dist/{src → cjs/src}/lib/claimBuilder.d.ts +0 -0
  258. /package/dist/{src → cjs/src}/lib/errors.d.ts +0 -0
  259. /package/dist/{src → cjs/src}/lib/iface_utils.d.ts +0 -0
  260. /package/dist/{src → cjs/src}/lib/nativeTransferBuilder.d.ts +0 -0
  261. /package/dist/{src → cjs/src}/lib/proxyBuilder.d.ts +0 -0
  262. /package/dist/{src → cjs/src}/lib/singletonRegistry.d.ts +0 -0
  263. /package/dist/{src → cjs/src}/lib/stakingBuilder.d.ts +0 -0
  264. /package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +0 -0
  265. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  266. /package/dist/{src → cjs/src}/lib/txnSchema.d.ts +0 -0
  267. /package/dist/{src → cjs/src}/lib/unnominateBuilder.d.ts +0 -0
  268. /package/dist/{src → cjs/src}/lib/unstakeBuilder.d.ts +0 -0
  269. /package/dist/{src → cjs/src}/lib/withdrawUnstakedBuilder.d.ts +0 -0
  270. /package/dist/{src → cjs/src}/register.d.ts +0 -0
  271. /package/dist/{src → cjs/src}/resources/mainnet.d.ts +0 -0
  272. /package/dist/{src → cjs/src}/resources/westend.d.ts +0 -0
  273. /package/dist/{src → cjs/src}/tdot.d.ts +0 -0
  274. /package/dist/{src → esm}/index.d.ts.map +0 -0
  275. /package/dist/{src → esm}/lib/addressInitializationBuilder.d.ts.map +0 -0
  276. /package/dist/{src → esm}/lib/claimBuilder.d.ts.map +0 -0
  277. /package/dist/{src → esm}/lib/errors.d.ts.map +0 -0
  278. /package/dist/{src → esm}/lib/iface_utils.d.ts.map +0 -0
  279. /package/dist/{src → esm}/lib/nativeTransferBuilder.d.ts.map +0 -0
  280. /package/dist/{src → esm}/lib/proxyBuilder.d.ts.map +0 -0
  281. /package/dist/{src → esm}/lib/singletonRegistry.d.ts.map +0 -0
  282. /package/dist/{src → esm}/lib/stakingBuilder.d.ts.map +0 -0
  283. /package/dist/{src → esm}/lib/transactionBuilderFactory.d.ts.map +0 -0
  284. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  285. /package/dist/{src → esm}/lib/txnSchema.d.ts.map +0 -0
  286. /package/dist/{src → esm}/lib/unnominateBuilder.d.ts.map +0 -0
  287. /package/dist/{src → esm}/lib/unstakeBuilder.d.ts.map +0 -0
  288. /package/dist/{src → esm}/lib/withdrawUnstakedBuilder.d.ts.map +0 -0
  289. /package/dist/{src → esm}/register.d.ts.map +0 -0
  290. /package/dist/{src → esm}/resources/mainnet.d.ts.map +0 -0
  291. /package/dist/{src → esm}/resources/westend.d.ts.map +0 -0
  292. /package/dist/{src → esm}/tdot.d.ts.map +0 -0
@@ -0,0 +1,583 @@
1
+ import * as _ from 'lodash';
2
+ import { BaseCoin, Environments, EDDSAMethods, multisigTypes, verifyEddsaTssWalletAddress, TxIntentMismatchRecipientError, } from '@bitgo-beta/sdk-core';
3
+ import { coins } from '@bitgo-beta/statics';
4
+ import { KeyPair as DotKeyPair, TransactionBuilderFactory, Utils, explainDotTransaction, } from './lib';
5
+ import '@polkadot/api-augment';
6
+ import { ApiPromise, WsProvider } from '@polkadot/api';
7
+ import BigNumber from 'bignumber.js';
8
+ import { auditEddsaPrivateKey, getDerivationPath } from '@bitgo-beta/sdk-lib-mpc';
9
+ export const DEFAULT_SCAN_FACTOR = 20; // default number of receive addresses to scan for funds
10
+ const dotUtils = Utils.default;
11
+ export class Dot extends BaseCoin {
12
+ constructor(bitgo, staticsCoin) {
13
+ super(bitgo);
14
+ this.MAX_VALIDITY_DURATION = 2400;
15
+ this.SWEEP_TXN_DURATION = 64;
16
+ if (!staticsCoin) {
17
+ throw new Error('missing required constructor parameter staticsCoin');
18
+ }
19
+ this._staticsCoin = staticsCoin;
20
+ }
21
+ static createInstance(bitgo, staticsCoin) {
22
+ return new Dot(bitgo, staticsCoin);
23
+ }
24
+ getChain() {
25
+ return 'dot';
26
+ }
27
+ getBaseChain() {
28
+ return 'dot';
29
+ }
30
+ getFamily() {
31
+ return 'dot';
32
+ }
33
+ getFullName() {
34
+ return 'Polkadot';
35
+ }
36
+ getBaseFactor() {
37
+ return Math.pow(10, this._staticsCoin.decimalPlaces);
38
+ }
39
+ /**
40
+ * Flag for sending value of 0
41
+ * @returns {boolean} True if okay to send 0 value, false otherwise
42
+ */
43
+ valuelessTransferAllowed() {
44
+ return true;
45
+ }
46
+ /** @inheritDoc */
47
+ supportsTss() {
48
+ return true;
49
+ }
50
+ /** inherited doc */
51
+ getDefaultMultisigType() {
52
+ return multisigTypes.tss;
53
+ }
54
+ getMPCAlgorithm() {
55
+ return 'eddsa';
56
+ }
57
+ allowsAccountConsolidations() {
58
+ return true;
59
+ }
60
+ /**
61
+ * Generate ed25519 key pair
62
+ *
63
+ * @param seed
64
+ * @returns {Object} object with generated pub, prv
65
+ */
66
+ generateKeyPair(seed) {
67
+ const keyPair = seed ? dotUtils.keyPairFromSeed(new Uint8Array(seed)) : new DotKeyPair();
68
+ const keys = keyPair.getKeys();
69
+ if (!keys.prv) {
70
+ throw new Error('Missing prv in key generation.');
71
+ }
72
+ return {
73
+ pub: keys.pub,
74
+ prv: keys.prv,
75
+ };
76
+ }
77
+ /**
78
+ * Return boolean indicating whether input is valid public key for the coin.
79
+ *
80
+ * @param {String} pub the pub to be checked
81
+ * @returns {Boolean} is it valid?
82
+ */
83
+ isValidPub(pub) {
84
+ return dotUtils.isValidPublicKey(pub);
85
+ }
86
+ /**
87
+ * Return boolean indicating whether the supplied private key is a valid dot private key
88
+ *
89
+ * @param {String} prv the prv to be checked
90
+ * @returns {Boolean} is it valid?
91
+ */
92
+ isValidPrv(prv) {
93
+ return dotUtils.isValidPrivateKey(prv);
94
+ }
95
+ /**
96
+ * Return boolean indicating whether input is valid public key for the coin
97
+ *
98
+ * @param {String} address the pub to be checked
99
+ * @returns {Boolean} is it valid?
100
+ */
101
+ isValidAddress(address) {
102
+ return dotUtils.isValidAddress(address);
103
+ }
104
+ /**
105
+ * Sign message with private key
106
+ *
107
+ * @param key
108
+ * @param message
109
+ * @return {Buffer} A signature over the given message using the given key
110
+ */
111
+ async signMessage(key, message) {
112
+ const msg = Buffer.isBuffer(message) ? message.toString('utf8') : message;
113
+ // reconstitute keys and sign
114
+ return Buffer.from(new DotKeyPair({ prv: key.prv }).signMessage(msg));
115
+ }
116
+ /**
117
+ * Explain/parse transaction
118
+ * @param unsignedTransaction
119
+ */
120
+ async explainTransaction(unsignedTransaction) {
121
+ let outputAmount = 0;
122
+ unsignedTransaction.parsedTx.outputs.forEach((o) => {
123
+ outputAmount += parseInt(o.valueString, 10);
124
+ });
125
+ const explanationResult = {
126
+ displayOrder: [
127
+ 'outputAmount',
128
+ 'changeAmount',
129
+ 'outputs',
130
+ 'changeOutputs',
131
+ 'fee',
132
+ 'type',
133
+ 'sequenceId',
134
+ 'id',
135
+ 'blockNumber',
136
+ ],
137
+ sequenceId: unsignedTransaction.parsedTx.sequenceId,
138
+ fee: unsignedTransaction.feeInfo?.feeString,
139
+ id: unsignedTransaction.parsedTx.id,
140
+ type: unsignedTransaction.parsedTx.type,
141
+ outputs: unsignedTransaction.parsedTx.outputs,
142
+ blockNumber: unsignedTransaction.coinSpecific?.blockNumber,
143
+ outputAmount: outputAmount,
144
+ changeOutputs: [],
145
+ changeAmount: '0',
146
+ };
147
+ return explanationResult;
148
+ }
149
+ verifySignTransactionParams(params) {
150
+ const prv = params.prv;
151
+ const txHex = params.txPrebuild.txHex;
152
+ if (!txHex) {
153
+ throw new Error('missing txPrebuild parameter');
154
+ }
155
+ if (!_.isString(txHex)) {
156
+ throw new Error(`txPrebuild must be an object, got type ${typeof txHex}`);
157
+ }
158
+ if (!prv) {
159
+ throw new Error('missing prv parameter to sign transaction');
160
+ }
161
+ if (!_.isString(prv)) {
162
+ throw new Error(`prv must be a string, got type ${typeof prv}`);
163
+ }
164
+ if (!_.has(params, 'pubs')) {
165
+ throw new Error('missing public key parameter to sign transaction');
166
+ }
167
+ return { txHex, prv };
168
+ }
169
+ /**
170
+ * Assemble keychain and half-sign prebuilt transaction
171
+ *
172
+ * @param params
173
+ * @param params.txPrebuild {TransactionPrebuild} prebuild object returned by platform
174
+ * @param params.prv {String} user prv
175
+ * @returns {Promise<SignedTransaction>}
176
+ */
177
+ async signTransaction(params) {
178
+ const { txHex, prv } = this.verifySignTransactionParams(params);
179
+ const factory = this.getBuilder();
180
+ const txBuilder = factory.from(txHex);
181
+ const keyPair = new DotKeyPair({ prv: prv });
182
+ const { referenceBlock, blockNumber, transactionVersion, sender } = params.txPrebuild.transaction;
183
+ txBuilder
184
+ .validity({ firstValid: blockNumber, maxDuration: this.MAX_VALIDITY_DURATION })
185
+ .referenceBlock(referenceBlock)
186
+ .version(transactionVersion)
187
+ .sender({ address: sender })
188
+ .sign({ key: keyPair.getKeys().prv });
189
+ const transaction = await txBuilder.build();
190
+ if (!transaction) {
191
+ throw new Error('Invalid transaction');
192
+ }
193
+ const signedTxHex = transaction.toBroadcastFormat();
194
+ return { txHex: signedTxHex };
195
+ }
196
+ async getInitializedNodeAPI() {
197
+ if (!Dot.nodeApiInitialized) {
198
+ const wsProvider = new WsProvider(Environments[this.bitgo.getEnv()].dotNodeUrls);
199
+ Dot.API = await ApiPromise.create({ provider: wsProvider });
200
+ Dot.nodeApiInitialized = true;
201
+ }
202
+ return Dot.API;
203
+ }
204
+ async getAccountInfo(walletAddr) {
205
+ const api = await this.getInitializedNodeAPI();
206
+ const { nonce, data: balance } = await api.query.system.account(walletAddr);
207
+ return { nonce: nonce.toNumber(), freeBalance: balance.free.toNumber() };
208
+ }
209
+ async getHeaderInfo() {
210
+ const api = await this.getInitializedNodeAPI();
211
+ const { number, hash } = await api.rpc.chain.getHeader();
212
+ return { headerNumber: number.toNumber(), headerHash: hash.toString() };
213
+ }
214
+ /**
215
+ *
216
+ * Estimate the fee of the transaction
217
+ *
218
+ * @param {string} destAddr destination wallet address
219
+ * @param {string} srcAddr source wallet address
220
+ * @param {string} amount amount to transfer
221
+ * @returns {number} the estimated fee the transaction will cost
222
+ *
223
+ * @see https://polkadot.js.org/docs/api/cookbook/tx#how-do-i-estimate-the-transaction-fees
224
+ */
225
+ async getFee(destAddr, srcAddr, amount) {
226
+ const api = await this.getInitializedNodeAPI();
227
+ const info = await api.tx.balances.transferAllowDeath(destAddr, amount).paymentInfo(srcAddr);
228
+ return info.partialFee.toNumber();
229
+ }
230
+ async getMaterial() {
231
+ const api = await this.getInitializedNodeAPI();
232
+ return {
233
+ genesisHash: api.genesisHash.toString(),
234
+ chainName: api.runtimeChain.toString(),
235
+ specName: api.runtimeVersion.specName.toString(),
236
+ specVersion: api.runtimeVersion.specVersion.toNumber(),
237
+ txVersion: api.runtimeVersion.transactionVersion.toNumber(),
238
+ metadata: api.runtimeMetadata.toHex(),
239
+ };
240
+ }
241
+ /**
242
+ * Builds a funds recovery transaction without BitGo
243
+ * @param {MPCRecoveryOptions} params parameters needed to construct and
244
+ * (maybe) sign the transaction
245
+ *
246
+ * @returns {MPCTx} the serialized transaction hex string and index
247
+ * of the address being swept
248
+ */
249
+ async recover(params) {
250
+ if (!params.bitgoKey) {
251
+ throw new Error('missing bitgoKey');
252
+ }
253
+ if (!params.recoveryDestination || !this.isValidAddress(params.recoveryDestination)) {
254
+ throw new Error('invalid recoveryDestination');
255
+ }
256
+ const bitgoKey = params.bitgoKey.replace(/\s/g, '');
257
+ const isUnsignedSweep = !params.userKey && !params.backupKey && !params.walletPassphrase;
258
+ const MPC = await EDDSAMethods.getInitializedMpcInstance();
259
+ const index = params.index || 0;
260
+ const currPath = params.seed ? getDerivationPath(params.seed) + `/${index}` : `m/${index}`;
261
+ const accountId = MPC.deriveUnhardened(bitgoKey, currPath).slice(0, 64);
262
+ const senderAddr = this.getAddressFromPublicKey(accountId);
263
+ const { nonce, freeBalance } = await this.getAccountInfo(senderAddr);
264
+ const destAddr = params.recoveryDestination;
265
+ const amount = freeBalance;
266
+ const partialFee = await this.getFee(destAddr, senderAddr, amount);
267
+ const value = new BigNumber(freeBalance).minus(new BigNumber(partialFee));
268
+ if (value.isLessThanOrEqualTo(0)) {
269
+ throw new Error('Did not find address with funds to recover');
270
+ }
271
+ // first build the unsigned txn
272
+ const { headerNumber, headerHash } = await this.getHeaderInfo();
273
+ const material = await this.getMaterial();
274
+ const validityWindow = { firstValid: headerNumber, maxDuration: this.MAX_VALIDITY_DURATION };
275
+ const txnBuilder = this.getBuilder().getTransferBuilder().material(material);
276
+ txnBuilder
277
+ .sweep(false)
278
+ .to({ address: params.recoveryDestination })
279
+ .sender({ address: senderAddr })
280
+ .validity(validityWindow)
281
+ .referenceBlock(headerHash)
282
+ .sequenceId({ name: 'Nonce', keyword: 'nonce', value: nonce })
283
+ .fee({ amount: 0, type: 'tip' });
284
+ const unsignedTransaction = (await txnBuilder.build());
285
+ let serializedTx = unsignedTransaction.toBroadcastFormat();
286
+ if (!isUnsignedSweep) {
287
+ if (!params.userKey) {
288
+ throw new Error('missing userKey');
289
+ }
290
+ if (!params.backupKey) {
291
+ throw new Error('missing backupKey');
292
+ }
293
+ if (!params.walletPassphrase) {
294
+ throw new Error('missing wallet passphrase');
295
+ }
296
+ // Clean up whitespace from entered values
297
+ const userKey = params.userKey.replace(/\s/g, '');
298
+ const backupKey = params.backupKey.replace(/\s/g, '');
299
+ // Decrypt private keys from KeyCard values
300
+ let userPrv;
301
+ try {
302
+ userPrv = await this.bitgo.decryptAsync({
303
+ input: userKey,
304
+ password: params.walletPassphrase,
305
+ });
306
+ }
307
+ catch (e) {
308
+ throw new Error(`Error decrypting user keychain: ${e.message}`);
309
+ }
310
+ /** TODO BG-52419 Implement Codec for parsing */
311
+ const userSigningMaterial = JSON.parse(userPrv);
312
+ let backupPrv;
313
+ try {
314
+ backupPrv = await this.bitgo.decryptAsync({
315
+ input: backupKey,
316
+ password: params.walletPassphrase,
317
+ });
318
+ }
319
+ catch (e) {
320
+ throw new Error(`Error decrypting backup keychain: ${e.message}`);
321
+ }
322
+ const backupSigningMaterial = JSON.parse(backupPrv);
323
+ // add signature
324
+ const signatureHex = await EDDSAMethods.getTSSSignature(userSigningMaterial, backupSigningMaterial, currPath, unsignedTransaction);
325
+ const dotKeyPair = new DotKeyPair({ pub: accountId });
326
+ txnBuilder.addSignature({ pub: dotKeyPair.getKeys().pub }, signatureHex);
327
+ const signedTransaction = await txnBuilder.build();
328
+ serializedTx = signedTransaction.toBroadcastFormat();
329
+ }
330
+ else {
331
+ const value = new BigNumber(freeBalance);
332
+ const walletCoin = this.getChain();
333
+ const inputs = [
334
+ {
335
+ address: unsignedTransaction.inputs[0].address,
336
+ valueString: value.toString(),
337
+ value: value.toNumber(),
338
+ },
339
+ ];
340
+ const outputs = [
341
+ {
342
+ address: unsignedTransaction.outputs[0].address,
343
+ valueString: value.toString(),
344
+ coinName: walletCoin,
345
+ },
346
+ ];
347
+ const spendAmount = value.toString();
348
+ const parsedTx = { inputs: inputs, outputs: outputs, spendAmount: spendAmount, type: '' };
349
+ const feeInfo = { fee: 0, feeString: '0' };
350
+ const transaction = {
351
+ serializedTx: serializedTx,
352
+ scanIndex: index,
353
+ coin: walletCoin,
354
+ signableHex: unsignedTransaction.signablePayload.toString('hex'),
355
+ derivationPath: currPath,
356
+ parsedTx: parsedTx,
357
+ feeInfo: feeInfo,
358
+ coinSpecific: { ...validityWindow, commonKeychain: bitgoKey },
359
+ };
360
+ const unsignedTx = { unsignedTx: transaction, signatureShares: [] };
361
+ const transactions = [unsignedTx];
362
+ const txRequest = {
363
+ transactions: transactions,
364
+ walletCoin: walletCoin,
365
+ };
366
+ const txRequests = { txRequests: [txRequest] };
367
+ return txRequests;
368
+ }
369
+ const transaction = { serializedTx: serializedTx, scanIndex: index };
370
+ return transaction;
371
+ }
372
+ /**
373
+ * Builds native DOT recoveries of receive addresses in batch without BitGo.
374
+ * Funds will be recovered to base address first. You need to initiate another sweep txn after that.
375
+ *
376
+ * @param {MPCConsolidationRecoveryOptions} params - options for consolidation recovery.
377
+ * @param {string} [params.startingScanIndex] - receive address index to start scanning from. default to 1 (inclusive).
378
+ * @param {string} [params.endingScanIndex] - receive address index to end scanning at. default to startingScanIndex + 20 (exclusive).
379
+ */
380
+ async recoverConsolidations(params) {
381
+ const isUnsignedSweep = !params.userKey && !params.backupKey && !params.walletPassphrase;
382
+ const startIdx = params.startingScanIndex || 1;
383
+ const endIdx = params.endingScanIndex || startIdx + DEFAULT_SCAN_FACTOR;
384
+ if (startIdx < 1 || endIdx <= startIdx || endIdx - startIdx > 10 * DEFAULT_SCAN_FACTOR) {
385
+ throw new Error(`Invalid starting or ending index to scan for addresses. startingScanIndex: ${startIdx}, endingScanIndex: ${endIdx}.`);
386
+ }
387
+ const bitgoKey = params.bitgoKey.replace(/\s/g, '');
388
+ const MPC = await EDDSAMethods.getInitializedMpcInstance();
389
+ const baseIndex = 0;
390
+ const basePath = params.seed ? getDerivationPath(params.seed) + `/${baseIndex}` : `m/${baseIndex}`;
391
+ const accountId = MPC.deriveUnhardened(bitgoKey, basePath).slice(0, 64);
392
+ const baseAddress = this.getAddressFromPublicKey(accountId);
393
+ const consolidationTransactions = [];
394
+ let lastScanIndex = startIdx;
395
+ for (let i = startIdx; i < endIdx; i++) {
396
+ const recoverParams = {
397
+ userKey: params.userKey,
398
+ backupKey: params.backupKey,
399
+ bitgoKey: params.bitgoKey,
400
+ walletPassphrase: params.walletPassphrase,
401
+ recoveryDestination: baseAddress,
402
+ seed: params.seed,
403
+ index: i,
404
+ };
405
+ let recoveryTransaction;
406
+ try {
407
+ recoveryTransaction = await this.recover(recoverParams);
408
+ }
409
+ catch (e) {
410
+ if (e.message === 'Did not find address with funds to recover') {
411
+ lastScanIndex = i;
412
+ continue;
413
+ }
414
+ throw e;
415
+ }
416
+ if (isUnsignedSweep) {
417
+ consolidationTransactions.push(recoveryTransaction.txRequests[0]);
418
+ }
419
+ else {
420
+ consolidationTransactions.push(recoveryTransaction);
421
+ }
422
+ lastScanIndex = i;
423
+ }
424
+ if (consolidationTransactions.length == 0) {
425
+ throw new Error('Did not find an address with funds to recover');
426
+ }
427
+ if (isUnsignedSweep) {
428
+ // lastScanIndex will be used to inform user the last address index scanned for available funds (so they can
429
+ // appropriately adjust the scan range on the next iteration of consolidation recoveries). In the case of unsigned
430
+ // sweep consolidations, this lastScanIndex will be provided in the coinSpecific of the last txn made.
431
+ const lastTransactionCoinSpecific = {
432
+ firstValid: consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific
433
+ .firstValid,
434
+ maxDuration: consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific
435
+ .maxDuration,
436
+ commonKeychain: consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific
437
+ .commonKeychain,
438
+ lastScanIndex: lastScanIndex,
439
+ };
440
+ consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific =
441
+ lastTransactionCoinSpecific;
442
+ const consolidationSweepTransactions = { txRequests: consolidationTransactions };
443
+ return consolidationSweepTransactions;
444
+ }
445
+ return { transactions: consolidationTransactions, lastScanIndex };
446
+ }
447
+ /** inherited doc */
448
+ async createBroadcastableSweepTransaction(params) {
449
+ const req = params.signatureShares;
450
+ const broadcastableTransactions = [];
451
+ let lastScanIndex = 0;
452
+ for (let i = 0; i < req.length; i++) {
453
+ const MPC = await EDDSAMethods.getInitializedMpcInstance();
454
+ const transaction = req[i].txRequest.transactions[0].unsignedTx;
455
+ if (!req[i].ovc || !req[i].ovc[0].eddsaSignature) {
456
+ throw new Error('Missing signature(s)');
457
+ }
458
+ const signature = req[i].ovc[0].eddsaSignature;
459
+ if (!transaction.signableHex) {
460
+ throw new Error('Missing signable hex');
461
+ }
462
+ const messageBuffer = Buffer.from(transaction.signableHex, 'hex');
463
+ const result = MPC.verify(messageBuffer, signature);
464
+ if (!result) {
465
+ throw new Error('Invalid signature');
466
+ }
467
+ const signatureHex = Buffer.concat([Buffer.from(signature.R, 'hex'), Buffer.from(signature.sigma, 'hex')]);
468
+ if (!transaction.coinSpecific ||
469
+ !transaction.coinSpecific?.firstValid ||
470
+ !transaction.coinSpecific?.maxDuration) {
471
+ throw new Error('missing validity window');
472
+ }
473
+ const validityWindow = {
474
+ firstValid: transaction.coinSpecific?.firstValid,
475
+ maxDuration: transaction.coinSpecific?.maxDuration,
476
+ };
477
+ const material = await this.getMaterial();
478
+ if (!transaction.coinSpecific?.commonKeychain) {
479
+ throw new Error('Missing common keychain');
480
+ }
481
+ const commonKeychain = transaction.coinSpecific.commonKeychain;
482
+ if (!transaction.derivationPath) {
483
+ throw new Error('Missing derivation path');
484
+ }
485
+ const derivationPath = transaction.derivationPath;
486
+ const accountId = MPC.deriveUnhardened(commonKeychain, derivationPath).slice(0, 64);
487
+ const senderAddr = this.getAddressFromPublicKey(accountId);
488
+ const txnBuilder = this.getBuilder()
489
+ .material(material)
490
+ .from(transaction.serializedTx)
491
+ .sender({ address: senderAddr })
492
+ .validity(validityWindow);
493
+ const dotKeyPair = new DotKeyPair({ pub: accountId });
494
+ txnBuilder.addSignature({ pub: dotKeyPair.getKeys().pub }, signatureHex);
495
+ const signedTransaction = await txnBuilder.build();
496
+ const serializedTx = signedTransaction.toBroadcastFormat();
497
+ broadcastableTransactions.push({
498
+ serializedTx: serializedTx,
499
+ scanIndex: transaction.scanIndex,
500
+ });
501
+ if (i === req.length - 1 && transaction.coinSpecific.lastScanIndex) {
502
+ lastScanIndex = transaction.coinSpecific.lastScanIndex;
503
+ }
504
+ }
505
+ return { transactions: broadcastableTransactions, lastScanIndex };
506
+ }
507
+ async parseTransaction(params) {
508
+ return {};
509
+ }
510
+ async isWalletAddress(params) {
511
+ return verifyEddsaTssWalletAddress(params, (address) => this.isValidAddress(address), (publicKey) => this.getAddressFromPublicKey(publicKey));
512
+ }
513
+ async verifyTransaction(params) {
514
+ const { txPrebuild, txParams, verification, wallet, reqId } = params;
515
+ if (!txParams) {
516
+ throw new Error('missing txParams');
517
+ }
518
+ if (!txPrebuild) {
519
+ throw new Error('missing txPrebuild');
520
+ }
521
+ if (!txPrebuild.txHex) {
522
+ throw new Error('missing txHex in txPrebuild');
523
+ }
524
+ const chain = this.getChain();
525
+ let txTo;
526
+ let txAmount;
527
+ let isSweep;
528
+ if (chain === 'tdot') {
529
+ const material = Utils.default.getMaterial(coins.get(chain));
530
+ const explained = explainDotTransaction({ txHex: txPrebuild.txHex, material });
531
+ txTo = explained.outputs[0]?.address ?? '';
532
+ txAmount = String(explained.outputs[0]?.amount ?? '0');
533
+ isSweep = explained.methodName === 'balances.transferAll';
534
+ }
535
+ else {
536
+ const factory = this.getBuilder();
537
+ const txBuilder = factory.from(txPrebuild.txHex);
538
+ txTo = txBuilder['_to'];
539
+ txAmount = txBuilder['_amount'];
540
+ isSweep = txBuilder['_sweepFreeBalance'] === true;
541
+ }
542
+ if (verification?.consolidationToBaseAddress) {
543
+ const baseAddress = wallet?.coinSpecific()?.rootAddress || wallet?.coinSpecific()?.baseAddress;
544
+ if (!baseAddress) {
545
+ throw new Error('Unable to determine base address for consolidation');
546
+ }
547
+ if (txTo !== baseAddress) {
548
+ throw new TxIntentMismatchRecipientError(`Transaction destination address ${txTo} does not match wallet base address ${baseAddress}`, reqId, [txParams], txPrebuild.txHex, [{ address: txTo, amount: txAmount }]);
549
+ }
550
+ }
551
+ if (txParams.recipients !== undefined) {
552
+ if (txParams.recipients.length === 0) {
553
+ throw new Error('missing recipients in txParams');
554
+ }
555
+ if (Array.isArray(txParams.recipients) && txParams.recipients.length > 1) {
556
+ throw new Error(`${this.getChain()} doesn't support sending to more than 1 destination address within a single transaction. Try again, using only a single recipient.`);
557
+ }
558
+ if (txParams.recipients[0].address !== txTo) {
559
+ throw new TxIntentMismatchRecipientError(`Recipient address ${txParams.recipients[0].address} does not match transaction destination address ${txTo}`, reqId, [txParams], txPrebuild.txHex, [{ address: txTo, amount: txAmount }]);
560
+ }
561
+ if (!isSweep && txParams.recipients[0].amount !== txAmount) {
562
+ throw new TxIntentMismatchRecipientError(`Recipient amount ${txParams.recipients[0].amount} does not match transaction amount ${txAmount}`, reqId, [txParams], txPrebuild.txHex, [{ address: txTo, amount: txAmount }]);
563
+ }
564
+ }
565
+ return true;
566
+ }
567
+ getAddressFromPublicKey(Pubkey) {
568
+ return new DotKeyPair({ pub: Pubkey }).getAddress(Utils.default.getAddressFormat(this.getChain()));
569
+ }
570
+ getBuilder() {
571
+ return new TransactionBuilderFactory(coins.get(this.getChain()));
572
+ }
573
+ /** @inheritDoc */
574
+ auditDecryptedKey({ publicKey, prv, multiSigType }) {
575
+ if (multiSigType !== 'tss') {
576
+ throw new Error('Unsupported multiSigType');
577
+ }
578
+ auditEddsaPrivateKey(prv, publicKey ?? '');
579
+ }
580
+ }
581
+ Dot.initialized = false;
582
+ Dot.nodeApiInitialized = false;
583
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQ0wsUUFBUSxFQUlSLFlBQVksRUFXWixZQUFZLEVBV1osYUFBYSxFQUViLDJCQUEyQixFQUMzQiw4QkFBOEIsR0FDL0IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQStCLEtBQUssRUFBd0IsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRixPQUFPLEVBRUwsT0FBTyxJQUFJLFVBQVUsRUFHckIseUJBQXlCLEVBQ3pCLEtBQUssRUFDTCxxQkFBcUIsR0FDdEIsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sU0FBUyxNQUFNLGNBQWMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsQ0FBQyx3REFBd0Q7QUFpQi9GLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFFL0IsTUFBTSxPQUFPLEdBQUksU0FBUSxRQUFRO0lBSy9CLFlBQVksS0FBZ0IsRUFBRSxXQUF1QztRQUNuRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFKTiwwQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDN0IsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBSy9CLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFPRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLHNCQUFzQjtRQUNwQixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsMkJBQTJCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLElBQWE7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7UUFDekYsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU87WUFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLEdBQVc7UUFDcEIsT0FBTyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLEdBQVc7UUFDcEIsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE9BQWU7UUFDNUIsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQVksRUFBRSxPQUF3QjtRQUN0RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDMUUsNkJBQTZCO1FBQzdCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLG1CQUF3QztRQUMvRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsbUJBQW1CLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqRCxZQUFZLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGlCQUFpQixHQUFzQjtZQUMzQyxZQUFZLEVBQUU7Z0JBQ1osY0FBYztnQkFDZCxjQUFjO2dCQUNkLFNBQVM7Z0JBQ1QsZUFBZTtnQkFDZixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sWUFBWTtnQkFDWixJQUFJO2dCQUNKLGFBQWE7YUFDZDtZQUNELFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsVUFBVTtZQUNuRCxHQUFHLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFNBQVM7WUFDM0MsRUFBRSxFQUFFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ25DLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSTtZQUN2QyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDN0MsV0FBVyxFQUFFLG1CQUFtQixDQUFDLFlBQVksRUFBRSxXQUFXO1lBQzFELFlBQVksRUFBRSxZQUFZO1lBQzFCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxHQUFHO1NBQ2xCLENBQUM7UUFFRixPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxNQUE4QjtRQUN4RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRXZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBRXRDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBOEI7UUFDbEQsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3QyxNQUFNLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUVsRyxTQUFTO2FBQ04sUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7YUFDOUUsY0FBYyxDQUFDLGNBQWMsQ0FBQzthQUM5QixPQUFPLENBQUMsa0JBQWtCLENBQUM7YUFDM0IsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO2FBQzNCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN4QyxNQUFNLFdBQVcsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFUyxLQUFLLENBQUMscUJBQXFCO1FBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2pGLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDNUQsR0FBRyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQ2pCLENBQUM7SUFFUyxLQUFLLENBQUMsY0FBYyxDQUFDLFVBQWtCO1FBQy9DLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0MsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBRVMsS0FBSyxDQUFDLGFBQWE7UUFDM0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ08sS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFnQixFQUFFLE9BQWUsRUFBRSxNQUFjO1FBQ3RFLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdGLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRVMsS0FBSyxDQUFDLFdBQVc7UUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQyxPQUFPO1lBQ0wsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFO1lBQ3ZDLFNBQVMsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtZQUN0QyxRQUFRLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUEwQjtZQUN4RSxXQUFXLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFO1lBQ3RELFNBQVMsRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtZQUMzRCxRQUFRLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUU7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUEwQjtRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztZQUNwRixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRCxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBRXpGLE1BQU0sR0FBRyxHQUFHLE1BQU0sWUFBWSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFFM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDM0YsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzRCxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQzNCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRW5FLE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoRSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxNQUFNLGNBQWMsR0FBRyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRTdGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSxVQUFVO2FBQ1AsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNaLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUMzQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7YUFDL0IsUUFBUSxDQUFDLGNBQWMsQ0FBQzthQUN4QixjQUFjLENBQUMsVUFBVSxDQUFDO2FBQzFCLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7YUFDN0QsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNuQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7UUFFdEUsSUFBSSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFFRCwwQ0FBMEM7WUFDMUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV0RCwyQ0FBMkM7WUFDM0MsSUFBSSxPQUFPLENBQUM7WUFDWixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLEtBQUssRUFBRSxPQUFPO29CQUNkLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2lCQUNsQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBQ0QsZ0RBQWdEO1lBQ2hELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQXlDLENBQUM7WUFFeEYsSUFBSSxTQUFTLENBQUM7WUFDZCxJQUFJLENBQUM7Z0JBQ0gsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7b0JBQ3hDLEtBQUssRUFBRSxTQUFTO29CQUNoQixRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtpQkFDbEMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDcEUsQ0FBQztZQUNELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQTJDLENBQUM7WUFFOUYsZ0JBQWdCO1lBQ2hCLE1BQU0sWUFBWSxHQUFHLE1BQU0sWUFBWSxDQUFDLGVBQWUsQ0FDckQsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixRQUFRLEVBQ1IsbUJBQW1CLENBQ3BCLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3pFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkQsWUFBWSxHQUFHLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDdkQsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsTUFBTSxNQUFNLEdBQUc7Z0JBQ2I7b0JBQ0UsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO29CQUM5QyxXQUFXLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtvQkFDN0IsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7aUJBQ3hCO2FBQ0YsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHO2dCQUNkO29CQUNFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztvQkFDL0MsV0FBVyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7b0JBQzdCLFFBQVEsRUFBRSxVQUFVO2lCQUNyQjthQUNGLENBQUM7WUFDRixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckMsTUFBTSxRQUFRLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDMUYsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFdBQVcsR0FBVTtnQkFDekIsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsV0FBVyxFQUFFLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNoRSxjQUFjLEVBQUUsUUFBUTtnQkFDeEIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixZQUFZLEVBQUUsRUFBRSxHQUFHLGNBQWMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFO2FBQzlELENBQUM7WUFFRixNQUFNLFVBQVUsR0FBa0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNuRixNQUFNLFlBQVksR0FBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNuRCxNQUFNLFNBQVMsR0FBc0I7Z0JBQ25DLFlBQVksRUFBRSxZQUFZO2dCQUMxQixVQUFVLEVBQUUsVUFBVTthQUN2QixDQUFDO1lBQ0YsTUFBTSxVQUFVLEdBQWdCLEVBQUUsVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUM1RSxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUF1QztRQUNqRSxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ3pGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsSUFBSSxRQUFRLEdBQUcsbUJBQW1CLENBQUM7UUFFeEUsSUFBSSxRQUFRLEdBQUcsQ0FBQyxJQUFJLE1BQU0sSUFBSSxRQUFRLElBQUksTUFBTSxHQUFHLFFBQVEsR0FBRyxFQUFFLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztZQUN2RixNQUFNLElBQUksS0FBSyxDQUNiLDhFQUE4RSxRQUFRLHNCQUFzQixNQUFNLEdBQUcsQ0FDdEgsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxZQUFZLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDcEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkcsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU1RCxNQUFNLHlCQUF5QixHQUFVLEVBQUUsQ0FBQztRQUM1QyxJQUFJLGFBQWEsR0FBRyxRQUFRLENBQUM7UUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sYUFBYSxHQUFHO2dCQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87Z0JBQ3ZCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO2dCQUN6QyxtQkFBbUIsRUFBRSxXQUFXO2dCQUNoQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLEtBQUssRUFBRSxDQUFDO2FBQ1QsQ0FBQztZQUVGLElBQUksbUJBQW1CLENBQUM7WUFDeEIsSUFBSSxDQUFDO2dCQUNILG1CQUFtQixHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssNENBQTRDLEVBQUUsQ0FBQztvQkFDL0QsYUFBYSxHQUFHLENBQUMsQ0FBQztvQkFDbEIsU0FBUztnQkFDWCxDQUFDO2dCQUNELE1BQU0sQ0FBQyxDQUFDO1lBQ1YsQ0FBQztZQUVELElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLHlCQUF5QixDQUFDLElBQUksQ0FBRSxtQkFBbUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04seUJBQXlCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUNELGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUkseUJBQXlCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQiw0R0FBNEc7WUFDNUcsa0hBQWtIO1lBQ2xILHNHQUFzRztZQUN0RyxNQUFNLDJCQUEyQixHQUFHO2dCQUNsQyxVQUFVLEVBQ1IseUJBQXlCLENBQUMseUJBQXlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWTtxQkFDcEcsVUFBVTtnQkFDZixXQUFXLEVBQ1QseUJBQXlCLENBQUMseUJBQXlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWTtxQkFDcEcsV0FBVztnQkFDaEIsY0FBYyxFQUNaLHlCQUF5QixDQUFDLHlCQUF5QixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVk7cUJBQ3BHLGNBQWM7Z0JBQ25CLGFBQWEsRUFBRSxhQUFhO2FBQzdCLENBQUM7WUFDRix5QkFBeUIsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZO2dCQUNyRywyQkFBMkIsQ0FBQztZQUM5QixNQUFNLDhCQUE4QixHQUFnQixFQUFFLFVBQVUsRUFBRSx5QkFBeUIsRUFBRSxDQUFDO1lBQzlGLE9BQU8sOEJBQThCLENBQUM7UUFDeEMsQ0FBQztRQUVELE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixLQUFLLENBQUMsbUNBQW1DLENBQUMsTUFBK0I7UUFDdkUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUNuQyxNQUFNLHlCQUF5QixHQUFZLEVBQUUsQ0FBQztRQUM5QyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFFdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLFlBQVksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQzNELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7WUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFDRCxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNHLElBQ0UsQ0FBQyxXQUFXLENBQUMsWUFBWTtnQkFDekIsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFVBQVU7Z0JBQ3JDLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQ3RDLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxNQUFNLGNBQWMsR0FBRztnQkFDckIsVUFBVSxFQUFFLFdBQVcsQ0FBQyxZQUFZLEVBQUUsVUFBVTtnQkFDaEQsV0FBVyxFQUFFLFdBQVcsQ0FBQyxZQUFZLEVBQUUsV0FBVzthQUNuRCxDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLFlBQWEsQ0FBQyxjQUF5QixDQUFDO1lBQzNFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLGNBQXdCLENBQUM7WUFDNUQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFO2lCQUNqQyxRQUFRLENBQUMsUUFBUSxDQUFDO2lCQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQXNCLENBQUM7aUJBQ3hDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztpQkFDL0IsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDdEQsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDekUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRTNELHlCQUF5QixDQUFDLElBQUksQ0FBQztnQkFDN0IsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUzthQUNqQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNwRSxhQUFhLEdBQUcsV0FBVyxDQUFDLFlBQWEsQ0FBQyxhQUF1QixDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQStCO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBK0I7UUFDbkQsT0FBTywyQkFBMkIsQ0FDaEMsTUFBTSxFQUNOLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUN6QyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUN2RCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFnQztRQUN0RCxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsSUFBSSxJQUFZLENBQUM7UUFDakIsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksT0FBZ0IsQ0FBQztRQUVyQixJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNyQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDN0QsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDM0MsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN2RCxPQUFPLEdBQUcsU0FBUyxDQUFDLFVBQVUsS0FBSyxzQkFBc0IsQ0FBQztRQUM1RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQXFDLENBQUM7WUFDckYsSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixRQUFRLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDcEQsQ0FBQztRQUVELElBQUksWUFBWSxFQUFFLDBCQUEwQixFQUFFLENBQUM7WUFDN0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLFdBQVcsSUFBSSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsV0FBVyxDQUFDO1lBQy9GLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxJQUFJLDhCQUE4QixDQUN0QyxtQ0FBbUMsSUFBSSx1Q0FBdUMsV0FBVyxFQUFFLEVBQzNGLEtBQUssRUFDTCxDQUFDLFFBQVEsQ0FBQyxFQUNWLFVBQVUsQ0FBQyxLQUFLLEVBQ2hCLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUN0QyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6RSxNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxvSUFBb0ksQ0FDdkosQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM1QyxNQUFNLElBQUksOEJBQThCLENBQ3RDLHFCQUFxQixRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sbURBQW1ELElBQUksRUFBRSxFQUM1RyxLQUFLLEVBQ0wsQ0FBQyxRQUFRLENBQUMsRUFDVixVQUFVLENBQUMsS0FBSyxFQUNoQixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FDdEMsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMzRCxNQUFNLElBQUksOEJBQThCLENBQ3RDLG9CQUFvQixRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sc0NBQXNDLFFBQVEsRUFBRSxFQUNqRyxLQUFLLEVBQ0wsQ0FBQyxRQUFRLENBQUMsRUFDVixVQUFVLENBQUMsS0FBSyxFQUNoQixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FDdEMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsdUJBQXVCLENBQUMsTUFBYztRQUNwQyxPQUFPLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTyxJQUFJLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQTJCO1FBQ3pFLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0Qsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDOztBQTNwQmdCLGVBQVcsR0FBRyxLQUFLLEFBQVIsQ0FBUztBQUVwQixzQkFBa0IsR0FBRyxLQUFLLEFBQVIsQ0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIERvdEFzc2V0VHlwZXMsXG4gIEVkZHNhLFxuICBFbnZpcm9ubWVudHMsXG4gIEV4cGxhbmF0aW9uUmVzdWx0LFxuICBLZXlQYWlyLFxuICBNUENBbGdvcml0aG0sXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIEVERFNBTWV0aG9kcyxcbiAgRUREU0FNZXRob2RUeXBlcyxcbiAgTVBDVHgsXG4gIE1QQ1JlY292ZXJ5T3B0aW9ucyxcbiAgTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyxcbiAgTVBDU3dlZXBUeHMsXG4gIFJlY292ZXJ5VHhSZXF1ZXN0LFxuICBNUENVbnNpZ25lZFR4LFxuICBNUENTd2VlcFJlY292ZXJ5T3B0aW9ucyxcbiAgTVBDVHhzLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MsXG4gIFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBjb2lucywgUG9sa2Fkb3RTcGVjTmFtZVR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEludGVyZmFjZSxcbiAgS2V5UGFpciBhcyBEb3RLZXlQYWlyLFxuICBOYXRpdmVUcmFuc2ZlckJ1aWxkZXIsXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LFxuICBVdGlscyxcbiAgZXhwbGFpbkRvdFRyYW5zYWN0aW9uLFxufSBmcm9tICcuL2xpYic7XG5pbXBvcnQgJ0Bwb2xrYWRvdC9hcGktYXVnbWVudCc7XG5pbXBvcnQgeyBBcGlQcm9taXNlLCBXc1Byb3ZpZGVyIH0gZnJvbSAnQHBvbGthZG90L2FwaSc7XG5pbXBvcnQgeyBNYXRlcmlhbCB9IGZyb20gJy4vbGliL2lmYWNlJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IGF1ZGl0RWRkc2FQcml2YXRlS2V5LCBnZXREZXJpdmF0aW9uUGF0aCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0NBTl9GQUNUT1IgPSAyMDsgLy8gZGVmYXVsdCBudW1iZXIgb2YgcmVjZWl2ZSBhZGRyZXNzZXMgdG8gc2NhbiBmb3IgZnVuZHNcblxuZXhwb3J0IGludGVyZmFjZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zIGV4dGVuZHMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkO1xuICBwcnY6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblByZWJ1aWxkIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHJhbnNhY3Rpb246IEludGVyZmFjZS5UeERhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpZWRUcmFuc2FjdGlvblBhcmFtZXRlcnMge1xuICB0eEhleDogc3RyaW5nO1xuICBwcnY6IHN0cmluZztcbn1cblxuY29uc3QgZG90VXRpbHMgPSBVdGlscy5kZWZhdWx0O1xuXG5leHBvcnQgY2xhc3MgRG90IGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuICByZWFkb25seSBNQVhfVkFMSURJVFlfRFVSQVRJT04gPSAyNDAwO1xuICByZWFkb25seSBTV0VFUF9UWE5fRFVSQVRJT04gPSA2NDtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHN0YXRpYyBNUEM6IEVkZHNhO1xuICBwcm90ZWN0ZWQgc3RhdGljIG5vZGVBcGlJbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc3RhdGljIEFQSTogQXBpUHJvbWlzZTtcblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgRG90KGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnZG90JztcbiAgfVxuXG4gIGdldEJhc2VDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnZG90JztcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnZG90JztcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdQb2xrYWRvdCc7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGFnIGZvciBzZW5kaW5nIHZhbHVlIG9mIDBcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgb2theSB0byBzZW5kIDAgdmFsdWUsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiAnZWRkc2EnO1xuICB9XG5cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGVkMjU1MTkga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiwgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gZG90VXRpbHMua2V5UGFpckZyb21TZWVkKG5ldyBVaW50OEFycmF5KHNlZWQpKSA6IG5ldyBEb3RLZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkb3RVdGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdXBwbGllZCBwcml2YXRlIGtleSBpcyBhIHZhbGlkIGRvdCBwcml2YXRlIGtleVxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJ2IHRoZSBwcnYgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHJ2KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRvdFV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KHBydik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhZGRyZXNzIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZG90VXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBtZXNzYWdlIHdpdGggcHJpdmF0ZSBrZXlcbiAgICpcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKiBAcmV0dXJuIHtCdWZmZXJ9IEEgc2lnbmF0dXJlIG92ZXIgdGhlIGdpdmVuIG1lc3NhZ2UgdXNpbmcgdGhlIGdpdmVuIGtleVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5OiBLZXlQYWlyLCBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IG1zZyA9IEJ1ZmZlci5pc0J1ZmZlcihtZXNzYWdlKSA/IG1lc3NhZ2UudG9TdHJpbmcoJ3V0ZjgnKSA6IG1lc3NhZ2U7XG4gICAgLy8gcmVjb25zdGl0dXRlIGtleXMgYW5kIHNpZ25cbiAgICByZXR1cm4gQnVmZmVyLmZyb20obmV3IERvdEtleVBhaXIoeyBwcnY6IGtleS5wcnYgfSkuc2lnbk1lc3NhZ2UobXNnKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbi9wYXJzZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gdW5zaWduZWRUcmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uKHVuc2lnbmVkVHJhbnNhY3Rpb246IFVuc2lnbmVkVHJhbnNhY3Rpb24pOiBQcm9taXNlPEV4cGxhbmF0aW9uUmVzdWx0PiB7XG4gICAgbGV0IG91dHB1dEFtb3VudCA9IDA7XG4gICAgdW5zaWduZWRUcmFuc2FjdGlvbi5wYXJzZWRUeC5vdXRwdXRzLmZvckVhY2goKG8pID0+IHtcbiAgICAgIG91dHB1dEFtb3VudCArPSBwYXJzZUludChvLnZhbHVlU3RyaW5nLCAxMCk7XG4gICAgfSk7XG4gICAgY29uc3QgZXhwbGFuYXRpb25SZXN1bHQ6IEV4cGxhbmF0aW9uUmVzdWx0ID0ge1xuICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICdmZWUnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICdzZXF1ZW5jZUlkJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2Jsb2NrTnVtYmVyJyxcbiAgICAgIF0sXG4gICAgICBzZXF1ZW5jZUlkOiB1bnNpZ25lZFRyYW5zYWN0aW9uLnBhcnNlZFR4LnNlcXVlbmNlSWQsXG4gICAgICBmZWU6IHVuc2lnbmVkVHJhbnNhY3Rpb24uZmVlSW5mbz8uZmVlU3RyaW5nLFxuICAgICAgaWQ6IHVuc2lnbmVkVHJhbnNhY3Rpb24ucGFyc2VkVHguaWQsXG4gICAgICB0eXBlOiB1bnNpZ25lZFRyYW5zYWN0aW9uLnBhcnNlZFR4LnR5cGUsXG4gICAgICBvdXRwdXRzOiB1bnNpZ25lZFRyYW5zYWN0aW9uLnBhcnNlZFR4Lm91dHB1dHMsXG4gICAgICBibG9ja051bWJlcjogdW5zaWduZWRUcmFuc2FjdGlvbi5jb2luU3BlY2lmaWM/LmJsb2NrTnVtYmVyLFxuICAgICAgb3V0cHV0QW1vdW50OiBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgIH07XG5cbiAgICByZXR1cm4gZXhwbGFuYXRpb25SZXN1bHQ7XG4gIH1cblxuICB2ZXJpZnlTaWduVHJhbnNhY3Rpb25QYXJhbXMocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogVmVyaWZpZWRUcmFuc2FjdGlvblBhcmFtZXRlcnMge1xuICAgIGNvbnN0IHBydiA9IHBhcmFtcy5wcnY7XG5cbiAgICBjb25zdCB0eEhleCA9IHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4O1xuXG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHR4UHJlYnVpbGQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHR4SGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgdHlwZSAke3R5cGVvZiB0eEhleH1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBydiBwYXJhbWV0ZXIgdG8gc2lnbiB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHBydiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgdHlwZSAke3R5cGVvZiBwcnZ9YCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmhhcyhwYXJhbXMsICdwdWJzJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwdWJsaWMga2V5IHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHhIZXgsIHBydiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGtleWNoYWluIGFuZCBoYWxmLXNpZ24gcHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQge1RyYW5zYWN0aW9uUHJlYnVpbGR9IHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBwbGF0Zm9ybVxuICAgKiBAcGFyYW0gcGFyYW1zLnBydiB7U3RyaW5nfSB1c2VyIHBydlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj59XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHsgdHhIZXgsIHBydiB9ID0gdGhpcy52ZXJpZnlTaWduVHJhbnNhY3Rpb25QYXJhbXMocGFyYW1zKTtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRCdWlsZGVyKCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IERvdEtleVBhaXIoeyBwcnY6IHBydiB9KTtcbiAgICBjb25zdCB7IHJlZmVyZW5jZUJsb2NrLCBibG9ja051bWJlciwgdHJhbnNhY3Rpb25WZXJzaW9uLCBzZW5kZXIgfSA9IHBhcmFtcy50eFByZWJ1aWxkLnRyYW5zYWN0aW9uO1xuXG4gICAgdHhCdWlsZGVyXG4gICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiBibG9ja051bWJlciwgbWF4RHVyYXRpb246IHRoaXMuTUFYX1ZBTElESVRZX0RVUkFUSU9OIH0pXG4gICAgICAucmVmZXJlbmNlQmxvY2socmVmZXJlbmNlQmxvY2spXG4gICAgICAudmVyc2lvbih0cmFuc2FjdGlvblZlcnNpb24pXG4gICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyIH0pXG4gICAgICAuc2lnbih7IGtleToga2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25lZFR4SGV4ID0gdHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICByZXR1cm4geyB0eEhleDogc2lnbmVkVHhIZXggfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRJbml0aWFsaXplZE5vZGVBUEkoKTogUHJvbWlzZTxBcGlQcm9taXNlPiB7XG4gICAgaWYgKCFEb3Qubm9kZUFwaUluaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCB3c1Byb3ZpZGVyID0gbmV3IFdzUHJvdmlkZXIoRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLmRvdE5vZGVVcmxzKTtcbiAgICAgIERvdC5BUEkgPSBhd2FpdCBBcGlQcm9taXNlLmNyZWF0ZSh7IHByb3ZpZGVyOiB3c1Byb3ZpZGVyIH0pO1xuICAgICAgRG90Lm5vZGVBcGlJbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBEb3QuQVBJO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEFjY291bnRJbmZvKHdhbGxldEFkZHI6IHN0cmluZyk6IFByb21pc2U8eyBub25jZTogbnVtYmVyOyBmcmVlQmFsYW5jZTogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBhcGkgPSBhd2FpdCB0aGlzLmdldEluaXRpYWxpemVkTm9kZUFQSSgpO1xuICAgIGNvbnN0IHsgbm9uY2UsIGRhdGE6IGJhbGFuY2UgfSA9IGF3YWl0IGFwaS5xdWVyeS5zeXN0ZW0uYWNjb3VudCh3YWxsZXRBZGRyKTtcbiAgICByZXR1cm4geyBub25jZTogbm9uY2UudG9OdW1iZXIoKSwgZnJlZUJhbGFuY2U6IGJhbGFuY2UuZnJlZS50b051bWJlcigpIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0SGVhZGVySW5mbygpOiBQcm9taXNlPHsgaGVhZGVyTnVtYmVyOiBudW1iZXI7IGhlYWRlckhhc2g6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgYXBpID0gYXdhaXQgdGhpcy5nZXRJbml0aWFsaXplZE5vZGVBUEkoKTtcbiAgICBjb25zdCB7IG51bWJlciwgaGFzaCB9ID0gYXdhaXQgYXBpLnJwYy5jaGFpbi5nZXRIZWFkZXIoKTtcbiAgICByZXR1cm4geyBoZWFkZXJOdW1iZXI6IG51bWJlci50b051bWJlcigpLCBoZWFkZXJIYXNoOiBoYXNoLnRvU3RyaW5nKCkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBFc3RpbWF0ZSB0aGUgZmVlIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzdEFkZHIgZGVzdGluYXRpb24gd2FsbGV0IGFkZHJlc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNyY0FkZHIgc291cmNlIHdhbGxldCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgYW1vdW50IHRvIHRyYW5zZmVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBlc3RpbWF0ZWQgZmVlIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGNvc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL3BvbGthZG90LmpzLm9yZy9kb2NzL2FwaS9jb29rYm9vay90eCNob3ctZG8taS1lc3RpbWF0ZS10aGUtdHJhbnNhY3Rpb24tZmVlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEZlZShkZXN0QWRkcjogc3RyaW5nLCBzcmNBZGRyOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBhcGkgPSBhd2FpdCB0aGlzLmdldEluaXRpYWxpemVkTm9kZUFQSSgpO1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBhcGkudHguYmFsYW5jZXMudHJhbnNmZXJBbGxvd0RlYXRoKGRlc3RBZGRyLCBhbW91bnQpLnBheW1lbnRJbmZvKHNyY0FkZHIpO1xuICAgIHJldHVybiBpbmZvLnBhcnRpYWxGZWUudG9OdW1iZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRNYXRlcmlhbCgpOiBQcm9taXNlPE1hdGVyaWFsPiB7XG4gICAgY29uc3QgYXBpID0gYXdhaXQgdGhpcy5nZXRJbml0aWFsaXplZE5vZGVBUEkoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2VuZXNpc0hhc2g6IGFwaS5nZW5lc2lzSGFzaC50b1N0cmluZygpLFxuICAgICAgY2hhaW5OYW1lOiBhcGkucnVudGltZUNoYWluLnRvU3RyaW5nKCksXG4gICAgICBzcGVjTmFtZTogYXBpLnJ1bnRpbWVWZXJzaW9uLnNwZWNOYW1lLnRvU3RyaW5nKCkgYXMgUG9sa2Fkb3RTcGVjTmFtZVR5cGUsXG4gICAgICBzcGVjVmVyc2lvbjogYXBpLnJ1bnRpbWVWZXJzaW9uLnNwZWNWZXJzaW9uLnRvTnVtYmVyKCksXG4gICAgICB0eFZlcnNpb246IGFwaS5ydW50aW1lVmVyc2lvbi50cmFuc2FjdGlvblZlcnNpb24udG9OdW1iZXIoKSxcbiAgICAgIG1ldGFkYXRhOiBhcGkucnVudGltZU1ldGFkYXRhLnRvSGV4KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gICAqIEBwYXJhbSB7TVBDUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29uc3RydWN0IGFuZFxuICAgKiAobWF5YmUpIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtNUENUeH0gdGhlIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gaGV4IHN0cmluZyBhbmQgaW5kZXhcbiAgICogb2YgdGhlIGFkZHJlc3MgYmVpbmcgc3dlcHRcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBNUENSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPE1QQ1R4IHwgTVBDU3dlZXBUeHM+IHtcbiAgICBpZiAoIXBhcmFtcy5iaXRnb0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJpdGdvS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy51c2VyS2V5ICYmICFwYXJhbXMuYmFja3VwS2V5ICYmICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcblxuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG5cbiAgICBjb25zdCBpbmRleCA9IHBhcmFtcy5pbmRleCB8fCAwO1xuICAgIGNvbnN0IGN1cnJQYXRoID0gcGFyYW1zLnNlZWQgPyBnZXREZXJpdmF0aW9uUGF0aChwYXJhbXMuc2VlZCkgKyBgLyR7aW5kZXh9YCA6IGBtLyR7aW5kZXh9YDtcbiAgICBjb25zdCBhY2NvdW50SWQgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiaXRnb0tleSwgY3VyclBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICBjb25zdCBzZW5kZXJBZGRyID0gdGhpcy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShhY2NvdW50SWQpO1xuXG4gICAgY29uc3QgeyBub25jZSwgZnJlZUJhbGFuY2UgfSA9IGF3YWl0IHRoaXMuZ2V0QWNjb3VudEluZm8oc2VuZGVyQWRkcik7XG4gICAgY29uc3QgZGVzdEFkZHIgPSBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbjtcbiAgICBjb25zdCBhbW91bnQgPSBmcmVlQmFsYW5jZTtcbiAgICBjb25zdCBwYXJ0aWFsRmVlID0gYXdhaXQgdGhpcy5nZXRGZWUoZGVzdEFkZHIsIHNlbmRlckFkZHIsIGFtb3VudCk7XG5cbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBCaWdOdW1iZXIoZnJlZUJhbGFuY2UpLm1pbnVzKG5ldyBCaWdOdW1iZXIocGFydGlhbEZlZSkpO1xuICAgIGlmICh2YWx1ZS5pc0xlc3NUaGFuT3JFcXVhbFRvKDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZmluZCBhZGRyZXNzIHdpdGggZnVuZHMgdG8gcmVjb3ZlcicpO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IGJ1aWxkIHRoZSB1bnNpZ25lZCB0eG5cbiAgICBjb25zdCB7IGhlYWRlck51bWJlciwgaGVhZGVySGFzaCB9ID0gYXdhaXQgdGhpcy5nZXRIZWFkZXJJbmZvKCk7XG4gICAgY29uc3QgbWF0ZXJpYWwgPSBhd2FpdCB0aGlzLmdldE1hdGVyaWFsKCk7XG4gICAgY29uc3QgdmFsaWRpdHlXaW5kb3cgPSB7IGZpcnN0VmFsaWQ6IGhlYWRlck51bWJlciwgbWF4RHVyYXRpb246IHRoaXMuTUFYX1ZBTElESVRZX0RVUkFUSU9OIH07XG5cbiAgICBjb25zdCB0eG5CdWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCkuZ2V0VHJhbnNmZXJCdWlsZGVyKCkubWF0ZXJpYWwobWF0ZXJpYWwpO1xuICAgIHR4bkJ1aWxkZXJcbiAgICAgIC5zd2VlcChmYWxzZSlcbiAgICAgIC50byh7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIH0pXG4gICAgICAuc2VuZGVyKHsgYWRkcmVzczogc2VuZGVyQWRkciB9KVxuICAgICAgLnZhbGlkaXR5KHZhbGlkaXR5V2luZG93KVxuICAgICAgLnJlZmVyZW5jZUJsb2NrKGhlYWRlckhhc2gpXG4gICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiBub25jZSB9KVxuICAgICAgLmZlZSh7IGFtb3VudDogMCwgdHlwZTogJ3RpcCcgfSk7XG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0eG5CdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuXG4gICAgbGV0IHNlcmlhbGl6ZWRUeCA9IHVuc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBpZiAoIWlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgaWYgKCFwYXJhbXMudXNlcktleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMuYmFja3VwS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFuIHVwIHdoaXRlc3BhY2UgZnJvbSBlbnRlcmVkIHZhbHVlc1xuICAgICAgY29uc3QgdXNlcktleSA9IHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgICBjb25zdCBiYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICAgIC8vIERlY3J5cHQgcHJpdmF0ZSBrZXlzIGZyb20gS2V5Q2FyZCB2YWx1ZXNcbiAgICAgIGxldCB1c2VyUHJ2O1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXNlclBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHtcbiAgICAgICAgICBpbnB1dDogdXNlcktleSxcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGRlY3J5cHRpbmcgdXNlciBrZXljaGFpbjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICAvKiogVE9ETyBCRy01MjQxOSBJbXBsZW1lbnQgQ29kZWMgZm9yIHBhcnNpbmcgKi9cbiAgICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHVzZXJQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuVXNlclNpZ25pbmdNYXRlcmlhbDtcblxuICAgICAgbGV0IGJhY2t1cFBydjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJhY2t1cFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHtcbiAgICAgICAgICBpbnB1dDogYmFja3VwS2V5LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShiYWNrdXBQcnYpIGFzIEVERFNBTWV0aG9kVHlwZXMuQmFja3VwU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgICAvLyBhZGQgc2lnbmF0dXJlXG4gICAgICBjb25zdCBzaWduYXR1cmVIZXggPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0VFNTU2lnbmF0dXJlKFxuICAgICAgICB1c2VyU2lnbmluZ01hdGVyaWFsLFxuICAgICAgICBiYWNrdXBTaWduaW5nTWF0ZXJpYWwsXG4gICAgICAgIGN1cnJQYXRoLFxuICAgICAgICB1bnNpZ25lZFRyYW5zYWN0aW9uXG4gICAgICApO1xuICAgICAgY29uc3QgZG90S2V5UGFpciA9IG5ldyBEb3RLZXlQYWlyKHsgcHViOiBhY2NvdW50SWQgfSk7XG4gICAgICB0eG5CdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogZG90S2V5UGFpci5nZXRLZXlzKCkucHViIH0sIHNpZ25hdHVyZUhleCk7XG4gICAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHR4bkJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNlcmlhbGl6ZWRUeCA9IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbmV3IEJpZ051bWJlcihmcmVlQmFsYW5jZSk7XG4gICAgICBjb25zdCB3YWxsZXRDb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdW5zaWduZWRUcmFuc2FjdGlvbi5pbnB1dHNbMF0uYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZVN0cmluZzogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUudG9OdW1iZXIoKSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBjb25zdCBvdXRwdXRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdW5zaWduZWRUcmFuc2FjdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3MsXG4gICAgICAgICAgdmFsdWVTdHJpbmc6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29pbk5hbWU6IHdhbGxldENvaW4sXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgICAgY29uc3Qgc3BlbmRBbW91bnQgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgY29uc3QgcGFyc2VkVHggPSB7IGlucHV0czogaW5wdXRzLCBvdXRwdXRzOiBvdXRwdXRzLCBzcGVuZEFtb3VudDogc3BlbmRBbW91bnQsIHR5cGU6ICcnIH07XG4gICAgICBjb25zdCBmZWVJbmZvID0geyBmZWU6IDAsIGZlZVN0cmluZzogJzAnIH07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbjogTVBDVHggPSB7XG4gICAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LFxuICAgICAgICBzY2FuSW5kZXg6IGluZGV4LFxuICAgICAgICBjb2luOiB3YWxsZXRDb2luLFxuICAgICAgICBzaWduYWJsZUhleDogdW5zaWduZWRUcmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aDogY3VyclBhdGgsXG4gICAgICAgIHBhcnNlZFR4OiBwYXJzZWRUeCxcbiAgICAgICAgZmVlSW5mbzogZmVlSW5mbyxcbiAgICAgICAgY29pblNwZWNpZmljOiB7IC4uLnZhbGlkaXR5V2luZG93LCBjb21tb25LZXljaGFpbjogYml0Z29LZXkgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHVuc2lnbmVkVHg6IE1QQ1Vuc2lnbmVkVHggPSB7IHVuc2lnbmVkVHg6IHRyYW5zYWN0aW9uLCBzaWduYXR1cmVTaGFyZXM6IFtdIH07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbnM6IE1QQ1Vuc2lnbmVkVHhbXSA9IFt1bnNpZ25lZFR4XTtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdDogUmVjb3ZlcnlUeFJlcXVlc3QgPSB7XG4gICAgICAgIHRyYW5zYWN0aW9uczogdHJhbnNhY3Rpb25zLFxuICAgICAgICB3YWxsZXRDb2luOiB3YWxsZXRDb2luLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdHM6IE1QQ1N3ZWVwVHhzID0geyB0eFJlcXVlc3RzOiBbdHhSZXF1ZXN0XSB9O1xuICAgICAgcmV0dXJuIHR4UmVxdWVzdHM7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBNUENUeCA9IHsgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsIHNjYW5JbmRleDogaW5kZXggfTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIG5hdGl2ZSBET1QgcmVjb3ZlcmllcyBvZiByZWNlaXZlIGFkZHJlc3NlcyBpbiBiYXRjaCB3aXRob3V0IEJpdEdvLlxuICAgKiBGdW5kcyB3aWxsIGJlIHJlY292ZXJlZCB0byBiYXNlIGFkZHJlc3MgZmlyc3QuIFlvdSBuZWVkIHRvIGluaXRpYXRlIGFub3RoZXIgc3dlZXAgdHhuIGFmdGVyIHRoYXQuXG4gICAqXG4gICAqIEBwYXJhbSB7TVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9uc30gcGFyYW1zIC0gb3B0aW9ucyBmb3IgY29uc29saWRhdGlvbiByZWNvdmVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXhdIC0gcmVjZWl2ZSBhZGRyZXNzIGluZGV4IHRvIHN0YXJ0IHNjYW5uaW5nIGZyb20uIGRlZmF1bHQgdG8gMSAoaW5jbHVzaXZlKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuZW5kaW5nU2NhbkluZGV4XSAtIHJlY2VpdmUgYWRkcmVzcyBpbmRleCB0byBlbmQgc2Nhbm5pbmcgYXQuIGRlZmF1bHQgdG8gc3RhcnRpbmdTY2FuSW5kZXggKyAyMCAoZXhjbHVzaXZlKS5cbiAgICovXG4gIGFzeW5jIHJlY292ZXJDb25zb2xpZGF0aW9ucyhwYXJhbXM6IE1QQ0NvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gIXBhcmFtcy51c2VyS2V5ICYmICFwYXJhbXMuYmFja3VwS2V5ICYmICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcbiAgICBjb25zdCBzdGFydElkeCA9IHBhcmFtcy5zdGFydGluZ1NjYW5JbmRleCB8fCAxO1xuICAgIGNvbnN0IGVuZElkeCA9IHBhcmFtcy5lbmRpbmdTY2FuSW5kZXggfHwgc3RhcnRJZHggKyBERUZBVUxUX1NDQU5fRkFDVE9SO1xuXG4gICAgaWYgKHN0YXJ0SWR4IDwgMSB8fCBlbmRJZHggPD0gc3RhcnRJZHggfHwgZW5kSWR4IC0gc3RhcnRJZHggPiAxMCAqIERFRkFVTFRfU0NBTl9GQUNUT1IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgc3RhcnRpbmcgb3IgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3Nlcy4gc3RhcnRpbmdTY2FuSW5kZXg6ICR7c3RhcnRJZHh9LCBlbmRpbmdTY2FuSW5kZXg6ICR7ZW5kSWR4fS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCBiYXNlSW5kZXggPSAwO1xuICAgIGNvbnN0IGJhc2VQYXRoID0gcGFyYW1zLnNlZWQgPyBnZXREZXJpdmF0aW9uUGF0aChwYXJhbXMuc2VlZCkgKyBgLyR7YmFzZUluZGV4fWAgOiBgbS8ke2Jhc2VJbmRleH1gO1xuICAgIGNvbnN0IGFjY291bnRJZCA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGJpdGdvS2V5LCBiYXNlUGF0aCkuc2xpY2UoMCwgNjQpO1xuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gdGhpcy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShhY2NvdW50SWQpO1xuXG4gICAgY29uc3QgY29uc29saWRhdGlvblRyYW5zYWN0aW9uczogYW55W10gPSBbXTtcbiAgICBsZXQgbGFzdFNjYW5JbmRleCA9IHN0YXJ0SWR4O1xuICAgIGZvciAobGV0IGkgPSBzdGFydElkeDsgaSA8IGVuZElkeDsgaSsrKSB7XG4gICAgICBjb25zdCByZWNvdmVyUGFyYW1zID0ge1xuICAgICAgICB1c2VyS2V5OiBwYXJhbXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBwYXJhbXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleTogcGFyYW1zLmJpdGdvS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogYmFzZUFkZHJlc3MsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICBpbmRleDogaSxcbiAgICAgIH07XG5cbiAgICAgIGxldCByZWNvdmVyeVRyYW5zYWN0aW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVjb3ZlcnlUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVjb3ZlcihyZWNvdmVyUGFyYW1zKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gJ0RpZCBub3QgZmluZCBhZGRyZXNzIHdpdGggZnVuZHMgdG8gcmVjb3ZlcicpIHtcbiAgICAgICAgICBsYXN0U2NhbkluZGV4ID0gaTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCgocmVjb3ZlcnlUcmFuc2FjdGlvbiBhcyBNUENTd2VlcFR4cykudHhSZXF1ZXN0c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2gocmVjb3ZlcnlUcmFuc2FjdGlvbik7XG4gICAgICB9XG4gICAgICBsYXN0U2NhbkluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBpZiAoY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIGZ1bmRzIHRvIHJlY292ZXInKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAvLyBsYXN0U2NhbkluZGV4IHdpbGwgYmUgdXNlZCB0byBpbmZvcm0gdXNlciB0aGUgbGFzdCBhZGRyZXNzIGluZGV4IHNjYW5uZWQgZm9yIGF2YWlsYWJsZSBmdW5kcyAoc28gdGhleSBjYW5cbiAgICAgIC8vIGFwcHJvcHJpYXRlbHkgYWRqdXN0IHRoZSBzY2FuIHJhbmdlIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiBjb25zb2xpZGF0aW9uIHJlY292ZXJpZXMpLiBJbiB0aGUgY2FzZSBvZiB1bnNpZ25lZFxuICAgICAgLy8gc3dlZXAgY29uc29saWRhdGlvbnMsIHRoaXMgbGFzdFNjYW5JbmRleCB3aWxsIGJlIHByb3ZpZGVkIGluIHRoZSBjb2luU3BlY2lmaWMgb2YgdGhlIGxhc3QgdHhuIG1hZGUuXG4gICAgICBjb25zdCBsYXN0VHJhbnNhY3Rpb25Db2luU3BlY2lmaWMgPSB7XG4gICAgICAgIGZpcnN0VmFsaWQ6XG4gICAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9uc1tjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmNvaW5TcGVjaWZpY1xuICAgICAgICAgICAgLmZpcnN0VmFsaWQsXG4gICAgICAgIG1heER1cmF0aW9uOlxuICAgICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnNbY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5sZW5ndGggLSAxXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5jb2luU3BlY2lmaWNcbiAgICAgICAgICAgIC5tYXhEdXJhdGlvbixcbiAgICAgICAgY29tbW9uS2V5Y2hhaW46XG4gICAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9uc1tjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmNvaW5TcGVjaWZpY1xuICAgICAgICAgICAgLmNvbW1vbktleWNoYWluLFxuICAgICAgICBsYXN0U2NhbkluZGV4OiBsYXN0U2NhbkluZGV4LFxuICAgICAgfTtcbiAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnNbY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5sZW5ndGggLSAxXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5jb2luU3BlY2lmaWMgPVxuICAgICAgICBsYXN0VHJhbnNhY3Rpb25Db2luU3BlY2lmaWM7XG4gICAgICBjb25zdCBjb25zb2xpZGF0aW9uU3dlZXBUcmFuc2FjdGlvbnM6IE1QQ1N3ZWVwVHhzID0geyB0eFJlcXVlc3RzOiBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zIH07XG4gICAgICByZXR1cm4gY29uc29saWRhdGlvblN3ZWVwVHJhbnNhY3Rpb25zO1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYW5zYWN0aW9uczogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucywgbGFzdFNjYW5JbmRleCB9O1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgYXN5bmMgY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24ocGFyYW1zOiBNUENTd2VlcFJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzPiB7XG4gICAgY29uc3QgcmVxID0gcGFyYW1zLnNpZ25hdHVyZVNoYXJlcztcbiAgICBjb25zdCBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zOiBNUENUeFtdID0gW107XG4gICAgbGV0IGxhc3RTY2FuSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHJlcVtpXS50eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICBpZiAoIXJlcVtpXS5vdmMgfHwgIXJlcVtpXS5vdmNbMF0uZWRkc2FTaWduYXR1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHNpZ25hdHVyZShzKScpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gcmVxW2ldLm92Y1swXS5lZGRzYVNpZ25hdHVyZTtcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uc2lnbmFibGVIZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHNpZ25hYmxlIGhleCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVzc2FnZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHRyYW5zYWN0aW9uLnNpZ25hYmxlSGV4ISwgJ2hleCcpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlQnVmZmVyLCBzaWduYXR1cmUpO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2lnbmF0dXJlSGV4ID0gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oc2lnbmF0dXJlLlIsICdoZXgnKSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlLnNpZ21hLCAnaGV4JyldKTtcbiAgICAgIGlmIChcbiAgICAgICAgIXRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyB8fFxuICAgICAgICAhdHJhbnNhY3Rpb24uY29pblNwZWNpZmljPy5maXJzdFZhbGlkIHx8XG4gICAgICAgICF0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWM/Lm1heER1cmF0aW9uXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHZhbGlkaXR5IHdpbmRvdycpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsaWRpdHlXaW5kb3cgPSB7XG4gICAgICAgIGZpcnN0VmFsaWQ6IHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYz8uZmlyc3RWYWxpZCxcbiAgICAgICAgbWF4RHVyYXRpb246IHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYz8ubWF4RHVyYXRpb24sXG4gICAgICB9O1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSBhd2FpdCB0aGlzLmdldE1hdGVyaWFsKCk7XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYz8uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGNvbW1vbiBrZXljaGFpbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPSB0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWMhLmNvbW1vbktleWNoYWluISBhcyBzdHJpbmc7XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLmRlcml2YXRpb25QYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBkZXJpdmF0aW9uIHBhdGgnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gdHJhbnNhY3Rpb24uZGVyaXZhdGlvblBhdGggYXMgc3RyaW5nO1xuICAgICAgY29uc3QgYWNjb3VudElkID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIGRlcml2YXRpb25QYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyID0gdGhpcy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShhY2NvdW50SWQpO1xuICAgICAgY29uc3QgdHhuQnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlcigpXG4gICAgICAgIC5tYXRlcmlhbChtYXRlcmlhbClcbiAgICAgICAgLmZyb20odHJhbnNhY3Rpb24uc2VyaWFsaXplZFR4IGFzIHN0cmluZylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlckFkZHIgfSlcbiAgICAgICAgLnZhbGlkaXR5KHZhbGlkaXR5V2luZG93KTtcbiAgICAgIGNvbnN0IGRvdEtleVBhaXIgPSBuZXcgRG90S2V5UGFpcih7IHB1YjogYWNjb3VudElkIH0pO1xuICAgICAgdHhuQnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IGRvdEtleVBhaXIuZ2V0S2V5cygpLnB1YiB9LCBzaWduYXR1cmVIZXgpO1xuICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0eG5CdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zLnB1c2goe1xuICAgICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgc2NhbkluZGV4OiB0cmFuc2FjdGlvbi5zY2FuSW5kZXgsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGkgPT09IHJlcS5sZW5ndGggLSAxICYmIHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEubGFzdFNjYW5JbmRleCkge1xuICAgICAgICBsYXN0U2NhbkluZGV4ID0gdHJhbnNhY3Rpb24uY29pblNwZWNpZmljIS5sYXN0U2NhbkluZGV4IGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdHJhbnNhY3Rpb25zOiBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zLCBsYXN0U2NhbkluZGV4IH07XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB0aGlzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zLCB2ZXJpZmljYXRpb24sIHdhbGxldCwgcmVxSWQgfSA9IHBhcmFtcztcbiAgICBpZiAoIXR4UGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdHhQYXJhbXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYWluID0gdGhpcy5nZXRDaGFpbigpO1xuICAgIGxldCB0eFRvOiBzdHJpbmc7XG4gICAgbGV0IHR4QW1vdW50OiBzdHJpbmc7XG4gICAgbGV0IGlzU3dlZXA6IGJvb2xlYW47XG5cbiAgICBpZiAoY2hhaW4gPT09ICd0ZG90Jykge1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSBVdGlscy5kZWZhdWx0LmdldE1hdGVyaWFsKGNvaW5zLmdldChjaGFpbikpO1xuICAgICAgY29uc3QgZXhwbGFpbmVkID0gZXhwbGFpbkRvdFRyYW5zYWN0aW9uKHsgdHhIZXg6IHR4UHJlYnVpbGQudHhIZXgsIG1hdGVyaWFsIH0pO1xuICAgICAgdHhUbyA9IGV4cGxhaW5lZC5vdXRwdXRzWzBdPy5hZGRyZXNzID8/ICcnO1xuICAgICAgdHhBbW91bnQgPSBTdHJpbmcoZXhwbGFpbmVkLm91dHB1dHNbMF0/LmFtb3VudCA/PyAnMCcpO1xuICAgICAgaXNTd2VlcCA9IGV4cGxhaW5lZC5tZXRob2ROYW1lID09PSAnYmFsYW5jZXMudHJhbnNmZXJBbGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRCdWlsZGVyKCk7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHhQcmVidWlsZC50eEhleCkgYXMgdW5rbm93biBhcyBOYXRpdmVUcmFuc2ZlckJ1aWxkZXI7XG4gICAgICB0eFRvID0gdHhCdWlsZGVyWydfdG8nXTtcbiAgICAgIHR4QW1vdW50ID0gdHhCdWlsZGVyWydfYW1vdW50J107XG4gICAgICBpc1N3ZWVwID0gdHhCdWlsZGVyWydfc3dlZXBGcmVlQmFsYW5jZSddID09PSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh2ZXJpZmljYXRpb24/LmNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzKSB7XG4gICAgICBjb25zdCBiYXNlQWRkcmVzcyA9IHdhbGxldD8uY29pblNwZWNpZmljKCk/LnJvb3RBZGRyZXNzIHx8IHdhbGxldD8uY29pblNwZWNpZmljKCk/LmJhc2VBZGRyZXNzO1xuICAgICAgaWYgKCFiYXNlQWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZXRlcm1pbmUgYmFzZSBhZGRyZXNzIGZvciBjb25zb2xpZGF0aW9uJyk7XG4gICAgICB9XG4gICAgICBpZiAodHhUbyAhPT0gYmFzZUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcihcbiAgICAgICAgICBgVHJhbnNhY3Rpb24gZGVzdGluYXRpb24gYWRkcmVzcyAke3R4VG99IGRvZXMgbm90IG1hdGNoIHdhbGxldCBiYXNlIGFkZHJlc3MgJHtiYXNlQWRkcmVzc31gLFxuICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgIFt0eFBhcmFtc10sXG4gICAgICAgICAgdHhQcmVidWlsZC50eEhleCxcbiAgICAgICAgICBbeyBhZGRyZXNzOiB0eFRvLCBhbW91bnQ6IHR4QW1vdW50IH1dXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZWNpcGllbnRzIGluIHR4UGFyYW1zJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHR4UGFyYW1zLnJlY2lwaWVudHMpICYmIHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7dGhpcy5nZXRDaGFpbigpfSBkb2Vzbid0IHN1cHBvcnQgc2VuZGluZyB0byBtb3JlIHRoYW4gMSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdpdGhpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4gVHJ5IGFnYWluLCB1c2luZyBvbmx5IGEgc2luZ2xlIHJlY2lwaWVudC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3MgIT09IHR4VG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcihcbiAgICAgICAgICBgUmVjaXBpZW50IGFkZHJlc3MgJHt0eFBhcmFtcy5yZWNpcGllbnRzWzBdLmFkZHJlc3N9IGRvZXMgbm90IG1hdGNoIHRyYW5zYWN0aW9uIGRlc3RpbmF0aW9uIGFkZHJlc3MgJHt0eFRvfWAsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgW3R4UGFyYW1zXSxcbiAgICAgICAgICB0eFByZWJ1aWxkLnR4SGV4LFxuICAgICAgICAgIFt7IGFkZHJlc3M6IHR4VG8sIGFtb3VudDogdHhBbW91bnQgfV1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1N3ZWVwICYmIHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYW1vdW50ICE9PSB0eEFtb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgVHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yKFxuICAgICAgICAgIGBSZWNpcGllbnQgYW1vdW50ICR7dHhQYXJhbXMucmVjaXBpZW50c1swXS5hbW91bnR9IGRvZXMgbm90IG1hdGNoIHRyYW5zYWN0aW9uIGFtb3VudCAke3R4QW1vdW50fWAsXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgW3R4UGFyYW1zXSxcbiAgICAgICAgICB0eFByZWJ1aWxkLnR4SGV4LFxuICAgICAgICAgIFt7IGFkZHJlc3M6IHR4VG8sIGFtb3VudDogdHhBbW91bnQgfV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleShQdWJrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBEb3RLZXlQYWlyKHsgcHViOiBQdWJrZXkgfSkuZ2V0QWRkcmVzcyhVdGlscy5kZWZhdWx0LmdldEFkZHJlc3NGb3JtYXQodGhpcy5nZXRDaGFpbigpIGFzIERvdEFzc2V0VHlwZXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGRlcigpOiBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgcHVibGljS2V5LCBwcnYsIG11bHRpU2lnVHlwZSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcykge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cbn1cbiJdfQ==