sonamu 0.8.13 → 0.8.14
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/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +2 -3
- package/dist/auth/auth-generator.d.ts +8 -0
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +33 -1
- package/dist/auth/better-auth-entities.d.ts.map +1 -1
- package/dist/auth/better-auth-entities.js +12 -2
- package/dist/bin/cli.js +18 -3
- package/dist/cone/cone-generator.js +10 -4
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +64 -2
- package/dist/database/puri.d.ts +9 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +42 -1
- package/dist/database/puri.types.d.ts +2 -0
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +6 -2
- package/dist/entity/entity-manager.d.ts +149 -1
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +68 -4
- package/dist/migration/__tests__/code-generation.search-text.test.js +435 -0
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +696 -32
- package/dist/migration/migration-set.js +3 -1
- package/dist/migration/postgresql-schema-reader.d.ts +16 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +281 -7
- package/dist/stream/sse.js +5 -3
- package/dist/template/__tests__/generated.template.search-text.test.js +99 -0
- package/dist/template/generated.template.test-d.js +24 -0
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +2 -2
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +11 -3
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +6 -2
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +5 -3
- package/dist/testing/fixture-generator.d.ts +13 -0
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +105 -8
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +19 -2
- package/dist/types/__tests__/entity-json-schema-search-text.test.js +256 -0
- package/dist/types/types.d.ts +494 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +117 -13
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +14 -2
- package/dist/ui/cdd-service.d.ts +16 -14
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +145 -37
- package/dist/ui/cdd-types.d.ts +60 -0
- package/dist/ui/cdd-types.d.ts.map +1 -0
- package/dist/ui/cdd-types.js +3 -0
- package/dist/ui-web/assets/index-D4XFBV-f.css +1 -0
- package/dist/ui-web/assets/{index-CQ_S40bD.js → index-D_19-Pi4.js} +87 -87
- package/dist/ui-web/index.html +2 -2
- package/package.json +7 -3
- package/src/api/sonamu.ts +1 -2
- package/src/auth/auth-generator.ts +38 -0
- package/src/auth/better-auth-entities.ts +18 -1
- package/src/bin/cli.ts +15 -1
- package/src/cone/cone-generator.ts +9 -3
- package/src/database/knex.ts +62 -4
- package/src/database/puri.ts +71 -0
- package/src/database/puri.types.ts +2 -0
- package/src/entity/entity-manager.ts +95 -3
- package/src/migration/__tests__/code-generation.search-text.test.ts +390 -0
- package/src/migration/code-generation.ts +848 -34
- package/src/migration/migration-set.ts +2 -0
- package/src/migration/postgresql-schema-reader.ts +366 -9
- package/src/skills/sonamu/auth-migration.md +80 -0
- package/src/skills/sonamu/cdd.md +148 -28
- package/src/skills/sonamu/cone.md +16 -0
- package/src/skills/sonamu/entity-relations.md +1 -1
- package/src/skills/sonamu/fixture-cli.md +4 -0
- package/src/skills/sonamu/frontend.md +65 -0
- package/src/skills/sonamu/migration.md +3 -1
- package/src/skills/sonamu/model.md +28 -0
- package/src/skills/sonamu/workflow.md +12 -5
- package/src/stream/sse.ts +4 -2
- package/src/template/__tests__/generated.template.search-text.test.ts +89 -0
- package/src/template/generated.template.test-d.ts +46 -0
- package/src/template/implementations/generated.template.ts +4 -1
- package/src/template/implementations/init_types.template.ts +20 -5
- package/src/template/zod-converter.ts +5 -0
- package/src/testing/dev-test-routes.ts +4 -2
- package/src/testing/fixture-generator.ts +157 -9
- package/src/testing/fixture-manager.ts +15 -1
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +179 -0
- package/src/types/types.ts +168 -12
- package/src/ui/api.ts +24 -1
- package/src/ui/cdd-service.ts +195 -55
- package/src/ui/cdd-types.ts +73 -0
- package/dist/ui-web/assets/index-egkMxKos.css +0 -1
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import assert from "assert";
|
|
2
2
|
import { group } from "radashi";
|
|
3
3
|
class PostgreSQLSchemaReaderClass {
|
|
4
|
+
genericIndexTypes = new Set([
|
|
5
|
+
"btree",
|
|
6
|
+
"hash",
|
|
7
|
+
"gin",
|
|
8
|
+
"gist",
|
|
9
|
+
"pgroonga"
|
|
10
|
+
]);
|
|
4
11
|
/**
|
|
5
12
|
* DB에서 테이블 정보를 읽어서 MigrationSet을 만들어옵니다.
|
|
6
13
|
* @param compareDB Knex 인스턴스
|
|
@@ -72,22 +79,30 @@ class PostgreSQLSchemaReaderClass {
|
|
|
72
79
|
const dbIndexesGroup = group(dbIndexes.filter((dbIndex)=>!dbIndex.is_primary && !dbForeigns.find((dbForeign)=>dbIndex.index_name.includes(dbForeign.constraint_name))), (dbIndex)=>dbIndex.index_name);
|
|
73
80
|
// indexes 처리
|
|
74
81
|
const indexes = Object.keys(dbIndexesGroup).map((indexName)=>{
|
|
75
|
-
const currentIndexes = dbIndexesGroup[indexName];
|
|
82
|
+
const currentIndexes = dbIndexesGroup[indexName]?.toSorted((left, right)=>left.column_order - right.column_order);
|
|
76
83
|
assert(currentIndexes);
|
|
77
84
|
const firstIndex = currentIndexes[0];
|
|
78
|
-
const
|
|
85
|
+
const parsedIndexDefinition = this.parseIndexDefinition(firstIndex.index_definition);
|
|
86
|
+
const restoredIndexType = this.restoreMigrationIndexType(firstIndex, parsedIndexDefinition.accessMethod);
|
|
87
|
+
const using = this.restoreGenericUsing(parsedIndexDefinition.accessMethod ?? firstIndex.index_type);
|
|
79
88
|
return {
|
|
80
|
-
type,
|
|
89
|
+
type: restoredIndexType,
|
|
81
90
|
name: indexName,
|
|
82
91
|
columns: currentIndexes.map((idx)=>({
|
|
83
92
|
name: idx.column_name,
|
|
84
|
-
...
|
|
93
|
+
...this.extractIndexColumnOpclass(parsedIndexDefinition.columnDefinitions[idx.column_order - 1]) ? {
|
|
94
|
+
opclass: this.extractIndexColumnOpclass(parsedIndexDefinition.columnDefinitions[idx.column_order - 1])
|
|
95
|
+
} : {},
|
|
96
|
+
...using === "btree" ? {
|
|
85
97
|
sortOrder: idx.sort_order,
|
|
86
98
|
nullsFirst: idx.nulls_first
|
|
87
99
|
} : {}
|
|
88
100
|
})),
|
|
89
101
|
nullsNotDistinct: firstIndex.nulls_not_distinct,
|
|
90
|
-
using
|
|
102
|
+
...using ? {
|
|
103
|
+
using
|
|
104
|
+
} : {},
|
|
105
|
+
...this.parseVectorIndexOptions(restoredIndexType, parsedIndexDefinition.withOptions)
|
|
91
106
|
};
|
|
92
107
|
});
|
|
93
108
|
// foreigns 처리
|
|
@@ -185,7 +200,9 @@ class PostgreSQLSchemaReaderClass {
|
|
|
185
200
|
WHEN (u.opt & 1) = 1 THEN 'DESC'
|
|
186
201
|
ELSE 'ASC'
|
|
187
202
|
END AS sort_order,
|
|
188
|
-
ix.indnullsnotdistinct AS nulls_not_distinct
|
|
203
|
+
ix.indnullsnotdistinct AS nulls_not_distinct,
|
|
204
|
+
u.ord AS column_order,
|
|
205
|
+
pg_get_indexdef(ix.indexrelid) AS index_definition
|
|
189
206
|
FROM pg_class t
|
|
190
207
|
JOIN pg_index ix ON t.oid = ix.indrelid
|
|
191
208
|
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
@@ -251,6 +268,263 @@ class PostgreSQLSchemaReaderClass {
|
|
|
251
268
|
foreigns
|
|
252
269
|
];
|
|
253
270
|
}
|
|
271
|
+
restoreMigrationIndexType(index, accessMethod) {
|
|
272
|
+
const resolvedAccessMethod = (accessMethod ?? index.index_type).toLowerCase();
|
|
273
|
+
if (resolvedAccessMethod === "hnsw" || resolvedAccessMethod === "ivfflat") {
|
|
274
|
+
return resolvedAccessMethod;
|
|
275
|
+
}
|
|
276
|
+
return index.is_unique ? "unique" : "index";
|
|
277
|
+
}
|
|
278
|
+
restoreGenericUsing(accessMethod) {
|
|
279
|
+
if (!accessMethod) {
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
const normalized = accessMethod.toLowerCase();
|
|
283
|
+
if (!this.genericIndexTypes.has(normalized)) {
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
return normalized;
|
|
287
|
+
}
|
|
288
|
+
parseVectorIndexOptions(type, withOptions) {
|
|
289
|
+
if (type === "hnsw") {
|
|
290
|
+
return {
|
|
291
|
+
...this.parseIntegerOption(withOptions.m) !== undefined ? {
|
|
292
|
+
m: this.parseIntegerOption(withOptions.m)
|
|
293
|
+
} : {},
|
|
294
|
+
...this.parseIntegerOption(withOptions.ef_construction) !== undefined ? {
|
|
295
|
+
efConstruction: this.parseIntegerOption(withOptions.ef_construction)
|
|
296
|
+
} : {}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
if (type === "ivfflat") {
|
|
300
|
+
return {
|
|
301
|
+
...this.parseIntegerOption(withOptions.lists) !== undefined ? {
|
|
302
|
+
lists: this.parseIntegerOption(withOptions.lists)
|
|
303
|
+
} : {}
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
return {};
|
|
307
|
+
}
|
|
308
|
+
parseIntegerOption(value) {
|
|
309
|
+
if (!value) {
|
|
310
|
+
return undefined;
|
|
311
|
+
}
|
|
312
|
+
const parsed = Number.parseInt(value, 10);
|
|
313
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
314
|
+
}
|
|
315
|
+
extractIndexColumnOpclass(columnDefinition) {
|
|
316
|
+
if (!columnDefinition) {
|
|
317
|
+
return undefined;
|
|
318
|
+
}
|
|
319
|
+
const trimmed = columnDefinition.replace(/\s+NULLS\s+(FIRST|LAST)\s*$/i, "").replace(/\s+(ASC|DESC)\s*$/i, "").trim();
|
|
320
|
+
const tokens = this.tokenizeTopLevel(trimmed);
|
|
321
|
+
if (tokens.length < 2) {
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
if (tokens[tokens.length - 2]?.toUpperCase() === "COLLATE") {
|
|
325
|
+
return undefined;
|
|
326
|
+
}
|
|
327
|
+
return tokens.at(-1);
|
|
328
|
+
}
|
|
329
|
+
parseIndexDefinition(indexDefinition) {
|
|
330
|
+
const accessMethod = indexDefinition.match(/\bUSING\s+([a-z_][\w]*)/i)?.[1]?.toLowerCase();
|
|
331
|
+
const usingMatchIndex = indexDefinition.search(/\bUSING\b/i);
|
|
332
|
+
const columnsStart = usingMatchIndex >= 0 ? indexDefinition.indexOf("(", usingMatchIndex) : -1;
|
|
333
|
+
const columnsEnd = columnsStart >= 0 ? this.findMatchingParenthesis(indexDefinition, columnsStart) : -1;
|
|
334
|
+
const columnDefinitions = columnsStart >= 0 && columnsEnd > columnsStart ? this.splitTopLevel(indexDefinition.slice(columnsStart + 1, columnsEnd), ",") : [];
|
|
335
|
+
const withMatch = /\bWITH\s*\(/i.exec(indexDefinition);
|
|
336
|
+
const withStart = withMatch ? indexDefinition.indexOf("(", withMatch.index) : -1;
|
|
337
|
+
const withEnd = withStart >= 0 ? this.findMatchingParenthesis(indexDefinition, withStart) : -1;
|
|
338
|
+
const withOptions = withStart >= 0 && withEnd > withStart ? this.parseIndexOptionEntries(indexDefinition.slice(withStart + 1, withEnd)) : {};
|
|
339
|
+
return {
|
|
340
|
+
accessMethod,
|
|
341
|
+
columnDefinitions,
|
|
342
|
+
withOptions
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
parseIndexOptionEntries(optionSource) {
|
|
346
|
+
return this.splitTopLevel(optionSource, ",").reduce((result, entry)=>{
|
|
347
|
+
const matched = entry.trim().match(/^([a-z_][\w]*)\s*=\s*(.+)$/i);
|
|
348
|
+
if (!matched) {
|
|
349
|
+
return result;
|
|
350
|
+
}
|
|
351
|
+
const [, key, rawValue] = matched;
|
|
352
|
+
result[key.toLowerCase()] = rawValue.trim().replace(/^['"]|['"]$/g, "");
|
|
353
|
+
return result;
|
|
354
|
+
}, {});
|
|
355
|
+
}
|
|
356
|
+
splitTopLevel(source, delimiter) {
|
|
357
|
+
const items = [];
|
|
358
|
+
let start = 0;
|
|
359
|
+
let parenDepth = 0;
|
|
360
|
+
let bracketDepth = 0;
|
|
361
|
+
let inSingleQuote = false;
|
|
362
|
+
let inDoubleQuote = false;
|
|
363
|
+
for(let index = 0; index < source.length; index += 1){
|
|
364
|
+
const char = source[index];
|
|
365
|
+
const nextChar = source[index + 1];
|
|
366
|
+
if (char === "'" && !inDoubleQuote) {
|
|
367
|
+
if (inSingleQuote && nextChar === "'") {
|
|
368
|
+
index += 1;
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
inSingleQuote = !inSingleQuote;
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
if (char === '"' && !inSingleQuote) {
|
|
375
|
+
if (inDoubleQuote && nextChar === '"') {
|
|
376
|
+
index += 1;
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
inDoubleQuote = !inDoubleQuote;
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
if (inSingleQuote || inDoubleQuote) {
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
if (char === "(") {
|
|
386
|
+
parenDepth += 1;
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
if (char === ")") {
|
|
390
|
+
parenDepth -= 1;
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
if (char === "[") {
|
|
394
|
+
bracketDepth += 1;
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
if (char === "]") {
|
|
398
|
+
bracketDepth -= 1;
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
if (char === delimiter && parenDepth === 0 && bracketDepth === 0) {
|
|
402
|
+
items.push(source.slice(start, index).trim());
|
|
403
|
+
start = index + 1;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
const tail = source.slice(start).trim();
|
|
407
|
+
if (tail.length > 0) {
|
|
408
|
+
items.push(tail);
|
|
409
|
+
}
|
|
410
|
+
return items;
|
|
411
|
+
}
|
|
412
|
+
tokenizeTopLevel(source) {
|
|
413
|
+
const tokens = [];
|
|
414
|
+
let start = -1;
|
|
415
|
+
let parenDepth = 0;
|
|
416
|
+
let bracketDepth = 0;
|
|
417
|
+
let inSingleQuote = false;
|
|
418
|
+
let inDoubleQuote = false;
|
|
419
|
+
const pushToken = (endIndex)=>{
|
|
420
|
+
if (start < 0) {
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
const token = source.slice(start, endIndex).trim();
|
|
424
|
+
if (token.length > 0) {
|
|
425
|
+
tokens.push(token);
|
|
426
|
+
}
|
|
427
|
+
start = -1;
|
|
428
|
+
};
|
|
429
|
+
for(let index = 0; index < source.length; index += 1){
|
|
430
|
+
const char = source[index];
|
|
431
|
+
const nextChar = source[index + 1];
|
|
432
|
+
if (char === "'" && !inDoubleQuote) {
|
|
433
|
+
if (start < 0) {
|
|
434
|
+
start = index;
|
|
435
|
+
}
|
|
436
|
+
if (inSingleQuote && nextChar === "'") {
|
|
437
|
+
index += 1;
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
inSingleQuote = !inSingleQuote;
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
if (char === '"' && !inSingleQuote) {
|
|
444
|
+
if (start < 0) {
|
|
445
|
+
start = index;
|
|
446
|
+
}
|
|
447
|
+
if (inDoubleQuote && nextChar === '"') {
|
|
448
|
+
index += 1;
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
inDoubleQuote = !inDoubleQuote;
|
|
452
|
+
continue;
|
|
453
|
+
}
|
|
454
|
+
if (!inSingleQuote && !inDoubleQuote) {
|
|
455
|
+
if (char === "(") {
|
|
456
|
+
if (start < 0) {
|
|
457
|
+
start = index;
|
|
458
|
+
}
|
|
459
|
+
parenDepth += 1;
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
if (char === ")") {
|
|
463
|
+
parenDepth -= 1;
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
if (char === "[") {
|
|
467
|
+
if (start < 0) {
|
|
468
|
+
start = index;
|
|
469
|
+
}
|
|
470
|
+
bracketDepth += 1;
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
if (char === "]") {
|
|
474
|
+
bracketDepth -= 1;
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
477
|
+
if (/\s/.test(char) && parenDepth === 0 && bracketDepth === 0) {
|
|
478
|
+
pushToken(index);
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
if (start < 0) {
|
|
483
|
+
start = index;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
pushToken(source.length);
|
|
487
|
+
return tokens;
|
|
488
|
+
}
|
|
489
|
+
findMatchingParenthesis(source, openIndex) {
|
|
490
|
+
let depth = 0;
|
|
491
|
+
let inSingleQuote = false;
|
|
492
|
+
let inDoubleQuote = false;
|
|
493
|
+
for(let index = openIndex; index < source.length; index += 1){
|
|
494
|
+
const char = source[index];
|
|
495
|
+
const nextChar = source[index + 1];
|
|
496
|
+
if (char === "'" && !inDoubleQuote) {
|
|
497
|
+
if (inSingleQuote && nextChar === "'") {
|
|
498
|
+
index += 1;
|
|
499
|
+
continue;
|
|
500
|
+
}
|
|
501
|
+
inSingleQuote = !inSingleQuote;
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
504
|
+
if (char === '"' && !inSingleQuote) {
|
|
505
|
+
if (inDoubleQuote && nextChar === '"') {
|
|
506
|
+
index += 1;
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
inDoubleQuote = !inDoubleQuote;
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
if (inSingleQuote || inDoubleQuote) {
|
|
513
|
+
continue;
|
|
514
|
+
}
|
|
515
|
+
if (char === "(") {
|
|
516
|
+
depth += 1;
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
if (char === ")") {
|
|
520
|
+
depth -= 1;
|
|
521
|
+
if (depth === 0) {
|
|
522
|
+
return index;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
return -1;
|
|
527
|
+
}
|
|
254
528
|
/**
|
|
255
529
|
* 특정 테이블의 PK를 참조하는 다른 테이블의 FK 목록을 조회합니다.
|
|
256
530
|
* PK 타입 변경 시 관련 FK 제약조건을 삭제/복구하기 위해 사용됩니다.
|
|
@@ -427,4 +701,4 @@ class PostgreSQLSchemaReaderClass {
|
|
|
427
701
|
}
|
|
428
702
|
export const PostgreSQLSchemaReader = new PostgreSQLSchemaReaderClass();
|
|
429
703
|
|
|
430
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxuICBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLyoqXG4gKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOygleuztOyeheuLiOuLpC5cbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY6riwIOychO2VtCDsgqzsmqnrkKnri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZmVyZW5jaW5nRm9yZWlnbktleSA9IHtcbiAgLyoqIEZL6rCAIOygleydmOuQnCDthYzsnbTruJTrqoUgKi9cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsoJzslb3sobDqsbQg7J2066aEICovXG4gIGNvbnN0cmFpbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsu6zrn7zrqoUgKi9cbiAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIO2FjOydtOu4lOuqhSAoUEvqsIAg7J6I64qUIO2FjOydtOu4lCkgKi9cbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIOy7rOufvOuqhSAo67O07Ya1ICdpZCcpICovXG4gIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiBPTiBVUERBVEUg7JWh7IWYICovXG4gIG9uVXBkYXRlOiBSZWxhdGlvbk9uO1xuICAvKiogT04gREVMRVRFIOyVoeyFmCAqL1xuICBvbkRlbGV0ZTogUmVsYXRpb25Pbjtcbn07XG5cbmV4cG9ydCB0eXBlIFBnQ29sdW1uID0ge1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBkYXRhX3R5cGU6IHN0cmluZztcbiAgdWR0X25hbWU6IHN0cmluZztcbiAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoOiBudW1iZXIgfCBudWxsO1xuICBwcmVjaXNpb246IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfc2NhbGU6IG51bWJlciB8IG51bGw7XG4gIGlzX251bGxhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbl9kZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xuICBpc19nZW5lcmF0ZWQ6IHN0cmluZzsgLy8gJ3MnID0gU1RPUkVELCAndicgPSBWSVJUVUFMLCAnJyA9IG5vbmVcbiAgZ2VuZXJhdGlvbl9leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBQZ0luZGV4ID0ge1xuICBpbmRleF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGlzX3VuaXF1ZTogYm9vbGVhbjtcbiAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgaW5kZXhfdHlwZTogc3RyaW5nO1xuICBudWxsc19maXJzdDogYm9vbGVhbjtcbiAgc29ydF9vcmRlcjogXCJBU0NcIiB8IFwiREVTQ1wiO1xuICBudWxsc19ub3RfZGlzdGluY3Q6IGJvb2xlYW47XG59O1xuXG50eXBlIFBnRm9yZWlnbiA9IHtcbiAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fdGFibGVfbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG59O1xuXG5jbGFzcyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3Mge1xuICAvKipcbiAgICogRELsl5DshJwg7YWM7J2067iUIOygleuztOulvCDsnb3slrTshJwgTWlncmF0aW9uU2V07J2EIOunjOuTpOyWtOyYteuLiOuLpC5cbiAgICogQHBhcmFtIGNvbXBhcmVEQiBLbmV4IOyduOyKpO2EtOyKpFxuICAgKiBAcGFyYW0gdGFibGUg7YWM7J2067iUIOydtOumhFxuICAgKiBAcmV0dXJucyBNaWdyYXRpb25TZXQg6rCd7LK0XG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25TZXRGcm9tREIoY29tcGFyZURCOiBLbmV4LCB0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxNaWdyYXRpb25TZXQgfCBudWxsPiB7XG4gICAgbGV0IGRiQ29sdW1uczogUGdDb2x1bW5bXSwgZGJJbmRleGVzOiBQZ0luZGV4W10sIGRiRm9yZWlnbnM6IFBnRm9yZWlnbltdO1xuICAgIHRyeSB7XG4gICAgICBbZGJDb2x1bW5zLCBkYkluZGV4ZXMsIGRiRm9yZWlnbnNdID0gYXdhaXQgdGhpcy5yZWFkVGFibGUoY29tcGFyZURCLCB0YWJsZSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoXCJUYWJsZSBub3QgZm91bmRcIikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gdmVjdG9yIOy7rOufvOydmCBkaW1lbnNpb25zIOyhsO2ajFxuICAgIGNvbnN0IHZlY3RvckRpbWVuc2lvbnMgPSBhd2FpdCB0aGlzLmdldFZlY3RvckRpbWVuc2lvbnMoY29tcGFyZURCLCB0YWJsZSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSA9IGRiQ29sdW1ucy5tYXAoKGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBkYkNvbFR5cGUgPSB0aGlzLnJlc29sdmVEQkNvbFR5cGUoZGJDb2x1bW4pO1xuXG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J24IOqyveyasCBkaW1lbnNpb25zIOyEpOyglVxuICAgICAgaWYgKGRiQ29sVHlwZS50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgICAgIGRiQ29sVHlwZS5kaW1lbnNpb25zID0gdmVjdG9yRGltZW5zaW9uc1tkYkNvbHVtbi5jb2x1bW5fbmFtZV0gPz8gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZGJDb2x1bW4uY29sdW1uX25hbWUsXG4gICAgICAgIG51bGxhYmxlOiBkYkNvbHVtbi5pc19udWxsYWJsZSA9PT0gXCJZRVNcIixcbiAgICAgICAgLi4uZGJDb2xUeXBlLFxuICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1uIOyymOumrFxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgPyBcIlNUT1JFRFwiIDogXCJWSVJUVUFMXCIsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZGJDb2x1bW4uZ2VuZXJhdGlvbl9leHByZXNzaW9uID8/IFwiXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0pKCksXG4gICAgICAgIC8vIERlZmF1bHQg6rCSIOyymOumrCAoR2VuZXJhdGVkIENvbHVtbuydtCDslYTri4wg6rK97Jqw66eMKVxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIC8vIEdlbmVyYXRlZCBDb2x1bW7snYAgZGVmYXVsdCDqsJLsnbQg7JeG7J2MXG4gICAgICAgICAgaWYgKGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgfHwgZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInZcIikge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUG9zdGdyZVNRTCBkZWZhdWx0IOqwkiDsoJXrpqwgKG5leHR2YWwsIENVUlJFTlRfVElNRVNUQU1QIOuTsSlcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdDtcblxuICAgICAgICAgICAgLy8gbmV4dHZhbCDsoJzqsbAgKFNFUklBTCDtg4DsnoUpXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCJuZXh0dmFsKFwiKSkge1xuICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2DgOyehSDsupDsiqTtjIUg7KCc6rGwICjsmIg6ICcxJzo6aW50ZWdlciDihpIgMSlcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS5yZXBsYWNlKC86OltcXHdcXHNdKyQvZywgXCJcIik7XG5cbiAgICAgICAgICAgIC8vIOuUsOyYtO2RnOqwgCBzaW5nbGUgcXVvdGXsnbgg6rK97JqwIGRvdWJsZSBxdW90ZeuhnCDrs4DtmZhcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUuc3RhcnRzV2l0aChcIidcIikgJiYgZGVmYXVsdFZhbHVlLmVuZHNXaXRoKFwiJ1wiKSkge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZUFsbChcIidcIiwgJ1wiJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmF1bHRUbzogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFBSSU1BUlkgS0VZ7JmAIGZvcmVpZ24ga2V57JqpIOyduOuNseyKpCDsoJzsmbhcbiAgICBjb25zdCBkYkluZGV4ZXNHcm91cCA9IGdyb3VwKFxuICAgICAgZGJJbmRleGVzLmZpbHRlcihcbiAgICAgICAgKGRiSW5kZXgpID0+XG4gICAgICAgICAgIWRiSW5kZXguaXNfcHJpbWFyeSAmJlxuICAgICAgICAgICFkYkZvcmVpZ25zLmZpbmQoKGRiRm9yZWlnbikgPT4gZGJJbmRleC5pbmRleF9uYW1lLmluY2x1ZGVzKGRiRm9yZWlnbi5jb25zdHJhaW50X25hbWUpKSxcbiAgICAgICksXG4gICAgICAoZGJJbmRleCkgPT4gZGJJbmRleC5pbmRleF9uYW1lLFxuICAgICk7XG5cbiAgICAvLyBpbmRleGVzIOyymOumrFxuICAgIGNvbnN0IGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10gPSBPYmplY3Qua2V5cyhkYkluZGV4ZXNHcm91cCkubWFwKChpbmRleE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleGVzID0gZGJJbmRleGVzR3JvdXBbaW5kZXhOYW1lXTtcbiAgICAgIGFzc2VydChjdXJyZW50SW5kZXhlcyk7XG5cbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBjdXJyZW50SW5kZXhlc1swXTtcbiAgICAgIGNvbnN0IHR5cGUgPSBmaXJzdEluZGV4LmlzX3VuaXF1ZSA/IFwidW5pcXVlXCIgOiBcImluZGV4XCI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG5hbWU6IGluZGV4TmFtZSxcbiAgICAgICAgY29sdW1uczogY3VycmVudEluZGV4ZXMubWFwKChpZHgpID0+ICh7XG4gICAgICAgICAgbmFtZTogaWR4LmNvbHVtbl9uYW1lLFxuICAgICAgICAgIC4uLihmaXJzdEluZGV4LmluZGV4X3R5cGUgPT09IFwiYnRyZWVcIlxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgc29ydE9yZGVyOiBpZHguc29ydF9vcmRlcixcbiAgICAgICAgICAgICAgICBudWxsc0ZpcnN0OiBpZHgubnVsbHNfZmlyc3QsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KSksXG5cbiAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogZmlyc3RJbmRleC5udWxsc19ub3RfZGlzdGluY3QsXG4gICAgICAgIHVzaW5nOiBmaXJzdEluZGV4LmluZGV4X3R5cGUgYXMgXCJidHJlZVwiIHwgXCJoYXNoXCIgfCBcImdpblwiIHwgXCJnaXN0XCIgfCBcInBncm9vbmdhXCIgfCB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gZm9yZWlnbnMg7LKY66asXG4gICAgY29uc3QgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSA9IGRiRm9yZWlnbnMubWFwKChkYkZvcmVpZ24pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbnM6IFtkYkZvcmVpZ24uY29sdW1uX25hbWVdLFxuICAgICAgICB0bzogYCR7ZGJGb3JlaWduLmZvcmVpZ25fdGFibGVfbmFtZX0uJHtkYkZvcmVpZ24uZm9yZWlnbl9jb2x1bW5fbmFtZX1gLFxuICAgICAgICBvblVwZGF0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKGRiRm9yZWlnbi51cGRhdGVfcnVsZSksXG4gICAgICAgIG9uRGVsZXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLmRlbGV0ZV9ydWxlKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgaW5kZXhlcyxcbiAgICAgIGZvcmVpZ25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTOydmCBjb25zdHJhaW50IGFjdGlvbuydhCBLbmV4IO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgbWFwQ29uc3RyYWludEFjdGlvbihhY3Rpb246IHN0cmluZyk6IFJlbGF0aW9uT24ge1xuICAgIGNvbnN0IGFjdGlvbk1hcDogUmVjb3JkPHN0cmluZywgUmVsYXRpb25Pbj4gPSB7XG4gICAgICBcIk5PIEFDVElPTlwiOiBcIk5PIEFDVElPTlwiLFxuICAgICAgUkVTVFJJQ1Q6IFwiUkVTVFJJQ1RcIixcbiAgICAgIENBU0NBREU6IFwiQ0FTQ0FERVwiLFxuICAgICAgXCJTRVQgTlVMTFwiOiBcIlNFVCBOVUxMXCIsXG4gICAgICBcIlNFVCBERUZBVUxUXCI6IFwiU0VUIERFRkFVTFRcIixcbiAgICB9O1xuICAgIHJldHVybiBhY3Rpb25NYXBbYWN0aW9uXSA/PyBcIk5PIEFDVElPTlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCDthYzsnbTruJQg7J297Ja07IScIGNvbHMsIGluZGV4ZXMsIGZvcmVpZ25zIOuwmO2ZmFxuICAgKi9cbiAgYXN5bmMgcmVhZFRhYmxlKFxuICAgIGNvbXBhcmVEQjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxbUGdDb2x1bW5bXSwgUGdJbmRleFtdLCBQZ0ZvcmVpZ25bXV0+IHtcbiAgICAvLyBDb2x1bW5zIOyhsO2ajCAoR2VuZXJhdGVkIENvbHVtbiDsoJXrs7Qg7Y+s7ZWoKVxuICAgIGNvbnN0IGNvbHVtbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBjLmNvbHVtbl9uYW1lLFxuICAgICAgICBjLmRhdGFfdHlwZSxcbiAgICAgICAgYy51ZHRfbmFtZSxcbiAgICAgICAgQ09BTEVTQ0UoXG4gICAgICAgICAgYy5jaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgICAgQ0FTRSBXSEVOIGMuZGF0YV90eXBlID0gJ0FSUkFZJyBBTkQgYS5hdHR0eXBtb2QgPiAwXG4gICAgICAgICAgICBUSEVOIGEuYXR0dHlwbW9kIC0gNFxuICAgICAgICAgICAgRUxTRSBOVUxMXG4gICAgICAgICAgRU5EXG4gICAgICAgICkgQVMgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgICBDT0FMRVNDRShjLmRhdGV0aW1lX3ByZWNpc2lvbiwgYy5udW1lcmljX3ByZWNpc2lvbikgQVMgcHJlY2lzaW9uLFxuICAgICAgICBjLm51bWVyaWNfc2NhbGUsXG4gICAgICAgIGMuaXNfbnVsbGFibGUsXG4gICAgICAgIGMuY29sdW1uX2RlZmF1bHQsXG4gICAgICAgIENPQUxFU0NFKGEuYXR0Z2VuZXJhdGVkLCAnJykgYXMgaXNfZ2VuZXJhdGVkLFxuICAgICAgICBjLmdlbmVyYXRpb25fZXhwcmVzc2lvblxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBjXG4gICAgICBMRUZUIEpPSU4gcGdfYXR0cmlidXRlIGEgT04gYS5hdHRuYW1lID0gYy5jb2x1bW5fbmFtZVxuICAgICAgICBBTkQgYS5hdHRyZWxpZCA9IChcbiAgICAgICAgICBTRUxFQ1Qgb2lkIEZST00gcGdfY2xhc3MgV0hFUkUgcmVsbmFtZSA9IGMudGFibGVfbmFtZVxuICAgICAgICAgIEFORCByZWxuYW1lc3BhY2UgPSAoU0VMRUNUIG9pZCBGUk9NIHBnX25hbWVzcGFjZSBXSEVSRSBuc3BuYW1lID0gYy50YWJsZV9zY2hlbWEpXG4gICAgICAgIClcbiAgICAgIFdIRVJFIGMudGFibGVfbmFtZSA9ID9cbiAgICAgICAgQU5EIGMudGFibGVfc2NoZW1hID0gJ3B1YmxpYydcbiAgICAgIE9SREVSIEJZIGMub3JkaW5hbF9wb3NpdGlvblxuICAgIGA7XG4gICAgY29uc3QgY29sdW1ucyA9IChhd2FpdCBjb21wYXJlREIucmF3KGNvbHVtbnNRdWVyeSwgW3RhYmxlTmFtZV0pKS5yb3dzIGFzIFBnQ29sdW1uW107XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIG5vdCBmb3VuZDogJHt0YWJsZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgLy8gSW5kZXhlcyDsobDtmowgKFBHcm9vbmdhIO2RnO2YhOyLnSDsnbjrjbHsiqQg7Y+s7ZWoKVxuICAgIGNvbnN0IGluZGV4ZXNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICAgIGkucmVsbmFtZSBBUyBpbmRleF9uYW1lLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgV0hFTiBhbS5hbW5hbWUgPSAncGdyb29uZ2EnIEFORCB1LmF0dG51bSA9IDAgVEhFTlxuICAgICAgICAgICAgICAgICAgcmVnZXhwX3JlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3JlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFRSSU0ocGdyb29uZ2FfY29sLmNvbHVtbl9leHByKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJzo6dGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnZydcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICdbKCldJyxcbiAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAnZydcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgRUxTRSBhLmF0dG5hbWVcbiAgICAgICAgICBFTkQgQVMgY29sdW1uX25hbWUsXG4gICAgICAgICAgaXguaW5kaXN1bmlxdWUgQVMgaXNfdW5pcXVlLFxuICAgICAgICAgIGl4LmluZGlzcHJpbWFyeSBBUyBpc19wcmltYXJ5LFxuICAgICAgICAgIGFtLmFtbmFtZSBBUyBpbmRleF90eXBlLFxuICAgICAgICAgIENPQUxFU0NFKCh1Lm9wdCAmIDIpID0gMiwgRkFMU0UpIEFTIG51bGxzX2ZpcnN0LFxuICAgICAgICAgIENBU0UgXG4gICAgICAgICAgICAgIFdIRU4gKHUub3B0ICYgMSkgPSAxIFRIRU4gJ0RFU0MnXG4gICAgICAgICAgICAgIEVMU0UgJ0FTQydcbiAgICAgICAgICBFTkQgQVMgc29ydF9vcmRlcixcbiAgICAgICAgICBpeC5pbmRudWxsc25vdGRpc3RpbmN0IEFTIG51bGxzX25vdF9kaXN0aW5jdFxuICAgICAgRlJPTSBwZ19jbGFzcyB0XG4gICAgICBKT0lOIHBnX2luZGV4IGl4IE9OIHQub2lkID0gaXguaW5kcmVsaWRcbiAgICAgIEpPSU4gcGdfY2xhc3MgaSBPTiBpLm9pZCA9IGl4LmluZGV4cmVsaWRcbiAgICAgIEpPSU4gcGdfYW0gYW0gT04gaS5yZWxhbSA9IGFtLm9pZFxuICAgICAgSk9JTiBMQVRFUkFMIHVubmVzdChpeC5pbmRrZXksIGl4LmluZG9wdGlvbilcbiAgICAgICAgICBXSVRIIE9SRElOQUxJVFkgQVMgdShhdHRudW0sIG9wdCwgb3JkKSBPTiB0cnVlXG4gICAgICBMRUZUIEpPSU4gcGdfYXR0cmlidXRlIGEgT04gYS5hdHRyZWxpZCA9IHQub2lkIFxuICAgICAgICAgIEFORCBhLmF0dG51bSA9IHUuYXR0bnVtIFxuICAgICAgICAgIEFORCB1LmF0dG51bSA+IDBcbiAgICAgIExFRlQgSk9JTiBMQVRFUkFMIChcbiAgICAgICAgICBTRUxFQ1QgXG4gICAgICAgICAgICAgIHVubmVzdChcbiAgICAgICAgICAgICAgICAgIENBU0UgXG4gICAgICAgICAgICAgICAgICAgICAgV0hFTiBwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpIH4gJ15BUlJBWVxcXFxbJyBUSEVOXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190b19hcnJheShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15BUlJBWVxcXFxbKC4qKVxcXFxdJCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFwxJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIEVMU0VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlbcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKV1cbiAgICAgICAgICAgICAgICAgIEVORFxuICAgICAgICAgICAgICApIGFzIGNvbHVtbl9leHByXG4gICAgICApIHBncm9vbmdhX2NvbCBPTiBhbS5hbW5hbWUgPSAncGdyb29uZ2EnIEFORCB1LmF0dG51bSA9IDBcbiAgICAgIFdIRVJFIHQucmVsbmFtZSA9ID9cbiAgICAgICAgICBBTkQgKHUuYXR0bnVtID4gMCBPUiAoYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwKSlcbiAgICAgIE9SREVSIEJZIGkucmVsbmFtZSwgdS5vcmQ7XG5gO1xuICAgIGNvbnN0IGluZGV4ZXMgPSAoYXdhaXQgY29tcGFyZURCLnJhdyhpbmRleGVzUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cztcblxuICAgIC8vIEZvcmVpZ24gS2V5cyDsobDtmoxcbiAgICBjb25zdCBmb3JlaWduc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIHRjLmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAga2N1LmNvbHVtbl9uYW1lLFxuICAgICAgICBjY3UudGFibGVfbmFtZSBBUyBmb3JlaWduX3RhYmxlX25hbWUsXG4gICAgICAgIGNjdS5jb2x1bW5fbmFtZSBBUyBmb3JlaWduX2NvbHVtbl9uYW1lLFxuICAgICAgICByYy51cGRhdGVfcnVsZSxcbiAgICAgICAgcmMuZGVsZXRlX3J1bGVcbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlX2NvbnN0cmFpbnRzIEFTIHRjXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5rZXlfY29sdW1uX3VzYWdlIEFTIGtjdVxuICAgICAgICBPTiB0Yy5jb25zdHJhaW50X25hbWUgPSBrY3UuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCB0Yy50YWJsZV9zY2hlbWEgPSBrY3UudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5jb25zdHJhaW50X2NvbHVtbl91c2FnZSBBUyBjY3VcbiAgICAgICAgT04gY2N1LmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgY2N1LnRhYmxlX3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEucmVmZXJlbnRpYWxfY29uc3RyYWludHMgQVMgcmNcbiAgICAgICAgT04gcmMuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCByYy5jb25zdHJhaW50X3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgV0hFUkUgdGMuY29uc3RyYWludF90eXBlID0gJ0ZPUkVJR04gS0VZJ1xuICAgICAgICBBTkQgdGMudGFibGVfbmFtZSA9ID9cbiAgICBgO1xuICAgIGNvbnN0IGZvcmVpZ25zID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoZm9yZWlnbnNRdWVyeSwgW3RhYmxlTmFtZV0pKS5yb3dzO1xuXG4gICAgcmV0dXJuIFtjb2x1bW5zLCBpbmRleGVzLCBmb3JlaWduc107XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIO2FjOydtOu4lOydmCBQS+ulvCDssLjsobDtlZjripQg64uk66W4IO2FjOydtOu4lOydmCBGSyDrqqnroZ3snYQg7KGw7ZqM7ZWp64uI64ukLlxuICAgKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDqtIDroKggRksg7KCc7JW97KGw6rG07J2EIOyCreygnC/rs7XqtaztlZjquLAg7JyE7ZW0IOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdldFJlZmVyZW5jaW5nRm9yZWlnbktleXMoZGI6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWZlcmVuY2luZ0ZvcmVpZ25LZXlbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIHRjLnRhYmxlX25hbWUsXG4gICAgICAgIHRjLmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAga2N1LmNvbHVtbl9uYW1lLFxuICAgICAgICBjY3UudGFibGVfbmFtZSBBUyByZWZlcmVuY2VkX3RhYmxlX25hbWUsXG4gICAgICAgIGNjdS5jb2x1bW5fbmFtZSBBUyByZWZlcmVuY2VkX2NvbHVtbl9uYW1lLFxuICAgICAgICByYy51cGRhdGVfcnVsZSxcbiAgICAgICAgcmMuZGVsZXRlX3J1bGVcbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlX2NvbnN0cmFpbnRzIEFTIHRjXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5rZXlfY29sdW1uX3VzYWdlIEFTIGtjdVxuICAgICAgICBPTiB0Yy5jb25zdHJhaW50X25hbWUgPSBrY3UuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCB0Yy50YWJsZV9zY2hlbWEgPSBrY3UudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5jb25zdHJhaW50X2NvbHVtbl91c2FnZSBBUyBjY3VcbiAgICAgICAgT04gY2N1LmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgY2N1LnRhYmxlX3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEucmVmZXJlbnRpYWxfY29uc3RyYWludHMgQVMgcmNcbiAgICAgICAgT04gcmMuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCByYy5jb25zdHJhaW50X3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgV0hFUkUgdGMuY29uc3RyYWludF90eXBlID0gJ0ZPUkVJR04gS0VZJ1xuICAgICAgICBBTkQgY2N1LnRhYmxlX25hbWUgPSA/XG4gICAgICAgIEFORCB0Yy50YWJsZV9zY2hlbWEgPSAncHVibGljJ1xuICAgIGA7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5yYXcocXVlcnksIFt0YWJsZU5hbWVdKTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3MubWFwKFxuICAgICAgKHJvdzoge1xuICAgICAgICB0YWJsZV9uYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbnN0cmFpbnRfbmFtZTogc3RyaW5nO1xuICAgICAgICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICAgICAgICByZWZlcmVuY2VkX3RhYmxlX25hbWU6IHN0cmluZztcbiAgICAgICAgcmVmZXJlbmNlZF9jb2x1bW5fbmFtZTogc3RyaW5nO1xuICAgICAgICB1cGRhdGVfcnVsZTogc3RyaW5nO1xuICAgICAgICBkZWxldGVfcnVsZTogc3RyaW5nO1xuICAgICAgfSkgPT4gKHtcbiAgICAgICAgdGFibGVOYW1lOiByb3cudGFibGVfbmFtZSxcbiAgICAgICAgY29uc3RyYWludE5hbWU6IHJvdy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGNvbHVtbk5hbWU6IHJvdy5jb2x1bW5fbmFtZSxcbiAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogcm93LnJlZmVyZW5jZWRfdGFibGVfbmFtZSxcbiAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IHJvdy5yZWZlcmVuY2VkX2NvbHVtbl9uYW1lLFxuICAgICAgICBvblVwZGF0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKHJvdy51cGRhdGVfcnVsZSksXG4gICAgICAgIG9uRGVsZXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24ocm93LmRlbGV0ZV9ydWxlKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdmVjdG9yIOy7rOufvOydmCBkaW1lbnNpb25z66W8IOyhsO2ajO2VqeuLiOuLpC5cbiAgICogcGdfYXR0cmlidXRl7J2YIGF0dHR5cG1vZOyXkOyEnCDssKjsm5Ag7IiY66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0VmVjdG9yRGltZW5zaW9ucyhcbiAgICBjb21wYXJlREI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGEuYXR0bmFtZSBhcyBjb2x1bW5fbmFtZSxcbiAgICAgICAgYS5hdHR0eXBtb2QgYXMgZGltZW5zaW9uc1xuICAgICAgRlJPTSBwZ19hdHRyaWJ1dGUgYVxuICAgICAgSk9JTiBwZ19jbGFzcyBjIE9OIGEuYXR0cmVsaWQgPSBjLm9pZFxuICAgICAgSk9JTiBwZ190eXBlIHQgT04gYS5hdHR0eXBpZCA9IHQub2lkXG4gICAgICBXSEVSRSBjLnJlbG5hbWUgPSA/XG4gICAgICAgIEFORCB0LnR5cG5hbWUgPSAndmVjdG9yJ1xuICAgICAgICBBTkQgYS5hdHRudW0gPiAwXG4gICAgYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb21wYXJlREIucmF3KHF1ZXJ5LCBbdGFibGVOYW1lXSk7XG4gICAgY29uc3QgZGltZW5zaW9uczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3VsdC5yb3dzKSB7XG4gICAgICAvLyBhdHR0eXBtb2Tsl5DshJwg7Iuk7KCcIGRpbWVuc2lvbnMg6rCSIOy2lOy2nFxuICAgICAgZGltZW5zaW9uc1tyb3cuY29sdW1uX25hbWVdID0gcm93LmRpbWVuc2lvbnMgPiAwID8gcm93LmRpbWVuc2lvbnMgOiAwO1xuICAgIH1cbiAgICByZXR1cm4gZGltZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoXsnYQg67aE7ISd7ZWY7JesIE1pZ3JhdGlvbkNvbHVtbiDqsJ3ssrTroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcmVzb2x2ZURCQ29sVHlwZShcbiAgICBkYkNvbHVtbjogUGdDb2x1bW4sXG4gICk6IFBpY2s8XG4gICAgTWlncmF0aW9uQ29sdW1uLFxuICAgIFwidHlwZVwiIHwgXCJsZW5ndGhcIiB8IFwicHJlY2lzaW9uXCIgfCBcInNjYWxlXCIgfCBcIm51bWJlclR5cGVcIiB8IFwiZGltZW5zaW9uc1wiXG4gID4ge1xuICAgIGNvbnN0IHsgdWR0X25hbWU6IF91ZHRfbmFtZSwgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLCBwcmVjaXNpb24sIG51bWVyaWNfc2NhbGUgfSA9IGRiQ29sdW1uO1xuXG4gICAgY29uc3QgeyB1ZHRfbmFtZSwgc2luZ2xlT3JBcnJheSB9ID0gKCgpID0+IHtcbiAgICAgIGlmIChfdWR0X25hbWUuc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLnN1YnN0cmluZygxKSxcbiAgICAgICAgICBzaW5nbGVPckFycmF5OiBcIltdXCIgYXMgY29uc3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLFxuICAgICAgICBzaW5nbGVPckFycmF5OiBcIlwiIGFzIGNvbnN0LFxuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8gVVVJRFxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGB1dWlkJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBJbnRlZ2VyIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiaW50OFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgYmlnSW50ZWdlciR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZhcmNoYXJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICAuLi4oY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoICYmIHtcbiAgICAgICAgICBsZW5ndGg6IGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgc3RyaW5nJHtzaW5nbGVPckFycmF5fWAgfTsgLy8gU3RyaW5nUHJvcCB3aXRob3V0IGxlbmd0aFxuICAgIH1cblxuICAgIC8vIE51bWJlck9yTnVtZXJpYyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgbnVtYmVyVHlwZTogXCJudW1lcmljXCIsXG4gICAgICAgIC4uLihwcmVjaXNpb24gIT09IG51bGwgJiZcbiAgICAgICAgICBudW1lcmljX3NjYWxlICE9PSBudWxsICYmIHtcbiAgICAgICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgICAgICAgc2NhbGU6IG51bWVyaWNfc2NhbGUsXG4gICAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJyZWFsXCIgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImZsb2F0OFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsIG51bWJlclR5cGU6IFwiZG91YmxlIHByZWNpc2lvblwiIH07XG4gICAgfVxuXG4gICAgLy8gQm9vbGVhblxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJib29sXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBib29sZWFuJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBUaW1lc3RhbXB6IHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRpbWVzdGFtcHR6XCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBkYXRlJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIC4uLihwcmVjaXNpb24gIT09IG51bGwgJiYge1xuICAgICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgICB9KSxcbiAgICAgIH07IC8vIERhdGVQcm9wIOKGkiB0aW1lc3RhbXB0elxuICAgIH1cblxuICAgIC8vIEpTT05cbiAgICBpZiAodWR0X25hbWUgPT09IFwianNvblwiIHx8IHVkdF9uYW1lID09PSBcImpzb25iXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwianNvblwiIH07XG4gICAgfVxuXG4gICAgLy8gVmVjdG9yIChwZ3ZlY3RvcilcbiAgICBpZiAodWR0X25hbWUgPT09IFwidmVjdG9yXCIpIHtcbiAgICAgIC8vIHZlY3RvciDtg4DsnoXsnZgg7LCo7JuQIOyImOuKlCBjb2x1bW5fZGVmYXVsdOuCmCDrs4Trj4Qg7L+866as66GcIO2ZleyduO2VtOyVvCDtlahcbiAgICAgIC8vIO2YhOyerOuKlCDquLDrs7jqsJIgMOycvOuhnCDshKTsoJUgKOyLpOygnCBkaW1lbnNpb25z64qUIGdldE1pZ3JhdGlvblNldEZyb21EQuyXkOyEnCDrs4Trj4Qg7L+866as66GcIO2ZleyduClcbiAgICAgIHJldHVybiB7IHR5cGU6IGB2ZWN0b3Ike3NpbmdsZU9yQXJyYXl9YCwgZGltZW5zaW9uczogMCB9O1xuICAgIH1cblxuICAgIC8vIHRzdmVjdG9yIChQb3N0Z3JlU1FMIOyghOusuCDqsoDsg4nsmqkg7YOA7J6FKVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0c3ZlY3RvclwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRzdmVjdG9yXCIgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlc29sdmUg67aI6rCA64ql7ZWcIFBvc3RncmVTUUwg7Lus65+8IO2DgOyehTogJHt1ZHRfbmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciA9IG5ldyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJncm91cCIsIlBvc3RncmVTUUxTY2hlbWFSZWFkZXJDbGFzcyIsImdldE1pZ3JhdGlvblNldEZyb21EQiIsImNvbXBhcmVEQiIsInRhYmxlIiwiZGJDb2x1bW5zIiwiZGJJbmRleGVzIiwiZGJGb3JlaWducyIsInJlYWRUYWJsZSIsImUiLCJFcnJvciIsIm1lc3NhZ2UiLCJpbmNsdWRlcyIsImNvbnNvbGUiLCJlcnJvciIsInZlY3RvckRpbWVuc2lvbnMiLCJnZXRWZWN0b3JEaW1lbnNpb25zIiwiY29sdW1ucyIsIm1hcCIsImRiQ29sdW1uIiwiZGJDb2xUeXBlIiwicmVzb2x2ZURCQ29sVHlwZSIsInR5cGUiLCJkaW1lbnNpb25zIiwiY29sdW1uX25hbWUiLCJuYW1lIiwibnVsbGFibGUiLCJpc19udWxsYWJsZSIsImlzX2dlbmVyYXRlZCIsImdlbmVyYXRlZCIsImV4cHJlc3Npb24iLCJnZW5lcmF0aW9uX2V4cHJlc3Npb24iLCJjb2x1bW5fZGVmYXVsdCIsImRlZmF1bHRWYWx1ZSIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwiZW5kc1dpdGgiLCJyZXBsYWNlQWxsIiwiZGVmYXVsdFRvIiwiZGJJbmRleGVzR3JvdXAiLCJmaWx0ZXIiLCJkYkluZGV4IiwiaXNfcHJpbWFyeSIsImZpbmQiLCJkYkZvcmVpZ24iLCJpbmRleF9uYW1lIiwiY29uc3RyYWludF9uYW1lIiwiaW5kZXhlcyIsIk9iamVjdCIsImtleXMiLCJpbmRleE5hbWUiLCJjdXJyZW50SW5kZXhlcyIsImZpcnN0SW5kZXgiLCJpc191bmlxdWUiLCJpZHgiLCJpbmRleF90eXBlIiwic29ydE9yZGVyIiwic29ydF9vcmRlciIsIm51bGxzRmlyc3QiLCJudWxsc19maXJzdCIsIm51bGxzTm90RGlzdGluY3QiLCJudWxsc19ub3RfZGlzdGluY3QiLCJ1c2luZyIsImZvcmVpZ25zIiwidG8iLCJmb3JlaWduX3RhYmxlX25hbWUiLCJmb3JlaWduX2NvbHVtbl9uYW1lIiwib25VcGRhdGUiLCJtYXBDb25zdHJhaW50QWN0aW9uIiwidXBkYXRlX3J1bGUiLCJvbkRlbGV0ZSIsImRlbGV0ZV9ydWxlIiwiYWN0aW9uIiwiYWN0aW9uTWFwIiwiUkVTVFJJQ1QiLCJDQVNDQURFIiwidGFibGVOYW1lIiwiY29sdW1uc1F1ZXJ5IiwicmF3Iiwicm93cyIsImxlbmd0aCIsImluZGV4ZXNRdWVyeSIsImZvcmVpZ25zUXVlcnkiLCJnZXRSZWZlcmVuY2luZ0ZvcmVpZ25LZXlzIiwiZGIiLCJxdWVyeSIsInJlc3VsdCIsInJvdyIsInRhYmxlX25hbWUiLCJjb25zdHJhaW50TmFtZSIsImNvbHVtbk5hbWUiLCJyZWZlcmVuY2VkVGFibGVOYW1lIiwicmVmZXJlbmNlZF90YWJsZV9uYW1lIiwicmVmZXJlbmNlZENvbHVtbk5hbWUiLCJyZWZlcmVuY2VkX2NvbHVtbl9uYW1lIiwidWR0X25hbWUiLCJfdWR0X25hbWUiLCJjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgiLCJwcmVjaXNpb24iLCJudW1lcmljX3NjYWxlIiwic2luZ2xlT3JBcnJheSIsInN1YnN0cmluZyIsIm51bWJlclR5cGUiLCJzY2FsZSIsIlBvc3RncmVTUUxTY2hlbWFSZWFkZXIiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUU1QixTQUFTQyxLQUFLLFFBQVEsVUFBVTtBQStEaEMsTUFBTUM7SUFDSjs7Ozs7R0FLQyxHQUNELE1BQU1DLHNCQUFzQkMsU0FBZSxFQUFFQyxLQUFhLEVBQWdDO1FBQ3hGLElBQUlDLFdBQXVCQyxXQUFzQkM7UUFDakQsSUFBSTtZQUNGLENBQUNGLFdBQVdDLFdBQVdDLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQ0MsU0FBUyxDQUFDTCxXQUFXQztRQUN2RSxFQUFFLE9BQU9LLEdBQVk7WUFDbkIsSUFBSUEsYUFBYUMsU0FBU0QsRUFBRUUsT0FBTyxDQUFDQyxRQUFRLENBQUMsb0JBQW9CO2dCQUMvRCxPQUFPO1lBQ1Q7WUFDQUMsUUFBUUMsS0FBSyxDQUFDTDtZQUNkLE9BQU87UUFDVDtRQUVBLDJCQUEyQjtRQUMzQixNQUFNTSxtQkFBbUIsTUFBTSxJQUFJLENBQUNDLG1CQUFtQixDQUFDYixXQUFXQztRQUVuRSxNQUFNYSxVQUE2QlosVUFBVWEsR0FBRyxDQUFDLENBQUNDO1lBQ2hELE1BQU1DLFlBQVksSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ0Y7WUFFeEMsOEJBQThCO1lBQzlCLElBQUlDLFVBQVVFLElBQUksS0FBSyxVQUFVO2dCQUMvQkYsVUFBVUcsVUFBVSxHQUFHUixnQkFBZ0IsQ0FBQ0ksU0FBU0ssV0FBVyxDQUFDLElBQUk7WUFDbkU7WUFFQSxPQUFPO2dCQUNMQyxNQUFNTixTQUFTSyxXQUFXO2dCQUMxQkUsVUFBVVAsU0FBU1EsV0FBVyxLQUFLO2dCQUNuQyxHQUFHUCxTQUFTO2dCQUNaLHNCQUFzQjtnQkFDdEIsR0FBRyxBQUFDLENBQUE7b0JBQ0YsSUFBSUQsU0FBU1MsWUFBWSxLQUFLLE9BQU9ULFNBQVNTLFlBQVksS0FBSyxLQUFLO3dCQUNsRSxPQUFPOzRCQUNM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
|
|
704
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxuICBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLyoqXG4gKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOygleuztOyeheuLiOuLpC5cbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY6riwIOychO2VtCDsgqzsmqnrkKnri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZmVyZW5jaW5nRm9yZWlnbktleSA9IHtcbiAgLyoqIEZL6rCAIOygleydmOuQnCDthYzsnbTruJTrqoUgKi9cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsoJzslb3sobDqsbQg7J2066aEICovXG4gIGNvbnN0cmFpbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsu6zrn7zrqoUgKi9cbiAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIO2FjOydtOu4lOuqhSAoUEvqsIAg7J6I64qUIO2FjOydtOu4lCkgKi9cbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIOy7rOufvOuqhSAo67O07Ya1ICdpZCcpICovXG4gIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiBPTiBVUERBVEUg7JWh7IWYICovXG4gIG9uVXBkYXRlOiBSZWxhdGlvbk9uO1xuICAvKiogT04gREVMRVRFIOyVoeyFmCAqL1xuICBvbkRlbGV0ZTogUmVsYXRpb25Pbjtcbn07XG5cbmV4cG9ydCB0eXBlIFBnQ29sdW1uID0ge1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBkYXRhX3R5cGU6IHN0cmluZztcbiAgdWR0X25hbWU6IHN0cmluZztcbiAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoOiBudW1iZXIgfCBudWxsO1xuICBwcmVjaXNpb246IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfc2NhbGU6IG51bWJlciB8IG51bGw7XG4gIGlzX251bGxhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbl9kZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xuICBpc19nZW5lcmF0ZWQ6IHN0cmluZzsgLy8gJ3MnID0gU1RPUkVELCAndicgPSBWSVJUVUFMLCAnJyA9IG5vbmVcbiAgZ2VuZXJhdGlvbl9leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBQZ0luZGV4ID0ge1xuICBpbmRleF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGlzX3VuaXF1ZTogYm9vbGVhbjtcbiAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgaW5kZXhfdHlwZTogc3RyaW5nO1xuICBudWxsc19maXJzdDogYm9vbGVhbjtcbiAgc29ydF9vcmRlcjogXCJBU0NcIiB8IFwiREVTQ1wiO1xuICBudWxsc19ub3RfZGlzdGluY3Q6IGJvb2xlYW47XG4gIGNvbHVtbl9vcmRlcjogbnVtYmVyO1xuICBpbmRleF9kZWZpbml0aW9uOiBzdHJpbmc7XG59O1xuXG50eXBlIFBnRm9yZWlnbiA9IHtcbiAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fdGFibGVfbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG59O1xuXG50eXBlIFJhd0NhcGFibGVLbmV4ID0gUGljazxLbmV4LCBcInJhd1wiPjtcblxuY2xhc3MgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmljSW5kZXhUeXBlcyA9IG5ldyBTZXQoW1wiYnRyZWVcIiwgXCJoYXNoXCIsIFwiZ2luXCIsIFwiZ2lzdFwiLCBcInBncm9vbmdhXCJdKTtcblxuICAvKipcbiAgICogRELsl5DshJwg7YWM7J2067iUIOygleuztOulvCDsnb3slrTshJwgTWlncmF0aW9uU2V07J2EIOunjOuTpOyWtOyYteuLiOuLpC5cbiAgICogQHBhcmFtIGNvbXBhcmVEQiBLbmV4IOyduOyKpO2EtOyKpFxuICAgKiBAcGFyYW0gdGFibGUg7YWM7J2067iUIOydtOumhFxuICAgKiBAcmV0dXJucyBNaWdyYXRpb25TZXQg6rCd7LK0XG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25TZXRGcm9tREIoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZTogc3RyaW5nLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblNldCB8IG51bGw+IHtcbiAgICBsZXQgZGJDb2x1bW5zOiBQZ0NvbHVtbltdLCBkYkluZGV4ZXM6IFBnSW5kZXhbXSwgZGJGb3JlaWduczogUGdGb3JlaWduW107XG4gICAgdHJ5IHtcbiAgICAgIFtkYkNvbHVtbnMsIGRiSW5kZXhlcywgZGJGb3JlaWduc10gPSBhd2FpdCB0aGlzLnJlYWRUYWJsZShjb21wYXJlREIsIHRhYmxlKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcIlRhYmxlIG5vdCBmb3VuZFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyB2ZWN0b3Ig7Lus65+87J2YIGRpbWVuc2lvbnMg7KGw7ZqMXG4gICAgY29uc3QgdmVjdG9yRGltZW5zaW9ucyA9IGF3YWl0IHRoaXMuZ2V0VmVjdG9yRGltZW5zaW9ucyhjb21wYXJlREIsIHRhYmxlKTtcblxuICAgIGNvbnN0IGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdID0gZGJDb2x1bW5zLm1hcCgoZGJDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGRiQ29sVHlwZSA9IHRoaXMucmVzb2x2ZURCQ29sVHlwZShkYkNvbHVtbik7XG5cbiAgICAgIC8vIHZlY3RvciDtg4DsnoXsnbgg6rK97JqwIGRpbWVuc2lvbnMg7ISk7KCVXG4gICAgICBpZiAoZGJDb2xUeXBlLnR5cGUgPT09IFwidmVjdG9yXCIpIHtcbiAgICAgICAgZGJDb2xUeXBlLmRpbWVuc2lvbnMgPSB2ZWN0b3JEaW1lbnNpb25zW2RiQ29sdW1uLmNvbHVtbl9uYW1lXSA/PyAwO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBkYkNvbHVtbi5jb2x1bW5fbmFtZSxcbiAgICAgICAgbnVsbGFibGU6IGRiQ29sdW1uLmlzX251bGxhYmxlID09PSBcIllFU1wiLFxuICAgICAgICAuLi5kYkNvbFR5cGUsXG4gICAgICAgIC8vIEdlbmVyYXRlZCBDb2x1bW4g7LKY66asXG4gICAgICAgIC4uLigoKSA9PiB7XG4gICAgICAgICAgaWYgKGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgfHwgZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInZcIikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInNcIiA/IFwiU1RPUkVEXCIgOiBcIlZJUlRVQUxcIixcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBkYkNvbHVtbi5nZW5lcmF0aW9uX2V4cHJlc3Npb24gPz8gXCJcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSkoKSxcbiAgICAgICAgLy8gRGVmYXVsdCDqsJIg7LKY66asIChHZW5lcmF0ZWQgQ29sdW1u7J20IOyVhOuLjCDqsr3smrDrp4wpXG4gICAgICAgIC4uLigoKSA9PiB7XG4gICAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbuydgCBkZWZhdWx0IOqwkuydtCDsl4bsnYxcbiAgICAgICAgICBpZiAoZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInNcIiB8fCBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwidlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRiQ29sdW1uLmNvbHVtbl9kZWZhdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBQb3N0Z3JlU1FMIGRlZmF1bHQg6rCSIOygleumrCAobmV4dHZhbCwgQ1VSUkVOVF9USU1FU1RBTVAg65OxKVxuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IGRiQ29sdW1uLmNvbHVtbl9kZWZhdWx0O1xuXG4gICAgICAgICAgICAvLyBuZXh0dmFsIOygnOqxsCAoU0VSSUFMIO2DgOyehSlcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUuc3RhcnRzV2l0aChcIm5leHR2YWwoXCIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8g7YOA7J6FIOy6kOyKpO2MhSDsoJzqsbAgKOyYiDogJzEnOjppbnRlZ2VyIOKGkiAxKVxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlLnJlcGxhY2UoLzo6W1xcd1xcc10rJC9nLCBcIlwiKTtcblxuICAgICAgICAgICAgLy8g65Sw7Ji07ZGc6rCAIHNpbmdsZSBxdW90ZeyduCDqsr3smrAgZG91YmxlIHF1b3Rl66GcIOuzgO2ZmFxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiBkZWZhdWx0VmFsdWUuZW5kc1dpdGgoXCInXCIpKSB7XG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCAnXCInKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFRvOiBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0pKCksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gUFJJTUFSWSBLRVnsmYAgZm9yZWlnbiBrZXnsmqkg7J24642x7IqkIOygnOyZuFxuICAgIGNvbnN0IGRiSW5kZXhlc0dyb3VwID0gZ3JvdXAoXG4gICAgICBkYkluZGV4ZXMuZmlsdGVyKFxuICAgICAgICAoZGJJbmRleCkgPT5cbiAgICAgICAgICAhZGJJbmRleC5pc19wcmltYXJ5ICYmXG4gICAgICAgICAgIWRiRm9yZWlnbnMuZmluZCgoZGJGb3JlaWduKSA9PiBkYkluZGV4LmluZGV4X25hbWUuaW5jbHVkZXMoZGJGb3JlaWduLmNvbnN0cmFpbnRfbmFtZSkpLFxuICAgICAgKSxcbiAgICAgIChkYkluZGV4KSA9PiBkYkluZGV4LmluZGV4X25hbWUsXG4gICAgKTtcblxuICAgIC8vIGluZGV4ZXMg7LKY66asXG4gICAgY29uc3QgaW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSA9IE9iamVjdC5rZXlzKGRiSW5kZXhlc0dyb3VwKS5tYXAoKGluZGV4TmFtZSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ZXMgPSBkYkluZGV4ZXNHcm91cFtpbmRleE5hbWVdPy50b1NvcnRlZChcbiAgICAgICAgKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmNvbHVtbl9vcmRlciAtIHJpZ2h0LmNvbHVtbl9vcmRlcixcbiAgICAgICk7XG4gICAgICBhc3NlcnQoY3VycmVudEluZGV4ZXMpO1xuXG4gICAgICBjb25zdCBmaXJzdEluZGV4ID0gY3VycmVudEluZGV4ZXNbMF07XG4gICAgICBjb25zdCBwYXJzZWRJbmRleERlZmluaXRpb24gPSB0aGlzLnBhcnNlSW5kZXhEZWZpbml0aW9uKGZpcnN0SW5kZXguaW5kZXhfZGVmaW5pdGlvbik7XG4gICAgICBjb25zdCByZXN0b3JlZEluZGV4VHlwZSA9IHRoaXMucmVzdG9yZU1pZ3JhdGlvbkluZGV4VHlwZShcbiAgICAgICAgZmlyc3RJbmRleCxcbiAgICAgICAgcGFyc2VkSW5kZXhEZWZpbml0aW9uLmFjY2Vzc01ldGhvZCxcbiAgICAgICk7XG4gICAgICBjb25zdCB1c2luZyA9IHRoaXMucmVzdG9yZUdlbmVyaWNVc2luZyhcbiAgICAgICAgcGFyc2VkSW5kZXhEZWZpbml0aW9uLmFjY2Vzc01ldGhvZCA/PyBmaXJzdEluZGV4LmluZGV4X3R5cGUsXG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiByZXN0b3JlZEluZGV4VHlwZSxcbiAgICAgICAgbmFtZTogaW5kZXhOYW1lLFxuICAgICAgICBjb2x1bW5zOiBjdXJyZW50SW5kZXhlcy5tYXAoKGlkeCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBpZHguY29sdW1uX25hbWUsXG4gICAgICAgICAgLi4uKHRoaXMuZXh0cmFjdEluZGV4Q29sdW1uT3BjbGFzcyhcbiAgICAgICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5jb2x1bW5EZWZpbml0aW9uc1tpZHguY29sdW1uX29yZGVyIC0gMV0sXG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgb3BjbGFzczogdGhpcy5leHRyYWN0SW5kZXhDb2x1bW5PcGNsYXNzKFxuICAgICAgICAgICAgICAgICAgcGFyc2VkSW5kZXhEZWZpbml0aW9uLmNvbHVtbkRlZmluaXRpb25zW2lkeC5jb2x1bW5fb3JkZXIgLSAxXSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi4odXNpbmcgPT09IFwiYnRyZWVcIlxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgc29ydE9yZGVyOiBpZHguc29ydF9vcmRlcixcbiAgICAgICAgICAgICAgICBudWxsc0ZpcnN0OiBpZHgubnVsbHNfZmlyc3QsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KSksXG5cbiAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogZmlyc3RJbmRleC5udWxsc19ub3RfZGlzdGluY3QsXG4gICAgICAgIC4uLih1c2luZyA/IHsgdXNpbmcgfSA6IHt9KSxcbiAgICAgICAgLi4udGhpcy5wYXJzZVZlY3RvckluZGV4T3B0aW9ucyhyZXN0b3JlZEluZGV4VHlwZSwgcGFyc2VkSW5kZXhEZWZpbml0aW9uLndpdGhPcHRpb25zKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBmb3JlaWducyDsspjrpqxcbiAgICBjb25zdCBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdID0gZGJGb3JlaWducy5tYXAoKGRiRm9yZWlnbikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogW2RiRm9yZWlnbi5jb2x1bW5fbmFtZV0sXG4gICAgICAgIHRvOiBgJHtkYkZvcmVpZ24uZm9yZWlnbl90YWJsZV9uYW1lfS4ke2RiRm9yZWlnbi5mb3JlaWduX2NvbHVtbl9uYW1lfWAsXG4gICAgICAgIG9uVXBkYXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLnVwZGF0ZV9ydWxlKSxcbiAgICAgICAgb25EZWxldGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihkYkZvcmVpZ24uZGVsZXRlX3J1bGUpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YWJsZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBpbmRleGVzLFxuICAgICAgZm9yZWlnbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FM7J2YIGNvbnN0cmFpbnQgYWN0aW9u7J2EIEtuZXgg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBtYXBDb25zdHJhaW50QWN0aW9uKGFjdGlvbjogc3RyaW5nKTogUmVsYXRpb25PbiB7XG4gICAgY29uc3QgYWN0aW9uTWFwOiBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbk9uPiA9IHtcbiAgICAgIFwiTk8gQUNUSU9OXCI6IFwiTk8gQUNUSU9OXCIsXG4gICAgICBSRVNUUklDVDogXCJSRVNUUklDVFwiLFxuICAgICAgQ0FTQ0FERTogXCJDQVNDQURFXCIsXG4gICAgICBcIlNFVCBOVUxMXCI6IFwiU0VUIE5VTExcIixcbiAgICAgIFwiU0VUIERFRkFVTFRcIjogXCJTRVQgREVGQVVMVFwiLFxuICAgIH07XG4gICAgcmV0dXJuIGFjdGlvbk1hcFthY3Rpb25dID8/IFwiTk8gQUNUSU9OXCI7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IO2FjOydtOu4lCDsnb3slrTshJwgY29scywgaW5kZXhlcywgZm9yZWlnbnMg67CY7ZmYXG4gICAqL1xuICBhc3luYyByZWFkVGFibGUoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxbUGdDb2x1bW5bXSwgUGdJbmRleFtdLCBQZ0ZvcmVpZ25bXV0+IHtcbiAgICAvLyBDb2x1bW5zIOyhsO2ajCAoR2VuZXJhdGVkIENvbHVtbiDsoJXrs7Qg7Y+s7ZWoKVxuICAgIGNvbnN0IGNvbHVtbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBjLmNvbHVtbl9uYW1lLFxuICAgICAgICBjLmRhdGFfdHlwZSxcbiAgICAgICAgYy51ZHRfbmFtZSxcbiAgICAgICAgQ09BTEVTQ0UoXG4gICAgICAgICAgYy5jaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgICAgQ0FTRSBXSEVOIGMuZGF0YV90eXBlID0gJ0FSUkFZJyBBTkQgYS5hdHR0eXBtb2QgPiAwXG4gICAgICAgICAgICBUSEVOIGEuYXR0dHlwbW9kIC0gNFxuICAgICAgICAgICAgRUxTRSBOVUxMXG4gICAgICAgICAgRU5EXG4gICAgICAgICkgQVMgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgICBDT0FMRVNDRShjLmRhdGV0aW1lX3ByZWNpc2lvbiwgYy5udW1lcmljX3ByZWNpc2lvbikgQVMgcHJlY2lzaW9uLFxuICAgICAgICBjLm51bWVyaWNfc2NhbGUsXG4gICAgICAgIGMuaXNfbnVsbGFibGUsXG4gICAgICAgIGMuY29sdW1uX2RlZmF1bHQsXG4gICAgICAgIENPQUxFU0NFKGEuYXR0Z2VuZXJhdGVkLCAnJykgYXMgaXNfZ2VuZXJhdGVkLFxuICAgICAgICBjLmdlbmVyYXRpb25fZXhwcmVzc2lvblxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBjXG4gICAgICBMRUZUIEpPSU4gcGdfYXR0cmlidXRlIGEgT04gYS5hdHRuYW1lID0gYy5jb2x1bW5fbmFtZVxuICAgICAgICBBTkQgYS5hdHRyZWxpZCA9IChcbiAgICAgICAgICBTRUxFQ1Qgb2lkIEZST00gcGdfY2xhc3MgV0hFUkUgcmVsbmFtZSA9IGMudGFibGVfbmFtZVxuICAgICAgICAgIEFORCByZWxuYW1lc3BhY2UgPSAoU0VMRUNUIG9pZCBGUk9NIHBnX25hbWVzcGFjZSBXSEVSRSBuc3BuYW1lID0gYy50YWJsZV9zY2hlbWEpXG4gICAgICAgIClcbiAgICAgIFdIRVJFIGMudGFibGVfbmFtZSA9ID9cbiAgICAgICAgQU5EIGMudGFibGVfc2NoZW1hID0gJ3B1YmxpYydcbiAgICAgIE9SREVSIEJZIGMub3JkaW5hbF9wb3NpdGlvblxuICAgIGA7XG4gICAgY29uc3QgY29sdW1ucyA9IChhd2FpdCBjb21wYXJlREIucmF3KGNvbHVtbnNRdWVyeSwgW3RhYmxlTmFtZV0pKS5yb3dzIGFzIFBnQ29sdW1uW107XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIG5vdCBmb3VuZDogJHt0YWJsZU5hbWV9YCk7XG4gICAgfVxuXG4gICAgLy8gSW5kZXhlcyDsobDtmowgKFBHcm9vbmdhIO2RnO2YhOyLnSDsnbjrjbHsiqQg7Y+s7ZWoKVxuICAgIGNvbnN0IGluZGV4ZXNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICAgIGkucmVsbmFtZSBBUyBpbmRleF9uYW1lLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgV0hFTiBhbS5hbW5hbWUgPSAncGdyb29uZ2EnIEFORCB1LmF0dG51bSA9IDAgVEhFTlxuICAgICAgICAgICAgICAgICAgcmVnZXhwX3JlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3JlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFRSSU0ocGdyb29uZ2FfY29sLmNvbHVtbl9leHByKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJzo6dGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnZydcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICdbKCldJyxcbiAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAnZydcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgRUxTRSBhLmF0dG5hbWVcbiAgICAgICAgICBFTkQgQVMgY29sdW1uX25hbWUsXG4gICAgICAgICAgaXguaW5kaXN1bmlxdWUgQVMgaXNfdW5pcXVlLFxuICAgICAgICAgIGl4LmluZGlzcHJpbWFyeSBBUyBpc19wcmltYXJ5LFxuICAgICAgICAgIGFtLmFtbmFtZSBBUyBpbmRleF90eXBlLFxuICAgICAgICAgIENPQUxFU0NFKCh1Lm9wdCAmIDIpID0gMiwgRkFMU0UpIEFTIG51bGxzX2ZpcnN0LFxuICAgICAgICAgIENBU0UgXG4gICAgICAgICAgICAgIFdIRU4gKHUub3B0ICYgMSkgPSAxIFRIRU4gJ0RFU0MnXG4gICAgICAgICAgICAgIEVMU0UgJ0FTQydcbiAgICAgICAgICBFTkQgQVMgc29ydF9vcmRlcixcbiAgICAgICAgICBpeC5pbmRudWxsc25vdGRpc3RpbmN0IEFTIG51bGxzX25vdF9kaXN0aW5jdCxcbiAgICAgICAgICB1Lm9yZCBBUyBjb2x1bW5fb3JkZXIsXG4gICAgICAgICAgcGdfZ2V0X2luZGV4ZGVmKGl4LmluZGV4cmVsaWQpIEFTIGluZGV4X2RlZmluaXRpb25cbiAgICAgIEZST00gcGdfY2xhc3MgdFxuICAgICAgSk9JTiBwZ19pbmRleCBpeCBPTiB0Lm9pZCA9IGl4LmluZHJlbGlkXG4gICAgICBKT0lOIHBnX2NsYXNzIGkgT04gaS5vaWQgPSBpeC5pbmRleHJlbGlkXG4gICAgICBKT0lOIHBnX2FtIGFtIE9OIGkucmVsYW0gPSBhbS5vaWRcbiAgICAgIEpPSU4gTEFURVJBTCB1bm5lc3QoaXguaW5ka2V5LCBpeC5pbmRvcHRpb24pXG4gICAgICAgICAgV0lUSCBPUkRJTkFMSVRZIEFTIHUoYXR0bnVtLCBvcHQsIG9yZCkgT04gdHJ1ZVxuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0cmVsaWQgPSB0Lm9pZCBcbiAgICAgICAgICBBTkQgYS5hdHRudW0gPSB1LmF0dG51bSBcbiAgICAgICAgICBBTkQgdS5hdHRudW0gPiAwXG4gICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgU0VMRUNUIFxuICAgICAgICAgICAgICB1bm5lc3QoXG4gICAgICAgICAgICAgICAgICBDQVNFIFxuICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKSB+ICdeQVJSQVlcXFxcWycgVEhFTlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fYXJyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeQVJSQVlcXFxcWyguKilcXFxcXSQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXFxcMSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBFTFNFXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZW3BnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCldXG4gICAgICAgICAgICAgICAgICBFTkRcbiAgICAgICAgICAgICAgKSBhcyBjb2x1bW5fZXhwclxuICAgICAgKSBwZ3Jvb25nYV9jb2wgT04gYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwXG4gICAgICBXSEVSRSB0LnJlbG5hbWUgPSA/XG4gICAgICAgICAgQU5EICh1LmF0dG51bSA+IDAgT1IgKGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMCkpXG4gICAgICBPUkRFUiBCWSBpLnJlbG5hbWUsIHUub3JkO1xuYDtcbiAgICBjb25zdCBpbmRleGVzID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoaW5kZXhlc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3M7XG5cbiAgICAvLyBGb3JlaWduIEtleXMg7KGw7ZqMXG4gICAgY29uc3QgZm9yZWlnbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICB0Yy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGtjdS5jb2x1bW5fbmFtZSxcbiAgICAgICAgY2N1LnRhYmxlX25hbWUgQVMgZm9yZWlnbl90YWJsZV9uYW1lLFxuICAgICAgICBjY3UuY29sdW1uX25hbWUgQVMgZm9yZWlnbl9jb2x1bW5fbmFtZSxcbiAgICAgICAgcmMudXBkYXRlX3J1bGUsXG4gICAgICAgIHJjLmRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZV9jb25zdHJhaW50cyBBUyB0Y1xuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEua2V5X2NvbHVtbl91c2FnZSBBUyBrY3VcbiAgICAgICAgT04gdGMuY29uc3RyYWludF9uYW1lID0ga2N1LmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0ga2N1LnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEuY29uc3RyYWludF9jb2x1bW5fdXNhZ2UgQVMgY2N1XG4gICAgICAgIE9OIGNjdS5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIGNjdS50YWJsZV9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLnJlZmVyZW50aWFsX2NvbnN0cmFpbnRzIEFTIHJjXG4gICAgICAgIE9OIHJjLmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgcmMuY29uc3RyYWludF9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIFdIRVJFIHRjLmNvbnN0cmFpbnRfdHlwZSA9ICdGT1JFSUdOIEtFWSdcbiAgICAgICAgQU5EIHRjLnRhYmxlX25hbWUgPSA/XG4gICAgYDtcbiAgICBjb25zdCBmb3JlaWducyA9IChhd2FpdCBjb21wYXJlREIucmF3KGZvcmVpZ25zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cztcblxuICAgIHJldHVybiBbY29sdW1ucywgaW5kZXhlcywgZm9yZWlnbnNdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlTWlncmF0aW9uSW5kZXhUeXBlKFxuICAgIGluZGV4OiBQaWNrPFBnSW5kZXgsIFwiaXNfdW5pcXVlXCIgfCBcImluZGV4X3R5cGVcIj4sXG4gICAgYWNjZXNzTWV0aG9kPzogc3RyaW5nLFxuICApOiBNaWdyYXRpb25JbmRleFtcInR5cGVcIl0ge1xuICAgIGNvbnN0IHJlc29sdmVkQWNjZXNzTWV0aG9kID0gKGFjY2Vzc01ldGhvZCA/PyBpbmRleC5pbmRleF90eXBlKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHJlc29sdmVkQWNjZXNzTWV0aG9kID09PSBcImhuc3dcIiB8fCByZXNvbHZlZEFjY2Vzc01ldGhvZCA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZEFjY2Vzc01ldGhvZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXguaXNfdW5pcXVlID8gXCJ1bmlxdWVcIiA6IFwiaW5kZXhcIjtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUdlbmVyaWNVc2luZyhcbiAgICBhY2Nlc3NNZXRob2Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKTogTWlncmF0aW9uSW5kZXhbXCJ1c2luZ1wiXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFhY2Nlc3NNZXRob2QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGFjY2Vzc01ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdGhpcy5nZW5lcmljSW5kZXhUeXBlcy5oYXMobm9ybWFsaXplZCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQgYXMgTWlncmF0aW9uSW5kZXhbXCJ1c2luZ1wiXTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWZWN0b3JJbmRleE9wdGlvbnMoXG4gICAgdHlwZTogTWlncmF0aW9uSW5kZXhbXCJ0eXBlXCJdLFxuICAgIHdpdGhPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICApOiBQaWNrPE1pZ3JhdGlvbkluZGV4LCBcIm1cIiB8IFwiZWZDb25zdHJ1Y3Rpb25cIiB8IFwibGlzdHNcIj4ge1xuICAgIGlmICh0eXBlID09PSBcImhuc3dcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLm0pICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgbTogdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubSkgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMuZWZfY29uc3RydWN0aW9uKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGVmQ29uc3RydWN0aW9uOiB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5lZl9jb25zdHJ1Y3Rpb24pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiaXZmZmxhdFwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4odGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubGlzdHMpICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgbGlzdHM6IHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLmxpc3RzKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbnRlZ2VyT3B0aW9uKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbHVtbkRlZmluaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFjb2x1bW5EZWZpbml0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWQgPSBjb2x1bW5EZWZpbml0aW9uXG4gICAgICAucmVwbGFjZSgvXFxzK05VTExTXFxzKyhGSVJTVHxMQVNUKVxccyokL2ksIFwiXCIpXG4gICAgICAucmVwbGFjZSgvXFxzKyhBU0N8REVTQylcXHMqJC9pLCBcIlwiKVxuICAgICAgLnRyaW0oKTtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2VuaXplVG9wTGV2ZWwodHJpbW1lZCk7XG5cbiAgICBpZiAodG9rZW5zLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMl0/LnRvVXBwZXJDYXNlKCkgPT09IFwiQ09MTEFURVwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnMuYXQoLTEpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUluZGV4RGVmaW5pdGlvbihpbmRleERlZmluaXRpb246IHN0cmluZyk6IHtcbiAgICBhY2Nlc3NNZXRob2Q/OiBzdHJpbmc7XG4gICAgY29sdW1uRGVmaW5pdGlvbnM6IHN0cmluZ1tdO1xuICAgIHdpdGhPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9IHtcbiAgICBjb25zdCBhY2Nlc3NNZXRob2QgPSBpbmRleERlZmluaXRpb24ubWF0Y2goL1xcYlVTSU5HXFxzKyhbYS16X11bXFx3XSopL2kpPy5bMV0/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdXNpbmdNYXRjaEluZGV4ID0gaW5kZXhEZWZpbml0aW9uLnNlYXJjaCgvXFxiVVNJTkdcXGIvaSk7XG4gICAgY29uc3QgY29sdW1uc1N0YXJ0ID0gdXNpbmdNYXRjaEluZGV4ID49IDAgPyBpbmRleERlZmluaXRpb24uaW5kZXhPZihcIihcIiwgdXNpbmdNYXRjaEluZGV4KSA6IC0xO1xuICAgIGNvbnN0IGNvbHVtbnNFbmQgPVxuICAgICAgY29sdW1uc1N0YXJ0ID49IDAgPyB0aGlzLmZpbmRNYXRjaGluZ1BhcmVudGhlc2lzKGluZGV4RGVmaW5pdGlvbiwgY29sdW1uc1N0YXJ0KSA6IC0xO1xuICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb25zID1cbiAgICAgIGNvbHVtbnNTdGFydCA+PSAwICYmIGNvbHVtbnNFbmQgPiBjb2x1bW5zU3RhcnRcbiAgICAgICAgPyB0aGlzLnNwbGl0VG9wTGV2ZWwoaW5kZXhEZWZpbml0aW9uLnNsaWNlKGNvbHVtbnNTdGFydCArIDEsIGNvbHVtbnNFbmQpLCBcIixcIilcbiAgICAgICAgOiBbXTtcblxuICAgIGNvbnN0IHdpdGhNYXRjaCA9IC9cXGJXSVRIXFxzKlxcKC9pLmV4ZWMoaW5kZXhEZWZpbml0aW9uKTtcbiAgICBjb25zdCB3aXRoU3RhcnQgPSB3aXRoTWF0Y2ggPyBpbmRleERlZmluaXRpb24uaW5kZXhPZihcIihcIiwgd2l0aE1hdGNoLmluZGV4KSA6IC0xO1xuICAgIGNvbnN0IHdpdGhFbmQgPSB3aXRoU3RhcnQgPj0gMCA/IHRoaXMuZmluZE1hdGNoaW5nUGFyZW50aGVzaXMoaW5kZXhEZWZpbml0aW9uLCB3aXRoU3RhcnQpIDogLTE7XG4gICAgY29uc3Qgd2l0aE9wdGlvbnMgPVxuICAgICAgd2l0aFN0YXJ0ID49IDAgJiYgd2l0aEVuZCA+IHdpdGhTdGFydFxuICAgICAgICA/IHRoaXMucGFyc2VJbmRleE9wdGlvbkVudHJpZXMoaW5kZXhEZWZpbml0aW9uLnNsaWNlKHdpdGhTdGFydCArIDEsIHdpdGhFbmQpKVxuICAgICAgICA6IHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc01ldGhvZCxcbiAgICAgIGNvbHVtbkRlZmluaXRpb25zLFxuICAgICAgd2l0aE9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbmRleE9wdGlvbkVudHJpZXMob3B0aW9uU291cmNlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdFRvcExldmVsKG9wdGlvblNvdXJjZSwgXCIsXCIpLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigocmVzdWx0LCBlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IGVudHJ5LnRyaW0oKS5tYXRjaCgvXihbYS16X11bXFx3XSopXFxzKj1cXHMqKC4rKSQvaSk7XG4gICAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgWywga2V5LCByYXdWYWx1ZV0gPSBtYXRjaGVkO1xuICAgICAgcmVzdWx0W2tleS50b0xvd2VyQ2FzZSgpXSA9IHJhd1ZhbHVlLnRyaW0oKS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csIFwiXCIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIHNwbGl0VG9wTGV2ZWwoc291cmNlOiBzdHJpbmcsIGRlbGltaXRlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGl0ZW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IHBhcmVuRGVwdGggPSAwO1xuICAgIGxldCBicmFja2V0RGVwdGggPSAwO1xuICAgIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gICAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5TaW5nbGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpbkRvdWJsZVF1b3RlICYmIG5leHRDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5TaW5nbGVRdW90ZSB8fCBpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgcGFyZW5EZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgICBwYXJlbkRlcHRoIC09IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IFwiW1wiKSB7XG4gICAgICAgIGJyYWNrZXREZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBcIl1cIikge1xuICAgICAgICBicmFja2V0RGVwdGggLT0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBkZWxpbWl0ZXIgJiYgcGFyZW5EZXB0aCA9PT0gMCAmJiBicmFja2V0RGVwdGggPT09IDApIHtcbiAgICAgICAgaXRlbXMucHVzaChzb3VyY2Uuc2xpY2Uoc3RhcnQsIGluZGV4KS50cmltKCkpO1xuICAgICAgICBzdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0YWlsID0gc291cmNlLnNsaWNlKHN0YXJ0KS50cmltKCk7XG4gICAgaWYgKHRhaWwubGVuZ3RoID4gMCkge1xuICAgICAgaXRlbXMucHVzaCh0YWlsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIHRva2VuaXplVG9wTGV2ZWwoc291cmNlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzdGFydCA9IC0xO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgYnJhY2tldERlcHRoID0gMDtcbiAgICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgIGxldCBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG5cbiAgICBjb25zdCBwdXNoVG9rZW4gPSAoZW5kSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gc291cmNlLnNsaWNlKHN0YXJ0LCBlbmRJbmRleCkudHJpbSgpO1xuICAgICAgaWYgKHRva2VuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAtMTtcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluRG91YmxlUXVvdGUgJiYgbmV4dENoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5TaW5nbGVRdW90ZSAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbkRlcHRoICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICAgICAgcGFyZW5EZXB0aCAtPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBcIltcIikge1xuICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyYWNrZXREZXB0aCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBcIl1cIikge1xuICAgICAgICAgIGJyYWNrZXREZXB0aCAtPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9cXHMvLnRlc3QoY2hhcikgJiYgcGFyZW5EZXB0aCA9PT0gMCAmJiBicmFja2V0RGVwdGggPT09IDApIHtcbiAgICAgICAgICBwdXNoVG9rZW4oaW5kZXgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoVG9rZW4oc291cmNlLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1hdGNoaW5nUGFyZW50aGVzaXMoc291cmNlOiBzdHJpbmcsIG9wZW5JbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gICAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gb3BlbkluZGV4OyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluRG91YmxlUXVvdGUgJiYgbmV4dENoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpblNpbmdsZVF1b3RlIHx8IGluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICBkZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOuqqeuhneydhCDsobDtmoztlanri4jri6QuXG4gICAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7IKt7KCcL+uzteq1rO2VmOq4sCDsnITtlbQg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVmZXJlbmNpbmdGb3JlaWduS2V5cyhkYjogS25leCwgdGFibGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlZmVyZW5jaW5nRm9yZWlnbktleVtdPiB7XG4gICAgY29uc3QgcXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgdGMudGFibGVfbmFtZSxcbiAgICAgICAgdGMuY29uc3RyYWludF9uYW1lLFxuICAgICAgICBrY3UuY29sdW1uX25hbWUsXG4gICAgICAgIGNjdS50YWJsZV9uYW1lIEFTIHJlZmVyZW5jZWRfdGFibGVfbmFtZSxcbiAgICAgICAgY2N1LmNvbHVtbl9uYW1lIEFTIHJlZmVyZW5jZWRfY29sdW1uX25hbWUsXG4gICAgICAgIHJjLnVwZGF0ZV9ydWxlLFxuICAgICAgICByYy5kZWxldGVfcnVsZVxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVfY29uc3RyYWludHMgQVMgdGNcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmtleV9jb2x1bW5fdXNhZ2UgQVMga2N1XG4gICAgICAgIE9OIHRjLmNvbnN0cmFpbnRfbmFtZSA9IGtjdS5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHRjLnRhYmxlX3NjaGVtYSA9IGtjdS50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmNvbnN0cmFpbnRfY29sdW1uX3VzYWdlIEFTIGNjdVxuICAgICAgICBPTiBjY3UuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCBjY3UudGFibGVfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5yZWZlcmVudGlhbF9jb25zdHJhaW50cyBBUyByY1xuICAgICAgICBPTiByYy5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHJjLmNvbnN0cmFpbnRfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBXSEVSRSB0Yy5jb25zdHJhaW50X3R5cGUgPSAnRk9SRUlHTiBLRVknXG4gICAgICAgIEFORCBjY3UudGFibGVfbmFtZSA9ID9cbiAgICAgICAgQU5EIHRjLnRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnXG4gICAgYDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLnJhdyhxdWVyeSwgW3RhYmxlTmFtZV0pO1xuICAgIHJldHVybiByZXN1bHQucm93cy5tYXAoXG4gICAgICAocm93OiB7XG4gICAgICAgIHRhYmxlX25hbWU6IHN0cmluZztcbiAgICAgICAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlZmVyZW5jZWRfdGFibGVfbmFtZTogc3RyaW5nO1xuICAgICAgICByZWZlcmVuY2VkX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gICAgICAgIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG4gICAgICB9KSA9PiAoe1xuICAgICAgICB0YWJsZU5hbWU6IHJvdy50YWJsZV9uYW1lLFxuICAgICAgICBjb25zdHJhaW50TmFtZTogcm93LmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAgY29sdW1uTmFtZTogcm93LmNvbHVtbl9uYW1lLFxuICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiByb3cucmVmZXJlbmNlZF90YWJsZV9uYW1lLFxuICAgICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogcm93LnJlZmVyZW5jZWRfY29sdW1uX25hbWUsXG4gICAgICAgIG9uVXBkYXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24ocm93LnVwZGF0ZV9ydWxlKSxcbiAgICAgICAgb25EZWxldGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihyb3cuZGVsZXRlX3J1bGUpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB2ZWN0b3Ig7Lus65+87J2YIGRpbWVuc2lvbnPrpbwg7KGw7ZqM7ZWp64uI64ukLlxuICAgKiBwZ19hdHRyaWJ1dGXsnZggYXR0dHlwbW9k7JeQ7IScIOywqOybkCDsiJjrpbwg7LaU7Lac7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRWZWN0b3JEaW1lbnNpb25zKFxuICAgIGNvbXBhcmVEQjogUmF3Q2FwYWJsZUtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGEuYXR0bmFtZSBhcyBjb2x1bW5fbmFtZSxcbiAgICAgICAgYS5hdHR0eXBtb2QgYXMgZGltZW5zaW9uc1xuICAgICAgRlJPTSBwZ19hdHRyaWJ1dGUgYVxuICAgICAgSk9JTiBwZ19jbGFzcyBjIE9OIGEuYXR0cmVsaWQgPSBjLm9pZFxuICAgICAgSk9JTiBwZ190eXBlIHQgT04gYS5hdHR0eXBpZCA9IHQub2lkXG4gICAgICBXSEVSRSBjLnJlbG5hbWUgPSA/XG4gICAgICAgIEFORCB0LnR5cG5hbWUgPSAndmVjdG9yJ1xuICAgICAgICBBTkQgYS5hdHRudW0gPiAwXG4gICAgYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb21wYXJlREIucmF3KHF1ZXJ5LCBbdGFibGVOYW1lXSk7XG4gICAgY29uc3QgZGltZW5zaW9uczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3VsdC5yb3dzKSB7XG4gICAgICAvLyBhdHR0eXBtb2Tsl5DshJwg7Iuk7KCcIGRpbWVuc2lvbnMg6rCSIOy2lOy2nFxuICAgICAgZGltZW5zaW9uc1tyb3cuY29sdW1uX25hbWVdID0gcm93LmRpbWVuc2lvbnMgPiAwID8gcm93LmRpbWVuc2lvbnMgOiAwO1xuICAgIH1cbiAgICByZXR1cm4gZGltZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoXsnYQg67aE7ISd7ZWY7JesIE1pZ3JhdGlvbkNvbHVtbiDqsJ3ssrTroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcmVzb2x2ZURCQ29sVHlwZShcbiAgICBkYkNvbHVtbjogUGdDb2x1bW4sXG4gICk6IFBpY2s8XG4gICAgTWlncmF0aW9uQ29sdW1uLFxuICAgIFwidHlwZVwiIHwgXCJsZW5ndGhcIiB8IFwicHJlY2lzaW9uXCIgfCBcInNjYWxlXCIgfCBcIm51bWJlclR5cGVcIiB8IFwiZGltZW5zaW9uc1wiXG4gID4ge1xuICAgIGNvbnN0IHsgdWR0X25hbWU6IF91ZHRfbmFtZSwgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLCBwcmVjaXNpb24sIG51bWVyaWNfc2NhbGUgfSA9IGRiQ29sdW1uO1xuXG4gICAgY29uc3QgeyB1ZHRfbmFtZSwgc2luZ2xlT3JBcnJheSB9ID0gKCgpID0+IHtcbiAgICAgIGlmIChfdWR0X25hbWUuc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLnN1YnN0cmluZygxKSxcbiAgICAgICAgICBzaW5nbGVPckFycmF5OiBcIltdXCIgYXMgY29uc3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLFxuICAgICAgICBzaW5nbGVPckFycmF5OiBcIlwiIGFzIGNvbnN0LFxuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8gVVVJRFxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGB1dWlkJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBJbnRlZ2VyIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiaW50OFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgYmlnSW50ZWdlciR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZhcmNoYXJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICAuLi4oY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoICYmIHtcbiAgICAgICAgICBsZW5ndGg6IGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgc3RyaW5nJHtzaW5nbGVPckFycmF5fWAgfTsgLy8gU3RyaW5nUHJvcCB3aXRob3V0IGxlbmd0aFxuICAgIH1cblxuICAgIC8vIE51bWJlck9yTnVtZXJpYyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgbnVtYmVyVHlwZTogXCJudW1lcmljXCIsXG4gICAgICAgIC4uLihwcmVjaXNpb24gIT09IG51bGwgJiZcbiAgICAgICAgICBudW1lcmljX3NjYWxlICE9PSBudWxsICYmIHtcbiAgICAgICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgICAgICAgc2NhbGU6IG51bWVyaWNfc2NhbGUsXG4gICAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJyZWFsXCIgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImZsb2F0OFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsIG51bWJlclR5cGU6IFwiZG91YmxlIHByZWNpc2lvblwiIH07XG4gICAgfVxuXG4gICAgLy8gQm9vbGVhblxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJib29sXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBib29sZWFuJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBUaW1lc3RhbXB6IHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRpbWVzdGFtcHR6XCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBkYXRlJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIC4uLihwcmVjaXNpb24gIT09IG51bGwgJiYge1xuICAgICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgICB9KSxcbiAgICAgIH07IC8vIERhdGVQcm9wIOKGkiB0aW1lc3RhbXB0elxuICAgIH1cblxuICAgIC8vIEpTT05cbiAgICBpZiAodWR0X25hbWUgPT09IFwianNvblwiIHx8IHVkdF9uYW1lID09PSBcImpzb25iXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwianNvblwiIH07XG4gICAgfVxuXG4gICAgLy8gVmVjdG9yIChwZ3ZlY3RvcilcbiAgICBpZiAodWR0X25hbWUgPT09IFwidmVjdG9yXCIpIHtcbiAgICAgIC8vIHZlY3RvciDtg4DsnoXsnZgg7LCo7JuQIOyImOuKlCBjb2x1bW5fZGVmYXVsdOuCmCDrs4Trj4Qg7L+866as66GcIO2ZleyduO2VtOyVvCDtlahcbiAgICAgIC8vIO2YhOyerOuKlCDquLDrs7jqsJIgMOycvOuhnCDshKTsoJUgKOyLpOygnCBkaW1lbnNpb25z64qUIGdldE1pZ3JhdGlvblNldEZyb21EQuyXkOyEnCDrs4Trj4Qg7L+866as66GcIO2ZleyduClcbiAgICAgIHJldHVybiB7IHR5cGU6IGB2ZWN0b3Ike3NpbmdsZU9yQXJyYXl9YCwgZGltZW5zaW9uczogMCB9O1xuICAgIH1cblxuICAgIC8vIHRzdmVjdG9yIChQb3N0Z3JlU1FMIOyghOusuCDqsoDsg4nsmqkg7YOA7J6FKVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0c3ZlY3RvclwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRzdmVjdG9yXCIgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlc29sdmUg67aI6rCA64ql7ZWcIFBvc3RncmVTUUwg7Lus65+8IO2DgOyehTogJHt1ZHRfbmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciA9IG5ldyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJncm91cCIsIlBvc3RncmVTUUxTY2hlbWFSZWFkZXJDbGFzcyIsImdlbmVyaWNJbmRleFR5cGVzIiwiU2V0IiwiZ2V0TWlncmF0aW9uU2V0RnJvbURCIiwiY29tcGFyZURCIiwidGFibGUiLCJkYkNvbHVtbnMiLCJkYkluZGV4ZXMiLCJkYkZvcmVpZ25zIiwicmVhZFRhYmxlIiwiZSIsIkVycm9yIiwibWVzc2FnZSIsImluY2x1ZGVzIiwiY29uc29sZSIsImVycm9yIiwidmVjdG9yRGltZW5zaW9ucyIsImdldFZlY3RvckRpbWVuc2lvbnMiLCJjb2x1bW5zIiwibWFwIiwiZGJDb2x1bW4iLCJkYkNvbFR5cGUiLCJyZXNvbHZlREJDb2xUeXBlIiwidHlwZSIsImRpbWVuc2lvbnMiLCJjb2x1bW5fbmFtZSIsIm5hbWUiLCJudWxsYWJsZSIsImlzX251bGxhYmxlIiwiaXNfZ2VuZXJhdGVkIiwiZ2VuZXJhdGVkIiwiZXhwcmVzc2lvbiIsImdlbmVyYXRpb25fZXhwcmVzc2lvbiIsImNvbHVtbl9kZWZhdWx0IiwiZGVmYXVsdFZhbHVlIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJlbmRzV2l0aCIsInJlcGxhY2VBbGwiLCJkZWZhdWx0VG8iLCJkYkluZGV4ZXNHcm91cCIsImZpbHRlciIsImRiSW5kZXgiLCJpc19wcmltYXJ5IiwiZmluZCIsImRiRm9yZWlnbiIsImluZGV4X25hbWUiLCJjb25zdHJhaW50X25hbWUiLCJpbmRleGVzIiwiT2JqZWN0Iiwia2V5cyIsImluZGV4TmFtZSIsImN1cnJlbnRJbmRleGVzIiwidG9Tb3J0ZWQiLCJsZWZ0IiwicmlnaHQiLCJjb2x1bW5fb3JkZXIiLCJmaXJzdEluZGV4IiwicGFyc2VkSW5kZXhEZWZpbml0aW9uIiwicGFyc2VJbmRleERlZmluaXRpb24iLCJpbmRleF9kZWZpbml0aW9uIiwicmVzdG9yZWRJbmRleFR5cGUiLCJyZXN0b3JlTWlncmF0aW9uSW5kZXhUeXBlIiwiYWNjZXNzTWV0aG9kIiwidXNpbmciLCJyZXN0b3JlR2VuZXJpY1VzaW5nIiwiaW5kZXhfdHlwZSIsImlkeCIsImV4dHJhY3RJbmRleENvbHVtbk9wY2xhc3MiLCJjb2x1bW5EZWZpbml0aW9ucyIsIm9wY2xhc3MiLCJzb3J0T3JkZXIiLCJzb3J0X29yZGVyIiwibnVsbHNGaXJzdCIsIm51bGxzX2ZpcnN0IiwibnVsbHNOb3REaXN0aW5jdCIsIm51bGxzX25vdF9kaXN0aW5jdCIsInBhcnNlVmVjdG9ySW5kZXhPcHRpb25zIiwid2l0aE9wdGlvbnMiLCJmb3JlaWducyIsInRvIiwiZm9yZWlnbl90YWJsZV9uYW1lIiwiZm9yZWlnbl9jb2x1bW5fbmFtZSIsIm9uVXBkYXRlIiwibWFwQ29uc3RyYWludEFjdGlvbiIsInVwZGF0ZV9ydWxlIiwib25EZWxldGUiLCJkZWxldGVfcnVsZSIsImFjdGlvbiIsImFjdGlvbk1hcCIsIlJFU1RSSUNUIiwiQ0FTQ0FERSIsInRhYmxlTmFtZSIsImNvbHVtbnNRdWVyeSIsInJhdyIsInJvd3MiLCJsZW5ndGgiLCJpbmRleGVzUXVlcnkiLCJmb3JlaWduc1F1ZXJ5IiwiaW5kZXgiLCJyZXNvbHZlZEFjY2Vzc01ldGhvZCIsInRvTG93ZXJDYXNlIiwiaXNfdW5pcXVlIiwidW5kZWZpbmVkIiwibm9ybWFsaXplZCIsImhhcyIsInBhcnNlSW50ZWdlck9wdGlvbiIsIm0iLCJlZl9jb25zdHJ1Y3Rpb24iLCJlZkNvbnN0cnVjdGlvbiIsImxpc3RzIiwidmFsdWUiLCJwYXJzZWQiLCJOdW1iZXIiLCJwYXJzZUludCIsImlzTmFOIiwiY29sdW1uRGVmaW5pdGlvbiIsInRyaW1tZWQiLCJ0cmltIiwidG9rZW5zIiwidG9rZW5pemVUb3BMZXZlbCIsInRvVXBwZXJDYXNlIiwiYXQiLCJpbmRleERlZmluaXRpb24iLCJtYXRjaCIsInVzaW5nTWF0Y2hJbmRleCIsInNlYXJjaCIsImNvbHVtbnNTdGFydCIsImluZGV4T2YiLCJjb2x1bW5zRW5kIiwiZmluZE1hdGNoaW5nUGFyZW50aGVzaXMiLCJzcGxpdFRvcExldmVsIiwic2xpY2UiLCJ3aXRoTWF0Y2giLCJleGVjIiwid2l0aFN0YXJ0Iiwid2l0aEVuZCIsInBhcnNlSW5kZXhPcHRpb25FbnRyaWVzIiwib3B0aW9uU291cmNlIiwicmVkdWNlIiwicmVzdWx0IiwiZW50cnkiLCJtYXRjaGVkIiwia2V5IiwicmF3VmFsdWUiLCJzb3VyY2UiLCJkZWxpbWl0ZXIiLCJpdGVtcyIsInN0YXJ0IiwicGFyZW5EZXB0aCIsImJyYWNrZXREZXB0aCIsImluU2luZ2xlUXVvdGUiLCJpbkRvdWJsZVF1b3RlIiwiY2hhciIsIm5leHRDaGFyIiwicHVzaCIsInRhaWwiLCJwdXNoVG9rZW4iLCJlbmRJbmRleCIsInRva2VuIiwidGVzdCIsIm9wZW5JbmRleCIsImRlcHRoIiwiZ2V0UmVmZXJlbmNpbmdGb3JlaWduS2V5cyIsImRiIiwicXVlcnkiLCJyb3ciLCJ0YWJsZV9uYW1lIiwiY29uc3RyYWludE5hbWUiLCJjb2x1bW5OYW1lIiwicmVmZXJlbmNlZFRhYmxlTmFtZSIsInJlZmVyZW5jZWRfdGFibGVfbmFtZSIsInJlZmVyZW5jZWRDb2x1bW5OYW1lIiwicmVmZXJlbmNlZF9jb2x1bW5fbmFtZSIsInVkdF9uYW1lIiwiX3VkdF9uYW1lIiwiY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoIiwicHJlY2lzaW9uIiwibnVtZXJpY19zY2FsZSIsInNpbmdsZU9yQXJyYXkiLCJzdWJzdHJpbmciLCJudW1iZXJUeXBlIiwic2NhbGUiLCJQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFFNUIsU0FBU0MsS0FBSyxRQUFRLFVBQVU7QUFtRWhDLE1BQU1DO0lBQ2FDLG9CQUFvQixJQUFJQyxJQUFJO1FBQUM7UUFBUztRQUFRO1FBQU87UUFBUTtLQUFXLEVBQUU7SUFFM0Y7Ozs7O0dBS0MsR0FDRCxNQUFNQyxzQkFDSkMsU0FBeUIsRUFDekJDLEtBQWEsRUFDaUI7UUFDOUIsSUFBSUMsV0FBdUJDLFdBQXNCQztRQUNqRCxJQUFJO1lBQ0YsQ0FBQ0YsV0FBV0MsV0FBV0MsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDQyxTQUFTLENBQUNMLFdBQVdDO1FBQ3ZFLEVBQUUsT0FBT0ssR0FBWTtZQUNuQixJQUFJQSxhQUFhQyxTQUFTRCxFQUFFRSxPQUFPLENBQUNDLFFBQVEsQ0FBQyxvQkFBb0I7Z0JBQy9ELE9BQU87WUFDVDtZQUNBQyxRQUFRQyxLQUFLLENBQUNMO1lBQ2QsT0FBTztRQUNUO1FBRUEsMkJBQTJCO1FBQzNCLE1BQU1NLG1CQUFtQixNQUFNLElBQUksQ0FBQ0MsbUJBQW1CLENBQUNiLFdBQVdDO1FBRW5FLE1BQU1hLFVBQTZCWixVQUFVYSxHQUFHLENBQUMsQ0FBQ0M7WUFDaEQsTUFBTUMsWUFBWSxJQUFJLENBQUNDLGdCQUFnQixDQUFDRjtZQUV4Qyw4QkFBOEI7WUFDOUIs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
|
package/dist/stream/sse.js
CHANGED
|
@@ -15,9 +15,11 @@ class SSEConnectionImpl {
|
|
|
15
15
|
constructor(socket, reply){
|
|
16
16
|
this.socket = socket;
|
|
17
17
|
this.reply = reply;
|
|
18
|
-
|
|
18
|
+
const markClosed = ()=>{
|
|
19
19
|
this._closed = true;
|
|
20
|
-
}
|
|
20
|
+
};
|
|
21
|
+
this.socket.on("close", markClosed);
|
|
22
|
+
this.socket.on("error", markClosed);
|
|
21
23
|
}
|
|
22
24
|
publish(event, data) {
|
|
23
25
|
if (this._closed) {
|
|
@@ -42,4 +44,4 @@ class SSEConnectionImpl {
|
|
|
42
44
|
}
|
|
43
45
|
}
|
|
44
46
|
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vc3NlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmFzdGlmeVJlcGx5LCBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8vIE5PVEUoSGF6ZSwgMjUxMTA2KTogY29udGV4dCBwcm92aWRlcuyXkOyEnCDsnbjsnpDrpbwg7LGE7JuM7KO866m0IGNyZWF0ZVNTRShldmVudHMp66eM7Jy866GcIOyCrOyaqSDqsIDriqVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTU0VGYWN0b3J5PFQgZXh0ZW5kcyB6LlpvZE9iamVjdD4oXG4gIHNvY2tldDogRmFzdGlmeVJlcXVlc3RbXCJzb2NrZXRcIl0sXG4gIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gIF9ldmVudHM6IFQsXG4pOiBTU0VDb25uZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIG5ldyBTU0VDb25uZWN0aW9uSW1wbDxUPihzb2NrZXQsIHJlcGx5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tTU0VGYWN0b3J5PFQgZXh0ZW5kcyB6LlpvZE9iamVjdD4oX2V2ZW50czogVCk6IFNTRUNvbm5lY3Rpb248VD4ge1xuICByZXR1cm4ge1xuICAgIHB1Ymxpc2g6IChfZXZlbnQsIF9kYXRhKSA9PiB7fSxcbiAgICBlbmQ6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNTRUNvbm5lY3Rpb248VCBleHRlbmRzIHouWm9kT2JqZWN0PiB7XG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIHouaW5mZXI8VD4+KGV2ZW50OiBLLCBkYXRhOiB6LmluZmVyPFQ+W0tdKTogdm9pZDtcbiAgZW5kKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmNsYXNzIFNTRUNvbm5lY3Rpb25JbXBsPFQgZXh0ZW5kcyB6LlpvZE9iamVjdD4gaW1wbGVtZW50cyBTU0VDb25uZWN0aW9uPFQ+
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vc3NlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmFzdGlmeVJlcGx5LCBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5cbi8vIE5PVEUoSGF6ZSwgMjUxMTA2KTogY29udGV4dCBwcm92aWRlcuyXkOyEnCDsnbjsnpDrpbwg7LGE7JuM7KO866m0IGNyZWF0ZVNTRShldmVudHMp66eM7Jy866GcIOyCrOyaqSDqsIDriqVcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTU0VGYWN0b3J5PFQgZXh0ZW5kcyB6LlpvZE9iamVjdD4oXG4gIHNvY2tldDogRmFzdGlmeVJlcXVlc3RbXCJzb2NrZXRcIl0sXG4gIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gIF9ldmVudHM6IFQsXG4pOiBTU0VDb25uZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIG5ldyBTU0VDb25uZWN0aW9uSW1wbDxUPihzb2NrZXQsIHJlcGx5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tTU0VGYWN0b3J5PFQgZXh0ZW5kcyB6LlpvZE9iamVjdD4oX2V2ZW50czogVCk6IFNTRUNvbm5lY3Rpb248VD4ge1xuICByZXR1cm4ge1xuICAgIHB1Ymxpc2g6IChfZXZlbnQsIF9kYXRhKSA9PiB7fSxcbiAgICBlbmQ6ICgpID0+IFByb21pc2UucmVzb2x2ZSgpLFxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNTRUNvbm5lY3Rpb248VCBleHRlbmRzIHouWm9kT2JqZWN0PiB7XG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIHouaW5mZXI8VD4+KGV2ZW50OiBLLCBkYXRhOiB6LmluZmVyPFQ+W0tdKTogdm9pZDtcbiAgZW5kKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmNsYXNzIFNTRUNvbm5lY3Rpb25JbXBsPFQgZXh0ZW5kcyB6LlpvZE9iamVjdD4gaW1wbGVtZW50cyBTU0VDb25uZWN0aW9uPFQ+IHtcbiAgcHJpdmF0ZSBfY2xvc2VkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb2NrZXQ6IEZhc3RpZnlSZXF1ZXN0W1wic29ja2V0XCJdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKSB7XG4gICAgY29uc3QgbWFya0Nsb3NlZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gICAgfTtcbiAgICB0aGlzLnNvY2tldC5vbihcImNsb3NlXCIsIG1hcmtDbG9zZWQpO1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgbWFya0Nsb3NlZCk7XG4gIH1cblxuICBwdWJsaXNoPEsgZXh0ZW5kcyBrZXlvZiB6LmluZmVyPFQ+PihldmVudDogSywgZGF0YTogei5pbmZlcjxUPltLXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlcGx5LnNzZSh7XG4gICAgICBldmVudDogZXZlbnQgYXMgc3RyaW5nLFxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG5cbiAgICB0aGlzLnJlcGx5LnNzZSh7XG4gICAgICBldmVudDogXCJlbmRcIixcbiAgICAgIGRhdGE6IFwiRU5EXCIsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICB0aGlzLnJlcGx5LnJhdy5lbmQoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZVNTRUZhY3RvcnkiLCJzb2NrZXQiLCJyZXBseSIsIl9ldmVudHMiLCJTU0VDb25uZWN0aW9uSW1wbCIsImNyZWF0ZU1vY2tTU0VGYWN0b3J5IiwicHVibGlzaCIsIl9ldmVudCIsIl9kYXRhIiwiZW5kIiwiUHJvbWlzZSIsInJlc29sdmUiLCJfY2xvc2VkIiwibWFya0Nsb3NlZCIsIm9uIiwiZXZlbnQiLCJkYXRhIiwic3NlIiwiSlNPTiIsInN0cmluZ2lmeSIsInNldFRpbWVvdXQiLCJyYXciXSwibWFwcGluZ3MiOiJBQUdBLDZFQUE2RTtBQUM3RSxPQUFPLFNBQVNBLGlCQUNkQyxNQUFnQyxFQUNoQ0MsS0FBbUIsRUFDbkJDLE9BQVU7SUFFVixPQUFPLElBQUlDLGtCQUFxQkgsUUFBUUM7QUFDMUM7QUFFQSxPQUFPLFNBQVNHLHFCQUE0Q0YsT0FBVTtJQUNwRSxPQUFPO1FBQ0xHLFNBQVMsQ0FBQ0MsUUFBUUMsU0FBVztRQUM3QkMsS0FBSyxJQUFNQyxRQUFRQyxPQUFPO0lBQzVCO0FBQ0Y7QUFPQSxNQUFNUDs7O0lBQ0lRLFVBQVUsTUFBTTtJQUV4QixZQUNFLEFBQWlCWCxNQUFnQyxFQUNqRCxBQUFpQkMsS0FBbUIsQ0FDcEM7YUFGaUJELFNBQUFBO2FBQ0FDLFFBQUFBO1FBRWpCLE1BQU1XLGFBQWE7WUFDakIsSUFBSSxDQUFDRCxPQUFPLEdBQUc7UUFDakI7UUFDQSxJQUFJLENBQUNYLE1BQU0sQ0FBQ2EsRUFBRSxDQUFDLFNBQVNEO1FBQ3hCLElBQUksQ0FBQ1osTUFBTSxDQUFDYSxFQUFFLENBQUMsU0FBU0Q7SUFDMUI7SUFFQVAsUUFBb0NTLEtBQVEsRUFBRUMsSUFBbUIsRUFBUTtRQUN2RSxJQUFJLElBQUksQ0FBQ0osT0FBTyxFQUFFO1lBQ2hCO1FBQ0Y7UUFFQSxJQUFJLENBQUNWLEtBQUssQ0FBQ2UsR0FBRyxDQUFDO1lBQ2JGLE9BQU9BO1lBQ1BDLE1BQU1FLEtBQUtDLFNBQVMsQ0FBQ0g7UUFDdkI7SUFDRjtJQUVBLE1BQU1QLE1BQXFCO1FBQ3pCLElBQUksSUFBSSxDQUFDRyxPQUFPLEVBQUU7WUFDaEI7UUFDRjtRQUVBLElBQUksQ0FBQ0EsT0FBTyxHQUFHO1FBRWYsSUFBSSxDQUFDVixLQUFLLENBQUNlLEdBQUcsQ0FBQztZQUNiRixPQUFPO1lBQ1BDLE1BQU07UUFDUjtRQUVBLE1BQU0sSUFBSU4sUUFBUSxDQUFDQyxVQUFZUyxXQUFXVCxTQUFTO1FBQ25ELElBQUksQ0FBQ1QsS0FBSyxDQUFDbUIsR0FBRyxDQUFDWixHQUFHO0lBQ3BCO0FBQ0YifQ==
|