@witnet/sdk 1.0.4 → 1.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 (211) hide show
  1. package/.env_witnet +6 -6
  2. package/LICENSE +21 -21
  3. package/README.md +103 -103
  4. package/dist/package.json +3 -4
  5. package/dist/src/bin/helpers.js +1 -1
  6. package/dist/src/index.js +1 -1
  7. package/dist/src/lib/crypto/account.d.ts +3 -1
  8. package/dist/src/lib/crypto/account.d.ts.map +1 -1
  9. package/dist/src/lib/crypto/account.js +7 -1
  10. package/dist/src/lib/crypto/coinbase.js +1 -1
  11. package/dist/src/lib/crypto/index.js +1 -1
  12. package/dist/src/lib/crypto/interfaces.d.ts +2 -0
  13. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -1
  14. package/dist/src/lib/crypto/interfaces.js +1 -1
  15. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +1 -1
  16. package/dist/src/lib/crypto/payloads/StakePayload.js +1 -1
  17. package/dist/src/lib/crypto/payloads/UnstakePayload.js +1 -1
  18. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +1 -1
  19. package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
  20. package/dist/src/lib/crypto/payloads.js +12 -1
  21. package/dist/src/lib/crypto/signer.d.ts +1 -0
  22. package/dist/src/lib/crypto/signer.d.ts.map +1 -1
  23. package/dist/src/lib/crypto/signer.js +18 -1
  24. package/dist/src/lib/crypto/transmitters/DataRequests.js +1 -1
  25. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +1 -1
  26. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +1 -1
  27. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +1 -1
  28. package/dist/src/lib/crypto/transmitters.js +4 -4
  29. package/dist/src/lib/crypto/types.d.ts.map +1 -1
  30. package/dist/src/lib/crypto/types.js +2 -1
  31. package/dist/src/lib/crypto/utils.js +1 -1
  32. package/dist/src/lib/crypto/wallet.d.ts +3 -1
  33. package/dist/src/lib/crypto/wallet.d.ts.map +1 -1
  34. package/dist/src/lib/crypto/wallet.js +10 -1
  35. package/dist/src/lib/index.js +1 -1
  36. package/dist/src/lib/radon/ccdr/eth.js +1 -1
  37. package/dist/src/lib/radon/ccdr/index.js +1 -1
  38. package/dist/src/lib/radon/ccdr/wit.js +1 -1
  39. package/dist/src/lib/radon/filters.js +1 -1
  40. package/dist/src/lib/radon/index.js +1 -1
  41. package/dist/src/lib/radon/reducers.js +1 -1
  42. package/dist/src/lib/radon/types.js +1 -1
  43. package/dist/src/lib/radon/utils.js +1 -1
  44. package/dist/src/lib/rpc/index.js +1 -1
  45. package/dist/src/lib/rpc/nodes.js +1 -1
  46. package/dist/src/lib/rpc/provider.js +1 -1
  47. package/dist/src/lib/rpc/types.d.ts +6 -4
  48. package/dist/src/lib/rpc/types.d.ts.map +1 -1
  49. package/dist/src/lib/rpc/types.js +1 -1
  50. package/dist/src/lib/types.d.ts +0 -1
  51. package/dist/src/lib/types.d.ts.map +1 -1
  52. package/dist/src/lib/types.js +1 -1
  53. package/dist/src/lib/utils.js +1 -1
  54. package/dist/witnet/assets/index.js +1 -1
  55. package/dist/witnet/assets/modals/index.js +1 -1
  56. package/dist/witnet/assets/modals/web3/eth.js +1 -1
  57. package/dist/witnet/assets/modals/web3/ipfs.js +1 -1
  58. package/dist/witnet/assets/modals/web3/wit.js +1 -1
  59. package/dist/witnet/assets/requests.js +1 -1
  60. package/package.json +3 -4
  61. package/src/bin/cli/history.js +31 -31
  62. package/src/bin/cli/inspect.js +405 -405
  63. package/src/bin/cli/network.js +594 -594
  64. package/src/bin/cli/nodes.js +364 -364
  65. package/src/bin/cli/radon.js +817 -815
  66. package/src/bin/cli/wallet.js +1121 -1117
  67. package/src/bin/helpers.js +840 -840
  68. package/src/bin/postinstall.js +9 -9
  69. package/src/bin/toolkit.js +295 -295
  70. package/witnet/assets/_index.js +8 -8
  71. package/witnet/assets/_requests.js +25 -25
  72. package/witnet/assets/_sources.js +36 -36
  73. package/witnet/assets/_templates.js +36 -36
  74. package/witnet/assets/index.js +4 -4
  75. package/witnet/assets/modals/index.js +9 -9
  76. package/witnet/assets/modals/web3/eth.js +29 -29
  77. package/witnet/assets/modals/web3/ipfs.js +19 -19
  78. package/witnet/assets/modals/web3/wit.js +21 -21
  79. package/witnet/assets/requests.js +95 -95
  80. package/dist/bin/helpers.d.ts +0 -88
  81. package/dist/bin/helpers.d.ts.map +0 -1
  82. package/dist/bin/helpers.js +0 -866
  83. package/dist/index.d.ts +0 -4
  84. package/dist/index.d.ts.map +0 -1
  85. package/dist/index.js +0 -42
  86. package/dist/lib/crypto/account.d.ts +0 -18
  87. package/dist/lib/crypto/account.d.ts.map +0 -1
  88. package/dist/lib/crypto/account.js +0 -152
  89. package/dist/lib/crypto/coinbase.d.ts +0 -9
  90. package/dist/lib/crypto/coinbase.d.ts.map +0 -1
  91. package/dist/lib/crypto/coinbase.js +0 -39
  92. package/dist/lib/crypto/index.d.ts +0 -7
  93. package/dist/lib/crypto/index.d.ts.map +0 -1
  94. package/dist/lib/crypto/index.js +0 -28
  95. package/dist/lib/crypto/interfaces.d.ts +0 -80
  96. package/dist/lib/crypto/interfaces.d.ts.map +0 -1
  97. package/dist/lib/crypto/interfaces.js +0 -3
  98. package/dist/lib/crypto/payloads/DataRequestPayload.d.ts +0 -47
  99. package/dist/lib/crypto/payloads/DataRequestPayload.d.ts.map +0 -1
  100. package/dist/lib/crypto/payloads/DataRequestPayload.js +0 -384
  101. package/dist/lib/crypto/payloads/StakePayload.d.ts +0 -27
  102. package/dist/lib/crypto/payloads/StakePayload.d.ts.map +0 -1
  103. package/dist/lib/crypto/payloads/StakePayload.js +0 -184
  104. package/dist/lib/crypto/payloads/UnstakePayload.d.ts +0 -35
  105. package/dist/lib/crypto/payloads/UnstakePayload.d.ts.map +0 -1
  106. package/dist/lib/crypto/payloads/UnstakePayload.js +0 -244
  107. package/dist/lib/crypto/payloads/ValueTransferPayload.d.ts +0 -24
  108. package/dist/lib/crypto/payloads/ValueTransferPayload.d.ts.map +0 -1
  109. package/dist/lib/crypto/payloads/ValueTransferPayload.js +0 -182
  110. package/dist/lib/crypto/payloads.d.ts +0 -54
  111. package/dist/lib/crypto/payloads.d.ts.map +0 -1
  112. package/dist/lib/crypto/payloads.js +0 -224
  113. package/dist/lib/crypto/signer.d.ts +0 -26
  114. package/dist/lib/crypto/signer.d.ts.map +0 -1
  115. package/dist/lib/crypto/signer.js +0 -299
  116. package/dist/lib/crypto/transmitters/DataRequests.d.ts +0 -14
  117. package/dist/lib/crypto/transmitters/DataRequests.d.ts.map +0 -1
  118. package/dist/lib/crypto/transmitters/DataRequests.js +0 -62
  119. package/dist/lib/crypto/transmitters/StakeDeposits.d.ts +0 -11
  120. package/dist/lib/crypto/transmitters/StakeDeposits.d.ts.map +0 -1
  121. package/dist/lib/crypto/transmitters/StakeDeposits.js +0 -48
  122. package/dist/lib/crypto/transmitters/StakeWithdrawals.d.ts +0 -17
  123. package/dist/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +0 -1
  124. package/dist/lib/crypto/transmitters/StakeWithdrawals.js +0 -115
  125. package/dist/lib/crypto/transmitters/ValueTransfers.d.ts +0 -10
  126. package/dist/lib/crypto/transmitters/ValueTransfers.d.ts.map +0 -1
  127. package/dist/lib/crypto/transmitters/ValueTransfers.js +0 -47
  128. package/dist/lib/crypto/transmitters.d.ts +0 -46
  129. package/dist/lib/crypto/transmitters.d.ts.map +0 -1
  130. package/dist/lib/crypto/transmitters.js +0 -506
  131. package/dist/lib/crypto/types.d.ts +0 -127
  132. package/dist/lib/crypto/types.d.ts.map +0 -1
  133. package/dist/lib/crypto/types.js +0 -261
  134. package/dist/lib/crypto/utils.d.ts +0 -10
  135. package/dist/lib/crypto/utils.d.ts.map +0 -1
  136. package/dist/lib/crypto/utils.js +0 -97
  137. package/dist/lib/crypto/wallet.d.ts +0 -26
  138. package/dist/lib/crypto/wallet.d.ts.map +0 -1
  139. package/dist/lib/crypto/wallet.js +0 -327
  140. package/dist/lib/helpers.d.ts +0 -90
  141. package/dist/lib/helpers.d.ts.map +0 -1
  142. package/dist/lib/helpers.js +0 -1031
  143. package/dist/lib/index.d.ts +0 -5
  144. package/dist/lib/index.d.ts.map +0 -1
  145. package/dist/lib/index.js +0 -21
  146. package/dist/lib/radon/artifacts.d.ts +0 -55
  147. package/dist/lib/radon/artifacts.d.ts.map +0 -1
  148. package/dist/lib/radon/artifacts.js +0 -347
  149. package/dist/lib/radon/ccdr/eth.d.ts +0 -100
  150. package/dist/lib/radon/ccdr/eth.d.ts.map +0 -1
  151. package/dist/lib/radon/ccdr/eth.js +0 -237
  152. package/dist/lib/radon/ccdr/index.d.ts +0 -34
  153. package/dist/lib/radon/ccdr/index.d.ts.map +0 -1
  154. package/dist/lib/radon/ccdr/index.js +0 -63
  155. package/dist/lib/radon/ccdr/wit.d.ts +0 -29
  156. package/dist/lib/radon/ccdr/wit.d.ts.map +0 -1
  157. package/dist/lib/radon/ccdr/wit.js +0 -60
  158. package/dist/lib/radon/filters.d.ts +0 -14
  159. package/dist/lib/radon/filters.d.ts.map +0 -1
  160. package/dist/lib/radon/filters.js +0 -47
  161. package/dist/lib/radon/index.d.ts +0 -36
  162. package/dist/lib/radon/index.d.ts.map +0 -1
  163. package/dist/lib/radon/index.js +0 -154
  164. package/dist/lib/radon/reducers.d.ts +0 -29
  165. package/dist/lib/radon/reducers.d.ts.map +0 -1
  166. package/dist/lib/radon/reducers.js +0 -101
  167. package/dist/lib/radon/retrievals.d.ts +0 -120
  168. package/dist/lib/radon/retrievals.d.ts.map +0 -1
  169. package/dist/lib/radon/retrievals.js +0 -358
  170. package/dist/lib/radon/sources.d.ts +0 -102
  171. package/dist/lib/radon/sources.d.ts.map +0 -1
  172. package/dist/lib/radon/sources.js +0 -294
  173. package/dist/lib/radon/types.d.ts +0 -521
  174. package/dist/lib/radon/types.d.ts.map +0 -1
  175. package/dist/lib/radon/types.js +0 -1066
  176. package/dist/lib/radon/utils.d.ts +0 -55
  177. package/dist/lib/radon/utils.d.ts.map +0 -1
  178. package/dist/lib/radon/utils.js +0 -181
  179. package/dist/lib/rpc/farm.d.ts +0 -66
  180. package/dist/lib/rpc/farm.d.ts.map +0 -1
  181. package/dist/lib/rpc/farm.js +0 -808
  182. package/dist/lib/rpc/index.d.ts +0 -3
  183. package/dist/lib/rpc/index.d.ts.map +0 -1
  184. package/dist/lib/rpc/index.js +0 -19
  185. package/dist/lib/rpc/node.d.ts +0 -38
  186. package/dist/lib/rpc/node.d.ts.map +0 -1
  187. package/dist/lib/rpc/node.js +0 -335
  188. package/dist/lib/rpc/nodes.d.ts +0 -40
  189. package/dist/lib/rpc/nodes.d.ts.map +0 -1
  190. package/dist/lib/rpc/nodes.js +0 -531
  191. package/dist/lib/rpc/provider.d.ts +0 -72
  192. package/dist/lib/rpc/provider.d.ts.map +0 -1
  193. package/dist/lib/rpc/provider.js +0 -402
  194. package/dist/lib/rpc/reporter.d.ts +0 -18
  195. package/dist/lib/rpc/reporter.d.ts.map +0 -1
  196. package/dist/lib/rpc/reporter.js +0 -99
  197. package/dist/lib/rpc/types.d.ts +0 -396
  198. package/dist/lib/rpc/types.d.ts.map +0 -1
  199. package/dist/lib/rpc/types.js +0 -81
  200. package/dist/lib/rpc/wallet.d.ts +0 -72
  201. package/dist/lib/rpc/wallet.d.ts.map +0 -1
  202. package/dist/lib/rpc/wallet.js +0 -41
  203. package/dist/lib/types.d.ts +0 -19
  204. package/dist/lib/types.d.ts.map +0 -1
  205. package/dist/lib/types.js +0 -7
  206. package/dist/lib/utils.d.ts +0 -5
  207. package/dist/lib/utils.d.ts.map +0 -1
  208. package/dist/lib/utils.js +0 -51
  209. package/dist/src/lib/rpc/reporter.d.ts +0 -17
  210. package/dist/src/lib/rpc/reporter.d.ts.map +0 -1
  211. package/dist/src/lib/rpc/reporter.js +0 -27
@@ -1,1031 +0,0 @@
1
- var __awaiter =
2
- (this && this.__awaiter) ||
3
- ((thisArg, _arguments, P, generator) => {
4
- function adopt(value) {
5
- return value instanceof P
6
- ? value
7
- : new P((resolve) => {
8
- resolve(value)
9
- })
10
- }
11
- return new (P || (P = Promise))((resolve, reject) => {
12
- function fulfilled(value) {
13
- try {
14
- step(generator.next(value))
15
- } catch (e) {
16
- reject(e)
17
- }
18
- }
19
- function rejected(value) {
20
- try {
21
- step(generator["throw"](value))
22
- } catch (e) {
23
- reject(e)
24
- }
25
- }
26
- function step(result) {
27
- result.done
28
- ? resolve(result.value)
29
- : adopt(result.value).then(fulfilled, rejected)
30
- }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next())
32
- })
33
- })
34
- var __generator =
35
- (this && this.__generator) ||
36
- ((thisArg, body) => {
37
- var _ = {
38
- label: 0,
39
- sent: () => {
40
- if (t[0] & 1) throw t[1]
41
- return t[1]
42
- },
43
- trys: [],
44
- ops: [],
45
- },
46
- f,
47
- y,
48
- t,
49
- g = Object.create(
50
- (typeof Iterator === "function" ? Iterator : Object).prototype,
51
- )
52
- return (
53
- (g.next = verb(0)),
54
- (g["throw"] = verb(1)),
55
- (g["return"] = verb(2)),
56
- typeof Symbol === "function" &&
57
- (g[Symbol.iterator] = function () {
58
- return this
59
- }),
60
- g
61
- )
62
- function verb(n) {
63
- return (v) => step([n, v])
64
- }
65
- function step(op) {
66
- if (f) throw new TypeError("Generator is already executing.")
67
- while ((g && ((g = 0), op[0] && (_ = 0)), _))
68
- try {
69
- if (
70
- ((f = 1),
71
- y &&
72
- (t =
73
- op[0] & 2
74
- ? y["return"]
75
- : op[0]
76
- ? y["throw"] || ((t = y["return"]) && t.call(y), 0)
77
- : y.next) &&
78
- !(t = t.call(y, op[1])).done)
79
- )
80
- return t
81
- if (((y = 0), t)) op = [op[0] & 2, t.value]
82
- switch (op[0]) {
83
- case 0:
84
- case 1:
85
- t = op
86
- break
87
- case 4:
88
- _.label++
89
- return { value: op[1], done: false }
90
- case 5:
91
- _.label++
92
- y = op[1]
93
- op = [0]
94
- continue
95
- case 7:
96
- op = _.ops.pop()
97
- _.trys.pop()
98
- continue
99
- default:
100
- if (
101
- !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) &&
102
- (op[0] === 6 || op[0] === 2)
103
- ) {
104
- _ = 0
105
- continue
106
- }
107
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
108
- _.label = op[1]
109
- break
110
- }
111
- if (op[0] === 6 && _.label < t[1]) {
112
- _.label = t[1]
113
- t = op
114
- break
115
- }
116
- if (t && _.label < t[2]) {
117
- _.label = t[2]
118
- _.ops.push(op)
119
- break
120
- }
121
- if (t[2]) _.ops.pop()
122
- _.trys.pop()
123
- continue
124
- }
125
- op = body.call(thisArg, _)
126
- } catch (e) {
127
- op = [6, e]
128
- y = 0
129
- } finally {
130
- f = t = 0
131
- }
132
- if (op[0] & 5) throw op[1]
133
- return { value: op[0] ? op[1] : void 0, done: true }
134
- }
135
- })
136
- var __read =
137
- (this && this.__read) ||
138
- ((o, n) => {
139
- var m = typeof Symbol === "function" && o[Symbol.iterator]
140
- if (!m) return o
141
- var i = m.call(o),
142
- r,
143
- ar = [],
144
- e
145
- try {
146
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value)
147
- } catch (error) {
148
- e = { error: error }
149
- } finally {
150
- try {
151
- if (r && !r.done && (m = i["return"])) m.call(i)
152
- } finally {
153
- if (e) throw e.error
154
- }
155
- }
156
- return ar
157
- })
158
- var __spreadArray =
159
- (this && this.__spreadArray) ||
160
- ((to, from, pack) => {
161
- if (pack || arguments.length === 2)
162
- for (var i = 0, l = from.length, ar; i < l; i++) {
163
- if (ar || !(i in from)) {
164
- if (!ar) ar = Array.prototype.slice.call(from, 0, i)
165
- ar[i] = from[i]
166
- }
167
- }
168
- return to.concat(ar || Array.prototype.slice.call(from))
169
- })
170
- var exec = require("child_process").exec
171
- var net = require("net")
172
- var readline = require("readline")
173
- var colorstrip = (str) =>
174
- str.replace(
175
- /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,
176
- "",
177
- )
178
- var commas = (number) => {
179
- parts = number.toString().split(".")
180
- var result =
181
- parts.length <= 1
182
- ? "".concat(parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","))
183
- : ""
184
- .concat(parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","), ".")
185
- .concat(parts[1])
186
- return result
187
- }
188
- var fromNanowits = (x) => Math.floor(x / Math.pow(10, 9))
189
- function toFixedTrunc(x, n) {
190
- var v = (typeof x === "string" ? x : x.toString()).split(".")
191
- if (n <= 0) return v[0]
192
- var f = v[1] || ""
193
- if (f.length > n) return "".concat(v[0], ".").concat(f.substr(0, n))
194
- while (f.length < n) f += "0"
195
- return "".concat(v[0], ".").concat(f)
196
- }
197
- var whole_wits = (number, digits) => {
198
- var lookup = [
199
- { value: 1, symbol: " nWits" },
200
- { value: 1e3, symbol: " μWits" },
201
- { value: 1e6, symbol: " mWits" },
202
- { value: 1e9, symbol: " Wits" },
203
- { value: 1e12, symbol: " KWits" },
204
- { value: 1e15, symbol: " MWits" },
205
- ]
206
- var regexp = /\.0+$|(?<=\.[0-9])0+$/
207
- var item = lookup.findLast((item) => number >= item.value)
208
- return item
209
- ? toFixedTrunc(
210
- commas(number / item.value),
211
- digits,
212
- )./*replace(regexp, "")*/ concat(item.symbol)
213
- : "(no Wits)"
214
- }
215
- var lcyan = (str) => "\u001B[1;96m".concat(str, "\u001B[0m")
216
- var lgray = (str) => "\u001B[1;90m".concat(str, "\u001B[0m")
217
- var lgreen = (str) => "\u001B[1;92m".concat(str, "\u001B[0m")
218
- var lmagenta = (str) => "\u001B[1;95m".concat(str, "\u001B[0m")
219
- var lyellow = (str) => "\u001B[1;93m".concat(str, "\u001B[0m")
220
- var mcyan = (str) => "\u001B[96m".concat(str, "\u001B[0m")
221
- var mgreen = (str) => "\u001B[92m".concat(str, "\u001B[0m")
222
- var mmagenta = (str) => "\u001B[95m".concat(str, "\u001B[0m")
223
- var mred = (str) => "\u001B[91m".concat(str, "\u001B[0m")
224
- var myellow = (str) => "\u001B[93m".concat(str, "\u001B[0m")
225
- var cyan = (str) => "\u001B[36m".concat(str, "\u001B[0m")
226
- var gray = (str) => "\u001B[90m".concat(str, "\u001B[0m")
227
- var green = (str) => "\u001B[32m".concat(str, "\u001B[0m")
228
- var magenta = (str) => "\u001B[35m".concat(str, "\u001B[0m")
229
- var normal = (str) => "\u001B[98m".concat(str, "\u001B[0m")
230
- var red = (str) => "\u001B[31m".concat(str, "\u001B[0m")
231
- var white = (str) => "\u001B[1;98m".concat(str, "\u001B[0m")
232
- var yellow = (str) => "\u001B[33m".concat(str, "\u001B[0m")
233
- function countLeaves(t, obj) {
234
- if (!obj) return 0
235
- if (obj instanceof t) return 1
236
- if (Array.isArray(obj))
237
- return obj.reduce((sum, item) => sum + countLeaves(t, item), 0)
238
- else
239
- return Object.values(obj).reduce(
240
- (sum, item) => sum + countLeaves(t, item),
241
- 0,
242
- )
243
- }
244
- function deleteExtraFlags(args) {
245
- return args.filter((arg) => !arg.startsWith("--"))
246
- }
247
- function extractFromArgs(args, flags) {
248
- var curated = {}
249
- if (args && flags) {
250
- Object.keys(flags).forEach((flag) => {
251
- var flagIndex = args.indexOf("--".concat(flag))
252
- if (flagIndex >= 0) {
253
- if (flags[flag].param) {
254
- curated[flag] = args[flagIndex]
255
- if (!args[flagIndex + 1] || args[flagIndex + 1].startsWith("--")) {
256
- throw "Missing required parameter for --".concat(flag)
257
- } else {
258
- curated[flag] = args[flagIndex + 1]
259
- args.splice(flagIndex, 2)
260
- }
261
- } else {
262
- curated[flag] = true
263
- args.splice(flagIndex, 1)
264
- }
265
- }
266
- })
267
- }
268
- return [args, curated]
269
- }
270
- function fromHexString(hexString) {
271
- if (hexString.startsWith("0x")) hexString = hexString.slice(2)
272
- return Uint8Array.from(
273
- hexString.match(/.{1,2}/g).map((byte) => Number.parseInt(byte, 16)),
274
- )
275
- }
276
- function ipIsPrivateOrLocalhost(ip) {
277
- if (ip.substring(0, 7) === "::ffff:") ip = ip.substring(7)
278
- if (net.isIPv4(ip)) {
279
- // check localhost
280
- if (ip === "127.0.0.1") return true
281
- // 10.0.0.0 - 10.255.255.255 || 172.16.0.0 - 172.31.255.255 || 192.168.0.0 - 192.168.255.255
282
- return (
283
- /^(10)\.(.*)\.(.*)\.(.*)$/.test(ip) ||
284
- /^(172)\.(1[6-9]|2[0-9]|3[0-1])\.(.*)\.(.*)$/.test(ip) ||
285
- /^(192)\.(168)\.(.*)\.(.*)$/.test(ip)
286
- )
287
- }
288
- // else: ip is IPv6
289
- var firstWord = ip.split(":").find((el) => !!el) //get first not empty word
290
- // equivalent of 127.0.0.1 in IPv6
291
- if (ip === "::1") return true
292
- // The original IPv6 Site Local addresses (fec0::/10) are deprecated. Range: fec0 - feff
293
- else if (/^fe[c-f][0-f]$/.test(firstWord)) return true
294
- // These days Unique Local Addresses (ULA) are used in place of Site Local.
295
- // Range: fc00 - fcff
296
- else if (/^fc[0-f]{2}$/.test(firstWord)) return true
297
- // Range: fd00 - fcff
298
- else if (/^fd[0-f]{2}$/.test(firstWord)) return true
299
- // Link local addresses (prefixed with fe80) are not routable
300
- else if (firstWord === "fe80") return true
301
- // Discard Prefix
302
- else if (firstWord === "100") return true
303
- // Any other IP address is not Unique Local Address (ULA)
304
- return false
305
- }
306
- function isHexStringOfLength(str, length) {
307
- return (
308
- isHexString(str) &&
309
- ((str.starsWith("0x") && str.slice(2).length === length * 2) ||
310
- str.length === length * 2)
311
- )
312
- }
313
- function isHexString(str) {
314
- return (
315
- typeof str === "string" &&
316
- ((str.startsWith("0x") && /^[a-fA-F0-9]+$/i.test(str.slice(2))) ||
317
- /^[a-fA-F0-9]+$/i.test(str))
318
- )
319
- }
320
- function toHexString(buffer) {
321
- return (
322
- "0x" +
323
- Array.prototype.map
324
- .call(buffer, (x) => ("00" + x.toString(16)).slice(-2))
325
- .join("")
326
- .match(/[a-fA-F0-9]{2}/g)
327
- .join("")
328
- )
329
- }
330
- function parseURL(url) {
331
- try {
332
- var parsedUrl = new URL(url)
333
- return [
334
- parsedUrl.protocol + "//",
335
- parsedUrl.host,
336
- parsedUrl.pathname.slice(1),
337
- parsedUrl.search.slice(1),
338
- ]
339
- } catch (_a) {
340
- throw new TypeError("Invalid URL was provided: ".concat(url))
341
- }
342
- }
343
- function showUsage(cmd, module) {
344
- showUsageHeadline(cmd)
345
- if (module === null || module === void 0 ? void 0 : module.flags)
346
- showUsageFlags(module.flags)
347
- if (module === null || module === void 0 ? void 0 : module.router)
348
- showUsageRouter(module.router)
349
- if (module === null || module === void 0 ? void 0 : module.envars)
350
- showUsageEnvars(module.envars)
351
- }
352
- function showUsageRouter(router) {
353
- var cmds = Object.entries(router)
354
- if (cmds.length > 0) {
355
- console.info("\nSUBCOMMANDS:")
356
- var maxLength_1 = Math.max.apply(
357
- Math,
358
- __spreadArray(
359
- [],
360
- __read(
361
- cmds.map((_a) => {
362
- var _b = __read(_a, 1),
363
- cmd = _b[0]
364
- return cmd.length
365
- }),
366
- ),
367
- false,
368
- ),
369
- )
370
- cmds.forEach((cmd) => {
371
- console.info(
372
- " ",
373
- "".concat(cmd[0]).concat(" ".repeat(maxLength_1 - cmd[0].length)),
374
- " ",
375
- cmd[1].hint,
376
- )
377
- })
378
- }
379
- }
380
- function showUsageError(cmd, subcmd, module, error) {
381
- var _a
382
- showUsageSubcommand(cmd, subcmd, module, error)
383
- if (error) {
384
- console.info("\nERROR:")
385
- console.error(
386
- ((_a = error === null || error === void 0 ? void 0 : error.stack) ===
387
- null || _a === void 0
388
- ? void 0
389
- : _a.split("\n")[0]) || error,
390
- )
391
- }
392
- }
393
- function showUsageEnvars(envars) {
394
- envars = Object.entries(envars)
395
- if (envars.length > 0) {
396
- console.info("\nENVARS:")
397
- var maxWidth_1 = Math.max.apply(
398
- Math,
399
- __spreadArray(
400
- [],
401
- __read(
402
- envars.map((_a) => {
403
- var _b = __read(_a, 1),
404
- envar = _b[0]
405
- return envar.length
406
- }),
407
- ),
408
- false,
409
- ),
410
- )
411
- envars.forEach((_a) => {
412
- var _b = __read(_a, 2),
413
- envar = _b[0],
414
- hint = _b[1]
415
- if (envar.toUpperCase().indexOf("KEY") < 0 && process.env[envar]) {
416
- console.info(
417
- " ",
418
- ""
419
- .concat(yellow(envar.toUpperCase()))
420
- .concat(" ".repeat(maxWidth_1 - envar.length)),
421
- ' => Settled to "'.concat(myellow(process.env[envar]), '"'),
422
- )
423
- } else {
424
- console.info(
425
- " ",
426
- ""
427
- .concat(yellow(envar.toUpperCase()))
428
- .concat(" ".repeat(maxWidth_1 - envar.length)),
429
- " ".concat(hint),
430
- )
431
- }
432
- })
433
- }
434
- }
435
- function showUsageFlags(flags) {
436
- flags = Object.entries(flags)
437
- if (flags.length > 0) {
438
- console.info("\nFLAGS:")
439
- var maxLength_2 = Math.max.apply(
440
- Math,
441
- __spreadArray(
442
- [],
443
- __read(
444
- flags.map((_a) => {
445
- var _b = __read(_a, 2),
446
- key = _b[0],
447
- param = _b[1].param
448
- return param ? key.length + param.length + 3 : key.length
449
- }),
450
- ),
451
- false,
452
- ),
453
- )
454
- flags.forEach((flag) => {
455
- var str = ""
456
- .concat(flag[0])
457
- .concat(flag[1].param ? gray(" <".concat(flag[1].param, ">")) : "")
458
- console.info(
459
- " ",
460
- "--"
461
- .concat(str)
462
- .concat(" ".repeat(maxLength_2 - colorstrip(str).length)),
463
- " ",
464
- flag[1].hint,
465
- )
466
- })
467
- }
468
- }
469
- function showUsageHeadline(cmd, subcmd, module) {
470
- var _a, _b, _c
471
- console.info("USAGE:")
472
- if (subcmd) {
473
- var params =
474
- (_a = module.router[subcmd]) === null || _a === void 0
475
- ? void 0
476
- : _a.params
477
- var options =
478
- (_b = module.router[subcmd]) === null || _b === void 0
479
- ? void 0
480
- : _b.options
481
- if (params) {
482
- var optionalize_1 = (str) =>
483
- str.endsWith(" ...]")
484
- ? "[<".concat(str.slice(1, -5), "> ...]")
485
- : str[0] === "["
486
- ? "[<".concat(str.slice(1, -1), ">]")
487
- : "<".concat(str, ">")
488
- if (Array.isArray(params)) {
489
- params = params.map((param) => optionalize_1(param)).join(" ") + " "
490
- } else {
491
- params = optionalize_1(params)
492
- }
493
- }
494
- console.info(
495
- " "
496
- .concat(white("npx witnet ".concat(cmd)), " [FLAGS] ")
497
- .concat(white(subcmd), " ")
498
- .concat(params ? green(params) + " " : "")
499
- .concat(options && Object.keys(options).length > 0 ? "[OPTIONS]" : ""),
500
- )
501
- if (
502
- (_c =
503
- module === null || module === void 0
504
- ? void 0
505
- : module.router[subcmd]) === null || _c === void 0
506
- ? void 0
507
- : _c.hint
508
- ) {
509
- console.info("\nDESCRIPTION:")
510
- console.info(" ".concat(module.router[subcmd].hint))
511
- }
512
- } else {
513
- console.info(
514
- " ".concat(
515
- white("npx witnet ".concat(cmd)),
516
- " [FLAGS] <SUBCOMMAND> ... [OPTIONS]",
517
- ),
518
- )
519
- }
520
- }
521
- function showUsageOptions(options) {
522
- options = Object.entries(options)
523
- if (options.length > 0) {
524
- console.info("\nOPTIONS:")
525
- var maxLength_3 = options
526
- .map((option) =>
527
- option[1].param
528
- ? option[1].param.length + option[0].length + 3
529
- : option[0].length,
530
- )
531
- .reduce((prev, curr) => (curr > prev ? curr : prev))
532
- options.forEach((option) => {
533
- if (option[1].hint) {
534
- var str = ""
535
- .concat(option[0])
536
- .concat(
537
- option[1].param ? gray(" <".concat(option[1].param, ">")) : "",
538
- )
539
- console.info(
540
- " ",
541
- "--"
542
- .concat(str)
543
- .concat(" ".repeat(maxLength_3 - colorstrip(str).length)),
544
- " ",
545
- option[1].hint,
546
- )
547
- }
548
- })
549
- }
550
- }
551
- function showUsageSubcommand(cmd, subcmd, module) {
552
- var _a, _b
553
- showUsageHeadline(cmd, subcmd, module)
554
- if (module === null || module === void 0 ? void 0 : module.flags)
555
- showUsageFlags(module === null || module === void 0 ? void 0 : module.flags)
556
- if (
557
- (_a =
558
- module === null || module === void 0 ? void 0 : module.router[subcmd]) ===
559
- null || _a === void 0
560
- ? void 0
561
- : _a.options
562
- )
563
- showUsageOptions(
564
- (_b = module.router[subcmd]) === null || _b === void 0
565
- ? void 0
566
- : _b.options,
567
- )
568
- if (module === null || module === void 0 ? void 0 : module.envars)
569
- showUsageEnvars(
570
- module === null || module === void 0 ? void 0 : module.envars,
571
- )
572
- }
573
- function showVersion() {
574
- console.info(
575
- "".concat(
576
- mcyan(
577
- "Wit/Oracle Toolkit CLI v".concat(
578
- require("../../package.json").version,
579
- ),
580
- ),
581
- ),
582
- )
583
- }
584
- function getWildcardsCountFromString(str) {
585
- var maxArgsIndex = 0
586
- if (str) {
587
- var match = void 0
588
- var regexp = /\\\d\\/g
589
- while ((match = regexp.exec(str)) !== null) {
590
- var argsIndex = Number.parseInt(match[0][1]) + 1
591
- if (argsIndex > maxArgsIndex) maxArgsIndex = argsIndex
592
- }
593
- }
594
- return maxArgsIndex
595
- }
596
- function isWildcard(str) {
597
- return str.length == 3 && /\\\d\\/g.test(str)
598
- }
599
- function replaceWildcards(obj, args) {
600
- if (args.length > 10) args = args.slice(0, 10)
601
- if (obj && typeof obj === "string") {
602
- for (var argIndex = 0; argIndex < args.length; argIndex++) {
603
- var wildcard = "\\".concat(argIndex, "\\")
604
- obj = obj.replaceAll(wildcard, args[argIndex])
605
- }
606
- } else if (obj && Array.isArray(obj)) {
607
- obj = obj.map((value) =>
608
- typeof value === "string" || Array.isArray(value)
609
- ? replaceWildcards(value, args)
610
- : value,
611
- )
612
- }
613
- return obj
614
- }
615
- function spliceWildcard(obj, argIndex, argValue, argsCount) {
616
- if (obj && typeof obj === "string") {
617
- var wildcard = "\\".concat(argIndex, "\\")
618
- obj = obj.replaceAll(wildcard, argValue)
619
- for (var j = argIndex + 1; j < argsCount; j++) {
620
- obj = obj.replaceAll("\\".concat(j, "\\"), "\\".concat(j - 1, "\\"))
621
- }
622
- } else if (obj && Array.isArray(obj)) {
623
- obj = obj.map((value) =>
624
- typeof value === "string" || Array.isArray(value)
625
- ? spliceWildcard(value, argIndex, argValue, argsCount)
626
- : value,
627
- )
628
- }
629
- return obj
630
- }
631
- function toolkitRun(settings, args) {
632
- return __awaiter(this, void 0, void 0, function () {
633
- var cmd
634
- return __generator(this, (_a) => {
635
- cmd = "".concat(settings.paths.toolkitBinPath, " ").concat(args.join(" "))
636
- return [
637
- 2 /*return*/,
638
- new Promise((resolve, reject) => {
639
- exec(
640
- cmd,
641
- { maxBuffer: 1024 * 1024 * 10 },
642
- (error, stdout, stderr) => {
643
- if (error) {
644
- reject(error)
645
- }
646
- if (stderr) {
647
- reject(stderr)
648
- }
649
- resolve(stdout)
650
- },
651
- )
652
- }),
653
- ]
654
- })
655
- })
656
- }
657
- function toUpperCamelCase(str) {
658
- return str
659
- .replace(/\b(\w)/g, (match, capture) => capture.toUpperCase())
660
- .replace(/\s+/g, "")
661
- }
662
- function toUtf8Array(str) {
663
- var utf8 = []
664
- for (var i = 0; i < str.length; i++) {
665
- var charcode = str.charCodeAt(i)
666
- if (charcode < 0x80) utf8.push(charcode)
667
- else if (charcode < 0x800) {
668
- utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f))
669
- } else if (charcode < 0xd800 || charcode >= 0xe000) {
670
- utf8.push(
671
- 0xe0 | (charcode >> 12),
672
- 0x80 | ((charcode >> 6) & 0x3f),
673
- 0x80 | (charcode & 0x3f),
674
- )
675
- }
676
- // surrogate pair
677
- else {
678
- i++
679
- // UTF-16 encodes 0x10000-0x10FFFF by
680
- // subtracting 0x10000 and splitting the
681
- // 20 bits of 0x0-0xFFFFF into two halves
682
- charcode =
683
- 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff))
684
- utf8.push(
685
- 0xf0 | (charcode >> 18),
686
- 0x80 | ((charcode >> 12) & 0x3f),
687
- 0x80 | ((charcode >> 6) & 0x3f),
688
- 0x80 | (charcode & 0x3f),
689
- )
690
- }
691
- }
692
- return utf8
693
- }
694
- function utf8ArrayToStr(array) {
695
- var out, i, len, c
696
- var char2, char3
697
- out = ""
698
- len = array.length
699
- i = 0
700
- while (i < len) {
701
- c = array[i++]
702
- switch (c >> 4) {
703
- case 0:
704
- case 1:
705
- case 2:
706
- case 3:
707
- case 4:
708
- case 5:
709
- case 6:
710
- case 7:
711
- // 0xxxxxxx
712
- out += String.fromCharCode(c)
713
- break
714
- case 12:
715
- case 13:
716
- // 110x xxxx 10xx xxxx
717
- char2 = array[i++]
718
- out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f))
719
- break
720
- case 14:
721
- // 1110 xxxx 10xx xxxx 10xx xxxx
722
- char2 = array[i++]
723
- char3 = array[i++]
724
- out += String.fromCharCode(
725
- ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0),
726
- )
727
- break
728
- }
729
- }
730
- return out
731
- }
732
- function prompt(question) {
733
- return __awaiter(this, void 0, void 0, function () {
734
- var readlineInterface
735
- return __generator(this, (_a) => {
736
- readlineInterface = readline.createInterface({
737
- input: process.stdin,
738
- output: process.stdout,
739
- })
740
- return [
741
- 2 /*return*/,
742
- new Promise((resolve, _) => {
743
- readlineInterface.question("".concat(question, " "), (response) => {
744
- readlineInterface.close()
745
- resolve(response.trim())
746
- })
747
- }),
748
- ]
749
- })
750
- })
751
- }
752
- function prompter(promise) {
753
- return __awaiter(this, void 0, void 0, function () {
754
- var loading
755
- return __generator(this, (_a) => {
756
- loading = (() => {
757
- var h = ["|", "/", "-", "\\"]
758
- var i = 0
759
- return setInterval(() => {
760
- i = i > 3 ? 0 : i
761
- process.stdout.write("\b\b".concat(h[i], " "))
762
- i++
763
- }, 50)
764
- })()
765
- return [
766
- 2 /*return*/,
767
- promise.then((result) => {
768
- clearInterval(loading)
769
- process.stdout.write("\b\b")
770
- return result
771
- }),
772
- ]
773
- })
774
- })
775
- }
776
- function traceChecklists(checklists) {
777
- if (checklists && Object.keys(checklists).length > 0) {
778
- var headlines = __spreadArray(
779
- ["NODES"],
780
- __read(Object.keys(checklists).map((key) => ":".concat(key))),
781
- false,
782
- )
783
- checklists = Object.values(checklists)
784
- var urls = Object.keys(checklists[0])
785
- var records = urls.map((url) => {
786
- var errors = checklists.filter(
787
- (checklist) => checklist[url] instanceof Error,
788
- ).length
789
- return __spreadArray(
790
- [
791
- errors === checklists.length
792
- ? red(url)
793
- : errors > 0
794
- ? myellow(url)
795
- : mcyan(url),
796
- ],
797
- __read(
798
- checklists.map((checklist) =>
799
- checklist[url] instanceof Error
800
- ? red(checklist[url])
801
- : checklist[url] === true
802
- ? lcyan("Aye")
803
- : cyan("Nay"),
804
- ),
805
- ),
806
- false,
807
- )
808
- })
809
- traceTable(records, {
810
- headlines: headlines,
811
- maxColumnWidth: 31,
812
- })
813
- }
814
- }
815
- function traceHeader(headline, color, indent) {
816
- if (color === void 0) {
817
- color = normal
818
- }
819
- if (indent === void 0) {
820
- indent = ""
821
- }
822
- console.info(
823
- ""
824
- .concat(indent, "\u250C\u2500")
825
- .concat("─".repeat(headline.length), "\u2500\u2510"),
826
- )
827
- console.info("".concat(indent, "\u2502 ").concat(color(headline), " \u2502"))
828
- console.info(
829
- ""
830
- .concat(indent, "\u2514\u2500")
831
- .concat("─".repeat(headline.length), "\u2500\u2518"),
832
- )
833
- }
834
- function traceTable(records, options) {
835
- var stringify = (data, humanizers, index) => {
836
- var _a
837
- return humanizers && humanizers[index]
838
- ? humanizers[index](data).toString()
839
- : (_a = data === null || data === void 0 ? void 0 : data.toString()) !==
840
- null && _a !== void 0
841
- ? _a
842
- : ""
843
- }
844
- var max = (a, b) => (a > b ? a : b)
845
- var reduceMax = (numbers) =>
846
- numbers.reduce((curr, prev) => (prev > curr ? prev : curr), 0)
847
- if (!options) options = {}
848
- var indent =
849
- (options === null || options === void 0 ? void 0 : options.indent) || ""
850
- var numColumns = reduceMax(
851
- records.map(
852
- (record) =>
853
- (record === null || record === void 0 ? void 0 : record.length) || 1,
854
- ),
855
- )
856
- var maxColumnWidth =
857
- (options === null || options === void 0
858
- ? void 0
859
- : options.maxColumnWidth) || 80
860
- var table = transpose(records, numColumns)
861
- options.widths =
862
- (options === null || options === void 0 ? void 0 : options.widths) ||
863
- table.map((column, index) => {
864
- var maxWidth = reduceMax(
865
- column.map(
866
- (field) =>
867
- colorstrip(
868
- stringify(
869
- field,
870
- options === null || options === void 0
871
- ? void 0
872
- : options.humanizers,
873
- index,
874
- ),
875
- ).length,
876
- ),
877
- )
878
- if (
879
- (options === null || options === void 0 ? void 0 : options.headlines) &&
880
- options.headlines[index]
881
- ) {
882
- maxWidth = max(
883
- maxWidth,
884
- colorstrip(options.headlines[index].replaceAll(":", "")).length,
885
- )
886
- }
887
- return Math.min(maxWidth, maxColumnWidth)
888
- })
889
- var headline = options.widths.map((maxWidth) => "─".repeat(maxWidth))
890
- console.info(
891
- ""
892
- .concat(indent, "\u250C\u2500")
893
- .concat(headline.join("─┬─"), "\u2500\u2510"),
894
- )
895
- if (options === null || options === void 0 ? void 0 : options.headlines) {
896
- headline = options.widths.map((maxWidth, index) => {
897
- var caption = options.headlines[index].replaceAll(":", "")
898
- var captionLength = colorstrip(caption).length
899
- return ""
900
- .concat(white(caption))
901
- .concat(" ".repeat(maxWidth - captionLength))
902
- })
903
- console.info(
904
- "".concat(indent, "\u2502 ").concat(headline.join(" │ "), " \u2502"),
905
- )
906
- headline = options.widths.map((maxWidth) => "─".repeat(maxWidth))
907
- console.info(
908
- ""
909
- .concat(indent, "\u251C\u2500")
910
- .concat(headline.join("─┼─"), "\u2500\u2524"),
911
- )
912
- }
913
- for (var i = 0; i < records.length; i++) {
914
- var line = ""
915
- for (var j = 0; j < numColumns; j++) {
916
- var data = table[j][i]
917
- var color = void 0
918
- if (
919
- (options === null || options === void 0 ? void 0 : options.colors) &&
920
- options.colors[j]
921
- ) {
922
- color = options.colors[j]
923
- } else {
924
- color =
925
- typeof data === "string"
926
- ? green
927
- : Number(data) === data && data % 1 !== 0 // is float number?
928
- ? yellow
929
- : (x) => x
930
- }
931
- data = stringify(
932
- data,
933
- options === null || options === void 0 ? void 0 : options.humanizers,
934
- j,
935
- )
936
- if (colorstrip(data).length > maxColumnWidth) {
937
- while (colorstrip(data).length > maxColumnWidth - 3) {
938
- data = data.slice(0, -1)
939
- }
940
- data += "..."
941
- }
942
- var dataLength = colorstrip(data).length
943
- if (
944
- (options === null || options === void 0 ? void 0 : options.headlines) &&
945
- options.headlines[j][0] === ":"
946
- ) {
947
- data = ""
948
- .concat(color(data))
949
- .concat(" ".repeat(options.widths[j] - dataLength))
950
- } else {
951
- data = ""
952
- .concat(" ".repeat(options.widths[j] - dataLength))
953
- .concat(color(data))
954
- }
955
- line += "\u2502 ".concat(data, " ")
956
- }
957
- console.info("".concat(indent).concat(line, "\u2502"))
958
- }
959
- headline = options.widths.map((maxWidth) => "─".repeat(maxWidth))
960
- console.info(
961
- ""
962
- .concat(indent, "\u2514\u2500")
963
- .concat(headline.join("─┴─"), "\u2500\u2518"),
964
- )
965
- }
966
- function transpose(records, numColumns) {
967
- var columns = []
968
- var _loop_1 = (index) => {
969
- columns.push(records.map((row) => row[index]))
970
- }
971
- for (var index = 0; index < numColumns; index++) {
972
- _loop_1(index)
973
- }
974
- return columns
975
- }
976
- module.exports = {
977
- colors: {
978
- cyan: cyan,
979
- gray: gray,
980
- green: green,
981
- magenta: magenta,
982
- red: red,
983
- white: white,
984
- yellow: yellow,
985
- normal: normal,
986
- lcyan: lcyan,
987
- lgray: lgray,
988
- lgreen: lgreen,
989
- lmagenta: lmagenta,
990
- lyellow: lyellow,
991
- mcyan: mcyan,
992
- mgreen: mgreen,
993
- mmagenta: mmagenta,
994
- mred: mred,
995
- myellow: myellow,
996
- },
997
- colorstrip: colorstrip,
998
- commas: commas,
999
- whole_wits: whole_wits,
1000
- toFixedTrunc: toFixedTrunc,
1001
- fromNanowits: fromNanowits,
1002
- countLeaves: countLeaves,
1003
- deleteExtraFlags: deleteExtraFlags,
1004
- extractFromArgs: extractFromArgs,
1005
- fromHexString: fromHexString,
1006
- isHexString: isHexString,
1007
- isHexStringOfLength: isHexStringOfLength,
1008
- toHexString: toHexString,
1009
- parseURL: parseURL,
1010
- ipIsPrivateOrLocalhost: ipIsPrivateOrLocalhost,
1011
- showUsage: showUsage,
1012
- showUsageError: showUsageError,
1013
- showUsageSubcommand: showUsageSubcommand,
1014
- showVersion: showVersion,
1015
- toolkitRun: toolkitRun,
1016
- toUpperCamelCase: toUpperCamelCase,
1017
- toUtf8Array: toUtf8Array,
1018
- utf8ArrayToStr: utf8ArrayToStr,
1019
- prompt: prompt,
1020
- prompter: prompter,
1021
- traceChecklists: traceChecklists,
1022
- traceHeader: traceHeader,
1023
- traceTable: traceTable,
1024
- wildcards: {
1025
- isWildcard: isWildcard,
1026
- getWildcardsCountFromString: getWildcardsCountFromString,
1027
- replaceWildcards: replaceWildcards,
1028
- spliceWildcard: spliceWildcard,
1029
- },
1030
- }
1031
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvaGVscGVycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFRLElBQUEsSUFBSSxHQUFLLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBN0IsQ0FBOEI7QUFDMUMsSUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzFCLElBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUVwQyxJQUFNLFVBQVUsR0FBRyxVQUFDLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxPQUFPLENBQy9CLDZFQUE2RSxFQUFFLEVBQUUsQ0FDeEYsRUFGMkIsQ0FFM0IsQ0FBQztBQUVGLElBQU0sTUFBTSxHQUFHLFVBQUMsTUFBTTtJQUNsQixLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQyxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUM7UUFDNUIsQ0FBQyxDQUFDLFVBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBRTtRQUNyRCxDQUFDLENBQUMsVUFBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxjQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFBO0lBQ3JFLE9BQU8sTUFBTSxDQUFBO0FBQ2pCLENBQUMsQ0FBQztBQUVGLElBQU0sWUFBWSxHQUFHLFVBQUMsQ0FBQyxJQUFLLE9BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsU0FBQSxFQUFFLEVBQUksQ0FBQyxDQUFBLENBQUMsRUFBdkIsQ0FBdUIsQ0FBQTtBQUVuRCxTQUFTLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0QixJQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkIsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLFVBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7SUFDcEQsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxDQUFDLElBQUksR0FBRyxDQUFDO0lBQzlCLE9BQU8sVUFBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQUksQ0FBQyxDQUFFLENBQUE7QUFDekIsQ0FBQztBQUFBLENBQUM7QUFFRixJQUFNLFVBQVUsR0FBRyxVQUFDLE1BQU0sRUFBRSxNQUFNO0lBQzlCLElBQU0sTUFBTSxHQUFHO1FBQ1gsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7UUFDOUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7UUFDaEMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7UUFDaEMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7UUFDaEMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7UUFDakMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7S0FDcEMsQ0FBQztJQUNGLElBQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFDO0lBQ3ZDLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO0lBQzNELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUMsdUJBQXVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztBQUM3SCxDQUFDLENBQUM7QUFFRixJQUFNLEtBQUssR0FBRyxVQUFDLEdBQUcsSUFBSyxPQUFBLHNCQUFhLEdBQUcsY0FBUyxFQUF6QixDQUF5QixDQUFBO0FBQ2hELElBQU0sS0FBSyxHQUFHLFVBQUMsR0FBRyxJQUFLLE9BQUEsc0JBQWEsR0FBRyxjQUFTLEVBQXpCLENBQXlCLENBQUE7QUFDaEQsSUFBTSxNQUFNLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxzQkFBYSxHQUFHLGNBQVMsRUFBekIsQ0FBeUIsQ0FBQTtBQUNqRCxJQUFNLFFBQVEsR0FBRyxVQUFDLEdBQUcsSUFBSyxPQUFBLHNCQUFhLEdBQUcsY0FBUyxFQUF6QixDQUF5QixDQUFBO0FBQ25ELElBQU0sT0FBTyxHQUFHLFVBQUMsR0FBRyxJQUFLLE9BQUEsc0JBQWEsR0FBRyxjQUFTLEVBQXpCLENBQXlCLENBQUE7QUFDbEQsSUFBTSxLQUFLLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxvQkFBVyxHQUFHLGNBQVMsRUFBdkIsQ0FBdUIsQ0FBQTtBQUM5QyxJQUFNLE1BQU0sR0FBRyxVQUFDLEdBQUcsSUFBSyxPQUFBLG9CQUFXLEdBQUcsY0FBUyxFQUF2QixDQUF1QixDQUFBO0FBQy9DLElBQU0sUUFBUSxHQUFHLFVBQUMsR0FBRyxJQUFLLE9BQUEsb0JBQVcsR0FBRyxjQUFTLEVBQXZCLENBQXVCLENBQUE7QUFDakQsSUFBTSxJQUFJLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxvQkFBVyxHQUFHLGNBQVMsRUFBdkIsQ0FBdUIsQ0FBQTtBQUM3QyxJQUFNLE9BQU8sR0FBRyxVQUFDLEdBQUcsSUFBSyxPQUFBLG9CQUFXLEdBQUcsY0FBUyxFQUF2QixDQUF1QixDQUFBO0FBQ2hELElBQU0sSUFBSSxHQUFHLFVBQUMsR0FBRyxJQUFLLE9BQUEsb0JBQVcsR0FBRyxjQUFTLEVBQXZCLENBQXVCLENBQUE7QUFDN0MsSUFBTSxJQUFJLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxvQkFBVyxHQUFHLGNBQVMsRUFBdkIsQ0FBdUIsQ0FBQTtBQUM3QyxJQUFNLEtBQUssR0FBRyxVQUFDLEdBQUcsSUFBSyxPQUFBLG9CQUFXLEdBQUcsY0FBUyxFQUF2QixDQUF1QixDQUFBO0FBQzlDLElBQU0sT0FBTyxHQUFHLFVBQUMsR0FBRyxJQUFLLE9BQUEsb0JBQVcsR0FBRyxjQUFTLEVBQXZCLENBQXVCLENBQUE7QUFDaEQsSUFBTSxNQUFNLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxvQkFBVyxHQUFHLGNBQVMsRUFBdkIsQ0FBdUIsQ0FBQTtBQUMvQyxJQUFNLEdBQUcsR0FBRyxVQUFDLEdBQUcsSUFBSyxPQUFBLG9CQUFXLEdBQUcsY0FBUyxFQUF2QixDQUF1QixDQUFBO0FBQzVDLElBQU0sS0FBSyxHQUFHLFVBQUMsR0FBRyxJQUFLLE9BQUEsc0JBQWEsR0FBRyxjQUFTLEVBQXpCLENBQXlCLENBQUE7QUFDaEQsSUFBTSxNQUFNLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxvQkFBVyxHQUFHLGNBQVMsRUFBdkIsQ0FBdUIsQ0FBQTtBQUUvQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUUsR0FBRztJQUN2QixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLElBQUksR0FBRyxZQUFZLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLElBQUksSUFBSyxPQUFBLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUExQixDQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFBOztRQUNsRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLElBQUksSUFBSyxPQUFBLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUExQixDQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLElBQUk7SUFDMUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFyQixDQUFxQixDQUFDLENBQUE7QUFDcEQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLO0lBQ2hDLElBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLElBQUk7WUFDM0IsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFLLElBQUksQ0FBRSxDQUFDLENBQUE7WUFDM0MsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO29CQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUMvRCxNQUFNLDJDQUFvQyxJQUFJLENBQUUsQ0FBQTtvQkFDcEQsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFBO3dCQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQTtvQkFDN0IsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQTtvQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQzdCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBQ0QsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQTtBQUMzQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsU0FBUztJQUM1QixJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQUUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDOUQsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBbEIsQ0FBa0IsQ0FBQyxDQUFDLENBQUE7QUFDeEYsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsRUFBRTtJQUM5QixJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVM7UUFDaEMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekIsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakIsa0JBQWtCO1FBQ2xCLElBQUksRUFBRSxLQUFLLFdBQVc7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFFaEIseUlBQXlJO1FBQ3pJLE9BQU8sMEJBQTBCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLDZDQUE2QyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDakosQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLEVBQUosQ0FBSSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7SUFFNUUsa0NBQWtDO0lBQ2xDLElBQUksRUFBRSxLQUFLLEtBQUs7UUFDWixPQUFPLElBQUksQ0FBQztJQUVoQix3RkFBd0Y7U0FDbkYsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3JDLE9BQU8sSUFBSSxDQUFDO0lBRWhCLDJFQUEyRTtJQUMzRSxxQkFBcUI7U0FDaEIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQztJQUVoQixxQkFBcUI7U0FDaEIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQztJQUVoQiw2REFBNkQ7U0FDeEQsSUFBSSxTQUFTLEtBQUssTUFBTTtRQUN6QixPQUFPLElBQUksQ0FBQztJQUVoQixpQkFBaUI7U0FDWixJQUFJLFNBQVMsS0FBSyxLQUFLO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBRWhCLHlEQUF5RDtJQUN6RCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsTUFBTTtJQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztXQUNqQixDQUNDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2VBQ3hELEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxHQUFHLENBQUMsQ0FDL0IsQ0FDSixDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEdBQUc7SUFDcEIsT0FBTyxDQUNILE9BQU8sR0FBRyxLQUFLLFFBQVE7V0FDcEIsQ0FDQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztlQUMzRCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ2pDLENBQ0osQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQWpDLENBQWlDLENBQUM7U0FDakYsSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUNSLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztTQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDakIsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEdBQUc7SUFDakIsSUFBSSxDQUFDO1FBQ0QsSUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDOUIsT0FBTztZQUNILFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSTtZQUN6QixTQUFTLENBQUMsSUFBSTtZQUNkLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzQixTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDNUIsQ0FBQTtJQUNMLENBQUM7SUFBQyxXQUFNLENBQUM7UUFDTCxNQUFNLElBQUksU0FBUyxDQUFDLG9DQUE2QixHQUFHLENBQUUsQ0FBQyxDQUFBO0lBQzNELENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU07SUFDMUIsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdEIsSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSztRQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDL0MsSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTTtRQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEQsSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTTtRQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDdEQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE1BQU07SUFDM0IsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzlCLElBQU0sV0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLE9BQVIsSUFBSSwyQkFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBSztnQkFBTCxLQUFBLGFBQUssRUFBSixHQUFHLFFBQUE7WUFBTSxPQUFBLEdBQUcsQ0FBQyxNQUFNO1FBQVYsQ0FBVSxDQUFDLFVBQUMsQ0FBQTtRQUM5RCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztZQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUYsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUs7O0lBQzlDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQy9DLElBQUksS0FBSyxFQUFFLENBQUM7UUFDUixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxNQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxLQUFLLDBDQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUksS0FBSyxDQUFDLENBQUE7SUFDeEQsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxNQUFNO0lBQzNCLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQy9CLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3pCLElBQU0sVUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLE9BQVIsSUFBSSwyQkFBUSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBTztnQkFBUCxLQUFBLGFBQU8sRUFBTixLQUFLLFFBQUE7WUFBTSxPQUFBLEtBQUssQ0FBQyxNQUFNO1FBQVosQ0FBWSxDQUFDLFVBQUMsQ0FBQTtRQUNuRSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQUMsRUFBYTtnQkFBYixLQUFBLGFBQWEsRUFBWixLQUFLLFFBQUEsRUFBRSxJQUFJLFFBQUE7WUFDeEIsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9ELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBRSxFQUFFLDJCQUFtQixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFHLENBQUMsQ0FBQTtZQUNqSixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFFLEVBQUUsV0FBSSxJQUFJLENBQUUsQ0FBQyxDQUFBO1lBQzFHLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBSztJQUN6QixLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4QixJQUFNLFdBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFSLElBQUksMkJBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFDLEVBQWdCO2dCQUFoQixLQUFBLGFBQWdCLEVBQWYsR0FBRyxRQUFBLEVBQUksS0FBSyxjQUFBO1lBQVEsT0FBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1FBQWxELENBQWtELENBQUMsVUFBQyxDQUFBO1FBQ2xILEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO1lBQ2QsSUFBTSxHQUFHLEdBQUcsVUFBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFBO1lBQzNFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQUssR0FBRyxTQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkcsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNOztJQUMxQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RCLElBQUksTUFBTSxFQUFFLENBQUM7UUFDVCxJQUFJLE1BQU0sR0FBRyxNQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBDQUFFLE1BQU0sQ0FBQTtRQUMxQyxJQUFNLE9BQU8sR0FBRyxNQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBDQUFFLE9BQU8sQ0FBQTtRQUM5QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsSUFBTSxhQUFXLEdBQUcsVUFBQyxHQUFHLElBQUssT0FBQSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDakYsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFJLENBQUMsQ0FBQyxDQUFDLFdBQUksR0FBRyxNQUFHLENBQzFELEVBRjRCLENBRTVCLENBQUE7WUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxhQUFXLENBQUMsS0FBSyxDQUFDLEVBQWxCLENBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFBO1lBQ3BFLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLEdBQUcsYUFBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2hDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFNLEtBQUssQ0FBQyxxQkFBYyxHQUFHLENBQUUsQ0FBQyxzQkFBWSxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQUcsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBQyxDQUFBO1FBQzlLLElBQUksTUFBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQywwQ0FBRSxJQUFJLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7WUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFFLENBQUMsQ0FBQTtRQUNwRCxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLENBQUMsSUFBSSxDQUFDLGFBQU0sS0FBSyxDQUFDLHFCQUFjLEdBQUcsQ0FBRSxDQUFDLHdDQUFxQyxDQUFDLENBQUE7SUFDdkYsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE9BQU87SUFDN0IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDakMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDMUIsSUFBTSxXQUFTLEdBQUcsT0FBTzthQUNwQixHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBbEYsQ0FBa0YsQ0FBQzthQUNqRyxNQUFNLENBQUMsVUFBQyxJQUFJLEVBQUUsSUFBSSxJQUFLLE9BQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQXpCLENBQXlCLENBQUMsQ0FBQztRQUN2RCxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTTtZQUNsQixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakIsSUFBTSxHQUFHLEdBQUcsVUFBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFBO2dCQUNqRixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFLLEdBQUcsU0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3pHLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU07O0lBQzVDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDdEMsSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSztRQUFFLGNBQWMsQ0FBQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFDLENBQUE7SUFDaEQsSUFBSSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLENBQUMsTUFBTSxDQUFDLDBDQUFFLE9BQU87UUFBRSxnQkFBZ0IsQ0FBQyxNQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLDBDQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3JGLElBQUksTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE1BQU07UUFBRSxlQUFlLENBQUMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ3ZELENBQUM7QUFFRCxTQUFTLFdBQVc7SUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFHLEtBQUssQ0FBQyxrQ0FBMkIsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsT0FBTyxDQUFFLENBQUMsQ0FBRSxDQUFDLENBQUE7QUFDaEcsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQUMsR0FBRztJQUNwQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUE7SUFDcEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNOLElBQUksS0FBSyxTQUFBLENBQUE7UUFDVCxJQUFNLE1BQU0sR0FBRyxTQUFTLENBQUE7UUFDeEIsT0FBTyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDekMsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QyxJQUFJLFNBQVMsR0FBRyxZQUFZO2dCQUFFLFlBQVksR0FBRyxTQUFTLENBQUE7UUFDMUQsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQTtBQUN2QixDQUFDO0FBR0QsU0FBUyxVQUFVLENBQUMsR0FBRztJQUNuQixPQUFPLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDakQsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLElBQUk7SUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUU7UUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN4RCxJQUFNLFFBQVEsR0FBRyxZQUFLLFFBQVEsT0FBSSxDQUFBO1lBQ2xDLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUNsRCxDQUFDO0lBQ0wsQ0FBQztTQUFNLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNwRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztZQUMvQixDQUFDLENBQUMsS0FBSyxFQUZZLENBRVosQ0FDVixDQUFBO0lBQ0wsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVM7SUFDdEQsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBTSxRQUFRLEdBQUcsWUFBSyxRQUFRLE9BQUksQ0FBQTtRQUNsQyxHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFLLENBQUMsT0FBSSxFQUFFLFlBQUssQ0FBQyxHQUFHLENBQUMsT0FBSSxDQUFDLENBQUE7UUFDcEQsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDcEUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUM7WUFDdEQsQ0FBQyxDQUFDLEtBQUssRUFGWSxDQUVaLENBQ1YsQ0FBQTtJQUNMLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFlLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSTs7OztZQUM5QixHQUFHLEdBQUcsVUFBRyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQWMsY0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFFLENBQUE7WUFDaEUsc0JBQU8sSUFBSSxPQUFPLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtvQkFDL0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLFVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNO3dCQUM3RCxJQUFJLEtBQUssRUFBRSxDQUFDOzRCQUNSLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTt3QkFDakIsQ0FBQzt3QkFDRCxJQUFJLE1BQU0sRUFBRSxDQUFDOzRCQUNULE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTt3QkFDbEIsQ0FBQzt3QkFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7b0JBQ25CLENBQUMsQ0FBQyxDQUFBO2dCQUNOLENBQUMsQ0FBQyxFQUFBOzs7Q0FDTDtBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBRztJQUN6QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUsS0FBSyxFQUFFLE9BQU87UUFDbEQsT0FBTyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsR0FBRztJQUNwQixJQUFNLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxJQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksUUFBUSxHQUFHLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3BDLElBQUksUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUM1QixJQUFJLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDO2FBQ0ksSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLFFBQVEsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsRUFDN0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQy9CLElBQUksR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxpQkFBaUI7YUFDWixDQUFDO1lBQ0YsQ0FBQyxFQUFFLENBQUM7WUFDSixxQ0FBcUM7WUFDckMsd0NBQXdDO1lBQ3hDLHlDQUF5QztZQUN6QyxRQUFRLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7a0JBQzFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxFQUM3QixJQUFJLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFDaEMsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQy9CLElBQUksR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEtBQUs7SUFDekIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbkIsSUFBSSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBRWpCLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDVCxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNuQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ04sT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQyxDQUFDO1lBQUMsS0FBSyxDQUFDLENBQUM7WUFBQyxLQUFLLENBQUMsQ0FBQztZQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsS0FBSyxDQUFDLENBQUM7WUFBQyxLQUFLLENBQUMsQ0FBQztZQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsS0FBSyxDQUFDO2dCQUMxRCxXQUFXO2dCQUNYLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixNQUFNO1lBQ1YsS0FBSyxFQUFFLENBQUM7WUFBQyxLQUFLLEVBQUU7Z0JBQ1osd0JBQXdCO2dCQUN4QixLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsTUFBTTtZQUNWLEtBQUssRUFBRTtnQkFDSCxrQ0FBa0M7Z0JBQ2xDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQixHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDekMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsTUFBTTtRQUNkLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBZSxNQUFNLENBQUUsUUFBUTs7OztZQUNyQixpQkFBaUIsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO2dCQUMvQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTthQUN6QixDQUFDLENBQUE7WUFDRixzQkFBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMxQixpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBRyxRQUFRLE1BQUcsRUFBRSxVQUFDLFFBQVE7d0JBQ2hELGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFBO3dCQUN6QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7b0JBQzVCLENBQUMsQ0FBQyxDQUFBO2dCQUNOLENBQUMsQ0FBQyxFQUFBOzs7Q0FDTDtBQUVELFNBQWUsUUFBUSxDQUFDLE9BQU87Ozs7WUFDckIsT0FBTyxHQUFHLENBQUM7Z0JBQ2IsSUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLE9BQU8sV0FBVyxDQUFDO29CQUNmLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFHLENBQUMsQ0FBQTtvQkFDcEMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNMLHNCQUFPLE9BQU87cUJBQ1QsSUFBSSxDQUFDLFVBQUEsTUFBTTtvQkFDUixhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO29CQUM1QixPQUFPLE1BQU0sQ0FBQTtnQkFDakIsQ0FBQyxDQUFDLEVBQUE7OztDQUNUO0FBRUQsU0FBUyxlQUFlLENBQUMsVUFBVTtJQUMvQixJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxJQUFNLFNBQVMsa0JBQUksT0FBTyxVQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsV0FBSSxHQUFHLENBQUUsRUFBVCxDQUFTLENBQUMsU0FBRyxDQUFBO1FBQy9FLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3RDLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUc7WUFDeEIsSUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFBLFNBQVMsSUFBSSxPQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxLQUFLLEVBQS9CLENBQStCLENBQUMsQ0FBQyxNQUFNLENBQUE7WUFDckY7Z0JBQ0ksTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztzQkFDL0UsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFBLFNBQVMsSUFBSSxPQUFBLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxLQUFLO2dCQUMxRCxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFGN0IsQ0FFNkIsQ0FDM0QsVUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLE9BQU8sRUFBRTtZQUNoQixTQUFTLFdBQUE7WUFDVCxjQUFjLEVBQUUsRUFBRTtTQUNyQixDQUFDLENBQUE7SUFDTixDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFjLEVBQUUsTUFBVztJQUEzQixzQkFBQSxFQUFBLGNBQWM7SUFBRSx1QkFBQSxFQUFBLFdBQVc7SUFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFHLE1BQU0seUJBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGlCQUFJLENBQUMsQ0FBQTtJQUMzRCxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQUcsTUFBTSxvQkFBSyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQUksQ0FBQyxDQUFBO0lBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBRyxNQUFNLHlCQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxpQkFBSSxDQUFDLENBQUE7QUFDL0QsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPO0lBQ2hDLElBQU0sU0FBUyxHQUFHLFVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLFlBQUssT0FBQSxVQUFVLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFFBQVEsRUFBRSxtQ0FBSSxFQUFFLENBQUEsRUFBQSxDQUFBO0lBQzVJLElBQU0sR0FBRyxHQUFHLFVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFiLENBQWEsQ0FBQTtJQUNuQyxJQUFNLFNBQVMsR0FBRyxVQUFDLE9BQU8sSUFBSyxPQUFBLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxJQUFJLEVBQUUsSUFBSSxJQUFLLE9BQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQXpCLENBQXlCLEVBQUUsQ0FBQyxDQUFDLEVBQTVELENBQTRELENBQUE7SUFDM0YsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBQzFCLElBQU0sTUFBTSxHQUFHLENBQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU0sS0FBSSxFQUFFLENBQUE7SUFDcEMsSUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLEtBQUksQ0FBQyxFQUFuQixDQUFtQixDQUFDLENBQUMsQ0FBQTtJQUN4RSxJQUFNLGNBQWMsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxjQUFjLEtBQUksRUFBRSxDQUFBO0lBQ3BELElBQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUE7SUFDNUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLEtBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQU0sRUFBRSxLQUFLO1FBQ3hELElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBL0QsQ0FBK0QsQ0FBQyxDQUFDLENBQUE7UUFDOUcsSUFBSSxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxTQUFTLEtBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pELFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM3RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQTtJQUM3QyxDQUFDLENBQUMsQ0FBQTtJQUNGLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQUEsUUFBUSxJQUFJLE9BQUEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFBO0lBQ25FLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBRyxNQUFNLHlCQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFJLENBQUMsQ0FBQTtJQUNwRCxJQUFJLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxTQUFTLEVBQUUsQ0FBQztRQUNyQixRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQyxRQUFRLEVBQUUsS0FBSztZQUMxQyxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDNUQsSUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQTtZQUNoRCxPQUFPLFVBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFFLENBQUE7UUFDckUsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQUcsTUFBTSxvQkFBSyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFJLENBQUMsQ0FBQTtRQUNwRCxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFwQixDQUFvQixDQUFDLENBQUE7UUFDL0QsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFHLE1BQU0seUJBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQUksQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFHLEVBQUUsQ0FBQztZQUNuQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdEIsSUFBSSxLQUFLLFNBQUEsQ0FBQTtZQUNULElBQUksQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxLQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssR0FBRyxPQUFPLElBQUksS0FBSyxRQUFRO29CQUM5QixDQUFDLENBQUMsS0FBSztvQkFDUCxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLG1CQUFtQjt3QkFDMUQsQ0FBQyxDQUFDLE1BQU07d0JBQ1IsQ0FBQyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxFQUFELENBQUMsQ0FDYixDQUFBO1lBQ0wsQ0FBQztZQUNELElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDOUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLGNBQWMsRUFBRSxDQUFDO2dCQUMzQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNsRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDNUIsQ0FBQztnQkFDRCxJQUFJLElBQUksS0FBSyxDQUFBO1lBQ2pCLENBQUM7WUFDRCxJQUFJLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFBO1lBQ3hDLElBQUksQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsU0FBUyxLQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3hELElBQUksR0FBRyxVQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUUsQ0FBQTtZQUN4RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxHQUFHLFVBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBRSxDQUFBO1lBQ3hFLENBQUM7WUFDRCxJQUFJLElBQUksaUJBQUssSUFBSSxNQUFHLENBQUE7UUFDeEIsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBRyxNQUFNLFNBQUcsSUFBSSxXQUFHLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBQ0QsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQUEsUUFBUSxJQUFJLE9BQUEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFBO0lBQy9ELE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBRyxNQUFNLHlCQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFJLENBQUMsQ0FBQTtBQUN4RCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVU7SUFDbEMsSUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBOzRCQUNULEtBQUs7UUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQVYsQ0FBVSxDQUFDLENBQUMsQ0FBQTs7SUFEaEQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsRUFBRSxLQUFLLEVBQUc7Z0JBQXZDLEtBQUs7S0FFYjtJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHO0lBQ2IsTUFBTSxFQUFFO1FBQ0osSUFBSSxNQUFBO1FBQUUsSUFBSSxNQUFBO1FBQUUsS0FBSyxPQUFBO1FBQUUsT0FBTyxTQUFBO1FBQUUsR0FBRyxLQUFBO1FBQUUsS0FBSyxPQUFBO1FBQUUsTUFBTSxRQUFBO1FBQUUsTUFBTSxRQUFBO1FBQ3RELEtBQUssT0FBQTtRQUFFLEtBQUssT0FBQTtRQUFFLE1BQU0sUUFBQTtRQUFFLFFBQVEsVUFBQTtRQUFFLE9BQU8sU0FBQTtRQUN2QyxLQUFLLE9BQUE7UUFBRSxNQUFNLFFBQUE7UUFBRSxRQUFRLFVBQUE7UUFBRSxJQUFJLE1BQUE7UUFBRSxPQUFPLFNBQUE7S0FDekM7SUFDRCxVQUFVLFlBQUE7SUFBRSxNQUFNLFFBQUE7SUFBRSxVQUFVLFlBQUE7SUFBRSxZQUFZLGNBQUE7SUFBRSxZQUFZLGNBQUE7SUFDMUQsV0FBVyxhQUFBO0lBQ1gsZ0JBQWdCLGtCQUFBO0lBQUUsZUFBZSxpQkFBQTtJQUNqQyxhQUFhLGVBQUE7SUFBRSxXQUFXLGFBQUE7SUFBRSxtQkFBbUIscUJBQUE7SUFBRSxXQUFXLGFBQUE7SUFDNUQsUUFBUSxVQUFBO0lBQUUsc0JBQXNCLHdCQUFBO0lBQ2hDLFNBQVMsV0FBQTtJQUFFLGNBQWMsZ0JBQUE7SUFBRSxtQkFBbUIscUJBQUE7SUFBRSxXQUFXLGFBQUE7SUFDM0QsVUFBVSxZQUFBO0lBQ1YsZ0JBQWdCLGtCQUFBO0lBQUUsV0FBVyxhQUFBO0lBQUUsY0FBYyxnQkFBQTtJQUM3QyxNQUFNLFFBQUE7SUFBRSxRQUFRLFVBQUE7SUFDaEIsZUFBZSxpQkFBQTtJQUFFLFdBQVcsYUFBQTtJQUFFLFVBQVUsWUFBQTtJQUN4QyxTQUFTLEVBQUU7UUFDUCxVQUFVLFlBQUE7UUFDViwyQkFBMkIsNkJBQUE7UUFDM0IsZ0JBQWdCLGtCQUFBO1FBQ2hCLGNBQWMsZ0JBQUE7S0FDakI7Q0FDSixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgeyBleGVjIH0gPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcbmNvbnN0IG5ldCA9IHJlcXVpcmUoXCJuZXRcIilcbmNvbnN0IHJlYWRsaW5lID0gcmVxdWlyZSgncmVhZGxpbmUnKVxuXG5jb25zdCBjb2xvcnN0cmlwID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoXG4gICAgICAgIC9bXFx1MDAxYlxcdTAwOWJdW1soKSM7P10qKD86WzAtOV17MSw0fSg/OjtbMC05XXswLDR9KSopP1swLTlBLU9SWmNmLW5xcnk9PjxdL2csICcnXG4pO1xuXG5jb25zdCBjb21tYXMgPSAobnVtYmVyKSA9PiB7XG4gICAgcGFydHMgPSBudW1iZXIudG9TdHJpbmcoKS5zcGxpdCgnLicpXG4gICAgY29uc3QgcmVzdWx0ID0gcGFydHMubGVuZ3RoIDw9IDFcbiAgICAgICAgPyBgJHtwYXJ0c1swXS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCBcIixcIil9YFxuICAgICAgICA6IGAke3BhcnRzWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIFwiLFwiKX0uJHtwYXJ0c1sxXX1gXG4gICAgcmV0dXJuIHJlc3VsdCBcbn07XG5cbmNvbnN0IGZyb21OYW5vd2l0cyA9ICh4KSA9PiBNYXRoLmZsb29yKHggLyAxMCAqKiA5KVxuXG5mdW5jdGlvbiB0b0ZpeGVkVHJ1bmMoeCwgbikge1xuICAgIGNvbnN0IHYgPSAodHlwZW9mIHggPT09ICdzdHJpbmcnID8geCA6IHgudG9TdHJpbmcoKSkuc3BsaXQoJy4nKTtcbiAgICBpZiAobiA8PSAwKSByZXR1cm4gdlswXTtcbiAgICBsZXQgZiA9IHZbMV0gfHwgJyc7XG4gICAgaWYgKGYubGVuZ3RoID4gbikgcmV0dXJuIGAke3ZbMF19LiR7Zi5zdWJzdHIoMCxuKX1gO1xuICAgIHdoaWxlIChmLmxlbmd0aCA8IG4pIGYgKz0gJzAnO1xuICAgIHJldHVybiBgJHt2WzBdfS4ke2Z9YFxufTtcblxuY29uc3Qgd2hvbGVfd2l0cyA9IChudW1iZXIsIGRpZ2l0cykgPT4ge1xuICAgIGNvbnN0IGxvb2t1cCA9IFtcbiAgICAgICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcIiBuV2l0c1wiIH0sXG4gICAgICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcIiDOvFdpdHNcIiB9LFxuICAgICAgICB7IHZhbHVlOiAxZTYsIHN5bWJvbDogXCIgbVdpdHNcIiB9LFxuICAgICAgICB7IHZhbHVlOiAxZTksIHN5bWJvbDogXCIgIFdpdHNcIiB9LFxuICAgICAgICB7IHZhbHVlOiAxZTEyLCBzeW1ib2w6IFwiIEtXaXRzXCIgfSxcbiAgICAgICAgeyB2YWx1ZTogMWUxNSwgc3ltYm9sOiBcIiBNV2l0c1wiIH0sXG4gICAgXTtcbiAgICBjb25zdCByZWdleHAgPSAvXFwuMCskfCg/PD1cXC5bMC05XSkwKyQvO1xuICAgIGNvbnN0IGl0ZW0gPSBsb29rdXAuZmluZExhc3QoaXRlbSA9PiBudW1iZXIgPj0gaXRlbS52YWx1ZSk7XG4gICAgcmV0dXJuIGl0ZW0gPyB0b0ZpeGVkVHJ1bmMoY29tbWFzKG51bWJlciAvIGl0ZW0udmFsdWUpLCBkaWdpdHMpLi8qcmVwbGFjZShyZWdleHAsIFwiXCIpKi9jb25jYXQoaXRlbS5zeW1ib2wpIDogXCIobm8gV2l0cylcIjtcbn07XG5cbmNvbnN0IGxjeWFuID0gKHN0cikgPT4gYFxceDFiWzE7OTZtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBsZ3JheSA9IChzdHIpID0+IGBcXHgxYlsxOzkwbSR7c3RyfVxceDFiWzBtYFxuY29uc3QgbGdyZWVuID0gKHN0cikgPT4gYFxceDFiWzE7OTJtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBsbWFnZW50YSA9IChzdHIpID0+IGBcXHgxYlsxOzk1bSR7c3RyfVxceDFiWzBtYFxuY29uc3QgbHllbGxvdyA9IChzdHIpID0+IGBcXHgxYlsxOzkzbSR7c3RyfVxceDFiWzBtYFxuY29uc3QgbWN5YW4gPSAoc3RyKSA9PiBgXFx4MWJbOTZtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBtZ3JlZW4gPSAoc3RyKSA9PiBgXFx4MWJbOTJtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBtbWFnZW50YSA9IChzdHIpID0+IGBcXHgxYls5NW0ke3N0cn1cXHgxYlswbWBcbmNvbnN0IG1yZWQgPSAoc3RyKSA9PiBgXFx4MWJbOTFtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBteWVsbG93ID0gKHN0cikgPT4gYFxceDFiWzkzbSR7c3RyfVxceDFiWzBtYFxuY29uc3QgY3lhbiA9IChzdHIpID0+IGBcXHgxYlszNm0ke3N0cn1cXHgxYlswbWBcbmNvbnN0IGdyYXkgPSAoc3RyKSA9PiBgXFx4MWJbOTBtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBncmVlbiA9IChzdHIpID0+IGBcXHgxYlszMm0ke3N0cn1cXHgxYlswbWBcbmNvbnN0IG1hZ2VudGEgPSAoc3RyKSA9PiBgXFx4MWJbMzVtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCBub3JtYWwgPSAoc3RyKSA9PiBgXFx4MWJbOThtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCByZWQgPSAoc3RyKSA9PiBgXFx4MWJbMzFtJHtzdHJ9XFx4MWJbMG1gXG5jb25zdCB3aGl0ZSA9IChzdHIpID0+IGBcXHgxYlsxOzk4bSR7c3RyfVxceDFiWzBtYFxuY29uc3QgeWVsbG93ID0gKHN0cikgPT4gYFxceDFiWzMzbSR7c3RyfVxceDFiWzBtYFxuXG5mdW5jdGlvbiBjb3VudExlYXZlcyh0LCBvYmopIHtcbiAgICBpZiAoIW9iaikgcmV0dXJuIDA7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIHQpIHJldHVybiAxO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGNvdW50TGVhdmVzKHQsIGl0ZW0pLCAwKVxuICAgIGVsc2UgcmV0dXJuIE9iamVjdC52YWx1ZXMob2JqKS5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgY291bnRMZWF2ZXModCwgaXRlbSksIDApO1xufVxuXG5mdW5jdGlvbiBkZWxldGVFeHRyYUZsYWdzKGFyZ3MpIHtcbiAgICByZXR1cm4gYXJncy5maWx0ZXIoYXJnID0+ICFhcmcuc3RhcnRzV2l0aCgnLS0nKSlcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEZyb21BcmdzKGFyZ3MsIGZsYWdzKSB7XG4gICAgY29uc3QgY3VyYXRlZCA9IHt9XG4gICAgaWYgKGFyZ3MgJiYgZmxhZ3MpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MpLmZvckVhY2goZmxhZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBmbGFnSW5kZXggPSBhcmdzLmluZGV4T2YoYC0tJHtmbGFnfWApXG4gICAgICAgICAgICBpZiAoZmxhZ0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ3NbZmxhZ10ucGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyYXRlZFtmbGFnXSA9IGFyZ3NbZmxhZ0luZGV4XVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3NbZmxhZ0luZGV4ICsgMV0gfHwgYXJnc1tmbGFnSW5kZXggKyAxXS5zdGFydHNXaXRoKCctLScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgZm9yIC0tJHtmbGFnfWBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cmF0ZWRbZmxhZ10gPSBhcmdzW2ZsYWdJbmRleCArIDFdXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnNwbGljZShmbGFnSW5kZXgsIDIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJhdGVkW2ZsYWddID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnNwbGljZShmbGFnSW5kZXgsIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gW2FyZ3MsIGN1cmF0ZWQsXVxufVxuXG5mdW5jdGlvbiBmcm9tSGV4U3RyaW5nKGhleFN0cmluZykge1xuICAgIGlmIChoZXhTdHJpbmcuc3RhcnRzV2l0aChcIjB4XCIpKSBoZXhTdHJpbmcgPSBoZXhTdHJpbmcuc2xpY2UoMilcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGhleFN0cmluZy5tYXRjaCgvLnsxLDJ9L2cpLm1hcCgoYnl0ZSkgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKSlcbn1cblxuZnVuY3Rpb24gaXBJc1ByaXZhdGVPckxvY2FsaG9zdChpcCkge1xuICAgIGlmIChpcC5zdWJzdHJpbmcoMCwgNykgPT09IFwiOjpmZmZmOlwiKVxuICAgICAgICBpcCA9IGlwLnN1YnN0cmluZyg3KTtcblxuICAgIGlmIChuZXQuaXNJUHY0KGlwKSkge1xuICAgICAgICAvLyBjaGVjayBsb2NhbGhvc3RcbiAgICAgICAgaWYgKGlwID09PSAnMTI3LjAuMC4xJylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vICAgICAgICAgMTAuMC4wLjAgLSAxMC4yNTUuMjU1LjI1NSAgICAgICAgfHwgICAxNzIuMTYuMC4wIC0gMTcyLjMxLjI1NS4yNTUgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgIDE5Mi4xNjguMC4wIC0gMTkyLjE2OC4yNTUuMjU1XG4gICAgICAgIHJldHVybiAvXigxMClcXC4oLiopXFwuKC4qKVxcLiguKikkLy50ZXN0KGlwKSB8fCAvXigxNzIpXFwuKDFbNi05XXwyWzAtOV18M1swLTFdKVxcLiguKilcXC4oLiopJC8udGVzdChpcCkgfHwgL14oMTkyKVxcLigxNjgpXFwuKC4qKVxcLiguKikkLy50ZXN0KGlwKVxuICAgIH1cblxuICAgIC8vIGVsc2U6IGlwIGlzIElQdjZcbiAgICBjb25zdCBmaXJzdFdvcmQgPSBpcC5zcGxpdChcIjpcIikuZmluZChlbCA9PiAhIWVsKTsgLy9nZXQgZmlyc3Qgbm90IGVtcHR5IHdvcmRcblxuICAgIC8vIGVxdWl2YWxlbnQgb2YgMTI3LjAuMC4xIGluIElQdjZcbiAgICBpZiAoaXAgPT09IFwiOjoxXCIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgLy8gVGhlIG9yaWdpbmFsIElQdjYgU2l0ZSBMb2NhbCBhZGRyZXNzZXMgKGZlYzA6Oi8xMCkgYXJlIGRlcHJlY2F0ZWQuIFJhbmdlOiBmZWMwIC0gZmVmZlxuICAgIGVsc2UgaWYgKC9eZmVbYy1mXVswLWZdJC8udGVzdChmaXJzdFdvcmQpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFRoZXNlIGRheXMgVW5pcXVlIExvY2FsIEFkZHJlc3NlcyAoVUxBKSBhcmUgdXNlZCBpbiBwbGFjZSBvZiBTaXRlIExvY2FsLlxuICAgIC8vIFJhbmdlOiBmYzAwIC0gZmNmZlxuICAgIGVsc2UgaWYgKC9eZmNbMC1mXXsyfSQvLnRlc3QoZmlyc3RXb3JkKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBSYW5nZTogZmQwMCAtIGZjZmZcbiAgICBlbHNlIGlmICgvXmZkWzAtZl17Mn0kLy50ZXN0KGZpcnN0V29yZCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgLy8gTGluayBsb2NhbCBhZGRyZXNzZXMgKHByZWZpeGVkIHdpdGggZmU4MCkgYXJlIG5vdCByb3V0YWJsZVxuICAgIGVsc2UgaWYgKGZpcnN0V29yZCA9PT0gXCJmZTgwXCIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgLy8gRGlzY2FyZCBQcmVmaXhcbiAgICBlbHNlIGlmIChmaXJzdFdvcmQgPT09IFwiMTAwXCIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgLy8gQW55IG90aGVyIElQIGFkZHJlc3MgaXMgbm90IFVuaXF1ZSBMb2NhbCBBZGRyZXNzIChVTEEpXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0hleFN0cmluZ09mTGVuZ3RoKHN0ciwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIChpc0hleFN0cmluZyhzdHIpXG4gICAgICAgICYmIChcbiAgICAgICAgICAgIChzdHIuc3RhcnNXaXRoKCcweCcpICYmIHN0ci5zbGljZSgyKS5sZW5ndGggPT09IGxlbmd0aCAqIDIpXG4gICAgICAgICAgICB8fCBzdHIubGVuZ3RoID09PSBsZW5ndGggKiAyXG4gICAgICAgIClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0hleFN0cmluZyhzdHIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJ1xuICAgICAgICAmJiAoXG4gICAgICAgICAgICAoc3RyLnN0YXJ0c1dpdGgoXCIweFwiKSAmJiAvXlthLWZBLUYwLTldKyQvaS50ZXN0KHN0ci5zbGljZSgyKSkpXG4gICAgICAgICAgICB8fCAvXlthLWZBLUYwLTldKyQvaS50ZXN0KHN0cilcbiAgICAgICAgKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHRvSGV4U3RyaW5nKGJ1ZmZlcikge1xuICAgIHJldHVybiBcIjB4XCIgKyBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYnVmZmVyLCB4ID0+ICgnMDAnICsgeC50b1N0cmluZygxNikpLnNsaWNlKC0yKSlcbiAgICAgICAgLmpvaW4oJycpXG4gICAgICAgIC5tYXRjaCgvW2EtZkEtRjAtOV17Mn0vZylcbiAgICAgICAgLmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIHBhcnNlVVJMKHVybCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgcGFyc2VkVXJsLnByb3RvY29sICsgXCIvL1wiLCBcbiAgICAgICAgICAgIHBhcnNlZFVybC5ob3N0LCBcbiAgICAgICAgICAgIHBhcnNlZFVybC5wYXRobmFtZS5zbGljZSgxKSwgXG4gICAgICAgICAgICBwYXJzZWRVcmwuc2VhcmNoLnNsaWNlKDEpXG4gICAgICAgIF1cbiAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBVUkwgd2FzIHByb3ZpZGVkOiAke3VybH1gKVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2hvd1VzYWdlKGNtZCwgbW9kdWxlKSB7XG4gICAgc2hvd1VzYWdlSGVhZGxpbmUoY21kKVxuICAgIGlmIChtb2R1bGU/LmZsYWdzKSBzaG93VXNhZ2VGbGFncyhtb2R1bGUuZmxhZ3MpXG4gICAgaWYgKG1vZHVsZT8ucm91dGVyKSBzaG93VXNhZ2VSb3V0ZXIobW9kdWxlLnJvdXRlcilcbiAgICBpZiAobW9kdWxlPy5lbnZhcnMpIHNob3dVc2FnZUVudmFycyhtb2R1bGUuZW52YXJzKVxufVxuXG5mdW5jdGlvbiBzaG93VXNhZ2VSb3V0ZXIocm91dGVyKSB7XG4gICAgY29uc3QgY21kcyA9IE9iamVjdC5lbnRyaWVzKHJvdXRlcilcbiAgICBpZiAoY21kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuU1VCQ09NTUFORFM6YClcbiAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gTWF0aC5tYXgoLi4uY21kcy5tYXAoKFtjbWRdKSA9PiBjbWQubGVuZ3RoKSlcbiAgICAgICAgY21kcy5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXCIgIFwiLCBgJHtjbWRbMF19JHtcIiBcIi5yZXBlYXQobWF4TGVuZ3RoIC0gY21kWzBdLmxlbmd0aCl9YCwgXCIgIFwiLCBjbWRbMV0uaGludClcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3dVc2FnZUVycm9yKGNtZCwgc3ViY21kLCBtb2R1bGUsIGVycm9yKSB7XG4gICAgc2hvd1VzYWdlU3ViY29tbWFuZChjbWQsIHN1YmNtZCwgbW9kdWxlLCBlcnJvcikgXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuRVJST1I6YClcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcj8uc3RhY2s/LnNwbGl0KCdcXG4nKVswXSB8fCBlcnJvcilcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3dVc2FnZUVudmFycyhlbnZhcnMpIHtcbiAgICBlbnZhcnMgPSBPYmplY3QuZW50cmllcyhlbnZhcnMpXG4gICAgaWYgKGVudmFycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuRU5WQVJTOmApXG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgoLi4uZW52YXJzLm1hcCgoW2VudmFyXSkgPT4gZW52YXIubGVuZ3RoKSlcbiAgICAgICAgZW52YXJzLmZvckVhY2goKFtlbnZhciwgaGludF0pID0+IHtcbiAgICAgICAgICAgIGlmIChlbnZhci50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJLRVlcIikgPCAwICYmIHByb2Nlc3MuZW52W2VudmFyXSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIiAgXCIsIGAke3llbGxvdyhlbnZhci50b1VwcGVyQ2FzZSgpKX0ke1wiIFwiLnJlcGVhdChtYXhXaWR0aCAtIGVudmFyLmxlbmd0aCl9YCwgYCA9PiBTZXR0bGVkIHRvIFwiJHtteWVsbG93KHByb2Nlc3MuZW52W2VudmFyXSl9XCJgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCIgIFwiLCBgJHt5ZWxsb3coZW52YXIudG9VcHBlckNhc2UoKSl9JHtcIiBcIi5yZXBlYXQobWF4V2lkdGggLSBlbnZhci5sZW5ndGgpfWAsIGAgJHtoaW50fWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiBzaG93VXNhZ2VGbGFncyhmbGFncykge1xuICAgIGZsYWdzID0gT2JqZWN0LmVudHJpZXMoZmxhZ3MpXG4gICAgaWYgKGZsYWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5GTEFHUzpgKVxuICAgICAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5mbGFncy5tYXAoKFtrZXksIHsgcGFyYW0gfV0pID0+IHBhcmFtID8ga2V5Lmxlbmd0aCArIHBhcmFtLmxlbmd0aCArIDMgOiBrZXkubGVuZ3RoKSlcbiAgICAgICAgZmxhZ3MuZm9yRWFjaChmbGFnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IGAke2ZsYWdbMF19JHtmbGFnWzFdLnBhcmFtID8gZ3JheShgIDwke2ZsYWdbMV0ucGFyYW19PmApIDogXCJcIn1gXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXCIgIFwiLCBgLS0ke3N0cn0ke1wiIFwiLnJlcGVhdChtYXhMZW5ndGggLSBjb2xvcnN0cmlwKHN0cikubGVuZ3RoKX1gLCBcIiAgXCIsIGZsYWdbMV0uaGludClcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3dVc2FnZUhlYWRsaW5lKGNtZCwgc3ViY21kLCBtb2R1bGUpIHtcbiAgICBjb25zb2xlLmluZm8oXCJVU0FHRTpcIilcbiAgICBpZiAoc3ViY21kKSB7XG4gICAgICAgIGxldCBwYXJhbXMgPSBtb2R1bGUucm91dGVyW3N1YmNtZF0/LnBhcmFtc1xuICAgICAgICBjb25zdCBvcHRpb25zID0gbW9kdWxlLnJvdXRlcltzdWJjbWRdPy5vcHRpb25zXG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbmFsaXplID0gKHN0cikgPT4gc3RyLmVuZHNXaXRoKCcgLi4uXScpID8gYFs8JHtzdHIuc2xpY2UoMSwgLTUpfT4gLi4uXWAgOiAoXG4gICAgICAgICAgICAgICAgc3RyWzBdID09PSAnWycgPyBgWzwke3N0ci5zbGljZSgxLCAtMSl9Pl1gIDogYDwke3N0cn0+YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5tYXAocGFyYW0gPT4gb3B0aW9uYWxpemUocGFyYW0pKS5qb2luKCcgJykgKyBcIiBcIlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBvcHRpb25hbGl6ZShwYXJhbXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5pbmZvKGAgICAke3doaXRlKGBucHggd2l0bmV0ICR7Y21kfWApfSBbRkxBR1NdICR7d2hpdGUoc3ViY21kKX0gJHtwYXJhbXMgPyBncmVlbihwYXJhbXMpICsgXCIgXCIgOiBcIlwifSR7b3B0aW9ucyAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5sZW5ndGggPiAwID8gXCJbT1BUSU9OU11cIiA6IFwiXCJ9YClcbiAgICAgICAgaWYgKG1vZHVsZT8ucm91dGVyW3N1YmNtZF0/LmhpbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuREVTQ1JJUFRJT046YClcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgICAgJHttb2R1bGUucm91dGVyW3N1YmNtZF0uaGludH1gKVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGAgICAke3doaXRlKGBucHggd2l0bmV0ICR7Y21kfWApfSBbRkxBR1NdIDxTVUJDT01NQU5EPiAuLi4gW09QVElPTlNdYClcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNob3dVc2FnZU9wdGlvbnMob3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKVxuICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG5PUFRJT05TOmApXG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IG9wdGlvbnNcbiAgICAgICAgICAgIC5tYXAob3B0aW9uID0+IG9wdGlvblsxXS5wYXJhbSA/IG9wdGlvblsxXS5wYXJhbS5sZW5ndGggKyBvcHRpb25bMF0ubGVuZ3RoICsgMyA6IG9wdGlvblswXS5sZW5ndGgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBjdXJyID4gcHJldiA/IGN1cnIgOiBwcmV2KTtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uWzFdLmhpbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBgJHtvcHRpb25bMF19JHtvcHRpb25bMV0ucGFyYW0gPyBncmF5KGAgPCR7b3B0aW9uWzFdLnBhcmFtfT5gKSA6IFwiXCJ9YFxuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIiAgXCIsIGAtLSR7c3RyfSR7XCIgXCIucmVwZWF0KG1heExlbmd0aCAtIGNvbG9yc3RyaXAoc3RyKS5sZW5ndGgpfWAsIFwiICBcIiwgb3B0aW9uWzFdLmhpbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiBzaG93VXNhZ2VTdWJjb21tYW5kKGNtZCwgc3ViY21kLCBtb2R1bGUpIHtcbiAgICBzaG93VXNhZ2VIZWFkbGluZShjbWQsIHN1YmNtZCwgbW9kdWxlKVxuICAgIGlmIChtb2R1bGU/LmZsYWdzKSBzaG93VXNhZ2VGbGFncyhtb2R1bGU/LmZsYWdzKVxuICAgIGlmIChtb2R1bGU/LnJvdXRlcltzdWJjbWRdPy5vcHRpb25zKSBzaG93VXNhZ2VPcHRpb25zKG1vZHVsZS5yb3V0ZXJbc3ViY21kXT8ub3B0aW9ucylcbiAgICBpZiAobW9kdWxlPy5lbnZhcnMpIHNob3dVc2FnZUVudmFycyhtb2R1bGU/LmVudmFycylcbn1cblxuZnVuY3Rpb24gc2hvd1ZlcnNpb24oKSB7XG4gICAgY29uc29sZS5pbmZvKGAke21jeWFuKGBXaXQvT3JhY2xlIFRvb2xraXQgQ0xJIHYke3JlcXVpcmUoXCIuLi8uLi9wYWNrYWdlLmpzb25cIikudmVyc2lvbn1gKX1gKVxufVxuXG5mdW5jdGlvbiBnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcoc3RyKSB7XG4gICAgbGV0IG1heEFyZ3NJbmRleCA9IDBcbiAgICBpZiAoc3RyKSB7XG4gICAgICAgIGxldCBtYXRjaFxuICAgICAgICBjb25zdCByZWdleHAgPSAvXFxcXFxcZFxcXFwvZ1xuICAgICAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXhwLmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBhcmdzSW5kZXggPSBwYXJzZUludChtYXRjaFswXVsxXSkgKyAxXG4gICAgICAgICAgICBpZiAoYXJnc0luZGV4ID4gbWF4QXJnc0luZGV4KSBtYXhBcmdzSW5kZXggPSBhcmdzSW5kZXhcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF4QXJnc0luZGV4XG59XG5cblxuZnVuY3Rpb24gaXNXaWxkY2FyZChzdHIpIHtcbiAgICByZXR1cm4gc3RyLmxlbmd0aCA9PSAzICYmIC9cXFxcXFxkXFxcXC9nLnRlc3Qoc3RyKVxufVxuXG5mdW5jdGlvbiByZXBsYWNlV2lsZGNhcmRzKG9iaiwgYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDEwKSBhcmdzID0gYXJncy5zbGljZSgwLCAxMCk7XG4gICAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGZvciAobGV0IGFyZ0luZGV4ID0gMDsgYXJnSW5kZXggPCBhcmdzLmxlbmd0aDsgYXJnSW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3Qgd2lsZGNhcmQgPSBgXFxcXCR7YXJnSW5kZXh9XFxcXGBcbiAgICAgICAgICAgIG9iaiA9IG9iai5yZXBsYWNlQWxsKHdpbGRjYXJkLCBhcmdzW2FyZ0luZGV4XSlcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2JqICYmIEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmogPSBvYmoubWFwKHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgPyByZXBsYWNlV2lsZGNhcmRzKHZhbHVlLCBhcmdzKVxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICApXG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIHNwbGljZVdpbGRjYXJkKG9iaiwgYXJnSW5kZXgsIGFyZ1ZhbHVlLCBhcmdzQ291bnQpIHtcbiAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3Qgd2lsZGNhcmQgPSBgXFxcXCR7YXJnSW5kZXh9XFxcXGBcbiAgICAgICAgb2JqID0gb2JqLnJlcGxhY2VBbGwod2lsZGNhcmQsIGFyZ1ZhbHVlKVxuICAgICAgICBmb3IgKGxldCBqID0gYXJnSW5kZXggKyAxOyBqIDwgYXJnc0NvdW50OyBqKyspIHtcbiAgICAgICAgICAgIG9iaiA9IG9iai5yZXBsYWNlQWxsKGBcXFxcJHtqfVxcXFxgLCBgXFxcXCR7aiAtIDF9XFxcXGApXG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9iaiAmJiBBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgb2JqID0gb2JqLm1hcCh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgID8gc3BsaWNlV2lsZGNhcmQodmFsdWUsIGFyZ0luZGV4LCBhcmdWYWx1ZSwgYXJnc0NvdW50KVxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICApXG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRvb2xraXRSdW4oc2V0dGluZ3MsIGFyZ3MpIHtcbiAgICBjb25zdCBjbWQgPSBgJHtzZXR0aW5ncy5wYXRocy50b29sa2l0QmluUGF0aH0gJHthcmdzLmpvaW4oJyAnKX1gXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZXhlYyhjbWQsIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCAqIDEwIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3Qoc3RkZXJyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQpXG4gICAgICAgIH0pXG4gICAgfSlcbn1cblxuZnVuY3Rpb24gdG9VcHBlckNhbWVsQ2FzZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcYihcXHcpL2csIGZ1bmN0aW9uIChtYXRjaCwgY2FwdHVyZSkge1xuICAgICAgICByZXR1cm4gY2FwdHVyZS50b1VwcGVyQ2FzZSgpO1xuICAgIH0pLnJlcGxhY2UoL1xccysvZywgJycpO1xufVxuXG5mdW5jdGlvbiB0b1V0ZjhBcnJheShzdHIpIHtcbiAgICBjb25zdCB1dGY4ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhcmNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgaWYgKGNoYXJjb2RlIDwgMHg4MCkgdXRmOC5wdXNoKGNoYXJjb2RlKTtcbiAgICAgICAgZWxzZSBpZiAoY2hhcmNvZGUgPCAweDgwMCkge1xuICAgICAgICAgICAgdXRmOC5wdXNoKDB4YzAgfCAoY2hhcmNvZGUgPj4gNiksXG4gICAgICAgICAgICAgICAgMHg4MCB8IChjaGFyY29kZSAmIDB4M2YpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGFyY29kZSA8IDB4ZDgwMCB8fCBjaGFyY29kZSA+PSAweGUwMDApIHtcbiAgICAgICAgICAgIHV0ZjgucHVzaCgweGUwIHwgKGNoYXJjb2RlID4+IDEyKSxcbiAgICAgICAgICAgICAgICAweDgwIHwgKChjaGFyY29kZSA+PiA2KSAmIDB4M2YpLFxuICAgICAgICAgICAgICAgIDB4ODAgfCAoY2hhcmNvZGUgJiAweDNmKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3Vycm9nYXRlIHBhaXJcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAvLyBVVEYtMTYgZW5jb2RlcyAweDEwMDAwLTB4MTBGRkZGIGJ5XG4gICAgICAgICAgICAvLyBzdWJ0cmFjdGluZyAweDEwMDAwIGFuZCBzcGxpdHRpbmcgdGhlXG4gICAgICAgICAgICAvLyAyMCBiaXRzIG9mIDB4MC0weEZGRkZGIGludG8gdHdvIGhhbHZlc1xuICAgICAgICAgICAgY2hhcmNvZGUgPSAweDEwMDAwICsgKCgoY2hhcmNvZGUgJiAweDNmZikgPDwgMTApXG4gICAgICAgICAgICAgICAgfCAoc3RyLmNoYXJDb2RlQXQoaSkgJiAweDNmZikpO1xuICAgICAgICAgICAgdXRmOC5wdXNoKDB4ZjAgfCAoY2hhcmNvZGUgPj4gMTgpLFxuICAgICAgICAgICAgICAgIDB4ODAgfCAoKGNoYXJjb2RlID4+IDEyKSAmIDB4M2YpLFxuICAgICAgICAgICAgICAgIDB4ODAgfCAoKGNoYXJjb2RlID4+IDYpICYgMHgzZiksXG4gICAgICAgICAgICAgICAgMHg4MCB8IChjaGFyY29kZSAmIDB4M2YpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXRmODtcbn1cblxuZnVuY3Rpb24gdXRmOEFycmF5VG9TdHIoYXJyYXkpIHtcbiAgICBsZXQgb3V0LCBpLCBsZW4sIGM7XG4gICAgbGV0IGNoYXIyLCBjaGFyMztcblxuICAgIG91dCA9IFwiXCI7XG4gICAgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgIGMgPSBhcnJheVtpKytdO1xuICAgICAgICBzd2l0Y2ggKGMgPj4gNCkge1xuICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OiBjYXNlIDc6XG4gICAgICAgICAgICAgICAgLy8gMHh4eHh4eHhcbiAgICAgICAgICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTI6IGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgLy8gMTEweCB4eHh4ICAgMTB4eCB4eHh4XG4gICAgICAgICAgICAgICAgY2hhcjIgPSBhcnJheVtpKytdO1xuICAgICAgICAgICAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDB4MUYpIDw8IDYpIHwgKGNoYXIyICYgMHgzRikpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAvLyAxMTEwIHh4eHggIDEweHggeHh4eCAgMTB4eCB4eHh4XG4gICAgICAgICAgICAgICAgY2hhcjIgPSBhcnJheVtpKytdO1xuICAgICAgICAgICAgICAgIGNoYXIzID0gYXJyYXlbaSsrXTtcbiAgICAgICAgICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAweDBGKSA8PCAxMikgfFxuICAgICAgICAgICAgICAgICAgICAoKGNoYXIyICYgMHgzRikgPDwgNikgfFxuICAgICAgICAgICAgICAgICAgICAoKGNoYXIzICYgMHgzRikgPDwgMCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdCAocXVlc3Rpb24pIHtcbiAgICBjb25zdCByZWFkbGluZUludGVyZmFjZSA9IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7XG4gICAgICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgICAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gICAgfSlcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIF8pID0+IHtcbiAgICAgICAgcmVhZGxpbmVJbnRlcmZhY2UucXVlc3Rpb24oYCR7cXVlc3Rpb259IGAsIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVhZGxpbmVJbnRlcmZhY2UuY2xvc2UoKVxuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS50cmltKCkpXG4gICAgICAgIH0pXG4gICAgfSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0ZXIocHJvbWlzZSkge1xuICAgIGNvbnN0IGxvYWRpbmcgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGggPSBbJ3wnLCAnLycsICctJywgJ1xcXFwnXTtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICByZXR1cm4gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaSA9IChpID4gMykgPyAwIDogaTsgIFxuICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFxcYlxcYiR7aFtpXX0gYClcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfSwgNTApO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHsgXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGxvYWRpbmcpOyBcbiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXGJcXGInKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9KVxufVxuXG5mdW5jdGlvbiB0cmFjZUNoZWNrbGlzdHMoY2hlY2tsaXN0cykge1xuICAgIGlmIChjaGVja2xpc3RzICYmIE9iamVjdC5rZXlzKGNoZWNrbGlzdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaGVhZGxpbmVzID0gW1wiTk9ERVNcIiwgLi4uT2JqZWN0LmtleXMoY2hlY2tsaXN0cykubWFwKGtleSA9PiBgOiR7a2V5fWApLCBdXG4gICAgICAgIGNoZWNrbGlzdHMgPSBPYmplY3QudmFsdWVzKGNoZWNrbGlzdHMpXG4gICAgICAgIGNvbnN0IHVybHMgPSBPYmplY3Qua2V5cyhjaGVja2xpc3RzWzBdKVxuICAgICAgICBjb25zdCByZWNvcmRzID0gdXJscy5tYXAodXJsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IGNoZWNrbGlzdHMuZmlsdGVyKGNoZWNrbGlzdCA9PiBjaGVja2xpc3RbdXJsXSBpbnN0YW5jZW9mIEVycm9yKS5sZW5ndGhcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZXJyb3JzID09PSBjaGVja2xpc3RzLmxlbmd0aCA/IHJlZCh1cmwpIDogKGVycm9ycyA+IDAgPyBteWVsbG93KHVybCkgOiBtY3lhbih1cmwpKSxcbiAgICAgICAgICAgICAgICAuLi5jaGVja2xpc3RzLm1hcChjaGVja2xpc3QgPT4gY2hlY2tsaXN0W3VybF0gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICA/IHJlZChjaGVja2xpc3RbdXJsXSlcbiAgICAgICAgICAgICAgICAgICAgOiAoY2hlY2tsaXN0W3VybF0gPT09IHRydWUgPyBsY3lhbihcIkF5ZVwiKSA6IGN5YW4oXCJOYXlcIikpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICAgICAgdHJhY2VUYWJsZShyZWNvcmRzLCB7XG4gICAgICAgICAgICBoZWFkbGluZXMsXG4gICAgICAgICAgICBtYXhDb2x1bW5XaWR0aDogMzEsXG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmFjZUhlYWRlcihoZWFkbGluZSwgY29sb3IgPSBub3JtYWwsIGluZGVudCA9IFwiXCIsICkge1xuICAgIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSM4pSAJHtcIuKUgFwiLnJlcGVhdChoZWFkbGluZS5sZW5ndGgpfeKUgOKUkGApXG4gICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilIIgJHtjb2xvcihoZWFkbGluZSl9IOKUgmApXG4gICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilJTilIAke1wi4pSAXCIucmVwZWF0KGhlYWRsaW5lLmxlbmd0aCl94pSA4pSYYClcbn1cblxuZnVuY3Rpb24gdHJhY2VUYWJsZShyZWNvcmRzLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gKGRhdGEsIGh1bWFuaXplcnMsIGluZGV4KSA9PiBodW1hbml6ZXJzICYmIGh1bWFuaXplcnNbaW5kZXhdID8gaHVtYW5pemVyc1tpbmRleF0oZGF0YSkudG9TdHJpbmcoKSA6IGRhdGE/LnRvU3RyaW5nKCkgPz8gXCJcIlxuICAgIGNvbnN0IG1heCA9IChhLCBiKSA9PiBhID4gYiA/IGEgOiBiXG4gICAgY29uc3QgcmVkdWNlTWF4ID0gKG51bWJlcnMpID0+IG51bWJlcnMucmVkdWNlKChjdXJyLCBwcmV2KSA9PiBwcmV2ID4gY3VyciA/IHByZXYgOiBjdXJyLCAwKVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9XG4gICAgY29uc3QgaW5kZW50ID0gb3B0aW9ucz8uaW5kZW50IHx8IFwiXCJcbiAgICBjb25zdCBudW1Db2x1bW5zID0gcmVkdWNlTWF4KHJlY29yZHMubWFwKHJlY29yZCA9PiByZWNvcmQ/Lmxlbmd0aCB8fCAxKSlcbiAgICBjb25zdCBtYXhDb2x1bW5XaWR0aCA9IG9wdGlvbnM/Lm1heENvbHVtbldpZHRoIHx8IDgwXG4gICAgY29uc3QgdGFibGUgPSB0cmFuc3Bvc2UocmVjb3JkcywgbnVtQ29sdW1ucylcbiAgICBvcHRpb25zLndpZHRocyA9IG9wdGlvbnM/LndpZHRocyB8fCB0YWJsZS5tYXAoKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IG1heFdpZHRoID0gcmVkdWNlTWF4KGNvbHVtbi5tYXAoZmllbGQgPT4gY29sb3JzdHJpcChzdHJpbmdpZnkoZmllbGQsIG9wdGlvbnM/Lmh1bWFuaXplcnMsIGluZGV4KSkubGVuZ3RoKSlcbiAgICAgICAgaWYgKG9wdGlvbnM/LmhlYWRsaW5lcyAmJiBvcHRpb25zLmhlYWRsaW5lc1tpbmRleF0pIHtcbiAgICAgICAgICAgIG1heFdpZHRoID0gbWF4KG1heFdpZHRoLCBjb2xvcnN0cmlwKG9wdGlvbnMuaGVhZGxpbmVzW2luZGV4XS5yZXBsYWNlQWxsKCc6JywgJycpKS5sZW5ndGgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGgubWluKG1heFdpZHRoLCBtYXhDb2x1bW5XaWR0aClcbiAgICB9KVxuICAgIGxldCBoZWFkbGluZSA9IG9wdGlvbnMud2lkdGhzLm1hcChtYXhXaWR0aCA9PiBcIuKUgFwiLnJlcGVhdChtYXhXaWR0aCkpXG4gICAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilIzilIAke2hlYWRsaW5lLmpvaW4oXCLilIDilKzilIBcIil94pSA4pSQYClcbiAgICBpZiAob3B0aW9ucz8uaGVhZGxpbmVzKSB7XG4gICAgICAgIGhlYWRsaW5lID0gb3B0aW9ucy53aWR0aHMubWFwKChtYXhXaWR0aCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSBvcHRpb25zLmhlYWRsaW5lc1tpbmRleF0ucmVwbGFjZUFsbCgnOicsICcnKVxuICAgICAgICAgICAgY29uc3QgY2FwdGlvbkxlbmd0aCA9IGNvbG9yc3RyaXAoY2FwdGlvbikubGVuZ3RoXG4gICAgICAgICAgICByZXR1cm4gYCR7d2hpdGUoY2FwdGlvbil9JHtcIiBcIi5yZXBlYXQobWF4V2lkdGggLSBjYXB0aW9uTGVuZ3RoKX1gXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSCICR7aGVhZGxpbmUuam9pbihcIiDilIIgXCIpfSDilIJgKVxuICAgICAgICBoZWFkbGluZSA9IG9wdGlvbnMud2lkdGhzLm1hcChtYXhXaWR0aCA9PiBcIuKUgFwiLnJlcGVhdChtYXhXaWR0aCkpXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSc4pSAJHtoZWFkbGluZS5qb2luKFwi4pSA4pS84pSAXCIpfeKUgOKUpGApXG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgICAgbGV0IGxpbmUgPSBcIlwiXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaiArKykge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB0YWJsZVtqXVtpXVxuICAgICAgICAgICAgbGV0IGNvbG9yXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uY29sb3JzICYmIG9wdGlvbnMuY29sb3JzW2pdKSB7XG4gICAgICAgICAgICAgIGNvbG9yID0gb3B0aW9ucy5jb2xvcnNbal0gIFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29sb3IgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgXG4gICAgICAgICAgICAgICAgPyBncmVlbiBcbiAgICAgICAgICAgICAgICA6IChOdW1iZXIoZGF0YSkgPT09IGRhdGEgJiYgZGF0YSAlIDEgIT09IDAgLy8gaXMgZmxvYXQgbnVtYmVyP1xuICAgICAgICAgICAgICAgICAgICA/IHllbGxvdyBcbiAgICAgICAgICAgICAgICAgICAgOiAoeCkgPT4geFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEgPSBzdHJpbmdpZnkoZGF0YSwgb3B0aW9ucz8uaHVtYW5pemVycywgailcbiAgICAgICAgICAgIGlmIChjb2xvcnN0cmlwKGRhdGEpLmxlbmd0aCA+IG1heENvbHVtbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbG9yc3RyaXAoZGF0YSkubGVuZ3RoID4gbWF4Q29sdW1uV2lkdGggLSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRhICs9IFwiLi4uXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBkYXRhTGVuZ3RoID0gY29sb3JzdHJpcChkYXRhKS5sZW5ndGhcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5oZWFkbGluZXMgJiYgb3B0aW9ucy5oZWFkbGluZXNbal1bMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgJHtjb2xvcihkYXRhKX0ke1wiIFwiLnJlcGVhdChvcHRpb25zLndpZHRoc1tqXSAtIGRhdGFMZW5ndGgpfWBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGAke1wiIFwiLnJlcGVhdChvcHRpb25zLndpZHRoc1tqXSAtIGRhdGFMZW5ndGgpfSR7Y29sb3IoZGF0YSl9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZSArPSBg4pSCICR7ZGF0YX0gYFxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR9JHtsaW5lfeKUgmApXG4gICAgfVxuICAgIGhlYWRsaW5lID0gb3B0aW9ucy53aWR0aHMubWFwKG1heFdpZHRoID0+IFwi4pSAXCIucmVwZWF0KG1heFdpZHRoKSlcbiAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUlOKUgCR7aGVhZGxpbmUuam9pbihcIuKUgOKUtOKUgFwiKX3ilIDilJhgKVxufVxuXG5mdW5jdGlvbiB0cmFuc3Bvc2UocmVjb3JkcywgbnVtQ29sdW1ucykge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBbXVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBudW1Db2x1bW5zOyBpbmRleCArKykge1xuICAgICAgICBjb2x1bW5zLnB1c2gocmVjb3Jkcy5tYXAocm93ID0+IHJvd1tpbmRleF0pKVxuICAgIH1cbiAgICByZXR1cm4gY29sdW1uc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBjb2xvcnM6IHtcbiAgICAgICAgY3lhbiwgZ3JheSwgZ3JlZW4sIG1hZ2VudGEsIHJlZCwgd2hpdGUsIHllbGxvdywgbm9ybWFsLFxuICAgICAgICBsY3lhbiwgbGdyYXksIGxncmVlbiwgbG1hZ2VudGEsIGx5ZWxsb3csXG4gICAgICAgIG1jeWFuLCBtZ3JlZW4sIG1tYWdlbnRhLCBtcmVkLCBteWVsbG93LFxuICAgIH0sXG4gICAgY29sb3JzdHJpcCwgY29tbWFzLCB3aG9sZV93aXRzLCB0b0ZpeGVkVHJ1bmMsIGZyb21OYW5vd2l0cyxcbiAgICBjb3VudExlYXZlcyxcbiAgICBkZWxldGVFeHRyYUZsYWdzLCBleHRyYWN0RnJvbUFyZ3MsXG4gICAgZnJvbUhleFN0cmluZywgaXNIZXhTdHJpbmcsIGlzSGV4U3RyaW5nT2ZMZW5ndGgsIHRvSGV4U3RyaW5nLFxuICAgIHBhcnNlVVJMLCBpcElzUHJpdmF0ZU9yTG9jYWxob3N0LFxuICAgIHNob3dVc2FnZSwgc2hvd1VzYWdlRXJyb3IsIHNob3dVc2FnZVN1YmNvbW1hbmQsIHNob3dWZXJzaW9uLFxuICAgIHRvb2xraXRSdW4sXG4gICAgdG9VcHBlckNhbWVsQ2FzZSwgdG9VdGY4QXJyYXksIHV0ZjhBcnJheVRvU3RyLFxuICAgIHByb21wdCwgcHJvbXB0ZXIsIFxuICAgIHRyYWNlQ2hlY2tsaXN0cywgdHJhY2VIZWFkZXIsIHRyYWNlVGFibGUsXG4gICAgd2lsZGNhcmRzOiB7XG4gICAgICAgIGlzV2lsZGNhcmQsXG4gICAgICAgIGdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyxcbiAgICAgICAgcmVwbGFjZVdpbGRjYXJkcyxcbiAgICAgICAgc3BsaWNlV2lsZGNhcmQsXG4gICAgfSxcbn1cbiJdfQ==