@archont561/qgis-sdk 0.3.0 → 0.5.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.
package/dist/host.js CHANGED
@@ -1,433 +1,75 @@
1
- // src/generated/host.ts
2
- var HOST_ID = "qgis.host";
3
- var HOST_FINGERPRINT = "sha256:f96bdf1046434de3c5eae01efb34c8ad2bcd1cf241a3dc42f6c4b613dc7d7d6f";
4
- var HOST_SCHEMA_VERSION = 1;
5
- var HOST_OPERATIONS = [
6
- "files.export",
7
- "layers.get",
8
- "layers.list",
9
- "layers.open_vector",
10
- "network.fetch",
11
- "notifications.info",
12
- "project.layer_ids",
13
- "settings.get",
14
- "styles.apply"
15
- ];
16
-
17
- class HostContractError extends Error {
18
- operation;
19
- constructor(operation, message) {
20
- super(`operation "${operation}": ${message}`);
21
- this.name = "HostContractError";
22
- this.operation = operation;
23
- }
24
- }
25
- function isRecord(value) {
26
- return typeof value === "object" && value !== null && !Array.isArray(value);
27
- }
28
- function hasOnly(value, keys) {
29
- return Object.keys(value).every((key) => keys.includes(key));
30
- }
31
- function isSafeInteger(value) {
32
- return typeof value === "number" && Number.isSafeInteger(value);
33
- }
34
- function ExportRequest(value, strict = false) {
35
- if (!isRecord(value))
36
- return false;
37
- if (!("file" in value))
38
- return false;
39
- if (!("content" in value))
40
- return false;
41
- if (value["content"] !== undefined && !(typeof value["content"] === "string")) {
42
- return false;
43
- }
44
- if (value["file"] !== undefined && !FileRef(value["file"], strict)) {
45
- return false;
46
- }
47
- if (strict && !hasOnly(value, ["content", "file"]))
48
- return false;
49
- return true;
50
- }
51
- function ExportResult(value, strict = false) {
52
- if (!isRecord(value))
53
- return false;
54
- if (!("bytes_written" in value))
55
- return false;
56
- if (!("name" in value))
57
- return false;
58
- if (value["bytes_written"] !== undefined && !isSafeInteger(value["bytes_written"])) {
59
- return false;
60
- }
61
- if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
62
- return false;
63
- }
64
- if (strict && !hasOnly(value, ["bytes_written", "name"]))
65
- return false;
66
- return true;
67
- }
68
- function FetchRequest(value, strict = false) {
69
- if (!isRecord(value))
70
- return false;
71
- if (!("url" in value))
72
- return false;
73
- if (value["auth_config"] !== undefined && !(typeof value["auth_config"] === "string")) {
74
- return false;
75
- }
76
- if (value["body"] !== undefined && !(typeof value["body"] === "string")) {
77
- return false;
78
- }
79
- if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader(item, strict)))) {
80
- return false;
81
- }
82
- if (value["method"] !== undefined && !(value["method"] === "GET" || value["method"] === "HEAD" || value["method"] === "POST" || value["method"] === "PUT" || value["method"] === "PATCH" || value["method"] === "DELETE" || value["method"] === "OPTIONS")) {
83
- return false;
84
- }
85
- if (value["timeout_seconds"] !== undefined && !(typeof value["timeout_seconds"] === "number" && Number.isFinite(value["timeout_seconds"]) && value["timeout_seconds"] >= 0.1 && value["timeout_seconds"] <= 300)) {
86
- return false;
87
- }
88
- if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
89
- return false;
90
- }
91
- if (strict && !hasOnly(value, ["auth_config", "body", "headers", "method", "timeout_seconds", "url"]))
92
- return false;
93
- return true;
94
- }
95
- function FileRef(value, strict = false) {
96
- if (!isRecord(value))
97
- return false;
98
- if (!("kind" in value))
99
- return false;
100
- if (!("id" in value))
101
- return false;
102
- if (value["id"] !== undefined && !(typeof value["id"] === "string" && new RegExp("^(?:[a-f0-9]{16,64})$").test(value["id"]))) {
103
- return false;
104
- }
105
- if (value["kind"] !== undefined && !(value["kind"] === "file")) {
106
- return false;
107
- }
108
- if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
109
- return false;
110
- }
111
- if (value["operations"] !== undefined && !(Array.isArray(value["operations"]) && value["operations"].every((item) => item === "read" || item === "write"))) {
112
- return false;
113
- }
114
- if (strict && !hasOnly(value, ["id", "kind", "name", "operations"]))
115
- return false;
116
- return true;
117
- }
118
- function HttpHeader(value, strict = false) {
119
- if (!isRecord(value))
120
- return false;
121
- if (!("name" in value))
122
- return false;
123
- if (!("value" in value))
124
- return false;
125
- if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
126
- return false;
127
- }
128
- if (value["value"] !== undefined && !(typeof value["value"] === "string")) {
129
- return false;
130
- }
131
- if (strict && !hasOnly(value, ["name", "value"]))
132
- return false;
133
- return true;
134
- }
135
- function IdPage(value, strict = false) {
136
- if (!isRecord(value))
137
- return false;
138
- if (!("items" in value))
139
- return false;
140
- if (!("truncated" in value))
141
- return false;
142
- if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => typeof item === "string"))) {
143
- return false;
144
- }
145
- if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
146
- return false;
147
- }
148
- if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
149
- return false;
150
- }
151
- if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
152
- return false;
153
- return true;
154
- }
155
- function LayerPage(value, strict = false) {
156
- if (!isRecord(value))
157
- return false;
158
- if (!("items" in value))
159
- return false;
160
- if (!("truncated" in value))
161
- return false;
162
- if (value["items"] !== undefined && !(Array.isArray(value["items"]) && value["items"].every((item) => VectorLayerInfo(item, strict)))) {
163
- return false;
164
- }
165
- if (value["next_cursor"] !== undefined && !(typeof value["next_cursor"] === "string")) {
166
- return false;
167
- }
168
- if (value["truncated"] !== undefined && !(typeof value["truncated"] === "boolean")) {
169
- return false;
170
- }
171
- if (strict && !hasOnly(value, ["items", "next_cursor", "truncated"]))
172
- return false;
173
- return true;
174
- }
175
- function LayerRequest(value, strict = false) {
176
- if (!isRecord(value))
177
- return false;
178
- if (!("layer_id" in value))
179
- return false;
180
- if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
181
- return false;
182
- }
183
- if (strict && !hasOnly(value, ["layer_id"]))
184
- return false;
185
- return true;
186
- }
187
- function NetworkFetchData(value, strict = false) {
188
- if (!isRecord(value))
189
- return false;
190
- if (!("url" in value))
191
- return false;
192
- if (!("status_code" in value))
193
- return false;
194
- if (!("reason" in value))
195
- return false;
196
- if (!("headers" in value))
197
- return false;
198
- if (!("text" in value))
199
- return false;
200
- if (!("base64" in value))
201
- return false;
202
- if (value["base64"] !== undefined && !(typeof value["base64"] === "string" || value["base64"] === null)) {
203
- return false;
204
- }
205
- if (value["headers"] !== undefined && !(Array.isArray(value["headers"]) && value["headers"].every((item) => HttpHeader(item, strict)))) {
206
- return false;
207
- }
208
- if (value["reason"] !== undefined && !(typeof value["reason"] === "string")) {
209
- return false;
210
- }
211
- if (value["status_code"] !== undefined && !isSafeInteger(value["status_code"])) {
212
- return false;
213
- }
214
- if (value["text"] !== undefined && !(typeof value["text"] === "string" || value["text"] === null)) {
215
- return false;
216
- }
217
- if (value["url"] !== undefined && !(typeof value["url"] === "string")) {
218
- return false;
219
- }
220
- if (strict && !hasOnly(value, ["base64", "headers", "reason", "status_code", "text", "url"]))
221
- return false;
222
- return true;
223
- }
224
- function NotificationsInfoRequest(value, strict = false) {
225
- if (!isRecord(value))
226
- return false;
227
- if (!("message" in value))
228
- return false;
229
- if (value["message"] !== undefined && !(typeof value["message"] === "string")) {
230
- return false;
231
- }
232
- if (strict && !hasOnly(value, ["message"]))
233
- return false;
234
- return true;
235
- }
236
- function OpenVectorRequest(value, strict = false) {
237
- if (!isRecord(value))
238
- return false;
239
- if (!("file" in value))
240
- return false;
241
- if (value["file"] !== undefined && !FileRef(value["file"], strict)) {
242
- return false;
243
- }
244
- if (strict && !hasOnly(value, ["file"]))
245
- return false;
246
- return true;
247
- }
248
- function PageRequest(value, strict = false) {
249
- if (!isRecord(value))
250
- return false;
251
- if (value["cursor"] !== undefined && !(typeof value["cursor"] === "string" && new RegExp("^(?:[0-9]+)$").test(value["cursor"]))) {
252
- return false;
253
- }
254
- if (value["limit"] !== undefined && !(isSafeInteger(value["limit"]) && value["limit"] >= 1 && value["limit"] <= 200)) {
255
- return false;
256
- }
257
- if (strict && !hasOnly(value, ["cursor", "limit"]))
258
- return false;
259
- return true;
260
- }
261
- function SettingsGetRequest(value, strict = false) {
262
- if (!isRecord(value))
263
- return false;
264
- if (!("key" in value))
265
- return false;
266
- if (value["default"] !== undefined && !(typeof value["default"] === "string" || value["default"] === null)) {
267
- return false;
268
- }
269
- if (value["key"] !== undefined && !(typeof value["key"] === "string")) {
270
- return false;
271
- }
272
- if (strict && !hasOnly(value, ["default", "key"]))
273
- return false;
274
- return true;
275
- }
276
- function StylesApplyRequest(value, strict = false) {
277
- if (!isRecord(value))
278
- return false;
279
- if (!("layer_id" in value))
280
- return false;
281
- if (!("style" in value))
282
- return false;
283
- if (value["layer_id"] !== undefined && !(typeof value["layer_id"] === "string")) {
284
- return false;
285
- }
286
- if (value["style"] !== undefined && !(typeof value["style"] === "string")) {
287
- return false;
288
- }
289
- if (strict && !hasOnly(value, ["layer_id", "style"]))
290
- return false;
291
- return true;
292
- }
293
- function VectorLayerInfo(value, strict = false) {
294
- if (!isRecord(value))
295
- return false;
296
- if (!("id" in value))
297
- return false;
298
- if (!("name" in value))
299
- return false;
300
- if (!("geometry_type" in value))
301
- return false;
302
- if (!("field_names" in value))
303
- return false;
304
- if (!("crs" in value))
305
- return false;
306
- if (value["crs"] !== undefined && !(typeof value["crs"] === "string" || value["crs"] === null)) {
307
- return false;
308
- }
309
- if (value["field_names"] !== undefined && !(Array.isArray(value["field_names"]) && value["field_names"].every((item) => typeof item === "string"))) {
310
- return false;
311
- }
312
- if (value["geometry_type"] !== undefined && !(value["geometry_type"] === "point" || value["geometry_type"] === "line" || value["geometry_type"] === "polygon" || value["geometry_type"] === "none")) {
313
- return false;
314
- }
315
- if (value["id"] !== undefined && !(typeof value["id"] === "string")) {
316
- return false;
317
- }
318
- if (value["name"] !== undefined && !(typeof value["name"] === "string")) {
319
- return false;
320
- }
321
- if (strict && !hasOnly(value, ["crs", "field_names", "geometry_type", "id", "name"]))
322
- return false;
323
- return true;
324
- }
325
- function NetworkFetchEvent(value, strict = false) {
326
- if (!isRecord(value))
327
- return false;
328
- if (value.kind === "data")
329
- return NetworkFetchData(value.payload, strict);
330
- return false;
331
- }
332
- function createHost(client) {
333
- return {
334
- files: {
335
- export: (input, options) => call(client, "files.export", input, options, ExportRequest, ExportResult)
336
- },
337
- layers: {
338
- get: (input, options) => call(client, "layers.get", input, options, LayerRequest, VectorLayerInfo),
339
- list: (input, options) => call(client, "layers.list", input, options, PageRequest, LayerPage),
340
- open_vector: (input, options) => call(client, "layers.open_vector", input, options, OpenVectorRequest, VectorLayerInfo)
341
- },
342
- network: {
343
- fetch: (input, handlers, options) => open(client, "network.fetch", input, handlers, options, FetchRequest, NetworkFetchEvent)
344
- },
345
- notifications: {
346
- info: (input, options) => call(client, "notifications.info", input, options, NotificationsInfoRequest, (candidate) => candidate === null)
347
- },
348
- project: {
349
- layer_ids: (input, options) => call(client, "project.layer_ids", input, options, PageRequest, IdPage)
350
- },
351
- settings: {
352
- get: (input, options) => call(client, "settings.get", input, options, SettingsGetRequest, (candidate) => typeof candidate === "string" || candidate === null)
353
- },
354
- styles: {
355
- apply: (input, options) => call(client, "styles.apply", input, options, StylesApplyRequest, (candidate) => candidate === null)
356
- }
357
- };
358
- }
359
- async function call(client, operation, input, options, acceptInput, acceptOutput) {
360
- if (input !== undefined && !acceptInput(input, true)) {
361
- throw new HostContractError(operation, "the arguments do not match the declared request");
362
- }
363
- const value = await client.invoke(operation, input ?? {}, options);
364
- if (!acceptOutput(value)) {
365
- throw new HostContractError(operation, "the response does not match the declared result");
366
- }
367
- return value;
368
- }
369
- async function open(client, operation, input, handlers, options, acceptInput, acceptEvent) {
370
- if (!acceptInput(input, true)) {
371
- throw new HostContractError(operation, "the arguments do not match the declared request");
372
- }
373
- let ended = false;
374
- let violated = false;
375
- let handle = null;
376
- const end = (terminal) => {
377
- if (ended)
378
- return;
379
- ended = true;
380
- handlers.onTerminal?.(terminal);
381
- };
382
- handle = await client.subscribe(operation, input, {
383
- onEvent: (event) => {
384
- if (ended)
385
- return;
386
- if (acceptEvent(event)) {
387
- handlers.onEvent?.(event);
388
- return;
389
- }
390
- end({
391
- kind: "error",
392
- message: new HostContractError(operation, "an event does not match the declared events").message
393
- });
394
- if (handle === null) {
395
- violated = true;
396
- } else {
397
- handle.close();
398
- }
399
- },
400
- onTerminal: end
401
- }, options);
402
- if (violated) {
403
- handle.close();
404
- }
405
- return handle;
406
- }
1
+ import {
2
+ HOST_ID2,
3
+ HOST_FINGERPRINT2,
4
+ HOST_SCHEMA_VERSION2,
5
+ HOST_OPERATIONS2,
6
+ QgisSdkHostContractError2,
7
+ AlgorithmInfo2,
8
+ AlgorithmListRequest2,
9
+ AlgorithmPage2,
10
+ AlgorithmRequest2,
11
+ AlgorithmSummary2,
12
+ ExportRequest2,
13
+ ExportResult2,
14
+ FetchRequest2,
15
+ FileRef2,
16
+ HttpHeader2,
17
+ IdPage2,
18
+ LayerPage2,
19
+ LayerRequest2,
20
+ NetworkFetchData2,
21
+ NotificationsInfoRequest2,
22
+ OpenVectorRequest2,
23
+ OutputInfo2,
24
+ PageRequest2,
25
+ ParameterInfo2,
26
+ ProviderInfo2,
27
+ ProviderPage2,
28
+ RunAlgorithmRequest2,
29
+ RunOutput2,
30
+ RunResult2,
31
+ SettingsGetRequest2,
32
+ StylesApplyRequest2,
33
+ VectorLayerInfo2,
34
+ NetworkFetchEvent2,
35
+ createHost2
36
+ } from "./shared/chunk-stre69mw.js";
407
37
  export {
408
- ExportRequest,
409
- ExportResult,
410
- FetchRequest,
411
- FileRef,
412
- HOST_FINGERPRINT,
413
- HOST_ID,
414
- HOST_OPERATIONS,
415
- HOST_SCHEMA_VERSION,
416
- HostContractError,
417
- HttpHeader,
418
- IdPage,
419
- LayerPage,
420
- LayerRequest,
421
- NetworkFetchData,
422
- NetworkFetchEvent,
423
- NotificationsInfoRequest,
424
- OpenVectorRequest,
425
- PageRequest,
426
- SettingsGetRequest,
427
- StylesApplyRequest,
428
- VectorLayerInfo,
429
- createHost
38
+ AlgorithmInfo2 as AlgorithmInfo,
39
+ AlgorithmListRequest2 as AlgorithmListRequest,
40
+ AlgorithmPage2 as AlgorithmPage,
41
+ AlgorithmRequest2 as AlgorithmRequest,
42
+ AlgorithmSummary2 as AlgorithmSummary,
43
+ ExportRequest2 as ExportRequest,
44
+ ExportResult2 as ExportResult,
45
+ FetchRequest2 as FetchRequest,
46
+ FileRef2 as FileRef,
47
+ HOST_FINGERPRINT2 as HOST_FINGERPRINT,
48
+ HOST_ID2 as HOST_ID,
49
+ HOST_OPERATIONS2 as HOST_OPERATIONS,
50
+ HOST_SCHEMA_VERSION2 as HOST_SCHEMA_VERSION,
51
+ HttpHeader2 as HttpHeader,
52
+ IdPage2 as IdPage,
53
+ LayerPage2 as LayerPage,
54
+ LayerRequest2 as LayerRequest,
55
+ NetworkFetchData2 as NetworkFetchData,
56
+ NetworkFetchEvent2 as NetworkFetchEvent,
57
+ NotificationsInfoRequest2 as NotificationsInfoRequest,
58
+ OpenVectorRequest2 as OpenVectorRequest,
59
+ OutputInfo2 as OutputInfo,
60
+ PageRequest2 as PageRequest,
61
+ ParameterInfo2 as ParameterInfo,
62
+ ProviderInfo2 as ProviderInfo,
63
+ ProviderPage2 as ProviderPage,
64
+ QgisSdkHostContractError2 as QgisSdkHostContractError,
65
+ RunAlgorithmRequest2 as RunAlgorithmRequest,
66
+ RunOutput2 as RunOutput,
67
+ RunResult2 as RunResult,
68
+ SettingsGetRequest2 as SettingsGetRequest,
69
+ StylesApplyRequest2 as StylesApplyRequest,
70
+ VectorLayerInfo2 as VectorLayerInfo,
71
+ createHost2 as createHost
430
72
  };
431
73
 
432
- //# debugId=EF165F591C75829964756E2164756E21
433
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2dlbmVyYXRlZC9ob3N0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8vIEdlbmVyYXRlZCBieSBxZ2lzLXNkay4gRG8gbm90IGVkaXQuXG4vLyBTb3VyY2U6IHRoZSBjdXJhdGVkIGhvc3QgbWFuaWZlc3QgaW4gcWdpc19zZGsuYnJpZGdlLmhvc3QuXG4vLyBSZWdlbmVyYXRlIHdpdGggYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZSAtLWhvc3RgOyBDSSBmYWlscyBvbiBkcmlmdC5cblxuZXhwb3J0IGNvbnN0IEhPU1RfSUQgPSBcInFnaXMuaG9zdFwiO1xuZXhwb3J0IGNvbnN0IEhPU1RfRklOR0VSUFJJTlQgPSBcInNoYTI1NjpmOTZiZGYxMDQ2NDM0ZGUzYzVlYWUwMWVmYjM0YzhhZDJiY2QxY2YyNDFhM2RjNDJmNmM0YjYxM2RjN2Q3ZDZmXCI7XG5leHBvcnQgY29uc3QgSE9TVF9TQ0hFTUFfVkVSU0lPTiA9IDE7XG5cbi8qKiBFdmVyeSBkZWNsYXJlZCBvcGVyYXRpb24gaWQsIHNvIGEgbmFtZSBjYW4gYmUgY2hlY2tlZCwgbm90IGd1ZXNzZWQuICovXG5leHBvcnQgY29uc3QgSE9TVF9PUEVSQVRJT05TID0gW1xuXHRcImZpbGVzLmV4cG9ydFwiLFxuXHRcImxheWVycy5nZXRcIixcblx0XCJsYXllcnMubGlzdFwiLFxuXHRcImxheWVycy5vcGVuX3ZlY3RvclwiLFxuXHRcIm5ldHdvcmsuZmV0Y2hcIixcblx0XCJub3RpZmljYXRpb25zLmluZm9cIixcblx0XCJwcm9qZWN0LmxheWVyX2lkc1wiLFxuXHRcInNldHRpbmdzLmdldFwiLFxuXHRcInN0eWxlcy5hcHBseVwiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgSG9zdE9wZXJhdGlvbklkID0gKHR5cGVvZiBIT1NUX09QRVJBVElPTlMpW251bWJlcl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdEludm9rZU9wdGlvbnMge1xuXHRyZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIFRoZSBjbGllbnQgdGhpcyBtb2R1bGUgd3JhcHM6IGFueXRoaW5nIHdpdGggYSBjb3JyZWxhdGVkIGludm9rZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdENsaWVudExpa2Uge1xuXHRpbnZva2UoXG5cdFx0b3BlcmF0aW9uOiBzdHJpbmcsXG5cdFx0cGF5bG9hZD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcblx0XHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG5cdCk6IFByb21pc2U8dW5rbm93bj47XG5cdHN1YnNjcmliZShcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0XHRwYXlsb2FkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdGhhbmRsZXJzPzogSG9zdFN0cmVhbUhhbmRsZXJzPHtcblx0XHRcdHJlYWRvbmx5IGtpbmQ6IFwiZGF0YVwiIHwgXCJwcm9ncmVzc1wiIHwgXCJzdGF0ZVwiO1xuXHRcdFx0cmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcblx0XHR9Pixcblx0XHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG5cdCk6IFByb21pc2U8SG9zdFN0cmVhbUhhbmRsZT47XG59XG5cbi8qKiBIb3cgYSBzdHJlYW0gZW5kZWQ7IGBkcm9wcGVkYCBpcyBvbmx5IHByZXNlbnQgZm9yIGEgZ2FwLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0U3RyZWFtVGVybWluYWwge1xuXHRyZWFkb25seSBraW5kOiBcImNvbXBsZXRlXCIgfCBcImVycm9yXCIgfCBcImNhbmNlbGxlZFwiIHwgXCJnYXBcIiB8IFwiZGlzcG9zZWRcIjtcblx0cmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblx0cmVhZG9ubHkgZHJvcHBlZD86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQgYSBzdHJlYW0gcmVwb3J0czogdHlwZWQgZXZlbnRzLCB0aGVuIGV4YWN0bHkgb25lIGVuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdFN0cmVhbUhhbmRsZXJzPEU+IHtcblx0cmVhZG9ubHkgb25FdmVudD86IChldmVudDogRSkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25UZXJtaW5hbD86ICh0ZXJtaW5hbDogSG9zdFN0cmVhbVRlcm1pbmFsKSA9PiB2b2lkO1xufVxuXG4vKiogQSBsaXZlIHN0cmVhbSwgYXMgdGhlIGNhbGxlciBob2xkcyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdFN0cmVhbUhhbmRsZSB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGNsb3NlZDogYm9vbGVhbjtcblx0Y2xvc2UoKTogdm9pZDtcbn1cblxuLyoqIEFuIGFyZ3VtZW50IG9yIGEgcmVzcG9uc2UgdGhhdCBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyZWQgc2NoZW1hLiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RDb250cmFjdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvcGVyYXRpb246IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIoYG9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiOiAke21lc3NhZ2V9YCk7XG5cdFx0dGhpcy5uYW1lID0gXCJIb3N0Q29udHJhY3RFcnJvclwiO1xuXHRcdHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaGFzT25seShcblx0dmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRrZXlzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IGJvb2xlYW4ge1xuXHRyZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmV2ZXJ5KChrZXkpID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRSZXF1ZXN0IHtcblx0cmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXHRyZWFkb25seSBmaWxlOiBGaWxlUmVmO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFJlc3VsdCB7XG5cdHJlYWRvbmx5IGJ5dGVzX3dyaXR0ZW46IG51bWJlcjtcblx0cmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGF1dGhfY29uZmlnPzogc3RyaW5nO1xuXHRyZWFkb25seSBib2R5Pzogc3RyaW5nO1xuXHRyZWFkb25seSBoZWFkZXJzPzogcmVhZG9ubHkgSHR0cEhlYWRlcltdO1xuXHRyZWFkb25seSBtZXRob2Q/OiBcIkdFVFwiIHwgXCJIRUFEXCIgfCBcIlBPU1RcIiB8IFwiUFVUXCIgfCBcIlBBVENIXCIgfCBcIkRFTEVURVwiIHwgXCJPUFRJT05TXCI7XG5cdHJlYWRvbmx5IHRpbWVvdXRfc2Vjb25kcz86IG51bWJlcjtcblx0cmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlZiB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGtpbmQ6IFwiZmlsZVwiO1xuXHRyZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXHRyZWFkb25seSBvcGVyYXRpb25zPzogcmVhZG9ubHkgKFwicmVhZFwiIHwgXCJ3cml0ZVwiKVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBIZWFkZXIge1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRQYWdlIHtcblx0cmVhZG9ubHkgaXRlbXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHRyZWFkb25seSBuZXh0X2N1cnNvcj86IHN0cmluZztcblx0cmVhZG9ubHkgdHJ1bmNhdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheWVyUGFnZSB7XG5cdHJlYWRvbmx5IGl0ZW1zOiByZWFkb25seSBWZWN0b3JMYXllckluZm9bXTtcblx0cmVhZG9ubHkgbmV4dF9jdXJzb3I/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IHRydW5jYXRlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXllclJlcXVlc3Qge1xuXHRyZWFkb25seSBsYXllcl9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtGZXRjaERhdGEge1xuXHRyZWFkb25seSBiYXNlNjQ6IHN0cmluZyB8IG51bGw7XG5cdHJlYWRvbmx5IGhlYWRlcnM6IHJlYWRvbmx5IEh0dHBIZWFkZXJbXTtcblx0cmVhZG9ubHkgcmVhc29uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHN0YXR1c19jb2RlOiBudW1iZXI7XG5cdHJlYWRvbmx5IHRleHQ6IHN0cmluZyB8IG51bGw7XG5cdHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCB7XG5cdHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuVmVjdG9yUmVxdWVzdCB7XG5cdHJlYWRvbmx5IGZpbGU6IEZpbGVSZWY7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlcXVlc3Qge1xuXHRyZWFkb25seSBjdXJzb3I/OiBzdHJpbmc7XG5cdHJlYWRvbmx5IGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzR2V0UmVxdWVzdCB7XG5cdHJlYWRvbmx5IGRlZmF1bHQ/OiBzdHJpbmcgfCBudWxsO1xuXHRyZWFkb25seSBrZXk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHlsZXNBcHBseVJlcXVlc3Qge1xuXHRyZWFkb25seSBsYXllcl9pZDogc3RyaW5nO1xuXHRyZWFkb25seSBzdHlsZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvckxheWVySW5mbyB7XG5cdHJlYWRvbmx5IGNyczogc3RyaW5nIHwgbnVsbDtcblx0cmVhZG9ubHkgZmllbGRfbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHRyZWFkb25seSBnZW9tZXRyeV90eXBlOiBcInBvaW50XCIgfCBcImxpbmVcIiB8IFwicG9seWdvblwiIHwgXCJub25lXCI7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydFJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgRXhwb3J0UmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImNvbnRlbnRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiY29udGVudFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiY29udGVudFwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiZmlsZVwiXSAhPT0gdW5kZWZpbmVkICYmICEoRmlsZVJlZih2YWx1ZVtcImZpbGVcIl0sIHN0cmljdCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImNvbnRlbnRcIiwgXCJmaWxlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV4cG9ydFJlc3VsdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBFeHBvcnRSZXN1bHQge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImJ5dGVzX3dyaXR0ZW5cIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJuYW1lXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImJ5dGVzX3dyaXR0ZW5cIl0gIT09IHVuZGVmaW5lZCAmJiAhKGlzU2FmZUludGVnZXIodmFsdWVbXCJieXRlc193cml0dGVuXCJdKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiYnl0ZXNfd3JpdHRlblwiLCBcIm5hbWVcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRmV0Y2hSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIEZldGNoUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidXJsXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImF1dGhfY29uZmlnXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJhdXRoX2NvbmZpZ1wiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiYm9keVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiYm9keVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiaGVhZGVyc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJoZWFkZXJzXCJdKSAmJiB2YWx1ZVtcImhlYWRlcnNcIl0uZXZlcnkoKGl0ZW0pID0+IEh0dHBIZWFkZXIoaXRlbSwgc3RyaWN0KSkpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJtZXRob2RcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJHRVRcIiB8fCB2YWx1ZVtcIm1ldGhvZFwiXSA9PT0gXCJIRUFEXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiUE9TVFwiIHx8IHZhbHVlW1wibWV0aG9kXCJdID09PSBcIlBVVFwiIHx8IHZhbHVlW1wibWV0aG9kXCJdID09PSBcIlBBVENIXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiREVMRVRFXCIgfHwgdmFsdWVbXCJtZXRob2RcIl0gPT09IFwiT1BUSU9OU1wiKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZVtcInRpbWVvdXRfc2Vjb25kc1wiXSkgJiYgdmFsdWVbXCJ0aW1lb3V0X3NlY29uZHNcIl0gPj0gMC4xICYmIHZhbHVlW1widGltZW91dF9zZWNvbmRzXCJdIDw9IDMwMCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInVybFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widXJsXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJhdXRoX2NvbmZpZ1wiLCBcImJvZHlcIiwgXCJoZWFkZXJzXCIsIFwibWV0aG9kXCIsIFwidGltZW91dF9zZWNvbmRzXCIsIFwidXJsXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZpbGVSZWYodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgRmlsZVJlZiB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwia2luZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcImlkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImlkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJpZFwiXSA9PT0gXCJzdHJpbmdcIiAmJiBuZXcgUmVnRXhwKFwiXig/OlthLWYwLTldezE2LDY0fSkkXCIpLnRlc3QodmFsdWVbXCJpZFwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImtpbmRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcImtpbmRcIl0gPT09IFwiZmlsZVwiKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wib3BlcmF0aW9uc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJvcGVyYXRpb25zXCJdKSAmJiB2YWx1ZVtcIm9wZXJhdGlvbnNcIl0uZXZlcnkoKGl0ZW0pID0+IChpdGVtID09PSBcInJlYWRcIiB8fCBpdGVtID09PSBcIndyaXRlXCIpKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImlkXCIsIFwia2luZFwiLCBcIm5hbWVcIiwgXCJvcGVyYXRpb25zXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEh0dHBIZWFkZXIodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgSHR0cEhlYWRlciB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibmFtZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInZhbHVlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcIm5hbWVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcIm5hbWVcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInZhbHVlXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJ2YWx1ZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibmFtZVwiLCBcInZhbHVlXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElkUGFnZSh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBJZFBhZ2Uge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIml0ZW1zXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwidHJ1bmNhdGVkXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcIml0ZW1zXCJdICE9PSB1bmRlZmluZWQgJiYgISgoQXJyYXkuaXNBcnJheSh2YWx1ZVtcIml0ZW1zXCJdKSAmJiB2YWx1ZVtcIml0ZW1zXCJdLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJuZXh0X2N1cnNvclwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmV4dF9jdXJzb3JcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInRydW5jYXRlZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widHJ1bmNhdGVkXCJdID09PSBcImJvb2xlYW5cIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiaXRlbXNcIiwgXCJuZXh0X2N1cnNvclwiLCBcInRydW5jYXRlZFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYXllclBhZ2UodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgTGF5ZXJQYWdlIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJpdGVtc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInRydW5jYXRlZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJpdGVtc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJpdGVtc1wiXSkgJiYgdmFsdWVbXCJpdGVtc1wiXS5ldmVyeSgoaXRlbSkgPT4gVmVjdG9yTGF5ZXJJbmZvKGl0ZW0sIHN0cmljdCkpKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmV4dF9jdXJzb3JcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcIm5leHRfY3Vyc29yXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJ0cnVuY2F0ZWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInRydW5jYXRlZFwiXSA9PT0gXCJib29sZWFuXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcIml0ZW1zXCIsIFwibmV4dF9jdXJzb3JcIiwgXCJ0cnVuY2F0ZWRcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTGF5ZXJSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIExheWVyUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibGF5ZXJfaWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wibGF5ZXJfaWRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcImxheWVyX2lkXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJsYXllcl9pZFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBOZXR3b3JrRmV0Y2hEYXRhKHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE5ldHdvcmtGZXRjaERhdGEge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInVybFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInN0YXR1c19jb2RlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwicmVhc29uXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiaGVhZGVyc1wiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcInRleHRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJiYXNlNjRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiYmFzZTY0XCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1wiYmFzZTY0XCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1wiYmFzZTY0XCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiaGVhZGVyc1wiXSAhPT0gdW5kZWZpbmVkICYmICEoKEFycmF5LmlzQXJyYXkodmFsdWVbXCJoZWFkZXJzXCJdKSAmJiB2YWx1ZVtcImhlYWRlcnNcIl0uZXZlcnkoKGl0ZW0pID0+IEh0dHBIZWFkZXIoaXRlbSwgc3RyaWN0KSkpKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAodmFsdWVbXCJyZWFzb25cIl0gIT09IHVuZGVmaW5lZCAmJiAhKHR5cGVvZiB2YWx1ZVtcInJlYXNvblwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wic3RhdHVzX2NvZGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKGlzU2FmZUludGVnZXIodmFsdWVbXCJzdGF0dXNfY29kZVwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInRleHRcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh0eXBlb2YgdmFsdWVbXCJ0ZXh0XCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1widGV4dFwiXSA9PT0gbnVsbCkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInVybFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1widXJsXCJdID09PSBcInN0cmluZ1wiKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJiYXNlNjRcIiwgXCJoZWFkZXJzXCIsIFwicmVhc29uXCIsIFwic3RhdHVzX2NvZGVcIiwgXCJ0ZXh0XCIsIFwidXJsXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBOb3RpZmljYXRpb25zSW5mb1JlcXVlc3Qge1xuXHRpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIm1lc3NhZ2VcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wibWVzc2FnZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibWVzc2FnZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibWVzc2FnZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBPcGVuVmVjdG9yUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBPcGVuVmVjdG9yUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJmaWxlXCJdICE9PSB1bmRlZmluZWQgJiYgIShGaWxlUmVmKHZhbHVlW1wiZmlsZVwiXSwgc3RyaWN0KSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiZmlsZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQYWdlUmVxdWVzdCh2YWx1ZTogdW5rbm93biwgc3RyaWN0ID0gZmFsc2UpOiB2YWx1ZSBpcyBQYWdlUmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICh2YWx1ZVtcImN1cnNvclwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wiY3Vyc29yXCJdID09PSBcInN0cmluZ1wiICYmIG5ldyBSZWdFeHAoXCJeKD86WzAtOV0rKSRcIikudGVzdCh2YWx1ZVtcImN1cnNvclwiXSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImxpbWl0XCJdICE9PSB1bmRlZmluZWQgJiYgISgoaXNTYWZlSW50ZWdlcih2YWx1ZVtcImxpbWl0XCJdKSAmJiB2YWx1ZVtcImxpbWl0XCJdID49IDEgJiYgdmFsdWVbXCJsaW1pdFwiXSA8PSAyMDApKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRpZiAoc3RyaWN0ICYmICFoYXNPbmx5KHZhbHVlLCBbXCJjdXJzb3JcIiwgXCJsaW1pdFwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTZXR0aW5nc0dldFJlcXVlc3QodmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgU2V0dGluZ3NHZXRSZXF1ZXN0IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJrZXlcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiZGVmYXVsdFwiXSAhPT0gdW5kZWZpbmVkICYmICEoKHR5cGVvZiB2YWx1ZVtcImRlZmF1bHRcIl0gPT09IFwic3RyaW5nXCIgfHwgdmFsdWVbXCJkZWZhdWx0XCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wia2V5XCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJrZXlcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmIChzdHJpY3QgJiYgIWhhc09ubHkodmFsdWUsIFtcImRlZmF1bHRcIiwgXCJrZXlcIl0pKSByZXR1cm4gZmFsc2U7XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gU3R5bGVzQXBwbHlSZXF1ZXN0KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIFN0eWxlc0FwcGx5UmVxdWVzdCB7XG5cdGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwibGF5ZXJfaWRcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJzdHlsZVwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAodmFsdWVbXCJsYXllcl9pZFwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibGF5ZXJfaWRcIl0gPT09IFwic3RyaW5nXCIpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcInN0eWxlXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJzdHlsZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wibGF5ZXJfaWRcIiwgXCJzdHlsZVwiXSkpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBWZWN0b3JMYXllckluZm8odmFsdWU6IHVua25vd24sIHN0cmljdCA9IGZhbHNlKTogdmFsdWUgaXMgVmVjdG9yTGF5ZXJJbmZvIHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJpZFwiIGluIHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoIShcIm5hbWVcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJnZW9tZXRyeV90eXBlXCIgaW4gdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cdGlmICghKFwiZmllbGRfbmFtZXNcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKCEoXCJjcnNcIiBpbiB2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlW1wiY3JzXCJdICE9PSB1bmRlZmluZWQgJiYgISgodHlwZW9mIHZhbHVlW1wiY3JzXCJdID09PSBcInN0cmluZ1wiIHx8IHZhbHVlW1wiY3JzXCJdID09PSBudWxsKSkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wiZmllbGRfbmFtZXNcIl0gIT09IHVuZGVmaW5lZCAmJiAhKChBcnJheS5pc0FycmF5KHZhbHVlW1wiZmllbGRfbmFtZXNcIl0pICYmIHZhbHVlW1wiZmllbGRfbmFtZXNcIl0uZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSkpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gIT09IHVuZGVmaW5lZCAmJiAhKCh2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gPT09IFwicG9pbnRcIiB8fCB2YWx1ZVtcImdlb21ldHJ5X3R5cGVcIl0gPT09IFwibGluZVwiIHx8IHZhbHVlW1wiZ2VvbWV0cnlfdHlwZVwiXSA9PT0gXCJwb2x5Z29uXCIgfHwgdmFsdWVbXCJnZW9tZXRyeV90eXBlXCJdID09PSBcIm5vbmVcIikpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh2YWx1ZVtcImlkXCJdICE9PSB1bmRlZmluZWQgJiYgISh0eXBlb2YgdmFsdWVbXCJpZFwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHZhbHVlW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkICYmICEodHlwZW9mIHZhbHVlW1wibmFtZVwiXSA9PT0gXCJzdHJpbmdcIikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKHN0cmljdCAmJiAhaGFzT25seSh2YWx1ZSwgW1wiY3JzXCIsIFwiZmllbGRfbmFtZXNcIiwgXCJnZW9tZXRyeV90eXBlXCIsIFwiaWRcIiwgXCJuYW1lXCJdKSkgcmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIE9uZSBldmVudCBvZiBgbmV0d29yay5mZXRjaGAsIG5hcnJvd2VkIGJ5IGl0cyBraW5kLiAqL1xuZXhwb3J0IHR5cGUgTmV0d29ya0ZldGNoRXZlbnQgPVxuXHR8IHsgcmVhZG9ubHkga2luZDogXCJkYXRhXCI7IHJlYWRvbmx5IHBheWxvYWQ6IE5ldHdvcmtGZXRjaERhdGEgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIE5ldHdvcmtGZXRjaEV2ZW50KHZhbHVlOiB1bmtub3duLCBzdHJpY3QgPSBmYWxzZSk6IHZhbHVlIGlzIE5ldHdvcmtGZXRjaEV2ZW50IHtcblx0aWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblx0aWYgKHZhbHVlLmtpbmQgPT09IFwiZGF0YVwiKSByZXR1cm4gTmV0d29ya0ZldGNoRGF0YSh2YWx1ZS5wYXlsb2FkLCBzdHJpY3QpO1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBFdmVyeSBvcGVyYXRpb24gdGhpcyBzdXJmYWNlIGRlY2xhcmVzLCBhcyBjYWxsYWJsZSBtZXRob2RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0T3BlcmF0aW9ucyB7XG5cdHJlYWRvbmx5IGZpbGVzOiB7XG5cdFx0cmVhZG9ubHkgZXhwb3J0OiAoaW5wdXQ6IEV4cG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxFeHBvcnRSZXN1bHQ+O1xuXHR9O1xuXHRyZWFkb25seSBsYXllcnM6IHtcblx0XHRyZWFkb25seSBnZXQ6IChpbnB1dDogTGF5ZXJSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8VmVjdG9yTGF5ZXJJbmZvPjtcblx0XHRyZWFkb25seSBsaXN0OiAoaW5wdXQ/OiBQYWdlUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPExheWVyUGFnZT47XG5cdFx0cmVhZG9ubHkgb3Blbl92ZWN0b3I6IChpbnB1dDogT3BlblZlY3RvclJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxWZWN0b3JMYXllckluZm8+O1xuXHR9O1xuXHRyZWFkb25seSBuZXR3b3JrOiB7XG5cdFx0cmVhZG9ubHkgZmV0Y2g6IChpbnB1dDogRmV0Y2hSZXF1ZXN0LCBoYW5kbGVyczogSG9zdFN0cmVhbUhhbmRsZXJzPE5ldHdvcmtGZXRjaEV2ZW50Piwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PiBQcm9taXNlPEhvc3RTdHJlYW1IYW5kbGU+O1xuXHR9O1xuXHRyZWFkb25seSBub3RpZmljYXRpb25zOiB7XG5cdFx0cmVhZG9ubHkgaW5mbzogKGlucHV0OiBOb3RpZmljYXRpb25zSW5mb1JlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxudWxsPjtcblx0fTtcblx0cmVhZG9ubHkgcHJvamVjdDoge1xuXHRcdHJlYWRvbmx5IGxheWVyX2lkczogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxJZFBhZ2U+O1xuXHR9O1xuXHRyZWFkb25seSBzZXR0aW5nczoge1xuXHRcdHJlYWRvbmx5IGdldDogKGlucHV0OiBTZXR0aW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcblx0fTtcblx0cmVhZG9ubHkgc3R5bGVzOiB7XG5cdFx0cmVhZG9ubHkgYXBwbHk6IChpbnB1dDogU3R5bGVzQXBwbHlSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8bnVsbD47XG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIb3N0KGNsaWVudDogSG9zdENsaWVudExpa2UpOiBIb3N0T3BlcmF0aW9ucyB7XG5cdHJldHVybiB7XG5cdFx0ZmlsZXM6IHtcblx0XHRcdGV4cG9ydDogKGlucHV0OiBFeHBvcnRSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8RXhwb3J0UmVzdWx0Pihcblx0XHRcdFx0XHRjbGllbnQsIFwiZmlsZXMuZXhwb3J0XCIsIGlucHV0LCBvcHRpb25zLFxuXHRcdFx0XHRcdEV4cG9ydFJlcXVlc3QsXG5cdFx0XHRcdFx0RXhwb3J0UmVzdWx0LFxuXHRcdFx0XHQpLFxuXHRcdH0sXG5cdFx0bGF5ZXJzOiB7XG5cdFx0XHRnZXQ6IChpbnB1dDogTGF5ZXJSZXF1ZXN0LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdGNhbGw8VmVjdG9yTGF5ZXJJbmZvPihcblx0XHRcdFx0XHRjbGllbnQsIFwibGF5ZXJzLmdldFwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRMYXllclJlcXVlc3QsXG5cdFx0XHRcdFx0VmVjdG9yTGF5ZXJJbmZvLFxuXHRcdFx0XHQpLFxuXHRcdFx0bGlzdDogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxMYXllclBhZ2U+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJsYXllcnMubGlzdFwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRQYWdlUmVxdWVzdCxcblx0XHRcdFx0XHRMYXllclBhZ2UsXG5cdFx0XHRcdCksXG5cdFx0XHRvcGVuX3ZlY3RvcjogKGlucHV0OiBPcGVuVmVjdG9yUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPFZlY3RvckxheWVySW5mbz4oXG5cdFx0XHRcdFx0Y2xpZW50LCBcImxheWVycy5vcGVuX3ZlY3RvclwiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRPcGVuVmVjdG9yUmVxdWVzdCxcblx0XHRcdFx0XHRWZWN0b3JMYXllckluZm8sXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRuZXR3b3JrOiB7XG5cdFx0XHRmZXRjaDogKGlucHV0OiBGZXRjaFJlcXVlc3QsIGhhbmRsZXJzOiBIb3N0U3RyZWFtSGFuZGxlcnM8TmV0d29ya0ZldGNoRXZlbnQ+LCBvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMpID0+XG5cdFx0XHRcdG9wZW48TmV0d29ya0ZldGNoRXZlbnQ+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJuZXR3b3JrLmZldGNoXCIsIGlucHV0LCBoYW5kbGVycywgb3B0aW9ucyxcblx0XHRcdFx0XHRGZXRjaFJlcXVlc3QsXG5cdFx0XHRcdFx0TmV0d29ya0ZldGNoRXZlbnQsXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRub3RpZmljYXRpb25zOiB7XG5cdFx0XHRpbmZvOiAoaW5wdXQ6IE5vdGlmaWNhdGlvbnNJbmZvUmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJub3RpZmljYXRpb25zLmluZm9cIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0Tm90aWZpY2F0aW9uc0luZm9SZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+IGNhbmRpZGF0ZSA9PT0gbnVsbCxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHRcdHByb2plY3Q6IHtcblx0XHRcdGxheWVyX2lkczogKGlucHV0PzogUGFnZVJlcXVlc3QsIG9wdGlvbnM/OiBIb3N0SW52b2tlT3B0aW9ucykgPT5cblx0XHRcdFx0Y2FsbDxJZFBhZ2U+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJwcm9qZWN0LmxheWVyX2lkc1wiLCBpbnB1dCwgb3B0aW9ucyxcblx0XHRcdFx0XHRQYWdlUmVxdWVzdCxcblx0XHRcdFx0XHRJZFBhZ2UsXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRzZXR0aW5nczoge1xuXHRcdFx0Z2V0OiAoaW5wdXQ6IFNldHRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPHN0cmluZyB8IG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJzZXR0aW5ncy5nZXRcIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0U2V0dGluZ3NHZXRSZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+ICh0eXBlb2YgY2FuZGlkYXRlID09PSBcInN0cmluZ1wiIHx8IGNhbmRpZGF0ZSA9PT0gbnVsbCksXG5cdFx0XHRcdCksXG5cdFx0fSxcblx0XHRzdHlsZXM6IHtcblx0XHRcdGFwcGx5OiAoaW5wdXQ6IFN0eWxlc0FwcGx5UmVxdWVzdCwgb3B0aW9ucz86IEhvc3RJbnZva2VPcHRpb25zKSA9PlxuXHRcdFx0XHRjYWxsPG51bGw+KFxuXHRcdFx0XHRcdGNsaWVudCwgXCJzdHlsZXMuYXBwbHlcIiwgaW5wdXQsIG9wdGlvbnMsXG5cdFx0XHRcdFx0U3R5bGVzQXBwbHlSZXF1ZXN0LFxuXHRcdFx0XHRcdChjYW5kaWRhdGU6IHVua25vd24pID0+IGNhbmRpZGF0ZSA9PT0gbnVsbCxcblx0XHRcdFx0KSxcblx0XHR9LFxuXHR9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjYWxsPFQ+KFxuXHRjbGllbnQ6IEhvc3RDbGllbnRMaWtlLFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0aW5wdXQ6IHVua25vd24sXG5cdG9wdGlvbnM6IEhvc3RJbnZva2VPcHRpb25zIHwgdW5kZWZpbmVkLFxuXHRhY2NlcHRJbnB1dDogKHZhbHVlOiB1bmtub3duLCBzdHJpY3Q/OiBib29sZWFuKSA9PiBib29sZWFuLFxuXHRhY2NlcHRPdXRwdXQ6ICh2YWx1ZTogdW5rbm93bikgPT4gYm9vbGVhbixcbik6IFByb21pc2U8VD4ge1xuXHRpZiAoaW5wdXQgIT09IHVuZGVmaW5lZCAmJiAhYWNjZXB0SW5wdXQoaW5wdXQsIHRydWUpKSB7XG5cdFx0dGhyb3cgbmV3IEhvc3RDb250cmFjdEVycm9yKG9wZXJhdGlvbiwgXCJ0aGUgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVxdWVzdFwiKTtcblx0fVxuXHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoXG5cdFx0b3BlcmF0aW9uLFxuXHRcdChpbnB1dCA/PyB7fSkgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICghYWNjZXB0T3V0cHV0KHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBIb3N0Q29udHJhY3RFcnJvcihvcGVyYXRpb24sIFwidGhlIHJlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCByZXN1bHRcIik7XG5cdH1cblx0cmV0dXJuIHZhbHVlIGFzIFQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW48RSBleHRlbmRzIHsgcmVhZG9ubHkga2luZDogc3RyaW5nIH0+KFxuXHRjbGllbnQ6IEhvc3RDbGllbnRMaWtlLFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0aW5wdXQ6IHVua25vd24sXG5cdGhhbmRsZXJzOiBIb3N0U3RyZWFtSGFuZGxlcnM8RT4sXG5cdG9wdGlvbnM6IEhvc3RJbnZva2VPcHRpb25zIHwgdW5kZWZpbmVkLFxuXHRhY2NlcHRJbnB1dDogKHZhbHVlOiB1bmtub3duLCBzdHJpY3Q/OiBib29sZWFuKSA9PiBib29sZWFuLFxuXHRhY2NlcHRFdmVudDogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBFLFxuKTogUHJvbWlzZTxIb3N0U3RyZWFtSGFuZGxlPiB7XG5cdGlmICghYWNjZXB0SW5wdXQoaW5wdXQsIHRydWUpKSB7XG5cdFx0dGhyb3cgbmV3IEhvc3RDb250cmFjdEVycm9yKG9wZXJhdGlvbiwgXCJ0aGUgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgcmVxdWVzdFwiKTtcblx0fVxuXHQvLyBUaGUgdHlwZWQgc3RyZWFtIGVuZHMgZXhhY3RseSBvbmNlLCBsaWtlIHRoZSBzdWJzY3JpcHRpb24gdW5kZXIgaXQ6IGFcblx0Ly8gY29udHJhY3QgdmlvbGF0aW9uIGVuZHMgaXQgaGVyZSwgY2xvc2VzIHRoZSBzdWJzY3JpcHRpb24sIGFuZCB0aGVcblx0Ly8gYGRpc3Bvc2VkYCB0aGUgY2xpZW50IHRoZW4gcmVwb3J0cyBpcyBub3QgZGVsaXZlcmVkIGEgc2Vjb25kIHRpbWUuXG5cdGxldCBlbmRlZCA9IGZhbHNlO1xuXHRsZXQgdmlvbGF0ZWQgPSBmYWxzZTtcblx0bGV0IGhhbmRsZTogSG9zdFN0cmVhbUhhbmRsZSB8IG51bGwgPSBudWxsO1xuXHRjb25zdCBlbmQgPSAodGVybWluYWw6IEhvc3RTdHJlYW1UZXJtaW5hbCk6IHZvaWQgPT4ge1xuXHRcdGlmIChlbmRlZCkgcmV0dXJuO1xuXHRcdGVuZGVkID0gdHJ1ZTtcblx0XHRoYW5kbGVycy5vblRlcm1pbmFsPy4odGVybWluYWwpO1xuXHR9O1xuXHRoYW5kbGUgPSBhd2FpdCBjbGllbnQuc3Vic2NyaWJlKFxuXHRcdG9wZXJhdGlvbixcblx0XHRpbnB1dCBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG5cdFx0e1xuXHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmIChlbmRlZCkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoYWNjZXB0RXZlbnQoZXZlbnQpKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0ZW5kKHtcblx0XHRcdFx0XHRraW5kOiBcImVycm9yXCIsXG5cdFx0XHRcdFx0bWVzc2FnZTogbmV3IEhvc3RDb250cmFjdEVycm9yKFxuXHRcdFx0XHRcdFx0b3BlcmF0aW9uLFxuXHRcdFx0XHRcdFx0XCJhbiBldmVudCBkb2VzIG5vdCBtYXRjaCB0aGUgZGVjbGFyZWQgZXZlbnRzXCIsXG5cdFx0XHRcdFx0KS5tZXNzYWdlLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHZpb2xhdGVkID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHR9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdGlmICh2aW9sYXRlZCkge1xuXHRcdGhhbmRsZS5jbG9zZSgpO1xuXHR9XG5cdHJldHVybiBoYW5kbGU7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBSU8sSUFBTSxVQUFVO0FBQ2hCLElBQU0sbUJBQW1CO0FBQ3pCLElBQU0sc0JBQXNCO0FBRzVCLElBQU0sa0JBQWtCO0FBQUEsRUFDOUI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNEO0FBQUE7QUErQ08sTUFBTSwwQkFBMEIsTUFBTTtBQUFBLEVBQzVCO0FBQUEsRUFDVCxXQUFXLENBQUMsV0FBbUIsU0FBaUI7QUFBQSxJQUN0RCxNQUFNLGNBQWMsZUFBZSxTQUFTO0FBQUEsSUFDNUMsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLFlBQVk7QUFBQTtBQUVu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TSxJQUFJLGtCQUFrQixXQUFXLGlEQUFpRDtBQUFBLEVBQ3pGO0FBQUEsRUFJQSxJQUFJLFFBQVE7QUFBQSxFQUNaLElBQUksV0FBVztBQUFBLEVBQ2YsSUFBSSxTQUFrQztBQUFBLEVBQ3RDLE1BQU0sTUFBTSxDQUFDLGFBQXVDO0FBQUEsSUFDbkQsSUFBSTtBQUFBLE1BQU87QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLFNBQVMsYUFBYSxRQUFRO0FBQUE7QUFBQSxFQUUvQixTQUFTLE1BQU0sT0FBTyxVQUNyQixXQUNBLE9BQ0E7QUFBQSxJQUNDLFNBQVMsQ0FBQyxVQUFVO0FBQUEsTUFDbkIsSUFBSTtBQUFBLFFBQU87QUFBQSxNQUNYLElBQUksWUFBWSxLQUFLLEdBQUc7QUFBQSxRQUN2QixTQUFTLFVBQVUsS0FBSztBQUFBLFFBQ3hCO0FBQUEsTUFDRDtBQUFBLE1BQ0EsSUFBSTtBQUFBLFFBQ0gsTUFBTTtBQUFBLFFBQ04sU0FBUyxJQUFJLGtCQUNaLFdBQ0EsNkNBQ0QsRUFBRTtBQUFBLE1BQ0gsQ0FBQztBQUFBLE1BQ0QsSUFBSSxXQUFXLE1BQU07QUFBQSxRQUNwQixXQUFXO0FBQUEsTUFDWixFQUFPO0FBQUEsUUFDTixPQUFPLE1BQU07QUFBQTtBQUFBO0FBQUEsSUFHZixZQUFZO0FBQUEsRUFDYixHQUNBLE9BQ0Q7QUFBQSxFQUNBLElBQUksVUFBVTtBQUFBLElBQ2IsT0FBTyxNQUFNO0FBQUEsRUFDZDtBQUFBLEVBQ0EsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiRUYxNjVGNTkxQzc1ODI5OTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
74
+ //# debugId=D4AFBCE8AE2E4EBA64756E2164756E21
75
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICBdLAogICJtYXBwaW5ncyI6ICIiLAogICJkZWJ1Z0lkIjogIkQ0QUZCQ0U4QUUyRTRFQkE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9