@witnet/solidity 3.0.4 → 3.0.5

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 (222) hide show
  1. package/LICENSE +2 -2
  2. package/build/contracts/Bech32.json +1 -1
  3. package/build/contracts/Clonable.json +1 -1
  4. package/build/contracts/Context.json +1 -1
  5. package/build/contracts/Create3.json +1 -1
  6. package/build/contracts/ERC165.json +1 -1
  7. package/build/contracts/Escrowable.json +1 -1
  8. package/build/contracts/IChainlinkAggregatorV3.json +1 -1
  9. package/build/contracts/IERC165.json +1 -1
  10. package/build/contracts/IERC20.json +1 -1
  11. package/build/contracts/IERC2362.json +1 -1
  12. package/build/contracts/IPythChainlinkAggregatorV3.json +1 -1
  13. package/build/contracts/IWitAppliance.json +1 -1
  14. package/build/contracts/IWitOracle.json +1 -1
  15. package/build/contracts/IWitOracleAppliance.json +1 -1
  16. package/build/contracts/IWitOracleConsumer.json +1 -1
  17. package/build/contracts/IWitOracleConsumerLegacy.json +1 -1
  18. package/build/contracts/IWitOracleLegacy.json +1 -1
  19. package/build/contracts/IWitOracleQueriable.json +1 -1
  20. package/build/contracts/IWitOracleQueriableConsumer.json +1 -1
  21. package/build/contracts/IWitOracleQueriableEvents.json +1 -1
  22. package/build/contracts/IWitOracleQueriableExperimental.json +1 -1
  23. package/build/contracts/IWitOracleQueriableTrustableReporter.json +1 -1
  24. package/build/contracts/IWitOracleQueriableTrustlessReporter.json +1 -1
  25. package/build/contracts/IWitOracleRadonRegistry.json +1 -1
  26. package/build/contracts/IWitOracleRadonRegistryEvents.json +1 -1
  27. package/build/contracts/IWitOracleRadonRegistryLegacy.json +1 -1
  28. package/build/contracts/IWitOracleRadonRequestFactory.json +1 -1
  29. package/build/contracts/IWitOracleRadonRequestModal.json +1 -1
  30. package/build/contracts/IWitOracleRadonRequestTemplate.json +1 -1
  31. package/build/contracts/IWitOracleRequest.json +1 -1
  32. package/build/contracts/IWitOracleRequestFactory.json +1 -1
  33. package/build/contracts/IWitOracleRequestFactoryEvents.json +1 -1
  34. package/build/contracts/IWitOracleRequestTemplate.json +1 -1
  35. package/build/contracts/IWitOracleTrustableAdmin.json +1 -1
  36. package/build/contracts/IWitOracleTrustless.json +1 -1
  37. package/build/contracts/IWitPriceFeeds.json +1 -1
  38. package/build/contracts/IWitPriceFeedsAdmin.json +1 -1
  39. package/build/contracts/IWitPriceFeedsConsumer.json +1 -1
  40. package/build/contracts/IWitPriceFeedsEvents.json +1 -1
  41. package/build/contracts/IWitPriceFeedsLegacy.json +1 -1
  42. package/build/contracts/IWitPriceFeedsLegacyAdmin.json +1 -1
  43. package/build/contracts/IWitPriceFeedsLegacySolver.json +1 -1
  44. package/build/contracts/IWitPriceFeedsLegacySolverFactory.json +1 -1
  45. package/build/contracts/IWitPriceFeedsTypes.json +1 -1
  46. package/build/contracts/IWitPyth.json +1 -1
  47. package/build/contracts/IWitPythChainlinkAggregator.json +1 -1
  48. package/build/contracts/IWitPythErrors.json +1 -1
  49. package/build/contracts/IWitPythEvents.json +1 -1
  50. package/build/contracts/IWitPythReporter.json +1 -1
  51. package/build/contracts/IWitRandomness.json +1 -1
  52. package/build/contracts/IWitRandomnessAdmin.json +1 -1
  53. package/build/contracts/IWitRandomnessAdminV2.json +1 -1
  54. package/build/contracts/IWitRandomnessConsumer.json +1 -1
  55. package/build/contracts/IWitRandomnessEvents.json +1 -1
  56. package/build/contracts/IWitRandomnessLegacy.json +1 -1
  57. package/build/contracts/IWitRandomnessTypes.json +1 -1
  58. package/build/contracts/Initializable.json +1 -1
  59. package/build/contracts/OVM_GasPriceOracle.json +1 -1
  60. package/build/contracts/Ownable.json +1 -1
  61. package/build/contracts/Ownable2Step.json +1 -1
  62. package/build/contracts/Payable.json +1 -1
  63. package/build/contracts/Proxiable.json +1 -1
  64. package/build/contracts/ReentrancyGuard.json +1 -1
  65. package/build/contracts/Secp256k1.json +1 -1
  66. package/build/contracts/Slices.json +1 -1
  67. package/build/contracts/TestBech32.json +1 -1
  68. package/build/contracts/TestSecp256k1.json +1 -1
  69. package/build/contracts/Upgradeable.json +1 -1
  70. package/build/contracts/UsingWitOracle.json +1 -1
  71. package/build/contracts/UsingWitPriceFeeds.json +1 -1
  72. package/build/contracts/UsingWitRandomness.json +1 -1
  73. package/build/contracts/WitOracle.json +2 -13
  74. package/build/contracts/WitOracleBasePushOnly.json +1 -1
  75. package/build/contracts/WitOracleBasePushOnlyTrustable.json +1 -1
  76. package/build/contracts/WitOracleBasePushOnlyTrustless.json +1 -1
  77. package/build/contracts/WitOracleBasePushOnlyUpgradable.json +1 -1
  78. package/build/contracts/WitOracleBaseQueriable.json +1 -1
  79. package/build/contracts/WitOracleBaseQueriableTrustable.json +1 -1
  80. package/build/contracts/WitOracleBaseQueriableTrustless.json +1 -1
  81. package/build/contracts/WitOracleBaseQueriableUpgradable.json +1 -1
  82. package/build/contracts/WitOracleDataLib.json +2 -254
  83. package/build/contracts/WitOraclePushOnly.json +1 -1
  84. package/build/contracts/WitOracleRadonEncodingLib.json +2 -13
  85. package/build/contracts/WitOracleRadonRegistry.json +2 -13
  86. package/build/contracts/WitOracleRadonRegistryBase.json +1 -1
  87. package/build/contracts/WitOracleRadonRegistryBaseUpgradable.json +1 -1
  88. package/build/contracts/WitOracleRadonRegistryData.json +1 -1
  89. package/build/contracts/WitOracleRadonRegistryDefaultV21.json +1 -1
  90. package/build/contracts/WitOracleRadonRegistryUpgradableDefault.json +2 -17
  91. package/build/contracts/WitOracleRadonRegistryUpgradableNoSha256.json +1 -1
  92. package/build/contracts/WitOracleRadonRegistryUpgradableZkSync.json +1 -1
  93. package/build/contracts/WitOracleRadonRequestFactory.json +2 -13
  94. package/build/contracts/WitOracleRadonRequestFactoryBase.json +1 -1
  95. package/build/contracts/WitOracleRadonRequestFactoryBaseUpgradable.json +1 -1
  96. package/build/contracts/WitOracleRadonRequestFactoryModals.json +2 -13
  97. package/build/contracts/WitOracleRadonRequestFactoryModalsDefault.json +2 -13
  98. package/build/contracts/WitOracleRadonRequestFactoryTemplates.json +2 -13
  99. package/build/contracts/WitOracleRadonRequestFactoryTemplatesDefault.json +2 -13
  100. package/build/contracts/WitOracleRadonRequestFactoryUpgradableConfluxCore.json +1 -1
  101. package/build/contracts/WitOracleRadonRequestFactoryUpgradableDefault.json +2 -13
  102. package/build/contracts/WitOracleResultStatusLib.json +2 -14
  103. package/build/contracts/WitOracleTrustableDefault.json +2 -259
  104. package/build/contracts/WitOracleTrustableExperimental.json +1 -1
  105. package/build/contracts/WitOracleTrustableObscuro.json +1 -1
  106. package/build/contracts/WitOracleTrustableOvm2.json +1 -1
  107. package/build/contracts/WitOracleTrustablePushOnly.json +1 -1
  108. package/build/contracts/WitOracleTrustableReef.json +1 -1
  109. package/build/contracts/WitOracleTrustableZkSync.json +1 -1
  110. package/build/contracts/WitOracleTrustlessDataLib.json +1 -1
  111. package/build/contracts/WitOracleTrustlessDefaultV22.json +1 -1
  112. package/build/contracts/WitOracleTrustlessUpgradableDefault.json +1 -1
  113. package/build/contracts/WitPriceFeeds.json +2 -13
  114. package/build/contracts/WitPriceFeedsDataLib.json +2 -14
  115. package/build/contracts/WitPriceFeedsLegacy.json +2 -8
  116. package/build/contracts/WitPriceFeedsLegacyDataLib.json +2 -84
  117. package/build/contracts/WitPriceFeedsLegacyUpgradable.json +1 -1
  118. package/build/contracts/WitPriceFeedsLegacyUpgradableBypass.json +2 -80
  119. package/build/contracts/WitPriceFeedsSolverBase.json +1 -1
  120. package/build/contracts/WitPriceFeedsV3.json +1 -1
  121. package/build/contracts/WitPriceFeedsV3Upgradable.json +2 -17
  122. package/build/contracts/WitPythChainlinkAggregator.json +1 -1
  123. package/build/contracts/WitRandomness.json +2 -13
  124. package/build/contracts/WitRandomnessLegacy.json +1 -1
  125. package/build/contracts/WitRandomnessV3.json +2 -13
  126. package/build/contracts/WitRngConsumer.json +1 -1
  127. package/build/contracts/Witnet.json +1 -1
  128. package/build/contracts/WitnetBuffer.json +1 -1
  129. package/build/contracts/WitnetCBOR.json +1 -1
  130. package/build/contracts/WitnetDeployer.json +2 -13
  131. package/build/contracts/WitnetDeployerConfluxCore.json +1 -1
  132. package/build/contracts/WitnetDeployerDeferred.json +1 -1
  133. package/build/contracts/WitnetDeployerMeter.json +1 -1
  134. package/build/contracts/WitnetProxy.json +2 -9
  135. package/build/contracts/WitnetUpgradableBase.json +1 -1
  136. package/{migrations → dist/migrations}/addresses.json +1 -25
  137. package/{migrations → dist/migrations}/constructorArgs.json +1 -6
  138. package/dist/migrations/settings/artifacts.d.ts +95 -0
  139. package/dist/migrations/settings/artifacts.d.ts.map +1 -0
  140. package/dist/migrations/settings/artifacts.js +80 -0
  141. package/dist/migrations/settings/networks.d.ts +593 -0
  142. package/dist/migrations/settings/networks.d.ts.map +1 -0
  143. package/dist/migrations/settings/networks.js +593 -0
  144. package/dist/src/bin/helpers.cjs +350 -0
  145. package/dist/src/bin/helpers.d.cts +76 -0
  146. package/dist/src/bin/helpers.d.cts.map +1 -0
  147. package/dist/src/index.d.ts +6 -0
  148. package/dist/src/index.d.ts.map +1 -0
  149. package/dist/src/index.js +33 -0
  150. package/dist/src/lib/types.d.ts +99 -0
  151. package/dist/src/lib/types.d.ts.map +1 -0
  152. package/dist/src/lib/types.js +18 -0
  153. package/dist/src/lib/utils.d.ts +22 -0
  154. package/dist/src/lib/utils.d.ts.map +1 -0
  155. package/dist/src/lib/utils.js +267 -0
  156. package/dist/src/lib/wrappers/ContractWrapper.d.ts +47 -0
  157. package/dist/src/lib/wrappers/ContractWrapper.d.ts.map +1 -0
  158. package/dist/src/lib/wrappers/ContractWrapper.js +81 -0
  159. package/dist/src/lib/wrappers/WitAppliance.d.ts +7 -0
  160. package/dist/src/lib/wrappers/WitAppliance.d.ts.map +1 -0
  161. package/dist/src/lib/wrappers/WitAppliance.js +17 -0
  162. package/dist/src/lib/wrappers/WitArtifact.d.ts +6 -0
  163. package/dist/src/lib/wrappers/WitArtifact.d.ts.map +1 -0
  164. package/dist/src/lib/wrappers/WitArtifact.js +16 -0
  165. package/dist/src/lib/wrappers/WitOracle.d.ts +105 -0
  166. package/dist/src/lib/wrappers/WitOracle.d.ts.map +1 -0
  167. package/dist/src/lib/wrappers/WitOracle.js +217 -0
  168. package/dist/src/lib/wrappers/WitOracleConsumer.d.ts +16 -0
  169. package/dist/src/lib/wrappers/WitOracleConsumer.d.ts.map +1 -0
  170. package/dist/src/lib/wrappers/WitOracleConsumer.js +30 -0
  171. package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts +102 -0
  172. package/dist/src/lib/wrappers/WitOracleRadonRegistry.d.ts.map +1 -0
  173. package/dist/src/lib/wrappers/WitOracleRadonRegistry.js +140 -0
  174. package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts +81 -0
  175. package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.d.ts.map +1 -0
  176. package/dist/src/lib/wrappers/WitOracleRadonRequestFactory.js +257 -0
  177. package/dist/src/lib/wrappers/WitPriceFeeds.d.ts +91 -0
  178. package/dist/src/lib/wrappers/WitPriceFeeds.d.ts.map +1 -0
  179. package/dist/src/lib/wrappers/WitPriceFeeds.js +356 -0
  180. package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts +14 -0
  181. package/dist/src/lib/wrappers/WitPriceFeedsLegacy.d.ts.map +1 -0
  182. package/dist/src/lib/wrappers/WitPriceFeedsLegacy.js +64 -0
  183. package/dist/src/lib/wrappers/WitRandomness.d.ts +55 -0
  184. package/dist/src/lib/wrappers/WitRandomness.d.ts.map +1 -0
  185. package/dist/src/lib/wrappers/WitRandomness.js +165 -0
  186. package/dist/src/lib/wrappers.d.ts +8 -0
  187. package/dist/src/lib/wrappers.d.ts.map +1 -0
  188. package/dist/src/lib/wrappers.js +8 -0
  189. package/package.json +78 -54
  190. package/scripts/clean.cjs +21 -0
  191. package/scripts/eth-create2.cjs +38 -0
  192. package/scripts/eth-create3.cjs +45 -0
  193. package/scripts/postinstall.cjs +9 -0
  194. package/scripts/prepare.cjs +27 -0
  195. package/scripts/vanity2gen.cjs +121 -0
  196. package/scripts/vanity3gen.cjs +84 -0
  197. package/scripts/verify-proxies.cjs +50 -0
  198. package/scripts/verify-truffle.cjs +69 -0
  199. package/scripts/verify.js +95 -0
  200. package/scripts/wof-acls.js +17 -0
  201. package/src/bin/bots/bridge.cjs +0 -0
  202. package/src/bin/bots/randomizer.cjs +290 -0
  203. package/src/bin/bots/reporter.cjs +0 -0
  204. package/src/bin/cli/accounts.cjs +47 -0
  205. package/src/bin/cli/assets.cjs +466 -0
  206. package/src/bin/cli/framework.cjs +100 -0
  207. package/src/bin/cli/gateway.cjs +26 -0
  208. package/src/bin/cli/networks.cjs +63 -0
  209. package/src/bin/cli/priceFeeds.cjs +170 -0
  210. package/src/bin/cli/queries.cjs +217 -0
  211. package/src/bin/cli/randomness.cjs +367 -0
  212. package/src/bin/cli/reports.cjs +272 -0
  213. package/src/bin/cli/wizard.cjs +352 -0
  214. package/src/bin/helpers.cjs +388 -0
  215. package/src/bin/index.cjs +407 -0
  216. package/settings/artifacts.js +0 -71
  217. package/settings/index.js +0 -49
  218. package/settings/networks.js +0 -593
  219. package/settings/solidity.js +0 -11
  220. package/settings/specs.js +0 -102
  221. package/src/index.js +0 -96
  222. package/src/utils.js +0 -305
@@ -0,0 +1,140 @@
1
+ import { utils, Witnet } from "@witnet/sdk";
2
+ import { abiEncodeRadonAsset } from "../utils.js";
3
+ import { WitArtifact } from "./WitArtifact.js";
4
+ /**
5
+ * Wrapper class for the Wit/Oracle Radon Registry core contract as deployed in some supported EVM network.
6
+ * It allows formal verification of Radon Requests and Witnet-compliant data sources into such network,
7
+ * as to be securely referred on both Wit/Oracle queries pulled from within smart contracts,
8
+ * or Wit/Oracle query results pushed into smart contracts from offchain workflows.
9
+ */
10
+ export class WitOracleRadonRegistry extends WitArtifact {
11
+ constructor(signer, network) {
12
+ super(signer, network, "WitOracleRadonRegistry");
13
+ }
14
+ /// ===========================================================================================================
15
+ /// --- IWitOracleRadonRegistry -------------------------------------------------------------------------------
16
+ /**
17
+ * Determines the unique hash that would identify the given Radon Retrieval, if it was
18
+ * formally verified into the connected EVM network.
19
+ * @param retrieval Instance of a Radon Retrieval object.
20
+ */
21
+ async determineRadonRetrievalHash(retrieval) {
22
+ return this.contract
23
+ .getFunction("verifyRadonRetrieval(uint8,string,string,string[2][],bytes)")
24
+ .staticCall(...abiEncodeRadonAsset(retrieval))
25
+ .then((hash) => {
26
+ return hash.slice(2);
27
+ });
28
+ }
29
+ /**
30
+ * Returns information related to some previously verified Radon Request, on the connected EVM network.
31
+ * @param radHash The RAD hash that uniquely identifies the Radon Request.
32
+ */
33
+ async lookupRadonRequest(radHash) {
34
+ return this.contract
35
+ .getFunction("lookupRadonRequestBytecode(bytes32)")
36
+ .staticCall(`0x${radHash}`)
37
+ .then((bytecode) => Witnet.Radon.RadonRequest.fromBytecode(bytecode));
38
+ }
39
+ /**
40
+ * Returns the bytecode of some previously verified Radon Request, on the connected EVM network.
41
+ * @param radHash The RAD hash that uniquely identifies the Radon Request.
42
+ */
43
+ async lookupRadonRequestBytecode(radHash) {
44
+ return this.contract
45
+ .getFunction("lookupRadonRequestBytecode(bytes32)")
46
+ .staticCall(`${radHash.startsWith("0x") ? radHash : `0x${radHash}`}`);
47
+ }
48
+ /**
49
+ * Returns information about some previously verified Radon Retrieval on the connected EVM network.
50
+ * This information includes retrieval the method, URL, body, headers and the Radon script in charge
51
+ * to transform data before delivery, on the connected EVM network.
52
+ * @param radHash The RAD hash that uniquely identifies the Radon Request.
53
+ */
54
+ async lookupRadonRetrieval(hash) {
55
+ return this.contract
56
+ .getFunction("lookupRadonRetrieval(bytes32)")
57
+ .staticCall(`0x${hash}`)
58
+ .then((result) => {
59
+ return new Witnet.Radon.RadonRetrieval({
60
+ method: result[1],
61
+ url: result[3],
62
+ body: result[4],
63
+ headers: Object.fromEntries(result[5]),
64
+ script: utils.parseRadonScript(result[6]),
65
+ });
66
+ });
67
+ }
68
+ /**
69
+ * Formally verify the given Radon Request object into the connected EVM network.
70
+ * It also verifies all the Radon Retrieval scripts (i.e. data source) the Request
71
+ * relies on, if not yet done before.
72
+ *
73
+ * Verifying Radon assets modifies the EVM storage and therefore requires
74
+ * spending gas in proportion to the number and complexity of the data sources,
75
+ * and whether these had been previously verified before or not.
76
+ *
77
+ * If the given Radon Request happened to be already verified, no gas would be actually consumed.
78
+ *
79
+ * @param request Instance of a Radon Request object.
80
+ * @param options Async EVM transaction handlers.
81
+ * @returns The RAD hash of the Radon Request, as verified on the connected EVM network.
82
+ */
83
+ async verifyRadonRequest(request, options) {
84
+ const radHash = request.radHash;
85
+ await this.lookupRadonRequest(radHash).catch(async () => {
86
+ const hashes = [];
87
+ for (const index in request.sources) {
88
+ const retrieval = request.sources[index];
89
+ hashes.push(`0x${await this.verifyRadonRetrieval(retrieval, options)}`);
90
+ }
91
+ const aggregate = abiEncodeRadonAsset(request.sourcesReducer);
92
+ const tally = abiEncodeRadonAsset(request.witnessReducer);
93
+ if (options?.onVerifyRadonRequest) {
94
+ options.onVerifyRadonRequest(radHash);
95
+ }
96
+ await this.contract
97
+ .getFunction("verifyRadonRequest(bytes32[],(uint8,(uint8,bytes)[]),(uint8,(uint8,bytes)[]))")
98
+ .send(hashes, aggregate, tally)
99
+ .then(async (tx) => {
100
+ const receipt = await tx.wait(options?.confirmations || 1);
101
+ if (options?.onVerifyRadonRequestReceipt) {
102
+ options.onVerifyRadonRequestReceipt(receipt);
103
+ }
104
+ });
105
+ });
106
+ return radHash;
107
+ }
108
+ /**
109
+ * Formally verify the given Radon Retrieval script (i.e. data source), into the connected EVM network.
110
+ *
111
+ * Verifying Radon assets modifies the EVM storage and therefore requires
112
+ * spending gas in proportion to the size of the data source parameters (e.g. URL, body, headers, or Radon script).
113
+ *
114
+ * If the given Radon Retrieval object happened to be already verified, no EVM gas would be actually consumed.
115
+ *
116
+ * @param request Instance of a Radon Retrieval object.
117
+ * @param options Async EVM transaction handlers.
118
+ * @returns The unique hash of the Radon Retrieval object, as verified on the connected EVM network.
119
+ */
120
+ async verifyRadonRetrieval(retrieval, options) {
121
+ return this.determineRadonRetrievalHash(retrieval).then(async (hash) => {
122
+ await this.lookupRadonRetrieval(hash).catch(async () => {
123
+ if (options?.onVerifyRadonRetrieval) {
124
+ options.onVerifyRadonRetrieval(hash);
125
+ }
126
+ await this.contract
127
+ .getFunction("verifyRadonRetrieval(uint8,string,string,string[2][],bytes)")
128
+ .send(...abiEncodeRadonAsset(retrieval))
129
+ .then(async (tx) => {
130
+ const receipt = await tx.wait(options?.confirmations || 1);
131
+ if (options?.onVerifyRadonRetrievalReceipt) {
132
+ options.onVerifyRadonRetrievalReceipt(receipt);
133
+ }
134
+ });
135
+ });
136
+ return hash;
137
+ });
138
+ }
139
+ }
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2l0T3JhY2xlUmFkb25SZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd3JhcHBlcnMvV2l0T3JhY2xlUmFkb25SZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFdBQVc7SUFDdEQsWUFBWSxNQUFxQixFQUFFLE9BQWU7UUFDakQsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsK0dBQStHO0lBQy9HLCtHQUErRztJQUUvRzs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLDJCQUEyQixDQUN2QyxTQUFzQztRQUV0QyxPQUFPLElBQUksQ0FBQyxRQUFRO2FBQ2xCLFdBQVcsQ0FDWCw2REFBNkQsQ0FDN0Q7YUFDQSxVQUFVLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM3QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNyQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQzlCLE9BQWU7UUFFZixPQUFPLElBQUksQ0FBQyxRQUFRO2FBQ2xCLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQzthQUNsRCxVQUFVLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQzthQUMxQixJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FB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QTtJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FDaEMsU0FBc0MsRUFDdEMsT0FnQkM7UUFFRCxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3RFLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDdEQsSUFBSSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUNyQyxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLFFBQVE7cUJBQ2pCLFdBQVcsQ0FDWCw2REFBNkQsQ0FDN0Q7cUJBQ0EsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ3ZDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0JBQ2xCLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFBO29CQUMxRCxJQUFJLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxDQUFDO3dCQUM1QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQy9DLENBQUM7Z0JBQ0YsQ0FBQyxDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU8sSUFBSSxDQUFBO1FBQ1osQ0FBQyxDQUFDLENBQUE7SUFDSCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlscywgV2l0bmV0IH0gZnJvbSBcIkB3aXRuZXQvc2RrXCJcbmltcG9ydCB0eXBlIHsgQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQsIEpzb25ScGNTaWduZXIsIFJlc3VsdCB9IGZyb20gXCJldGhlcnNcIlxuaW1wb3J0IHsgYWJpRW5jb2RlUmFkb25Bc3NldCB9IGZyb20gXCIuLi91dGlscy5qc1wiXG5pbXBvcnQgeyBXaXRBcnRpZmFjdCB9IGZyb20gXCIuL1dpdEFydGlmYWN0LmpzXCJcblxuLyoqXG4gKiBXcmFwcGVyIGNsYXNzIGZvciB0aGUgV2l0L09yYWNsZSBSYWRvbiBSZWdpc3RyeSBjb3JlIGNvbnRyYWN0IGFzIGRlcGxveWVkIGluIHNvbWUgc3VwcG9ydGVkIEVWTSBuZXR3b3JrLlxuICogSXQgYWxsb3dzIGZvcm1hbCB2ZXJpZmljYXRpb24gb2YgUmFkb24gUmVxdWVzdHMgYW5kIFdpdG5ldC1jb21wbGlhbnQgZGF0YSBzb3VyY2VzIGludG8gc3VjaCBuZXR3b3JrLFxuICogYXMgdG8gYmUgc2VjdXJlbHkgcmVmZXJyZWQgb24gYm90aCBXaXQvT3JhY2xlIHF1ZXJpZXMgcHVsbGVkIGZyb20gd2l0aGluIHNtYXJ0IGNvbnRyYWN0cyxcbiAqIG9yIFdpdC9PcmFjbGUgcXVlcnkgcmVzdWx0cyBwdXNoZWQgaW50byBzbWFydCBjb250cmFjdHMgZnJvbSBvZmZjaGFpbiB3b3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5IGV4dGVuZHMgV2l0QXJ0aWZhY3Qge1xuXHRjb25zdHJ1Y3RvcihzaWduZXI6IEpzb25ScGNTaWduZXIsIG5ldHdvcms6IHN0cmluZykge1xuXHRcdHN1cGVyKHNpZ25lciwgbmV0d29yaywgXCJXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5XCIpXG5cdH1cblxuXHQvLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblx0Ly8vIC0tLSBJV2l0T3JhY2xlUmFkb25SZWdpc3RyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgdGhlIHVuaXF1ZSBoYXNoIHRoYXQgd291bGQgaWRlbnRpZnkgdGhlIGdpdmVuIFJhZG9uIFJldHJpZXZhbCwgaWYgaXQgd2FzXG5cdCAqIGZvcm1hbGx5IHZlcmlmaWVkIGludG8gdGhlIGNvbm5lY3RlZCBFVk0gbmV0d29yay5cblx0ICogQHBhcmFtIHJldHJpZXZhbCBJbnN0YW5jZSBvZiBhIFJhZG9uIFJldHJpZXZhbCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgZGV0ZXJtaW5lUmFkb25SZXRyaWV2YWxIYXNoKFxuXHRcdHJldHJpZXZhbDogV2l0bmV0LlJhZG9uLlJhZG9uUmV0cmlldmFsLFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcdFwidmVyaWZ5UmFkb25SZXRyaWV2YWwodWludDgsc3RyaW5nLHN0cmluZyxzdHJpbmdbMl1bXSxieXRlcylcIixcblx0XHRcdClcblx0XHRcdC5zdGF0aWNDYWxsKC4uLmFiaUVuY29kZVJhZG9uQXNzZXQocmV0cmlldmFsKSlcblx0XHRcdC50aGVuKChoYXNoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBoYXNoLnNsaWNlKDIpXG5cdFx0XHR9KVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzb21lIHByZXZpb3VzbHkgdmVyaWZpZWQgUmFkb24gUmVxdWVzdCwgb24gdGhlIGNvbm5lY3RlZCBFVk0gbmV0d29yay5cblx0ICogQHBhcmFtIHJhZEhhc2ggVGhlIFJBRCBoYXNoIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgUmFkb24gUmVxdWVzdC5cblx0ICovXG5cdHB1YmxpYyBhc3luYyBsb29rdXBSYWRvblJlcXVlc3QoXG5cdFx0cmFkSGFzaDogc3RyaW5nLFxuXHQpOiBQcm9taXNlPFdpdG5ldC5SYWRvbi5SYWRvblJlcXVlc3Q+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwibG9va3VwUmFkb25SZXF1ZXN0Qnl0ZWNvZGUoYnl0ZXMzMilcIilcblx0XHRcdC5zdGF0aWNDYWxsKGAweCR7cmFkSGFzaH1gKVxuXHRcdFx0LnRoZW4oKGJ5dGVjb2RlKSA9PiBXaXRuZXQuUmFkb24uUmFkb25SZXF1ZXN0LmZyb21CeXRlY29kZShieXRlY29kZSkpXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgYnl0ZWNvZGUgb2Ygc29tZSBwcmV2aW91c2x5IHZlcmlmaWVkIFJhZG9uIFJlcXVlc3QsIG9uIHRoZSBjb25uZWN0ZWQgRVZNIG5ldHdvcmsuXG5cdCAqIEBwYXJhbSByYWRIYXNoIFRoZSBSQUQgaGFzaCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIFJhZG9uIFJlcXVlc3QuXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgbG9va3VwUmFkb25SZXF1ZXN0Qnl0ZWNvZGUoXG5cdFx0cmFkSGFzaDogc3RyaW5nLFxuXHQpOiBQcm9taXNlPFdpdG5ldC5IZXhTdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwibG9va3VwUmFkb25SZXF1ZXN0Qnl0ZWNvZGUoYnl0ZXMzMilcIilcblx0XHRcdC5zdGF0aWNDYWxsKGAke3JhZEhhc2guc3RhcnRzV2l0aChcIjB4XCIpID8gcmFkSGFzaCA6IGAweCR7cmFkSGFzaH1gfWApXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBzb21lIHByZXZpb3VzbHkgdmVyaWZpZWQgUmFkb24gUmV0cmlldmFsIG9uIHRoZSBjb25uZWN0ZWQgRVZNIG5ldHdvcmsuXG5cdCAqIFRoaXMgaW5mb3JtYXRpb24gaW5jbHVkZXMgcmV0cmlldmFsIHRoZSBtZXRob2QsIFVSTCwgYm9keSwgaGVhZGVycyBhbmQgdGhlIFJhZG9uIHNjcmlwdCBpbiBjaGFyZ2Vcblx0ICogdG8gdHJhbnNmb3JtIGRhdGEgYmVmb3JlIGRlbGl2ZXJ5LCBvbiB0aGUgY29ubmVjdGVkIEVWTSBuZXR3b3JrLlxuXHQgKiBAcGFyYW0gcmFkSGFzaCBUaGUgUkFEIGhhc2ggdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBSYWRvbiBSZXF1ZXN0LlxuXHQgKi9cblx0cHVibGljIGFzeW5jIGxvb2t1cFJhZG9uUmV0cmlldmFsKFxuXHRcdGhhc2g6IHN0cmluZyxcblx0KTogUHJvbWlzZTxXaXRuZXQuUmFkb24uUmFkb25SZXRyaWV2YWw+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwibG9va3VwUmFkb25SZXRyaWV2YWwoYnl0ZXMzMilcIilcblx0XHRcdC5zdGF0aWNDYWxsKGAweCR7aGFzaH1gKVxuXHRcdFx0LnRoZW4oKHJlc3VsdDogUmVzdWx0KSA9PiB7XG5cdFx0XHRcdHJldHVybiBuZXcgV2l0bmV0LlJhZG9uLlJhZG9uUmV0cmlldmFsKHtcblx0XHRcdFx0XHRtZXRob2Q6IHJlc3VsdFsxXSxcblx0XHRcdFx0XHR1cmw6IHJlc3VsdFszXSxcblx0XHRcdFx0XHRib2R5OiByZXN1bHRbNF0sXG5cdFx0XHRcdFx0aGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKHJlc3VsdFs1XSksXG5cdFx0XHRcdFx0c2NyaXB0OiB1dGlscy5wYXJzZVJhZG9uU2NyaXB0KHJlc3VsdFs2XSksXG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHR9XG5cblx0LyoqXG5cdCAqIEZvcm1hbGx5IHZlcmlmeSB0aGUgZ2l2ZW4gUmFkb24gUmVxdWVzdCBvYmplY3QgaW50byB0aGUgY29ubmVjdGVkIEVWTSBuZXR3b3JrLlxuXHQgKiBJdCBhbHNvIHZlcmlmaWVzIGFsbCB0aGUgUmFkb24gUmV0cmlldmFsIHNjcmlwdHMgKGkuZS4gZGF0YSBzb3VyY2UpIHRoZSBSZXF1ZXN0XG5cdCAqIHJlbGllcyBvbiwgaWYgbm90IHlldCBkb25lIGJlZm9yZS5cblx0ICpcblx0ICogVmVyaWZ5aW5nIFJhZG9uIGFzc2V0cyBtb2RpZmllcyB0aGUgRVZNIHN0b3JhZ2UgYW5kIHRoZXJlZm9yZSByZXF1aXJlc1xuXHQgKiBzcGVuZGluZyBnYXMgaW4gcHJvcG9ydGlvbiB0byB0aGUgbnVtYmVyIGFuZCBjb21wbGV4aXR5IG9mIHRoZSBkYXRhIHNvdXJjZXMsXG5cdCAqIGFuZCB3aGV0aGVyIHRoZXNlIGhhZCBiZWVuIHByZXZpb3VzbHkgdmVyaWZpZWQgYmVmb3JlIG9yIG5vdC5cblx0ICpcblx0ICogSWYgdGhlIGdpdmVuIFJhZG9uIFJlcXVlc3QgaGFwcGVuZWQgdG8gYmUgYWxyZWFkeSB2ZXJpZmllZCwgbm8gZ2FzIHdvdWxkIGJlIGFjdHVhbGx5IGNvbnN1bWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVxdWVzdCBJbnN0YW5jZSBvZiBhIFJhZG9uIFJlcXVlc3Qgb2JqZWN0LlxuXHQgKiBAcGFyYW0gb3B0aW9ucyBBc3luYyBFVk0gdHJhbnNhY3Rpb24gaGFuZGxlcnMuXG5cdCAqIEByZXR1cm5zIFRoZSBSQUQgaGFzaCBvZiB0aGUgUmFkb24gUmVxdWVzdCwgYXMgdmVyaWZpZWQgb24gdGhlIGNvbm5lY3RlZCBFVk0gbmV0d29yay5cblx0ICovXG5cdHB1YmxpYyBhc3luYyB2ZXJpZnlSYWRvblJlcXVlc3QoXG5cdFx0cmVxdWVzdDogV2l0bmV0LlJhZG9uLlJhZG9uUmVxdWVzdCxcblx0XHRvcHRpb25zPzoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBOdW1iZXIgb2YgYmxvY2sgY29uZmlybWF0aW9ucyB0byB3YWl0IGZvciBhZnRlciB2ZXJpZnlpbmcgdHJhbnNhY3Rpb24gZ2V0cyBtaW5lZCAoZGVmYXVsdHMgdG8gMSkuXG5cdFx0XHQgKi9cblx0XHRcdGNvbmZpcm1hdGlvbnM/OiBudW1iZXJcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2FsbGJhY2sgaGFuZGxlciBjYWxsZWQganVzdCBpbiBjYXNlIGEgYHZlcmlmeVJhZG9uUmVxdWVzdGAgdHJhbnNhY3Rpb24gaXMgdWx0aW1hdGVseSByZXF1aXJlZC5cblx0XHRcdCAqL1xuXHRcdFx0b25WZXJpZnlSYWRvblJlcXVlc3Q6IChyYWRIYXNoOiBzdHJpbmcpID0+IGFueVxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsYmFjayBoYW5kbGVyIGNhbGxlZCBvbmNlIHRoZSBgdmVyaWZ5UmFkb25SZXF1ZXN0YCB0cmFuc2FjdGlvbiBnZXRzIGNvbmZpcm1lZC5cblx0XHRcdCAqIEBwYXJhbSByZWNlaXB0IFRoZSBgdmVyaWZ5UmFkb25SZXF1ZXN0YCB0cmFuc2FjdGlvbiByZWNlaXB0LlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQ/OiAoXG5cdFx0XHRcdHJlY2VpcHQ6IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCxcblx0XHRcdCkgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIGZvciBldmVyeSBpbnZvbHZlZCBgdmVyaWZ5UmFkb25SZXRyaWV2YWxgIHRyYW5zYWN0aW9uLlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsPzogKGhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIGFmdGVyIGV2ZXJ5IGludm9sdmVkIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gZ2V0cyBjb25maXJtZWQuXG5cdFx0XHQgKiBAcGFyYW0gcmVjZWlwdCBUaGUgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiByZWNlaXB0LlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsUmVjZWlwdD86IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IHJhZEhhc2ggPSByZXF1ZXN0LnJhZEhhc2hcblx0XHRhd2FpdCB0aGlzLmxvb2t1cFJhZG9uUmVxdWVzdChyYWRIYXNoKS5jYXRjaChhc3luYyAoKSA9PiB7XG5cdFx0XHRjb25zdCBoYXNoZXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXHRcdFx0Zm9yIChjb25zdCBpbmRleCBpbiByZXF1ZXN0LnNvdXJjZXMpIHtcblx0XHRcdFx0Y29uc3QgcmV0cmlldmFsID0gcmVxdWVzdC5zb3VyY2VzW2luZGV4XVxuXHRcdFx0XHRoYXNoZXMucHVzaChgMHgke2F3YWl0IHRoaXMudmVyaWZ5UmFkb25SZXRyaWV2YWwocmV0cmlldmFsLCBvcHRpb25zKX1gKVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYWdncmVnYXRlID0gYWJpRW5jb2RlUmFkb25Bc3NldChyZXF1ZXN0LnNvdXJjZXNSZWR1Y2VyKVxuXHRcdFx0Y29uc3QgdGFsbHkgPSBhYmlFbmNvZGVSYWRvbkFzc2V0KHJlcXVlc3Qud2l0bmVzc1JlZHVjZXIpXG5cdFx0XHRpZiAob3B0aW9ucz8ub25WZXJpZnlSYWRvblJlcXVlc3QpIHtcblx0XHRcdFx0b3B0aW9ucy5vblZlcmlmeVJhZG9uUmVxdWVzdChyYWRIYXNoKVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5jb250cmFjdFxuXHRcdFx0XHQuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcdFx0XCJ2ZXJpZnlSYWRvblJlcXVlc3QoYnl0ZXMzMltdLCh1aW50OCwodWludDgsYnl0ZXMpW10pLCh1aW50OCwodWludDgsYnl0ZXMpW10pKVwiLFxuXHRcdFx0XHQpXG5cdFx0XHRcdC5zZW5kKGhhc2hlcywgYWdncmVnYXRlLCB0YWxseSlcblx0XHRcdFx0LnRoZW4oYXN5bmMgKHR4KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcmVjZWlwdCA9IGF3YWl0IHR4LndhaXQob3B0aW9ucz8uY29uZmlybWF0aW9ucyB8fCAxKVxuXHRcdFx0XHRcdGlmIChvcHRpb25zPy5vblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvbnMub25WZXJpZnlSYWRvblJlcXVlc3RSZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdH0pXG5cdFx0cmV0dXJuIHJhZEhhc2hcblx0fVxuXG5cdC8qKlxuXHQgKiBGb3JtYWxseSB2ZXJpZnkgdGhlIGdpdmVuIFJhZG9uIFJldHJpZXZhbCBzY3JpcHQgKGkuZS4gZGF0YSBzb3VyY2UpLCBpbnRvIHRoZSBjb25uZWN0ZWQgRVZNIG5ldHdvcmsuXG5cdCAqXG5cdCAqIFZlcmlmeWluZyBSYWRvbiBhc3NldHMgbW9kaWZpZXMgdGhlIEVWTSBzdG9yYWdlIGFuZCB0aGVyZWZvcmUgcmVxdWlyZXNcblx0ICogc3BlbmRpbmcgZ2FzIGluIHByb3BvcnRpb24gdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgc291cmNlIHBhcmFtZXRlcnMgKGUuZy4gVVJMLCBib2R5LCBoZWFkZXJzLCBvciBSYWRvbiBzY3JpcHQpLlxuXHQgKlxuXHQgKiBJZiB0aGUgZ2l2ZW4gUmFkb24gUmV0cmlldmFsIG9iamVjdCBoYXBwZW5lZCB0byBiZSBhbHJlYWR5IHZlcmlmaWVkLCBubyBFVk0gZ2FzIHdvdWxkIGJlIGFjdHVhbGx5IGNvbnN1bWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVxdWVzdCBJbnN0YW5jZSBvZiBhIFJhZG9uIFJldHJpZXZhbCBvYmplY3QuXG5cdCAqIEBwYXJhbSBvcHRpb25zIEFzeW5jIEVWTSB0cmFuc2FjdGlvbiBoYW5kbGVycy5cblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBoYXNoIG9mIHRoZSBSYWRvbiBSZXRyaWV2YWwgb2JqZWN0LCBhcyB2ZXJpZmllZCBvbiB0aGUgY29ubmVjdGVkIEVWTSBuZXR3b3JrLlxuXHQgKi9cblx0cHVibGljIGFzeW5jIHZlcmlmeVJhZG9uUmV0cmlldmFsKFxuXHRcdHJldHJpZXZhbDogV2l0bmV0LlJhZG9uLlJhZG9uUmV0cmlldmFsLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIE51bWJlciBvZiBibG9jayBjb25maXJtYXRpb25zIHRvIHdhaXQgZm9yIGFmdGVyIHZlcmlmeWluZyB0cmFuc2FjdGlvbiBnZXRzIG1pbmVkIChkZWZhdWx0cyB0byAxKS5cblx0XHRcdCAqL1xuXHRcdFx0Y29uZmlybWF0aW9ucz86IG51bWJlclxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsYmFjayBoYW5kbGVyIGNhbGxlZCBqdXN0IGluIGNhc2UgYSBgdmVyaWZ5UmFkb25SZXF1ZXN0YCB0cmFuc2FjdGlvbiBpcyB1bHRpbWF0ZWx5IHJlcXVpcmVkLlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsPzogKGhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIG9uY2UgdGhlIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gZ2V0cyBjb25maXJtZWQuXG5cdFx0XHQgKiBAcGFyYW0gcmVjZWlwdCBUaGUgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiByZWNlaXB0LlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsUmVjZWlwdD86IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLmRldGVybWluZVJhZG9uUmV0cmlldmFsSGFzaChyZXRyaWV2YWwpLnRoZW4oYXN5bmMgKGhhc2gpID0+IHtcblx0XHRcdGF3YWl0IHRoaXMubG9va3VwUmFkb25SZXRyaWV2YWwoaGFzaCkuY2F0Y2goYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25WZXJpZnlSYWRvblJldHJpZXZhbCkge1xuXHRcdFx0XHRcdG9wdGlvbnMub25WZXJpZnlSYWRvblJldHJpZXZhbChoYXNoKVxuXHRcdFx0XHR9XG5cdFx0XHRcdGF3YWl0IHRoaXMuY29udHJhY3Rcblx0XHRcdFx0XHQuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcdFx0XHRcInZlcmlmeVJhZG9uUmV0cmlldmFsKHVpbnQ4LHN0cmluZyxzdHJpbmcsc3RyaW5nWzJdW10sYnl0ZXMpXCIsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5zZW5kKC4uLmFiaUVuY29kZVJhZG9uQXNzZXQocmV0cmlldmFsKSlcblx0XHRcdFx0XHQudGhlbihhc3luYyAodHgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHJlY2VpcHQgPSBhd2FpdCB0eC53YWl0KG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMSlcblx0XHRcdFx0XHRcdGlmIChvcHRpb25zPy5vblZlcmlmeVJhZG9uUmV0cmlldmFsUmVjZWlwdCkge1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uVmVyaWZ5UmFkb25SZXRyaWV2YWxSZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdH0pXG5cdFx0XHRyZXR1cm4gaGFzaFxuXHRcdH0pXG5cdH1cbn1cbiJdfQ==
@@ -0,0 +1,81 @@
1
+ import { Witnet } from "@witnet/sdk";
2
+ import type { ContractTransactionReceipt } from "ethers";
3
+ import type { WitOracleResultDataTypes } from "../types.js";
4
+ import { WitAppliance } from "./WitAppliance.js";
5
+ import type { WitOracle } from "./WitOracle.js";
6
+ import type { WitOracleRadonRegistry } from "./WitOracleRadonRegistry.js";
7
+ export declare class WitOracleRadonRequestFactory extends WitAppliance {
8
+ readonly registry: WitOracleRadonRegistry;
9
+ protected constructor(witOracle: WitOracle, registry: WitOracleRadonRegistry, at?: string);
10
+ static deployed(witOracle: WitOracle, registry: WitOracleRadonRegistry): Promise<WitOracleRadonRequestFactory>;
11
+ deployRadonRequestTemplate(template: Witnet.Radon.RadonTemplate, options?: {
12
+ confirmations?: number;
13
+ onDeployRadonRequestTemplate?: (address: string) => any;
14
+ onDeployRadonRequestTemplateReceipt?: (receipt: ContractTransactionReceipt | null) => any;
15
+ /**
16
+ * Callback handler called just in case a `verifyRadonRetrieval` transaction is ultimately required.
17
+ */
18
+ onVerifyRadonRetrieval?: (hash: string) => any;
19
+ /**
20
+ * Callback handler called once the `verifyRadonRetrieval` transaction gets confirmed.
21
+ * @param receipt The `verifyRadonRetrieval` transaction receipt.
22
+ * @param hash The unique hash of the Radon Retrieval, as verified on the connected network.
23
+ */
24
+ onVerifyRadonRetrievalReceipt?: (receipt: ContractTransactionReceipt | null) => any;
25
+ }): Promise<WitOracleRadonRequestTemplate>;
26
+ deployRadonRequestModal(modal: Witnet.Radon.RadonModal, options?: {
27
+ confirmations?: number;
28
+ onDeployRadonRequestModal?: (address: string) => any;
29
+ onDeployRadonRequestModalReceipt?: (receipt: ContractTransactionReceipt | null) => any;
30
+ /**
31
+ * Callback handler called just in case a `verifyRadonRetrieval` transaction is ultimately required.
32
+ */
33
+ onVerifyRadonRetrieval?: (hash: string) => any;
34
+ /**
35
+ * Callback handler called once the `verifyRadonRetrieval` transaction gets confirmed.
36
+ * @param receipt The `verifyRadonRetrieval` transaction receipt.
37
+ * @param hash The unique hash of the Radon Retrieval, as verified on the connected network.
38
+ */
39
+ onVerifyRadonRetrievalReceipt?: (receipt: ContractTransactionReceipt | null) => any;
40
+ }): Promise<WitOracleRadonRequestModal>;
41
+ verifyRadonRequest(request: Witnet.Radon.RadonRequest, _options?: {
42
+ confirmations?: number;
43
+ onVerifyRadonRequest?: (address: string) => any;
44
+ onVerifyRadonRequestReceipt?: (receipt: ContractTransactionReceipt | null) => any;
45
+ /**
46
+ * Callback handler called just in case a `verifyRadonRetrieval` transaction is ultimately required.
47
+ */
48
+ onVerifyRadonRetrieval?: (hash: string) => any;
49
+ /**
50
+ * Callback handler called once the `verifyRadonRetrieval` transaction gets confirmed.
51
+ * @param receipt The `verifyRadonRetrieval` transaction receipt.
52
+ * @param hash The unique hash of the Radon Retrieval, as verified on the connected network.
53
+ */
54
+ onVerifyRadonRetrievalReceipt?: (receipt: ContractTransactionReceipt | null) => any;
55
+ }): Promise<Witnet.Hash>;
56
+ }
57
+ export declare class WitOracleRadonRequestModal extends WitAppliance {
58
+ protected constructor(witOracle: WitOracle, at: string);
59
+ static at(witOracle: WitOracle, target: string): Promise<WitOracleRadonRequestModal>;
60
+ getDataResultType(): Promise<WitOracleResultDataTypes>;
61
+ getDataSourcesArgsCount(): Promise<number>;
62
+ getRadonModalRetrieval(): Promise<Witnet.Radon.RadonRetrieval>;
63
+ verifyRadonRequest(dataProviders: string[], commonRetrievalArgs?: string[], options?: {
64
+ confirmations?: number;
65
+ onVerifyRadonRequest: (radHash: string) => any;
66
+ onVerifyRadonRequestReceipt: (receipt: ContractTransactionReceipt | null) => any;
67
+ }): Promise<Witnet.Hash>;
68
+ }
69
+ export declare class WitOracleRadonRequestTemplate extends WitAppliance {
70
+ protected constructor(witOracle: WitOracle, at: string);
71
+ static at(witOracle: WitOracle, target: string): Promise<WitOracleRadonRequestTemplate>;
72
+ getDataResultType(): Promise<WitOracleResultDataTypes>;
73
+ getDataSources(): Promise<Array<Witnet.Radon.RadonRetrieval>>;
74
+ getDataSourcesArgsCount(): Promise<Array<number>>;
75
+ verifyRadonRequest(args: string | string[] | Array<string[]>, options?: {
76
+ confirmations?: number;
77
+ onVerifyRadonRequest: (radHash: string) => any;
78
+ onVerifyRadonRequestReceipt: (receipt: ContractTransactionReceipt | null) => any;
79
+ }): Promise<Witnet.HexString>;
80
+ }
81
+ //# sourceMappingURL=WitOracleRadonRequestFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WitOracleRadonRequestFactory.d.ts","sourceRoot":"","sources":["../../../../src/lib/wrappers/WitOracleRadonRequestFactory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,257 @@
1
+ import { Witnet } from "@witnet/sdk";
2
+ import { abiEncodeRadonAsset, parseRadonScript } from "../utils.js";
3
+ import { WitAppliance } from "./WitAppliance.js";
4
+ export class WitOracleRadonRequestFactory extends WitAppliance {
5
+ registry;
6
+ constructor(witOracle, registry, at) {
7
+ super(witOracle, "WitOracleRadonRequestFactory", at);
8
+ this.registry = registry;
9
+ }
10
+ static async deployed(witOracle, registry) {
11
+ const deployer = new WitOracleRadonRequestFactory(witOracle, registry);
12
+ const witOracleRegistryAddress = await witOracle.contract.registry.staticCall();
13
+ if (registry.address !== witOracleRegistryAddress) {
14
+ throw new Error(`${WitOracleRadonRequestFactory.constructor.name} at ${deployer.address}: uncompliant WitOracleRadonRegistry at ${registry.address})`);
15
+ }
16
+ return deployer;
17
+ }
18
+ async deployRadonRequestTemplate(template, options) {
19
+ const hashes = [];
20
+ for (const index in template.sources) {
21
+ const retrieval = template.sources[index];
22
+ const hash = `0x${await this.registry.determineRadonRetrievalHash(retrieval)}`;
23
+ await this.registry.verifyRadonRetrieval(retrieval, options);
24
+ hashes.push(hash);
25
+ }
26
+ const aggregator = abiEncodeRadonAsset(template.sourcesReducer);
27
+ const tally = abiEncodeRadonAsset(template.witnessReducer);
28
+ const target = await this.contract
29
+ .getFunction("buildRadonRequestTemplate(bytes32[],(uint8,(uint8,bytes)[]),(uint8,(uint8,bytes)[]))")
30
+ .staticCall(hashes, aggregator, tally);
31
+ if (options?.onDeployRadonRequestTemplate)
32
+ options.onDeployRadonRequestTemplate(target);
33
+ await this.contract
34
+ .getFunction("buildRadonRequestTemplate(bytes32[],(uint8,(uint8,bytes)[]),(uint8,(uint8,bytes)[]))")
35
+ .send(hashes, aggregator, tally)
36
+ .then(async (tx) => {
37
+ const receipt = await tx.wait(options?.confirmations || 1);
38
+ if (options?.onDeployRadonRequestTemplateReceipt) {
39
+ options.onDeployRadonRequestTemplateReceipt(receipt);
40
+ }
41
+ });
42
+ return await WitOracleRadonRequestTemplate.at(this.witOracle, target);
43
+ }
44
+ async deployRadonRequestModal(modal, options) {
45
+ const retrieval = [
46
+ modal.sources[0].method,
47
+ modal.sources[0].body || "",
48
+ modal.sources[0]?.headers ? Object.entries(modal.sources[0].headers) : [],
49
+ modal.sources[0].script?.toBytecode() || "0x",
50
+ ];
51
+ const tally = abiEncodeRadonAsset(modal.witnessReducer);
52
+ const target = await this.contract.buildRadonRequestModal //getFunction("buildRadonRequestModal((uint8,string,string[2][],bytes),(uint8,(uint8,bytes)[]))")
53
+ .staticCall(retrieval, tally);
54
+ if (options?.onDeployRadonRequestModal)
55
+ options.onDeployRadonRequestModal(target);
56
+ await this.contract.buildRadonRequestModal
57
+ // .getFunction("buildRadonRequestModal((uint8,string,string[2][],bytes),(uint8,(uint8,bytes)[]))")
58
+ .send(retrieval, tally)
59
+ .then(async (tx) => {
60
+ const receipt = await tx.wait(options?.confirmations || 1);
61
+ if (options?.onDeployRadonRequestModalReceipt) {
62
+ options.onDeployRadonRequestModalReceipt(receipt);
63
+ }
64
+ });
65
+ return await WitOracleRadonRequestModal.at(this.witOracle, target);
66
+ }
67
+ async verifyRadonRequest(request, _options) {
68
+ // TODO:
69
+ //
70
+ return request.radHash;
71
+ }
72
+ }
73
+ export class WitOracleRadonRequestModal extends WitAppliance {
74
+ constructor(witOracle, at) {
75
+ super(witOracle, "WitOracleRadonRequestModal", at);
76
+ }
77
+ static async at(witOracle, target) {
78
+ const template = new WitOracleRadonRequestModal(witOracle, target);
79
+ const templateWitOracleAddr = await template.contract.witOracle.staticCall();
80
+ if (templateWitOracleAddr !== witOracle.address) {
81
+ throw new Error(`${WitOracleRadonRequestModal.constructor.name} at ${target}: mismatching Wit/Oracle address (${templateWitOracleAddr})`);
82
+ }
83
+ return template;
84
+ }
85
+ async getDataResultType() {
86
+ return this.contract
87
+ .getFunction("getDataResultType()")
88
+ .staticCall()
89
+ .then((result) => {
90
+ switch (Number(result)) {
91
+ case 1:
92
+ return "array";
93
+ case 2:
94
+ return "boolean";
95
+ case 3:
96
+ return "bytes";
97
+ case 4:
98
+ return "integer";
99
+ case 5:
100
+ return "float";
101
+ case 6:
102
+ return "map";
103
+ case 7:
104
+ return "string";
105
+ default:
106
+ return "any";
107
+ }
108
+ });
109
+ }
110
+ async getDataSourcesArgsCount() {
111
+ return this.contract
112
+ .getFunction("getDataSourcesArgsCount()")
113
+ .staticCall()
114
+ .then((argsCount) => Number(argsCount));
115
+ }
116
+ async getRadonModalRetrieval() {
117
+ return this.contract
118
+ .getFunction("getRadonModalRetrieval()")
119
+ .staticCall()
120
+ .then((result) => {
121
+ return new Witnet.Radon.RadonRetrieval({
122
+ method: result[1],
123
+ url: result[3],
124
+ body: result[4],
125
+ headers: Object.fromEntries(result[5]),
126
+ script: parseRadonScript(result[6]),
127
+ });
128
+ });
129
+ }
130
+ async verifyRadonRequest(dataProviders, commonRetrievalArgs, options) {
131
+ const argsCount = await this.getDataSourcesArgsCount();
132
+ if (argsCount !== 1 + (commonRetrievalArgs?.length || 0)) {
133
+ throw TypeError(`${this.constructor.name}@${this.address}: unmatching args count != ${argsCount - 1}.`);
134
+ }
135
+ const method = this.contract.getFunction("verifyRadonRequest(string[],string[])");
136
+ const radHash = (await method.staticCall(commonRetrievalArgs || [], dataProviders)).slice(2);
137
+ try {
138
+ await (await this.witOracle.getWitOracleRadonRegistry()).lookupRadonRequestBytecode(radHash);
139
+ }
140
+ catch {
141
+ if (options?.onVerifyRadonRequest)
142
+ options.onVerifyRadonRequest(radHash);
143
+ await method
144
+ .send(commonRetrievalArgs || [], dataProviders)
145
+ .then((tx) => tx.wait(options?.confirmations || 1))
146
+ .then((receipt) => {
147
+ if (options?.onVerifyRadonRequestReceipt) {
148
+ options.onVerifyRadonRequestReceipt(receipt);
149
+ }
150
+ return radHash;
151
+ });
152
+ }
153
+ return radHash;
154
+ }
155
+ }
156
+ export class WitOracleRadonRequestTemplate extends WitAppliance {
157
+ constructor(witOracle, at) {
158
+ super(witOracle, "WitOracleRadonRequestTemplate", at);
159
+ }
160
+ static async at(witOracle, target) {
161
+ const template = new WitOracleRadonRequestTemplate(witOracle, target);
162
+ const templateWitOracleAddr = await template.contract.witOracle.staticCall();
163
+ if (templateWitOracleAddr !== witOracle.address) {
164
+ throw new Error(`${WitOracleRadonRequestTemplate.constructor.name} at ${target}: mismatching Wit/Oracle address (${templateWitOracleAddr})`);
165
+ }
166
+ return template;
167
+ }
168
+ async getDataResultType() {
169
+ return this.contract
170
+ .getFunction("getDataResultType()")
171
+ .staticCall()
172
+ .then((result) => {
173
+ switch (Number(result)) {
174
+ case 1:
175
+ return "array";
176
+ case 2:
177
+ return "boolean";
178
+ case 3:
179
+ return "bytes";
180
+ case 4:
181
+ return "integer";
182
+ case 5:
183
+ return "float";
184
+ case 6:
185
+ return "map";
186
+ case 7:
187
+ return "string";
188
+ default:
189
+ return "any";
190
+ }
191
+ });
192
+ }
193
+ async getDataSources() {
194
+ return this.contract
195
+ .getFunction("getDataSources()")
196
+ .staticCall()
197
+ .then((results) => {
198
+ return results.map((result) => new Witnet.Radon.RadonRetrieval({
199
+ method: result[1],
200
+ url: result[3],
201
+ body: result[4],
202
+ headers: Object.fromEntries(result[5]),
203
+ script: parseRadonScript(result[6]),
204
+ }));
205
+ });
206
+ }
207
+ async getDataSourcesArgsCount() {
208
+ return this.contract
209
+ .getFunction("getDataSourcesArgsCount()")
210
+ .staticCall()
211
+ .then((dims) => dims.map((dim) => Number(dim)));
212
+ }
213
+ async verifyRadonRequest(args, options) {
214
+ const argsCount = await this.getDataSourcesArgsCount();
215
+ let encodedArgs = [];
216
+ if (typeof args === "string") {
217
+ if (argsCount.length === 1 && argsCount[0] === 1) {
218
+ encodedArgs = [[args]];
219
+ }
220
+ }
221
+ else if (Array.isArray(args)) {
222
+ if (Array.isArray(args[0])) {
223
+ if (argsCount.length === args.length &&
224
+ !args.find((subargs, index) => subargs.length !== argsCount[index])) {
225
+ encodedArgs = args;
226
+ }
227
+ }
228
+ else if (args.length === argsCount[0] &&
229
+ !args.find((arg) => typeof arg !== "string")) {
230
+ encodedArgs = [args];
231
+ }
232
+ }
233
+ if (encodedArgs.length === 0) {
234
+ throw TypeError(`${this.constructor.name}@${this.address}: unmatching args count != [${argsCount}, ].`);
235
+ }
236
+ const method = this.contract.getFunction("verifyRadonRequest(string[][])");
237
+ const radHash = (await method.staticCall(encodedArgs)).slice(2);
238
+ try {
239
+ await (await this.witOracle.getWitOracleRadonRegistry()).lookupRadonRequestBytecode(radHash);
240
+ }
241
+ catch {
242
+ if (options?.onVerifyRadonRequest)
243
+ options.onVerifyRadonRequest(radHash);
244
+ await method
245
+ .send(encodedArgs)
246
+ .then((tx) => tx.wait(options?.confirmations || 1))
247
+ .then((receipt) => {
248
+ if (options?.onVerifyRadonRequestReceipt) {
249
+ options.onVerifyRadonRequestReceipt(receipt);
250
+ }
251
+ return radHash;
252
+ });
253
+ }
254
+ return radHash;
255
+ }
256
+ }
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvd3JhcHBlcnMvV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBR3BDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFJaEQsTUFBTSxPQUFPLDRCQUE2QixTQUFRLFlBQVk7SUFDN0MsUUFBUSxDQUF3QjtJQUVoRCxZQUNDLFNBQW9CLEVBQ3BCLFFBQWdDLEVBQ2hDLEVBQVc7UUFFWCxLQUFLLENBQUMsU0FBUyxFQUFFLDhCQUE4QixFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDcEIsU0FBb0IsRUFDcEIsUUFBZ0M7UUFFaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDdEUsTUFBTSx3QkFBd0IsR0FDN0IsTUFBTSxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUMvQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssd0JBQXdCLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksS0FBSyxDQUNkLEdBQUcsNEJBQTRCLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxRQUFRLENBQUMsT0FBTywyQ0FBMkMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUNySSxDQUFBO1FBQ0YsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFBO0lBQ2hCLENBQUM7SUFFTSxLQUFL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RUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDbEQsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksT0FBTyxFQUFFLDJCQUEyQixFQUFFLENBQUM7b0JBQzFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDN0MsQ0FBQztnQkFDRCxPQUFPLE9BQU8sQ0FBQTtZQUNmLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFBO0lBQ2YsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2l0bmV0IH0gZnJvbSBcIkB3aXRuZXQvc2RrXCJcbmltcG9ydCB0eXBlIHsgQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQsIFJlc3VsdCB9IGZyb20gXCJldGhlcnNcIlxuaW1wb3J0IHR5cGUgeyBXaXRPcmFjbGVSZXN1bHREYXRhVHlwZXMgfSBmcm9tIFwiLi4vdHlwZXMuanNcIlxuaW1wb3J0IHsgYWJpRW5jb2RlUmFkb25Bc3NldCwgcGFyc2VSYWRvblNjcmlwdCB9IGZyb20gXCIuLi91dGlscy5qc1wiXG5pbXBvcnQgeyBXaXRBcHBsaWFuY2UgfSBmcm9tIFwiLi9XaXRBcHBsaWFuY2UuanNcIlxuaW1wb3J0IHR5cGUgeyBXaXRPcmFjbGUgfSBmcm9tIFwiLi9XaXRPcmFjbGUuanNcIlxuaW1wb3J0IHR5cGUgeyBXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5IH0gZnJvbSBcIi4vV2l0T3JhY2xlUmFkb25SZWdpc3RyeS5qc1wiXG5cbmV4cG9ydCBjbGFzcyBXaXRPcmFjbGVSYWRvblJlcXVlc3RGYWN0b3J5IGV4dGVuZHMgV2l0QXBwbGlhbmNlIHtcblx0cHVibGljIHJlYWRvbmx5IHJlZ2lzdHJ5OiBXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuXHRcdHdpdE9yYWNsZTogV2l0T3JhY2xlLFxuXHRcdHJlZ2lzdHJ5OiBXaXRPcmFjbGVSYWRvblJlZ2lzdHJ5LFxuXHRcdGF0Pzogc3RyaW5nLFxuXHQpIHtcblx0XHRzdXBlcih3aXRPcmFjbGUsIFwiV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeVwiLCBhdClcblx0XHR0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnlcblx0fVxuXG5cdHN0YXRpYyBhc3luYyBkZXBsb3llZChcblx0XHR3aXRPcmFjbGU6IFdpdE9yYWNsZSxcblx0XHRyZWdpc3RyeTogV2l0T3JhY2xlUmFkb25SZWdpc3RyeSxcblx0KTogUHJvbWlzZTxXaXRPcmFjbGVSYWRvblJlcXVlc3RGYWN0b3J5PiB7XG5cdFx0Y29uc3QgZGVwbG95ZXIgPSBuZXcgV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeSh3aXRPcmFjbGUsIHJlZ2lzdHJ5KVxuXHRcdGNvbnN0IHdpdE9yYWNsZVJlZ2lzdHJ5QWRkcmVzcyA9XG5cdFx0XHRhd2FpdCB3aXRPcmFjbGUuY29udHJhY3QucmVnaXN0cnkuc3RhdGljQ2FsbCgpXG5cdFx0aWYgKHJlZ2lzdHJ5LmFkZHJlc3MgIT09IHdpdE9yYWNsZVJlZ2lzdHJ5QWRkcmVzcykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgJHtXaXRPcmFjbGVSYWRvblJlcXVlc3RGYWN0b3J5LmNvbnN0cnVjdG9yLm5hbWV9IGF0ICR7ZGVwbG95ZXIuYWRkcmVzc306IHVuY29tcGxpYW50IFdpdE9yYWNsZVJhZG9uUmVnaXN0cnkgYXQgJHtyZWdpc3RyeS5hZGRyZXNzfSlgLFxuXHRcdFx0KVxuXHRcdH1cblx0XHRyZXR1cm4gZGVwbG95ZXJcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkZXBsb3lSYWRvblJlcXVlc3RUZW1wbGF0ZShcblx0XHR0ZW1wbGF0ZTogV2l0bmV0LlJhZG9uLlJhZG9uVGVtcGxhdGUsXG5cdFx0b3B0aW9ucz86IHtcblx0XHRcdGNvbmZpcm1hdGlvbnM/OiBudW1iZXJcblx0XHRcdG9uRGVwbG95UmFkb25SZXF1ZXN0VGVtcGxhdGU/OiAoYWRkcmVzczogc3RyaW5nKSA9PiBhbnlcblx0XHRcdG9uRGVwbG95UmFkb25SZXF1ZXN0VGVtcGxhdGVSZWNlaXB0PzogKFxuXHRcdFx0XHRyZWNlaXB0OiBDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwsXG5cdFx0XHQpID0+IGFueVxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsYmFjayBoYW5kbGVyIGNhbGxlZCBqdXN0IGluIGNhc2UgYSBgdmVyaWZ5UmFkb25SZXRyaWV2YWxgIHRyYW5zYWN0aW9uIGlzIHVsdGltYXRlbHkgcmVxdWlyZWQuXG5cdFx0XHQgKi9cblx0XHRcdG9uVmVyaWZ5UmFkb25SZXRyaWV2YWw/OiAoaGFzaDogc3RyaW5nKSA9PiBhbnlcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2FsbGJhY2sgaGFuZGxlciBjYWxsZWQgb25jZSB0aGUgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiBnZXRzIGNvbmZpcm1lZC5cblx0XHRcdCAqIEBwYXJhbSByZWNlaXB0IFRoZSBgdmVyaWZ5UmFkb25SZXRyaWV2YWxgIHRyYW5zYWN0aW9uIHJlY2VpcHQuXG5cdFx0XHQgKiBAcGFyYW0gaGFzaCBUaGUgdW5pcXVlIGhhc2ggb2YgdGhlIFJhZG9uIFJldHJpZXZhbCwgYXMgdmVyaWZpZWQgb24gdGhlIGNvbm5lY3RlZCBuZXR3b3JrLlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsUmVjZWlwdD86IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPFdpdE9yYWNsZVJhZG9uUmVxdWVzdFRlbXBsYXRlPiB7XG5cdFx0Y29uc3QgaGFzaGVzOiBBcnJheTxzdHJpbmc+ID0gW11cblx0XHRmb3IgKGNvbnN0IGluZGV4IGluIHRlbXBsYXRlLnNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHJldHJpZXZhbCA9IHRlbXBsYXRlLnNvdXJjZXNbaW5kZXhdXG5cdFx0XHRjb25zdCBoYXNoID0gYDB4JHthd2FpdCB0aGlzLnJlZ2lzdHJ5LmRldGVybWluZVJhZG9uUmV0cmlldmFsSGFzaChyZXRyaWV2YWwpfWBcblx0XHRcdGF3YWl0IHRoaXMucmVnaXN0cnkudmVyaWZ5UmFkb25SZXRyaWV2YWwocmV0cmlldmFsLCBvcHRpb25zKVxuXHRcdFx0aGFzaGVzLnB1c2goaGFzaClcblx0XHR9XG5cblx0XHRjb25zdCBhZ2dyZWdhdG9yID0gYWJpRW5jb2RlUmFkb25Bc3NldCh0ZW1wbGF0ZS5zb3VyY2VzUmVkdWNlcilcblx0XHRjb25zdCB0YWxseSA9IGFiaUVuY29kZVJhZG9uQXNzZXQodGVtcGxhdGUud2l0bmVzc1JlZHVjZXIpXG5cdFx0Y29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFxuXHRcdFx0XHRcImJ1aWxkUmFkb25SZXF1ZXN0VGVtcGxhdGUoYnl0ZXMzMltdLCh1aW50OCwodWludDgsYnl0ZXMpW10pLCh1aW50OCwodWludDgsYnl0ZXMpW10pKVwiLFxuXHRcdFx0KVxuXHRcdFx0LnN0YXRpY0NhbGwoaGFzaGVzLCBhZ2dyZWdhdG9yLCB0YWxseSlcblxuXHRcdGlmIChvcHRpb25zPy5vbkRlcGxveVJhZG9uUmVxdWVzdFRlbXBsYXRlKVxuXHRcdFx0b3B0aW9ucy5vbkRlcGxveVJhZG9uUmVxdWVzdFRlbXBsYXRlKHRhcmdldClcblx0XHRhd2FpdCB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcdFwiYnVpbGRSYWRvblJlcXVlc3RUZW1wbGF0ZShieXRlczMyW10sKHVpbnQ4LCh1aW50OCxieXRlcylbXSksKHVpbnQ4LCh1aW50OCxieXRlcylbXSkpXCIsXG5cdFx0XHQpXG5cdFx0XHQuc2VuZChoYXNoZXMsIGFnZ3JlZ2F0b3IsIHRhbGx5KVxuXHRcdFx0LnRoZW4oYXN5bmMgKHR4KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJlY2VpcHQgPSBhd2FpdCB0eC53YWl0KG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMSlcblx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uRGVwbG95UmFkb25SZXF1ZXN0VGVtcGxhdGVSZWNlaXB0KSB7XG5cdFx0XHRcdFx0b3B0aW9ucy5vbkRlcGxveVJhZG9uUmVxdWVzdFRlbXBsYXRlUmVjZWlwdChyZWNlaXB0KVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXG5cdFx0cmV0dXJuIGF3YWl0IFdpdE9yYWNsZVJhZG9uUmVxdWVzdFRlbXBsYXRlLmF0KHRoaXMud2l0T3JhY2xlLCB0YXJnZXQpXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGVwbG95UmFkb25SZXF1ZXN0TW9kYWwoXG5cdFx0bW9kYWw6IFdpdG5ldC5SYWRvbi5SYWRvbk1vZGFsLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRjb25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRvbkRlcGxveVJhZG9uUmVxdWVzdE1vZGFsPzogKGFkZHJlc3M6IHN0cmluZykgPT4gYW55XG5cdFx0XHRvbkRlcGxveVJhZG9uUmVxdWVzdE1vZGFsUmVjZWlwdD86IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHRcdC8qKlxuXHRcdFx0ICogQ2FsbGJhY2sgaGFuZGxlciBjYWxsZWQganVzdCBpbiBjYXNlIGEgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiBpcyB1bHRpbWF0ZWx5IHJlcXVpcmVkLlxuXHRcdFx0ICovXG5cdFx0XHRvblZlcmlmeVJhZG9uUmV0cmlldmFsPzogKGhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIG9uY2UgdGhlIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gZ2V0cyBjb25maXJtZWQuXG5cdFx0XHQgKiBAcGFyYW0gcmVjZWlwdCBUaGUgYHZlcmlmeVJhZG9uUmV0cmlldmFsYCB0cmFuc2FjdGlvbiByZWNlaXB0LlxuXHRcdFx0ICogQHBhcmFtIGhhc2ggVGhlIHVuaXF1ZSBoYXNoIG9mIHRoZSBSYWRvbiBSZXRyaWV2YWwsIGFzIHZlcmlmaWVkIG9uIHRoZSBjb25uZWN0ZWQgbmV0d29yay5cblx0XHRcdCAqL1xuXHRcdFx0b25WZXJpZnlSYWRvblJldHJpZXZhbFJlY2VpcHQ/OiAoXG5cdFx0XHRcdHJlY2VpcHQ6IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCxcblx0XHRcdCkgPT4gYW55XG5cdFx0fSxcblx0KTogUHJvbWlzZTxXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbD4ge1xuXHRcdGNvbnN0IHJldHJpZXZhbCA9IFtcblx0XHRcdG1vZGFsLnNvdXJjZXNbMF0ubWV0aG9kLFxuXHRcdFx0bW9kYWwuc291cmNlc1swXS5ib2R5IHx8IFwiXCIsXG5cdFx0XHRtb2RhbC5zb3VyY2VzWzBdPy5oZWFkZXJzID8gT2JqZWN0LmVudHJpZXMobW9kYWwuc291cmNlc1swXS5oZWFkZXJzKSA6IFtdLFxuXHRcdFx0bW9kYWwuc291cmNlc1swXS5zY3JpcHQ/LnRvQnl0ZWNvZGUoKSB8fCBcIjB4XCIsXG5cdFx0XVxuXHRcdGNvbnN0IHRhbGx5ID0gYWJpRW5jb2RlUmFkb25Bc3NldChtb2RhbC53aXRuZXNzUmVkdWNlcilcblx0XHRjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNvbnRyYWN0LmJ1aWxkUmFkb25SZXF1ZXN0TW9kYWwgLy9nZXRGdW5jdGlvbihcImJ1aWxkUmFkb25SZXF1ZXN0TW9kYWwoKHVpbnQ4LHN0cmluZyxzdHJpbmdbMl1bXSxieXRlcyksKHVpbnQ4LCh1aW50OCxieXRlcylbXSkpXCIpXG5cdFx0XHQuc3RhdGljQ2FsbChyZXRyaWV2YWwsIHRhbGx5KVxuXG5cdFx0aWYgKG9wdGlvbnM/Lm9uRGVwbG95UmFkb25SZXF1ZXN0TW9kYWwpXG5cdFx0XHRvcHRpb25zLm9uRGVwbG95UmFkb25SZXF1ZXN0TW9kYWwodGFyZ2V0KVxuXHRcdGF3YWl0IHRoaXMuY29udHJhY3QuYnVpbGRSYWRvblJlcXVlc3RNb2RhbFxuXHRcdFx0Ly8gLmdldEZ1bmN0aW9uKFwiYnVpbGRSYWRvblJlcXVlc3RNb2RhbCgodWludDgsc3RyaW5nLHN0cmluZ1syXVtdLGJ5dGVzKSwodWludDgsKHVpbnQ4LGJ5dGVzKVtdKSlcIilcblx0XHRcdC5zZW5kKHJldHJpZXZhbCwgdGFsbHkpXG5cdFx0XHQudGhlbihhc3luYyAodHgpID0+IHtcblx0XHRcdFx0Y29uc3QgcmVjZWlwdCA9IGF3YWl0IHR4LndhaXQob3B0aW9ucz8uY29uZmlybWF0aW9ucyB8fCAxKVxuXHRcdFx0XHRpZiAob3B0aW9ucz8ub25EZXBsb3lSYWRvblJlcXVlc3RNb2RhbFJlY2VpcHQpIHtcblx0XHRcdFx0XHRvcHRpb25zLm9uRGVwbG95UmFkb25SZXF1ZXN0TW9kYWxSZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cblx0XHRyZXR1cm4gYXdhaXQgV2l0T3JhY2xlUmFkb25SZXF1ZXN0TW9kYWwuYXQodGhpcy53aXRPcmFjbGUsIHRhcmdldClcblx0fVxuXG5cdHB1YmxpYyBhc3luYyB2ZXJpZnlSYWRvblJlcXVlc3QoXG5cdFx0cmVxdWVzdDogV2l0bmV0LlJhZG9uLlJhZG9uUmVxdWVzdCxcblx0XHRfb3B0aW9ucz86IHtcblx0XHRcdGNvbmZpcm1hdGlvbnM/OiBudW1iZXJcblx0XHRcdG9uVmVyaWZ5UmFkb25SZXF1ZXN0PzogKGFkZHJlc3M6IHN0cmluZykgPT4gYW55XG5cdFx0XHRvblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQ/OiAoXG5cdFx0XHRcdHJlY2VpcHQ6IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCxcblx0XHRcdCkgPT4gYW55XG5cdFx0XHQvKipcblx0XHRcdCAqIENhbGxiYWNrIGhhbmRsZXIgY2FsbGVkIGp1c3QgaW4gY2FzZSBhIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gaXMgdWx0aW1hdGVseSByZXF1aXJlZC5cblx0XHRcdCAqL1xuXHRcdFx0b25WZXJpZnlSYWRvblJldHJpZXZhbD86IChoYXNoOiBzdHJpbmcpID0+IGFueVxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDYWxsYmFjayBoYW5kbGVyIGNhbGxlZCBvbmNlIHRoZSBgdmVyaWZ5UmFkb25SZXRyaWV2YWxgIHRyYW5zYWN0aW9uIGdldHMgY29uZmlybWVkLlxuXHRcdFx0ICogQHBhcmFtIHJlY2VpcHQgVGhlIGB2ZXJpZnlSYWRvblJldHJpZXZhbGAgdHJhbnNhY3Rpb24gcmVjZWlwdC5cblx0XHRcdCAqIEBwYXJhbSBoYXNoIFRoZSB1bmlxdWUgaGFzaCBvZiB0aGUgUmFkb24gUmV0cmlldmFsLCBhcyB2ZXJpZmllZCBvbiB0aGUgY29ubmVjdGVkIG5ldHdvcmsuXG5cdFx0XHQgKi9cblx0XHRcdG9uVmVyaWZ5UmFkb25SZXRyaWV2YWxSZWNlaXB0PzogKFxuXHRcdFx0XHRyZWNlaXB0OiBDb250cmFjdFRyYW5zYWN0aW9uUmVjZWlwdCB8IG51bGwsXG5cdFx0XHQpID0+IGFueVxuXHRcdH0sXG5cdCk6IFByb21pc2U8V2l0bmV0Lkhhc2g+IHtcblx0XHQvLyBUT0RPOlxuXHRcdC8vXG5cdFx0cmV0dXJuIHJlcXVlc3QucmFkSGFzaFxuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbCBleHRlbmRzIFdpdEFwcGxpYW5jZSB7XG5cdHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih3aXRPcmFjbGU6IFdpdE9yYWNsZSwgYXQ6IHN0cmluZykge1xuXHRcdHN1cGVyKHdpdE9yYWNsZSwgXCJXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbFwiLCBhdClcblx0fVxuXG5cdHN0YXRpYyBhc3luYyBhdChcblx0XHR3aXRPcmFjbGU6IFdpdE9yYWNsZSxcblx0XHR0YXJnZXQ6IHN0cmluZyxcblx0KTogUHJvbWlzZTxXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbD4ge1xuXHRcdGNvbnN0IHRlbXBsYXRlID0gbmV3IFdpdE9yYWNsZVJhZG9uUmVxdWVzdE1vZGFsKHdpdE9yYWNsZSwgdGFyZ2V0KVxuXHRcdGNvbnN0IHRlbXBsYXRlV2l0T3JhY2xlQWRkciA9IGF3YWl0IHRlbXBsYXRlLmNvbnRyYWN0LndpdE9yYWNsZS5zdGF0aWNDYWxsKClcblx0XHRpZiAodGVtcGxhdGVXaXRPcmFjbGVBZGRyICE9PSB3aXRPcmFjbGUuYWRkcmVzcykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgJHtXaXRPcmFjbGVSYWRvblJlcXVlc3RNb2RhbC5jb25zdHJ1Y3Rvci5uYW1lfSBhdCAke3RhcmdldH06IG1pc21hdGNoaW5nIFdpdC9PcmFjbGUgYWRkcmVzcyAoJHt0ZW1wbGF0ZVdpdE9yYWNsZUFkZHJ9KWAsXG5cdFx0XHQpXG5cdFx0fVxuXHRcdHJldHVybiB0ZW1wbGF0ZVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldERhdGFSZXN1bHRUeXBlKCk6IFByb21pc2U8V2l0T3JhY2xlUmVzdWx0RGF0YVR5cGVzPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3Rcblx0XHRcdC5nZXRGdW5jdGlvbihcImdldERhdGFSZXN1bHRUeXBlKClcIilcblx0XHRcdC5zdGF0aWNDYWxsKClcblx0XHRcdC50aGVuKChyZXN1bHQ6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRzd2l0Y2ggKE51bWJlcihyZXN1bHQpKSB7XG5cdFx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiYXJyYXlcIlxuXHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdHJldHVybiBcImJvb2xlYW5cIlxuXHRcdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRcdHJldHVybiBcImJ5dGVzXCJcblx0XHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJpbnRlZ2VyXCJcblx0XHRcdFx0XHRjYXNlIDU6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJmbG9hdFwiXG5cdFx0XHRcdFx0Y2FzZSA2OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwibWFwXCJcblx0XHRcdFx0XHRjYXNlIDc6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJhbnlcIlxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldERhdGFTb3VyY2VzQXJnc0NvdW50KCk6IFByb21pc2U8bnVtYmVyPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29udHJhY3Rcblx0XHRcdC5nZXRGdW5jdGlvbihcImdldERhdGFTb3VyY2VzQXJnc0NvdW50KClcIilcblx0XHRcdC5zdGF0aWNDYWxsKClcblx0XHRcdC50aGVuKChhcmdzQ291bnQ6IGJpZ2ludCkgPT4gTnVtYmVyKGFyZ3NDb3VudCkpXG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZ2V0UmFkb25Nb2RhbFJldHJpZXZhbCgpOiBQcm9taXNlPFdpdG5ldC5SYWRvbi5SYWRvblJldHJpZXZhbD4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXCJnZXRSYWRvbk1vZGFsUmV0cmlldmFsKClcIilcblx0XHRcdC5zdGF0aWNDYWxsKClcblx0XHRcdC50aGVuKChyZXN1bHQ6IFJlc3VsdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFdpdG5ldC5SYWRvbi5SYWRvblJldHJpZXZhbCh7XG5cdFx0XHRcdFx0bWV0aG9kOiByZXN1bHRbMV0sXG5cdFx0XHRcdFx0dXJsOiByZXN1bHRbM10sXG5cdFx0XHRcdFx0Ym9keTogcmVzdWx0WzRdLFxuXHRcdFx0XHRcdGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRbNV0pLFxuXHRcdFx0XHRcdHNjcmlwdDogcGFyc2VSYWRvblNjcmlwdChyZXN1bHRbNl0pLFxuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyB2ZXJpZnlSYWRvblJlcXVlc3QoXG5cdFx0ZGF0YVByb3ZpZGVyczogc3RyaW5nW10sXG5cdFx0Y29tbW9uUmV0cmlldmFsQXJncz86IHN0cmluZ1tdLFxuXHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRjb25maXJtYXRpb25zPzogbnVtYmVyXG5cdFx0XHRvblZlcmlmeVJhZG9uUmVxdWVzdDogKHJhZEhhc2g6IHN0cmluZykgPT4gYW55XG5cdFx0XHRvblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQ6IChcblx0XHRcdFx0cmVjZWlwdDogQ29udHJhY3RUcmFuc2FjdGlvblJlY2VpcHQgfCBudWxsLFxuXHRcdFx0KSA9PiBhbnlcblx0XHR9LFxuXHQpOiBQcm9taXNlPFdpdG5ldC5IYXNoPiB7XG5cdFx0Y29uc3QgYXJnc0NvdW50ID0gYXdhaXQgdGhpcy5nZXREYXRhU291cmNlc0FyZ3NDb3VudCgpXG5cdFx0aWYgKGFyZ3NDb3VudCAhPT0gMSArIChjb21tb25SZXRyaWV2YWxBcmdzPy5sZW5ndGggfHwgMCkpIHtcblx0XHRcdHRocm93IFR5cGVFcnJvcihcblx0XHRcdFx0YCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfUAke3RoaXMuYWRkcmVzc306IHVubWF0Y2hpbmcgYXJncyBjb3VudCAhPSAke2FyZ3NDb3VudCAtIDF9LmAsXG5cdFx0XHQpXG5cdFx0fVxuXHRcdGNvbnN0IG1ldGhvZCA9IHRoaXMuY29udHJhY3QuZ2V0RnVuY3Rpb24oXG5cdFx0XHRcInZlcmlmeVJhZG9uUmVxdWVzdChzdHJpbmdbXSxzdHJpbmdbXSlcIixcblx0XHQpXG5cdFx0Y29uc3QgcmFkSGFzaCA9IChcblx0XHRcdGF3YWl0IG1ldGhvZC5zdGF0aWNDYWxsKGNvbW1vblJldHJpZXZhbEFyZ3MgfHwgW10sIGRhdGFQcm92aWRlcnMpXG5cdFx0KS5zbGljZSgyKVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCAoXG5cdFx0XHRcdGF3YWl0IHRoaXMud2l0T3JhY2xlLmdldFdpdE9yYWNsZVJhZG9uUmVnaXN0cnkoKVxuXHRcdFx0KS5sb29rdXBSYWRvblJlcXVlc3RCeXRlY29kZShyYWRIYXNoKVxuXHRcdH0gY2F0Y2gge1xuXHRcdFx0aWYgKG9wdGlvbnM/Lm9uVmVyaWZ5UmFkb25SZXF1ZXN0KSBvcHRpb25zLm9uVmVyaWZ5UmFkb25SZXF1ZXN0KHJhZEhhc2gpXG5cdFx0XHRhd2FpdCBtZXRob2Rcblx0XHRcdFx0LnNlbmQoY29tbW9uUmV0cmlldmFsQXJncyB8fCBbXSwgZGF0YVByb3ZpZGVycylcblx0XHRcdFx0LnRoZW4oKHR4KSA9PiB0eC53YWl0KG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMSkpXG5cdFx0XHRcdC50aGVuKChyZWNlaXB0KSA9PiB7XG5cdFx0XHRcdFx0aWYgKG9wdGlvbnM/Lm9uVmVyaWZ5UmFkb25SZXF1ZXN0UmVjZWlwdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9ucy5vblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQocmVjZWlwdClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHJhZEhhc2hcblx0XHRcdFx0fSlcblx0XHR9XG5cdFx0cmV0dXJuIHJhZEhhc2hcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgV2l0T3JhY2xlUmFkb25SZXF1ZXN0VGVtcGxhdGUgZXh0ZW5kcyBXaXRBcHBsaWFuY2Uge1xuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3Iod2l0T3JhY2xlOiBXaXRPcmFjbGUsIGF0OiBzdHJpbmcpIHtcblx0XHRzdXBlcih3aXRPcmFjbGUsIFwiV2l0T3JhY2xlUmFkb25SZXF1ZXN0VGVtcGxhdGVcIiwgYXQpXG5cdH1cblxuXHRzdGF0aWMgYXN5bmMgYXQoXG5cdFx0d2l0T3JhY2xlOiBXaXRPcmFjbGUsXG5cdFx0dGFyZ2V0OiBzdHJpbmcsXG5cdCk6IFByb21pc2U8V2l0T3JhY2xlUmFkb25SZXF1ZXN0VGVtcGxhdGU+IHtcblx0XHRjb25zdCB0ZW1wbGF0ZSA9IG5ldyBXaXRPcmFjbGVSYWRvblJlcXVlc3RUZW1wbGF0ZSh3aXRPcmFjbGUsIHRhcmdldClcblx0XHRjb25zdCB0ZW1wbGF0ZVdpdE9yYWNsZUFkZHIgPSBhd2FpdCB0ZW1wbGF0ZS5jb250cmFjdC53aXRPcmFjbGUuc3RhdGljQ2FsbCgpXG5cdFx0aWYgKHRlbXBsYXRlV2l0T3JhY2xlQWRkciAhPT0gd2l0T3JhY2xlLmFkZHJlc3MpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YCR7V2l0T3JhY2xlUmFkb25SZXF1ZXN0VGVtcGxhdGUuY29uc3RydWN0b3IubmFtZX0gYXQgJHt0YXJnZXR9OiBtaXNtYXRjaGluZyBXaXQvT3JhY2xlIGFkZHJlc3MgKCR7dGVtcGxhdGVXaXRPcmFjbGVBZGRyfSlgLFxuXHRcdFx0KVxuXHRcdH1cblx0XHRyZXR1cm4gdGVtcGxhdGVcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXREYXRhUmVzdWx0VHlwZSgpOiBQcm9taXNlPFdpdE9yYWNsZVJlc3VsdERhdGFUeXBlcz4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXCJnZXREYXRhUmVzdWx0VHlwZSgpXCIpXG5cdFx0XHQuc3RhdGljQ2FsbCgpXG5cdFx0XHQudGhlbigocmVzdWx0OiBudW1iZXIpID0+IHtcblx0XHRcdFx0c3dpdGNoIChOdW1iZXIocmVzdWx0KSkge1xuXHRcdFx0XHRcdGNhc2UgMTpcblx0XHRcdFx0XHRcdHJldHVybiBcImFycmF5XCJcblx0XHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJib29sZWFuXCJcblx0XHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJieXRlc1wiXG5cdFx0XHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiaW50ZWdlclwiXG5cdFx0XHRcdFx0Y2FzZSA1OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiZmxvYXRcIlxuXHRcdFx0XHRcdGNhc2UgNjpcblx0XHRcdFx0XHRcdHJldHVybiBcIm1hcFwiXG5cdFx0XHRcdFx0Y2FzZSA3OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwic3RyaW5nXCJcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiYW55XCJcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXREYXRhU291cmNlcygpOiBQcm9taXNlPEFycmF5PFdpdG5ldC5SYWRvbi5SYWRvblJldHJpZXZhbD4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb250cmFjdFxuXHRcdFx0LmdldEZ1bmN0aW9uKFwiZ2V0RGF0YVNvdXJjZXMoKVwiKVxuXHRcdFx0LnN0YXRpY0NhbGwoKVxuXHRcdFx0LnRoZW4oKHJlc3VsdHM6IEFycmF5PFJlc3VsdD4pID0+IHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHMubWFwKFxuXHRcdFx0XHRcdChyZXN1bHQpID0+XG5cdFx0XHRcdFx0XHRuZXcgV2l0bmV0LlJhZG9uLlJhZG9uUmV0cmlldmFsKHtcblx0XHRcdFx0XHRcdFx0bWV0aG9kOiByZXN1bHRbMV0sXG5cdFx0XHRcdFx0XHRcdHVybDogcmVzdWx0WzNdLFxuXHRcdFx0XHRcdFx0XHRib2R5OiByZXN1bHRbNF0sXG5cdFx0XHRcdFx0XHRcdGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRbNV0pLFxuXHRcdFx0XHRcdFx0XHRzY3JpcHQ6IHBhcnNlUmFkb25TY3JpcHQocmVzdWx0WzZdKSxcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHQpXG5cdFx0XHR9KVxuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldERhdGFTb3VyY2VzQXJnc0NvdW50KCk6IFByb21pc2U8QXJyYXk8bnVtYmVyPj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnRyYWN0XG5cdFx0XHQuZ2V0RnVuY3Rpb24oXCJnZXREYXRhU291cmNlc0FyZ3NDb3VudCgpXCIpXG5cdFx0XHQuc3RhdGljQ2FsbCgpXG5cdFx0XHQudGhlbigoZGltczogQXJyYXk8YmlnaW50PikgPT4gZGltcy5tYXAoKGRpbSkgPT4gTnVtYmVyKGRpbSkpKVxuXHR9XG5cblx0cHVibGljIGFzeW5jIHZlcmlmeVJhZG9uUmVxdWVzdChcblx0XHRhcmdzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IEFycmF5PHN0cmluZ1tdPixcblx0XHRvcHRpb25zPzoge1xuXHRcdFx0Y29uZmlybWF0aW9ucz86IG51bWJlclxuXHRcdFx0b25WZXJpZnlSYWRvblJlcXVlc3Q6IChyYWRIYXNoOiBzdHJpbmcpID0+IGFueVxuXHRcdFx0b25WZXJpZnlSYWRvblJlcXVlc3RSZWNlaXB0OiAoXG5cdFx0XHRcdHJlY2VpcHQ6IENvbnRyYWN0VHJhbnNhY3Rpb25SZWNlaXB0IHwgbnVsbCxcblx0XHRcdCkgPT4gYW55XG5cdFx0fSxcblx0KTogUHJvbWlzZTxXaXRuZXQuSGV4U3RyaW5nPiB7XG5cdFx0Y29uc3QgYXJnc0NvdW50ID0gYXdhaXQgdGhpcy5nZXREYXRhU291cmNlc0FyZ3NDb3VudCgpXG5cdFx0bGV0IGVuY29kZWRBcmdzOiBBcnJheTxzdHJpbmdbXT4gPSBbXVxuXHRcdGlmICh0eXBlb2YgYXJncyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKGFyZ3NDb3VudC5sZW5ndGggPT09IDEgJiYgYXJnc0NvdW50WzBdID09PSAxKSB7XG5cdFx0XHRcdGVuY29kZWRBcmdzID0gW1thcmdzIGFzIHN0cmluZ11dXG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpKSB7XG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheShhcmdzWzBdKSkge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0YXJnc0NvdW50Lmxlbmd0aCA9PT0gYXJncy5sZW5ndGggJiZcblx0XHRcdFx0XHQhYXJncy5maW5kKChzdWJhcmdzLCBpbmRleCkgPT4gc3ViYXJncy5sZW5ndGggIT09IGFyZ3NDb3VudFtpbmRleF0pXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGVuY29kZWRBcmdzID0gYXJncyBhcyBBcnJheTxzdHJpbmdbXT5cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0YXJncy5sZW5ndGggPT09IGFyZ3NDb3VudFswXSAmJlxuXHRcdFx0XHQhYXJncy5maW5kKChhcmcpID0+IHR5cGVvZiBhcmcgIT09IFwic3RyaW5nXCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0ZW5jb2RlZEFyZ3MgPSBbYXJncyBhcyBzdHJpbmdbXV1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKGVuY29kZWRBcmdzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhyb3cgVHlwZUVycm9yKFxuXHRcdFx0XHRgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9QCR7dGhpcy5hZGRyZXNzfTogdW5tYXRjaGluZyBhcmdzIGNvdW50ICE9IFske2FyZ3NDb3VudH0sIF0uYCxcblx0XHRcdClcblx0XHR9XG5cdFx0Y29uc3QgbWV0aG9kID0gdGhpcy5jb250cmFjdC5nZXRGdW5jdGlvbihcInZlcmlmeVJhZG9uUmVxdWVzdChzdHJpbmdbXVtdKVwiKVxuXHRcdGNvbnN0IHJhZEhhc2ggPSAoYXdhaXQgbWV0aG9kLnN0YXRpY0NhbGwoZW5jb2RlZEFyZ3MpKS5zbGljZSgyKVxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCAoXG5cdFx0XHRcdGF3YWl0IHRoaXMud2l0T3JhY2xlLmdldFdpdE9yYWNsZVJhZG9uUmVnaXN0cnkoKVxuXHRcdFx0KS5sb29rdXBSYWRvblJlcXVlc3RCeXRlY29kZShyYWRIYXNoKVxuXHRcdH0gY2F0Y2gge1xuXHRcdFx0aWYgKG9wdGlvbnM/Lm9uVmVyaWZ5UmFkb25SZXF1ZXN0KSBvcHRpb25zLm9uVmVyaWZ5UmFkb25SZXF1ZXN0KHJhZEhhc2gpXG5cdFx0XHRhd2FpdCBtZXRob2Rcblx0XHRcdFx0LnNlbmQoZW5jb2RlZEFyZ3MpXG5cdFx0XHRcdC50aGVuKCh0eCkgPT4gdHgud2FpdChvcHRpb25zPy5jb25maXJtYXRpb25zIHx8IDEpKVxuXHRcdFx0XHQudGhlbigocmVjZWlwdCkgPT4ge1xuXHRcdFx0XHRcdGlmIChvcHRpb25zPy5vblZlcmlmeVJhZG9uUmVxdWVzdFJlY2VpcHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvbnMub25WZXJpZnlSYWRvblJlcXVlc3RSZWNlaXB0KHJlY2VpcHQpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiByYWRIYXNoXG5cdFx0XHRcdH0pXG5cdFx0fVxuXHRcdHJldHVybiByYWRIYXNoXG5cdH1cbn1cbiJdfQ==