@rosen-bridge/config 1.1.0 → 2.0.0-eae8c5f0

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/config.js CHANGED
@@ -1,23 +1,56 @@
1
+ import config from 'config';
1
2
  import * as fs from 'fs';
2
3
  import * as yaml from 'js-yaml';
3
4
  import path from 'path';
5
+ import JsonBigInt, { JsonBigIntFactory } from '@rosen-bridge/json-bigint';
4
6
  import { propertyValidators, supportedTypes, } from './schema/Validators/fieldProperties';
5
- import { getSourceName, getValueFromConfigSources } from './utils';
7
+ import { getSourceName, getValueFromConfigSources, toPascalCase, } from './utils';
6
8
  import { valueValidations, valueValidators } from './value/validators';
7
- import JsonBigInt from '@rosen-bridge/json-bigint';
8
9
  export class ConfigValidator {
9
10
  schema;
10
11
  constructor(schema) {
11
12
  this.schema = schema;
12
13
  this.validateSchema();
13
14
  }
15
+ /**
16
+ * Builds and returns the final configuration object by transforming and validating
17
+ *
18
+ * T - The type of the final normalized configuration object.
19
+ * @returns {T} The normalized configuration object
20
+ */
21
+ buildConfigs = () => {
22
+ const raw = config.util.toObject();
23
+ this.validateConfig(raw);
24
+ return raw;
25
+ };
26
+ /**
27
+ * create ConfigValidator from schema file path
28
+ */
29
+ static fromFile = (schemaPath) => {
30
+ const rawSchemaData = fs.readFileSync(schemaPath, 'utf-8');
31
+ const jsonBigInt = JsonBigIntFactory({
32
+ alwaysParseAsBig: false,
33
+ useNativeBigInt: true,
34
+ });
35
+ const schema = jsonBigInt.parse(rawSchemaData);
36
+ return new ConfigValidator(schema);
37
+ };
38
+ /**
39
+ * create ConfigValidator from schema
40
+ *
41
+ * @param {ConfigSchema} schema
42
+ */
43
+ static fromSchema = (schema) => {
44
+ return new ConfigValidator(schema);
45
+ };
14
46
  /**
15
47
  * validates the passed config against the instance's schema
16
48
  *
17
49
  * @param {Record<string, any>} config
18
50
  */
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
52
  validateConfig(config) {
20
- this.validateValue(config, { type: 'object', children: this.schema }, config);
53
+ this.validateValue(config, { type: 'object', children: this.schema }, config, []);
21
54
  this.validateSubConfig(config, config, this.schema, []);
22
55
  }
23
56
  /**
@@ -30,7 +63,11 @@ export class ConfigValidator {
30
63
  * @param {string[]} path
31
64
  * @memberof ConfigValidator
32
65
  */
33
- validateSubConfig(config, subConfig, subSchema, path) {
66
+ validateSubConfig(
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ config,
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ subConfig, subSchema, path) {
34
71
  const errorPreamble = (path) => `config validation failed for "${path.join('.')}" field`;
35
72
  for (const name of Object.keys(subSchema)) {
36
73
  const childPath = path.concat([name]);
@@ -40,7 +77,7 @@ export class ConfigValidator {
40
77
  if (subConfig != undefined && Object.hasOwn(subConfig, name)) {
41
78
  value = subConfig[name];
42
79
  }
43
- this.validateValue(value, field, config);
80
+ this.validateValue(value, field, config, childPath);
44
81
  // if a node/field is of type object and thus is a subtree, traverse it
45
82
  if (field.type === 'object') {
46
83
  this.validateSubConfig(config, value, field.children, childPath);
@@ -54,9 +91,44 @@ export class ConfigValidator {
54
91
  }
55
92
  }
56
93
  }
94
+ else if (field.type === 'union') {
95
+ let isMatched = false;
96
+ let errorMessage = '';
97
+ for (const activeField of field.children) {
98
+ try {
99
+ if (activeField.type === 'object' &&
100
+ typeof value === 'object' &&
101
+ value != null) {
102
+ this.validateSubConfig(config, { [name]: value }, { [name]: activeField }, childPath);
103
+ isMatched = true;
104
+ }
105
+ else if (activeField.type === 'array' && Array.isArray(value)) {
106
+ for (const item of value) {
107
+ ConfigValidator.modifyObject(config, item, childPath);
108
+ this.validateSubConfig(config, { [name]: item }, { [name]: activeField.items }, childPath);
109
+ ConfigValidator.modifyObject(config, value, childPath);
110
+ isMatched = true;
111
+ }
112
+ }
113
+ else {
114
+ this.validateValue(value, activeField, config, childPath);
115
+ isMatched = true;
116
+ }
117
+ if (isMatched)
118
+ break;
119
+ }
120
+ catch (e) {
121
+ errorMessage = `${e instanceof Error ? e.message : e}`;
122
+ isMatched = isMatched === true;
123
+ }
124
+ }
125
+ if (!isMatched) {
126
+ throw new Error(`Value for "${childPath.join('.')}" does not match any of the union types for this error: ${errorMessage}. Please provide a valid value.`);
127
+ }
128
+ }
57
129
  }
58
130
  catch (error) {
59
- throw new Error(`${errorPreamble(childPath)}: ${error.message}`);
131
+ throw new Error(`${errorPreamble(childPath)}: ${error instanceof Error ? error.message : error}`);
60
132
  }
61
133
  }
62
134
  }
@@ -70,7 +142,9 @@ export class ConfigValidator {
70
142
  * @return {*}
71
143
  * @memberof ConfigValidator
72
144
  */
73
- static modifyObject(obj, newValue, path) {
145
+ static modifyObject(
146
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
147
+ obj, newValue, path) {
74
148
  let value = obj;
75
149
  for (const key of path.slice(0, -1)) {
76
150
  if (value != undefined && Object.hasOwn(value, key)) {
@@ -93,18 +167,44 @@ export class ConfigValidator {
93
167
  * @param {ConfigField} field the field specification in schema
94
168
  * @param {Record<string, any>} config the config object
95
169
  */
96
- validateValue = (value, field, config) => {
170
+ validateValue = (
171
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
172
+ value, field,
173
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
174
+ config, path) => {
175
+ if (field.label) {
176
+ path = path.concat([field.label]);
177
+ }
97
178
  if (value != undefined) {
98
179
  if (field.type === 'bigint') {
99
- value = BigInt(value);
180
+ if (typeof value === 'number' &&
181
+ (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER)) {
182
+ throw new Error(`Field "${path.join('.')}" is declared as a BigInt, but a Number was provided with insufficient precision. Values exceeding 9007199254740991 must be supplied as a string to ensure accuracy.`);
183
+ }
184
+ try {
185
+ value = BigInt(value);
186
+ ConfigValidator.modifyObject(config, value, path);
187
+ }
188
+ catch {
189
+ throw new Error(`Cannot convert ${value} to a BigInt for field "${path.join('.')}"`);
190
+ }
100
191
  }
101
- else if (field.type === 'number' && value && !isNaN(value)) {
192
+ if (field.type === 'number') {
193
+ if (isNaN(Number(value))) {
194
+ throw new Error(`Field "${path.join('.')}" must be a valid number. Please provide a suitable format.`);
195
+ }
102
196
  value = Number(value);
197
+ if (value > Number.MAX_SAFE_INTEGER ||
198
+ value < Number.MIN_SAFE_INTEGER) {
199
+ throw new Error(`Value for "${path.join('.')}" is too large or too small. Please enter a valid number.`);
200
+ }
201
+ ConfigValidator.modifyObject(config, value, path);
103
202
  }
104
203
  valueValidators[field.type](value, field);
105
204
  }
106
205
  if (field.type !== 'object' &&
107
206
  field.type !== 'array' &&
207
+ field.type !== 'union' &&
108
208
  field.validations) {
109
209
  for (const validation of field.validations) {
110
210
  const name = Object.keys(validation).filter((key) => key !== 'when' && key !== 'error')[0];
@@ -130,6 +230,7 @@ export class ConfigValidator {
130
230
  * @param {Record<string, any>} config
131
231
  * @return {boolean}
132
232
  */
233
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
133
234
  isWhenTrue = (when, config) => {
134
235
  const pathParts = when.path.split('.');
135
236
  const value = ConfigValidator.valueAt(config, pathParts);
@@ -143,7 +244,9 @@ export class ConfigValidator {
143
244
  * @param {string[]} path
144
245
  * @return {*}
145
246
  */
247
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
248
  static valueAt = (config, path) => {
249
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
147
250
  let value = config;
148
251
  for (const key of path) {
149
252
  if (value != undefined && Object.hasOwn(value, key)) {
@@ -196,9 +299,17 @@ export class ConfigValidator {
196
299
  parentPath: path,
197
300
  });
198
301
  }
302
+ else if (field.type === 'union') {
303
+ field.children.forEach((unionChild, index) => {
304
+ stack.push({
305
+ subSchema: { [`${name}_union_${index}`]: unionChild },
306
+ parentPath: path,
307
+ });
308
+ });
309
+ }
199
310
  }
200
311
  catch (error) {
201
- throw new Error(`${errorPreamble(path)}: ${error.message}`);
312
+ throw new Error(`${errorPreamble(path)}: ${error instanceof Error ? error.message : error}`);
202
313
  }
203
314
  }
204
315
  }
@@ -221,8 +332,7 @@ export class ConfigValidator {
221
332
  validateSchemaField = (field) => {
222
333
  for (const key of Object.keys(field)) {
223
334
  if (!Object.hasOwn(propertyValidators.all, key) &&
224
- !(!['object', 'array'].includes(field.type) &&
225
- Object.hasOwn(propertyValidators.primitive, key)) &&
335
+ !Object.hasOwn(propertyValidators.primitive, key) &&
226
336
  !Object.hasOwn(propertyValidators[field.type], key)) {
227
337
  throw new Error(`schema field has unknown property "${key}"`);
228
338
  }
@@ -230,7 +340,9 @@ export class ConfigValidator {
230
340
  for (const validator of Object.values(propertyValidators.all)) {
231
341
  validator(field, this);
232
342
  }
233
- if (field.type !== 'object' && field.type !== 'array') {
343
+ if (field.type !== 'object' &&
344
+ field.type !== 'array' &&
345
+ field.type !== 'union') {
234
346
  for (const validator of Object.values(propertyValidators.primitive)) {
235
347
  validator(field, this);
236
348
  }
@@ -251,14 +363,30 @@ export class ConfigValidator {
251
363
  for (const part of path) {
252
364
  if (subTree != undefined && Object.hasOwn(subTree, part)) {
253
365
  field = subTree[part];
254
- subTree =
255
- 'children' in field
256
- ? field.children
257
- : 'items' in field && 'children' in field.items
258
- ? field.items.children
259
- : undefined;
366
+ if (field.type === 'object') {
367
+ subTree = field.children;
368
+ }
369
+ else if (field.type === 'array' && field.items.type === 'object') {
370
+ subTree = field.items.children;
371
+ }
372
+ else if (field.type === 'union') {
373
+ subTree = undefined;
374
+ }
375
+ else {
376
+ subTree = undefined;
377
+ }
260
378
  }
261
379
  else {
380
+ if (field?.type === 'union') {
381
+ for (const child of field.children) {
382
+ if (child.type === 'object' &&
383
+ Object.hasOwn(child.children, part)) {
384
+ field = child.children[part];
385
+ subTree = field.type === 'object' ? field.children : undefined;
386
+ return field;
387
+ }
388
+ }
389
+ }
262
390
  return undefined;
263
391
  }
264
392
  }
@@ -269,6 +397,7 @@ export class ConfigValidator {
269
397
  *
270
398
  * @return {Record<string, any>} object of default values
271
399
  */
400
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
272
401
  generateDefault = (options) => {
273
402
  const valueTree = this.buildDefaultsForSchema(this.schema);
274
403
  if (options?.validate) {
@@ -278,6 +407,7 @@ export class ConfigValidator {
278
407
  };
279
408
  // Builds default values for a schema subtree (objects and arrays), recursively
280
409
  buildDefaultsForSchema = (schema) => {
410
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
281
411
  const defaults = Object.create(null);
282
412
  for (const key of Object.keys(schema)) {
283
413
  const field = schema[key];
@@ -305,6 +435,30 @@ export class ConfigValidator {
305
435
  }
306
436
  }
307
437
  }
438
+ else if (field.type === 'union') {
439
+ for (const option of field.children) {
440
+ if (option.type === 'object') {
441
+ const obj = this.buildDefaultsForSchema(option.children);
442
+ if (Object.keys(obj).length > 0) {
443
+ defaults[key] = obj;
444
+ break;
445
+ }
446
+ }
447
+ else if (option.type === 'array' && option.items.type == 'object') {
448
+ const obj = this.buildDefaultsForSchema(option.items.children);
449
+ if (Object.keys(obj).length > 0) {
450
+ defaults[key] = obj;
451
+ break;
452
+ }
453
+ }
454
+ else if (option.type != 'union') {
455
+ if (option.default) {
456
+ defaults[key] = option.default;
457
+ break;
458
+ }
459
+ }
460
+ }
461
+ }
308
462
  else {
309
463
  if (field.default != undefined) {
310
464
  defaults[key] = field.default;
@@ -320,7 +474,6 @@ export class ConfigValidator {
320
474
  * @return {string}
321
475
  */
322
476
  generateTSTypes = (name) => {
323
- const errorPreamble = (path) => `TypeScript type generation failed for "${path.join('.')}" field`;
324
477
  const types = [];
325
478
  const emittedTypeNames = new Set();
326
479
  const stack = [
@@ -332,72 +485,111 @@ export class ConfigValidator {
332
485
  attributes: [],
333
486
  },
334
487
  ];
335
- // Traverses the schema object tree depth first
336
488
  while (stack.length > 0) {
337
- const { subSchema, children, parentPath, typeName, attributes } = stack.at(-1);
338
- let path = parentPath;
339
- try {
340
- // if a subtree's processing is finished go to the previous level
341
- if (children.length == 0) {
342
- if (!emittedTypeNames.has(typeName)) {
343
- types.push(this.genTSInterface(typeName, attributes));
344
- emittedTypeNames.add(typeName);
345
- }
346
- stack.pop();
347
- continue;
489
+ const current = stack[stack.length - 1];
490
+ const { subSchema, children, parentPath, typeName, attributes } = current;
491
+ if (children.length === 0) {
492
+ if (!emittedTypeNames.has(typeName)) {
493
+ types.push(this.genTSInterface(typeName, attributes));
494
+ emittedTypeNames.add(typeName);
348
495
  }
349
- const childName = children.pop();
350
- path = parentPath.concat([childName]);
351
- const field = subSchema[childName];
352
- // if a node/field is of type object and thus is a subtree, add it to
353
- // the stack to be traversed later. Otherwise it's a leaf and needs no
354
- // traversal.
355
- if (field.type === 'object' ||
356
- (field.type === 'array' && field.items.type === 'object')) {
357
- // Create unique type name from schema path excluding root interface name
358
- const pathParts = path;
359
- const childTypeName = pathParts
360
- .map((part) => part[0].toUpperCase() + part.substring(1))
361
- .join('');
362
- const children = field.type === 'array' && field.items.type === 'object'
363
- ? field.items.children
364
- : field.type === 'object'
365
- ? field.children
366
- : {};
496
+ stack.pop();
497
+ continue;
498
+ }
499
+ const childName = children.pop();
500
+ const field = subSchema[childName];
501
+ const path = parentPath.concat(childName);
502
+ const childNameQuoted = childName.includes('-')
503
+ ? `"${childName}"`
504
+ : childName;
505
+ if (field.type === 'union') {
506
+ const unionTypes = [];
507
+ field.children.forEach((child, index) => {
508
+ if (child.type === 'object') {
509
+ const typeName = path
510
+ .concat([`Option${index}`])
511
+ .map(toPascalCase)
512
+ .join('');
513
+ stack.push({
514
+ subSchema: child.children,
515
+ children: Object.keys(child.children).reverse(),
516
+ parentPath: path,
517
+ typeName,
518
+ attributes: [],
519
+ });
520
+ unionTypes.push(typeName);
521
+ return;
522
+ }
523
+ if (child.type === 'array') {
524
+ if (child.items.type === 'object') {
525
+ const typeName = path
526
+ .concat([`Item${index}`])
527
+ .map(toPascalCase)
528
+ .join('');
529
+ stack.push({
530
+ subSchema: child.items.children,
531
+ children: Object.keys(child.items.children).reverse(),
532
+ parentPath: path,
533
+ typeName,
534
+ attributes: [],
535
+ });
536
+ unionTypes.push(`${typeName}[]`);
537
+ }
538
+ else {
539
+ unionTypes.push(`${child.items.type}[]`);
540
+ }
541
+ return;
542
+ }
543
+ unionTypes.push(child.type);
544
+ });
545
+ attributes.push([childNameQuoted, unionTypes.join(' | ')]);
546
+ continue;
547
+ }
548
+ if (field.type === 'object') {
549
+ const typeName = path.map(toPascalCase).join('');
550
+ stack.push({
551
+ subSchema: field.children,
552
+ children: Object.keys(field.children).reverse(),
553
+ parentPath: path,
554
+ typeName,
555
+ attributes: [],
556
+ });
557
+ attributes.push([childNameQuoted, typeName]);
558
+ continue;
559
+ }
560
+ if (field.type === 'array') {
561
+ if (field.items.type === 'object') {
562
+ const typeName = path.map(toPascalCase).join('');
367
563
  stack.push({
368
- subSchema: children,
369
- children: Object.keys(children).reverse(),
564
+ subSchema: field.items.children,
565
+ children: Object.keys(field.items.children).reverse(),
370
566
  parentPath: path,
371
- typeName: childTypeName,
567
+ typeName,
372
568
  attributes: [],
373
569
  });
374
- attributes.push([
375
- childName,
376
- field.type === 'array' ? `${childTypeName}[]` : childTypeName,
377
- ]);
570
+ attributes.push([childNameQuoted, `${typeName}[]`]);
378
571
  }
379
572
  else {
380
- let fieldType = field.type === 'array' ? field.items.type : field.type;
381
- let isOptional = true;
382
- if (field.type !== 'array' && field.validations != undefined) {
383
- for (const validation of field.validations) {
384
- if (field.type === 'string' && 'choices' in validation) {
385
- fieldType = validation.choices.map((c) => `'${c}'`).join(' | ');
386
- }
387
- if ('required' in validation && !('when' in validation)) {
388
- isOptional = false;
389
- }
390
- }
391
- }
392
- attributes.push([
393
- isOptional ? `${childName}?` : childName,
394
- field.type === 'array' ? `${fieldType}[]` : fieldType,
395
- ]);
573
+ attributes.push([childNameQuoted, `${field.items.type}[]`]);
396
574
  }
575
+ continue;
397
576
  }
398
- catch (error) {
399
- throw new Error(`${errorPreamble(path)}: ${error.message}`);
577
+ let fieldType = field.type;
578
+ let isOptional = true;
579
+ if (field.validations) {
580
+ for (const validation of field.validations) {
581
+ if (field.type === 'string' && 'choices' in validation) {
582
+ fieldType = validation.choices.map((c) => `'${c}'`).join(' | ');
583
+ }
584
+ if ('required' in validation && !('when' in validation)) {
585
+ isOptional = false;
586
+ }
587
+ }
400
588
  }
589
+ attributes.push([
590
+ isOptional ? `${childNameQuoted}?` : childNameQuoted,
591
+ fieldType,
592
+ ]);
401
593
  }
402
594
  return types.reverse().join('\n\n') + '\n';
403
595
  };
@@ -420,6 +612,7 @@ export class ConfigValidator {
420
612
  * @param {string} level
421
613
  * @return {Record<string, any>}
422
614
  */
615
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
423
616
  getConfigForLevel(config, level) {
424
617
  const confLevels = ConfigValidator.getNodeConfigLevels(config);
425
618
  const levelIndex = confLevels.indexOf(level);
@@ -541,7 +734,9 @@ export class ConfigValidator {
541
734
  * @param {string} level output node-config file level
542
735
  * @param {string} format the format of the output file
543
736
  */
544
- validateAndWriteConfig = (configObj, config, level, format) => {
737
+ validateAndWriteConfig = (
738
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
739
+ configObj, config, level, format) => {
545
740
  const confLevels = ConfigValidator.getNodeConfigLevels(config).filter((l) => l !== 'custom-environment-variables');
546
741
  const levelIndex = confLevels.indexOf(level);
547
742
  if (levelIndex === -1) {
@@ -587,4 +782,4 @@ export class ConfigValidator {
587
782
  }
588
783
  };
589
784
  }
590
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSxxQ0FBcUMsQ0FBQztBQUc3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RSxPQUFPLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUVuRCxNQUFNLE9BQU8sZUFBZTtJQUNOO0lBQXBCLFlBQW9CLE1BQW9CO1FBQXBCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDdEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksY0FBYyxDQUFDLE1BQTJCO1FBQy9DLElBQUksQ0FBQyxhQUFhLENBQ2hCLE1BQU0sRUFDTixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFDekMsTUFBTSxDQUNQLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxpQkFBaUIsQ0FDdkIsTUFBMkIsRUFDM0IsU0FBOEIsRUFDOUIsU0FBdUIsRUFDdkIsSUFBYztRQUVkLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBbUIsRUFBRSxFQUFFLENBQzVDLGlDQUFpQyxJQUFJLENBQUMsSUFBSSxD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LElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxLQUFLLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRSxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXJDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFckQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbmZpZywgSUNvbmZpZ1NvdXJjZSB9IGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBwcm9wZXJ0eVZhbGlkYXRvcnMsXG4gIHN1cHBvcnRlZFR5cGVzLFxufSBmcm9tICcuL3NjaGVtYS9WYWxpZGF0b3JzL2ZpZWxkUHJvcGVydGllcyc7XG5pbXBvcnQgeyBDb25maWdGaWVsZCwgQ29uZmlnU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEvdHlwZXMvZmllbGRzJztcbmltcG9ydCB7IFdoZW4gfSBmcm9tICcuL3NjaGVtYS90eXBlcy92YWxpZGF0aW9ucyc7XG5pbXBvcnQgeyBnZXRTb3VyY2VOYW1lLCBnZXRWYWx1ZUZyb21Db25maWdTb3VyY2VzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyB2YWx1ZVZhbGlkYXRpb25zLCB2YWx1ZVZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbHVlL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IEpzb25CaWdJbnQgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNjaGVtYTogQ29uZmlnU2NoZW1hKSB7XG4gICAgdGhpcy52YWxpZGF0ZVNjaGVtYSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyB0aGUgcGFzc2VkIGNvbmZpZyBhZ2FpbnN0IHRoZSBpbnN0YW5jZSdzIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHsgdHlwZTogJ29iamVjdCcsIGNoaWxkcmVuOiB0aGlzLnNjaGVtYSB9LFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgY29uZmlnLCB0aGlzLnNjaGVtYSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyYXZlcnNlcyBhbmQgdmFsaWRhdGVzIGEgc3ViY29uZmlnIHVzaW5nIHRoZSBzdWJzY2hlbWFcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzdWJDb25maWdcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHN1YlNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEBtZW1iZXJvZiBDb25maWdWYWxpZGF0b3JcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTdWJDb25maWcoXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHN1YkNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYGNvbmZpZyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKSkge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5jb25jYXQoW25hbWVdKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdWJDb25maWcgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24oc3ViQ29uZmlnLCBuYW1lKSkge1xuICAgICAgICAgIHZhbHVlID0gc3ViQ29uZmlnW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWxpZGF0ZVZhbHVlKHZhbHVlLCBmaWVsZCwgY29uZmlnKTtcblxuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCB0cmF2ZXJzZSBpdFxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgdmFsdWUsIGZpZWxkLmNoaWxkcmVuLCBjaGlsZFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgaXRlbSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgeyBbbmFtZV06IGl0ZW0gfSxcbiAgICAgICAgICAgICAgICB7IFtuYW1lXTogZmllbGQuaXRlbXMgfSxcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Vycm9yUHJlYW1ibGUoY2hpbGRQYXRoKX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2V0cyBhbiBvYmplY3QncyBzcGVjaWZpYyBzdWJ0cmVlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICAgKiBAcGFyYW0geyp9IG5ld1ZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHJldHVybiB7Kn1cbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgc3RhdGljIG1vZGlmeU9iamVjdChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5ld1ZhbHVlOiBhbnksIHBhdGg6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHZhbHVlOiBhbnkgPSBvYmo7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcGF0aC5zbGljZSgwLCAtMSkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEtleSA9IHBhdGguYXQoLTEpO1xuICAgIGlmIChsYXN0S2V5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWVbbGFzdEtleV0gPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdmFsaWRhdGVzIGEgdmFsdWUgaW4gY29uZmlnIG9iamVjdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Q29uZmlnRmllbGR9IGZpZWxkIHRoZSBmaWVsZCBzcGVjaWZpY2F0aW9uIGluIHNjaGVtYVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZyB0aGUgY29uZmlnIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZhbHVlID0gKFxuICAgIHZhbHVlOiBhbnksXG4gICAgZmllbGQ6IENvbmZpZ0ZpZWxkLFxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKSA9PiB7XG4gICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIHZhbHVlID0gQmlnSW50KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YWx1ZVZhbGlkYXRvcnNbZmllbGQudHlwZV0odmFsdWUsIGZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBmaWVsZC50eXBlICE9PSAnb2JqZWN0JyAmJlxuICAgICAgZmllbGQudHlwZSAhPT0gJ2FycmF5JyAmJlxuICAgICAgZmllbGQudmFsaWRhdGlvbnNcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmtleXModmFsaWRhdGlvbikuZmlsdGVyKFxuICAgICAgICAgIChrZXkpID0+IGtleSAhPT0gJ3doZW4nICYmIGtleSAhPT0gJ2Vycm9yJyxcbiAgICAgICAgKVswXTtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXSwgbmFtZSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWVWYWxpZGF0aW9uc1tmaWVsZC50eXBlXVtuYW1lXSh2YWx1ZSwgdmFsaWRhdGlvbiwgY29uZmlnLCB0aGlzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGlvbi5lcnJvciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHZhbGlkYXRpb24uZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBkZXRlcm1pbmVzIGlmIGEgd2hlbiBjbGF1c2UgaW4gdmFsaWRhdGlvbnMgc2VjdGlvbiBvZiBhIHNjaGVtYSBmaWVsZCBpc1xuICAgKiBzYXRpc2ZpZWRcbiAgICpcbiAgICogQHBhcmFtIHtXaGVufSB3aGVuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBwdWJsaWMgaXNXaGVuVHJ1ZSA9ICh3aGVuOiBXaGVuLCBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBwYXRoUGFydHMgPSB3aGVuLnBhdGguc3BsaXQoJy4nKTtcbiAgICBjb25zdCB2YWx1ZSA9IENvbmZpZ1ZhbGlkYXRvci52YWx1ZUF0KGNvbmZpZywgcGF0aFBhcnRzKTtcbiAgICByZXR1cm4gdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlID09PSB3aGVuLnZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIHRoZSB2YWx1ZSBhdCBzcGVjaWZpZWQgcGF0aCBpbiBjb25maWcgb2JqZWN0XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgc3RhdGljIHZhbHVlQXQgPSAoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmdbXSkgPT4ge1xuICAgIGxldCB2YWx1ZTogYW55ID0gY29uZmlnO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIHRoaXMuc2NoZW1hIGFuZCB0aHJvd3MgZXhjZXB0aW9uIGlmIGFueSBlcnJvcnMgZm91bmRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWEgPSAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYFNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcblxuICAgIGNvbnN0IHN0YWNrOiBBcnJheTx7XG4gICAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYTtcbiAgICAgIHBhcmVudFBhdGg6IEFycmF5PHN0cmluZz47XG4gICAgfT4gPSBbXG4gICAgICB7XG4gICAgICAgIHN1YlNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgIHBhcmVudFBhdGg6IFtdLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gVHJhdmVyc2VzIHRoZSBzY2hlbWEgb2JqZWN0IHRyZWUgZGVwdGggZmlyc3QgYW5kIHZhbGlkYXRlIGZpZWxkc1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IHN1YlNjaGVtYSwgcGFyZW50UGF0aCB9ID0gc3RhY2sucG9wKCkhO1xuXG4gICAgICAvLyBwcm9jZXNzIGNoaWxkcmVuIG9mIGN1cnJlbnQgb2JqZWN0IGZpZWxkXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcmVudFBhdGguY29uY2F0KFtuYW1lXSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZ05hbWUobmFtZSk7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbbmFtZV07XG5cbiAgICAgICAgICBpZiAoIU9iamVjdC5oYXNPd24oZmllbGQsICd0eXBlJykgfHwgdHlwZW9mIGZpZWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBldmVyeSBzY2hlbWEgZmllbGQgbXVzdCBoYXZlIGEgXCJ0eXBlXCIgcHJvcGVydHkgb2YgdHlwZSBcInN0cmluZ1wiYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhmaWVsZC50eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlIFwiJHtmaWVsZC50eXBlfVwiYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy52YWxpZGF0ZVNjaGVtYUZpZWxkKGZpZWxkKTtcblxuICAgICAgICAgIC8vIGlmIHRoZSBjaGlsZCBpcyBhbiBvYmplY3QgZmllbGQgaXRzZWxmIGFkZCBpdCB0byBzdGFjayBmb3JcbiAgICAgICAgICAvLyBwcm9jZXNzaW5nXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgc3ViU2NoZW1hOiBmaWVsZC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHN1YlNjaGVtYTogeyBbbmFtZV06IGZpZWxkLml0ZW1zIH0sXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JQcmVhbWJsZShwYXRoKX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIGNvbmZpZyBrZXkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ05hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb25maWcga2V5IG5hbWUgY2FuIG5vdCBjb250YWluIHRoZSAnLicgY2hhcmFjdGVyYCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgcGFzc2VkIHNjaGVtYSBmaWVsZCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWdGaWVsZH0gZmllbGRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWFGaWVsZCA9IChmaWVsZDogQ29uZmlnRmllbGQpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzLmFsbCwga2V5KSAmJlxuICAgICAgICAhKFxuICAgICAgICAgICFbJ29iamVjdCcsICdhcnJheSddLmluY2x1ZGVzKGZpZWxkLnR5cGUpICYmXG4gICAgICAgICAgT2JqZWN0Lmhhc093bihwcm9wZXJ0eVZhbGlkYXRvcnMucHJpbWl0aXZlLCBrZXkpXG4gICAgICAgICkgJiZcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzW2ZpZWxkLnR5cGVdLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzY2hlbWEgZmllbGQgaGFzIHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIE9iamVjdC52YWx1ZXMocHJvcGVydHlWYWxpZGF0b3JzLmFsbCkpIHtcbiAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkLnR5cGUgIT09ICdvYmplY3QnICYmIGZpZWxkLnR5cGUgIT09ICdhcnJheScpIHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIE9iamVjdC52YWx1ZXMocHJvcGVydHlWYWxpZGF0b3JzLnByaW1pdGl2ZSkpIHtcbiAgICAgICAgdmFsaWRhdG9yKGZpZWxkLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9yc1tmaWVsZC50eXBlXSkpIHtcbiAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgZmllbGQgY29ycmVzcG9uZGluZyB0byBhIHBhdGggaW4gc2NoZW1hIHRyZWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsoQ29uZmlnRmllbGQgfCB1bmRlZmluZWQpfSByZXR1cm5zIHVuZGVmaW5lZCBpZiBmaWVsZCBpcyBub3QgZm91bmRcbiAgICovXG4gIGdldFNjaGVtYUZpZWxkID0gKHBhdGg6IHN0cmluZ1tdKTogQ29uZmlnRmllbGQgfCB1bmRlZmluZWQgPT4ge1xuICAgIGxldCBzdWJUcmVlOiBDb25maWdTY2hlbWEgfCB1bmRlZmluZWQgPSB0aGlzLnNjaGVtYTtcbiAgICBsZXQgZmllbGQ6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoKSB7XG4gICAgICBpZiAoc3ViVHJlZSAhPSB1bmRlZmluZWQgJiYgT2JqZWN0Lmhhc093bihzdWJUcmVlLCBwYXJ0KSkge1xuICAgICAgICBmaWVsZCA9IHN1YlRyZWVbcGFydF07XG4gICAgICAgIHN1YlRyZWUgPVxuICAgICAgICAgICdjaGlsZHJlbicgaW4gZmllbGRcbiAgICAgICAgICAgID8gZmllbGQuY2hpbGRyZW5cbiAgICAgICAgICAgIDogJ2l0ZW1zJyBpbiBmaWVsZCAmJiAnY2hpbGRyZW4nIGluIGZpZWxkLml0ZW1zXG4gICAgICAgICAgICAgID8gZmllbGQuaXRlbXMuY2hpbGRyZW5cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmllbGQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIGRlZmF1bHQgdmFsdWVzIGZyb20gYSBzY2hlbWFcbiAgICpcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqZWN0IG9mIGRlZmF1bHQgdmFsdWVzXG4gICAqL1xuICBnZW5lcmF0ZURlZmF1bHQgPSAob3B0aW9ucz86IHsgdmFsaWRhdGU/OiBib29sZWFuIH0pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICBjb25zdCB2YWx1ZVRyZWUgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEodGhpcy5zY2hlbWEpO1xuICAgIGlmIChvcHRpb25zPy52YWxpZGF0ZSkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbmZpZyh2YWx1ZVRyZWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVUcmVlO1xuICB9O1xuXG4gIC8vIEJ1aWxkcyBkZWZhdWx0IHZhbHVlcyBmb3IgYSBzY2hlbWEgc3VidHJlZSAob2JqZWN0cyBhbmQgYXJyYXlzKSwgcmVjdXJzaXZlbHlcbiAgcHJpdmF0ZSBidWlsZERlZmF1bHRzRm9yU2NoZW1hID0gKFxuICAgIHNjaGVtYTogQ29uZmlnU2NoZW1hLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICBjb25zdCBkZWZhdWx0czogUmVjb3JkPHN0cmluZywgYW55PiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hKSkge1xuICAgICAgY29uc3QgZmllbGQgPSBzY2hlbWFba2V5XTtcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBjaGlsZERlZmF1bHRzID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKGZpZWxkLmNoaWxkcmVuKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNoaWxkRGVmYXVsdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZWZhdWx0c1trZXldID0gY2hpbGREZWZhdWx0cztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmICgoZmllbGQgYXMgYW55KS5kZWZhdWx0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgaXRlbURlZmF1bHRzID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKFxuICAgICAgICAgICAgICBmaWVsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gKGZpZWxkIGFzIGFueSkuZGVmYXVsdC5tYXAoKGVsZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZWxlbSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGVsZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZWxlbSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbURlZmF1bHRzLCAuLi5lbGVtIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IChmaWVsZCBhcyBhbnkpLmRlZmF1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGZpZWxkIGFzIGFueSkuZGVmYXVsdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWZhdWx0c1trZXldID0gKGZpZWxkIGFzIGFueSkuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIGdlbmVyYXRlcyBjb21wYXRpYmxlIFR5cGVTY3JpcHQgaW50ZXJmYWNlIGZvciB0aGlzIGluc3RhbmNlJ3Mgc2NoZW1hXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHJvb3QgdHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZW5lcmF0ZVRTVHlwZXMgPSAobmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBlcnJvclByZWFtYmxlID0gKHBhdGg6IEFycmF5PHN0cmluZz4pID0+XG4gICAgICBgVHlwZVNjcmlwdCB0eXBlIGdlbmVyYXRpb24gZmFpbGVkIGZvciBcIiR7cGF0aC5qb2luKCcuJyl9XCIgZmllbGRgO1xuXG4gICAgY29uc3QgdHlwZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBlbWl0dGVkVHlwZU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PHtcbiAgICAgIHN1YlNjaGVtYTogQ29uZmlnU2NoZW1hO1xuICAgICAgY2hpbGRyZW46IHN0cmluZ1tdO1xuICAgICAgcGFyZW50UGF0aDogQXJyYXk8c3RyaW5nPjtcbiAgICAgIHR5cGVOYW1lOiBzdHJpbmc7XG4gICAgICBhdHRyaWJ1dGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPjtcbiAgICB9PiA9IFtcbiAgICAgIHtcbiAgICAgICAgc3ViU2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgcGFyZW50UGF0aDogW10sXG4gICAgICAgIHR5cGVOYW1lOiBuYW1lLFxuICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgc3ViU2NoZW1hLCBjaGlsZHJlbiwgcGFyZW50UGF0aCwgdHlwZU5hbWUsIGF0dHJpYnV0ZXMgfSA9XG4gICAgICAgIHN0YWNrLmF0KC0xKSE7XG4gICAgICBsZXQgcGF0aDogc3RyaW5nW10gPSBwYXJlbnRQYXRoO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaWYgYSBzdWJ0cmVlJ3MgcHJvY2Vzc2luZyBpcyBmaW5pc2hlZCBnbyB0byB0aGUgcHJldmlvdXMgbGV2ZWxcbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaWYgKCFlbWl0dGVkVHlwZU5hbWVzLmhhcyh0eXBlTmFtZSkpIHtcbiAgICAgICAgICAgIHR5cGVzLnB1c2godGhpcy5nZW5UU0ludGVyZmFjZSh0eXBlTmFtZSwgYXR0cmlidXRlcykpO1xuICAgICAgICAgICAgZW1pdHRlZFR5cGVOYW1lcy5hZGQodHlwZU5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZSA9IGNoaWxkcmVuLnBvcCgpITtcbiAgICAgICAgcGF0aCA9IHBhcmVudFBhdGguY29uY2F0KFtjaGlsZE5hbWVdKTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBzdWJTY2hlbWFbY2hpbGROYW1lXTtcblxuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCBhZGQgaXQgdG9cbiAgICAgICAgLy8gdGhlIHN0YWNrIHRvIGJlIHRyYXZlcnNlZCBsYXRlci4gT3RoZXJ3aXNlIGl0J3MgYSBsZWFmIGFuZCBuZWVkcyBub1xuICAgICAgICAvLyB0cmF2ZXJzYWwuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWVsZC50eXBlID09PSAnb2JqZWN0JyB8fFxuICAgICAgICAgIChmaWVsZC50eXBlID09PSAnYXJyYXknICYmIGZpZWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdW5pcXVlIHR5cGUgbmFtZSBmcm9tIHNjaGVtYSBwYXRoIGV4Y2x1ZGluZyByb290IGludGVyZmFjZSBuYW1lXG4gICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGF0aDtcbiAgICAgICAgICBjb25zdCBjaGlsZFR5cGVOYW1lID0gcGF0aFBhcnRzXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0WzBdLnRvVXBwZXJDYXNlKCkgKyBwYXJ0LnN1YnN0cmluZygxKSlcbiAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID1cbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdhcnJheScgJiYgZmllbGQuaXRlbXMudHlwZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBmaWVsZC5pdGVtcy5jaGlsZHJlblxuICAgICAgICAgICAgICA6IGZpZWxkLnR5cGUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyBmaWVsZC5jaGlsZHJlblxuICAgICAgICAgICAgICAgIDoge307XG5cbiAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHN1YlNjaGVtYTogY2hpbGRyZW4sXG4gICAgICAgICAgICBjaGlsZHJlbjogT2JqZWN0LmtleXMoY2hpbGRyZW4pLnJldmVyc2UoKSxcbiAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB0eXBlTmFtZTogY2hpbGRUeXBlTmFtZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXR0cmlidXRlcy5wdXNoKFtcbiAgICAgICAgICAgIGNoaWxkTmFtZSxcbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdhcnJheScgPyBgJHtjaGlsZFR5cGVOYW1lfVtdYCA6IGNoaWxkVHlwZU5hbWUsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGZpZWxkVHlwZTogc3RyaW5nID1cbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdhcnJheScgPyBmaWVsZC5pdGVtcy50eXBlIDogZmllbGQudHlwZTtcbiAgICAgICAgICBsZXQgaXNPcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUgIT09ICdhcnJheScgJiYgZmllbGQudmFsaWRhdGlvbnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb24gb2YgZmllbGQudmFsaWRhdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdHJpbmcnICYmICdjaG9pY2VzJyBpbiB2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgZmllbGRUeXBlID0gdmFsaWRhdGlvbi5jaG9pY2VzLm1hcCgoYykgPT4gYCcke2N9J2ApLmpvaW4oJyB8ICcpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCdyZXF1aXJlZCcgaW4gdmFsaWRhdGlvbiAmJiAhKCd3aGVuJyBpbiB2YWxpZGF0aW9uKSkge1xuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW1xuICAgICAgICAgICAgaXNPcHRpb25hbCA/IGAke2NoaWxkTmFtZX0/YCA6IGNoaWxkTmFtZSxcbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdhcnJheScgPyBgJHtmaWVsZFR5cGV9W11gIDogZmllbGRUeXBlLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvclByZWFtYmxlKHBhdGgpfTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0eXBlcy5yZXZlcnNlKCkuam9pbignXFxuXFxuJykgKyAnXFxuJztcbiAgfTtcblxuICAvKipcbiAgICogZ2VuZXJhdGVzIGEgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgcGFzc2VkIG5hbWUgYW5kIGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheTxbc3RyaW5nLCBzdHJpbmddPn0gYXR0cmlidXRlc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBwcml2YXRlIGdlblRTSW50ZXJmYWNlID0gKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhdHRyaWJ1dGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPixcbiAgKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gYGV4cG9ydCBpbnRlcmZhY2UgJHtuYW1lfSB7XG4gICR7YXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGAke2F0dHJbMF19OiAke2F0dHJbMV19O2ApLmpvaW4oJ1xcbiAgJyl9XG59YDtcbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIGNoYXJhY3RlcmlzdGljIG9iamVjdCBmb3IgdmFsdWVzIGF0IGEgc3BlY2lmaWMgbm9kZSBjb25maWcgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59XG4gICAqL1xuICBnZXRDb25maWdGb3JMZXZlbChjb25maWc6IElDb25maWcsIGxldmVsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBjb25mTGV2ZWxzID0gQ29uZmlnVmFsaWRhdG9yLmdldE5vZGVDb25maWdMZXZlbHMoY29uZmlnKTtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gY29uZkxldmVscy5pbmRleE9mKGxldmVsKTtcbiAgICBpZiAobGV2ZWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBcIiR7bGV2ZWx9XCIgbGV2ZWwgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IHN5c3RlbSBjb25maWd1cmF0aW9uIGxldmVsc2AsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBoaWdoZXJMZXZlbFNvdXJjZXMgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHNvdXJjZSkgPT4gY29uZkxldmVscy5pbmRleE9mKGdldFNvdXJjZU5hbWUoc291cmNlKSkgPiBsZXZlbEluZGV4LFxuICAgICAgKTtcbiAgICBjb25zdCBjdXJyZW50TGV2ZWxTb3VyY2UgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcigoc291cmNlKSA9PiBnZXRTb3VyY2VOYW1lKHNvdXJjZSkgPT09IGxldmVsKVxuICAgICAgLmF0KDApO1xuICAgIGNvbnN0IGxvd2VyTGV2ZWxTb3VyY2VzID0gY29uZmlnLnV0aWxcbiAgICAgIC5nZXRDb25maWdTb3VyY2VzKClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChzb3VyY2UpID0+IGNvbmZMZXZlbHMuaW5kZXhPZihnZXRTb3VyY2VOYW1lKHNvdXJjZSkpIDwgbGV2ZWxJbmRleCxcbiAgICAgICk7XG5cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIHNjaGVtYSBvYmplY3QgdHJlZSBkZXB0aCBmaXJzdFxuICAgIGNvbnN0IHZhbHVlVHJlZSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICBbXSxcbiAgICAgIGhpZ2hlckxldmVsU291cmNlcyxcbiAgICAgIGN1cnJlbnRMZXZlbFNvdXJjZSxcbiAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICk7XG5cbiAgICByZXR1cm4gdmFsdWVUcmVlO1xuICB9XG5cbiAgLyoqXG4gICAqdHJhdmVyc2VzIHRoZSBjb25maWcgc2NoZW1hIGRlcHRoIGZpcnN0IHRvIHByb2R1Y2UgY2hhcmFjdGVyaXN0aWMgb2JqZWN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEBwYXJhbSB7SUNvbmZpZ1NvdXJjZVtdfSBoaWdoZXJMZXZlbFNvdXJjZXNcbiAgICogQHBhcmFtIHsoSUNvbmZpZ1NvdXJjZSB8IHVuZGVmaW5lZCl9IGN1cnJlbnRMZXZlbFNvdXJjZVxuICAgKiBAcGFyYW0ge0lDb25maWdTb3VyY2VbXX0gbG93ZXJMZXZlbFNvdXJjZXNcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcHJvY2Vzc0NvbmZpZ0ZvckxldmVsTm9kZShcbiAgICBzY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBoaWdoZXJMZXZlbFNvdXJjZXM6IElDb25maWdTb3VyY2VbXSxcbiAgICBjdXJyZW50TGV2ZWxTb3VyY2U6IElDb25maWdTb3VyY2UgfCB1bmRlZmluZWQsXG4gICAgbG93ZXJMZXZlbFNvdXJjZXM6IElDb25maWdTb3VyY2VbXSxcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgdmFsdWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAoY29uc3QgY2hpbGROYW1lIG9mIE9iamVjdC5rZXlzKHNjaGVtYSkucmV2ZXJzZSgpKSB7XG4gICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoLmNvbmNhdChbY2hpbGROYW1lXSk7XG4gICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYVtjaGlsZE5hbWVdO1xuICAgICAgLy8gaWYgYSBmaWVsZCBpcyBvZiB0eXBlIG9iamVjdCBhbmQgdGh1cyBpcyBhIHN1YnRyZWUsIHJlY3Vyc2Ugb24gaXQuXG4gICAgICAvLyBPdGhlcndpc2UgaXQncyBhIGxlYWYgYW5kIG5lZWRzIG5vIHRyYXZlcnNhbC5cbiAgICAgIHZhbHVlW2NoaWxkTmFtZV0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV0gPSBDb25maWdWYWxpZGF0b3IucHJvY2Vzc0NvbmZpZ0ZvckxldmVsTm9kZShcbiAgICAgICAgICBmaWVsZC5jaGlsZHJlbixcbiAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgaGlnaGVyTGV2ZWxTb3VyY2VzLFxuICAgICAgICAgIGN1cnJlbnRMZXZlbFNvdXJjZSxcbiAgICAgICAgICBsb3dlckxldmVsU291cmNlcyxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ2xhYmVsJ10gPVxuICAgICAgICAgIGZpZWxkLmxhYmVsICE9IHVuZGVmaW5lZCA/IGZpZWxkLmxhYmVsIDogbnVsbDtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsnZGVzY3JpcHRpb24nXSA9XG4gICAgICAgICAgZmllbGQuZGVzY3JpcHRpb24gIT0gdW5kZWZpbmVkID8gZmllbGQuZGVzY3JpcHRpb24gOiBudWxsO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydkZWZhdWx0J10gPSBnZXRWYWx1ZUZyb21Db25maWdTb3VyY2VzKFxuICAgICAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgKTtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsndmFsdWUnXSA9IGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMoXG4gICAgICAgICAgWy4uLihjdXJyZW50TGV2ZWxTb3VyY2UgIT0gdW5kZWZpbmVkID8gW2N1cnJlbnRMZXZlbFNvdXJjZV0gOiBbXSldLFxuICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgKTtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsnb3ZlcnJpZGUnXSA9IGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMoXG4gICAgICAgICAgaGlnaGVyTGV2ZWxTb3VyY2VzLFxuICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIGxpc3Qgb2YgY29uZmlnIHNvdXJjZXMgdXNlZCBieSBub2RlIGNvbmZpZyBwYWNrYWdlLCBvcmRlcmVkIGZyb21cbiAgICogdGhlIGxvd2VzdCB0byB0aGUgaGlnaGVzdCBwcmlvcml0eVxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7SUNvbmZpZ30gY29uZmlnXG4gICAqIEByZXR1cm4gIHtzdHJpbmdbXX1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE5vZGVDb25maWdMZXZlbHMgPSAoY29uZmlnOiBJQ29uZmlnKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gY29uZmlnLnV0aWwuZ2V0RW52KCdOT0RFX0FQUF9JTlNUQU5DRScpO1xuICAgIGxldCBkZXBsb3ltZW50ID0gY29uZmlnLnV0aWwuZ2V0RW52KCdOT0RFX0VOVicpO1xuICAgIGRlcGxveW1lbnQgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfQ09ORklHX0VOVicpO1xuICAgIGNvbnN0IGZ1bGxIb3N0bmFtZSA9IGNvbmZpZy51dGlsLmdldEVudignSE9TVE5BTUUnKTtcbiAgICBjb25zdCBzaG9ydEhvc3RuYW1lID1cbiAgICAgIGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBmdWxsSG9zdG5hbWUuc3BsaXQoJy4nKVswXSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbmZpZ0xldmVscyA9IFtcbiAgICAgICdkZWZhdWx0JyxcbiAgICAgIC4uLihpbnN0YW5jZSAhPSB1bmRlZmluZWQgPyBbYGRlZmF1bHQtJHtpbnN0YW5jZX1gXSA6IFtdKSxcbiAgICAgIC4uLihkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCA/IFtgJHtkZXBsb3ltZW50fWBdIDogW10pLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCAmJiBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKHNob3J0SG9zdG5hbWUgIT0gdW5kZWZpbmVkID8gW2Ake3Nob3J0SG9zdG5hbWV9YF0gOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiYgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake3Nob3J0SG9zdG5hbWV9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiYgZGVwbG95bWVudCAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtkZXBsb3ltZW50fWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKHNob3J0SG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmXG4gICAgICBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCAmJlxuICAgICAgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake3Nob3J0SG9zdG5hbWV9LSR7ZGVwbG95bWVudH0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkID8gW2Ake2Z1bGxIb3N0bmFtZX1gXSA6IFtdKSxcbiAgICAgIC4uLihmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtmdWxsSG9zdG5hbWV9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtmdWxsSG9zdG5hbWV9LSR7ZGVwbG95bWVudH1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmXG4gICAgICBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCAmJlxuICAgICAgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgYGxvY2FsYCxcbiAgICAgIC4uLihpbnN0YW5jZSAhPSB1bmRlZmluZWQgPyBbYGxvY2FsLSR7aW5zdGFuY2V9YF0gOiBbXSksXG4gICAgICAuLi4oZGVwbG95bWVudCAhPSB1bmRlZmluZWQgPyBbYGxvY2FsLSR7ZGVwbG95bWVudH1gXSA6IFtdKSxcbiAgICAgIC4uLihkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCAmJiBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYGxvY2FsLSR7ZGVwbG95bWVudH0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgICckTk9ERV9DT05GSUcnLFxuICAgICAgJ2N1c3RvbS1lbnZpcm9ubWVudC12YXJpYWJsZXMnLFxuICAgIF07XG5cbiAgICByZXR1cm4gY29uZmlnTGV2ZWxzO1xuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgYSBjb25maWcgb2JqZWN0IGFuZCB3cml0ZXMgaXQgdG8gdGhlIG5vZGUtY29uZmlnIGZpbGVcbiAgICogY29ycmVzcG9uZGluZyB0byB0aGUgcGFzc2VkIGxldmVsXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29uZmlnT2JqXG4gICAqIEBwYXJhbSB7SUNvbmZpZ30gY29uZmlnXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBvdXRwdXQgbm9kZS1jb25maWcgZmlsZSBsZXZlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlXG4gICAqL1xuICB2YWxpZGF0ZUFuZFdyaXRlQ29uZmlnID0gKFxuICAgIGNvbmZpZ09iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb25maWc6IElDb25maWcsXG4gICAgbGV2ZWw6IHN0cmluZyxcbiAgICBmb3JtYXQ6IHN0cmluZyxcbiAgKSA9PiB7XG4gICAgY29uc3QgY29uZkxldmVscyA9IENvbmZpZ1ZhbGlkYXRvci5nZXROb2RlQ29uZmlnTGV2ZWxzKGNvbmZpZykuZmlsdGVyKFxuICAgICAgKGwpID0+IGwgIT09ICdjdXN0b20tZW52aXJvbm1lbnQtdmFyaWFibGVzJyxcbiAgICApO1xuICAgIGNvbnN0IGxldmVsSW5kZXggPSBjb25mTGV2ZWxzLmluZGV4T2YobGV2ZWwpO1xuICAgIGlmIChsZXZlbEluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIFske2xldmVsfV0gbGV2ZWwgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IHN5c3RlbSdzIGNvbmZpZ3VyYXRpb24gbGV2ZWxzYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnRGlyID1cbiAgICAgIHByb2Nlc3MuZW52WydOT0RFX0NPTkZJR19ESVInXSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBwcm9jZXNzLmVudlsnTk9ERV9DT05GSUdfRElSJ11cbiAgICAgICAgOiAnLi9jb25maWcnO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgZXh0ID0gJyc7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgJ2pzb24nOiB7XG4gICAgICAgIG91dHB1dCA9IEpzb25CaWdJbnQuc3RyaW5naWZ5KGNvbmZpZ09iaik7XG4gICAgICAgIGV4dCA9ICdqc29uJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd5YW1sJzoge1xuICAgICAgICBvdXRwdXQgPSB5YW1sLmR1bXAoY29uZmlnT2JqKTtcbiAgICAgICAgZXh0ID0gJ3lhbWwnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGZvcm1hdDogJHtmb3JtYXR9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIGAke2xldmVsfS4ke2V4dH1gKTtcbiAgICBjb25zdCBiYWNrdXBQYXRoID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgYCR7bGV2ZWx9LWJhY2t1cC4ke2V4dH1gKTtcbiAgICBjb25zdCBjb25mRmlsZUV4aXN0cyA9IGZzLmV4aXN0c1N5bmMob3V0cHV0UGF0aCk7XG4gICAgaWYgKGNvbmZGaWxlRXhpc3RzKSB7XG4gICAgICBmcy5yZW5hbWVTeW5jKG91dHB1dFBhdGgsIGJhY2t1cFBhdGgpO1xuICAgIH1cbiAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIG91dHB1dCk7XG5cbiAgICBjb25zdCB1cGRhdGVkQ29uZk9iaiA9IGNvbmZpZy51dGlsLmxvYWRGaWxlQ29uZmlncygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb25maWcodXBkYXRlZENvbmZPYmopO1xuICAgICAgZnMudW5saW5rU3luYyhiYWNrdXBQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZnMudW5saW5rU3luYyhvdXRwdXRQYXRoKTtcbiAgICAgIGlmIChjb25mRmlsZUV4aXN0cykge1xuICAgICAgICBmcy5yZW5hbWVTeW5jKGJhY2t1cFBhdGgsIG91dHB1dFBhdGgpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufVxuIl19
785
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRXhCLE9BQU8sVUFBVSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUkxRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGNBQWMsR0FDZixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLFlBQVksR0FDYixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkUsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFlO0lBRTdCLFlBQW9CLE1BQW9CO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsR0FBUyxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLFVBQWtCLEVBQW1CLEVBQUU7UUFDeEQsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFM0Qs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Q0FBQyxDQUFDO1FBRXJDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFckQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbmZpZywgSUNvbmZpZ1NvdXJjZSB9IGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJ2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBKc29uQmlnSW50LCB7IEpzb25CaWdJbnRGYWN0b3J5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5cbmltcG9ydCB7IENvbmZpZ0ZpZWxkLCBDb25maWdTY2hlbWEsIFZhbHVlVHlwZSB9IGZyb20gJy4vc2NoZW1hL3R5cGVzL2ZpZWxkcyc7XG5pbXBvcnQgeyBXaGVuIH0gZnJvbSAnLi9zY2hlbWEvdHlwZXMvdmFsaWRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgcHJvcGVydHlWYWxpZGF0b3JzLFxuICBzdXBwb3J0ZWRUeXBlcyxcbn0gZnJvbSAnLi9zY2hlbWEvVmFsaWRhdG9ycy9maWVsZFByb3BlcnRpZXMnO1xuaW1wb3J0IHtcbiAgZ2V0U291cmNlTmFtZSxcbiAgZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyxcbiAgdG9QYXNjYWxDYXNlLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHZhbHVlVmFsaWRhdGlvbnMsIHZhbHVlVmFsaWRhdG9ycyB9IGZyb20gJy4vdmFsdWUvdmFsaWRhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWdWYWxpZGF0b3Ige1xuICBwcml2YXRlIHNjaGVtYTogQ29uZmlnU2NoZW1hO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NoZW1hOiBDb25maWdTY2hlbWEpIHtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLnZhbGlkYXRlU2NoZW1hKCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBmaW5hbCBjb25maWd1cmF0aW9uIG9iamVjdCBieSB0cmFuc2Zvcm1pbmcgYW5kIHZhbGlkYXRpbmdcbiAgICpcbiAgICogIFQgLSBUaGUgdHlwZSBvZiB0aGUgZmluYWwgbm9ybWFsaXplZCBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogQHJldHVybnMge1R9IFRoZSBub3JtYWxpemVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqL1xuICBidWlsZENvbmZpZ3MgPSA8VD4oKTogVCA9PiB7XG4gICAgY29uc3QgcmF3ID0gY29uZmlnLnV0aWwudG9PYmplY3QoKTtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlnKHJhdyk7XG4gICAgcmV0dXJuIHJhdztcbiAgfTtcblxuICAvKipcbiAgICogY3JlYXRlIENvbmZpZ1ZhbGlkYXRvciBmcm9tIHNjaGVtYSBmaWxlIHBhdGhcbiAgICovXG4gIHN0YXRpYyBmcm9tRmlsZSA9IChzY2hlbWFQYXRoOiBzdHJpbmcpOiBDb25maWdWYWxpZGF0b3IgPT4ge1xuICAgIGNvbnN0IHJhd1NjaGVtYURhdGEgPSBmcy5yZWFkRmlsZVN5bmMoc2NoZW1hUGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBqc29uQmlnSW50ID0gSnNvbkJpZ0ludEZhY3Rvcnkoe1xuICAgICAgYWx3YXlzUGFyc2VBc0JpZzogZmFsc2UsXG4gICAgICB1c2VOYXRpdmVCaWdJbnQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzY2hlbWEgPSBqc29uQmlnSW50LnBhcnNlKHJhd1NjaGVtYURhdGEpO1xuICAgIHJldHVybiBuZXcgQ29uZmlnVmFsaWRhdG9yKHNjaGVtYSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBDb25maWdWYWxpZGF0b3IgZnJvbSBzY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHNjaGVtYVxuICAgKi9cbiAgc3RhdGljIGZyb21TY2hlbWEgPSAoc2NoZW1hOiBDb25maWdTY2hlbWEpOiBDb25maWdWYWxpZGF0b3IgPT4ge1xuICAgIHJldHVybiBuZXcgQ29uZmlnVmFsaWRhdG9yKHNjaGVtYSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyB0aGUgcGFzc2VkIGNvbmZpZyBhZ2FpbnN0IHRoZSBpbnN0YW5jZSdzIHNjaGVtYVxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHZhbGlkYXRlQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMudmFsaWRhdGVWYWx1ZShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHsgdHlwZTogJ29iamVjdCcsIGNoaWxkcmVuOiB0aGlzLnNjaGVtYSB9LFxuICAgICAgY29uZmlnLFxuICAgICAgW10sXG4gICAgKTtcblxuICAgIHRoaXMudmFsaWRhdGVTdWJDb25maWcoY29uZmlnLCBjb25maWcsIHRoaXMuc2NoZW1hLCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogdHJhdmVyc2VzIGFuZCB2YWxpZGF0ZXMgYSBzdWJjb25maWcgdXNpbmcgdGhlIHN1YnNjaGVtYVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHN1YkNvbmZpZ1xuICAgKiBAcGFyYW0ge0NvbmZpZ1NjaGVtYX0gc3ViU2NoZW1hXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN1YkNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBzdWJTY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgY29uc3QgZXJyb3JQcmVhbWJsZSA9IChwYXRoOiBBcnJheTxzdHJpbmc+KSA9PlxuICAgICAgYGNvbmZpZyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgXCIke3BhdGguam9pbignLicpfVwiIGZpZWxkYDtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3ViU2NoZW1hKSkge1xuICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5jb25jYXQoW25hbWVdKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzdWJDb25maWcgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24oc3ViQ29uZmlnLCBuYW1lKSkge1xuICAgICAgICAgIHZhbHVlID0gc3ViQ29uZmlnW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZSh2YWx1ZSwgZmllbGQsIGNvbmZpZywgY2hpbGRQYXRoKTtcblxuICAgICAgICAvLyBpZiBhIG5vZGUvZmllbGQgaXMgb2YgdHlwZSBvYmplY3QgYW5kIHRodXMgaXMgYSBzdWJ0cmVlLCB0cmF2ZXJzZSBpdFxuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlU3ViQ29uZmlnKGNvbmZpZywgdmFsdWUsIGZpZWxkLmNoaWxkcmVuLCBjaGlsZFBhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgaXRlbSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgeyBbbmFtZV06IGl0ZW0gfSxcbiAgICAgICAgICAgICAgICB7IFtuYW1lXTogZmllbGQuaXRlbXMgfSxcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICAgIGxldCBpc01hdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgZm9yIChjb25zdCBhY3RpdmVGaWVsZCBvZiBmaWVsZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGFjdGl2ZUZpZWxkLnR5cGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIHsgW25hbWVdOiB2YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyBbbmFtZV06IGFjdGl2ZUZpZWxkIH0sXG4gICAgICAgICAgICAgICAgICBjaGlsZFBhdGgsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpc01hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUZpZWxkLnR5cGUgPT09ICdhcnJheScgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCBpdGVtLCBjaGlsZFBhdGgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVN1YkNvbmZpZyhcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICB7IFtuYW1lXTogaXRlbSB9LFxuICAgICAgICAgICAgICAgICAgICB7IFtuYW1lXTogYWN0aXZlRmllbGQuaXRlbXMgfSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVWYWx1ZSh2YWx1ZSwgYWN0aXZlRmllbGQsIGNvbmZpZywgY2hpbGRQYXRoKTtcbiAgICAgICAgICAgICAgICBpc01hdGNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChpc01hdGNoZWQpIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWA7XG4gICAgICAgICAgICAgIGlzTWF0Y2hlZCA9IGlzTWF0Y2hlZCA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpc01hdGNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFZhbHVlIGZvciBcIiR7Y2hpbGRQYXRoLmpvaW4oJy4nKX1cIiBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHVuaW9uIHR5cGVzIGZvciB0aGlzIGVycm9yOiAgJHtlcnJvck1lc3NhZ2V9LiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIHZhbHVlLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke2Vycm9yUHJlYW1ibGUoY2hpbGRQYXRoKX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZXRzIGFuIG9iamVjdCdzIHNwZWNpZmljIHN1YnRyZWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZVxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqXG4gICAqIEBwYXJhbSB7Kn0gbmV3VmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAbWVtYmVyb2YgQ29uZmlnVmFsaWRhdG9yXG4gICAqL1xuICBzdGF0aWMgbW9kaWZ5T2JqZWN0KFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIG5ld1ZhbHVlOiBWYWx1ZVR5cGUsXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICkge1xuICAgIGxldCB2YWx1ZSA9IG9iajtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXRoLnNsaWNlKDAsIC0xKSkge1xuICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCAmJiBPYmplY3QuaGFzT3duKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGFzdEtleSA9IHBhdGguYXQoLTEpO1xuICAgIGlmIChsYXN0S2V5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWVbbGFzdEtleV0gPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdmFsaWRhdGVzIGEgdmFsdWUgaW4gY29uZmlnIG9iamVjdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Q29uZmlnRmllbGR9IGZpZWxkIHRoZSBmaWVsZCBzcGVjaWZpY2F0aW9uIGluIHNjaGVtYVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZyB0aGUgY29uZmlnIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZhbHVlID0gKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdmFsdWU6IGFueSxcbiAgICBmaWVsZDogQ29uZmlnRmllbGQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICkgPT4ge1xuICAgIGlmIChmaWVsZC5sYWJlbCkge1xuICAgICAgcGF0aCA9IHBhdGguY29uY2F0KFtmaWVsZC5sYWJlbF0pO1xuICAgIH1cbiAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAodmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCB2YWx1ZSA8IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRmllbGQgXCIke3BhdGguam9pbignLicpfVwiIGlzIGRlY2xhcmVkIGFzIGEgQmlnSW50LCBidXQgYSBOdW1iZXIgd2FzIHByb3ZpZGVkIHdpdGggaW5zdWZmaWNpZW50IHByZWNpc2lvbi4gVmFsdWVzIGV4Y2VlZGluZyA5MDA3MTk5MjU0NzQwOTkxIG11c3QgYmUgc3VwcGxpZWQgYXMgYSBzdHJpbmcgdG8gZW5zdXJlIGFjY3VyYWN5LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gQmlnSW50KHZhbHVlKTtcblxuICAgICAgICAgIENvbmZpZ1ZhbGlkYXRvci5tb2RpZnlPYmplY3QoY29uZmlnLCB2YWx1ZSwgcGF0aCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgY29udmVydCAke3ZhbHVlfSB0byBhIEJpZ0ludCBmb3IgZmllbGQgXCIke3BhdGguam9pbignLicpfVwiYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEZpZWxkIFwiJHtwYXRoLmpvaW4oJy4nKX1cIiBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLiBQbGVhc2UgcHJvdmlkZSBhIHN1aXRhYmxlIGZvcm1hdC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdmFsdWUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fFxuICAgICAgICAgIHZhbHVlIDwgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFZhbHVlIGZvciBcIiR7cGF0aC5qb2luKCcuJyl9XCIgaXMgdG9vIGxhcmdlIG9yIHRvbyBzbWFsbC4gUGxlYXNlIGVudGVyIGEgdmFsaWQgbnVtYmVyLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBDb25maWdWYWxpZGF0b3IubW9kaWZ5T2JqZWN0KGNvbmZpZywgdmFsdWUsIHBhdGgpO1xuICAgICAgfVxuICAgICAgdmFsdWVWYWxpZGF0b3JzW2ZpZWxkLnR5cGVdKHZhbHVlLCBmaWVsZCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZmllbGQudHlwZSAhPT0gJ29iamVjdCcgJiZcbiAgICAgIGZpZWxkLnR5cGUgIT09ICdhcnJheScgJiZcbiAgICAgIGZpZWxkLnR5cGUgIT09ICd1bmlvbicgJiZcbiAgICAgIGZpZWxkLnZhbGlkYXRpb25zXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRpb24gb2YgZmllbGQudmFsaWRhdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IE9iamVjdC5rZXlzKHZhbGlkYXRpb24pLmZpbHRlcihcbiAgICAgICAgICAoa2V5KSA9PiBrZXkgIT09ICd3aGVuJyAmJiBrZXkgIT09ICdlcnJvcicsXG4gICAgICAgIClbMF07XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duKHZhbHVlVmFsaWRhdGlvbnNbZmllbGQudHlwZV0sIG5hbWUpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlVmFsaWRhdGlvbnNbZmllbGQudHlwZV1bbmFtZV0odmFsdWUsIHZhbGlkYXRpb24sIGNvbmZpZywgdGhpcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uLmVycm9yICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodmFsaWRhdGlvbi5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGRldGVybWluZXMgaWYgYSB3aGVuIGNsYXVzZSBpbiB2YWxpZGF0aW9ucyBzZWN0aW9uIG9mIGEgc2NoZW1hIGZpZWxkIGlzXG4gICAqIHNhdGlzZmllZFxuICAgKlxuICAgKiBAcGFyYW0ge1doZW59IHdoZW5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyBpc1doZW5UcnVlID0gKHdoZW46IFdoZW4sIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHdoZW4ucGF0aC5zcGxpdCgnLicpO1xuICAgIGNvbnN0IHZhbHVlID0gQ29uZmlnVmFsaWRhdG9yLnZhbHVlQXQoY29uZmlnLCBwYXRoUGFydHMpO1xuICAgIHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgJiYgdmFsdWUgPT09IHdoZW4udmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgdGhlIHZhbHVlIGF0IHNwZWNpZmllZCBwYXRoIGluIGNvbmZpZyBvYmplY3RcbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbmZpZ1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBzdGF0aWMgdmFsdWVBdCA9IChjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgdmFsdWU6IGFueSA9IGNvbmZpZztcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXRoKSB7XG4gICAgICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24odmFsdWUsIGtleSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyB0aGlzLnNjaGVtYSBhbmQgdGhyb3dzIGV4Y2VwdGlvbiBpZiBhbnkgZXJyb3JzIGZvdW5kXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2NoZW1hID0gKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yUHJlYW1ibGUgPSAocGF0aDogQXJyYXk8c3RyaW5nPikgPT5cbiAgICAgIGBTY2hlbWEgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIFwiJHtwYXRoLmpvaW4oJy4nKX1cIiBmaWVsZGA7XG5cbiAgICBjb25zdCBzdGFjazogQXJyYXk8e1xuICAgICAgc3ViU2NoZW1hOiBDb25maWdTY2hlbWE7XG4gICAgICBwYXJlbnRQYXRoOiBBcnJheTxzdHJpbmc+O1xuICAgIH0+ID0gW1xuICAgICAge1xuICAgICAgICBzdWJTY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgICBwYXJlbnRQYXRoOiBbXSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIFRyYXZlcnNlcyB0aGUgc2NoZW1hIG9iamVjdCB0cmVlIGRlcHRoIGZpcnN0IGFuZCB2YWxpZGF0ZSBmaWVsZHNcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBzdWJTY2hlbWEsIHBhcmVudFBhdGggfSA9IHN0YWNrLnBvcCgpITtcblxuICAgICAgLy8gcHJvY2VzcyBjaGlsZHJlbiBvZiBjdXJyZW50IG9iamVjdCBmaWVsZFxuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHN1YlNjaGVtYSkucmV2ZXJzZSgpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBwYXJlbnRQYXRoLmNvbmNhdChbbmFtZV0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVDb25maWdOYW1lKG5hbWUpO1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW25hbWVdO1xuXG4gICAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGZpZWxkLCAndHlwZScpIHx8IHR5cGVvZiBmaWVsZC50eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZXZlcnkgc2NoZW1hIGZpZWxkIG11c3QgaGF2ZSBhIFwidHlwZVwiIHByb3BlcnR5IG9mIHR5cGUgXCJzdHJpbmdcImAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc3VwcG9ydGVkVHlwZXMuaW5jbHVkZXMoZmllbGQudHlwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgZmllbGQgdHlwZSBcIiR7ZmllbGQudHlwZX1cImApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMudmFsaWRhdGVTY2hlbWFGaWVsZChmaWVsZCk7XG5cbiAgICAgICAgICAvLyBpZiB0aGUgY2hpbGQgaXMgYW4gb2JqZWN0IGZpZWxkIGl0c2VsZiBhZGQgaXQgdG8gc3RhY2sgZm9yXG4gICAgICAgICAgLy8gcHJvY2Vzc2luZ1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgIHN1YlNjaGVtYTogZmllbGQuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICBzdWJTY2hlbWE6IHsgW25hbWVdOiBmaWVsZC5pdGVtcyB9LFxuICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgICBmaWVsZC5jaGlsZHJlbi5mb3JFYWNoKCh1bmlvbkNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdWJTY2hlbWE6IHsgW2Ake25hbWV9X3VuaW9uXyR7aW5kZXh9YF06IHVuaW9uQ2hpbGQgfSxcbiAgICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtlcnJvclByZWFtYmxlKHBhdGgpfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogdmFsaWRhdGVzIGNvbmZpZyBrZXkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ05hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKG5hbWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb25maWcga2V5IG5hbWUgY2FuIG5vdCBjb250YWluIHRoZSAnLicgY2hhcmFjdGVyYCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiB2YWxpZGF0ZXMgcGFzc2VkIHNjaGVtYSBmaWVsZCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogQHBhcmFtIHtDb25maWdGaWVsZH0gZmllbGRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTY2hlbWFGaWVsZCA9IChmaWVsZDogQ29uZmlnRmllbGQpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5oYXNPd24ocHJvcGVydHlWYWxpZGF0b3JzLmFsbCwga2V5KSAmJlxuICAgICAgICAhT2JqZWN0Lmhhc093bihwcm9wZXJ0eVZhbGlkYXRvcnMucHJpbWl0aXZlLCBrZXkpICYmXG4gICAgICAgICFPYmplY3QuaGFzT3duKHByb3BlcnR5VmFsaWRhdG9yc1tmaWVsZC50eXBlXSwga2V5KVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2NoZW1hIGZpZWxkIGhhcyB1bmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9ycy5hbGwpKSB7XG4gICAgICB2YWxpZGF0b3IoZmllbGQsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZpZWxkLnR5cGUgIT09ICdvYmplY3QnICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAnYXJyYXknICYmXG4gICAgICBmaWVsZC50eXBlICE9PSAndW5pb24nXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiBPYmplY3QudmFsdWVzKHByb3BlcnR5VmFsaWRhdG9ycy5wcmltaXRpdmUpKSB7XG4gICAgICAgIHZhbGlkYXRvcihmaWVsZCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2YgT2JqZWN0LnZhbHVlcyhwcm9wZXJ0eVZhbGlkYXRvcnNbZmllbGQudHlwZV0pKSB7XG4gICAgICB2YWxpZGF0b3IoZmllbGQsIHRoaXMpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXRoIGluIHNjaGVtYSB0cmVlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhcbiAgICogQHJldHVybiB7KENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkKX0gcmV0dXJucyB1bmRlZmluZWQgaWYgZmllbGQgaXMgbm90IGZvdW5kXG4gICAqL1xuICBnZXRTY2hlbWFGaWVsZCA9IChwYXRoOiBzdHJpbmdbXSk6IENvbmZpZ0ZpZWxkIHwgdW5kZWZpbmVkID0+IHtcbiAgICBsZXQgc3ViVHJlZTogQ29uZmlnU2NoZW1hIHwgdW5kZWZpbmVkID0gdGhpcy5zY2hlbWE7XG4gICAgbGV0IGZpZWxkOiBDb25maWdGaWVsZCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aCkge1xuICAgICAgaWYgKHN1YlRyZWUgIT0gdW5kZWZpbmVkICYmIE9iamVjdC5oYXNPd24oc3ViVHJlZSwgcGFydCkpIHtcbiAgICAgICAgZmllbGQgPSBzdWJUcmVlW3BhcnRdO1xuICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBzdWJUcmVlID0gZmllbGQuY2hpbGRyZW47XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ2FycmF5JyAmJiBmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHN1YlRyZWUgPSBmaWVsZC5pdGVtcy5jaGlsZHJlbjtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAndW5pb24nKSB7XG4gICAgICAgICAgc3ViVHJlZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJUcmVlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICd1bmlvbicpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZpZWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGNoaWxkLnR5cGUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIE9iamVjdC5oYXNPd24oY2hpbGQuY2hpbGRyZW4sIHBhcnQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZmllbGQgPSBjaGlsZC5jaGlsZHJlbltwYXJ0XTtcbiAgICAgICAgICAgICAgc3ViVHJlZSA9IGZpZWxkLnR5cGUgPT09ICdvYmplY3QnID8gZmllbGQuY2hpbGRyZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBleHRyYWN0cyBkZWZhdWx0IHZhbHVlcyBmcm9tIGEgc2NoZW1hXG4gICAqXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59IG9iamVjdCBvZiBkZWZhdWx0IHZhbHVlc1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZ2VuZXJhdGVEZWZhdWx0ID0gKG9wdGlvbnM/OiB7IHZhbGlkYXRlPzogYm9vbGVhbiB9KTogUmVjb3JkPHN0cmluZywgYW55PiA9PiB7XG4gICAgY29uc3QgdmFsdWVUcmVlID0gdGhpcy5idWlsZERlZmF1bHRzRm9yU2NoZW1hKHRoaXMuc2NoZW1hKTtcbiAgICBpZiAob3B0aW9ucz8udmFsaWRhdGUpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb25maWcodmFsdWVUcmVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlVHJlZTtcbiAgfTtcblxuICAvLyBCdWlsZHMgZGVmYXVsdCB2YWx1ZXMgZm9yIGEgc2NoZW1hIHN1YnRyZWUgKG9iamVjdHMgYW5kIGFycmF5cyksIHJlY3Vyc2l2ZWx5XG4gIHByaXZhdGUgYnVpbGREZWZhdWx0c0ZvclNjaGVtYSA9IChcbiAgICBzY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGRlZmF1bHRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY2hlbWEpKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYVtrZXldO1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRGVmYXVsdHMgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEoZmllbGQuY2hpbGRyZW4pO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hpbGREZWZhdWx0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBjaGlsZERlZmF1bHRzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICdhcnJheScpIHtcbiAgICAgICAgaWYgKGZpZWxkLmRlZmF1bHQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGZpZWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRGVmYXVsdHMgPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEoXG4gICAgICAgICAgICAgIGZpZWxkLml0ZW1zLmNoaWxkcmVuLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBmaWVsZC5kZWZhdWx0Lm1hcCgoZWxlbTogVmFsdWVUeXBlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbGVtICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZWxlbSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXkuaXNBcnJheShlbGVtKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtRGVmYXVsdHMsIC4uLmVsZW0gfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZWxlbTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gZmllbGQuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmllbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBmaWVsZC5jaGlsZHJlbikge1xuICAgICAgICAgIGlmIChvcHRpb24udHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHRoaXMuYnVpbGREZWZhdWx0c0ZvclNjaGVtYShvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBkZWZhdWx0c1trZXldID0gb2JqO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi50eXBlID09PSAnYXJyYXknICYmIG9wdGlvbi5pdGVtcy50eXBlID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBvYmogPSB0aGlzLmJ1aWxkRGVmYXVsdHNGb3JTY2hlbWEob3B0aW9uLml0ZW1zLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG9iajtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24udHlwZSAhPSAndW5pb24nKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmRlZmF1bHQpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG9wdGlvbi5kZWZhdWx0O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWVsZC5kZWZhdWx0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlZmF1bHRzW2tleV0gPSBmaWVsZC5kZWZhdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0cztcbiAgfTtcblxuICAvKipcbiAgICogZ2VuZXJhdGVzIGNvbXBhdGlibGUgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZm9yIHRoaXMgaW5zdGFuY2UncyBzY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2Ygcm9vdCB0eXBlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdlbmVyYXRlVFNUeXBlcyA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IHR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVtaXR0ZWRUeXBlTmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PHtcbiAgICAgIHN1YlNjaGVtYTogQ29uZmlnU2NoZW1hO1xuICAgICAgY2hpbGRyZW46IHN0cmluZ1tdO1xuICAgICAgcGFyZW50UGF0aDogc3RyaW5nW107XG4gICAgICB0eXBlTmFtZTogc3RyaW5nO1xuICAgICAgYXR0cmlidXRlczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT47XG4gICAgfT4gPSBbXG4gICAgICB7XG4gICAgICAgIHN1YlNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYSksXG4gICAgICAgIHBhcmVudFBhdGg6IFtdLFxuICAgICAgICB0eXBlTmFtZTogbmFtZSxcbiAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgeyBzdWJTY2hlbWEsIGNoaWxkcmVuLCBwYXJlbnRQYXRoLCB0eXBlTmFtZSwgYXR0cmlidXRlcyB9ID0gY3VycmVudDtcblxuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoIWVtaXR0ZWRUeXBlTmFtZXMuaGFzKHR5cGVOYW1lKSkge1xuICAgICAgICAgIHR5cGVzLnB1c2godGhpcy5nZW5UU0ludGVyZmFjZSh0eXBlTmFtZSwgYXR0cmlidXRlcykpO1xuICAgICAgICAgIGVtaXR0ZWRUeXBlTmFtZXMuYWRkKHR5cGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkTmFtZSA9IGNoaWxkcmVuLnBvcCgpITtcbiAgICAgIGNvbnN0IGZpZWxkID0gc3ViU2NoZW1hW2NoaWxkTmFtZV07XG4gICAgICBjb25zdCBwYXRoID0gcGFyZW50UGF0aC5jb25jYXQoY2hpbGROYW1lKTtcblxuICAgICAgY29uc3QgY2hpbGROYW1lUXVvdGVkID0gY2hpbGROYW1lLmluY2x1ZGVzKCctJylcbiAgICAgICAgPyBgXCIke2NoaWxkTmFtZX1cImBcbiAgICAgICAgOiBjaGlsZE5hbWU7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3VuaW9uJykge1xuICAgICAgICBjb25zdCB1bmlvblR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZpZWxkLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBwYXRoXG4gICAgICAgICAgICAgIC5jb25jYXQoW2BPcHRpb24ke2luZGV4fWBdKVxuICAgICAgICAgICAgICAubWFwKHRvUGFzY2FsQ2FzZSlcbiAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgc3ViU2NoZW1hOiBjaGlsZC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IE9iamVjdC5rZXlzKGNoaWxkLmNoaWxkcmVuKS5yZXZlcnNlKCksXG4gICAgICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB1bmlvblR5cGVzLnB1c2godHlwZU5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgaWYgKGNoaWxkLml0ZW1zLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gcGF0aFxuICAgICAgICAgICAgICAgIC5jb25jYXQoW2BJdGVtJHtpbmRleH1gXSlcbiAgICAgICAgICAgICAgICAubWFwKHRvUGFzY2FsQ2FzZSlcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgc3ViU2NoZW1hOiBjaGlsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogT2JqZWN0LmtleXMoY2hpbGQuaXRlbXMuY2hpbGRyZW4pLnJldmVyc2UoKSxcbiAgICAgICAgICAgICAgICBwYXJlbnRQYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB1bmlvblR5cGVzLnB1c2goYCR7dHlwZU5hbWV9W11gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChgJHtjaGlsZC5pdGVtcy50eXBlfVtdYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHVuaW9uVHlwZXMucHVzaChjaGlsZC50eXBlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChbY2hpbGROYW1lUXVvdGVkLCB1bmlvblR5cGVzLmpvaW4oJyB8ICcpXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gcGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBzdWJTY2hlbWE6IGZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhmaWVsZC5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgIHBhcmVudFBhdGg6IHBhdGgsXG4gICAgICAgICAgdHlwZU5hbWUsXG4gICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChbY2hpbGROYW1lUXVvdGVkLCB0eXBlTmFtZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGlmIChmaWVsZC5pdGVtcy50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gcGF0aC5tYXAodG9QYXNjYWxDYXNlKS5qb2luKCcnKTtcblxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgc3ViU2NoZW1hOiBmaWVsZC5pdGVtcy5jaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBPYmplY3Qua2V5cyhmaWVsZC5pdGVtcy5jaGlsZHJlbikucmV2ZXJzZSgpLFxuICAgICAgICAgICAgcGFyZW50UGF0aDogcGF0aCxcbiAgICAgICAgICAgIHR5cGVOYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goW2NoaWxkTmFtZVF1b3RlZCwgYCR7dHlwZU5hbWV9W11gXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5wdXNoKFtjaGlsZE5hbWVRdW90ZWQsIGAke2ZpZWxkLml0ZW1zLnR5cGV9W11gXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgZmllbGRUeXBlOiBzdHJpbmcgPSBmaWVsZC50eXBlO1xuICAgICAgbGV0IGlzT3B0aW9uYWwgPSB0cnVlO1xuICAgICAgaWYgKGZpZWxkLnZhbGlkYXRpb25zKSB7XG4gICAgICAgIGZvciAoY29uc3QgdmFsaWRhdGlvbiBvZiBmaWVsZC52YWxpZGF0aW9ucykge1xuICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnc3RyaW5nJyAmJiAnY2hvaWNlcycgaW4gdmFsaWRhdGlvbikge1xuICAgICAgICAgICAgZmllbGRUeXBlID0gdmFsaWRhdGlvbi5jaG9pY2VzLm1hcCgoYykgPT4gYCcke2N9J2ApLmpvaW4oJyB8ICcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgncmVxdWlyZWQnIGluIHZhbGlkYXRpb24gJiYgISgnd2hlbicgaW4gdmFsaWRhdGlvbikpIHtcbiAgICAgICAgICAgIGlzT3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMucHVzaChbXG4gICAgICAgIGlzT3B0aW9uYWwgPyBgJHtjaGlsZE5hbWVRdW90ZWR9P2AgOiBjaGlsZE5hbWVRdW90ZWQsXG4gICAgICAgIGZpZWxkVHlwZSxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHJldHVybiB0eXBlcy5yZXZlcnNlKCkuam9pbignXFxuXFxuJykgKyAnXFxuJztcbiAgfTtcblxuICAvKipcbiAgICogZ2VuZXJhdGVzIGEgVHlwZVNjcmlwdCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgcGFzc2VkIG5hbWUgYW5kIGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheTxbc3RyaW5nLCBzdHJpbmddPn0gYXR0cmlidXRlc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBwcml2YXRlIGdlblRTSW50ZXJmYWNlID0gKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhdHRyaWJ1dGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPixcbiAgKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gYGV4cG9ydCBpbnRlcmZhY2UgJHtuYW1lfSB7XG4gICR7YXR0cmlidXRlcy5tYXAoKGF0dHIpID0+IGAke2F0dHJbMF19OiAke2F0dHJbMV19O2ApLmpvaW4oJ1xcbiAgJyl9XG59YDtcbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyBhIGNoYXJhY3RlcmlzdGljIG9iamVjdCBmb3IgdmFsdWVzIGF0IGEgc3BlY2lmaWMgbm9kZSBjb25maWcgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIGFueT59XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBnZXRDb25maWdGb3JMZXZlbChjb25maWc6IElDb25maWcsIGxldmVsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBjb25mTGV2ZWxzID0gQ29uZmlnVmFsaWRhdG9yLmdldE5vZGVDb25maWdMZXZlbHMoY29uZmlnKTtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gY29uZkxldmVscy5pbmRleE9mKGxldmVsKTtcbiAgICBpZiAobGV2ZWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBcIiR7bGV2ZWx9XCIgbGV2ZWwgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IHN5c3RlbSBjb25maWd1cmF0aW9uIGxldmVsc2AsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBoaWdoZXJMZXZlbFNvdXJjZXMgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHNvdXJjZSkgPT4gY29uZkxldmVscy5pbmRleE9mKGdldFNvdXJjZU5hbWUoc291cmNlKSkgPiBsZXZlbEluZGV4LFxuICAgICAgKTtcbiAgICBjb25zdCBjdXJyZW50TGV2ZWxTb3VyY2UgPSBjb25maWcudXRpbFxuICAgICAgLmdldENvbmZpZ1NvdXJjZXMoKVxuICAgICAgLmZpbHRlcigoc291cmNlKSA9PiBnZXRTb3VyY2VOYW1lKHNvdXJjZSkgPT09IGxldmVsKVxuICAgICAgLmF0KDApO1xuICAgIGNvbnN0IGxvd2VyTGV2ZWxTb3VyY2VzID0gY29uZmlnLnV0aWxcbiAgICAgIC5nZXRDb25maWdTb3VyY2VzKClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChzb3VyY2UpID0+IGNvbmZMZXZlbHMuaW5kZXhPZihnZXRTb3VyY2VOYW1lKHNvdXJjZSkpIDwgbGV2ZWxJbmRleCxcbiAgICAgICk7XG5cbiAgICAvLyBUcmF2ZXJzZXMgdGhlIHNjaGVtYSBvYmplY3QgdHJlZSBkZXB0aCBmaXJzdFxuICAgIGNvbnN0IHZhbHVlVHJlZSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICBbXSxcbiAgICAgIGhpZ2hlckxldmVsU291cmNlcyxcbiAgICAgIGN1cnJlbnRMZXZlbFNvdXJjZSxcbiAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICk7XG5cbiAgICByZXR1cm4gdmFsdWVUcmVlO1xuICB9XG5cbiAgLyoqXG4gICAqdHJhdmVyc2VzIHRoZSBjb25maWcgc2NoZW1hIGRlcHRoIGZpcnN0IHRvIHByb2R1Y2UgY2hhcmFjdGVyaXN0aWMgb2JqZWN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtDb25maWdTY2hlbWF9IHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRoXG4gICAqIEBwYXJhbSB7SUNvbmZpZ1NvdXJjZVtdfSBoaWdoZXJMZXZlbFNvdXJjZXNcbiAgICogQHBhcmFtIHsoSUNvbmZpZ1NvdXJjZSB8IHVuZGVmaW5lZCl9IGN1cnJlbnRMZXZlbFNvdXJjZVxuICAgKiBAcGFyYW0ge0lDb25maWdTb3VyY2VbXX0gbG93ZXJMZXZlbFNvdXJjZXNcbiAgICogQHJldHVybiB7UmVjb3JkPHN0cmluZywgYW55Pn1cbiAgICogQG1lbWJlcm9mIENvbmZpZ1ZhbGlkYXRvclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcHJvY2Vzc0NvbmZpZ0ZvckxldmVsTm9kZShcbiAgICBzY2hlbWE6IENvbmZpZ1NjaGVtYSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBoaWdoZXJMZXZlbFNvdXJjZXM6IElDb25maWdTb3VyY2VbXSxcbiAgICBjdXJyZW50TGV2ZWxTb3VyY2U6IElDb25maWdTb3VyY2UgfCB1bmRlZmluZWQsXG4gICAgbG93ZXJMZXZlbFNvdXJjZXM6IElDb25maWdTb3VyY2VbXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChjb25zdCBjaGlsZE5hbWUgb2YgT2JqZWN0LmtleXMoc2NoZW1hKS5yZXZlcnNlKCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguY29uY2F0KFtjaGlsZE5hbWVdKTtcbiAgICAgIGNvbnN0IGZpZWxkID0gc2NoZW1hW2NoaWxkTmFtZV07XG4gICAgICAvLyBpZiBhIGZpZWxkIGlzIG9mIHR5cGUgb2JqZWN0IGFuZCB0aHVzIGlzIGEgc3VidHJlZSwgcmVjdXJzZSBvbiBpdC5cbiAgICAgIC8vIE90aGVyd2lzZSBpdCdzIGEgbGVhZiBhbmQgbmVlZHMgbm8gdHJhdmVyc2FsLlxuICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IENvbmZpZ1ZhbGlkYXRvci5wcm9jZXNzQ29uZmlnRm9yTGV2ZWxOb2RlKFxuICAgICAgICAgIGZpZWxkLmNoaWxkcmVuLFxuICAgICAgICAgIGNoaWxkUGF0aCxcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY3VycmVudExldmVsU291cmNlLFxuICAgICAgICAgIGxvd2VyTGV2ZWxTb3VyY2VzLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVbY2hpbGROYW1lXVsnbGFiZWwnXSA9XG4gICAgICAgICAgZmllbGQubGFiZWwgIT0gdW5kZWZpbmVkID8gZmllbGQubGFiZWwgOiBudWxsO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydkZXNjcmlwdGlvbiddID1cbiAgICAgICAgICBmaWVsZC5kZXNjcmlwdGlvbiAhPSB1bmRlZmluZWQgPyBmaWVsZC5kZXNjcmlwdGlvbiA6IG51bGw7XG4gICAgICAgIHZhbHVlW2NoaWxkTmFtZV1bJ2RlZmF1bHQnXSA9IGdldFZhbHVlRnJvbUNvbmZpZ1NvdXJjZXMoXG4gICAgICAgICAgbG93ZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWyd2YWx1ZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBbLi4uKGN1cnJlbnRMZXZlbFNvdXJjZSAhPSB1bmRlZmluZWQgPyBbY3VycmVudExldmVsU291cmNlXSA6IFtdKV0sXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdWydvdmVycmlkZSddID0gZ2V0VmFsdWVGcm9tQ29uZmlnU291cmNlcyhcbiAgICAgICAgICBoaWdoZXJMZXZlbFNvdXJjZXMsXG4gICAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgbGlzdCBvZiBjb25maWcgc291cmNlcyB1c2VkIGJ5IG5vZGUgY29uZmlnIHBhY2thZ2UsIG9yZGVyZWQgZnJvbVxuICAgKiB0aGUgbG93ZXN0IHRvIHRoZSBoaWdoZXN0IHByaW9yaXR5XG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHJldHVybiAge3N0cmluZ1tdfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Tm9kZUNvbmZpZ0xldmVscyA9IChjb25maWc6IElDb25maWcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfQVBQX0lOU1RBTkNFJyk7XG4gICAgbGV0IGRlcGxveW1lbnQgPSBjb25maWcudXRpbC5nZXRFbnYoJ05PREVfRU5WJyk7XG4gICAgZGVwbG95bWVudCA9IGNvbmZpZy51dGlsLmdldEVudignTk9ERV9DT05GSUdfRU5WJyk7XG4gICAgY29uc3QgZnVsbEhvc3RuYW1lID0gY29uZmlnLnV0aWwuZ2V0RW52KCdIT1NUTkFNRScpO1xuICAgIGNvbnN0IHNob3J0SG9zdG5hbWUgPVxuICAgICAgZnVsbEhvc3RuYW1lICE9IHVuZGVmaW5lZCA/IGZ1bGxIb3N0bmFtZS5zcGxpdCgnLicpWzBdIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29uZmlnTGV2ZWxzID0gW1xuICAgICAgJ2RlZmF1bHQnLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgZGVmYXVsdC0ke2luc3RhbmNlfWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkID8gW2Ake2RlcGxveW1lbnR9YF0gOiBbXSksXG4gICAgICAuLi4oaW5zdGFuY2UgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7c2hvcnRIb3N0bmFtZX1gXSA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihzaG9ydEhvc3RuYW1lICE9IHVuZGVmaW5lZCAmJiBkZXBsb3ltZW50ICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgJHtzaG9ydEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oc2hvcnRIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7c2hvcnRIb3N0bmFtZX0tJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgPyBbYCR7ZnVsbEhvc3RuYW1lfWBdIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiYgaW5zdGFuY2UgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtpbnN0YW5jZX1gXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihmdWxsSG9zdG5hbWUgIT0gdW5kZWZpbmVkICYmIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkXG4gICAgICAgID8gW2Ake2Z1bGxIb3N0bmFtZX0tJHtkZXBsb3ltZW50fWBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uKGZ1bGxIb3N0bmFtZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgIGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBpbnN0YW5jZSAhPSB1bmRlZmluZWRcbiAgICAgICAgPyBbYCR7ZnVsbEhvc3RuYW1lfS0ke2RlcGxveW1lbnR9LSR7aW5zdGFuY2V9YF1cbiAgICAgICAgOiBbXSksXG4gICAgICBgbG9jYWxgLFxuICAgICAgLi4uKGluc3RhbmNlICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtpbnN0YW5jZX1gXSA6IFtdKSxcbiAgICAgIC4uLihkZXBsb3ltZW50ICE9IHVuZGVmaW5lZCA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fWBdIDogW10pLFxuICAgICAgLi4uKGRlcGxveW1lbnQgIT0gdW5kZWZpbmVkICYmIGluc3RhbmNlICE9IHVuZGVmaW5lZFxuICAgICAgICA/IFtgbG9jYWwtJHtkZXBsb3ltZW50fS0ke2luc3RhbmNlfWBdXG4gICAgICAgIDogW10pLFxuICAgICAgJyROT0RFX0NPTkZJRycsXG4gICAgICAnY3VzdG9tLWVudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgXTtcblxuICAgIHJldHVybiBjb25maWdMZXZlbHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIGNvbmZpZyBvYmplY3QgYW5kIHdyaXRlcyBpdCB0byB0aGUgbm9kZS1jb25maWcgZmlsZVxuICAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXNzZWQgbGV2ZWxcbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjb25maWdPYmpcbiAgICogQHBhcmFtIHtJQ29uZmlnfSBjb25maWdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsIG91dHB1dCBub2RlLWNvbmZpZyBmaWxlIGxldmVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGVcbiAgICovXG4gIHZhbGlkYXRlQW5kV3JpdGVDb25maWcgPSAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25maWdPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY29uZmlnOiBJQ29uZmlnLFxuICAgIGxldmVsOiBzdHJpbmcsXG4gICAgZm9ybWF0OiBzdHJpbmcsXG4gICkgPT4ge1xuICAgIGNvbnN0IGNvbmZMZXZlbHMgPSBDb25maWdWYWxpZGF0b3IuZ2V0Tm9kZUNvbmZpZ0xldmVscyhjb25maWcpLmZpbHRlcihcbiAgICAgIChsKSA9PiBsICE9PSAnY3VzdG9tLWVudmlyb25tZW50LXZhcmlhYmxlcycsXG4gICAgKTtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gY29uZkxldmVscy5pbmRleE9mKGxldmVsKTtcbiAgICBpZiAobGV2ZWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBbJHtsZXZlbH1dIGxldmVsIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBzeXN0ZW0ncyBjb25maWd1cmF0aW9uIGxldmVsc2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ0RpciA9XG4gICAgICBwcm9jZXNzLmVudlsnTk9ERV9DT05GSUdfRElSJ10gIT0gdW5kZWZpbmVkXG4gICAgICAgID8gcHJvY2Vzcy5lbnZbJ05PREVfQ09ORklHX0RJUiddXG4gICAgICAgIDogJy4vY29uZmlnJztcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgbGV0IGV4dCA9ICcnO1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlICdqc29uJzoge1xuICAgICAgICBvdXRwdXQgPSBKc29uQmlnSW50LnN0cmluZ2lmeShjb25maWdPYmopO1xuICAgICAgICBleHQgPSAnanNvbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAneWFtbCc6IHtcbiAgICAgICAgb3V0cHV0ID0geWFtbC5kdW1wKGNvbmZpZ09iaik7XG4gICAgICAgIGV4dCA9ICd5YW1sJztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBgJHtsZXZlbH0uJHtleHR9YCk7XG4gICAgY29uc3QgYmFja3VwUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIGAke2xldmVsfS1iYWNrdXAuJHtleHR9YCk7XG4gICAgY29uc3QgY29uZkZpbGVFeGlzdHMgPSBmcy5leGlzdHNTeW5jKG91dHB1dFBhdGgpO1xuICAgIGlmIChjb25mRmlsZUV4aXN0cykge1xuICAgICAgZnMucmVuYW1lU3luYyhvdXRwdXRQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICB9XG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBvdXRwdXQpO1xuXG4gICAgY29uc3QgdXBkYXRlZENvbmZPYmogPSBjb25maWcudXRpbC5sb2FkRmlsZUNvbmZpZ3MoKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ29uZmlnKHVwZGF0ZWRDb25mT2JqKTtcbiAgICAgIGZzLnVubGlua1N5bmMoYmFja3VwUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZzLnVubGlua1N5bmMob3V0cHV0UGF0aCk7XG4gICAgICBpZiAoY29uZkZpbGVFeGlzdHMpIHtcbiAgICAgICAgZnMucmVuYW1lU3luYyhiYWNrdXBQYXRoLCBvdXRwdXRQYXRoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==