every-plugin 0.4.13 → 0.4.15

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 (87) hide show
  1. package/dist/build/rspack/index.cjs +82 -80
  2. package/dist/build/rspack/index.cjs.map +1 -0
  3. package/dist/build/rspack/index.d.cts +1 -1
  4. package/dist/build/rspack/index.d.cts.map +1 -0
  5. package/dist/build/rspack/index.d.mts +1 -1
  6. package/dist/build/rspack/index.d.mts.map +1 -0
  7. package/dist/build/rspack/index.mjs +82 -80
  8. package/dist/build/rspack/index.mjs.map +1 -0
  9. package/dist/errors-9sNpYLv5.d.mts +1 -1
  10. package/dist/errors-9sNpYLv5.d.mts.map +1 -0
  11. package/dist/errors-CVnoPl9v.cjs +1 -1
  12. package/dist/errors-CVnoPl9v.cjs.map +1 -0
  13. package/dist/errors-D7keKf7a.mjs +1 -1
  14. package/dist/errors-D7keKf7a.mjs.map +1 -0
  15. package/dist/errors-DKPPPYYT.d.cts +1 -1
  16. package/dist/errors-DKPPPYYT.d.cts.map +1 -0
  17. package/dist/fetch-8DauUFDh.mjs +335 -0
  18. package/dist/fetch-8DauUFDh.mjs.map +1 -0
  19. package/dist/fetch-CrBvwsZ4.cjs +336 -0
  20. package/dist/fetch-CrBvwsZ4.cjs.map +1 -0
  21. package/dist/index-Coz54d1B.d.mts +387 -0
  22. package/dist/index-Coz54d1B.d.mts.map +1 -0
  23. package/dist/index-G63gBZIY.d.cts +386 -0
  24. package/dist/index-G63gBZIY.d.cts.map +1 -0
  25. package/dist/index.cjs +3 -3
  26. package/dist/index.cjs.map +1 -0
  27. package/dist/index.d.cts +1 -1
  28. package/dist/index.d.mts +1 -1
  29. package/dist/index.mjs +3 -3
  30. package/dist/index.mjs.map +1 -0
  31. package/dist/normalize-BW7kk8Lk.d.cts +1 -1
  32. package/dist/normalize-BW7kk8Lk.d.cts.map +1 -0
  33. package/dist/normalize-D4Qh0wVk.cjs +1 -1
  34. package/dist/normalize-D4Qh0wVk.cjs.map +1 -0
  35. package/dist/normalize-D7nae0Hn.mjs +1 -1
  36. package/dist/normalize-D7nae0Hn.mjs.map +1 -0
  37. package/dist/normalize-eB_j86fm.d.mts +1 -1
  38. package/dist/normalize-eB_j86fm.d.mts.map +1 -0
  39. package/dist/package-BoyftHDo.mjs +150 -0
  40. package/dist/package-BoyftHDo.mjs.map +1 -0
  41. package/dist/package-CgNIVjVe.cjs +155 -0
  42. package/dist/package-CgNIVjVe.cjs.map +1 -0
  43. package/dist/plugins-C6MGKdD-.mjs +790 -0
  44. package/dist/plugins-C6MGKdD-.mjs.map +1 -0
  45. package/dist/plugins-DNaNtkG7.cjs +791 -0
  46. package/dist/plugins-DNaNtkG7.cjs.map +1 -0
  47. package/dist/runtime/index.cjs +2 -2
  48. package/dist/runtime/index.d.cts +1 -1
  49. package/dist/runtime/index.d.mts +1 -1
  50. package/dist/runtime/index.mjs +2 -2
  51. package/dist/runtime-60AkNpI0.mjs +476 -0
  52. package/dist/runtime-60AkNpI0.mjs.map +1 -0
  53. package/dist/runtime-BcksCIA1.cjs +541 -0
  54. package/dist/runtime-BcksCIA1.cjs.map +1 -0
  55. package/dist/standard-CkH8zNkx.mjs +584 -0
  56. package/dist/standard-CkH8zNkx.mjs.map +1 -0
  57. package/dist/standard-v75BC6Z5.cjs +685 -0
  58. package/dist/standard-v75BC6Z5.cjs.map +1 -0
  59. package/dist/testing/index.cjs +3 -3
  60. package/dist/testing/index.cjs.map +1 -0
  61. package/dist/testing/index.d.cts +2 -2
  62. package/dist/testing/index.d.cts.map +1 -0
  63. package/dist/testing/index.d.mts +2 -2
  64. package/dist/testing/index.d.mts.map +1 -0
  65. package/dist/testing/index.mjs +3 -3
  66. package/dist/testing/index.mjs.map +1 -0
  67. package/dist/zod-A7Pti5IV.d.cts +1 -1
  68. package/dist/zod-A7Pti5IV.d.cts.map +1 -0
  69. package/dist/zod-BVo51kgJ.mjs +1 -1
  70. package/dist/zod-BVo51kgJ.mjs.map +1 -0
  71. package/dist/zod-DYghWCz1.cjs +1 -1
  72. package/dist/zod-DYghWCz1.cjs.map +1 -0
  73. package/dist/zod-Zw8dlP3j.d.mts +1 -1
  74. package/dist/zod-Zw8dlP3j.d.mts.map +1 -0
  75. package/package.json +1 -1
  76. package/dist/fetch-CGzn1Uf7.cjs +0 -336
  77. package/dist/fetch-ycs0raYN.mjs +0 -335
  78. package/dist/index-matrPV4m.d.cts +0 -382
  79. package/dist/index-qxKsRmCb.d.mts +0 -383
  80. package/dist/package-CMoV9xVN.cjs +0 -155
  81. package/dist/package-WZ0vKAyb.mjs +0 -150
  82. package/dist/plugins-Cmsm3gW1.cjs +0 -791
  83. package/dist/plugins-hpi2GlaX.mjs +0 -790
  84. package/dist/runtime-B4AItsDQ.mjs +0 -458
  85. package/dist/runtime-D5bSEcHa.cjs +0 -523
  86. package/dist/standard-0wBehDUp.cjs +0 -685
  87. package/dist/standard-CYaRay89.mjs +0 -584
@@ -1,335 +0,0 @@
1
- import { _ as value, a as toHttpPath, f as isObject, g as tryDecodeURIComponent, i as standardizeHTTPPath, l as isORPCErrorStatus, m as stringifyJSON, n as StandardOpenAPISerializer, o as StandardBracketNotationSerializer, t as StandardOpenAPIJsonSerializer } from "./standard-CYaRay89.mjs";
2
- import { createContractedProcedure, getLazyMeta, getRouter, isProcedure, traverseContractProcedures, unlazy } from "@orpc/server";
3
- import { fallbackContractConfig } from "@orpc/contract";
4
- import { FetchHandler } from "@orpc/server/fetch";
5
- import { StandardHandler } from "@orpc/server/standard";
6
-
7
- //#region ../../node_modules/.bun/rou3@0.7.10/node_modules/rou3/dist/index.mjs
8
- const NullProtoObj = /* @__PURE__ */ (() => {
9
- const e = function() {};
10
- return e.prototype = Object.create(null), Object.freeze(e.prototype), e;
11
- })();
12
- /**
13
- * Create a new router context.
14
- */
15
- function createRouter() {
16
- return {
17
- root: { key: "" },
18
- static: new NullProtoObj()
19
- };
20
- }
21
- function splitPath(path) {
22
- const [_, ...s] = path.split("/");
23
- return s[s.length - 1] === "" ? s.slice(0, -1) : s;
24
- }
25
- function getMatchParams(segments, paramsMap) {
26
- const params = new NullProtoObj();
27
- for (const [index, name] of paramsMap) {
28
- const segment = index < 0 ? segments.slice(-1 * index).join("/") : segments[index];
29
- if (typeof name === "string") params[name] = segment;
30
- else {
31
- const match = segment.match(name);
32
- if (match) for (const key in match.groups) params[key] = match.groups[key];
33
- }
34
- }
35
- return params;
36
- }
37
- /**
38
- * Add a route to the router context.
39
- */
40
- function addRoute(ctx, method = "", path, data) {
41
- method = method.toUpperCase();
42
- if (path.charCodeAt(0) !== 47) path = `/${path}`;
43
- const segments = splitPath(path);
44
- let node = ctx.root;
45
- let _unnamedParamIndex = 0;
46
- const paramsMap = [];
47
- const paramsRegexp = [];
48
- for (let i = 0; i < segments.length; i++) {
49
- const segment = segments[i];
50
- if (segment.startsWith("**")) {
51
- if (!node.wildcard) node.wildcard = { key: "**" };
52
- node = node.wildcard;
53
- paramsMap.push([
54
- -i,
55
- segment.split(":")[1] || "_",
56
- segment.length === 2
57
- ]);
58
- break;
59
- }
60
- if (segment === "*" || segment.includes(":")) {
61
- if (!node.param) node.param = { key: "*" };
62
- node = node.param;
63
- if (segment === "*") paramsMap.push([
64
- i,
65
- `_${_unnamedParamIndex++}`,
66
- true
67
- ]);
68
- else if (segment.includes(":", 1)) {
69
- const regexp = getParamRegexp(segment);
70
- paramsRegexp[i] = regexp;
71
- node.hasRegexParam = true;
72
- paramsMap.push([
73
- i,
74
- regexp,
75
- false
76
- ]);
77
- } else paramsMap.push([
78
- i,
79
- segment.slice(1),
80
- false
81
- ]);
82
- continue;
83
- }
84
- const child = node.static?.[segment];
85
- if (child) node = child;
86
- else {
87
- const staticNode = { key: segment };
88
- if (!node.static) node.static = new NullProtoObj();
89
- node.static[segment] = staticNode;
90
- node = staticNode;
91
- }
92
- }
93
- const hasParams = paramsMap.length > 0;
94
- if (!node.methods) node.methods = new NullProtoObj();
95
- node.methods[method] ??= [];
96
- node.methods[method].push({
97
- data: data || null,
98
- paramsRegexp,
99
- paramsMap: hasParams ? paramsMap : void 0
100
- });
101
- if (!hasParams) ctx.static[path] = node;
102
- }
103
- function getParamRegexp(segment) {
104
- const regex = segment.replace(/:(\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\./g, "\\.");
105
- return /* @__PURE__ */ new RegExp(`^${regex}$`);
106
- }
107
- /**
108
- * Find a route by path.
109
- */
110
- function findRoute(ctx, method = "", path, opts) {
111
- if (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);
112
- const staticNode = ctx.static[path];
113
- if (staticNode && staticNode.methods) {
114
- const staticMatch = staticNode.methods[method] || staticNode.methods[""];
115
- if (staticMatch !== void 0) return staticMatch[0];
116
- }
117
- const segments = splitPath(path);
118
- const match = _lookupTree(ctx, ctx.root, method, segments, 0)?.[0];
119
- if (match === void 0) return;
120
- if (opts?.params === false) return match;
121
- return {
122
- data: match.data,
123
- params: match.paramsMap ? getMatchParams(segments, match.paramsMap) : void 0
124
- };
125
- }
126
- function _lookupTree(ctx, node, method, segments, index) {
127
- if (index === segments.length) {
128
- if (node.methods) {
129
- const match = node.methods[method] || node.methods[""];
130
- if (match) return match;
131
- }
132
- if (node.param && node.param.methods) {
133
- const match = node.param.methods[method] || node.param.methods[""];
134
- if (match) {
135
- const pMap = match[0].paramsMap;
136
- if (pMap?.[pMap?.length - 1]?.[2]) return match;
137
- }
138
- }
139
- if (node.wildcard && node.wildcard.methods) {
140
- const match = node.wildcard.methods[method] || node.wildcard.methods[""];
141
- if (match) {
142
- const pMap = match[0].paramsMap;
143
- if (pMap?.[pMap?.length - 1]?.[2]) return match;
144
- }
145
- }
146
- return;
147
- }
148
- const segment = segments[index];
149
- if (node.static) {
150
- const staticChild = node.static[segment];
151
- if (staticChild) {
152
- const match = _lookupTree(ctx, staticChild, method, segments, index + 1);
153
- if (match) return match;
154
- }
155
- }
156
- if (node.param) {
157
- const match = _lookupTree(ctx, node.param, method, segments, index + 1);
158
- if (match) {
159
- if (node.param.hasRegexParam) {
160
- const exactMatch = match.find((m) => m.paramsRegexp[index]?.test(segment)) || match.find((m) => !m.paramsRegexp[index]);
161
- return exactMatch ? [exactMatch] : void 0;
162
- }
163
- return match;
164
- }
165
- }
166
- if (node.wildcard && node.wildcard.methods) return node.wildcard.methods[method] || node.wildcard.methods[""];
167
- }
168
-
169
- //#endregion
170
- //#region ../../node_modules/.bun/@orpc+openapi@1.10.4/node_modules/@orpc/openapi/dist/shared/openapi.DIt-Z9W1.mjs
171
- var StandardOpenAPICodec = class {
172
- constructor(serializer, options = {}) {
173
- this.serializer = serializer;
174
- this.customErrorResponseBodyEncoder = options.customErrorResponseBodyEncoder;
175
- }
176
- customErrorResponseBodyEncoder;
177
- async decode(request, params, procedure) {
178
- if (fallbackContractConfig("defaultInputStructure", procedure["~orpc"].route.inputStructure) === "compact") {
179
- const data = request.method === "GET" ? this.serializer.deserialize(request.url.searchParams) : this.serializer.deserialize(await request.body());
180
- if (data === void 0) return params;
181
- if (isObject(data)) return {
182
- ...params,
183
- ...data
184
- };
185
- return data;
186
- }
187
- const deserializeSearchParams = () => {
188
- return this.serializer.deserialize(request.url.searchParams);
189
- };
190
- return {
191
- params,
192
- get query() {
193
- const value$1 = deserializeSearchParams();
194
- Object.defineProperty(this, "query", {
195
- value: value$1,
196
- writable: true
197
- });
198
- return value$1;
199
- },
200
- set query(value$1) {
201
- Object.defineProperty(this, "query", {
202
- value: value$1,
203
- writable: true
204
- });
205
- },
206
- headers: request.headers,
207
- body: this.serializer.deserialize(await request.body())
208
- };
209
- }
210
- encode(output, procedure) {
211
- const successStatus = fallbackContractConfig("defaultSuccessStatus", procedure["~orpc"].route.successStatus);
212
- if (fallbackContractConfig("defaultOutputStructure", procedure["~orpc"].route.outputStructure) === "compact") return {
213
- status: successStatus,
214
- headers: {},
215
- body: this.serializer.serialize(output)
216
- };
217
- if (!this.#isDetailedOutput(output)) throw new Error(`
218
- Invalid "detailed" output structure:
219
- \u2022 Expected an object with optional properties:
220
- - status (number 200-399)
221
- - headers (Record<string, string | string[]>)
222
- - body (any)
223
- \u2022 No extra keys allowed.
224
-
225
- Actual value:
226
- ${stringifyJSON(output)}
227
- `);
228
- return {
229
- status: output.status ?? successStatus,
230
- headers: output.headers ?? {},
231
- body: this.serializer.serialize(output.body)
232
- };
233
- }
234
- encodeError(error) {
235
- const body = this.customErrorResponseBodyEncoder?.(error) ?? error.toJSON();
236
- return {
237
- status: error.status,
238
- headers: {},
239
- body: this.serializer.serialize(body, { outputFormat: "plain" })
240
- };
241
- }
242
- #isDetailedOutput(output) {
243
- if (!isObject(output)) return false;
244
- if (output.headers && !isObject(output.headers)) return false;
245
- if (output.status !== void 0 && (typeof output.status !== "number" || !Number.isInteger(output.status) || isORPCErrorStatus(output.status))) return false;
246
- return true;
247
- }
248
- };
249
- function toRou3Pattern(path) {
250
- return standardizeHTTPPath(path).replace(/\/\{\+([^}]+)\}/g, "/**:$1").replace(/\/\{([^}]+)\}/g, "/:$1");
251
- }
252
- function decodeParams(params) {
253
- return Object.fromEntries(Object.entries(params).map(([key, value$1]) => [key, tryDecodeURIComponent(value$1)]));
254
- }
255
- var StandardOpenAPIMatcher = class {
256
- filter;
257
- tree = createRouter();
258
- pendingRouters = [];
259
- constructor(options = {}) {
260
- this.filter = options.filter ?? true;
261
- }
262
- init(router, path = []) {
263
- const laziedOptions = traverseContractProcedures({
264
- router,
265
- path
266
- }, (traverseOptions) => {
267
- if (!value(this.filter, traverseOptions)) return;
268
- const { path: path2, contract } = traverseOptions;
269
- const method = fallbackContractConfig("defaultMethod", contract["~orpc"].route.method);
270
- const httpPath = toRou3Pattern(contract["~orpc"].route.path ?? toHttpPath(path2));
271
- if (isProcedure(contract)) addRoute(this.tree, method, httpPath, {
272
- path: path2,
273
- contract,
274
- procedure: contract,
275
- router
276
- });
277
- else addRoute(this.tree, method, httpPath, {
278
- path: path2,
279
- contract,
280
- procedure: void 0,
281
- router
282
- });
283
- });
284
- this.pendingRouters.push(...laziedOptions.map((option) => ({
285
- ...option,
286
- httpPathPrefix: toHttpPath(option.path),
287
- laziedPrefix: getLazyMeta(option.router).prefix
288
- })));
289
- }
290
- async match(method, pathname) {
291
- if (this.pendingRouters.length) {
292
- const newPendingRouters = [];
293
- for (const pendingRouter of this.pendingRouters) if (!pendingRouter.laziedPrefix || pathname.startsWith(pendingRouter.laziedPrefix) || pathname.startsWith(pendingRouter.httpPathPrefix)) {
294
- const { default: router } = await unlazy(pendingRouter.router);
295
- this.init(router, pendingRouter.path);
296
- } else newPendingRouters.push(pendingRouter);
297
- this.pendingRouters = newPendingRouters;
298
- }
299
- const match = findRoute(this.tree, method, pathname);
300
- if (!match) return;
301
- if (!match.data.procedure) {
302
- const { default: maybeProcedure } = await unlazy(getRouter(match.data.router, match.data.path));
303
- if (!isProcedure(maybeProcedure)) throw new Error(`
304
- [Contract-First] Missing or invalid implementation for procedure at path: ${toHttpPath(match.data.path)}.
305
- Ensure that the procedure is correctly defined and matches the expected contract.
306
- `);
307
- match.data.procedure = createContractedProcedure(maybeProcedure, match.data.contract);
308
- }
309
- return {
310
- path: match.data.path,
311
- procedure: match.data.procedure,
312
- params: match.params ? decodeParams(match.params) : void 0
313
- };
314
- }
315
- };
316
- var StandardOpenAPIHandler = class extends StandardHandler {
317
- constructor(router, options) {
318
- const serializer = new StandardOpenAPISerializer(new StandardOpenAPIJsonSerializer(options), new StandardBracketNotationSerializer(options));
319
- const matcher = new StandardOpenAPIMatcher(options);
320
- const codec = new StandardOpenAPICodec(serializer, options);
321
- super(router, matcher, codec, options);
322
- }
323
- };
324
-
325
- //#endregion
326
- //#region ../../node_modules/.bun/@orpc+openapi@1.10.4/node_modules/@orpc/openapi/dist/adapters/fetch/index.mjs
327
- var OpenAPIHandler = class extends FetchHandler {
328
- constructor(router, options = {}) {
329
- super(new StandardOpenAPIHandler(router, options), options);
330
- }
331
- };
332
-
333
- //#endregion
334
- export { OpenAPIHandler };
335
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2gteWNzMHJhWU4ubWpzIiwibmFtZXMiOlsidmFsdWUiLCIjaXNEZXRhaWxlZE91dHB1dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYnVuL3JvdTNAMC43LjEwL25vZGVfbW9kdWxlcy9yb3UzL2Rpc3QvaW5kZXgubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5idW4vQG9ycGMrb3BlbmFwaUAxLjEwLjQvbm9kZV9tb2R1bGVzL0BvcnBjL29wZW5hcGkvZGlzdC9zaGFyZWQvb3BlbmFwaS5ESXQtWjlXMS5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytvcGVuYXBpQDEuMTAuNC9ub2RlX21vZHVsZXMvQG9ycGMvb3BlbmFwaS9kaXN0L2FkYXB0ZXJzL2ZldGNoL2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBOdWxsUHJvdG9PYmogPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcblx0Y29uc3QgZSA9IGZ1bmN0aW9uKCkge307XG5cdHJldHVybiBlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCksIE9iamVjdC5mcmVlemUoZS5wcm90b3R5cGUpLCBlO1xufSkoKTtcblxuLyoqXG4qIENyZWF0ZSBhIG5ldyByb3V0ZXIgY29udGV4dC5cbiovXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZXIoKSB7XG5cdHJldHVybiB7XG5cdFx0cm9vdDogeyBrZXk6IFwiXCIgfSxcblx0XHRzdGF0aWM6IG5ldyBOdWxsUHJvdG9PYmooKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBzcGxpdFBhdGgocGF0aCkge1xuXHRjb25zdCBbXywgLi4uc10gPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0cmV0dXJuIHNbcy5sZW5ndGggLSAxXSA9PT0gXCJcIiA/IHMuc2xpY2UoMCwgLTEpIDogcztcbn1cbmZ1bmN0aW9uIGdldE1hdGNoUGFyYW1zKHNlZ21lbnRzLCBwYXJhbXNNYXApIHtcblx0Y29uc3QgcGFyYW1zID0gbmV3IE51bGxQcm90b09iaigpO1xuXHRmb3IgKGNvbnN0IFtpbmRleCwgbmFtZV0gb2YgcGFyYW1zTWFwKSB7XG5cdFx0Y29uc3Qgc2VnbWVudCA9IGluZGV4IDwgMCA/IHNlZ21lbnRzLnNsaWNlKC0xICogaW5kZXgpLmpvaW4oXCIvXCIpIDogc2VnbWVudHNbaW5kZXhdO1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikgcGFyYW1zW25hbWVdID0gc2VnbWVudDtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gc2VnbWVudC5tYXRjaChuYW1lKTtcblx0XHRcdGlmIChtYXRjaCkgZm9yIChjb25zdCBrZXkgaW4gbWF0Y2guZ3JvdXBzKSBwYXJhbXNba2V5XSA9IG1hdGNoLmdyb3Vwc1trZXldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcGFyYW1zO1xufVxuXG4vKipcbiogQWRkIGEgcm91dGUgdG8gdGhlIHJvdXRlciBjb250ZXh0LlxuKi9cbmZ1bmN0aW9uIGFkZFJvdXRlKGN0eCwgbWV0aG9kID0gXCJcIiwgcGF0aCwgZGF0YSkge1xuXHRtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcblx0aWYgKHBhdGguY2hhckNvZGVBdCgwKSAhPT0gNDcpIHBhdGggPSBgLyR7cGF0aH1gO1xuXHRjb25zdCBzZWdtZW50cyA9IHNwbGl0UGF0aChwYXRoKTtcblx0bGV0IG5vZGUgPSBjdHgucm9vdDtcblx0bGV0IF91bm5hbWVkUGFyYW1JbmRleCA9IDA7XG5cdGNvbnN0IHBhcmFtc01hcCA9IFtdO1xuXHRjb25zdCBwYXJhbXNSZWdleHAgPSBbXTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcblx0XHRpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKipcIikpIHtcblx0XHRcdGlmICghbm9kZS53aWxkY2FyZCkgbm9kZS53aWxkY2FyZCA9IHsga2V5OiBcIioqXCIgfTtcblx0XHRcdG5vZGUgPSBub2RlLndpbGRjYXJkO1xuXHRcdFx0cGFyYW1zTWFwLnB1c2goW1xuXHRcdFx0XHQtaSxcblx0XHRcdFx0c2VnbWVudC5zcGxpdChcIjpcIilbMV0gfHwgXCJfXCIsXG5cdFx0XHRcdHNlZ21lbnQubGVuZ3RoID09PSAyXG5cdFx0XHRdKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoc2VnbWVudCA9PT0gXCIqXCIgfHwgc2VnbWVudC5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRcdGlmICghbm9kZS5wYXJhbSkgbm9kZS5wYXJhbSA9IHsga2V5OiBcIipcIiB9O1xuXHRcdFx0bm9kZSA9IG5vZGUucGFyYW07XG5cdFx0XHRpZiAoc2VnbWVudCA9PT0gXCIqXCIpIHBhcmFtc01hcC5wdXNoKFtcblx0XHRcdFx0aSxcblx0XHRcdFx0YF8ke191bm5hbWVkUGFyYW1JbmRleCsrfWAsXG5cdFx0XHRcdHRydWVcblx0XHRcdF0pO1xuXHRcdFx0ZWxzZSBpZiAoc2VnbWVudC5pbmNsdWRlcyhcIjpcIiwgMSkpIHtcblx0XHRcdFx0Y29uc3QgcmVnZXhwID0gZ2V0UGFyYW1SZWdleHAoc2VnbWVudCk7XG5cdFx0XHRcdHBhcmFtc1JlZ2V4cFtpXSA9IHJlZ2V4cDtcblx0XHRcdFx0bm9kZS5oYXNSZWdleFBhcmFtID0gdHJ1ZTtcblx0XHRcdFx0cGFyYW1zTWFwLnB1c2goW1xuXHRcdFx0XHRcdGksXG5cdFx0XHRcdFx0cmVnZXhwLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdF0pO1xuXHRcdFx0fSBlbHNlIHBhcmFtc01hcC5wdXNoKFtcblx0XHRcdFx0aSxcblx0XHRcdFx0c2VnbWVudC5zbGljZSgxKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdF0pO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGNvbnN0IGNoaWxkID0gbm9kZS5zdGF0aWM/LltzZWdtZW50XTtcblx0XHRpZiAoY2hpbGQpIG5vZGUgPSBjaGlsZDtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHN0YXRpY05vZGUgPSB7IGtleTogc2VnbWVudCB9O1xuXHRcdFx0aWYgKCFub2RlLnN0YXRpYykgbm9kZS5zdGF0aWMgPSBuZXcgTnVsbFByb3RvT2JqKCk7XG5cdFx0XHRub2RlLnN0YXRpY1tzZWdtZW50XSA9IHN0YXRpY05vZGU7XG5cdFx0XHRub2RlID0gc3RhdGljTm9kZTtcblx0XHR9XG5cdH1cblx0Y29uc3QgaGFzUGFyYW1zID0gcGFyYW1zTWFwLmxlbmd0aCA+IDA7XG5cdGlmICghbm9kZS5tZXRob2RzKSBub2RlLm1ldGhvZHMgPSBuZXcgTnVsbFByb3RvT2JqKCk7XG5cdG5vZGUubWV0aG9kc1ttZXRob2RdID8/PSBbXTtcblx0bm9kZS5tZXRob2RzW21ldGhvZF0ucHVzaCh7XG5cdFx0ZGF0YTogZGF0YSB8fCBudWxsLFxuXHRcdHBhcmFtc1JlZ2V4cCxcblx0XHRwYXJhbXNNYXA6IGhhc1BhcmFtcyA/IHBhcmFtc01hcCA6IHZvaWQgMFxuXHR9KTtcblx0aWYgKCFoYXNQYXJhbXMpIGN0eC5zdGF0aWNbcGF0aF0gPSBub2RlO1xufVxuZnVuY3Rpb24gZ2V0UGFyYW1SZWdleHAoc2VnbWVudCkge1xuXHRjb25zdCByZWdleCA9IHNlZ21lbnQucmVwbGFjZSgvOihcXHcrKS9nLCAoXywgaWQpID0+IGAoPzwke2lkfT5bXi9dKylgKS5yZXBsYWNlKC9cXC4vZywgXCJcXFxcLlwiKTtcblx0cmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVnRXhwKGBeJHtyZWdleH0kYCk7XG59XG5cbi8qKlxuKiBGaW5kIGEgcm91dGUgYnkgcGF0aC5cbiovXG5mdW5jdGlvbiBmaW5kUm91dGUoY3R4LCBtZXRob2QgPSBcIlwiLCBwYXRoLCBvcHRzKSB7XG5cdGlmIChwYXRoLmNoYXJDb2RlQXQocGF0aC5sZW5ndGggLSAxKSA9PT0gNDcpIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcblx0Y29uc3Qgc3RhdGljTm9kZSA9IGN0eC5zdGF0aWNbcGF0aF07XG5cdGlmIChzdGF0aWNOb2RlICYmIHN0YXRpY05vZGUubWV0aG9kcykge1xuXHRcdGNvbnN0IHN0YXRpY01hdGNoID0gc3RhdGljTm9kZS5tZXRob2RzW21ldGhvZF0gfHwgc3RhdGljTm9kZS5tZXRob2RzW1wiXCJdO1xuXHRcdGlmIChzdGF0aWNNYXRjaCAhPT0gdm9pZCAwKSByZXR1cm4gc3RhdGljTWF0Y2hbMF07XG5cdH1cblx0Y29uc3Qgc2VnbWVudHMgPSBzcGxpdFBhdGgocGF0aCk7XG5cdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBjdHgucm9vdCwgbWV0aG9kLCBzZWdtZW50cywgMCk/LlswXTtcblx0aWYgKG1hdGNoID09PSB2b2lkIDApIHJldHVybjtcblx0aWYgKG9wdHM/LnBhcmFtcyA9PT0gZmFsc2UpIHJldHVybiBtYXRjaDtcblx0cmV0dXJuIHtcblx0XHRkYXRhOiBtYXRjaC5kYXRhLFxuXHRcdHBhcmFtczogbWF0Y2gucGFyYW1zTWFwID8gZ2V0TWF0Y2hQYXJhbXMoc2VnbWVudHMsIG1hdGNoLnBhcmFtc01hcCkgOiB2b2lkIDBcblx0fTtcbn1cbmZ1bmN0aW9uIF9sb29rdXBUcmVlKGN0eCwgbm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgpIHtcblx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGgpIHtcblx0XHRpZiAobm9kZS5tZXRob2RzKSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IG5vZGUubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUubWV0aG9kc1tcIlwiXTtcblx0XHRcdGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoO1xuXHRcdH1cblx0XHRpZiAobm9kZS5wYXJhbSAmJiBub2RlLnBhcmFtLm1ldGhvZHMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbm9kZS5wYXJhbS5tZXRob2RzW21ldGhvZF0gfHwgbm9kZS5wYXJhbS5tZXRob2RzW1wiXCJdO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNvbnN0IHBNYXAgPSBtYXRjaFswXS5wYXJhbXNNYXA7XG5cdFx0XHRcdGlmIChwTWFwPy5bcE1hcD8ubGVuZ3RoIC0gMV0/LlsyXSkgcmV0dXJuIG1hdGNoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobm9kZS53aWxkY2FyZCAmJiBub2RlLndpbGRjYXJkLm1ldGhvZHMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbm9kZS53aWxkY2FyZC5tZXRob2RzW21ldGhvZF0gfHwgbm9kZS53aWxkY2FyZC5tZXRob2RzW1wiXCJdO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNvbnN0IHBNYXAgPSBtYXRjaFswXS5wYXJhbXNNYXA7XG5cdFx0XHRcdGlmIChwTWFwPy5bcE1hcD8ubGVuZ3RoIC0gMV0/LlsyXSkgcmV0dXJuIG1hdGNoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKG5vZGUuc3RhdGljKSB7XG5cdFx0Y29uc3Qgc3RhdGljQ2hpbGQgPSBub2RlLnN0YXRpY1tzZWdtZW50XTtcblx0XHRpZiAoc3RhdGljQ2hpbGQpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBzdGF0aWNDaGlsZCwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRcdGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoO1xuXHRcdH1cblx0fVxuXHRpZiAobm9kZS5wYXJhbSkge1xuXHRcdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBub2RlLnBhcmFtLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEpO1xuXHRcdGlmIChtYXRjaCkge1xuXHRcdFx0aWYgKG5vZGUucGFyYW0uaGFzUmVnZXhQYXJhbSkge1xuXHRcdFx0XHRjb25zdCBleGFjdE1hdGNoID0gbWF0Y2guZmluZCgobSkgPT4gbS5wYXJhbXNSZWdleHBbaW5kZXhdPy50ZXN0KHNlZ21lbnQpKSB8fCBtYXRjaC5maW5kKChtKSA9PiAhbS5wYXJhbXNSZWdleHBbaW5kZXhdKTtcblx0XHRcdFx0cmV0dXJuIGV4YWN0TWF0Y2ggPyBbZXhhY3RNYXRjaF0gOiB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fVxuXHR9XG5cdGlmIChub2RlLndpbGRjYXJkICYmIG5vZGUud2lsZGNhcmQubWV0aG9kcykgcmV0dXJuIG5vZGUud2lsZGNhcmQubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUud2lsZGNhcmQubWV0aG9kc1tcIlwiXTtcbn1cblxuLyoqXG4qIFJlbW92ZSBhIHJvdXRlIGZyb20gdGhlIHJvdXRlciBjb250ZXh0LlxuKi9cbmZ1bmN0aW9uIHJlbW92ZVJvdXRlKGN0eCwgbWV0aG9kLCBwYXRoKSB7XG5cdGNvbnN0IHNlZ21lbnRzID0gc3BsaXRQYXRoKHBhdGgpO1xuXHRyZXR1cm4gX3JlbW92ZShjdHgucm9vdCwgbWV0aG9kIHx8IFwiXCIsIHNlZ21lbnRzLCAwKTtcbn1cbmZ1bmN0aW9uIF9yZW1vdmUobm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgpIHtcblx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGgpIHtcblx0XHRpZiAobm9kZS5tZXRob2RzICYmIG1ldGhvZCBpbiBub2RlLm1ldGhvZHMpIHtcblx0XHRcdGRlbGV0ZSBub2RlLm1ldGhvZHNbbWV0aG9kXTtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhub2RlLm1ldGhvZHMpLmxlbmd0aCA9PT0gMCkgbm9kZS5tZXRob2RzID0gdm9pZCAwO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKHNlZ21lbnQgPT09IFwiKlwiKSB7XG5cdFx0aWYgKG5vZGUucGFyYW0pIHtcblx0XHRcdF9yZW1vdmUobm9kZS5wYXJhbSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRcdGlmIChfaXNFbXB0eU5vZGUobm9kZS5wYXJhbSkpIG5vZGUucGFyYW0gPSB2b2lkIDA7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKipcIikpIHtcblx0XHRpZiAobm9kZS53aWxkY2FyZCkge1xuXHRcdFx0X3JlbW92ZShub2RlLndpbGRjYXJkLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEpO1xuXHRcdFx0aWYgKF9pc0VtcHR5Tm9kZShub2RlLndpbGRjYXJkKSkgbm9kZS53aWxkY2FyZCA9IHZvaWQgMDtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IGNoaWxkTm9kZSA9IG5vZGUuc3RhdGljPy5bc2VnbWVudF07XG5cdGlmIChjaGlsZE5vZGUpIHtcblx0XHRfcmVtb3ZlKGNoaWxkTm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRpZiAoX2lzRW1wdHlOb2RlKGNoaWxkTm9kZSkpIHtcblx0XHRcdGRlbGV0ZSBub2RlLnN0YXRpY1tzZWdtZW50XTtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhub2RlLnN0YXRpYykubGVuZ3RoID09PSAwKSBub2RlLnN0YXRpYyA9IHZvaWQgMDtcblx0XHR9XG5cdH1cbn1cbmZ1bmN0aW9uIF9pc0VtcHR5Tm9kZShub2RlKSB7XG5cdHJldHVybiBub2RlLm1ldGhvZHMgPT09IHZvaWQgMCAmJiBub2RlLnN0YXRpYyA9PT0gdm9pZCAwICYmIG5vZGUucGFyYW0gPT09IHZvaWQgMCAmJiBub2RlLndpbGRjYXJkID09PSB2b2lkIDA7XG59XG5cbi8qKlxuKiBGaW5kIGFsbCByb3V0ZSBwYXR0ZXJucyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXRoLlxuKi9cbmZ1bmN0aW9uIGZpbmRBbGxSb3V0ZXMoY3R4LCBtZXRob2QgPSBcIlwiLCBwYXRoLCBvcHRzKSB7XG5cdGlmIChwYXRoLmNoYXJDb2RlQXQocGF0aC5sZW5ndGggLSAxKSA9PT0gNDcpIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcblx0Y29uc3Qgc2VnbWVudHMgPSBzcGxpdFBhdGgocGF0aCk7XG5cdGNvbnN0IG1hdGNoZXMgPSBfZmluZEFsbChjdHgsIGN0eC5yb290LCBtZXRob2QsIHNlZ21lbnRzLCAwKTtcblx0aWYgKG9wdHM/LnBhcmFtcyA9PT0gZmFsc2UpIHJldHVybiBtYXRjaGVzO1xuXHRyZXR1cm4gbWF0Y2hlcy5tYXAoKG0pID0+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZGF0YTogbS5kYXRhLFxuXHRcdFx0cGFyYW1zOiBtLnBhcmFtc01hcCA/IGdldE1hdGNoUGFyYW1zKHNlZ21lbnRzLCBtLnBhcmFtc01hcCkgOiB2b2lkIDBcblx0XHR9O1xuXHR9KTtcbn1cbmZ1bmN0aW9uIF9maW5kQWxsKGN0eCwgbm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgsIG1hdGNoZXMgPSBbXSkge1xuXHRjb25zdCBzZWdtZW50ID0gc2VnbWVudHNbaW5kZXhdO1xuXHRpZiAobm9kZS53aWxkY2FyZCAmJiBub2RlLndpbGRjYXJkLm1ldGhvZHMpIHtcblx0XHRjb25zdCBtYXRjaCA9IG5vZGUud2lsZGNhcmQubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUud2lsZGNhcmQubWV0aG9kc1tcIlwiXTtcblx0XHRpZiAobWF0Y2gpIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdH1cblx0aWYgKG5vZGUucGFyYW0pIHtcblx0XHRfZmluZEFsbChjdHgsIG5vZGUucGFyYW0sIG1ldGhvZCwgc2VnbWVudHMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7XG5cdFx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGggJiYgbm9kZS5wYXJhbS5tZXRob2RzKSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IG5vZGUucGFyYW0ubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUucGFyYW0ubWV0aG9kc1tcIlwiXTtcblx0XHRcdGlmIChtYXRjaCkge1xuXHRcdFx0XHRjb25zdCBwTWFwID0gbWF0Y2hbMF0ucGFyYW1zTWFwO1xuXHRcdFx0XHRpZiAocE1hcD8uW3BNYXA/Lmxlbmd0aCAtIDFdPy5bMl0pIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHN0YXRpY0NoaWxkID0gbm9kZS5zdGF0aWM/LltzZWdtZW50XTtcblx0aWYgKHN0YXRpY0NoaWxkKSBfZmluZEFsbChjdHgsIHN0YXRpY0NoaWxkLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEsIG1hdGNoZXMpO1xuXHRpZiAoaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAmJiBub2RlLm1ldGhvZHMpIHtcblx0XHRjb25zdCBtYXRjaCA9IG5vZGUubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUubWV0aG9kc1tcIlwiXTtcblx0XHRpZiAobWF0Y2gpIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdH1cblx0cmV0dXJuIG1hdGNoZXM7XG59XG5cbmZ1bmN0aW9uIHJvdXRlVG9SZWdFeHAocm91dGUgPSBcIi9cIikge1xuXHRjb25zdCByZVNlZ21lbnRzID0gW107XG5cdGxldCBpZEN0ciA9IDA7XG5cdGZvciAoY29uc3Qgc2VnbWVudCBvZiByb3V0ZS5zcGxpdChcIi9cIikpIHtcblx0XHRpZiAoIXNlZ21lbnQpIGNvbnRpbnVlO1xuXHRcdGlmIChzZWdtZW50ID09PSBcIipcIikgcmVTZWdtZW50cy5wdXNoKGAoPzxfJHtpZEN0cisrfT5bXi9dKilgKTtcblx0XHRlbHNlIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCIqKlwiKSkgcmVTZWdtZW50cy5wdXNoKHNlZ21lbnQgPT09IFwiKipcIiA/IFwiPyg/PF8+LiopXCIgOiBgPyg/PCR7c2VnbWVudC5zbGljZSgzKX0+LispYCk7XG5cdFx0ZWxzZSBpZiAoc2VnbWVudC5pbmNsdWRlcyhcIjpcIikpIHJlU2VnbWVudHMucHVzaChzZWdtZW50LnJlcGxhY2UoLzooXFx3KykvZywgKF8sIGlkKSA9PiBgKD88JHtpZH0+W14vXSspYCkucmVwbGFjZSgvXFwuL2csIFwiXFxcXC5cIikpO1xuXHRcdGVsc2UgcmVTZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuXHR9XG5cdHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IFJlZ0V4cChgXi8ke3JlU2VnbWVudHMuam9pbihcIi9cIil9Lz8kYCk7XG59XG5cbmV4cG9ydCB7IE51bGxQcm90b09iaiwgYWRkUm91dGUsIGNyZWF0ZVJvdXRlciwgZmluZEFsbFJvdXRlcywgZmluZFJvdXRlLCByZW1vdmVSb3V0ZSwgcm91dGVUb1JlZ0V4cCB9OyIsImltcG9ydCB7IHN0YW5kYXJkaXplSFRUUFBhdGgsIFN0YW5kYXJkT3BlbkFQSUpzb25TZXJpYWxpemVyLCBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIsIFN0YW5kYXJkT3BlbkFQSVNlcmlhbGl6ZXIgfSBmcm9tICdAb3JwYy9vcGVuYXBpLWNsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgeyBTdGFuZGFyZEhhbmRsZXIgfSBmcm9tICdAb3JwYy9zZXJ2ZXIvc3RhbmRhcmQnO1xuaW1wb3J0IHsgaXNPUlBDRXJyb3JTdGF0dXMgfSBmcm9tICdAb3JwYy9jbGllbnQnO1xuaW1wb3J0IHsgZmFsbGJhY2tDb250cmFjdENvbmZpZyB9IGZyb20gJ0BvcnBjL2NvbnRyYWN0JztcbmltcG9ydCB7IGlzT2JqZWN0LCBzdHJpbmdpZnlKU09OLCB0cnlEZWNvZGVVUklDb21wb25lbnQsIHZhbHVlIH0gZnJvbSAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IHRvSHR0cFBhdGggfSBmcm9tICdAb3JwYy9jbGllbnQvc3RhbmRhcmQnO1xuaW1wb3J0IHsgdHJhdmVyc2VDb250cmFjdFByb2NlZHVyZXMsIGlzUHJvY2VkdXJlLCBnZXRMYXp5TWV0YSwgdW5sYXp5LCBnZXRSb3V0ZXIsIGNyZWF0ZUNvbnRyYWN0ZWRQcm9jZWR1cmUgfSBmcm9tICdAb3JwYy9zZXJ2ZXInO1xuaW1wb3J0IHsgY3JlYXRlUm91dGVyLCBhZGRSb3V0ZSwgZmluZFJvdXRlIH0gZnJvbSAncm91Myc7XG5cbmNsYXNzIFN0YW5kYXJkT3BlbkFQSUNvZGVjIHtcbiAgY29uc3RydWN0b3Ioc2VyaWFsaXplciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5zZXJpYWxpemVyID0gc2VyaWFsaXplcjtcbiAgICB0aGlzLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2RlciA9IG9wdGlvbnMuY3VzdG9tRXJyb3JSZXNwb25zZUJvZHlFbmNvZGVyO1xuICB9XG4gIGN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2RlcjtcbiAgYXN5bmMgZGVjb2RlKHJlcXVlc3QsIHBhcmFtcywgcHJvY2VkdXJlKSB7XG4gICAgY29uc3QgaW5wdXRTdHJ1Y3R1cmUgPSBmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdElucHV0U3RydWN0dXJlXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLmlucHV0U3RydWN0dXJlKTtcbiAgICBpZiAoaW5wdXRTdHJ1Y3R1cmUgPT09IFwiY29tcGFjdFwiKSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIgPyB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVxdWVzdC51cmwuc2VhcmNoUGFyYW1zKSA6IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhd2FpdCByZXF1ZXN0LmJvZHkoKSk7XG4gICAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgLi4uZGF0YVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGRlc2VyaWFsaXplU2VhcmNoUGFyYW1zID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXF1ZXN0LnVybC5zZWFyY2hQYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtcyxcbiAgICAgIGdldCBxdWVyeSgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkZXNlcmlhbGl6ZVNlYXJjaFBhcmFtcygpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJxdWVyeVwiLCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldCBxdWVyeSh2YWx1ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJxdWVyeVwiLCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgIH0sXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICBib2R5OiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYXdhaXQgcmVxdWVzdC5ib2R5KCkpXG4gICAgfTtcbiAgfVxuICBlbmNvZGUob3V0cHV0LCBwcm9jZWR1cmUpIHtcbiAgICBjb25zdCBzdWNjZXNzU3RhdHVzID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRTdWNjZXNzU3RhdHVzXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLnN1Y2Nlc3NTdGF0dXMpO1xuICAgIGNvbnN0IG91dHB1dFN0cnVjdHVyZSA9IGZhbGxiYWNrQ29udHJhY3RDb25maWcoXCJkZWZhdWx0T3V0cHV0U3RydWN0dXJlXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLm91dHB1dFN0cnVjdHVyZSk7XG4gICAgaWYgKG91dHB1dFN0cnVjdHVyZSA9PT0gXCJjb21wYWN0XCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogc3VjY2Vzc1N0YXR1cyxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUob3V0cHV0KVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNpc0RldGFpbGVkT3V0cHV0KG91dHB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgIEludmFsaWQgXCJkZXRhaWxlZFwiIG91dHB1dCBzdHJ1Y3R1cmU6XG4gICAgICAgIFxcdTIwMjIgRXhwZWN0ZWQgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgcHJvcGVydGllczpcbiAgICAgICAgICAtIHN0YXR1cyAobnVtYmVyIDIwMC0zOTkpXG4gICAgICAgICAgLSBoZWFkZXJzIChSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4pXG4gICAgICAgICAgLSBib2R5IChhbnkpXG4gICAgICAgIFxcdTIwMjIgTm8gZXh0cmEga2V5cyBhbGxvd2VkLlxuXG4gICAgICAgIEFjdHVhbCB2YWx1ZTpcbiAgICAgICAgICAke3N0cmluZ2lmeUpTT04ob3V0cHV0KX1cbiAgICAgIGApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBvdXRwdXQuc3RhdHVzID8/IHN1Y2Nlc3NTdGF0dXMsXG4gICAgICBoZWFkZXJzOiBvdXRwdXQuaGVhZGVycyA/PyB7fSxcbiAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUob3V0cHV0LmJvZHkpXG4gICAgfTtcbiAgfVxuICBlbmNvZGVFcnJvcihlcnJvcikge1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2Rlcj8uKGVycm9yKSA/PyBlcnJvci50b0pTT04oKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBlcnJvci5zdGF0dXMsXG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoYm9keSwgeyBvdXRwdXRGb3JtYXQ6IFwicGxhaW5cIiB9KVxuICAgIH07XG4gIH1cbiAgI2lzRGV0YWlsZWRPdXRwdXQob3V0cHV0KSB7XG4gICAgaWYgKCFpc09iamVjdChvdXRwdXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuaGVhZGVycyAmJiAhaXNPYmplY3Qob3V0cHV0LmhlYWRlcnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3RhdHVzICE9PSB2b2lkIDAgJiYgKHR5cGVvZiBvdXRwdXQuc3RhdHVzICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG91dHB1dC5zdGF0dXMpIHx8IGlzT1JQQ0Vycm9yU3RhdHVzKG91dHB1dC5zdGF0dXMpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1JvdTNQYXR0ZXJuKHBhdGgpIHtcbiAgcmV0dXJuIHN0YW5kYXJkaXplSFRUUFBhdGgocGF0aCkucmVwbGFjZSgvXFwvXFx7XFwrKFtefV0rKVxcfS9nLCBcIi8qKjokMVwiKS5yZXBsYWNlKC9cXC9cXHsoW159XSspXFx9L2csIFwiLzokMVwiKTtcbn1cbmZ1bmN0aW9uIGRlY29kZVBhcmFtcyhwYXJhbXMpIHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXJhbXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsdWUpXSkpO1xufVxuXG5jbGFzcyBTdGFuZGFyZE9wZW5BUElNYXRjaGVyIHtcbiAgZmlsdGVyO1xuICB0cmVlID0gY3JlYXRlUm91dGVyKCk7XG4gIHBlbmRpbmdSb3V0ZXJzID0gW107XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXIgPz8gdHJ1ZTtcbiAgfVxuICBpbml0KHJvdXRlciwgcGF0aCA9IFtdKSB7XG4gICAgY29uc3QgbGF6aWVkT3B0aW9ucyA9IHRyYXZlcnNlQ29udHJhY3RQcm9jZWR1cmVzKHsgcm91dGVyLCBwYXRoIH0sICh0cmF2ZXJzZU9wdGlvbnMpID0+IHtcbiAgICAgIGlmICghdmFsdWUodGhpcy5maWx0ZXIsIHRyYXZlcnNlT3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXRoOiBwYXRoMiwgY29udHJhY3QgfSA9IHRyYXZlcnNlT3B0aW9ucztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGZhbGxiYWNrQ29udHJhY3RDb25maWcoXCJkZWZhdWx0TWV0aG9kXCIsIGNvbnRyYWN0W1wifm9ycGNcIl0ucm91dGUubWV0aG9kKTtcbiAgICAgIGNvbnN0IGh0dHBQYXRoID0gdG9Sb3UzUGF0dGVybihjb250cmFjdFtcIn5vcnBjXCJdLnJvdXRlLnBhdGggPz8gdG9IdHRwUGF0aChwYXRoMikpO1xuICAgICAgaWYgKGlzUHJvY2VkdXJlKGNvbnRyYWN0KSkge1xuICAgICAgICBhZGRSb3V0ZSh0aGlzLnRyZWUsIG1ldGhvZCwgaHR0cFBhdGgsIHtcbiAgICAgICAgICBwYXRoOiBwYXRoMixcbiAgICAgICAgICBjb250cmFjdCxcbiAgICAgICAgICBwcm9jZWR1cmU6IGNvbnRyYWN0LFxuICAgICAgICAgIC8vIHRoaXMgbWVhbiBkZXYgbm90IHVzZWQgY29udHJhY3QtZmlyc3Qgc28gd2UgY2FuIHVzZWQgY29udHJhY3QgYXMgcHJvY2VkdXJlIGRpcmVjdGx5XG4gICAgICAgICAgcm91dGVyXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkUm91dGUodGhpcy50cmVlLCBtZXRob2QsIGh0dHBQYXRoLCB7XG4gICAgICAgICAgcGF0aDogcGF0aDIsXG4gICAgICAgICAgY29udHJhY3QsXG4gICAgICAgICAgcHJvY2VkdXJlOiB2b2lkIDAsXG4gICAgICAgICAgcm91dGVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZ1JvdXRlcnMucHVzaCguLi5sYXppZWRPcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoe1xuICAgICAgLi4ub3B0aW9uLFxuICAgICAgaHR0cFBhdGhQcmVmaXg6IHRvSHR0cFBhdGgob3B0aW9uLnBhdGgpLFxuICAgICAgbGF6aWVkUHJlZml4OiBnZXRMYXp5TWV0YShvcHRpb24ucm91dGVyKS5wcmVmaXhcbiAgICB9KSkpO1xuICB9XG4gIGFzeW5jIG1hdGNoKG1ldGhvZCwgcGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nUm91dGVycy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5ld1BlbmRpbmdSb3V0ZXJzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBlbmRpbmdSb3V0ZXIgb2YgdGhpcy5wZW5kaW5nUm91dGVycykge1xuICAgICAgICBpZiAoIXBlbmRpbmdSb3V0ZXIubGF6aWVkUHJlZml4IHx8IHBhdGhuYW1lLnN0YXJ0c1dpdGgocGVuZGluZ1JvdXRlci5sYXppZWRQcmVmaXgpIHx8IHBhdGhuYW1lLnN0YXJ0c1dpdGgocGVuZGluZ1JvdXRlci5odHRwUGF0aFByZWZpeCkpIHtcbiAgICAgICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlciB9ID0gYXdhaXQgdW5sYXp5KHBlbmRpbmdSb3V0ZXIucm91dGVyKTtcbiAgICAgICAgICB0aGlzLmluaXQocm91dGVyLCBwZW5kaW5nUm91dGVyLnBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1BlbmRpbmdSb3V0ZXJzLnB1c2gocGVuZGluZ1JvdXRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ1JvdXRlcnMgPSBuZXdQZW5kaW5nUm91dGVycztcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBmaW5kUm91dGUodGhpcy50cmVlLCBtZXRob2QsIHBhdGhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoLmRhdGEucHJvY2VkdXJlKSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IG1heWJlUHJvY2VkdXJlIH0gPSBhd2FpdCB1bmxhenkoZ2V0Um91dGVyKG1hdGNoLmRhdGEucm91dGVyLCBtYXRjaC5kYXRhLnBhdGgpKTtcbiAgICAgIGlmICghaXNQcm9jZWR1cmUobWF5YmVQcm9jZWR1cmUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgICAgW0NvbnRyYWN0LUZpcnN0XSBNaXNzaW5nIG9yIGludmFsaWQgaW1wbGVtZW50YXRpb24gZm9yIHByb2NlZHVyZSBhdCBwYXRoOiAke3RvSHR0cFBhdGgobWF0Y2guZGF0YS5wYXRoKX0uXG4gICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHByb2NlZHVyZSBpcyBjb3JyZWN0bHkgZGVmaW5lZCBhbmQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgY29udHJhY3QuXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgICAgbWF0Y2guZGF0YS5wcm9jZWR1cmUgPSBjcmVhdGVDb250cmFjdGVkUHJvY2VkdXJlKG1heWJlUHJvY2VkdXJlLCBtYXRjaC5kYXRhLmNvbnRyYWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IG1hdGNoLmRhdGEucGF0aCxcbiAgICAgIHByb2NlZHVyZTogbWF0Y2guZGF0YS5wcm9jZWR1cmUsXG4gICAgICBwYXJhbXM6IG1hdGNoLnBhcmFtcyA/IGRlY29kZVBhcmFtcyhtYXRjaC5wYXJhbXMpIDogdm9pZCAwXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBTdGFuZGFyZE9wZW5BUElIYW5kbGVyIGV4dGVuZHMgU3RhbmRhcmRIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Iocm91dGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QganNvblNlcmlhbGl6ZXIgPSBuZXcgU3RhbmRhcmRPcGVuQVBJSnNvblNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gICAgY29uc3QgYnJhY2tldE5vdGF0aW9uU2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZE9wZW5BUElTZXJpYWxpemVyKGpzb25TZXJpYWxpemVyLCBicmFja2V0Tm90YXRpb25TZXJpYWxpemVyKTtcbiAgICBjb25zdCBtYXRjaGVyID0gbmV3IFN0YW5kYXJkT3BlbkFQSU1hdGNoZXIob3B0aW9ucyk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgU3RhbmRhcmRPcGVuQVBJQ29kZWMoc2VyaWFsaXplciwgb3B0aW9ucyk7XG4gICAgc3VwZXIocm91dGVyLCBtYXRjaGVyLCBjb2RlYywgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RhbmRhcmRPcGVuQVBJQ29kZWMgYXMgUywgU3RhbmRhcmRPcGVuQVBJSGFuZGxlciBhcyBhLCBTdGFuZGFyZE9wZW5BUElNYXRjaGVyIGFzIGIsIGRlY29kZVBhcmFtcyBhcyBkLCB0b1JvdTNQYXR0ZXJuIGFzIHQgfTtcbiIsImltcG9ydCB7IEZldGNoSGFuZGxlciB9IGZyb20gJ0BvcnBjL3NlcnZlci9mZXRjaCc7XG5pbXBvcnQgJ0BvcnBjL2NsaWVudCc7XG5pbXBvcnQgJ0BvcnBjL2NvbnRyYWN0JztcbmltcG9ydCAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IGEgYXMgU3RhbmRhcmRPcGVuQVBJSGFuZGxlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9vcGVuYXBpLkRJdC1aOVcxLm1qcyc7XG5pbXBvcnQgJ0BvcnBjL2NsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgJ0BvcnBjL3NlcnZlcic7XG5pbXBvcnQgJ3JvdTMnO1xuaW1wb3J0ICdAb3JwYy9vcGVuYXBpLWNsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgJ0BvcnBjL3NlcnZlci9zdGFuZGFyZCc7XG5cbmNsYXNzIE9wZW5BUElIYW5kbGVyIGV4dGVuZHMgRmV0Y2hIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Iocm91dGVyLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihuZXcgU3RhbmRhcmRPcGVuQVBJSGFuZGxlcihyb3V0ZXIsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgeyBPcGVuQVBJSGFuZGxlciB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsTUFBTSxlQUErQix1QkFBTztDQUMzQyxNQUFNLElBQUksV0FBVztBQUNyQixRQUFPLEVBQUUsWUFBWSxPQUFPLE9BQU8sS0FBSyxFQUFFLE9BQU8sT0FBTyxFQUFFLFVBQVUsRUFBRTtJQUNuRTs7OztBQUtKLFNBQVMsZUFBZTtBQUN2QixRQUFPO0VBQ04sTUFBTSxFQUFFLEtBQUssSUFBSTtFQUNqQixRQUFRLElBQUksY0FBYztFQUMxQjs7QUFHRixTQUFTLFVBQVUsTUFBTTtDQUN4QixNQUFNLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxNQUFNLElBQUk7QUFDakMsUUFBTyxFQUFFLEVBQUUsU0FBUyxPQUFPLEtBQUssRUFBRSxNQUFNLEdBQUcsR0FBRyxHQUFHOztBQUVsRCxTQUFTLGVBQWUsVUFBVSxXQUFXO0NBQzVDLE1BQU0sU0FBUyxJQUFJLGNBQWM7QUFDakMsTUFBSyxNQUFNLENBQUMsT0FBTyxTQUFTLFdBQVc7RUFDdEMsTUFBTSxVQUFVLFFBQVEsSUFBSSxTQUFTLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxJQUFJLEdBQUcsU0FBUztBQUM1RSxNQUFJLE9BQU8sU0FBUyxTQUFVLFFBQU8sUUFBUTtPQUN4QztHQUNKLE1BQU0sUUFBUSxRQUFRLE1BQU0sS0FBSztBQUNqQyxPQUFJLE1BQU8sTUFBSyxNQUFNLE9BQU8sTUFBTSxPQUFRLFFBQU8sT0FBTyxNQUFNLE9BQU87OztBQUd4RSxRQUFPOzs7OztBQU1SLFNBQVMsU0FBUyxLQUFLLFNBQVMsSUFBSSxNQUFNLE1BQU07QUFDL0MsVUFBUyxPQUFPLGFBQWE7QUFDN0IsS0FBSSxLQUFLLFdBQVcsRUFBRSxLQUFLLEdBQUksUUFBTyxJQUFJO0NBQzFDLE1BQU0sV0FBVyxVQUFVLEtBQUs7Q0FDaEMsSUFBSSxPQUFPLElBQUk7Q0FDZixJQUFJLHFCQUFxQjtDQUN6QixNQUFNLFlBQVksRUFBRTtDQUNwQixNQUFNLGVBQWUsRUFBRTtBQUN2QixNQUFLLElBQUksSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7RUFDekMsTUFBTSxVQUFVLFNBQVM7QUFDekIsTUFBSSxRQUFRLFdBQVcsS0FBSyxFQUFFO0FBQzdCLE9BQUksQ0FBQyxLQUFLLFNBQVUsTUFBSyxXQUFXLEVBQUUsS0FBSyxNQUFNO0FBQ2pELFVBQU8sS0FBSztBQUNaLGFBQVUsS0FBSztJQUNkLENBQUM7SUFDRCxRQUFRLE1BQU0sSUFBSSxDQUFDLE1BQU07SUFDekIsUUFBUSxXQUFXO0lBQ25CLENBQUM7QUFDRjs7QUFFRCxNQUFJLFlBQVksT0FBTyxRQUFRLFNBQVMsSUFBSSxFQUFFO0FBQzdDLE9BQUksQ0FBQyxLQUFLLE1BQU8sTUFBSyxRQUFRLEVBQUUsS0FBSyxLQUFLO0FBQzFDLFVBQU8sS0FBSztBQUNaLE9BQUksWUFBWSxJQUFLLFdBQVUsS0FBSztJQUNuQztJQUNBLElBQUk7SUFDSjtJQUNBLENBQUM7WUFDTyxRQUFRLFNBQVMsS0FBSyxFQUFFLEVBQUU7SUFDbEMsTUFBTSxTQUFTLGVBQWUsUUFBUTtBQUN0QyxpQkFBYSxLQUFLO0FBQ2xCLFNBQUssZ0JBQWdCO0FBQ3JCLGNBQVUsS0FBSztLQUNkO0tBQ0E7S0FDQTtLQUNBLENBQUM7U0FDSSxXQUFVLEtBQUs7SUFDckI7SUFDQSxRQUFRLE1BQU0sRUFBRTtJQUNoQjtJQUNBLENBQUM7QUFDRjs7RUFFRCxNQUFNLFFBQVEsS0FBSyxTQUFTO0FBQzVCLE1BQUksTUFBTyxRQUFPO09BQ2I7R0FDSixNQUFNLGFBQWEsRUFBRSxLQUFLLFNBQVM7QUFDbkMsT0FBSSxDQUFDLEtBQUssT0FBUSxNQUFLLFNBQVMsSUFBSSxjQUFjO0FBQ2xELFFBQUssT0FBTyxXQUFXO0FBQ3ZCLFVBQU87OztDQUdULE1BQU0sWUFBWSxVQUFVLFNBQVM7QUFDckMsS0FBSSxDQUFDLEtBQUssUUFBUyxNQUFLLFVBQVUsSUFBSSxjQUFjO0FBQ3BELE1BQUssUUFBUSxZQUFZLEVBQUU7QUFDM0IsTUFBSyxRQUFRLFFBQVEsS0FBSztFQUN6QixNQUFNLFFBQVE7RUFDZDtFQUNBLFdBQVcsWUFBWSxZQUFZLEtBQUs7RUFDeEMsQ0FBQztBQUNGLEtBQUksQ0FBQyxVQUFXLEtBQUksT0FBTyxRQUFROztBQUVwQyxTQUFTLGVBQWUsU0FBUztDQUNoQyxNQUFNLFFBQVEsUUFBUSxRQUFRLFlBQVksR0FBRyxPQUFPLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxPQUFPLE1BQU07QUFDNUYsd0JBQXVCLElBQUksT0FBTyxJQUFJLE1BQU0sR0FBRzs7Ozs7QUFNaEQsU0FBUyxVQUFVLEtBQUssU0FBUyxJQUFJLE1BQU0sTUFBTTtBQUNoRCxLQUFJLEtBQUssV0FBVyxLQUFLLFNBQVMsRUFBRSxLQUFLLEdBQUksUUFBTyxLQUFLLE1BQU0sR0FBRyxHQUFHO0NBQ3JFLE1BQU0sYUFBYSxJQUFJLE9BQU87QUFDOUIsS0FBSSxjQUFjLFdBQVcsU0FBUztFQUNyQyxNQUFNLGNBQWMsV0FBVyxRQUFRLFdBQVcsV0FBVyxRQUFRO0FBQ3JFLE1BQUksZ0JBQWdCLEtBQUssRUFBRyxRQUFPLFlBQVk7O0NBRWhELE1BQU0sV0FBVyxVQUFVLEtBQUs7Q0FDaEMsTUFBTSxRQUFRLFlBQVksS0FBSyxJQUFJLE1BQU0sUUFBUSxVQUFVLEVBQUUsR0FBRztBQUNoRSxLQUFJLFVBQVUsS0FBSyxFQUFHO0FBQ3RCLEtBQUksTUFBTSxXQUFXLE1BQU8sUUFBTztBQUNuQyxRQUFPO0VBQ04sTUFBTSxNQUFNO0VBQ1osUUFBUSxNQUFNLFlBQVksZUFBZSxVQUFVLE1BQU0sVUFBVSxHQUFHLEtBQUs7RUFDM0U7O0FBRUYsU0FBUyxZQUFZLEtBQUssTUFBTSxRQUFRLFVBQVUsT0FBTztBQUN4RCxLQUFJLFVBQVUsU0FBUyxRQUFRO0FBQzlCLE1BQUksS0FBSyxTQUFTO0dBQ2pCLE1BQU0sUUFBUSxLQUFLLFFBQVEsV0FBVyxLQUFLLFFBQVE7QUFDbkQsT0FBSSxNQUFPLFFBQU87O0FBRW5CLE1BQUksS0FBSyxTQUFTLEtBQUssTUFBTSxTQUFTO0dBQ3JDLE1BQU0sUUFBUSxLQUFLLE1BQU0sUUFBUSxXQUFXLEtBQUssTUFBTSxRQUFRO0FBQy9ELE9BQUksT0FBTztJQUNWLE1BQU0sT0FBTyxNQUFNLEdBQUc7QUFDdEIsUUFBSSxPQUFPLE1BQU0sU0FBUyxLQUFLLEdBQUksUUFBTzs7O0FBRzVDLE1BQUksS0FBSyxZQUFZLEtBQUssU0FBUyxTQUFTO0dBQzNDLE1BQU0sUUFBUSxLQUFLLFNBQVMsUUFBUSxXQUFXLEtBQUssU0FBUyxRQUFRO0FBQ3JFLE9BQUksT0FBTztJQUNWLE1BQU0sT0FBTyxNQUFNLEdBQUc7QUFDdEIsUUFBSSxPQUFPLE1BQU0sU0FBUyxLQUFLLEdBQUksUUFBTzs7O0FBRzVDOztDQUVELE1BQU0sVUFBVSxTQUFTO0FBQ3pCLEtBQUksS0FBSyxRQUFRO0VBQ2hCLE1BQU0sY0FBYyxLQUFLLE9BQU87QUFDaEMsTUFBSSxhQUFhO0dBQ2hCLE1BQU0sUUFBUSxZQUFZLEtBQUssYUFBYSxRQUFRLFVBQVUsUUFBUSxFQUFFO0FBQ3hFLE9BQUksTUFBTyxRQUFPOzs7QUFHcEIsS0FBSSxLQUFLLE9BQU87RUFDZixNQUFNLFFBQVEsWUFBWSxLQUFLLEtBQUssT0FBTyxRQUFRLFVBQVUsUUFBUSxFQUFFO0FBQ3ZFLE1BQUksT0FBTztBQUNWLE9BQUksS0FBSyxNQUFNLGVBQWU7SUFDN0IsTUFBTSxhQUFhLE1BQU0sTUFBTSxNQUFNLEVBQUUsYUFBYSxRQUFRLEtBQUssUUFBUSxDQUFDLElBQUksTUFBTSxNQUFNLE1BQU0sQ0FBQyxFQUFFLGFBQWEsT0FBTztBQUN2SCxXQUFPLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSzs7QUFFekMsVUFBTzs7O0FBR1QsS0FBSSxLQUFLLFlBQVksS0FBSyxTQUFTLFFBQVMsUUFBTyxLQUFLLFNBQVMsUUFBUSxXQUFXLEtBQUssU0FBUyxRQUFROzs7OztBQ3pKM0csSUFBTSx1QkFBTixNQUEyQjtDQUN6QixZQUFZLFlBQVksVUFBVSxFQUFFLEVBQUU7QUFDcEMsT0FBSyxhQUFhO0FBQ2xCLE9BQUssaUNBQWlDLFFBQVE7O0NBRWhEO0NBQ0EsTUFBTSxPQUFPLFNBQVMsUUFBUSxXQUFXO0FBRXZDLE1BRHVCLHVCQUF1Qix5QkFBeUIsVUFBVSxTQUFTLE1BQU0sZUFBZSxLQUN4RixXQUFXO0dBQ2hDLE1BQU0sT0FBTyxRQUFRLFdBQVcsUUFBUSxLQUFLLFdBQVcsWUFBWSxRQUFRLElBQUksYUFBYSxHQUFHLEtBQUssV0FBVyxZQUFZLE1BQU0sUUFBUSxNQUFNLENBQUM7QUFDakosT0FBSSxTQUFTLEtBQUssRUFDaEIsUUFBTztBQUVULE9BQUksU0FBUyxLQUFLLENBQ2hCLFFBQU87SUFDTCxHQUFHO0lBQ0gsR0FBRztJQUNKO0FBRUgsVUFBTzs7RUFFVCxNQUFNLGdDQUFnQztBQUNwQyxVQUFPLEtBQUssV0FBVyxZQUFZLFFBQVEsSUFBSSxhQUFhOztBQUU5RCxTQUFPO0dBQ0w7R0FDQSxJQUFJLFFBQVE7SUFDVixNQUFNQSxVQUFRLHlCQUF5QjtBQUN2QyxXQUFPLGVBQWUsTUFBTSxTQUFTO0tBQUU7S0FBTyxVQUFVO0tBQU0sQ0FBQztBQUMvRCxXQUFPQTs7R0FFVCxJQUFJLE1BQU0sU0FBTztBQUNmLFdBQU8sZUFBZSxNQUFNLFNBQVM7S0FBRTtLQUFPLFVBQVU7S0FBTSxDQUFDOztHQUVqRSxTQUFTLFFBQVE7R0FDakIsTUFBTSxLQUFLLFdBQVcsWUFBWSxNQUFNLFFBQVEsTUFBTSxDQUFDO0dBQ3hEOztDQUVILE9BQU8sUUFBUSxXQUFXO0VBQ3hCLE1BQU0sZ0JBQWdCLHVCQUF1Qix3QkFBd0IsVUFBVSxTQUFTLE1BQU0sY0FBYztBQUU1RyxNQUR3Qix1QkFBdUIsMEJBQTBCLFVBQVUsU0FBUyxNQUFNLGdCQUFnQixLQUMxRixVQUN0QixRQUFPO0dBQ0wsUUFBUTtHQUNSLFNBQVMsRUFBRTtHQUNYLE1BQU0sS0FBSyxXQUFXLFVBQVUsT0FBTztHQUN4QztBQUVILE1BQUksQ0FBQyxNQUFLQyxpQkFBa0IsT0FBTyxDQUNqQyxPQUFNLElBQUksTUFBTTs7Ozs7Ozs7O1lBU1YsY0FBYyxPQUFPLENBQUM7UUFDMUI7QUFFSixTQUFPO0dBQ0wsUUFBUSxPQUFPLFVBQVU7R0FDekIsU0FBUyxPQUFPLFdBQVcsRUFBRTtHQUM3QixNQUFNLEtBQUssV0FBVyxVQUFVLE9BQU8sS0FBSztHQUM3Qzs7Q0FFSCxZQUFZLE9BQU87RUFDakIsTUFBTSxPQUFPLEtBQUssaUNBQWlDLE1BQU0sSUFBSSxNQUFNLFFBQVE7QUFDM0UsU0FBTztHQUNMLFFBQVEsTUFBTTtHQUNkLFNBQVMsRUFBRTtHQUNYLE1BQU0sS0FBSyxXQUFXLFVBQVUsTUFBTSxFQUFFLGNBQWMsU0FBUyxDQUFDO0dBQ2pFOztDQUVILGtCQUFrQixRQUFRO0FBQ3hCLE1BQUksQ0FBQyxTQUFTLE9BQU8sQ0FDbkIsUUFBTztBQUVULE1BQUksT0FBTyxXQUFXLENBQUMsU0FBUyxPQUFPLFFBQVEsQ0FDN0MsUUFBTztBQUVULE1BQUksT0FBTyxXQUFXLEtBQUssTUFBTSxPQUFPLE9BQU8sV0FBVyxZQUFZLENBQUMsT0FBTyxVQUFVLE9BQU8sT0FBTyxJQUFJLGtCQUFrQixPQUFPLE9BQU8sRUFDeEksUUFBTztBQUVULFNBQU87OztBQUlYLFNBQVMsY0FBYyxNQUFNO0FBQzNCLFFBQU8sb0JBQW9CLEtBQUssQ0FBQyxRQUFRLG9CQUFvQixTQUFTLENBQUMsUUFBUSxrQkFBa0IsT0FBTzs7QUFFMUcsU0FBUyxhQUFhLFFBQVE7QUFDNUIsUUFBTyxPQUFPLFlBQVksT0FBTyxRQUFRLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBS0QsYUFBVyxDQUFDLEtBQUssc0JBQXNCQSxRQUFNLENBQUMsQ0FBQyxDQUFDOztBQUc5RyxJQUFNLHlCQUFOLE1BQTZCO0NBQzNCO0NBQ0EsT0FBTyxjQUFjO0NBQ3JCLGlCQUFpQixFQUFFO0NBQ25CLFlBQVksVUFBVSxFQUFFLEVBQUU7QUFDeEIsT0FBSyxTQUFTLFFBQVEsVUFBVTs7Q0FFbEMsS0FBSyxRQUFRLE9BQU8sRUFBRSxFQUFFO0VBQ3RCLE1BQU0sZ0JBQWdCLDJCQUEyQjtHQUFFO0dBQVE7R0FBTSxHQUFHLG9CQUFvQjtBQUN0RixPQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsZ0JBQWdCLENBQ3RDO0dBRUYsTUFBTSxFQUFFLE1BQU0sT0FBTyxhQUFhO0dBQ2xDLE1BQU0sU0FBUyx1QkFBdUIsaUJBQWlCLFNBQVMsU0FBUyxNQUFNLE9BQU87R0FDdEYsTUFBTSxXQUFXLGNBQWMsU0FBUyxTQUFTLE1BQU0sUUFBUSxXQUFXLE1BQU0sQ0FBQztBQUNqRixPQUFJLFlBQVksU0FBUyxDQUN2QixVQUFTLEtBQUssTUFBTSxRQUFRLFVBQVU7SUFDcEMsTUFBTTtJQUNOO0lBQ0EsV0FBVztJQUVYO0lBQ0QsQ0FBQztPQUVGLFVBQVMsS0FBSyxNQUFNLFFBQVEsVUFBVTtJQUNwQyxNQUFNO0lBQ047SUFDQSxXQUFXLEtBQUs7SUFDaEI7SUFDRCxDQUFDO0lBRUo7QUFDRixPQUFLLGVBQWUsS0FBSyxHQUFHLGNBQWMsS0FBSyxZQUFZO0dBQ3pELEdBQUc7R0FDSCxnQkFBZ0IsV0FBVyxPQUFPLEtBQUs7R0FDdkMsY0FBYyxZQUFZLE9BQU8sT0FBTyxDQUFDO0dBQzFDLEVBQUUsQ0FBQzs7Q0FFTixNQUFNLE1BQU0sUUFBUSxVQUFVO0FBQzVCLE1BQUksS0FBSyxlQUFlLFFBQVE7R0FDOUIsTUFBTSxvQkFBb0IsRUFBRTtBQUM1QixRQUFLLE1BQU0saUJBQWlCLEtBQUssZUFDL0IsS0FBSSxDQUFDLGNBQWMsZ0JBQWdCLFNBQVMsV0FBVyxjQUFjLGFBQWEsSUFBSSxTQUFTLFdBQVcsY0FBYyxlQUFlLEVBQUU7SUFDdkksTUFBTSxFQUFFLFNBQVMsV0FBVyxNQUFNLE9BQU8sY0FBYyxPQUFPO0FBQzlELFNBQUssS0FBSyxRQUFRLGNBQWMsS0FBSztTQUVyQyxtQkFBa0IsS0FBSyxjQUFjO0FBR3pDLFFBQUssaUJBQWlCOztFQUV4QixNQUFNLFFBQVEsVUFBVSxLQUFLLE1BQU0sUUFBUSxTQUFTO0FBQ3BELE1BQUksQ0FBQyxNQUNIO0FBRUYsTUFBSSxDQUFDLE1BQU0sS0FBSyxXQUFXO0dBQ3pCLE1BQU0sRUFBRSxTQUFTLG1CQUFtQixNQUFNLE9BQU8sVUFBVSxNQUFNLEtBQUssUUFBUSxNQUFNLEtBQUssS0FBSyxDQUFDO0FBQy9GLE9BQUksQ0FBQyxZQUFZLGVBQWUsQ0FDOUIsT0FBTSxJQUFJLE1BQU07c0ZBQzhELFdBQVcsTUFBTSxLQUFLLEtBQUssQ0FBQzs7VUFFeEc7QUFFSixTQUFNLEtBQUssWUFBWSwwQkFBMEIsZ0JBQWdCLE1BQU0sS0FBSyxTQUFTOztBQUV2RixTQUFPO0dBQ0wsTUFBTSxNQUFNLEtBQUs7R0FDakIsV0FBVyxNQUFNLEtBQUs7R0FDdEIsUUFBUSxNQUFNLFNBQVMsYUFBYSxNQUFNLE9BQU8sR0FBRyxLQUFLO0dBQzFEOzs7QUFJTCxJQUFNLHlCQUFOLGNBQXFDLGdCQUFnQjtDQUNuRCxZQUFZLFFBQVEsU0FBUztFQUczQixNQUFNLGFBQWEsSUFBSSwwQkFGQSxJQUFJLDhCQUE4QixRQUFRLEVBQy9CLElBQUksa0NBQWtDLFFBQVEsQ0FDVztFQUMzRixNQUFNLFVBQVUsSUFBSSx1QkFBdUIsUUFBUTtFQUNuRCxNQUFNLFFBQVEsSUFBSSxxQkFBcUIsWUFBWSxRQUFRO0FBQzNELFFBQU0sUUFBUSxTQUFTLE9BQU8sUUFBUTs7Ozs7O0FDOUsxQyxJQUFNLGlCQUFOLGNBQTZCLGFBQWE7Q0FDeEMsWUFBWSxRQUFRLFVBQVUsRUFBRSxFQUFFO0FBQ2hDLFFBQU0sSUFBSSx1QkFBdUIsUUFBUSxRQUFRLEVBQUUsUUFBUSJ9