@effect-app/infra 0.108.4 → 0.109.0

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 (60) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/_cjs/RequestContext.cjs +2 -2
  3. package/_cjs/RequestContext.cjs.map +1 -1
  4. package/_cjs/api/setupRequest.cjs +1 -1
  5. package/_cjs/api/setupRequest.cjs.map +1 -1
  6. package/_cjs/services/Operations/live.cjs +1 -1
  7. package/_cjs/services/Operations/live.cjs.map +1 -1
  8. package/_cjs/services/QueueMaker/memQueue.cjs +1 -1
  9. package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
  10. package/_cjs/services/QueueMaker/sbqueue.cjs +1 -1
  11. package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
  12. package/_cjs/services/RequestContextContainer.cjs +1 -1
  13. package/_cjs/services/RequestContextContainer.cjs.map +1 -1
  14. package/_src/RequestContext.ts +2 -2
  15. package/_src/api/setupRequest.ts +1 -1
  16. package/_src/services/Emailer/service.ts +2 -2
  17. package/_src/services/Operations/live.ts +3 -3
  18. package/_src/services/QueueMaker/memQueue.ts +1 -1
  19. package/_src/services/QueueMaker/sbqueue.ts +1 -1
  20. package/_src/services/RequestContextContainer.ts +1 -1
  21. package/dist/RequestContext.d.ts +11 -11
  22. package/dist/RequestContext.js +3 -3
  23. package/dist/api/setupRequest.js +2 -2
  24. package/dist/services/Emailer/service.d.ts +3 -3
  25. package/dist/services/Emailer/service.d.ts.map +1 -1
  26. package/dist/services/Operations/live.js +4 -4
  27. package/dist/services/QueueMaker/memQueue.js +2 -2
  28. package/dist/services/QueueMaker/sbqueue.js +2 -2
  29. package/dist/services/RepositoryBase.d.ts +1 -1
  30. package/dist/services/RequestContextContainer.d.ts +4 -4
  31. package/dist/services/RequestContextContainer.js +2 -2
  32. package/dist/services/simpledb/cosmosdb.d.ts +2 -2
  33. package/dist/services/simpledb/diskdb.d.ts +2 -2
  34. package/dist/services/simpledb/memdb.d.ts +2 -2
  35. package/dist/services/simpledb/mongodb.d.ts +2 -2
  36. package/dist/services/simpledb/redisdb.d.ts +2 -2
  37. package/dist/services/simpledb/simpledb.d.ts +3 -3
  38. package/package.json +4 -4
  39. package/.cache/effect/095519d034161945a8d2616a506d3e7f35a9b3d868814f44c747429c60fc4e7f.content +0 -275
  40. package/.cache/effect/095519d034161945a8d2616a506d3e7f35a9b3d868814f44c747429c60fc4e7f.hash +0 -1
  41. package/.cache/effect/134218688132dfbdea493cbe1f26e73449f2759121df35ddd5448346b59c9a8d.content +0 -43
  42. package/.cache/effect/134218688132dfbdea493cbe1f26e73449f2759121df35ddd5448346b59c9a8d.hash +0 -1
  43. package/.cache/effect/14eb9da4ca6d22162888c7fdb7f39ab772d2a2dc6625db6031ecdb32ac89158f.content +0 -122
  44. package/.cache/effect/14eb9da4ca6d22162888c7fdb7f39ab772d2a2dc6625db6031ecdb32ac89158f.hash +0 -1
  45. package/.cache/effect/1bfd92946b11da4292f2ed99dc0e322462b60559148f9524abc20e26f70779e1.content +0 -86
  46. package/.cache/effect/1bfd92946b11da4292f2ed99dc0e322462b60559148f9524abc20e26f70779e1.hash +0 -1
  47. package/.cache/effect/49c1bd9ec26e6df78b994d8df0bfe21b119803fa4aa46349bf4679fd0f1e7cda.content +0 -49
  48. package/.cache/effect/49c1bd9ec26e6df78b994d8df0bfe21b119803fa4aa46349bf4679fd0f1e7cda.hash +0 -1
  49. package/.cache/effect/58d4ccde8bd2db7829706db5bebd01b99900ee83f0f6a8413b53d17cbd69f510.content +0 -70
  50. package/.cache/effect/58d4ccde8bd2db7829706db5bebd01b99900ee83f0f6a8413b53d17cbd69f510.hash +0 -1
  51. package/.cache/effect/72a5a16a6b62b63cd71719c833091128207d7e6c823cb32293549b3dd58c451b.content +0 -178
  52. package/.cache/effect/72a5a16a6b62b63cd71719c833091128207d7e6c823cb32293549b3dd58c451b.hash +0 -1
  53. package/.cache/effect/7a9c33db6aedaf00093a132c1d4e48e9d043cef05e932b8a37da24d44e224248.content +0 -57
  54. package/.cache/effect/7a9c33db6aedaf00093a132c1d4e48e9d043cef05e932b8a37da24d44e224248.hash +0 -1
  55. package/.cache/effect/8594f0f42afc0641b00e88998000cc47382a1d07da31f4a148f7976701ca22d5.content +0 -97
  56. package/.cache/effect/8594f0f42afc0641b00e88998000cc47382a1d07da31f4a148f7976701ca22d5.hash +0 -1
  57. package/.cache/effect/c67d971634d2dc8118b40452b61c9a51620c35809be4a89982476aa80701d852.content +0 -11
  58. package/.cache/effect/c67d971634d2dc8118b40452b61c9a51620c35809be4a89982476aa80701d852.hash +0 -1
  59. package/.cache/effect/f38adf43700dab905456a534a0690eaf882cff2cd576c731f23d6d14a3c3d659.content +0 -364
  60. package/.cache/effect/f38adf43700dab905456a534a0690eaf882cff2cd576c731f23d6d14a3c3d659.hash +0 -1
@@ -1,364 +0,0 @@
1
- import * as tsplus_module_1 from "@effect/io/Effect";
2
- import * as tsplus_module_2 from "@effect/data/Option";
3
- import * as tsplus_module_3 from "@effect-app/core/Array";
4
- import * as tsplus_module_4 from "@effect/data/Chunk";
5
- import * as tsplus_module_5 from "@effect-app/core/_ext/Iterable";
6
- import * as tsplus_module_6 from "@effect-app/infra/instrument";
7
- import * as tsplus_module_7 from "@effect-app/prelude/utils";
8
- import * as tsplus_module_8 from "@effect-app/core/Effect";
9
- import * as tsplus_module_9 from "@effect-app/prelude/_ext/misc";
10
- import * as tsplus_module_10 from "@effect/data/typeclass/Equivalence";
11
- import * as tsplus_module_11 from "@effect-app/core/_ext/ord.ext";
12
- /* eslint-disable @typescript-eslint/no-explicit-any */
13
- import { CosmosClient } from "@effect-app/infra-adapters/cosmos-client";
14
- import { omit } from "@effect-app/prelude/utils";
15
- import { OptimisticConcurrencyException } from "../../errors.js";
16
- import { StoreMaker } from "./service.js";
17
- // TODO: Retry operation when running into RU limit.
18
- export function makeCosmosStore({ prefix }) {
19
- return tsplus_module_1.gen(function* ($) {
20
- const { db } = yield* $(CosmosClient);
21
- return {
22
- make: (name, seed, config) => tsplus_module_1.gen(function* ($) {
23
- const containerId = `${prefix}${name}`;
24
- yield* $(tsplus_module_1.promise(() => db.containers.createIfNotExists({
25
- id: containerId,
26
- uniqueKeyPolicy: config?.uniqueKeys
27
- ? { uniqueKeys: config.uniqueKeys }
28
- : undefined
29
- })));
30
- const container = db.container(containerId);
31
- const bulk = container.items.bulk.bind(container.items);
32
- const execBatch = container.items.batch.bind(container.items);
33
- const importedMarkerId = containerId;
34
- const bulkSet = (items) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.gen(function* ($) {
35
- // TODO: disable batching if need atomicity
36
- // we delay and batch to keep low amount of RUs
37
- const b = [...items].map((x) => [
38
- x,
39
- tsplus_module_2.match(tsplus_module_2.fromNullable(x._etag), () => ({
40
- operationType: "Create",
41
- resourceBody: {
42
- ...omit(x, "_etag"),
43
- _partitionKey: config?.partitionValue(x)
44
- },
45
- partitionKey: config?.partitionValue(x)
46
- }), (eTag) => ({
47
- operationType: "Replace",
48
- id: x.id,
49
- resourceBody: {
50
- ...omit(x, "_etag"),
51
- _partitionKey: config?.partitionValue(x)
52
- },
53
- ifMatch: eTag,
54
- partitionKey: config?.partitionValue(x)
55
- }))
56
- ]);
57
- const batches = tsplus_module_4.toReadonlyArray(tsplus_module_3.chunk_(b, config?.maxBulkSize ?? 10));
58
- const batchResult = yield* $(tsplus_module_5.ext_forEach(batches
59
- .map((x, i) => [i, x]), ([i, batch]) => tsplus_module_1.flatMap(tsplus_module_1.delay(tsplus_module_1.promise(() => bulk(batch.map(([, op]) => op))), tsplus_module_3.millis_(i === 0 ? 0 : 1100)), (responses) => tsplus_module_1.gen(function* ($) {
60
- const r = responses.find((x) => x.statusCode === 412 || x.statusCode === 404);
61
- if (r) {
62
- return yield* $(tsplus_module_1.fail(new OptimisticConcurrencyException(name, JSON.stringify(r.resourceBody?.["id"]))));
63
- }
64
- const r2 = responses.find((x) => x.statusCode > 299 || x.statusCode < 200);
65
- if (r2) {
66
- return yield* $(tsplus_module_1.die(new CosmosDbOperationError("not able to update record: " + r2.statusCode)));
67
- }
68
- return batch.map(([e], i) => ({
69
- ...e,
70
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
71
- _etag: responses[i].eTag
72
- }));
73
- }))));
74
- return batchResult.flat();
75
- }), "cosmos.bulkSet"), "cosmos.db", containerId);
76
- const batchSet = (items) => {
77
- return tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.suspend(() => {
78
- const batch = [...items].map((x) => [
79
- x,
80
- tsplus_module_2.match(tsplus_module_2.fromNullable(x._etag), () => ({
81
- operationType: "Create",
82
- resourceBody: {
83
- ...omit(x, "_etag"),
84
- _partitionKey: config?.partitionValue(x)
85
- }
86
- }), (eTag) => ({
87
- operationType: "Replace",
88
- id: x.id,
89
- resourceBody: {
90
- ...omit(x, "_etag"),
91
- _partitionKey: config?.partitionValue(x)
92
- },
93
- ifMatch: eTag
94
- }))
95
- ]);
96
- const ex = batch.map(([, c]) => c);
97
- return tsplus_module_1.flatMap(tsplus_module_1.promise(() => execBatch(ex, ex[0]?.resourceBody._partitionKey)), (x) => tsplus_module_1.gen(function* ($) {
98
- const result = x.result ?? [];
99
- const firstFailed = result.find((x) => x.statusCode > 299 || x.statusCode < 200);
100
- if (firstFailed) {
101
- const code = firstFailed.statusCode ?? 0;
102
- if (code === 412 || code === 404) {
103
- return yield* $(tsplus_module_1.fail(new OptimisticConcurrencyException(name, "batch")));
104
- }
105
- return yield* $(tsplus_module_1.die(new CosmosDbOperationError("not able to update record: " + code)));
106
- }
107
- return batch.map(([e], i) => ({
108
- ...e,
109
- _etag: result[i]?.eTag
110
- }));
111
- }));
112
- }), "cosmos.batchSet"), "cosmos.db", containerId);
113
- };
114
- const s = {
115
- all: tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.flatMap(tsplus_module_1.tap(tsplus_module_1.sync(() => ({
116
- query: `SELECT * FROM ${name} f WHERE f.id != @id`,
117
- parameters: [{ name: "@id", value: importedMarkerId }]
118
- })), (q) => logQuery(q)), (q) => tsplus_module_1.promise(() => container
119
- .items
120
- .query(q)
121
- .fetchAll()
122
- .then(({ resources }) => resources))), "cosmos.all"), "cosmos.db", containerId),
123
- filterJoinSelect: (filter, cursor) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.map(tsplus_module_5.ext_forEach(filter
124
- .keys, (k) => tsplus_module_1.flatMap(tsplus_module_1.tap(tsplus_module_1.sync(() => buildFilterJoinSelectCosmosQuery(filter, k, name, cursor?.skip, cursor?.limit)), (q) => logQuery(q)), (q) => tsplus_module_1.promise(() => container
125
- .items
126
- .query(q)
127
- .fetchAll()
128
- .then(({ resources }) => resources)))), (a) => {
129
- const v = a
130
- .flatMap((_) => _)
131
- .map((x) => tsplus_module_7.spread(x, ({ r, ...rest }) => ({ ...rest, ...r })));
132
- return v;
133
- }), "cosmos.filterJoinSelect"), "cosmos.db", containerId),
134
- /**
135
- * May return duplicate results for "join_find", when matching more than once.
136
- */
137
- filter: (filter, cursor) => {
138
- const skip = cursor?.skip;
139
- const limit = cursor?.limit;
140
- return tsplus_module_1.logAnnotate(tsplus_module_6.instr((filter.type === "join_find"
141
- // This is a problem if one of the multiple joined arrays can be empty!
142
- // https://stackoverflow.com/questions/60320780/azure-cosmosdb-sql-join-not-returning-results-when-the-child-contains-empty-arra
143
- // so we use multiple queries instead.
144
- ? tsplus_module_1.map(tsplus_module_5.ext_forEach(filter
145
- .keys, (k) => tsplus_module_1.flatMap(tsplus_module_1.tap(tsplus_module_1.sync(() => buildFindJoinCosmosQuery(filter, k, name, skip, limit)), (q) => logQuery(q)), (q) => tsplus_module_1.promise(() => container
146
- .items
147
- .query(q)
148
- .fetchAll()
149
- .then(({ resources }) => resources)))), (_) => _.flatMap((_) => _))
150
- : tsplus_module_1.flatMap(tsplus_module_1.tap(tsplus_module_1.sync(() => buildCosmosQuery(filter, name, importedMarkerId, skip, limit)), (q) => logQuery(q)), (q) => tsplus_module_1.promise(() => container
151
- .items
152
- .query(q)
153
- .fetchAll()
154
- .then(({ resources }) => resources.map((_) => _.f))))), "cosmos.filter"), "cosmos.db", containerId);
155
- },
156
- find: (id) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.promise(() => container
157
- .item(id, config?.partitionValue({ id }))
158
- .read()
159
- .then(({ resource }) => tsplus_module_2.fromNullable(resource))), "cosmos.find"), "cosmos.db", containerId),
160
- set: (e) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.flatMap(tsplus_module_2.match(tsplus_module_2.fromNullable(e._etag), () => tsplus_module_1.promise(() => container.items.create({
161
- ...e,
162
- _partitionKey: config?.partitionValue(e)
163
- })), (eTag) => tsplus_module_1.promise(() => container.item(e.id, config?.partitionValue(e)).replace({ ...e, _partitionKey: config?.partitionValue(e) }, {
164
- accessCondition: {
165
- type: "IfMatch",
166
- condition: eTag
167
- }
168
- }))), (x) => {
169
- if (x.statusCode === 412 || x.statusCode === 404) {
170
- return tsplus_module_1.fail(new OptimisticConcurrencyException(name, e.id));
171
- }
172
- if (x.statusCode > 299 || x.statusCode < 200) {
173
- return tsplus_module_1.die(new CosmosDbOperationError("not able to update record: " + x.statusCode));
174
- }
175
- return tsplus_module_1.sync(() => ({
176
- ...e,
177
- _etag: x.etag
178
- }));
179
- }), "cosmos.set"), "cosmos.db", containerId),
180
- batchSet,
181
- bulkSet,
182
- remove: (e) => tsplus_module_1.logAnnotate(tsplus_module_6.instr(tsplus_module_1.promise(() => container.item(e.id, config?.partitionValue(e)).delete()), "cosmos.remove"), "cosmos.db", containerId)
183
- };
184
- // handle mock data
185
- const marker = yield* $(tsplus_module_1.promise(() => container
186
- .item(importedMarkerId, importedMarkerId)
187
- .read()
188
- .then(({ resource }) => tsplus_module_2.fromNullable(resource))));
189
- if (!tsplus_module_2.isSome(marker)) {
190
- console.log("Creating mock data for " + name);
191
- if (seed) {
192
- const m = yield* $(seed);
193
- yield* $(tsplus_module_8.flatMapOption(tsplus_module_1.sync(() => tsplus_module_3.CollectionToNonEmptyReadonlyArray(m)), (a) => tsplus_module_1.delay(tsplus_module_1.orDie(s
194
- .bulkSet(a)), tsplus_module_3.millis_(1100))));
195
- }
196
- // Mark as imported
197
- yield* $(tsplus_module_1.promise(() => container.items.create({
198
- _partitionKey: importedMarkerId,
199
- id: importedMarkerId
200
- })));
201
- }
202
- return s;
203
- })
204
- };
205
- });
206
- }
207
- function logQuery(q) {
208
- return tsplus_module_9.logAnnotates({
209
- query: q.query,
210
- parameters: JSON.stringify(q.parameters.reduce((acc, v) => {
211
- acc[v.name] = v.value;
212
- return acc;
213
- }, {}), undefined, 2)
214
- })(tsplus_module_1.logDebug("cosmos query"));
215
- }
216
- /**
217
- * @deprecated: should build Select into Where query
218
- */
219
- export function buildFilterJoinSelectCosmosQuery(filter, k, name, skip, limit) {
220
- const lm = skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : "";
221
- return {
222
- query: `
223
- SELECT r, f.id as _rootId
224
- FROM ${name} f
225
- JOIN r IN f.${k}
226
- WHERE LOWER(r.${filter.valueKey}) = LOWER(@value)
227
- ${lm}
228
- `,
229
- parameters: [{ name: "@value", value: filter.value }]
230
- };
231
- }
232
- /**
233
- * @deprecated: is now part of Where query as k.-1.valueKey
234
- */
235
- export function buildFindJoinCosmosQuery(filter, k, name, skip, limit) {
236
- const lm = skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : "";
237
- return {
238
- query: `
239
- SELECT DISTINCT VALUE f
240
- FROM ${name} f
241
- JOIN r IN f.${k}
242
- WHERE LOWER(r.${filter.valueKey}) = LOWER(@value)
243
- ${lm}`,
244
- parameters: [{ name: "@value", value: filter.value }]
245
- };
246
- }
247
- /**
248
- * @deprecated: should build into Where query
249
- */
250
- export function buildLegacyCosmosQuery(filter, name, importedMarkerId, skip, limit) {
251
- const lm = skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : "";
252
- return {
253
- query: `
254
- SELECT f
255
- FROM ${name} AS f
256
- WHERE f.id != @id AND f.${String(filter.by)} LIKE @filter
257
- ${lm}`,
258
- parameters: [
259
- { name: "@id", value: importedMarkerId },
260
- {
261
- name: "@filter",
262
- value: filter.type === "endsWith"
263
- ? `%${filter.value}`
264
- : filter.type === "contains"
265
- ? `%${filter.value}%`
266
- : `${filter.value}%`
267
- }
268
- ]
269
- };
270
- }
271
- export function buildWhereCosmosQuery(filter, name, importedMarkerId, skip, limit) {
272
- const lm = skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : "";
273
- return {
274
- query: `
275
- SELECT f
276
- FROM ${name} AS f
277
- ${tsplus_module_11.uniqArray(tsplus_module_10.string)(filter
278
- .where
279
- .filter((_) => _.key.includes(".-1."))
280
- .map((_) => _.key.split(".-1.")[0])
281
- .map((_) => `JOIN ${_} IN f.${_}`))
282
- .join("\n")}
283
- WHERE f.id != @id AND ${filter
284
- .where
285
- .map((_) => _.key.includes(".-1.")
286
- ? { ..._, f: _.key.split(".-1.")[0], key: _.key.split(".-1.")[1] }
287
- : { ..._, f: "f" })
288
- .map((x, i) => {
289
- const k = `${x.f}.${x.key}`;
290
- const v = `@v${i}`;
291
- switch (x.t) {
292
- case "in":
293
- return `ARRAY_CONTAINS(${v}, ${k})`;
294
- case "not-in":
295
- return `(NOT ARRAY_CONTAINS(${v}, ${k}))`;
296
- case "ends-with":
297
- return `ENDSWITH(${k}, ${v}, true)`;
298
- case "includes":
299
- return `ARRAY_CONTAINS(${k}, ${v})`;
300
- case "not-includes":
301
- return `(NOT ARRAY_CONTAINS(${k}, ${v}))`;
302
- case "contains":
303
- return `CONTAINS(${k}, ${v}, true)`;
304
- case "starts-with":
305
- return `STARTSWITH(${k}, ${v}, true)`;
306
- }
307
- const lk = lowerIfNeeded(k, x.value);
308
- const lv = lowerIfNeeded(v, x.value);
309
- switch (x.t) {
310
- case "lt":
311
- return `${lk} < ${lv}`;
312
- case "lte":
313
- return `${lk} <= ${lv}`;
314
- case "gt":
315
- return `${lk} > ${lv}`;
316
- case "gte":
317
- return `${lk} >= ${lv}`;
318
- case "not-eq":
319
- return x.value === null
320
- ? `IS_NULL(${k}) = false`
321
- : `${lk} <> ${lv}`;
322
- case undefined:
323
- case "eq":
324
- return x.value === null
325
- ? `IS_NULL(${k}) = true`
326
- : `${lk} = ${lv}`;
327
- }
328
- })
329
- .join(filter.mode === "or" ? " OR " : " AND ")}
330
- ${lm}`,
331
- parameters: [
332
- { name: "@id", value: importedMarkerId },
333
- ...filter
334
- .where
335
- .map((x, i) => ({
336
- name: `@v${i}`,
337
- value: x.value
338
- }))
339
- ]
340
- };
341
- }
342
- // function isArray(t: SupportedValues | readonly SupportedValues[]): t is readonly SupportedValues[] {
343
- // return Array.isArray(t)
344
- // }
345
- function lowerIfNeeded(key, value) {
346
- return typeof value === "string" ? `LOWER(${key})` : `${key}`;
347
- }
348
- export function buildCosmosQuery(filter, name, importedMarkerId, skip, limit) {
349
- return filter.type === "startsWith"
350
- || filter.type === "endsWith"
351
- || filter.type === "contains"
352
- ? buildLegacyCosmosQuery(filter, name, importedMarkerId, skip, limit)
353
- : buildWhereCosmosQuery(filter, name, importedMarkerId, skip, limit);
354
- }
355
- class CosmosDbOperationError {
356
- message;
357
- constructor(message) {
358
- this.message = message;
359
- }
360
- }
361
- export function CosmosStoreLive(config) {
362
- return tsplus_module_1.toLayer(tsplus_module_1.flatMap(tsplus_module_1.config(config), makeCosmosStore), StoreMaker);
363
- }
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zbW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vX3NyYy9zZXJ2aWNlcy9TdG9yZS9Db3Ntb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBDQUEwQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQWFoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXpDLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEVBQUUsTUFBTSxFQUFpQjtJQUN2RCxPQUFPLG9CQUFXLFFBQVEsQ0FBQyxFQUFDLENBQUM7UUFDM0IsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNyQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLENBQ0osSUFBWSxFQUNaLElBQXlDLEVBQ3pDLE1BQXdCLEVBQ3hCLEVBQUUsQ0FDRixvQkFBVyxRQUFRLENBQUMsRUFBQyxDQUFDO2dCQUNwQixNQUFNLFdBQVcsR0FBRyxHQUFHLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQTtnQkFDdEMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNOLHdCQUFlLEdBQUcsRUFBRSxDQUNsQixFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDO29CQUM5QixFQUFFLEVBQUUsV0FBVztvQkFDZixlQUFlLEVBQUUsTUFBTSxFQUFFLFVBQVU7d0JBQ2pDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO3dCQUNuQyxDQUFDLENBQUMsU0FBUztpQkFDZCxDQUFDLENBQ0gsQ0FDRixDQUFBO2dCQUNELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQzNDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ3ZELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQzdELE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFBO2dCQUVwQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWdDLEVBQUUsRUFBRSxDQUNuRCw0QkFBQSxzQkFBQSxvQkFDTyxRQUFRLENBQUMsRUFBQyxDQUFDO29CQUNkLDJDQUEyQztvQkFDM0MsK0NBQStDO29CQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUN0QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0o7d0JBQ0UsQ0FBQzt3QkFDRCxzQkFBQSw2QkFBb0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUMxQixHQUFHLEVBQUUsQ0FBQyxDQUFDOzRCQUNMLGFBQWEsRUFBRSxRQUFpQjs0QkFDaEMsWUFBWSxFQUFFO2dDQUNaLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7Z0NBQ25CLGFBQWEsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQzs2QkFDbEM7NEJBQ1IsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO3lCQUN4QyxDQUFDLEVBQ0YsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQ1QsYUFBYSxFQUFFLFNBQWtCOzRCQUNqQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7NEJBQ1IsWUFBWSxFQUFFO2dDQUNaLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7Z0NBQ25CLGFBQWEsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQzs2QkFDbEM7NEJBQ1IsT0FBTyxFQUFFLElBQUk7NEJBQ2IsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO3lCQUN4QyxDQUFDLENBQ0g7cUJBQ08sQ0FDYixDQUFBO29CQUNELE1BQU0sT0FBTyxtQ0FBRyx1QkFBQSxDQUFDLEVBQU8sTUFBTSxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBZ0IsQ0FBQTtvQkFFbEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUMxQiw0QkFBQSxPQUFPO3lCQUNKLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBVSxDQUFDLEVBRTdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUNiLHdCQUFBLHNCQUFBLHdCQUNXLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ3hDLHdCQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3RDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDckIsb0JBQVcsUUFBUSxDQUFDLEVBQUMsQ0FBQzt3QkFDcEIsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQTt3QkFDN0UsSUFBSSxDQUFDLEVBQUU7NEJBQ0wsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ2IscUJBQ0UsSUFBSSw4QkFBOEIsQ0FDaEMsSUFBSSxFQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3ZDLENBQ0YsQ0FDRixDQUFBO3lCQUNGO3dCQUNELE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQ3ZCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FDaEQsQ0FBQTt3QkFDRCxJQUFJLEVBQUUsRUFBRTs0QkFDTixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDYixvQkFDRSxJQUFJLHNCQUFzQixDQUN4Qiw2QkFBNkIsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUM5QyxDQUNGLENBQ0YsQ0FBQTt5QkFDRjt3QkFDRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDNUIsR0FBRyxDQUFDOzRCQUNKLG9FQUFvRTs0QkFDcEUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxJQUFJO3lCQUMxQixDQUFDLENBQUMsQ0FBQTtvQkFDTCxDQUFDLENBQUMsQ0FDSCxDQUNOLENBQ0osQ0FBQTtvQkFDRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQTBDLENBQUE7Z0JBQ25FLENBQUMsQ0FBQyxFQUNVLGdCQUFnQixDQUFDLEVBQ2hCLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtnQkFFMUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFnQyxFQUFFLEVBQUU7b0JBQ3BELE9BQU8sNEJBQUEsc0JBQUEsd0JBQ0ksR0FBRyxFQUFFO3dCQUNaLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQzFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSjs0QkFDRSxDQUFDOzRCQUNELHNCQUFBLDZCQUFvQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQzFCLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0NBQ0wsYUFBYSxFQUFFLFFBQWlCO2dDQUNoQyxZQUFZLEVBQUU7b0NBQ1osR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQztvQ0FDbkIsYUFBYSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO2lDQUNsQzs2QkFDVCxDQUFDLEVBQ0YsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0NBQ1QsYUFBYSxFQUFFLFNBQWtCO2dDQUNqQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0NBQ1IsWUFBWSxFQUFFO29DQUNaLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7b0NBQ25CLGFBQWEsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztpQ0FDbEM7Z0NBQ1IsT0FBTyxFQUFFLElBQUk7NkJBQ2QsQ0FBQyxDQUNIO3lCQUNPLENBQ2IsQ0FBQTt3QkFFRCxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTt3QkFFbEMsT0FBTyx3QkFBQSx3QkFDSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDdkQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNiLG9CQUFXLFFBQVEsQ0FBQyxFQUFDLENBQUM7NEJBQ3BCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFBOzRCQUM3QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUM3QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQ3JELENBQUE7NEJBQ0QsSUFBSSxXQUFXLEVBQUU7Z0NBQ2YsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUE7Z0NBQ3hDLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO29DQUNoQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDYixxQkFBWSxJQUFJLDhCQUE4QixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUMvRCxDQUFBO2lDQUNGO2dDQUVELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUNiLG9CQUNFLElBQUksc0JBQXNCLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLENBQ2pFLENBQ0YsQ0FBQTs2QkFDRjs0QkFFRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQ0FDNUIsR0FBRyxDQUFDO2dDQUNKLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSTs2QkFDdkIsQ0FBQyxDQUF5QyxDQUFBO3dCQUM3QyxDQUFDLENBQUMsQ0FDSCxDQUFBO29CQUNMLENBQUMsQ0FBQyxFQUNVLGlCQUFpQixDQUFDLEVBQ2pCLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtnQkFDMUMsQ0FBQyxDQUFBO2dCQUVELE1BQU0sQ0FBQyxHQUFrQjtvQkFDdkIsR0FBRyxFQUFFLDRCQUFBLHNCQUFBLHdCQUFBLG9CQUFBLDJCQUFPLENBQUE7d0JBQ1YsS0FBSyxFQUFFLGlCQUFpQixJQUFJLHNCQUFzQjt3QkFDbEQsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO3FCQUN2RCxDQUFBLENBQUMsRUFDSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNiLHdCQUFlLEdBQUcsRUFBRSxDQUNsQixTQUFTO3lCQUNOLEtBQUs7eUJBQ0wsS0FBSyxDQUFLLENBQUMsQ0FBQzt5QkFDWixRQUFRLEVBQUU7eUJBQ1YsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQ3RDLENBQ0YsRUFDVyxZQUFZLENBQUMsRUFDWixXQUFXLEVBQUUsV0FBVyxDQUFDO29CQUN4QyxnQkFBZ0IsRUFBRSxDQUNoQixNQUF3QixFQUN4QixNQUEwQyxFQUMxQyxFQUFFLENBQ0YsNEJBQUEsc0JBQUEsb0JBQUEsNEJBQUEsTUFBTTt5QkFDSCxJQUFJLEVBQ1UsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNuQix3QkFBQSxvQkFBQSwyQkFBTyxnQ0FBZ0MsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUMvRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNiLHdCQUFlLEdBQUcsRUFBRSxDQUNsQixTQUFTO3lCQUNOLEtBQUs7eUJBQ0wsS0FBSyxDQUFJLENBQUMsQ0FBQzt5QkFDWCxRQUFRLEVBQUU7eUJBQ1YsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQ3RDLENBQ0YsQ0FDSixFQUNJLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FBQzs2QkFDUixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQzs2QkFDakIsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDVCxnQkFBQSxNQUFNLENBQ0osQ0FBQyxFQUNELENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUE4QixDQUFBLENBQ3hFLENBQ0YsQ0FBQTt3QkFDSCxPQUFPLENBQUMsQ0FBQTtvQkFDVixDQUFDLENBQUMsRUFDVSx5QkFBeUIsQ0FBQyxFQUN6QixXQUFXLEVBQUUsV0FBVyxDQUFDO29CQUMxQzs7dUJBRUc7b0JBQ0gsTUFBTSxFQUFFLENBQUMsTUFBa0IsRUFBRSxNQUEwQyxFQUFFLEVBQUU7d0JBQ3pFLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxJQUFJLENBQUE7d0JBQ3pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUE7d0JBQzNCLE9BQU8sNEJBQUEsc0JBQUEsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVc7NEJBQ2pDLHVFQUF1RTs0QkFDdkUsZ0lBQWdJOzRCQUNoSSxzQ0FBc0M7NEJBQ3RDLENBQUMsQ0FBQyxvQkFBQSw0QkFBQSxNQUFNO2lDQUNMLElBQUksRUFDVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ25CLHdCQUFBLG9CQUFBLDJCQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUN2RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2YsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNiLHdCQUFlLEdBQUcsRUFBRSxDQUNsQixTQUFTO2lDQUNOLEtBQUs7aUNBQ0wsS0FBSyxDQUFLLENBQUMsQ0FBQztpQ0FDWixRQUFRLEVBQUU7aUNBQ1YsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQ3RDLENBQ0YsQ0FDSixFQUNJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDbEMsQ0FBQyxDQUFDLHdCQUFBLG9CQUFBLDJCQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQ2hFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDZixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2Isd0JBQWUsR0FBRyxFQUFFLENBQ2xCLFNBQVM7aUNBQ04sS0FBSztpQ0FDTCxLQUFLLENBQ0osQ0FBQyxDQUNGO2lDQUNBLFFBQVEsRUFBRTtpQ0FDVixJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDdEQsQ0FDRixDQUFDLEVBQ1EsZUFBZSxDQUFDLEVBQ2YsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO29CQUMxQyxDQUFDO29CQUNELElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ1gsNEJBQUEsc0JBQUEsd0JBQ1csR0FBRyxFQUFFLENBQ1osU0FBUzt5QkFDTixJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQVEsQ0FBQyxDQUFDO3lCQUM5QyxJQUFJLEVBQU07eUJBQ1YsSUFBSSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsNkJBQW9CLFFBQVEsQ0FBQyxDQUFDLENBQ3pELEVBQ1csYUFBYSxDQUFDLEVBQ2IsV0FBVyxFQUFFLFdBQVcsQ0FBQztvQkFDMUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDVCw0QkFBQSxzQkFBQSx3QkFBQSxzQkFBQSw2QkFDZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUVwQixHQUFHLEVBQUUsQ0FDSCx3QkFBZSxHQUFHLEVBQUUsQ0FDbEIsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7d0JBQ3JCLEdBQUcsQ0FBQzt3QkFDSixhQUFhLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7cUJBQ3pDLENBQUMsQ0FDSCxFQUNILENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDUCx3QkFBZSxHQUFHLEVBQUUsQ0FDbEIsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ3JELEVBQUUsR0FBRyxDQUFDLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDbEQ7d0JBQ0UsZUFBZSxFQUFFOzRCQUNmLElBQUksRUFBRSxTQUFTOzRCQUNmLFNBQVMsRUFBRSxJQUFJO3lCQUNoQjtxQkFDRixDQUNGLENBQ0YsQ0FDSixFQUNRLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ2IsSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRTs0QkFDaEQsT0FBTyxxQkFBWSxJQUFJLDhCQUE4QixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTt5QkFDbkU7d0JBQ0QsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLEdBQUcsRUFBRTs0QkFDNUMsT0FBTyxvQkFDTCxJQUFJLHNCQUFzQixDQUN4Qiw2QkFBNkIsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUM3QyxDQUNGLENBQUE7eUJBQ0Y7d0JBQ0QsT0FBTywyQkFBTyxDQUFBOzRCQUNaLEdBQUcsQ0FBQzs0QkFDSixLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUk7eUJBQ2QsQ0FBQSxDQUFDLENBQUE7b0JBQ0osQ0FBQyxDQUFDLEVBQ1UsWUFBWSxDQUFDLEVBQ1osV0FBVyxFQUFFLFdBQVcsQ0FBQztvQkFDMUMsUUFBUTtvQkFDUixPQUFPO29CQUNQLE1BQU0sRUFBRSxDQUFDLENBQUssRUFBRSxFQUFFLENBQ2hCLDRCQUFBLHNCQUFBLHdCQUNXLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFDNUQsZUFBZSxDQUFDLEVBQ2YsV0FBVyxFQUFFLFdBQVcsQ0FBQztpQkFDM0MsQ0FBQTtnQkFFRCxtQkFBbUI7Z0JBQ25CLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDckIsd0JBQWUsR0FBRyxFQUFFLENBQ2xCLFNBQVM7cUJBQ04sSUFBSSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO3FCQUN4QyxJQUFJLEVBQWtCO3FCQUN0QixJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyw2QkFBb0IsUUFBUSxDQUFDLENBQUMsQ0FDekQsQ0FDRixDQUFBO2dCQUVELElBQUksQ0FBQyx1QkFBQSxNQUFNLENBQVMsRUFBRTtvQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsQ0FBQTtvQkFDN0MsSUFBSSxJQUFJLEVBQUU7d0JBQ1IsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUN4QixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ04sOEJBQUEsNkVBQU8sQ0FBQyxFQUFpQixFQUNYLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDaEIsNENBQUEsQ0FBQzs2QkFDRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBR0osd0JBQW9CLElBQUksQ0FBQyxDQUFDLENBQ3BDLENBQ0osQ0FBQTtxQkFDRjtvQkFDRCxtQkFBbUI7b0JBQ25CLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDTix3QkFBZSxHQUFHLEVBQUUsQ0FDbEIsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7d0JBQ3JCLGFBQWEsRUFBRSxnQkFBZ0I7d0JBQy9CLEVBQUUsRUFBRSxnQkFBZ0I7cUJBQ3JCLENBQUMsQ0FDSCxDQUNGLENBQUE7aUJBQ0Y7Z0JBQ0QsT0FBTyxDQUFDLENBQUE7WUFDVixDQUFDLENBQUM7U0FDTCxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsQ0FNakI7SUFDQyxPQUVTLDZCQUFvQjtRQUN6QixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7UUFDZCxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FDeEIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFBO1lBQ3JCLE9BQU8sR0FBRyxDQUFBO1FBQ1osQ0FBQyxFQUFFLEVBQWtFLENBQUMsRUFDdEUsU0FBUyxFQUNULENBQUMsQ0FDRjtLQUNGLENBQUMsQ0FaRyx5QkFDSyxjQUFjLENBQUMsRUFXdEI7QUFDUCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0NBQWdDLENBQzlDLE1BQXdCLEVBQ3hCLENBQVMsRUFDVCxJQUFZLEVBQ1osSUFBYSxFQUNiLEtBQWM7SUFFZCxNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUMxRyxPQUFPO1FBQ0wsS0FBSyxFQUFFOztPQUVKLElBQUk7Y0FDRyxDQUFDO2dCQUNDLE1BQU0sQ0FBQyxRQUFRO0VBQzdCLEVBQUU7Q0FDSDtRQUNHLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQ3RELENBQUE7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLE1BQXNCLEVBQ3RCLENBQVMsRUFDVCxJQUFZLEVBQ1osSUFBYSxFQUNiLEtBQWM7SUFFZCxNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUMxRyxPQUFPO1FBQ0wsS0FBSyxFQUFFOztPQUVKLElBQUk7Y0FDRyxDQUFDO2dCQUNDLE1BQU0sQ0FBQyxRQUFRO0VBQzdCLEVBQUUsRUFBRTtRQUNGLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQ3RELENBQUE7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLE1BQXdCLEVBQ3hCLElBQVksRUFDWixnQkFBd0IsRUFDeEIsSUFBYSxFQUNiLEtBQWM7SUFFZCxNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUMxRyxPQUFPO1FBQ0wsS0FBSyxFQUFFOztXQUVBLElBQUk7OEJBRVQsTUFBTSxDQUNKLE1BQU0sQ0FBQyxFQUFFLENBRWI7SUFDQSxFQUFFLEVBQUU7UUFDSixVQUFVLEVBQUU7WUFDVixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFO1lBQ3hDO2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVU7b0JBQy9CLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7b0JBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVU7d0JBQzVCLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEdBQUc7d0JBQ3JCLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUc7YUFDdkI7U0FDRjtLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUF3QixFQUN4QixJQUFZLEVBQ1osZ0JBQXdCLEVBQ3hCLElBQWEsRUFDYixLQUFjO0lBRWQsTUFBTSxFQUFFLEdBQUcsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDMUcsT0FBTztRQUNMLEtBQUssRUFBRTs7V0FFQSxJQUFJO01BRVQsb0RBQUEsTUFBTTthQUNILEtBQUs7YUFDTCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUNUO2FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQ2Q7NEJBRUUsTUFBTTthQUNILEtBQUs7YUFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNULENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNwQixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBRSxFQUFFO1lBQ25FLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FDckI7YUFDQSxHQUFHLENBQ0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDUCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUE7WUFFbEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNYLEtBQUssSUFBSTtvQkFDUCxPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUE7Z0JBQ3JDLEtBQUssUUFBUTtvQkFDWCxPQUFPLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUE7Z0JBQzNDLEtBQUssV0FBVztvQkFDZCxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFBO2dCQUNyQyxLQUFLLFVBQVU7b0JBQ2IsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFBO2dCQUNyQyxLQUFLLGNBQWM7b0JBQ2pCLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQTtnQkFDM0MsS0FBSyxVQUFVO29CQUNiLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUE7Z0JBQ3JDLEtBQUssYUFBYTtvQkFDaEIsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQTthQUN4QztZQUVELE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3BDLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBRXBDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDWCxLQUFLLElBQUk7b0JBQ1AsT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQTtnQkFDeEIsS0FBSyxLQUFLO29CQUNSLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUE7Z0JBQ3pCLEtBQUssSUFBSTtvQkFDUCxPQUFPLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFBO2dCQUN4QixLQUFLLEtBQUs7b0JBQ1IsT0FBTyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQTtnQkFDekIsS0FBSyxRQUFRO29CQUNYLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJO3dCQUNyQixDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVc7d0JBQ3pCLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQTtnQkFDdEIsS0FBSyxTQUFTLENBQUM7Z0JBQ2YsS0FBSyxJQUFJO29CQUNQLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJO3dCQUNyQixDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVU7d0JBQ3hCLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQTthQUN0QjtRQUNILENBQUMsQ0FDRjthQUNBLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2pEO01BQ0UsRUFBRSxFQUFFO1FBQ04sVUFBVSxFQUFFO1lBQ1YsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtZQUN4QyxHQUFHLE1BQU07aUJBQ04sS0FBSztpQkFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNkLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7YUFDZixDQUFDLENBQUM7U0FDTjtLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsdUdBQXVHO0FBQ3ZHLDRCQUE0QjtBQUM1QixJQUFJO0FBRUosU0FBUyxhQUFhLENBQUMsR0FBWSxFQUFFLEtBQWM7SUFDakQsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUE7QUFDL0QsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsTUFBMkMsRUFDM0MsSUFBWSxFQUNaLGdCQUF3QixFQUN4QixJQUFhLEVBQ2IsS0FBYztJQUVkLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZO1dBQzVCLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVTtXQUMxQixNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVU7UUFDL0IsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUNyRSxDQUFDLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDeEUsQ0FBQztBQUVELE1BQU0sc0JBQXNCO0lBQ0w7SUFBckIsWUFBcUIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFBRyxDQUFDO0NBQ3pDO0FBQ0QsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUE2QjtJQUMzRCxPQUFPLHdCQUFBLCtDQUFBLE1BQU0sR0FBZ0IsZUFBZSxDQUFDLEVBQVMsVUFBVSxDQUFDLENBQUE7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgQ29zbW9zQ2xpZW50IH0gZnJvbSBcIkBlZmZlY3QtYXBwL2luZnJhLWFkYXB0ZXJzL2Nvc21vcy1jbGllbnRcIlxuaW1wb3J0IHsgb21pdCB9IGZyb20gXCJAZWZmZWN0LWFwcC9wcmVsdWRlL3V0aWxzXCJcbmltcG9ydCB7IE9wdGltaXN0aWNDb25jdXJyZW5jeUV4Y2VwdGlvbiB9IGZyb20gXCIuLi8uLi9lcnJvcnMuanNcIlxuaW1wb3J0IHR5cGUge1xuICBGaWx0ZXIsXG4gIEZpbHRlckpvaW5TZWxlY3QsXG4gIEpvaW5GaW5kRmlsdGVyLFxuICBMZWdhY3lGaWx0ZXIsXG4gIFBlcnNpc3RlbmNlTW9kZWxUeXBlLFxuICBTdG9yYWdlQ29uZmlnLFxuICBTdG9yZSxcbiAgU3RvcmVDb25maWcsXG4gIFN0b3JlV2hlcmVGaWx0ZXIsXG4gIFN1cHBvcnRlZFZhbHVlc1xufSBmcm9tIFwiLi9zZXJ2aWNlLmpzXCJcbmltcG9ydCB7IFN0b3JlTWFrZXIgfSBmcm9tIFwiLi9zZXJ2aWNlLmpzXCJcblxuLy8gVE9ETzogUmV0cnkgb3BlcmF0aW9uIHdoZW4gcnVubmluZyBpbnRvIFJVIGxpbWl0LlxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VDb3Ntb3NTdG9yZSh7IHByZWZpeCB9OiBTdG9yYWdlQ29uZmlnKSB7XG4gIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKigkKSB7XG4gICAgY29uc3QgeyBkYiB9ID0geWllbGQqICQoQ29zbW9zQ2xpZW50KVxuICAgIHJldHVybiB7XG4gICAgICBtYWtlOiA8SWQgZXh0ZW5kcyBzdHJpbmcsIFBNIGV4dGVuZHMgUGVyc2lzdGVuY2VNb2RlbFR5cGU8SWQ+PihcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBzZWVkPzogRWZmZWN0PG5ldmVyLCBuZXZlciwgSXRlcmFibGU8UE0+PixcbiAgICAgICAgY29uZmlnPzogU3RvcmVDb25maWc8UE0+XG4gICAgICApID0+XG4gICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qKCQpIHtcbiAgICAgICAgICBjb25zdCBjb250YWluZXJJZCA9IGAke3ByZWZpeH0ke25hbWV9YFxuICAgICAgICAgIHlpZWxkKiAkKFxuICAgICAgICAgICAgRWZmZWN0LnByb21pc2UoKCkgPT5cbiAgICAgICAgICAgICAgZGIuY29udGFpbmVycy5jcmVhdGVJZk5vdEV4aXN0cyh7XG4gICAgICAgICAgICAgICAgaWQ6IGNvbnRhaW5lcklkLFxuICAgICAgICAgICAgICAgIHVuaXF1ZUtleVBvbGljeTogY29uZmlnPy51bmlxdWVLZXlzXG4gICAgICAgICAgICAgICAgICA/IHsgdW5pcXVlS2V5czogY29uZmlnLnVuaXF1ZUtleXMgfVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZGIuY29udGFpbmVyKGNvbnRhaW5lcklkKVxuICAgICAgICAgIGNvbnN0IGJ1bGsgPSBjb250YWluZXIuaXRlbXMuYnVsay5iaW5kKGNvbnRhaW5lci5pdGVtcylcbiAgICAgICAgICBjb25zdCBleGVjQmF0Y2ggPSBjb250YWluZXIuaXRlbXMuYmF0Y2guYmluZChjb250YWluZXIuaXRlbXMpXG4gICAgICAgICAgY29uc3QgaW1wb3J0ZWRNYXJrZXJJZCA9IGNvbnRhaW5lcklkXG5cbiAgICAgICAgICBjb25zdCBidWxrU2V0ID0gKGl0ZW1zOiBOb25FbXB0eVJlYWRvbmx5QXJyYXk8UE0+KSA9PlxuICAgICAgICAgICAgRWZmZWN0XG4gICAgICAgICAgICAgIC5nZW4oZnVuY3Rpb24qKCQpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBkaXNhYmxlIGJhdGNoaW5nIGlmIG5lZWQgYXRvbWljaXR5XG4gICAgICAgICAgICAgICAgLy8gd2UgZGVsYXkgYW5kIGJhdGNoIHRvIGtlZXAgbG93IGFtb3VudCBvZiBSVXNcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gWy4uLml0ZW1zXS5tYXAoXG4gICAgICAgICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgT3B0aW9uLmZyb21OdWxsYWJsZSh4Ll9ldGFnKS5tYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6IFwiQ3JlYXRlXCIgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQm9keToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9taXQoeCwgXCJfZXRhZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFydGl0aW9uS2V5OiBjb25maWc/LnBhcnRpdGlvblZhbHVlKHgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXk6IGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoeClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVUYWcpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6IFwiUmVwbGFjZVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogeC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VCb2R5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ub21pdCh4LCBcIl9ldGFnXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJ0aXRpb25LZXk6IGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmTWF0Y2g6IGVUYWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleTogY29uZmlnPy5wYXJ0aXRpb25WYWx1ZSh4KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIF0gYXMgY29uc3RcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hlcyA9IGIuY2h1bmsoY29uZmlnPy5tYXhCdWxrU2l6ZSA/PyAxMCkudG9SZWFkb25seUFycmF5XG5cbiAgICAgICAgICAgICAgICBjb25zdCBiYXRjaFJlc3VsdCA9IHlpZWxkKiAkKFxuICAgICAgICAgICAgICAgICAgYmF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAubWFwKCh4LCBpKSA9PiBbaSwgeF0gYXMgY29uc3QpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoRWZmZWN0KFxuICAgICAgICAgICAgICAgICAgICAgIChbaSwgYmF0Y2hdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9taXNlKCgpID0+IGJ1bGsoYmF0Y2gubWFwKChbLCBvcF0pID0+IG9wKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWxheShEdXJhdGlvbi5tYWtlTWlsbGlzKGkgPT09IDAgPyAwIDogMTEwMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKChyZXNwb25zZXMpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiooJCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHJlc3BvbnNlcy5maW5kKCh4KSA9PiB4LnN0YXR1c0NvZGUgPT09IDQxMiB8fCB4LnN0YXR1c0NvZGUgPT09IDQwNClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3QuZmFpbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcHRpbWlzdGljQ29uY3VycmVuY3lFeGNlcHRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHIucmVzb3VyY2VCb2R5Py5bXCJpZFwiXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIyID0gcmVzcG9uc2VzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4KSA9PiB4LnN0YXR1c0NvZGUgPiAyOTkgfHwgeC5zdGF0dXNDb2RlIDwgMjAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5kaWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29zbW9zRGJPcGVyYXRpb25FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJub3QgYWJsZSB0byB1cGRhdGUgcmVjb3JkOiBcIiArIHIyLnN0YXR1c0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXRjaC5tYXAoKFtlXSwgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2V0YWc6IHJlc3BvbnNlc1tpXSEuZVRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiBiYXRjaFJlc3VsdC5mbGF0KCkgYXMgdW5rbm93biBhcyBOb25FbXB0eVJlYWRvbmx5QXJyYXk8UE0+XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5pbnN0cnVtZW50KFwiY29zbW9zLmJ1bGtTZXRcIilcbiAgICAgICAgICAgICAgLmxvZ0Fubm90YXRlKFwiY29zbW9zLmRiXCIsIGNvbnRhaW5lcklkKVxuXG4gICAgICAgICAgY29uc3QgYmF0Y2hTZXQgPSAoaXRlbXM6IE5vbkVtcHR5UmVhZG9ubHlBcnJheTxQTT4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFZmZlY3RcbiAgICAgICAgICAgICAgLnN1c3BlbmQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gWy4uLml0ZW1zXS5tYXAoXG4gICAgICAgICAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgT3B0aW9uLmZyb21OdWxsYWJsZSh4Ll9ldGFnKS5tYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6IFwiQ3JlYXRlXCIgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQm9keToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9taXQoeCwgXCJfZXRhZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFydGl0aW9uS2V5OiBjb25maWc/LnBhcnRpdGlvblZhbHVlKHgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlVGFnKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25UeXBlOiBcIlJlcGxhY2VcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHguaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQm9keToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9taXQoeCwgXCJfZXRhZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFydGl0aW9uS2V5OiBjb25maWc/LnBhcnRpdGlvblZhbHVlKHgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZk1hdGNoOiBlVGFnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgXSBhcyBjb25zdFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4ID0gYmF0Y2gubWFwKChbLCBjXSkgPT4gYylcblxuICAgICAgICAgICAgICAgIHJldHVybiBFZmZlY3RcbiAgICAgICAgICAgICAgICAgIC5wcm9taXNlKCgpID0+IGV4ZWNCYXRjaChleCwgZXhbMF0/LnJlc291cmNlQm9keS5fcGFydGl0aW9uS2V5KSlcbiAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKCh4KSA9PlxuICAgICAgICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKigkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geC5yZXN1bHQgPz8gW11cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZhaWxlZCA9IHJlc3VsdC5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHg6IGFueSkgPT4geC5zdGF0dXNDb2RlID4gMjk5IHx8IHguc3RhdHVzQ29kZSA8IDIwMFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBmaXJzdEZhaWxlZC5zdGF0dXNDb2RlID8/IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSA0MTIgfHwgY29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3QuZmFpbChuZXcgT3B0aW1pc3RpY0NvbmN1cnJlbmN5RXhjZXB0aW9uKG5hbWUsIFwiYmF0Y2hcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3QuZGllKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb3Ntb3NEYk9wZXJhdGlvbkVycm9yKFwibm90IGFibGUgdG8gdXBkYXRlIHJlY29yZDogXCIgKyBjb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhdGNoLm1hcCgoW2VdLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9ldGFnOiByZXN1bHRbaV0/LmVUYWdcbiAgICAgICAgICAgICAgICAgICAgICB9KSkgYXMgdW5rbm93biBhcyBOb25FbXB0eVJlYWRvbmx5QXJyYXk8UE0+XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5pbnN0cnVtZW50KFwiY29zbW9zLmJhdGNoU2V0XCIpXG4gICAgICAgICAgICAgIC5sb2dBbm5vdGF0ZShcImNvc21vcy5kYlwiLCBjb250YWluZXJJZClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzOiBTdG9yZTxQTSwgSWQ+ID0ge1xuICAgICAgICAgICAgYWxsOiBFZmZlY3Qoe1xuICAgICAgICAgICAgICBxdWVyeTogYFNFTEVDVCAqIEZST00gJHtuYW1lfSBmIFdIRVJFIGYuaWQgIT0gQGlkYCxcbiAgICAgICAgICAgICAgcGFyYW1ldGVyczogW3sgbmFtZTogXCJAaWRcIiwgdmFsdWU6IGltcG9ydGVkTWFya2VySWQgfV1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC50YXAoKHEpID0+IGxvZ1F1ZXJ5KHEpKVxuICAgICAgICAgICAgICAuZmxhdE1hcCgocSkgPT5cbiAgICAgICAgICAgICAgICBFZmZlY3QucHJvbWlzZSgoKSA9PlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIC5pdGVtc1xuICAgICAgICAgICAgICAgICAgICAucXVlcnk8UE0+KHEpXG4gICAgICAgICAgICAgICAgICAgIC5mZXRjaEFsbCgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh7IHJlc291cmNlcyB9KSA9PiByZXNvdXJjZXMpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5pbnN0cnVtZW50KFwiY29zbW9zLmFsbFwiKVxuICAgICAgICAgICAgICAubG9nQW5ub3RhdGUoXCJjb3Ntb3MuZGJcIiwgY29udGFpbmVySWQpLFxuICAgICAgICAgICAgZmlsdGVySm9pblNlbGVjdDogPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICAgICAgICAgICAgICBmaWx0ZXI6IEZpbHRlckpvaW5TZWxlY3QsXG4gICAgICAgICAgICAgIGN1cnNvcj86IHsgc2tpcD86IG51bWJlcjsgbGltaXQ/OiBudW1iZXIgfVxuICAgICAgICAgICAgKSA9PlxuICAgICAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgICAgICAgICAua2V5c1xuICAgICAgICAgICAgICAgIC5mb3JFYWNoRWZmZWN0KChrKSA9PlxuICAgICAgICAgICAgICAgICAgRWZmZWN0KGJ1aWxkRmlsdGVySm9pblNlbGVjdENvc21vc1F1ZXJ5KGZpbHRlciwgaywgbmFtZSwgY3Vyc29yPy5za2lwLCBjdXJzb3I/LmxpbWl0KSlcbiAgICAgICAgICAgICAgICAgICAgLnRhcCgocSkgPT4gbG9nUXVlcnkocSkpXG4gICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKChxKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5wcm9taXNlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLml0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWVyeTxUPihxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmV0Y2hBbGwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoeyByZXNvdXJjZXMgfSkgPT4gcmVzb3VyY2VzKVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKChhKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB2ID0gYVxuICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcCgoXykgPT4gXylcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoeCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQoXG4gICAgICAgICAgICAgICAgICAgICAgICB4LFxuICAgICAgICAgICAgICAgICAgICAgICAgKHsgciwgLi4ucmVzdCB9OiBhbnkpID0+ICh7IC4uLnJlc3QsIC4uLnIgfSBhcyBUICYgeyBfcm9vdElkOiBzdHJpbmcgfSlcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIHJldHVybiB2XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuaW5zdHJ1bWVudChcImNvc21vcy5maWx0ZXJKb2luU2VsZWN0XCIpXG4gICAgICAgICAgICAgICAgLmxvZ0Fubm90YXRlKFwiY29zbW9zLmRiXCIsIGNvbnRhaW5lcklkKSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTWF5IHJldHVybiBkdXBsaWNhdGUgcmVzdWx0cyBmb3IgXCJqb2luX2ZpbmRcIiwgd2hlbiBtYXRjaGluZyBtb3JlIHRoYW4gb25jZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZmlsdGVyOiAoZmlsdGVyOiBGaWx0ZXI8UE0+LCBjdXJzb3I/OiB7IHNraXA/OiBudW1iZXI7IGxpbWl0PzogbnVtYmVyIH0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc2tpcCA9IGN1cnNvcj8uc2tpcFxuICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9IGN1cnNvcj8ubGltaXRcbiAgICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXIudHlwZSA9PT0gXCJqb2luX2ZpbmRcIlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBwcm9ibGVtIGlmIG9uZSBvZiB0aGUgbXVsdGlwbGUgam9pbmVkIGFycmF5cyBjYW4gYmUgZW1wdHkhXG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjAzMjA3ODAvYXp1cmUtY29zbW9zZGItc3FsLWpvaW4tbm90LXJldHVybmluZy1yZXN1bHRzLXdoZW4tdGhlLWNoaWxkLWNvbnRhaW5zLWVtcHR5LWFycmFcbiAgICAgICAgICAgICAgICAvLyBzbyB3ZSB1c2UgbXVsdGlwbGUgcXVlcmllcyBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgID8gZmlsdGVyXG4gICAgICAgICAgICAgICAgICAua2V5c1xuICAgICAgICAgICAgICAgICAgLmZvckVhY2hFZmZlY3QoKGspID0+XG4gICAgICAgICAgICAgICAgICAgIEVmZmVjdChidWlsZEZpbmRKb2luQ29zbW9zUXVlcnkoZmlsdGVyLCBrLCBuYW1lLCBza2lwLCBsaW1pdCkpXG4gICAgICAgICAgICAgICAgICAgICAgLnRhcCgocSkgPT4gbG9nUXVlcnkocSkpXG4gICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKHEpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3QucHJvbWlzZSgoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVlcnk8UE0+KHEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZldGNoQWxsKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoeyByZXNvdXJjZXMgfSkgPT4gcmVzb3VyY2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5tYXAoKF8pID0+IF8uZmxhdE1hcCgoXykgPT4gXykpXG4gICAgICAgICAgICAgICAgOiBFZmZlY3QoYnVpbGRDb3Ntb3NRdWVyeShmaWx0ZXIsIG5hbWUsIGltcG9ydGVkTWFya2VySWQsIHNraXAsIGxpbWl0KSlcbiAgICAgICAgICAgICAgICAgIC50YXAoKHEpID0+IGxvZ1F1ZXJ5KHEpKVxuICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKHEpID0+XG4gICAgICAgICAgICAgICAgICAgIEVmZmVjdC5wcm9taXNlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAuaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5xdWVyeTx7IGY6IFBNIH0+KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBxXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmV0Y2hBbGwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzb3VyY2VzIH0pID0+IHJlc291cmNlcy5tYXAoKF8pID0+IF8uZikpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgLmluc3RydW1lbnQoXCJjb3Ntb3MuZmlsdGVyXCIpXG4gICAgICAgICAgICAgICAgLmxvZ0Fubm90YXRlKFwiY29zbW9zLmRiXCIsIGNvbnRhaW5lcklkKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbmQ6IChpZCkgPT5cbiAgICAgICAgICAgICAgRWZmZWN0XG4gICAgICAgICAgICAgICAgLnByb21pc2UoKCkgPT5cbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAuaXRlbShpZCwgY29uZmlnPy5wYXJ0aXRpb25WYWx1ZSh7IGlkIH0gYXMgUE0pKVxuICAgICAgICAgICAgICAgICAgICAucmVhZDxQTT4oKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoeyByZXNvdXJjZSB9KSA9PiBPcHRpb24uZnJvbU51bGxhYmxlKHJlc291cmNlKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmluc3RydW1lbnQoXCJjb3Ntb3MuZmluZFwiKVxuICAgICAgICAgICAgICAgIC5sb2dBbm5vdGF0ZShcImNvc21vcy5kYlwiLCBjb250YWluZXJJZCksXG4gICAgICAgICAgICBzZXQ6IChlKSA9PlxuICAgICAgICAgICAgICBPcHRpb25cbiAgICAgICAgICAgICAgICAuZnJvbU51bGxhYmxlKGUuX2V0YWcpXG4gICAgICAgICAgICAgICAgLm1hdGNoKFxuICAgICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0LnByb21pc2UoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuaXRlbXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBfcGFydGl0aW9uS2V5OiBjb25maWc/LnBhcnRpdGlvblZhbHVlKGUpXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIChlVGFnKSA9PlxuICAgICAgICAgICAgICAgICAgICBFZmZlY3QucHJvbWlzZSgoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pdGVtKGUuaWQsIGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoZSkpLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB7IC4uLmUsIF9wYXJ0aXRpb25LZXk6IGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoZSkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzQ29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJJZk1hdGNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBlVGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICh4LnN0YXR1c0NvZGUgPT09IDQxMiB8fCB4LnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRWZmZWN0LmZhaWwobmV3IE9wdGltaXN0aWNDb25jdXJyZW5jeUV4Y2VwdGlvbihuYW1lLCBlLmlkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICh4LnN0YXR1c0NvZGUgPiAyOTkgfHwgeC5zdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFZmZlY3QuZGllKFxuICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb3Ntb3NEYk9wZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJub3QgYWJsZSB0byB1cGRhdGUgcmVjb3JkOiBcIiArIHguc3RhdHVzQ29kZVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIEVmZmVjdCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICAgICAgICAgIF9ldGFnOiB4LmV0YWdcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuaW5zdHJ1bWVudChcImNvc21vcy5zZXRcIilcbiAgICAgICAgICAgICAgICAubG9nQW5ub3RhdGUoXCJjb3Ntb3MuZGJcIiwgY29udGFpbmVySWQpLFxuICAgICAgICAgICAgYmF0Y2hTZXQsXG4gICAgICAgICAgICBidWxrU2V0LFxuICAgICAgICAgICAgcmVtb3ZlOiAoZTogUE0pID0+XG4gICAgICAgICAgICAgIEVmZmVjdFxuICAgICAgICAgICAgICAgIC5wcm9taXNlKCgpID0+IGNvbnRhaW5lci5pdGVtKGUuaWQsIGNvbmZpZz8ucGFydGl0aW9uVmFsdWUoZSkpLmRlbGV0ZSgpKVxuICAgICAgICAgICAgICAgIC5pbnN0cnVtZW50KFwiY29zbW9zLnJlbW92ZVwiKVxuICAgICAgICAgICAgICAgIC5sb2dBbm5vdGF0ZShcImNvc21vcy5kYlwiLCBjb250YWluZXJJZClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoYW5kbGUgbW9jayBkYXRhXG4gICAgICAgICAgY29uc3QgbWFya2VyID0geWllbGQqICQoXG4gICAgICAgICAgICBFZmZlY3QucHJvbWlzZSgoKSA9PlxuICAgICAgICAgICAgICBjb250YWluZXJcbiAgICAgICAgICAgICAgICAuaXRlbShpbXBvcnRlZE1hcmtlcklkLCBpbXBvcnRlZE1hcmtlcklkKVxuICAgICAgICAgICAgICAgIC5yZWFkPHsgaWQ6IHN0cmluZyB9PigpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHsgcmVzb3VyY2UgfSkgPT4gT3B0aW9uLmZyb21OdWxsYWJsZShyZXNvdXJjZSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYgKCFtYXJrZXIuaXNTb21lKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ3JlYXRpbmcgbW9jayBkYXRhIGZvciBcIiArIG5hbWUpXG4gICAgICAgICAgICBpZiAoc2VlZCkge1xuICAgICAgICAgICAgICBjb25zdCBtID0geWllbGQqICQoc2VlZClcbiAgICAgICAgICAgICAgeWllbGQqICQoXG4gICAgICAgICAgICAgICAgRWZmZWN0KG0udG9Ob25FbXB0eUFycmF5KVxuICAgICAgICAgICAgICAgICAgLmZsYXRNYXBPcHQoKGEpID0+XG4gICAgICAgICAgICAgICAgICAgIHNcbiAgICAgICAgICAgICAgICAgICAgICAuYnVsa1NldChhKVxuICAgICAgICAgICAgICAgICAgICAgIC5vckRpZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRlbGF5IGV4dHJhIGhlcmUsIHNvIHRoYXQgaW5pdGlhbCBjcmVhdGlvbiBiZXR3ZWVuIENvbXBhbmllcy9QT3MgYWxzbyBoYXZlIGFuIGludGVydmFsIGJldHdlZW4gdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAuZGVsYXkoRHVyYXRpb24ubWFrZU1pbGxpcygxMTAwKSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTWFyayBhcyBpbXBvcnRlZFxuICAgICAgICAgICAgeWllbGQqICQoXG4gICAgICAgICAgICAgIEVmZmVjdC5wcm9taXNlKCgpID0+XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLml0ZW1zLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICBfcGFydGl0aW9uS2V5OiBpbXBvcnRlZE1hcmtlcklkLFxuICAgICAgICAgICAgICAgICAgaWQ6IGltcG9ydGVkTWFya2VySWRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzXG4gICAgICAgIH0pXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBsb2dRdWVyeShxOiB7XG4gIHF1ZXJ5OiBzdHJpbmdcbiAgcGFyYW1ldGVyczoge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHZhbHVlOiBTdXBwb3J0ZWRWYWx1ZXMgfCByZWFkb25seSBTdXBwb3J0ZWRWYWx1ZXNbXVxuICB9W11cbn0pIHtcbiAgcmV0dXJuIEVmZmVjdFxuICAgIC5sb2dEZWJ1ZyhcImNvc21vcyBxdWVyeVwiKVxuICAgIC5hcHBseShFZmZlY3QubG9nQW5ub3RhdGVzKHtcbiAgICAgIHF1ZXJ5OiBxLnF1ZXJ5LFxuICAgICAgcGFyYW1ldGVyczogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIHEucGFyYW1ldGVycy5yZWR1Y2UoKGFjYywgdikgPT4ge1xuICAgICAgICAgIGFjY1t2Lm5hbWVdID0gdi52YWx1ZVxuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgU3VwcG9ydGVkVmFsdWVzIHwgcmVhZG9ubHkgU3VwcG9ydGVkVmFsdWVzW10+KSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAyXG4gICAgICApXG4gICAgfSkpXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQ6IHNob3VsZCBidWlsZCBTZWxlY3QgaW50byBXaGVyZSBxdWVyeVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaWx0ZXJKb2luU2VsZWN0Q29zbW9zUXVlcnkoXG4gIGZpbHRlcjogRmlsdGVySm9pblNlbGVjdCxcbiAgazogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIHNraXA/OiBudW1iZXIsXG4gIGxpbWl0PzogbnVtYmVyXG4pIHtcbiAgY29uc3QgbG0gPSBza2lwICE9PSB1bmRlZmluZWQgfHwgbGltaXQgIT09IHVuZGVmaW5lZCA/IGBPRkZTRVQgJHtza2lwID8/IDB9IExJTUlUICR7bGltaXQgPz8gOTk5OTk5fWAgOiBcIlwiXG4gIHJldHVybiB7XG4gICAgcXVlcnk6IGBcblNFTEVDVCByLCBmLmlkIGFzIF9yb290SWRcbkZST00gJHtuYW1lfSBmXG5KT0lOIHIgSU4gZi4ke2t9XG5XSEVSRSBMT1dFUihyLiR7ZmlsdGVyLnZhbHVlS2V5fSkgPSBMT1dFUihAdmFsdWUpXG4ke2xtfVxuYCxcbiAgICBwYXJhbWV0ZXJzOiBbeyBuYW1lOiBcIkB2YWx1ZVwiLCB2YWx1ZTogZmlsdGVyLnZhbHVlIH1dXG4gIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZDogaXMgbm93IHBhcnQgb2YgV2hlcmUgcXVlcnkgYXMgay4tMS52YWx1ZUtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRGaW5kSm9pbkNvc21vc1F1ZXJ5KFxuICBmaWx0ZXI6IEpvaW5GaW5kRmlsdGVyLFxuICBrOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgc2tpcD86IG51bWJlcixcbiAgbGltaXQ/OiBudW1iZXJcbikge1xuICBjb25zdCBsbSA9IHNraXAgIT09IHVuZGVmaW5lZCB8fCBsaW1pdCAhPT0gdW5kZWZpbmVkID8gYE9GRlNFVCAke3NraXAgPz8gMH0gTElNSVQgJHtsaW1pdCA/PyA5OTk5OTl9YCA6IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBxdWVyeTogYFxuU0VMRUNUIERJU1RJTkNUIFZBTFVFIGZcbkZST00gJHtuYW1lfSBmXG5KT0lOIHIgSU4gZi4ke2t9XG5XSEVSRSBMT1dFUihyLiR7ZmlsdGVyLnZhbHVlS2V5fSkgPSBMT1dFUihAdmFsdWUpXG4ke2xtfWAsXG4gICAgcGFyYW1ldGVyczogW3sgbmFtZTogXCJAdmFsdWVcIiwgdmFsdWU6IGZpbHRlci52YWx1ZSB9XVxuICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQ6IHNob3VsZCBidWlsZCBpbnRvIFdoZXJlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExlZ2FjeUNvc21vc1F1ZXJ5PFBNPihcbiAgZmlsdGVyOiBMZWdhY3lGaWx0ZXI8UE0+LFxuICBuYW1lOiBzdHJpbmcsXG4gIGltcG9ydGVkTWFya2VySWQ6IHN0cmluZyxcbiAgc2tpcD86IG51bWJlcixcbiAgbGltaXQ/OiBudW1iZXJcbikge1xuICBjb25zdCBsbSA9IHNraXAgIT09IHVuZGVmaW5lZCB8fCBsaW1pdCAhPT0gdW5kZWZpbmVkID8gYE9GRlNFVCAke3NraXAgPz8gMH0gTElNSVQgJHtsaW1pdCA/PyA5OTk5OTl9YCA6IFwiXCJcbiAgcmV0dXJuIHtcbiAgICBxdWVyeTogYFxuICAgIFNFTEVDVCBmXG4gICAgRlJPTSAke25hbWV9IEFTIGZcbiAgICBXSEVSRSBmLmlkICE9IEBpZCBBTkQgZi4ke1xuICAgICAgU3RyaW5nKFxuICAgICAgICBmaWx0ZXIuYnlcbiAgICAgIClcbiAgICB9IExJS0UgQGZpbHRlclxuICAke2xtfWAsXG4gICAgcGFyYW1ldGVyczogW1xuICAgICAgeyBuYW1lOiBcIkBpZFwiLCB2YWx1ZTogaW1wb3J0ZWRNYXJrZXJJZCB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkBmaWx0ZXJcIixcbiAgICAgICAgdmFsdWU6IGZpbHRlci50eXBlID09PSBcImVuZHNXaXRoXCJcbiAgICAgICAgICA/IGAlJHtmaWx0ZXIudmFsdWV9YFxuICAgICAgICAgIDogZmlsdGVyLnR5cGUgPT09IFwiY29udGFpbnNcIlxuICAgICAgICAgID8gYCUke2ZpbHRlci52YWx1ZX0lYFxuICAgICAgICAgIDogYCR7ZmlsdGVyLnZhbHVlfSVgXG4gICAgICB9XG4gICAgXVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdoZXJlQ29zbW9zUXVlcnkoXG4gIGZpbHRlcjogU3RvcmVXaGVyZUZpbHRlcixcbiAgbmFtZTogc3RyaW5nLFxuICBpbXBvcnRlZE1hcmtlcklkOiBzdHJpbmcsXG4gIHNraXA/OiBudW1iZXIsXG4gIGxpbWl0PzogbnVtYmVyXG4pIHtcbiAgY29uc3QgbG0gPSBza2lwICE9PSB1bmRlZmluZWQgfHwgbGltaXQgIT09IHVuZGVmaW5lZCA/IGBPRkZTRVQgJHtza2lwID8/IDB9IExJTUlUICR7bGltaXQgPz8gOTk5OTk5fWAgOiBcIlwiXG4gIHJldHVybiB7XG4gICAgcXVlcnk6IGBcbiAgICBTRUxFQ1QgZlxuICAgIEZST00gJHtuYW1lfSBBUyBmXG4gICAgJHtcbiAgICAgIGZpbHRlclxuICAgICAgICAud2hlcmVcbiAgICAgICAgLmZpbHRlcigoXykgPT4gXy5rZXkuaW5jbHVkZXMoXCIuLTEuXCIpKVxuICAgICAgICAubWFwKChfKSA9PiBfLmtleS5zcGxpdChcIi4tMS5cIilbMF0pXG4gICAgICAgIC5tYXAoKF8pID0+IGBKT0lOICR7X30gSU4gZi4ke199YClcbiAgICAgICAgLnVuaXEoRXF1aXZhbGVuY2Uuc3RyaW5nKVxuICAgICAgICAuam9pbihcIlxcblwiKVxuICAgIH1cbiAgICBXSEVSRSBmLmlkICE9IEBpZCBBTkQgJHtcbiAgICAgIGZpbHRlclxuICAgICAgICAud2hlcmVcbiAgICAgICAgLm1hcCgoXykgPT5cbiAgICAgICAgICBfLmtleS5pbmNsdWRlcyhcIi4tMS5cIilcbiAgICAgICAgICAgID8geyAuLi5fLCBmOiBfLmtleS5zcGxpdChcIi4tMS5cIilbMF0sIGtleTogXy5rZXkuc3BsaXQoXCIuLTEuXCIpWzFdISB9XG4gICAgICAgICAgICA6IHsgLi4uXywgZjogXCJmXCIgfVxuICAgICAgICApXG4gICAgICAgIC5tYXAoXG4gICAgICAgICAgKHgsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBgJHt4LmZ9LiR7eC5rZXl9YFxuICAgICAgICAgICAgY29uc3QgdiA9IGBAdiR7aX1gXG5cbiAgICAgICAgICAgIHN3aXRjaCAoeC50KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJpblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgQVJSQVlfQ09OVEFJTlMoJHt2fSwgJHtrfSlgXG4gICAgICAgICAgICAgIGNhc2UgXCJub3QtaW5cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYChOT1QgQVJSQVlfQ09OVEFJTlMoJHt2fSwgJHtrfSkpYFxuICAgICAgICAgICAgICBjYXNlIFwiZW5kcy13aXRoXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBFTkRTV0lUSCgke2t9LCAke3Z9LCB0cnVlKWBcbiAgICAgICAgICAgICAgY2FzZSBcImluY2x1ZGVzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBBUlJBWV9DT05UQUlOUygke2t9LCAke3Z9KWBcbiAgICAgICAgICAgICAgY2FzZSBcIm5vdC1pbmNsdWRlc1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgKE5PVCBBUlJBWV9DT05UQUlOUygke2t9LCAke3Z9KSlgXG4gICAgICAgICAgICAgIGNhc2UgXCJjb250YWluc1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgQ09OVEFJTlMoJHtrfSwgJHt2fSwgdHJ1ZSlgXG4gICAgICAgICAgICAgIGNhc2UgXCJzdGFydHMtd2l0aFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBgU1RBUlRTV0lUSCgke2t9LCAke3Z9LCB0cnVlKWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGsgPSBsb3dlcklmTmVlZGVkKGssIHgudmFsdWUpXG4gICAgICAgICAgICBjb25zdCBsdiA9IGxvd2VySWZOZWVkZWQodiwgeC52YWx1ZSlcblxuICAgICAgICAgICAgc3dpdGNoICh4LnQpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImx0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2xrfSA8ICR7bHZ9YFxuICAgICAgICAgICAgICBjYXNlIFwibHRlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2xrfSA8PSAke2x2fWBcbiAgICAgICAgICAgICAgY2FzZSBcImd0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2xrfSA+ICR7bHZ9YFxuICAgICAgICAgICAgICBjYXNlIFwiZ3RlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2xrfSA+PSAke2x2fWBcbiAgICAgICAgICAgICAgY2FzZSBcIm5vdC1lcVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlID09PSBudWxsXG4gICAgICAgICAgICAgICAgICA/IGBJU19OVUxMKCR7a30pID0gZmFsc2VgXG4gICAgICAgICAgICAgICAgICA6IGAke2xrfSA8PiAke2x2fWBcbiAgICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAgIGNhc2UgXCJlcVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB4LnZhbHVlID09PSBudWxsXG4gICAgICAgICAgICAgICAgICA/IGBJU19OVUxMKCR7a30pID0gdHJ1ZWBcbiAgICAgICAgICAgICAgICAgIDogYCR7bGt9ID0gJHtsdn1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC5qb2luKGZpbHRlci5tb2RlID09PSBcIm9yXCIgPyBcIiBPUiBcIiA6IFwiIEFORCBcIilcbiAgICB9XG4gICAgJHtsbX1gLFxuICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgIHsgbmFtZTogXCJAaWRcIiwgdmFsdWU6IGltcG9ydGVkTWFya2VySWQgfSxcbiAgICAgIC4uLmZpbHRlclxuICAgICAgICAud2hlcmVcbiAgICAgICAgLm1hcCgoeCwgaSkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBgQHYke2l9YCxcbiAgICAgICAgICB2YWx1ZTogeC52YWx1ZVxuICAgICAgICB9KSlcbiAgICBdXG4gIH1cbn1cblxuLy8gZnVuY3Rpb24gaXNBcnJheSh0OiBTdXBwb3J0ZWRWYWx1ZXMgfCByZWFkb25seSBTdXBwb3J0ZWRWYWx1ZXNbXSk6IHQgaXMgcmVhZG9ubHkgU3VwcG9ydGVkVmFsdWVzW10ge1xuLy8gICByZXR1cm4gQXJyYXkuaXNBcnJheSh0KVxuLy8gfVxuXG5mdW5jdGlvbiBsb3dlcklmTmVlZGVkKGtleTogdW5rbm93biwgdmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IGBMT1dFUigke2tleX0pYCA6IGAke2tleX1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvc21vc1F1ZXJ5PFBNPihcbiAgZmlsdGVyOiBMZWdhY3lGaWx0ZXI8UE0+IHwgU3RvcmVXaGVyZUZpbHRlcixcbiAgbmFtZTogc3RyaW5nLFxuICBpbXBvcnRlZE1hcmtlcklkOiBzdHJpbmcsXG4gIHNraXA/OiBudW1iZXIsXG4gIGxpbWl0PzogbnVtYmVyXG4pIHtcbiAgcmV0dXJuIGZpbHRlci50eXBlID09PSBcInN0YXJ0c1dpdGhcIlxuICAgICAgfHwgZmlsdGVyLnR5cGUgPT09IFwiZW5kc1dpdGhcIlxuICAgICAgfHwgZmlsdGVyLnR5cGUgPT09IFwiY29udGFpbnNcIlxuICAgID8gYnVpbGRMZWdhY3lDb3Ntb3NRdWVyeShmaWx0ZXIsIG5hbWUsIGltcG9ydGVkTWFya2VySWQsIHNraXAsIGxpbWl0KVxuICAgIDogYnVpbGRXaGVyZUNvc21vc1F1ZXJ5KGZpbHRlciwgbmFtZSwgaW1wb3J0ZWRNYXJrZXJJZCwgc2tpcCwgbGltaXQpXG59XG5cbmNsYXNzIENvc21vc0RiT3BlcmF0aW9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBtZXNzYWdlOiBzdHJpbmcpIHt9XG59XG5leHBvcnQgZnVuY3Rpb24gQ29zbW9zU3RvcmVMaXZlKGNvbmZpZzogQ29uZmlnPFN0b3JhZ2VDb25maWc+KSB7XG4gIHJldHVybiBjb25maWcuY29uZmlnLmZsYXRNYXAobWFrZUNvc21vc1N0b3JlKS50b0xheWVyKFN0b3JlTWFrZXIpXG59XG4iXX0=
@@ -1 +0,0 @@
1
- 86abfcd3894752fc7211a2479161a1f24bc7df3ef89aaa7c2ff967fc7b5c673b