@libs-ui/components-preview-text-data 0.2.356-38 → 0.2.356-40

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.
@@ -36,7 +36,7 @@ export class LibsUiComponentsPreviewTextDataComponent {
36
36
  // PROTECTED SIGNALS
37
37
  // ==========================================================================
38
38
  isWrap = signal(true);
39
- configLoadDataIsHttpConfig = signal(httpRequestConfigGetOptionsLang(undefined));
39
+ configLoadDataIsHttpConfig = signal(httpRequestConfigGetOptionsLang());
40
40
  labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);
41
41
  acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));
42
42
  // ==========================================================================
@@ -268,7 +268,7 @@ export class LibsUiComponentsPreviewTextDataComponent {
268
268
  for (let lineNum = 1; lineNum <= doc.lines; lineNum++) {
269
269
  const line = doc.line(lineNum);
270
270
  const trimmed = line.text.trimEnd();
271
- const match = trimmed.match(/(\w+)\.\s*$/);
271
+ const match = /(\w+)\.\s*$/.exec(trimmed);
272
272
  if (!match)
273
273
  continue;
274
274
  trailingDotLines.add(lineNum);
@@ -318,9 +318,9 @@ export class LibsUiComponentsPreviewTextDataComponent {
318
318
  const prevToken = this.getTokenBefore(doc, node.from);
319
319
  if (!prevToken)
320
320
  return 'JavaScript syntax error';
321
- if (/\($/.test(prevToken))
321
+ if (prevToken.endsWith('('))
322
322
  return 'Missing closing ")"';
323
- if (/\[$/.test(prevToken))
323
+ if (prevToken.endsWith('['))
324
324
  return 'Missing closing "]"';
325
325
  if (/^function$/i.test(prevToken))
326
326
  return 'Expected function name or "("';
@@ -397,7 +397,7 @@ export class LibsUiComponentsPreviewTextDataComponent {
397
397
  if (/WHERE$/i.test(prevToken)) {
398
398
  return 'Expected condition after WHERE';
399
399
  }
400
- if (/\($/.test(prevToken)) {
400
+ if (prevToken.endsWith('(')) {
401
401
  return 'Missing closing ")"';
402
402
  }
403
403
  return `Unexpected end of SQL after "${prevToken}"`;
@@ -405,7 +405,7 @@ export class LibsUiComponentsPreviewTextDataComponent {
405
405
  getTokenBefore(doc, pos) {
406
406
  const start = Math.max(0, pos - 30);
407
407
  const text = doc.sliceString(start, pos);
408
- const match = text.match(/(\S+)\s*$/);
408
+ const match = /(\S+)\s*$/.exec(text);
409
409
  return match?.[1] ?? '';
410
410
  }
411
411
  /**
@@ -438,7 +438,8 @@ export class LibsUiComponentsPreviewTextDataComponent {
438
438
  buildPythonErrorMessage(doc, node) {
439
439
  if (node.from !== node.to) {
440
440
  const text = doc.sliceString(node.from, node.to).trim();
441
- return `Python syntax error${text ? ` near "${text}"` : ''}`;
441
+ const textSuffix = text ? ` near "${text}"` : '';
442
+ return `Python syntax error${textSuffix}`;
442
443
  }
443
444
  const prevToken = this.getTokenBefore(doc, node.from);
444
445
  if (!prevToken) {
@@ -462,11 +463,11 @@ export class LibsUiComponentsPreviewTextDataComponent {
462
463
  return 'Expected condition after "while"';
463
464
  if (/^for$/i.test(prevToken))
464
465
  return 'Expected variable after "for"';
465
- if (/\.$/.test(prevToken))
466
+ if (prevToken.endsWith('.'))
466
467
  return `Incomplete attribute access on "${prevToken.slice(0, -1)}"`;
467
- if (/\($/.test(prevToken))
468
+ if (prevToken.endsWith('('))
468
469
  return 'Missing closing ")"';
469
- if (/\[$/.test(prevToken))
470
+ if (prevToken.endsWith('['))
470
471
  return 'Missing closing "]"';
471
472
  return `Python syntax error near "${prevToken}"`;
472
473
  }
@@ -634,4 +635,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
634
635
  type: Component,
635
636
  args: [{ selector: 'libs_ui-components-preview_text_data', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent], template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"] }]
636
637
  }], ctorParameters: () => [] });
637
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBRSxjQUFjLEVBQXVDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQWEsSUFBSSxFQUFRLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFFdkUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWpHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFZdkksTUFBTSxPQUFPLHdDQUF3QztJQUNuRCw2RUFBNkU7SUFDN0UscUJBQXFCO0lBQ3JCLDZFQUE2RTtJQUVyRSxrQkFBa0IsQ0FBYztJQUN2QixlQUFlLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNwQyxtQkFBbUIsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLHFCQUFxQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDMUMsaUJBQWlCLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUN0QyxzQkFBc0IsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQzNDLG9CQUFvQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFbEQsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXhDLCtDQUErQztJQUM5QixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7SUFFOUQsb0RBQW9EO0lBQzVDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFOUIsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQiw2RUFBNkU7SUFFNUQsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDeEQsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCw2RUFBNkU7SUFDN0Usb0JBQW9CO0lBQ3BCLDZFQUE2RTtJQUUxRCxNQUFNLEdBQUcsTUFBTSxDQUFVLElBQUksQ0FBQyxDQUFDO0lBQy9CLDBCQUEwQixHQUFHLE1BQU0sQ0FBa0IsK0JBQStCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqRyxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkcsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEssNkVBQTZFO0lBQzdFLFNBQVM7SUFDVCw2RUFBNkU7SUFFcEUsT0FBTyxHQUFHLEtBQUssQ0FBNkIsRUFBRSxFQUFFO1FBQ3ZELFNBQVMsRUFBRSxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUU7S0FDM0MsQ0FBQyxDQUFDO0lBRU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQXNDLENBQUM7SUFDcEUsV0FBVyxHQUFHLEtBQUssRUFBeUQsQ0FBQztJQUM3RSxnQkFBZ0IsR0FBRyxLQUFLLEVBQWdDLENBQUM7SUFFekQsUUFBUSxHQUFHLEtBQUssQ0FBK0IsS0FBSyxFQUFFO1FBQzdELFNBQVMsRUFBRSxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLEtBQUs7S0FDL0MsQ0FBQyxDQUFDO0lBRU0sWUFBWSxHQUFHLEtBQUssQ0FBK0IsS0FBSyxFQUFFO1FBQ2pFLFNBQVMsRUFBRSxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLEtBQUs7S0FDL0MsQ0FBQyxDQUFDO0lBRU0sa0JBQWtCLEdBQUcsS0FBSyxDQUEyQyxDQUFDLDhDQUE4QyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsRUFBRTtRQUNyTCxTQUFTLEVBQUUsQ0FBQyxLQUFxQixFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyw4Q0FBOEMsRUFBRSx5QkFBeUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDO0tBQ3ZKLENBQUMsQ0FBQztJQUVIOzs7OztPQUtHO0lBQ00sV0FBVyxHQUFHLEtBQUssQ0FBaUYsRUFBRSxFQUFFO1FBQy9HLFNBQVMsRUFBRSxDQUFDLEtBQXdDLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFO0tBQ3JFLENBQUMsQ0FBQztJQUVIOzs7Ozs7O09BT0c7SUFDTSxpQkFBaUIsR0FBRyxLQUFLLENBQXlELEVBQUUsRUFBRTtRQUM3RixTQUFTLEVBQUUsQ0FBQyxLQUE0QixFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRTtLQUN6RCxDQUFDLENBQUM7SUFFTSxVQUFVLEdBQUcsS0FBSyxDQUE2QixTQUFTLEVBQUU7UUFDakUsU0FBUyxFQUFFLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksU0FBUztLQUNsRCxDQUFDLENBQUM7SUFFSCw2RUFBNkU7SUFDN0UsVUFBVTtJQUNWLDZFQUE2RTtJQUVwRSxTQUFTLEdBQUcsTUFBTSxFQUEwQixDQUFDO0lBQzdDLFlBQVksR0FBRyxNQUFNLEVBQWdCLENBQUM7SUFDdEMsYUFBYSxHQUFHLE1BQU0sRUFBK0IsQ0FBQztJQUUvRCw2RUFBNkU7SUFDN0UsZ0JBQWdCO0lBQ2hCLDZFQUE2RTtJQUU1RCxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUE2QixrQkFBa0IsQ0FBQyxDQUFDO0lBRXZHLDZFQUE2RTtJQUM3RSw4QkFBOEI7SUFDOUIsNkVBQTZFO0lBRTdFO1FBQ0UsNkNBQTZDO1FBQzdDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDcEUsSUFBSSxVQUFVLEtBQUssY0FBYyxFQUFFLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7d0JBQy9CLE9BQU8sRUFBRTs0QkFDUCxJQUFJLEVBQUUsQ0FBQzs0QkFDUCxFQUFFLEVBQUUsY0FBYyxDQUFDLE1BQU07NEJBQ3pCLE1BQU0sRUFBRSxVQUFVO3lCQUNuQjtxQkFDRixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILDJEQUEyRDtRQUMzRCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQjtnQkFBRSxPQUFPO1lBQzVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7Z0JBQy9CLE9BQU8sRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzNHLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsMkRBQTJEO1FBQzNELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0I7Z0JBQUUsT0FBTztZQUM1RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDO2dCQUMvQixPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUM5RyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLGtCQUFrQjtJQUNsQiw2RUFBNkU7SUFFN0UsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ25CLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSwwQ0FBMEM7SUFDMUMsNkVBQTZFO0lBRTdFOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxnQkFBZ0I7UUFDNUIsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNoRixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUU1RSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxVQUFVLENBQUM7WUFDdkMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGFBQWE7WUFDN0MsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUM7U0FDdEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsaUJBQTRCLEVBQUUsZUFBMEI7UUFDL0UsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDakQsT0FBTztZQUNMLFVBQVU7WUFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1lBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQzFDLDRGQUE0RjtZQUM1RixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEksSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7WUFDaEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxVQUFVLEVBQUU7WUFDWixJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1NBQzVCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQXdDO1FBQzFFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztRQUU3RixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0MsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQXdDO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN6QixPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCw2RUFBNkU7SUFDN0Usd0NBQXdDO0lBQ3hDLDZFQUE2RTtJQUVyRSxnQkFBZ0I7UUFDdEIsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ3RCLEdBQUcsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUMxRCxhQUFhLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFO1lBQ3JDLGdCQUFnQixFQUFFLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRTtTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztZQUN0QixxQkFBcUIsRUFBRTtnQkFDckIsZUFBZSxFQUFFLDJCQUEyQjtnQkFDNUMsTUFBTSxFQUFFLG9DQUFvQztnQkFDNUMsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFVBQVUsRUFBRSxlQUFlO2FBQzVCO1lBQ0Qsd0JBQXdCLEVBQUU7Z0JBQ3hCLGVBQWUsRUFBRSwyQkFBMkI7Z0JBQzVDLE1BQU0sRUFBRSxvQ0FBb0M7Z0JBQzVDLFlBQVksRUFBRSxLQUFLO2FBQ3BCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxvQ0FBb0M7SUFDcEMsNkVBQTZFO0lBRXJFLG9CQUFvQjtRQUMxQixPQUFPLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBa0IsRUFBRSxFQUFFO1lBQ3pELElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUNsQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQzdCLGFBQWEsRUFBRSxTQUFTO2lCQUN6QixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDJEQUEyRDtJQUMzRCw2RUFBNkU7SUFFN0U7Ozs7T0FJRztJQUNILGNBQWM7UUFDWixPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JCLE1BQU0sV0FBVyxHQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFFM0Isc0ZBQXNGO1lBQ3RGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUMzQyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsS0FBSztvQkFBRSxTQUFTO2dCQUVyQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEQsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDZixJQUFJLEVBQUUsTUFBTTtvQkFDWixFQUFFLEVBQUUsTUFBTSxHQUFHLENBQUM7b0JBQ2QsUUFBUSxFQUFFLE9BQU87b0JBQ2pCLE9BQU8sRUFBRSxrQ0FBa0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHO2lCQUN2RCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQseUZBQXlGO1lBQ3pGLHdDQUF3QztZQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBQ3ZDLEtBQUssTUFBTSxPQUFPLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsQ0FBQztZQUNILENBQUM7WUFFRCxpRkFBaUY7WUFDakYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNYLEtBQUssRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTzt3QkFBRSxPQUFPO29CQUMvQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7d0JBQUUsT0FBTyxDQUFDLDRDQUE0QztvQkFFL0UsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNsRCxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO3dCQUFFLE9BQU87b0JBRTNDLFdBQVcsQ0FBQyxJQUFJLENBQUM7d0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNmLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQzt3QkFDakMsUUFBUSxFQUFFLE9BQU87d0JBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztxQkFDN0MsQ0FBQyxDQUFDO2dCQUNMLENBQUM7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwQyxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxHQUFTLEVBQUUsSUFBbUI7UUFDeEQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxJQUFJLElBQUk7WUFBRSxPQUFPLGlDQUFpQyxJQUFJLEdBQUcsQ0FBQztRQUUxRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLHlCQUF5QixDQUFDO1FBQ2pELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLHFCQUFxQixDQUFDO1FBQ3hELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLHFCQUFxQixDQUFDO1FBQ3hELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLCtCQUErQixDQUFDO1FBQzFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLG1DQUFtQyxDQUFDO1FBQzVFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLG1DQUFtQyxDQUFDO1FBQ3ZFLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sd0JBQXdCLENBQUM7UUFFNUUsT0FBTyxpQ0FBaUMsU0FBUyxHQUFHLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQWlCLEVBQUUsQ0FBQztZQUVyQyxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztnQkFDdEIsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDZixJQUFJLEVBQUUsQ0FBQztvQkFDUCxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ2YsUUFBUSxFQUFFLE9BQU87b0JBQ2pCLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUM7aUJBQ2pDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwQyxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JCLE1BQU0sV0FBVyxHQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNYLEtBQUssRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTzt3QkFBRSxPQUFPO29CQUUvQixXQUFXLENBQUMsSUFBSSxDQUFDO3dCQUNmLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzt3QkFDaEMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNiLFFBQVEsRUFBRSxPQUFPO3dCQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7cUJBQzlDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEMsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsR0FBUyxFQUFFLElBQW1CO1FBQ3pELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxPQUFPLDBCQUEwQixJQUFJLEdBQUcsQ0FBQztRQUMzQyxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sNENBQTRDLENBQUM7UUFDdEQsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sZ0NBQWdDLENBQUM7UUFDMUMsQ0FBQztRQUVELElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sbUNBQW1DLENBQUM7UUFDN0MsQ0FBQztRQUVELElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sZ0NBQWdDLENBQUM7UUFDMUMsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzFCLE9BQU8scUJBQXFCLENBQUM7UUFDL0IsQ0FBQztRQUVELE9BQU8sZ0NBQWdDLFNBQVMsR0FBRyxDQUFDO0lBQ3RELENBQUM7SUFFTyxjQUFjLENBQUMsR0FBUyxFQUFFLEdBQVc7UUFDM0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3JCLE1BQU0sV0FBVyxHQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNYLEtBQUssRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtvQkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTzt3QkFBRSxPQUFPO29CQUUvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN4QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUUzRCxXQUFXLENBQUMsSUFBSSxDQUFDO3dCQUNmLElBQUk7d0JBQ0osRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUM7d0JBQzVCLFFBQVEsRUFBRSxPQUFPO3dCQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7cUJBQ2pELENBQUMsQ0FBQztnQkFDTCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEMsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsR0FBUyxFQUFFLElBQW1CO1FBQzVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4RCxPQUFPLHNCQUFzQixJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9ELENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxxQkFBcUIsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sb0NBQW9DLENBQUM7UUFDMUUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sbUNBQW1DLENBQUM7UUFDM0UsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sbUNBQW1DLENBQUM7UUFDNUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8scUNBQXFDLENBQUM7UUFDOUUsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sbUNBQW1DLENBQUM7UUFDMUUsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sK0JBQStCLENBQUM7UUFDcEUsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8saUNBQWlDLENBQUM7UUFDeEUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sa0NBQWtDLENBQUM7UUFDMUUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sK0JBQStCLENBQUM7UUFDckUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sbUNBQW1DLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMvRixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxxQkFBcUIsQ0FBQztRQUN4RCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxxQkFBcUIsQ0FBQztRQUV4RCxPQUFPLDZCQUE2QixTQUFTLEdBQUcsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx3QkFBd0IsQ0FBQyxLQUF1QztRQUN0RSxNQUFNLGdCQUFnQixHQUFHLENBQUMsT0FBMEIsRUFBMkIsRUFBRTtZQUMvRSxnRUFBZ0U7WUFDaEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRCxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBQ3pELElBQUksTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDL0IsT0FBTzt3QkFDTCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQzt3QkFDaEMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzRCQUNyQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7NEJBQ2QsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksVUFBVTs0QkFDMUIsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRTs0QkFDdEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRTt5QkFDbkIsQ0FBQyxDQUFDO3FCQUNKLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCx1REFBdUQ7WUFDdkQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztZQUV2RSxPQUFPO2dCQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO29CQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxVQUFVO29CQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFO29CQUN6QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO2lCQUN0QixDQUFDLENBQUM7YUFDSixDQUFDO1FBQ0osQ0FBQyxDQUFDO1FBRUYsT0FBTyxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHVCQUF1QixDQUFDLFFBQThCO1FBQzVELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBcUIsRUFBVSxFQUFFO1lBQ3RELElBQUksQ0FBQyxZQUFZLE1BQU0sRUFBRSxDQUFDO2dCQUN4QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUM7Z0JBQzlELE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3RDLE1BQU0sV0FBVyxHQUFpQixFQUFFLENBQUM7WUFDckMsTUFBTSxVQUFVLEdBQWdDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXBDLHVFQUF1RTtZQUN2RSxNQUFNLGFBQWEsR0FBbUMsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ1gsS0FBSyxFQUFFLENBQUMsSUFBbUIsRUFBRSxFQUFFO29CQUM3QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUNyRCxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUN2RCxDQUFDO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQVcsRUFBRSxDQUN4RCxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRTFELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksS0FBNkIsQ0FBQztnQkFFbEMsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3hDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7b0JBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUVsQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUFFLFNBQVM7b0JBRXBDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7b0JBQ2hELE1BQU0sWUFBWSxHQUFHLE9BQU8sWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFFMUUsV0FBVyxDQUFDLElBQUksQ0FBQzt3QkFDZixJQUFJO3dCQUNKLEVBQUU7d0JBQ0YsUUFBUSxFQUFFLE9BQU87d0JBQ2pCLE9BQU8sRUFBRSxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO3FCQUNqRSxDQUFDLENBQUM7b0JBRUgsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hGLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEMsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCw0REFBNEQ7UUFDNUQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQWUsRUFBRSxFQUFFO1lBQ3ZFLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUVoRixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbEMsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7WUFDNUQsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxXQUFXLENBQUMsR0FBVztRQUM3QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxxQ0FBcUM7SUFDckMsNkVBQTZFO0lBRW5FLFdBQVc7UUFDbkIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFUyxlQUFlO1FBQ3ZCLDBEQUEwRDtRQUMxRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDM0UsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDeEgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEMsSUFBSSxjQUFjLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQztnQkFDaEMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFO2FBQ3hFLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQztZQUNoQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEssQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFxQjtRQUNwRCxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBeUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQiw4QkFBOEI7UUFDOUIsTUFBTSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpJLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDO1lBQ2hDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3hILENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDN0IsYUFBYSxFQUFFLFVBQVU7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F0ckJVLHdDQUF3Qzs0RkFBeEMsd0NBQXdDLGd3REN6QnJELHE0REF5Q0EsbzNCRGxCWSxpQ0FBaUMsdTNEQUFFLHNDQUFzQzs7NEZBRXhFLHdDQUF3QztrQkFUcEQsU0FBUzsrQkFFRSxzQ0FBc0MsY0FHcEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsaUNBQWlDLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhdXRvY29tcGxldGlvbiwgQ29tcGxldGlvbkNvbnRleHQsIENvbXBsZXRpb25SZXN1bHQgfSBmcm9tICdAY29kZW1pcnJvci9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgc3ludGF4VHJlZSB9IGZyb20gJ0Bjb2RlbWlycm9yL2xhbmd1YWdlJztcbmltcG9ydCB7IERpYWdub3N0aWMsIGxpbnRlciwgbGludEd1dHRlciB9IGZyb20gJ0Bjb2RlbWlycm9yL2xpbnQnO1xuaW1wb3J0IHsgQ29tcGFydG1lbnQsIEVkaXRvclN0YXRlLCBFeHRlbnNpb24sIFByZWMsIFRleHQsIFRyYW5zYWN0aW9uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldywgbGluZU51bWJlcnMsIFZpZXdVcGRhdGUgfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB0eXBlIHsgU3ludGF4Tm9kZVJlZiB9IGZyb20gJ0BsZXplci9jb21tb24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IGdldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IGJhc2ljU2V0dXAgfSBmcm9tICdjb2RlbWlycm9yNic7XG5pbXBvcnQgeyBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UsIGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcsIGxhbmd1YWdlUmVnaXN0cnksIG9wdGlvbnNMYW5nRGF0YSB9IGZyb20gJy4vcHJldmlldy10ZXh0LWRhdGEuZGVmaW5lJztcbmltcG9ydCB7IElMYW5ndWFnZU9wdGlvbnMsIElQcmV2aWV3VGV4dERhdGFDaGFuZ2UsIElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbSwgSVByZXZpZXdUZXh0RGF0YVZpb2xhdGlvbiwgUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCwgVF9Gb3JiaWRkZW5QYXR0ZXJuIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXByZXZpZXdfdGV4dF9kYXRhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1ByZXZpZXdUZXh0RGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZWRpdG9yVmlld0luc3RhbmNlPzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSByZWFkb25seSB3cmFwQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYW5ndWFnZUNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGluZU51bWJlckNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGludGVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wbGV0aW9uc0NvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9yYmlkZGVuQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuICBwcml2YXRlIGNvbnRlbnRTdGF0ZU5vV3JhcCA9IHNpZ25hbCgnJyk7XG5cbiAgLyoqIENhY2hlIMSR4buDIHRyw6FuaCBsb2FkIGzhuqFpIGxhbmd1YWdlIMSRw6MgbG9hZCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5zaW9uPigpO1xuXG4gIC8qKiBGbGFnIMSR4buDIHRyw6FuaCB1cGRhdGUgZWRpdG9yIGtoaSDEkWFuZyBraOG7n2kgdOG6oW8gKi9cbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5KRUNURUQgU0VSVklDRVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTGlic1VpTm90aWZpY2F0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgU0lHTkFMU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBpc1dyYXAgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb25maWdMb2FkRGF0YUlzSHR0cENvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0+KGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcodW5kZWZpbmVkKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBsYWJlbExhbmcgPSBjb21wdXRlZCgoKSA9PiBvcHRpb25zTGFuZ0RhdGEuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gdGhpcy5sYW5nU2VsZWN0ZWQoKSk/LmxhYmVsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFjY2VwdENoYW5nZUxhbmcgPSBjb21wdXRlZCgoKSA9PiAhKHRoaXMubGFuZ1NlbGVjdGVkKCkgJiYgdGhpcy5sYW5nc0FjY2VwdCgpPy5sZW5ndGggPT09IDEgJiYgdGhpcy5sYW5nc0FjY2VwdCgpPy5pbmNsdWRlcyh0aGlzLmxhbmdTZWxlY3RlZCgpKSkpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElOUFVUU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IGNvbnRlbnQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJycsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGxhbmdTZWxlY3RlZCA9IG1vZGVsLnJlcXVpcmVkPFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ+KCk7XG4gIHJlYWRvbmx5IGxhbmdzQWNjZXB0ID0gaW5wdXQ8QXJyYXk8UFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVD4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGxhbmdzQ2hhbmdlTGFiZWwgPSBpbnB1dDxJTGFuZ3VhZ2VPcHRpb25zIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGVkaXRhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IGJvb2xlYW4pID0+IHZhbHVlID8/IGZhbHNlLFxuICB9KTtcblxuICByZWFkb25seSBoaWRkZW5BY3Rpb24gPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGxpbnRJZ25vcmVQYXR0ZXJucyA9IGlucHV0PEFycmF5PHN0cmluZz4sIEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQ+KFsnQ2Fubm90IHVzZSBpbXBvcnQgc3RhdGVtZW50IG91dHNpZGUgYSBtb2R1bGUnLCAnVW5leHBlY3RlZCB0b2tlbiBleHBvcnQnLCAnaW1wb3J0ICcsICdAYW5ndWxhci9jb3JlJ10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IEFycmF5PHN0cmluZz4pID0+IHZhbHVlID8/IFsnQ2Fubm90IHVzZSBpbXBvcnQgc3RhdGVtZW50IG91dHNpZGUgYSBtb2R1bGUnLCAnVW5leHBlY3RlZCB0b2tlbiBleHBvcnQnLCAnaW1wb3J0ICcsICdAYW5ndWxhci9jb3JlJ10sXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEYW5oIHPDoWNoIMSR4buRaSB0xrDhu6NuZy9iaeG6v24gZ+G7o2kgw70ga2hpIGfDtSDigJQgZ2nhu5FuZyBJbnRlbGxpU2Vuc2UgdHJvbmcgSURFLlxuICAgKiBI4buXIHRy4bujIGRvdC1ub3RhdGlvbjogxJHhu4tuaCBuZ2jEqWEgYHByb3BlcnRpZXNgIMSR4buDIGfhu6NpIMO9IHNhdSBk4bqldSBgLmBcbiAgICogQGV4YW1wbGVcbiAgICogW2NvbXBsZXRpb25zXT1cIlt7IGxhYmVsOiAndXNlcicsIHByb3BlcnRpZXM6IFt7IGxhYmVsOiAnbmFtZScsIGRldGFpbDogJ3N0cmluZycgfV0gfV1cIlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGxldGlvbnMgPSBpbnB1dDxJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSwgSVByZXZpZXdUZXh0RGF0YUNvbXBsZXRpb25JdGVtW10gfCB1bmRlZmluZWQ+KFtdLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSkgPT4gdmFsdWUgPz8gW10sXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEYW5oIHPDoWNoIHBhdHRlcm4gY+G6pW0g4oCUIGNodeG7l2kgbGl0ZXJhbCBob+G6t2MgUmVnRXhwLlxuICAgKiBLaGkgcGjDoXQgaGnhu4duIHZpIHBo4bqhbTogaGlnaGxpZ2h0IMSR4buPIHThuqFpIMSRw7puZyB24buLIHRyw60gKyBjaOG6t24gcGFzdGUgKyBlbWl0IGAob3V0VmlvbGF0aW9ucylgLlxuICAgKiBEw7luZyBgREVGQVVMVF9TRUNVUklUWV9QQVRURVJOU2AgxJHhu4Mgw6FwIGThu6VuZyBi4buZIHF1eSB04bqvYyBi4bqjbyBt4bqtdCBt4bq3YyDEkeG7i25oIGNobyBsb3ctY29kZS5cbiAgICogQGV4YW1wbGVcbiAgICogW2ZvcmJpZGRlblBhdHRlcm5zXT1cImRlZmF1bHRTZWN1cml0eVBhdHRlcm5zXCJcbiAgICogW2ZvcmJpZGRlblBhdHRlcm5zXT1cIlsvZXZhbFxccypcXCgvLCAnbG9jYWxTdG9yYWdlJ11cIlxuICAgKi9cbiAgcmVhZG9ubHkgZm9yYmlkZGVuUGF0dGVybnMgPSBpbnB1dDxUX0ZvcmJpZGRlblBhdHRlcm5bXSwgVF9Gb3JiaWRkZW5QYXR0ZXJuW10gfCB1bmRlZmluZWQ+KFtdLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBUX0ZvcmJpZGRlblBhdHRlcm5bXSkgPT4gdmFsdWUgPz8gW10sXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJhY2tncm91bmQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJyNmOGY5ZmEnLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBzdHJpbmcpID0+IHZhbHVlID8/ICcjZjhmOWZhJyxcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT1VUUFVUU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IG91dENoYW5nZSA9IG91dHB1dDxJUHJldmlld1RleHREYXRhQ2hhbmdlPigpO1xuICByZWFkb25seSBzeW50YXhFcnJvcnMgPSBvdXRwdXQ8RGlhZ25vc3RpY1tdPigpO1xuICByZWFkb25seSBvdXRWaW9sYXRpb25zID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFWaW9sYXRpb25bXT4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWSUVXIENISUxEUkVOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJQcmV2aWV3ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyUHJldmlldycpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENPTlNUUlVDVE9SIC0gU2V0dXAgZWZmZWN0c1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEVmZmVjdCDEkeG7gyBzeW5jIGNvbnRlbnQgdOG7qyBpbnB1dCB2w6BvIGVkaXRvclxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2Uuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjdXJyZW50Q29udGVudCkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIGNoYW5nZXM6IHtcbiAgICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgICAgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCxcbiAgICAgICAgICAgICAgaW5zZXJ0OiBuZXdDb250ZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRWZmZWN0IMSR4buDIGPhuq1wIG5o4bqtdCBjdXN0b20gY29tcGxldGlvbnMga2hpIGlucHV0IHRoYXkgxJHhu5VpXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5jb21wbGV0aW9ucygpO1xuICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuZWRpdG9yVmlld0luc3RhbmNlKSByZXR1cm47XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5kaXNwYXRjaCh7XG4gICAgICAgIGVmZmVjdHM6IHRoaXMuY29tcGxldGlvbnNDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShpdGVtcy5sZW5ndGggPyB0aGlzLmJ1aWxkQ29tcGxldGlvbkV4dGVuc2lvbihpdGVtcykgOiBbXSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEVmZmVjdCDEkeG7gyBj4bqtcCBuaOG6rXQgZm9yYmlkZGVuIHBhdHRlcm5zIGtoaSBpbnB1dCB0aGF5IMSR4buVaVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuZm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkIHx8ICF0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSkgcmV0dXJuO1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICBlZmZlY3RzOiB0aGlzLmZvcmJpZGRlbkNvbXBhcnRtZW50LnJlY29uZmlndXJlKHBhdHRlcm5zLmxlbmd0aCA/IHRoaXMuYnVpbGRGb3JiaWRkZW5FeHRlbnNpb24ocGF0dGVybnMpIDogW10pLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbnVwIGtoaSBjb21wb25lbnQgYuG7iyBkZXN0cm95XG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5sYW5ndWFnZUNhY2hlLmNsZWFyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMSUZFQ1lDTEUgSE9PS1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYW5nc0FjY2VwdCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcuc2V0KGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcodGhpcy5sYW5nc0FjY2VwdCgpLCB0aGlzLmxhbmdzQ2hhbmdlTGFiZWwoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVFZGl0b3IoKTtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gRWRpdG9yIGluaXRpYWxpemF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEto4bufaSB04bqhbyBlZGl0b3IgduG7m2kgY8OhYyBleHRlbnNpb25zIGPGoSBi4bqjblxuICAgKiBMYW5ndWFnZSDEkcaw4bujYyBsb2FkIGFzeW5jIMSR4buDIHThu5FpIMawdSBidW5kbGUgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplRWRpdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhbmd1YWdlRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGFuZ3VhZ2VFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGludGVyRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UgPSBuZXcgRWRpdG9yVmlldyh7XG4gICAgICBkb2M6IHRoaXMuY29udGVudCgpLFxuICAgICAgcGFyZW50OiB0aGlzLmNvbnRhaW5lclByZXZpZXcoKS5uYXRpdmVFbGVtZW50LFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5jcmVhdGVFeHRlbnNpb25zKGxhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb24pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIGRhbmggc8OhY2ggZXh0ZW5zaW9ucyBjaG8gZWRpdG9yXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb246IEV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uOiBFeHRlbnNpb24pOiBFeHRlbnNpb25bXSB7XG4gICAgY29uc3QgaW5pdGlhbENvbXBsZXRpb25zID0gdGhpcy5jb21wbGV0aW9ucygpO1xuICAgIGNvbnN0IGluaXRpYWxQYXR0ZXJucyA9IHRoaXMuZm9yYmlkZGVuUGF0dGVybnMoKTtcbiAgICByZXR1cm4gW1xuICAgICAgYmFzaWNTZXR1cCxcbiAgICAgIHRoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5vZihsYW5ndWFnZUV4dGVuc2lvbiksXG4gICAgICB0aGlzLmxpbnRlckNvbXBhcnRtZW50Lm9mKGxpbnRlckV4dGVuc2lvbiksXG4gICAgICAvLyBDb21wYXJ0bWVudCBjaG8gY3VzdG9tIGNvbXBsZXRpb25zIOKAlCBQcmVjLmhpZ2hlc3QgxJHhu4Mgb3ZlcnJpZGUgYmFzaWNTZXR1cCdzIGF1dG9jb21wbGV0aW9uXG4gICAgICBQcmVjLmhpZ2hlc3QodGhpcy5jb21wbGV0aW9uc0NvbXBhcnRtZW50Lm9mKGluaXRpYWxDb21wbGV0aW9ucy5sZW5ndGggPyB0aGlzLmJ1aWxkQ29tcGxldGlvbkV4dGVuc2lvbihpbml0aWFsQ29tcGxldGlvbnMpIDogW10pKSxcbiAgICAgIHRoaXMuZm9yYmlkZGVuQ29tcGFydG1lbnQub2YoaW5pdGlhbFBhdHRlcm5zLmxlbmd0aCA/IHRoaXMuYnVpbGRGb3JiaWRkZW5FeHRlbnNpb24oaW5pdGlhbFBhdHRlcm5zKSA6IFtdKSxcbiAgICAgIHRoaXMuY3JlYXRlTGlnaHRUaGVtZSgpLFxuICAgICAgRWRpdG9yVmlldy5lZGl0YWJsZS5vZih0aGlzLmVkaXRhYmxlKCkpLFxuICAgICAgdGhpcy53cmFwQ29tcGFydG1lbnQub2YoRWRpdG9yVmlldy5saW5lV3JhcHBpbmcpLFxuICAgICAgdGhpcy5saW5lTnVtYmVyQ29tcGFydG1lbnQub2YobGluZU51bWJlcnMoKSksXG4gICAgICBsaW50R3V0dGVyKCksXG4gICAgICB0aGlzLmNyZWF0ZUJyYWNrZXRUaGVtZSgpLFxuICAgICAgdGhpcy5jcmVhdGVVcGRhdGVMaXN0ZW5lcigpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsYW5ndWFnZSBleHRlbnNpb24gduG7m2kgY2FjaGluZ1xuICAgKiBN4buXaSBsYW5ndWFnZSBjaOG7iSDEkcaw4bujYyBsb2FkIDEgbOG6p25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZExhbmd1YWdlRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubGFuZ3VhZ2VDYWNoZS5nZXQobG93ZXJMYW5nKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gcmVnaXN0cnlJdGVtID8gYXdhaXQgcmVnaXN0cnlJdGVtLmxvYWRlcigpIDogYXdhaXQgY3JlYXRlRGVmYXVsdExhbmd1YWdlKCk7XG5cbiAgICB0aGlzLmxhbmd1YWdlQ2FjaGUuc2V0KGxvd2VyTGFuZywgZXh0ZW5zaW9uKTtcbiAgICByZXR1cm4gZXh0ZW5zaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbGludGVyIGV4dGVuc2lvbiBu4bq/dSBjw7NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZExpbnRlckV4dGVuc2lvbihsYW5nOiBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUKTogUHJvbWlzZTxFeHRlbnNpb24+IHtcbiAgICBjb25zdCBsb3dlckxhbmcgPSBsYW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgcmVnaXN0cnlJdGVtID0gbGFuZ3VhZ2VSZWdpc3RyeVtsb3dlckxhbmddO1xuXG4gICAgaWYgKHJlZ2lzdHJ5SXRlbT8ubGludGVyKSB7XG4gICAgICByZXR1cm4gcmVnaXN0cnlJdGVtLmxpbnRlcih0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGludGVyKCgpID0+IFtdKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgTUVUSE9EUyAtIFRoZW1lIGNvbmZpZ3VyYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZUxpZ2h0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnJic6IHsgYmFja2dyb3VuZENvbG9yOiB0aGlzLmJhY2tncm91bmQoKSwgY29sb3I6ICcjMzMzJyB9LFxuICAgICAgJy5jbS1jb250ZW50JzogeyBjYXJldENvbG9yOiAnIzExMScgfSxcbiAgICAgICcuY20tYWN0aXZlTGluZSc6IHsgYmFja2dyb3VuZENvbG9yOiAnI2YwZjBmMCcgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnJhY2tldFRoZW1lKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudGhlbWUoe1xuICAgICAgJy5jbS1tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMTAwLCAyMDAsIDI1NSwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgxMDAsIDIwMCwgMjU1LCAwLjQpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwLjJzIGVhc2UnLFxuICAgICAgfSxcbiAgICAgICcuY20tbm9ubWF0Y2hpbmdCcmFja2V0Jzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDI1NSwgMTAwLCAxMDAsIDAuMTUpJyxcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHJnYmEoMjU1LCAxMDAsIDEwMCwgMC4zKScsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVXBkYXRlIGxpc3RlbmVyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVMaXN0ZW5lcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyLm9mKCh1cGRhdGU6IFZpZXdVcGRhdGUpID0+IHtcbiAgICAgIGlmICh1cGRhdGUuZG9jQ2hhbmdlZCAmJiB0aGlzLmVkaXRhYmxlKCkpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB1cGRhdGUuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoe1xuICAgICAgICAgIGNvbnRlbnQ6IG5ld1ZhbHVlLFxuICAgICAgICAgIGlzV3JhcDogIXRoaXMuaXNXcmFwKCksXG4gICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICAgICAgY29udGV4dENoYW5nZTogJ2NvbnRlbnQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBVQkxJQyBNRVRIT0RTIC0gTGludGVyIGZhY3RvcmllcyAoxJHGsOG7o2MgZ+G7jWkgdOG7qyByZWdpc3RyeSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVOG6oW8gSmF2YVNjcmlwdCBsaW50ZXIgduG7m2kgMi1wYXNzIGRldGVjdGlvbjpcbiAgICogMS4gVGV4dC1iYXNlZCBzY2FuIGNobyB0cmFpbGluZyBkb3QgKHBhcnNlciB0aMaw4budbmcgxJHhurd0IGVycm9yIG5vZGUgc2FpIHbhu4sgdHLDrSB24bubaSBwYXR0ZXJuIG7DoHkpXG4gICAqIDIuIHN5bnRheFRyZWUgY2hvIGPDoWMgbOG7l2kgdGjhu7FjIHPhu7Ega2jDoWMsIGLhu48gcXVhIHbDuW5nIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgdHJhaWxpbmcgZG90XG4gICAqL1xuICBjcmVhdGVKc0xpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuXG4gICAgICAvLyBQYXNzIDE6IFRleHQtYmFzZWQgdHJhaWxpbmcgZG90IGRldGVjdGlvbiDigJQgxJHhurd0IGRpYWdub3N0aWMgxJHDum5nIHThuqFpIHbhu4sgdHLDrSBk4bqldSBjaOG6pW1cbiAgICAgIGNvbnN0IHRyYWlsaW5nRG90TGluZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgIGZvciAobGV0IGxpbmVOdW0gPSAxOyBsaW5lTnVtIDw9IGRvYy5saW5lczsgbGluZU51bSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBkb2MubGluZShsaW5lTnVtKTtcbiAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudGV4dC50cmltRW5kKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaCgvKFxcdyspXFwuXFxzKiQvKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgICAgdHJhaWxpbmdEb3RMaW5lcy5hZGQobGluZU51bSk7XG4gICAgICAgIGNvbnN0IGRvdFBvcyA9IGxpbmUuZnJvbSArIHRyaW1tZWQubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgZnJvbTogZG90UG9zLFxuICAgICAgICAgIHRvOiBkb3RQb3MgKyAxLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGBJbmNvbXBsZXRlIHByb3BlcnR5IGFjY2VzcyBvbiBcIiR7bWF0Y2hbMV19XCJgLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gxJDDoW5oIGThuqV1IGPDoWMgZMOybmcgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSB0cmFpbGluZyBkb3QgKHRyYWlsaW5nLWRvdCBsaW5lICsgNCBkw7JuZyB0aeG6v3AgdGhlbylcbiAgICAgIC8vIMSR4buDIGzhu41jIGNhc2NhZGluZyBlcnJvcnMgdOG7qyBzeW50YXhUcmVlXG4gICAgICBjb25zdCB0YWludGVkTGluZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgIGZvciAoY29uc3QgbGluZU51bSBvZiB0cmFpbGluZ0RvdExpbmVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBsaW5lTnVtOyBpIDw9IE1hdGgubWluKGxpbmVOdW0gKyA0LCBkb2MubGluZXMpOyBpKyspIHtcbiAgICAgICAgICB0YWludGVkTGluZXMuYWRkKGkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgMjogc3ludGF4VHJlZSBjaG8gY8OhYyBs4buXaSBraMOhYyAoY2jhu4kgbm9uLWVtcHR5IHJhbmdlLCBi4buPIHF1YSB2w7luZyB0YWludGVkKVxuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG4gICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICBlbnRlcjogKG5vZGU6IFN5bnRheE5vZGVSZWYpID0+IHtcbiAgICAgICAgICBpZiAoIW5vZGUudHlwZS5pc0Vycm9yKSByZXR1cm47XG4gICAgICAgICAgaWYgKG5vZGUuZnJvbSA9PT0gbm9kZS50bykgcmV0dXJuOyAvLyBC4buPIHF1YSBlbXB0eS1yYW5nZSBub2RlIChjYXNjYWRpbmcgZXJyb3IpXG5cbiAgICAgICAgICBjb25zdCBlcnJvckxpbmVOdW0gPSBkb2MubGluZUF0KG5vZGUuZnJvbSkubnVtYmVyO1xuICAgICAgICAgIGlmICh0YWludGVkTGluZXMuaGFzKGVycm9yTGluZU51bSkpIHJldHVybjtcblxuICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogbm9kZS5mcm9tLFxuICAgICAgICAgICAgdG86IE1hdGgubWluKG5vZGUudG8sIGRvYy5sZW5ndGgpLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmJ1aWxkSnNFcnJvck1lc3NhZ2UoZG9jLCBub2RlKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRKc0Vycm9yTWVzc2FnZShkb2M6IFRleHQsIG5vZGU6IFN5bnRheE5vZGVSZWYpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRleHQgPSBkb2Muc2xpY2VTdHJpbmcobm9kZS5mcm9tLCBub2RlLnRvKS50cmltKCk7XG4gICAgaWYgKHRleHQpIHJldHVybiBgSmF2YVNjcmlwdCBzeW50YXggZXJyb3IgbmVhciBcIiR7dGV4dH1cImA7XG5cbiAgICBjb25zdCBwcmV2VG9rZW4gPSB0aGlzLmdldFRva2VuQmVmb3JlKGRvYywgbm9kZS5mcm9tKTtcbiAgICBpZiAoIXByZXZUb2tlbikgcmV0dXJuICdKYXZhU2NyaXB0IHN5bnRheCBlcnJvcic7XG4gICAgaWYgKC9cXCgkLy50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnTWlzc2luZyBjbG9zaW5nIFwiKVwiJztcbiAgICBpZiAoL1xcWyQvLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCJdXCInO1xuICAgIGlmICgvXmZ1bmN0aW9uJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBuYW1lIG9yIFwiKFwiJztcbiAgICBpZiAoL15yZXR1cm4kL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0ludmFsaWQgZXhwcmVzc2lvbiBhZnRlciBcInJldHVyblwiJztcbiAgICBpZiAoL149PiQvLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBib2R5IGFmdGVyIFwiPT5cIic7XG4gICAgaWYgKC9eY29uc3QkfF5sZXQkfF52YXIkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIHZhcmlhYmxlIG5hbWUnO1xuXG4gICAgcmV0dXJuIGBKYXZhU2NyaXB0IHN5bnRheCBlcnJvciBuZWFyIFwiJHtwcmV2VG9rZW59XCJgO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIEpTT04gbGludGVyXG4gICAqIFPhu60gZOG7pW5nIEpTT04ucGFyc2UgxJHhu4MgdmFsaWRhdGVcbiAgICovXG4gIGNyZWF0ZUpzb25MaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgIHRvOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBnZXQoZXJyLCAnbWVzc2FnZScsICcnKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIFNRTCBsaW50ZXJcbiAgICovXG4gIGNyZWF0ZVNxbExpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS50eXBlLmlzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogTWF0aC5tYXgoMCwgbm9kZS5mcm9tIC0gMSksXG4gICAgICAgICAgICB0bzogbm9kZS5mcm9tLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmJ1aWxkU3FsRXJyb3JNZXNzYWdlKGRvYywgbm9kZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3FsRXJyb3JNZXNzYWdlKGRvYzogVGV4dCwgbm9kZTogU3ludGF4Tm9kZVJlZik6IHN0cmluZyB7XG4gICAgaWYgKG5vZGUuZnJvbSAhPT0gbm9kZS50bykge1xuICAgICAgY29uc3QgdGV4dCA9IGRvYy5zbGljZVN0cmluZyhub2RlLmZyb20sIG5vZGUudG8pO1xuICAgICAgcmV0dXJuIGBTUUwgc3ludGF4IGVycm9yIG5lYXIgXCIke3RleHR9XCJgO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUb2tlbiA9IHRoaXMuZ2V0VG9rZW5CZWZvcmUoZG9jLCBub2RlLmZyb20pO1xuXG4gICAgaWYgKCFwcmV2VG9rZW4pIHtcbiAgICAgIHJldHVybiAnU1FMIHN5bnRheCBlcnJvciBhdCBiZWdpbm5pbmcgb2Ygc3RhdGVtZW50JztcbiAgICB9XG5cbiAgICBpZiAoL0ZST00kL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIHRhYmxlIG5hbWUgYWZ0ZXIgRlJPTSc7XG4gICAgfVxuXG4gICAgaWYgKC9TRUxFQ1QkL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIGNvbHVtbiBsaXN0IGFmdGVyIFNFTEVDVCc7XG4gICAgfVxuXG4gICAgaWYgKC9XSEVSRSQvaS50ZXN0KHByZXZUb2tlbikpIHtcbiAgICAgIHJldHVybiAnRXhwZWN0ZWQgY29uZGl0aW9uIGFmdGVyIFdIRVJFJztcbiAgICB9XG5cbiAgICBpZiAoL1xcKCQvLnRlc3QocHJldlRva2VuKSkge1xuICAgICAgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCIpXCInO1xuICAgIH1cblxuICAgIHJldHVybiBgVW5leHBlY3RlZCBlbmQgb2YgU1FMIGFmdGVyIFwiJHtwcmV2VG9rZW59XCJgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb2tlbkJlZm9yZShkb2M6IFRleHQsIHBvczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIHBvcyAtIDMwKTtcbiAgICBjb25zdCB0ZXh0ID0gZG9jLnNsaWNlU3RyaW5nKHN0YXJ0LCBwb3MpO1xuXG4gICAgY29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC8oXFxTKylcXHMqJC8pO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIFB5dGhvbiBsaW50ZXIgZOG7sWEgdHLDqm4gc3ludGF4VHJlZSBwYXJzZSBlcnJvciDigJQgY8O5bmcgYXBwcm9hY2ggduG7m2kgU1FMIGxpbnRlci5cbiAgICogUGjDoXQgaGnhu4duIGzhu5dpIGPDuiBwaMOhcCBtw6AgQ29kZU1pcnJvciBQeXRob24gcGFyc2VyIMSRw6FuaCBk4bqldSBsw6AgZXJyb3Igbm9kZS5cbiAgICovXG4gIGNyZWF0ZVB5dGhvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS50eXBlLmlzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1heCgwLCBub2RlLmZyb20gLSAxKTtcbiAgICAgICAgICBjb25zdCB0byA9IG5vZGUuZnJvbSA9PT0gbm9kZS50byA/IG5vZGUuZnJvbSArIDEgOiBub2RlLnRvO1xuXG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG86IE1hdGgubWluKHRvLCBkb2MubGVuZ3RoKSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5idWlsZFB5dGhvbkVycm9yTWVzc2FnZShkb2MsIG5vZGUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFB5dGhvbkVycm9yTWVzc2FnZShkb2M6IFRleHQsIG5vZGU6IFN5bnRheE5vZGVSZWYpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLmZyb20gIT09IG5vZGUudG8pIHtcbiAgICAgIGNvbnN0IHRleHQgPSBkb2Muc2xpY2VTdHJpbmcobm9kZS5mcm9tLCBub2RlLnRvKS50cmltKCk7XG4gICAgICByZXR1cm4gYFB5dGhvbiBzeW50YXggZXJyb3Ike3RleHQgPyBgIG5lYXIgXCIke3RleHR9XCJgIDogJyd9YDtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2VG9rZW4gPSB0aGlzLmdldFRva2VuQmVmb3JlKGRvYywgbm9kZS5mcm9tKTtcblxuICAgIGlmICghcHJldlRva2VuKSB7XG4gICAgICByZXR1cm4gJ1B5dGhvbiBzeW50YXggZXJyb3InO1xuICAgIH1cblxuICAgIGlmICgvXmRlZiQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgZnVuY3Rpb24gbmFtZSBhZnRlciBcImRlZlwiJztcbiAgICBpZiAoL15jbGFzcyQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgY2xhc3MgbmFtZSBhZnRlciBcImNsYXNzXCInO1xuICAgIGlmICgvXnJldHVybiQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnSW52YWxpZCBleHByZXNzaW9uIGFmdGVyIFwicmV0dXJuXCInO1xuICAgIGlmICgvXmltcG9ydCQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgbW9kdWxlIG5hbWUgYWZ0ZXIgXCJpbXBvcnRcIic7XG4gICAgaWYgKC9eZnJvbSQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgbW9kdWxlIG5hbWUgYWZ0ZXIgXCJmcm9tXCInO1xuICAgIGlmICgvXmlmJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBjb25kaXRpb24gYWZ0ZXIgXCJpZlwiJztcbiAgICBpZiAoL15lbGlmJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBjb25kaXRpb24gYWZ0ZXIgXCJlbGlmXCInO1xuICAgIGlmICgvXndoaWxlJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBjb25kaXRpb24gYWZ0ZXIgXCJ3aGlsZVwiJztcbiAgICBpZiAoL15mb3IkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIHZhcmlhYmxlIGFmdGVyIFwiZm9yXCInO1xuICAgIGlmICgvXFwuJC8udGVzdChwcmV2VG9rZW4pKSByZXR1cm4gYEluY29tcGxldGUgYXR0cmlidXRlIGFjY2VzcyBvbiBcIiR7cHJldlRva2VuLnNsaWNlKDAsIC0xKX1cImA7XG4gICAgaWYgKC9cXCgkLy50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnTWlzc2luZyBjbG9zaW5nIFwiKVwiJztcbiAgICBpZiAoL1xcWyQvLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCJdXCInO1xuXG4gICAgcmV0dXJuIGBQeXRob24gc3ludGF4IGVycm9yIG5lYXIgXCIke3ByZXZUb2tlbn1cImA7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gQ29kZU1pcnJvciBleHRlbnNpb24gY2hvIGN1c3RvbSBjb21wbGV0aW9ucyB04burIGRhbmggc8OhY2ggaW5wdXQuXG4gICAqIEjhu5cgdHLhu6MgMiBjaOG6vyDEkeG7mTpcbiAgICogMS4gR8O1IHTDqm4gYmnhur9uIOKGkiBn4bujaSDDvSB0b3AtbGV2ZWwgaXRlbXNcbiAgICogMi4gR8O1IGBvYmouYCDihpIgZ+G7o2kgw70gcHJvcGVydGllcyBj4bunYSBvYmpcbiAgICovXG4gIHByaXZhdGUgYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGl0ZW1zOiBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSk6IEV4dGVuc2lvbiB7XG4gICAgY29uc3QgY29tcGxldGlvblNvdXJjZSA9IChjb250ZXh0OiBDb21wbGV0aW9uQ29udGV4dCk6IENvbXBsZXRpb25SZXN1bHQgfCBudWxsID0+IHtcbiAgICAgIC8vIENo4bq/IMSR4buZIGRvdC1ub3RhdGlvbjogZ8O1IFwib2JqLnByb3BcIiDihpIgZ+G7o2kgw70gcHJvcGVydGllcyBj4bunYSBvYmpcbiAgICAgIGNvbnN0IGRvdE1hdGNoID0gY29udGV4dC5tYXRjaEJlZm9yZSgvXFx3K1xcLlxcdyovKTtcbiAgICAgIGlmIChkb3RNYXRjaCkge1xuICAgICAgICBjb25zdCBkb3RQb3MgPSBkb3RNYXRjaC50ZXh0LmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0TmFtZSA9IGRvdE1hdGNoLnRleHQuc2xpY2UoMCwgZG90UG9zKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gaXRlbXMuZmluZCgoaSkgPT4gaS5sYWJlbCA9PT0gb2JqZWN0TmFtZSk7XG4gICAgICAgIGlmIChwYXJlbnQ/LnByb3BlcnRpZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcm9tOiBkb3RNYXRjaC5mcm9tICsgZG90UG9zICsgMSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHBhcmVudC5wcm9wZXJ0aWVzLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICAgICAgbGFiZWw6IHAubGFiZWwsXG4gICAgICAgICAgICAgIHR5cGU6IHAudHlwZSA/PyAncHJvcGVydHknLFxuICAgICAgICAgICAgICBkZXRhaWw6IHAuZGV0YWlsID8/ICcnLFxuICAgICAgICAgICAgICBpbmZvOiBwLmluZm8gPz8gJycsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaOG6vyDEkeG7mSB0b3AtbGV2ZWw6IGfhu6NpIMO9IHTDqm4gYmnhur9uL29iamVjdCBraGkgZ8O1IGvDvSB04buxXG4gICAgICBjb25zdCB3b3JkID0gY29udGV4dC5tYXRjaEJlZm9yZSgvXFx3Ki8pO1xuICAgICAgaWYgKCF3b3JkIHx8ICh3b3JkLmZyb20gPT09IHdvcmQudG8gJiYgIWNvbnRleHQuZXhwbGljaXQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbTogd29yZC5mcm9tLFxuICAgICAgICBvcHRpb25zOiBpdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgICAgdHlwZTogaXRlbS50eXBlID8/ICd2YXJpYWJsZScsXG4gICAgICAgICAgZGV0YWlsOiBpdGVtLmRldGFpbCA/PyAnJyxcbiAgICAgICAgICBpbmZvOiBpdGVtLmluZm8gPz8gJycsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBhdXRvY29tcGxldGlvbih7IG92ZXJyaWRlOiBbY29tcGxldGlvblNvdXJjZV0gfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gZXh0ZW5zaW9uIGLhuqNvIG3huq10IGfhu5NtIDIgbGF5ZXI6XG4gICAqIDEuIExpbnRlcjogaGlnaGxpZ2h0IMSR4buPIHThuqFpIMSRw7puZyB24buLIHRyw60gbWF0Y2ggKyBlbWl0IG91dFZpb2xhdGlvbnNcbiAgICogMi4gVHJhbnNhY3Rpb24gZmlsdGVyOiBjaOG6t24gcGFzdGUgbuG6v3UgbuG7mWkgZHVuZyBwYXN0ZSBjaOG7qWEgcGF0dGVybiBj4bqlbVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZvcmJpZGRlbkV4dGVuc2lvbihwYXR0ZXJuczogVF9Gb3JiaWRkZW5QYXR0ZXJuW10pOiBFeHRlbnNpb24ge1xuICAgIGNvbnN0IHRvR2xvYmFsUmVnZXggPSAocDogVF9Gb3JiaWRkZW5QYXR0ZXJuKTogUmVnRXhwID0+IHtcbiAgICAgIGlmIChwIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gcC5mbGFncy5pbmNsdWRlcygnZycpID8gcC5mbGFncyA6IGAke3AuZmxhZ3N9Z2A7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHAuc291cmNlLCBmbGFncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzLmVzY2FwZVJlZ2V4KHApLCAnZ2knKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZm9yYmlkZGVuTGludGVyID0gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG4gICAgICBjb25zdCB2aW9sYXRpb25zOiBJUHJldmlld1RleHREYXRhVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgIGNvbnN0IHRleHQgPSB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIC8vIEJ1aWxkIGEgU2V0IG9mIGNvbW1lbnQgcmFuZ2VzIHThu6sgQVNUIMSR4buDIHNraXAgbWF0Y2ggbuG6sW0gdHJvbmcgY29tbWVudFxuICAgICAgY29uc3QgY29tbWVudFJhbmdlczogeyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfVtdID0gW107XG4gICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICBlbnRlcjogKG5vZGU6IFN5bnRheE5vZGVSZWYpID0+IHtcbiAgICAgICAgICBpZiAobm9kZS50eXBlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnY29tbWVudCcpKSB7XG4gICAgICAgICAgICBjb21tZW50UmFuZ2VzLnB1c2goeyBmcm9tOiBub2RlLmZyb20sIHRvOiBub2RlLnRvIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpc0luQ29tbWVudCA9IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBib29sZWFuID0+XG4gICAgICAgIGNvbW1lbnRSYW5nZXMuc29tZSgocikgPT4gZnJvbSA+PSByLmZyb20gJiYgdG8gPD0gci50byk7XG5cbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICBjb25zdCByZSA9IHRvR2xvYmFsUmVnZXgocGF0dGVybik7XG4gICAgICAgIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcblxuICAgICAgICB3aGlsZSAoKG1hdGNoID0gcmUuZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmcm9tID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgY29uc3QgdG8gPSBmcm9tICsgbWF0Y2hbMF0ubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKGlzSW5Db21tZW50KGZyb20sIHRvKSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBsaW5lID0gdmlldy5zdGF0ZS5kb2MubGluZUF0KGZyb20pLm51bWJlcjtcbiAgICAgICAgICBjb25zdCBwYXR0ZXJuTGFiZWwgPSBwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwID8gcGF0dGVybi5zb3VyY2UgOiBwYXR0ZXJuO1xuXG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBNw6MgYuG7iyBj4bqlbTogXCIke21hdGNoWzBdfVwiIOKAlCB2aSBwaOG6oW0gY2jDrW5oIHPDoWNoIGLhuqNvIG3huq10YCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7IGZyb20sIHRvLCBsaW5lLCBwYXR0ZXJuOiBwYXR0ZXJuTGFiZWwsIG1hdGNoZWQ6IG1hdGNoWzBdIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3V0VmlvbGF0aW9ucy5lbWl0KHZpb2xhdGlvbnMpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuXG4gICAgLy8gQ2jhurduIHBhc3RlIG7hur91IG7hu5lpIGR1bmcgcGFzdGUgY2jhu6lhIGLhuqV0IGvhu7MgcGF0dGVybiBj4bqlbSBuw6BvXG4gICAgY29uc3QgcGFzdGVGaWx0ZXIgPSBFZGl0b3JTdGF0ZS50cmFuc2FjdGlvbkZpbHRlci5vZigodHI6IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBpZiAoIXRyLmRvY0NoYW5nZWQpIHJldHVybiB0cjtcbiAgICAgIGlmICghdHIuYW5ub3RhdGlvbihUcmFuc2FjdGlvbi51c2VyRXZlbnQpPy5zdGFydHNXaXRoKCdpbnB1dC5wYXN0ZScpKSByZXR1cm4gdHI7XG5cbiAgICAgIGNvbnN0IG5ld1RleHQgPSB0ci5uZXdEb2MudG9TdHJpbmcoKTtcbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICBjb25zdCByZSA9IHRvR2xvYmFsUmVnZXgocGF0dGVybik7XG4gICAgICAgIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGlmIChyZS50ZXN0KG5ld1RleHQpKSByZXR1cm4gW107IC8vIFtdID0gYmxvY2sgdHJhbnNhY3Rpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cjtcbiAgICB9KTtcblxuICAgIHJldHVybiBbZm9yYmlkZGVuTGludGVyLCBwYXN0ZUZpbHRlcl07XG4gIH1cblxuICBwcml2YXRlIGVzY2FwZVJlZ2V4KHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgTUVUSE9EUyAtIEV2ZW50IGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb3B5KCk6IHZvaWQge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udGVudCgpIHx8ICcnKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEluZm8oJ1NhbyBjaMOpcCB0aMOgbmggY8O0bmcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTGluZVdyYXAoKTogdm9pZCB7XG4gICAgLy8gTOG6pXkgbuG7mWkgZHVuZyBt4bubaSBuaOG6pXQgdOG7qyBlZGl0b3Igc2F1IGtoaSDEkcOjIHjDs2EgbmV3bGluZXNcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5zdGF0ZS5kb2MudG9TdHJpbmcoKSB8fCAnJztcbiAgICBpZiAodGhpcy5pc1dyYXAoKSkge1xuICAgICAgdGhpcy5jb250ZW50U3RhdGVOb1dyYXAuc2V0KGN1cnJlbnRDb250ZW50KTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbnRlbnQgPSB0aGlzLmlzV3JhcCgpICYmIGN1cnJlbnRDb250ZW50ID8gY3VycmVudENvbnRlbnQucmVwbGFjZSgvXFxuL2csICcgJykgOiB0aGlzLmNvbnRlbnRTdGF0ZU5vV3JhcCgpO1xuICAgIHRoaXMuaXNXcmFwLnVwZGF0ZSgodmFsKSA9PiAhdmFsKTtcblxuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gdXBkYXRlZENvbnRlbnQpIHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICAgIGNoYW5nZXM6IHsgZnJvbTogMCwgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCwgaW5zZXJ0OiB1cGRhdGVkQ29udGVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQmF0Y2ggY+G6oyAyIGRpc3BhdGNoIHRow6BuaCAxIMSR4buDIHThu5FpIMawdSBwZXJmb3JtYW5jZVxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiBbdGhpcy53cmFwQ29tcGFydG1lbnQucmVjb25maWd1cmUodGhpcy5pc1dyYXAoKSA/IEVkaXRvclZpZXcubGluZVdyYXBwaW5nIDogW10pLCB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gbGluZU51bWJlcnMoKSA6IFtdKV0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdEtleShkYXRhPzogSUVtaXRTZWxlY3RLZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWRhdGE/LmtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0xhbmcgPSBkYXRhLmtleSBhcyBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUO1xuICAgIHRoaXMubGFuZ1NlbGVjdGVkLnNldChuZXdMYW5nKTtcblxuICAgIC8vIExvYWQgbGFuZ3VhZ2UgdsOgIGxpbnRlciBt4bubaVxuICAgIGNvbnN0IFtsYW5ndWFnZUV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmxvYWRMYW5ndWFnZUV4dGVuc2lvbihuZXdMYW5nKSwgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKG5ld0xhbmcpXSk7XG5cbiAgICAvLyBSZWNvbmZpZ3VyZSB0aGF5IHbDrCB04bqhbyBt4bubaSBzdGF0ZSDEkeG7gyBnaeG7ryBs4bqhaSBkb2N1bWVudCBjb250ZW50XG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQucmVjb25maWd1cmUobGFuZ3VhZ2VFeHRlbnNpb24pLCB0aGlzLmxpbnRlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKGxpbnRlckV4dGVuc2lvbildLFxuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQoKSxcbiAgICAgIGlzV3JhcDogIXRoaXMuaXNXcmFwKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgIGNvbnRleHRDaGFuZ2U6ICdsYW5ndWFnZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLXByZXZpZXctZGF0YS1jb250YWluZXIgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1hdXRvIHJvdW5kZWQtWzhweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCBweC1bOHB4XVwiXG4gIFtzdHlsZS4tLWJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZCgpXCJcbiAgW2NsYXNzLnB0LVs4cHhdXT1cIiFoaWRkZW5BY3Rpb24oKVwiPlxuICBAaWYgKCFoaWRkZW5BY3Rpb24oKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWJldHdlZW4gY29sb3ItWyM2YTczODNdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIGNsYXNzSW5jbHVkZT1cInctWzIwMHB4XVwiXG4gICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnKClcIlxuICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIFtyZWFkb25seV09XCIhZWRpdGFibGUoKSB8fCAhYWNjZXB0Q2hhbmdlTGFuZygpXCJcbiAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdEtleSgkZXZlbnQpXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxMYW5nKCkgfHwgJydcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJlZGl0YWJsZSgpICYmIGFjY2VwdENoYW5nZUxhbmcoKSA/ICdsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAnIDogJydcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLVswcHhdJyArIChlZGl0YWJsZSgpICYmIGFjY2VwdENoYW5nZUxhbmcoKSA/ICcnIDogJyFwb2ludGVyLWV2ZW50cy1ub25lICFjdXJzb3ItZGVmYXVsdCBob3ZlcjohdGV4dC1bIzZBNzM4M10nKVwiIC8+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cImlzV3JhcCgpID8gJ2kxOG5fcmVtb3ZlX2xpbmVfd3JhcCcgOiAnaTE4bl9saW5lX3dyYXAnXCJcbiAgICAgICAgICBbc2l6ZUJ1dHRvbl09XCInc21hbGwnXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJpc1dyYXAoKSA/ICdsaWJzLXVpLWljb24tdW53cmFwJyA6ICdsaWJzLXVpLWljb24td3JhcCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21vLWxpYi1wLTBweCBtby1saWItbXItMTZweCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyTGluZVdyYXAoKVwiIC8+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJ2kxOG5fY29weSdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tY29weSdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21vLWxpYi1wLTBweCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ29weSgpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIDxkaXYgI2NvbnRhaW5lclByZXZpZXc+PC9kaXY+XG48L2Rpdj5cbiJdfQ==
638
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBRSxjQUFjLEVBQXVDLE1BQU0sMEJBQTBCLENBQUM7QUFDL0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQWEsSUFBSSxFQUFRLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFFdkUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWpHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1B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QUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekksZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUM7WUFDaEMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDeEgsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDdkIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM3QixhQUFhLEVBQUUsVUFBVTtTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXRyQlUsd0NBQXdDOzRGQUF4Qyx3Q0FBd0MsZ3dEQ3pCckQscTREQXlDQSxvM0JEbEJZLGlDQUFpQyx1M0RBQUUsc0NBQXNDOzs0RkFFeEUsd0NBQXdDO2tCQVRwRCxTQUFTOytCQUVFLHNDQUFzQyxjQUdwQyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxpQ0FBaUMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGF1dG9jb21wbGV0aW9uLCBDb21wbGV0aW9uQ29udGV4dCwgQ29tcGxldGlvblJlc3VsdCB9IGZyb20gJ0Bjb2RlbWlycm9yL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBzeW50YXhUcmVlIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgRGlhZ25vc3RpYywgbGludGVyLCBsaW50R3V0dGVyIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGludCc7XG5pbXBvcnQgeyBDb21wYXJ0bWVudCwgRWRpdG9yU3RhdGUsIEV4dGVuc2lvbiwgUHJlYywgVGV4dCwgVHJhbnNhY3Rpb24gfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JWaWV3LCBsaW5lTnVtYmVycywgVmlld1VwZGF0ZSB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHR5cGUgeyBTeW50YXhOb2RlUmVmIH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgYmFzaWNTZXR1cCB9IGZyb20gJ2NvZGVtaXJyb3I2JztcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRMYW5ndWFnZSwgaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZywgbGFuZ3VhZ2VSZWdpc3RyeSwgb3B0aW9uc0xhbmdEYXRhIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUnO1xuaW1wb3J0IHsgSUxhbmd1YWdlT3B0aW9ucywgSVByZXZpZXdUZXh0RGF0YUNoYW5nZSwgSVByZXZpZXdUZXh0RGF0YUNvbXBsZXRpb25JdGVtLCBJUHJldmlld1RleHREYXRhVmlvbGF0aW9uLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JULCBUX0ZvcmJpZGRlblBhdHRlcm4gfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcHJldmlld190ZXh0X2RhdGEnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0xpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUHJldmlld1RleHREYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBlZGl0b3JWaWV3SW5zdGFuY2U/OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIHJlYWRvbmx5IHdyYXBDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lTnVtYmVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW50ZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBsZXRpb25zQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb3JiaWRkZW5Db21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGVudFN0YXRlTm9XcmFwID0gc2lnbmFsKCcnKTtcblxuICAvKiogQ2FjaGUgxJHhu4MgdHLDoW5oIGxvYWQgbOG6oWkgbGFuZ3VhZ2UgxJHDoyBsb2FkICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ3VhZ2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeHRlbnNpb24+KCk7XG5cbiAgLyoqIEZsYWcgxJHhu4MgdHLDoW5oIHVwZGF0ZSBlZGl0b3Iga2hpIMSRYW5nIGto4bufaSB04bqhbyAqL1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTkpFQ1RFRCBTRVJWSUNFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBTSUdOQUxTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzV3JhcCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4oaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZygpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhYmVsTGFuZyA9IGNvbXB1dGVkKCgpID0+IG9wdGlvbnNMYW5nRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLmxhbmdTZWxlY3RlZCgpKT8ubGFiZWwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXB0Q2hhbmdlTGFuZyA9IGNvbXB1dGVkKCgpID0+ICEodGhpcy5sYW5nU2VsZWN0ZWQoKSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/LmluY2x1ZGVzKHRoaXMubGFuZ1NlbGVjdGVkKCkpKSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5QVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgY29udGVudCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGFuZ1NlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8UFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NBY2NlcHQgPSBpbnB1dDxBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NDaGFuZ2VMYWJlbCA9IGlucHV0PElMYW5ndWFnZU9wdGlvbnMgfCB1bmRlZmluZWQ+KCk7XG5cbiAgcmVhZG9ubHkgZWRpdGFibGUgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhpZGRlbkFjdGlvbiA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBib29sZWFuKSA9PiB2YWx1ZSA/PyBmYWxzZSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGludElnbm9yZVBhdHRlcm5zID0gaW5wdXQ8QXJyYXk8c3RyaW5nPiwgQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZD4oWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogQXJyYXk8c3RyaW5nPikgPT4gdmFsdWUgPz8gWydDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsICdVbmV4cGVjdGVkIHRva2VuIGV4cG9ydCcsICdpbXBvcnQgJywgJ0Bhbmd1bGFyL2NvcmUnXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggxJHhu5FpIHTGsOG7o25nL2Jp4bq/biBn4bujaSDDvSBraGkgZ8O1IOKAlCBnaeG7kW5nIEludGVsbGlTZW5zZSB0cm9uZyBJREUuXG4gICAqIEjhu5cgdHLhu6MgZG90LW5vdGF0aW9uOiDEkeG7i25oIG5naMSpYSBgcHJvcGVydGllc2AgxJHhu4MgZ+G7o2kgw70gc2F1IGThuqV1IGAuYFxuICAgKiBAZXhhbXBsZVxuICAgKiBbY29tcGxldGlvbnNdPVwiW3sgbGFiZWw6ICd1c2VyJywgcHJvcGVydGllczogW3sgbGFiZWw6ICduYW1lJywgZGV0YWlsOiAnc3RyaW5nJyB9XSB9XVwiXG4gICAqL1xuICByZWFkb25seSBjb21wbGV0aW9ucyA9IGlucHV0PElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdLCBJUHJldmlld1RleHREYXRhQ29tcGxldGlvbkl0ZW1bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERhbmggc8OhY2ggcGF0dGVybiBj4bqlbSDigJQgY2h14buXaSBsaXRlcmFsIGhv4bq3YyBSZWdFeHAuXG4gICAqIEtoaSBwaMOhdCBoaeG7h24gdmkgcGjhuqFtOiBoaWdobGlnaHQgxJHhu48gdOG6oWkgxJHDum5nIHbhu4sgdHLDrSArIGNo4bq3biBwYXN0ZSArIGVtaXQgYChvdXRWaW9sYXRpb25zKWAuXG4gICAqIETDuW5nIGBERUZBVUxUX1NFQ1VSSVRZX1BBVFRFUk5TYCDEkeG7gyDDoXAgZOG7pW5nIGLhu5kgcXV5IHThuq9jIGLhuqNvIG3huq10IG3hurdjIMSR4buLbmggY2hvIGxvdy1jb2RlLlxuICAgKiBAZXhhbXBsZVxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiZGVmYXVsdFNlY3VyaXR5UGF0dGVybnNcIlxuICAgKiBbZm9yYmlkZGVuUGF0dGVybnNdPVwiWy9ldmFsXFxzKlxcKC8sICdsb2NhbFN0b3JhZ2UnXVwiXG4gICAqL1xuICByZWFkb25seSBmb3JiaWRkZW5QYXR0ZXJucyA9IGlucHV0PFRfRm9yYmlkZGVuUGF0dGVybltdLCBUX0ZvcmJpZGRlblBhdHRlcm5bXSB8IHVuZGVmaW5lZD4oW10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IFRfRm9yYmlkZGVuUGF0dGVybltdKSA9PiB2YWx1ZSA/PyBbXSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYmFja2dyb3VuZCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignI2Y4ZjlmYScsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IHN0cmluZykgPT4gdmFsdWUgPz8gJyNmOGY5ZmEnLFxuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBPVVRQVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PElQcmV2aWV3VGV4dERhdGFDaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IHN5bnRheEVycm9ycyA9IG91dHB1dDxEaWFnbm9zdGljW10+KCk7XG4gIHJlYWRvbmx5IG91dFZpb2xhdGlvbnMgPSBvdXRwdXQ8SVByZXZpZXdUZXh0RGF0YVZpb2xhdGlvbltdPigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZJRVcgQ0hJTERSRU5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lclByZXZpZXcgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJQcmV2aWV3Jyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09OU1RSVUNUT1IgLSBTZXR1cCBlZmZlY3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWZmZWN0IMSR4buDIHN5bmMgY29udGVudCB04burIGlucHV0IHbDoG8gZWRpdG9yXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQoKTtcbiAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRlbnQgPSB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgICB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgICBpbnNlcnQ6IG5ld0NvbnRlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFZmZlY3QgxJHhu4MgY+G6rXAgbmjhuq10IGN1c3RvbSBjb21wbGV0aW9ucyBraGkgaW5wdXQgdGhheSDEkeG7lWlcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmNvbXBsZXRpb25zKCk7XG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCB8fCAhdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHJldHVybjtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgZWZmZWN0czogdGhpcy5jb21wbGV0aW9uc0NvbXBhcnRtZW50LnJlY29uZmlndXJlKGl0ZW1zLmxlbmd0aCA/IHRoaXMuYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGl0ZW1zKSA6IFtdKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gRWZmZWN0IMSR4buDIGPhuq1wIG5o4bqtdCBmb3JiaWRkZW4gcGF0dGVybnMga2hpIGlucHV0IHRoYXkgxJHhu5VpXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5mb3JiaWRkZW5QYXR0ZXJucygpO1xuICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuZWRpdG9yVmlld0luc3RhbmNlKSByZXR1cm47XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5kaXNwYXRjaCh7XG4gICAgICAgIGVmZmVjdHM6IHRoaXMuZm9yYmlkZGVuQ29tcGFydG1lbnQucmVjb25maWd1cmUocGF0dGVybnMubGVuZ3RoID8gdGhpcy5idWlsZEZvcmJpZGRlbkV4dGVuc2lvbihwYXR0ZXJucykgOiBbXSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFudXAga2hpIGNvbXBvbmVudCBi4buLIGRlc3Ryb3lcbiAgICB0aGlzLmRlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmxhbmd1YWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJRkVDWUNMRSBIT09LU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhbmdzQWNjZXB0KCk/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb25maWdMb2FkRGF0YUlzSHR0cENvbmZpZy5zZXQoaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZyh0aGlzLmxhbmdzQWNjZXB0KCksIHRoaXMubGFuZ3NDaGFuZ2VMYWJlbCgpKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUVkaXRvcigpO1xuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBFZGl0b3IgaW5pdGlhbGl6YXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogS2jhu59pIHThuqFvIGVkaXRvciB24bubaSBjw6FjIGV4dGVuc2lvbnMgY8ahIGLhuqNuXG4gICAqIExhbmd1YWdlIMSRxrDhu6NjIGxvYWQgYXN5bmMgxJHhu4MgdOG7kWkgxrB1IGJ1bmRsZSBzaXplXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVFZGl0b3IoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbGFuZ3VhZ2VFeHRlbnNpb24gPSBhd2FpdCB0aGlzLmxvYWRMYW5ndWFnZUV4dGVuc2lvbih0aGlzLmxhbmdTZWxlY3RlZCgpKTtcbiAgICBjb25zdCBsaW50ZXJFeHRlbnNpb24gPSBhd2FpdCB0aGlzLmxvYWRMaW50ZXJFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG5cbiAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSA9IG5ldyBFZGl0b3JWaWV3KHtcbiAgICAgIGRvYzogdGhpcy5jb250ZW50KCksXG4gICAgICBwYXJlbnQ6IHRoaXMuY29udGFpbmVyUHJldmlldygpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbiksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gZGFuaCBzw6FjaCBleHRlbnNpb25zIGNobyBlZGl0b3JcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRXh0ZW5zaW9ucyhsYW5ndWFnZUV4dGVuc2lvbjogRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb246IEV4dGVuc2lvbik6IEV4dGVuc2lvbltdIHtcbiAgICBjb25zdCBpbml0aWFsQ29tcGxldGlvbnMgPSB0aGlzLmNvbXBsZXRpb25zKCk7XG4gICAgY29uc3QgaW5pdGlhbFBhdHRlcm5zID0gdGhpcy5mb3JiaWRkZW5QYXR0ZXJucygpO1xuICAgIHJldHVybiBbXG4gICAgICBiYXNpY1NldHVwLFxuICAgICAgdGhpcy5sYW5ndWFnZUNvbXBhcnRtZW50Lm9mKGxhbmd1YWdlRXh0ZW5zaW9uKSxcbiAgICAgIHRoaXMubGludGVyQ29tcGFydG1lbnQub2YobGludGVyRXh0ZW5zaW9uKSxcbiAgICAgIC8vIENvbXBhcnRtZW50IGNobyBjdXN0b20gY29tcGxldGlvbnMg4oCUIFByZWMuaGlnaGVzdCDEkeG7gyBvdmVycmlkZSBiYXNpY1NldHVwJ3MgYXV0b2NvbXBsZXRpb25cbiAgICAgIFByZWMuaGlnaGVzdCh0aGlzLmNvbXBsZXRpb25zQ29tcGFydG1lbnQub2YoaW5pdGlhbENvbXBsZXRpb25zLmxlbmd0aCA/IHRoaXMuYnVpbGRDb21wbGV0aW9uRXh0ZW5zaW9uKGluaXRpYWxDb21wbGV0aW9ucykgOiBbXSkpLFxuICAgICAgdGhpcy5mb3JiaWRkZW5Db21wYXJ0bWVudC5vZihpbml0aWFsUGF0dGVybnMubGVuZ3RoID8gdGhpcy5idWlsZEZvcmJpZGRlbkV4dGVuc2lvbihpbml0aWFsUGF0dGVybnMpIDogW10pLFxuICAgICAgdGhpcy5jcmVhdGVMaWdodFRoZW1lKCksXG4gICAgICBFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKHRoaXMuZWRpdGFibGUoKSksXG4gICAgICB0aGlzLndyYXBDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyksXG4gICAgICB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5vZihsaW5lTnVtYmVycygpKSxcbiAgICAgIGxpbnRHdXR0ZXIoKSxcbiAgICAgIHRoaXMuY3JlYXRlQnJhY2tldFRoZW1lKCksXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGV4dGVuc2lvbiB24bubaSBjYWNoaW5nXG4gICAqIE3hu5dpIGxhbmd1YWdlIGNo4buJIMSRxrDhu6NjIGxvYWQgMSBs4bqnblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGFuZ3VhZ2VFeHRlbnNpb24obGFuZzogUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCk6IFByb21pc2U8RXh0ZW5zaW9uPiB7XG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5sYW5ndWFnZUNhY2hlLmdldChsb3dlckxhbmcpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5SXRlbSA9IGxhbmd1YWdlUmVnaXN0cnlbbG93ZXJMYW5nXTtcbiAgICBjb25zdCBleHRlbnNpb24gPSByZWdpc3RyeUl0ZW0gPyBhd2FpdCByZWdpc3RyeUl0ZW0ubG9hZGVyKCkgOiBhd2FpdCBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UoKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5zZXQobG93ZXJMYW5nLCBleHRlbnNpb24pO1xuICAgIHJldHVybiBleHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsaW50ZXIgZXh0ZW5zaW9uIG7hur91IGPDs1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGludGVyRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG5cbiAgICBpZiAocmVnaXN0cnlJdGVtPy5saW50ZXIpIHtcbiAgICAgIHJldHVybiByZWdpc3RyeUl0ZW0ubGludGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW50ZXIoKCkgPT4gW10pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVGhlbWUgY29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgY3JlYXRlTGlnaHRUaGVtZSgpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcmJzogeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZCgpLCBjb2xvcjogJyMzMzMnIH0sXG4gICAgICAnLmNtLWNvbnRlbnQnOiB7IGNhcmV0Q29sb3I6ICcjMTExJyB9LFxuICAgICAgJy5jbS1hY3RpdmVMaW5lJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCcmFja2V0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnLmNtLW1hdGNoaW5nQnJhY2tldCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxMDAsIDIwMCwgMjU1LCAwLjE1KScsXG4gICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCByZ2JhKDEwMCwgMjAwLCAyNTUsIDAuNCknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuMnMgZWFzZScsXG4gICAgICB9LFxuICAgICAgJy5jbS1ub25tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAxMDAsIDEwMCwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgyNTUsIDEwMCwgMTAwLCAwLjMpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBVcGRhdGUgbGlzdGVuZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudXBkYXRlTGlzdGVuZXIub2YoKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkICYmIHRoaXMuZWRpdGFibGUoKSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHVwZGF0ZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY29udGVudDogbmV3VmFsdWUsXG4gICAgICAgICAgaXNXcmFwOiAhdGhpcy5pc1dyYXAoKSxcbiAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgICAgICBjb250ZXh0Q2hhbmdlOiAnY29udGVudCcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFVCTElDIE1FVEhPRFMgLSBMaW50ZXIgZmFjdG9yaWVzICjEkcaw4bujYyBn4buNaSB04burIHJlZ2lzdHJ5KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBU4bqhbyBKYXZhU2NyaXB0IGxpbnRlciB24bubaSAyLXBhc3MgZGV0ZWN0aW9uOlxuICAgKiAxLiBUZXh0LWJhc2VkIHNjYW4gY2hvIHRyYWlsaW5nIGRvdCAocGFyc2VyIHRoxrDhu51uZyDEkeG6t3QgZXJyb3Igbm9kZSBzYWkgduG7iyB0csOtIHbhu5tpIHBhdHRlcm4gbsOgeSlcbiAgICogMi4gc3ludGF4VHJlZSBjaG8gY8OhYyBs4buXaSB0aOG7sWMgc+G7sSBraMOhYywgYuG7jyBxdWEgdsO5bmcgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSB0cmFpbGluZyBkb3RcbiAgICovXG4gIGNyZWF0ZUpzTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcigodmlldykgPT4ge1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSA9IFtdO1xuICAgICAgY29uc3QgZG9jID0gdmlldy5zdGF0ZS5kb2M7XG5cbiAgICAgIC8vIFBhc3MgMTogVGV4dC1iYXNlZCB0cmFpbGluZyBkb3QgZGV0ZWN0aW9uIOKAlCDEkeG6t3QgZGlhZ25vc3RpYyDEkcO6bmcgdOG6oWkgduG7iyB0csOtIGThuqV1IGNo4bqlbVxuICAgICAgY29uc3QgdHJhaWxpbmdEb3RMaW5lcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgICAgZm9yIChsZXQgbGluZU51bSA9IDE7IGxpbmVOdW0gPD0gZG9jLmxpbmVzOyBsaW5lTnVtKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGRvYy5saW5lKGxpbmVOdW0pO1xuICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50ZXh0LnRyaW1FbmQoKTtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvKFxcdyspXFwuXFxzKiQvLmV4ZWModHJpbW1lZCk7XG4gICAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICAgIHRyYWlsaW5nRG90TGluZXMuYWRkKGxpbmVOdW0pO1xuICAgICAgICBjb25zdCBkb3RQb3MgPSBsaW5lLmZyb20gKyB0cmltbWVkLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgIGZyb206IGRvdFBvcyxcbiAgICAgICAgICB0bzogZG90UG9zICsgMSxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBgSW5jb21wbGV0ZSBwcm9wZXJ0eSBhY2Nlc3Mgb24gXCIke21hdGNoWzFdfVwiYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIMSQw6FuaCBk4bqldSBjw6FjIGTDsm5nIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgdHJhaWxpbmcgZG90ICh0cmFpbGluZy1kb3QgbGluZSArIDQgZMOybmcgdGnhur9wIHRoZW8pXG4gICAgICAvLyDEkeG7gyBs4buNYyBjYXNjYWRpbmcgZXJyb3JzIHThu6sgc3ludGF4VHJlZVxuICAgICAgY29uc3QgdGFpbnRlZExpbmVzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgICBmb3IgKGNvbnN0IGxpbmVOdW0gb2YgdHJhaWxpbmdEb3RMaW5lcykge1xuICAgICAgICBmb3IgKGxldCBpID0gbGluZU51bTsgaSA8PSBNYXRoLm1pbihsaW5lTnVtICsgNCwgZG9jLmxpbmVzKTsgaSsrKSB7XG4gICAgICAgICAgdGFpbnRlZExpbmVzLmFkZChpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIDI6IHN5bnRheFRyZWUgY2hvIGPDoWMgbOG7l2kga2jDoWMgKGNo4buJIG5vbi1lbXB0eSByYW5nZSwgYuG7jyBxdWEgdsO5bmcgdGFpbnRlZClcbiAgICAgIGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuICAgICAgdHJlZS5pdGVyYXRlKHtcbiAgICAgICAgZW50ZXI6IChub2RlOiBTeW50YXhOb2RlUmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFub2RlLnR5cGUuaXNFcnJvcikgcmV0dXJuO1xuICAgICAgICAgIGlmIChub2RlLmZyb20gPT09IG5vZGUudG8pIHJldHVybjsgLy8gQuG7jyBxdWEgZW1wdHktcmFuZ2Ugbm9kZSAoY2FzY2FkaW5nIGVycm9yKVxuXG4gICAgICAgICAgY29uc3QgZXJyb3JMaW5lTnVtID0gZG9jLmxpbmVBdChub2RlLmZyb20pLm51bWJlcjtcbiAgICAgICAgICBpZiAodGFpbnRlZExpbmVzLmhhcyhlcnJvckxpbmVOdW0pKSByZXR1cm47XG5cbiAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICAgIGZyb206IG5vZGUuZnJvbSxcbiAgICAgICAgICAgIHRvOiBNYXRoLm1pbihub2RlLnRvLCBkb2MubGVuZ3RoKSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5idWlsZEpzRXJyb3JNZXNzYWdlKGRvYywgbm9kZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSnNFcnJvck1lc3NhZ2UoZG9jOiBUZXh0LCBub2RlOiBTeW50YXhOb2RlUmVmKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZXh0ID0gZG9jLnNsaWNlU3RyaW5nKG5vZGUuZnJvbSwgbm9kZS50bykudHJpbSgpO1xuICAgIGlmICh0ZXh0KSByZXR1cm4gYEphdmFTY3JpcHQgc3ludGF4IGVycm9yIG5lYXIgXCIke3RleHR9XCJgO1xuXG4gICAgY29uc3QgcHJldlRva2VuID0gdGhpcy5nZXRUb2tlbkJlZm9yZShkb2MsIG5vZGUuZnJvbSk7XG4gICAgaWYgKCFwcmV2VG9rZW4pIHJldHVybiAnSmF2YVNjcmlwdCBzeW50YXggZXJyb3InO1xuICAgIGlmIChwcmV2VG9rZW4uZW5kc1dpdGgoJygnKSkgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCIpXCInO1xuICAgIGlmIChwcmV2VG9rZW4uZW5kc1dpdGgoJ1snKSkgcmV0dXJuICdNaXNzaW5nIGNsb3NpbmcgXCJdXCInO1xuICAgIGlmICgvXmZ1bmN0aW9uJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBuYW1lIG9yIFwiKFwiJztcbiAgICBpZiAoL15yZXR1cm4kL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0ludmFsaWQgZXhwcmVzc2lvbiBhZnRlciBcInJldHVyblwiJztcbiAgICBpZiAoL149PiQvLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBib2R5IGFmdGVyIFwiPT5cIic7XG4gICAgaWYgKC9eY29uc3QkfF5sZXQkfF52YXIkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIHZhcmlhYmxlIG5hbWUnO1xuXG4gICAgcmV0dXJuIGBKYXZhU2NyaXB0IHN5bnRheCBlcnJvciBuZWFyIFwiJHtwcmV2VG9rZW59XCJgO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIEpTT04gbGludGVyXG4gICAqIFPhu60gZOG7pW5nIEpTT04ucGFyc2UgxJHhu4MgdmFsaWRhdGVcbiAgICovXG4gIGNyZWF0ZUpzb25MaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgIHRvOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBnZXQoZXJyLCAnbWVzc2FnZScsICcnKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIFNRTCBsaW50ZXJcbiAgICovXG4gIGNyZWF0ZVNxbExpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS50eXBlLmlzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogTWF0aC5tYXgoMCwgbm9kZS5mcm9tIC0gMSksXG4gICAgICAgICAgICB0bzogbm9kZS5mcm9tLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLmJ1aWxkU3FsRXJyb3JNZXNzYWdlKGRvYywgbm9kZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3FsRXJyb3JNZXNzYWdlKGRvYzogVGV4dCwgbm9kZTogU3ludGF4Tm9kZVJlZik6IHN0cmluZyB7XG4gICAgaWYgKG5vZGUuZnJvbSAhPT0gbm9kZS50bykge1xuICAgICAgY29uc3QgdGV4dCA9IGRvYy5zbGljZVN0cmluZyhub2RlLmZyb20sIG5vZGUudG8pO1xuICAgICAgcmV0dXJuIGBTUUwgc3ludGF4IGVycm9yIG5lYXIgXCIke3RleHR9XCJgO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUb2tlbiA9IHRoaXMuZ2V0VG9rZW5CZWZvcmUoZG9jLCBub2RlLmZyb20pO1xuXG4gICAgaWYgKCFwcmV2VG9rZW4pIHtcbiAgICAgIHJldHVybiAnU1FMIHN5bnRheCBlcnJvciBhdCBiZWdpbm5pbmcgb2Ygc3RhdGVtZW50JztcbiAgICB9XG5cbiAgICBpZiAoL0ZST00kL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIHRhYmxlIG5hbWUgYWZ0ZXIgRlJPTSc7XG4gICAgfVxuXG4gICAgaWYgKC9TRUxFQ1QkL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIGNvbHVtbiBsaXN0IGFmdGVyIFNFTEVDVCc7XG4gICAgfVxuXG4gICAgaWYgKC9XSEVSRSQvaS50ZXN0KHByZXZUb2tlbikpIHtcbiAgICAgIHJldHVybiAnRXhwZWN0ZWQgY29uZGl0aW9uIGFmdGVyIFdIRVJFJztcbiAgICB9XG5cbiAgICBpZiAocHJldlRva2VuLmVuZHNXaXRoKCcoJykpIHtcbiAgICAgIHJldHVybiAnTWlzc2luZyBjbG9zaW5nIFwiKVwiJztcbiAgICB9XG5cbiAgICByZXR1cm4gYFVuZXhwZWN0ZWQgZW5kIG9mIFNRTCBhZnRlciBcIiR7cHJldlRva2VufVwiYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9rZW5CZWZvcmUoZG9jOiBUZXh0LCBwb3M6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBwb3MgLSAzMCk7XG4gICAgY29uc3QgdGV4dCA9IGRvYy5zbGljZVN0cmluZyhzdGFydCwgcG9zKTtcblxuICAgIGNvbnN0IG1hdGNoID0gLyhcXFMrKVxccyokLy5leGVjKHRleHQpO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIFB5dGhvbiBsaW50ZXIgZOG7sWEgdHLDqm4gc3ludGF4VHJlZSBwYXJzZSBlcnJvciDigJQgY8O5bmcgYXBwcm9hY2ggduG7m2kgU1FMIGxpbnRlci5cbiAgICogUGjDoXQgaGnhu4duIGzhu5dpIGPDuiBwaMOhcCBtw6AgQ29kZU1pcnJvciBQeXRob24gcGFyc2VyIMSRw6FuaCBk4bqldSBsw6AgZXJyb3Igbm9kZS5cbiAgICovXG4gIGNyZWF0ZVB5dGhvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgICAgY29uc3QgdHJlZSA9IHN5bnRheFRyZWUodmlldy5zdGF0ZSk7XG5cbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmICghbm9kZS50eXBlLmlzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGZyb20gPSBNYXRoLm1heCgwLCBub2RlLmZyb20gLSAxKTtcbiAgICAgICAgICBjb25zdCB0byA9IG5vZGUuZnJvbSA9PT0gbm9kZS50byA/IG5vZGUuZnJvbSArIDEgOiBub2RlLnRvO1xuXG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG86IE1hdGgubWluKHRvLCBkb2MubGVuZ3RoKSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5idWlsZFB5dGhvbkVycm9yTWVzc2FnZShkb2MsIG5vZGUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFB5dGhvbkVycm9yTWVzc2FnZShkb2M6IFRleHQsIG5vZGU6IFN5bnRheE5vZGVSZWYpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLmZyb20gIT09IG5vZGUudG8pIHtcbiAgICAgIGNvbnN0IHRleHQgPSBkb2Muc2xpY2VTdHJpbmcobm9kZS5mcm9tLCBub2RlLnRvKS50cmltKCk7XG4gICAgICBjb25zdCB0ZXh0U3VmZml4ID0gdGV4dCA/IGAgbmVhciBcIiR7dGV4dH1cImAgOiAnJztcbiAgICAgIHJldHVybiBgUHl0aG9uIHN5bnRheCBlcnJvciR7dGV4dFN1ZmZpeH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUb2tlbiA9IHRoaXMuZ2V0VG9rZW5CZWZvcmUoZG9jLCBub2RlLmZyb20pO1xuXG4gICAgaWYgKCFwcmV2VG9rZW4pIHtcbiAgICAgIHJldHVybiAnUHl0aG9uIHN5bnRheCBlcnJvcic7XG4gICAgfVxuXG4gICAgaWYgKC9eZGVmJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBmdW5jdGlvbiBuYW1lIGFmdGVyIFwiZGVmXCInO1xuICAgIGlmICgvXmNsYXNzJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBjbGFzcyBuYW1lIGFmdGVyIFwiY2xhc3NcIic7XG4gICAgaWYgKC9ecmV0dXJuJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdJbnZhbGlkIGV4cHJlc3Npb24gYWZ0ZXIgXCJyZXR1cm5cIic7XG4gICAgaWYgKC9eaW1wb3J0JC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBtb2R1bGUgbmFtZSBhZnRlciBcImltcG9ydFwiJztcbiAgICBpZiAoL15mcm9tJC9pLnRlc3QocHJldlRva2VuKSkgcmV0dXJuICdFeHBlY3RlZCBtb2R1bGUgbmFtZSBhZnRlciBcImZyb21cIic7XG4gICAgaWYgKC9eaWYkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIGNvbmRpdGlvbiBhZnRlciBcImlmXCInO1xuICAgIGlmICgvXmVsaWYkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIGNvbmRpdGlvbiBhZnRlciBcImVsaWZcIic7XG4gICAgaWYgKC9ed2hpbGUkL2kudGVzdChwcmV2VG9rZW4pKSByZXR1cm4gJ0V4cGVjdGVkIGNvbmRpdGlvbiBhZnRlciBcIndoaWxlXCInO1xuICAgIGlmICgvXmZvciQvaS50ZXN0KHByZXZUb2tlbikpIHJldHVybiAnRXhwZWN0ZWQgdmFyaWFibGUgYWZ0ZXIgXCJmb3JcIic7XG4gICAgaWYgKHByZXZUb2tlbi5lbmRzV2l0aCgnLicpKSByZXR1cm4gYEluY29tcGxldGUgYXR0cmlidXRlIGFjY2VzcyBvbiBcIiR7cHJldlRva2VuLnNsaWNlKDAsIC0xKX1cImA7XG4gICAgaWYgKHByZXZUb2tlbi5lbmRzV2l0aCgnKCcpKSByZXR1cm4gJ01pc3NpbmcgY2xvc2luZyBcIilcIic7XG4gICAgaWYgKHByZXZUb2tlbi5lbmRzV2l0aCgnWycpKSByZXR1cm4gJ01pc3NpbmcgY2xvc2luZyBcIl1cIic7XG5cbiAgICByZXR1cm4gYFB5dGhvbiBzeW50YXggZXJyb3IgbmVhciBcIiR7cHJldlRva2VufVwiYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBDb2RlTWlycm9yIGV4dGVuc2lvbiBjaG8gY3VzdG9tIGNvbXBsZXRpb25zIHThu6sgZGFuaCBzw6FjaCBpbnB1dC5cbiAgICogSOG7lyB0cuG7oyAyIGNo4bq/IMSR4buZOlxuICAgKiAxLiBHw7UgdMOqbiBiaeG6v24g4oaSIGfhu6NpIMO9IHRvcC1sZXZlbCBpdGVtc1xuICAgKiAyLiBHw7UgYG9iai5gIOKGkiBn4bujaSDDvSBwcm9wZXJ0aWVzIGPhu6dhIG9ialxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZENvbXBsZXRpb25FeHRlbnNpb24oaXRlbXM6IElQcmV2aWV3VGV4dERhdGFDb21wbGV0aW9uSXRlbVtdKTogRXh0ZW5zaW9uIHtcbiAgICBjb25zdCBjb21wbGV0aW9uU291cmNlID0gKGNvbnRleHQ6IENvbXBsZXRpb25Db250ZXh0KTogQ29tcGxldGlvblJlc3VsdCB8IG51bGwgPT4ge1xuICAgICAgLy8gQ2jhur8gxJHhu5kgZG90LW5vdGF0aW9uOiBnw7UgXCJvYmoucHJvcFwiIOKGkiBn4bujaSDDvSBwcm9wZXJ0aWVzIGPhu6dhIG9ialxuICAgICAgY29uc3QgZG90TWF0Y2ggPSBjb250ZXh0Lm1hdGNoQmVmb3JlKC9cXHcrXFwuXFx3Ki8pO1xuICAgICAgaWYgKGRvdE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGRvdFBvcyA9IGRvdE1hdGNoLnRleHQuaW5kZXhPZignLicpO1xuICAgICAgICBjb25zdCBvYmplY3ROYW1lID0gZG90TWF0Y2gudGV4dC5zbGljZSgwLCBkb3RQb3MpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBpdGVtcy5maW5kKChpKSA9PiBpLmxhYmVsID09PSBvYmplY3ROYW1lKTtcbiAgICAgICAgaWYgKHBhcmVudD8ucHJvcGVydGllcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZyb206IGRvdE1hdGNoLmZyb20gKyBkb3RQb3MgKyAxLFxuICAgICAgICAgICAgb3B0aW9uczogcGFyZW50LnByb3BlcnRpZXMubWFwKChwKSA9PiAoe1xuICAgICAgICAgICAgICBsYWJlbDogcC5sYWJlbCxcbiAgICAgICAgICAgICAgdHlwZTogcC50eXBlID8/ICdwcm9wZXJ0eScsXG4gICAgICAgICAgICAgIGRldGFpbDogcC5kZXRhaWwgPz8gJycsXG4gICAgICAgICAgICAgIGluZm86IHAuaW5mbyA/PyAnJyxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENo4bq/IMSR4buZIHRvcC1sZXZlbDogZ+G7o2kgw70gdMOqbiBiaeG6v24vb2JqZWN0IGtoaSBnw7Uga8O9IHThu7FcbiAgICAgIGNvbnN0IHdvcmQgPSBjb250ZXh0Lm1hdGNoQmVmb3JlKC9cXHcqLyk7XG4gICAgICBpZiAoIXdvcmQgfHwgKHdvcmQuZnJvbSA9PT0gd29yZC50byAmJiAhY29udGV4dC5leHBsaWNpdCkpIHJldHVybiBudWxsO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiB3b3JkLmZyb20sXG4gICAgICAgIG9wdGlvbnM6IGl0ZW1zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgICB0eXBlOiBpdGVtLnR5cGUgPz8gJ3ZhcmlhYmxlJyxcbiAgICAgICAgICBkZXRhaWw6IGl0ZW0uZGV0YWlsID8/ICcnLFxuICAgICAgICAgIGluZm86IGl0ZW0uaW5mbyA/PyAnJyxcbiAgICAgICAgfSkpLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGF1dG9jb21wbGV0aW9uKHsgb3ZlcnJpZGU6IFtjb21wbGV0aW9uU291cmNlXSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBleHRlbnNpb24gYuG6o28gbeG6rXQgZ+G7k20gMiBsYXllcjpcbiAgICogMS4gTGludGVyOiBoaWdobGlnaHQgxJHhu48gdOG6oWkgxJHDum5nIHbhu4sgdHLDrSBtYXRjaCArIGVtaXQgb3V0VmlvbGF0aW9uc1xuICAgKiAyLiBUcmFuc2FjdGlvbiBmaWx0ZXI6IGNo4bq3biBwYXN0ZSBu4bq/dSBu4buZaSBkdW5nIHBhc3RlIGNo4bupYSBwYXR0ZXJuIGPhuqVtXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRm9yYmlkZGVuRXh0ZW5zaW9uKHBhdHRlcm5zOiBUX0ZvcmJpZGRlblBhdHRlcm5bXSk6IEV4dGVuc2lvbiB7XG4gICAgY29uc3QgdG9HbG9iYWxSZWdleCA9IChwOiBUX0ZvcmJpZGRlblBhdHRlcm4pOiBSZWdFeHAgPT4ge1xuICAgICAgaWYgKHAgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSBwLmZsYWdzLmluY2x1ZGVzKCdnJykgPyBwLmZsYWdzIDogYCR7cC5mbGFnc31nYDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocC5zb3VyY2UsIGZsYWdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgocCksICdnaScpO1xuICAgIH07XG5cbiAgICBjb25zdCBmb3JiaWRkZW5MaW50ZXIgPSBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IElQcmV2aWV3VGV4dERhdGFWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3QgdGV4dCA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCB0cmVlID0gc3ludGF4VHJlZSh2aWV3LnN0YXRlKTtcblxuICAgICAgLy8gQnVpbGQgYSBTZXQgb2YgY29tbWVudCByYW5nZXMgdOG7qyBBU1QgxJHhu4Mgc2tpcCBtYXRjaCBu4bqxbSB0cm9uZyBjb21tZW50XG4gICAgICBjb25zdCBjb21tZW50UmFuZ2VzOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9W10gPSBbXTtcbiAgICAgIHRyZWUuaXRlcmF0ZSh7XG4gICAgICAgIGVudGVyOiAobm9kZTogU3ludGF4Tm9kZVJlZikgPT4ge1xuICAgICAgICAgIGlmIChub2RlLnR5cGUubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjb21tZW50JykpIHtcbiAgICAgICAgICAgIGNvbW1lbnRSYW5nZXMucHVzaCh7IGZyb206IG5vZGUuZnJvbSwgdG86IG5vZGUudG8gfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGlzSW5Db21tZW50ID0gKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IGJvb2xlYW4gPT4gY29tbWVudFJhbmdlcy5zb21lKChyKSA9PiBmcm9tID49IHIuZnJvbSAmJiB0byA8PSByLnRvKTtcblxuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgIGNvbnN0IHJlID0gdG9HbG9iYWxSZWdleChwYXR0ZXJuKTtcbiAgICAgICAgcmUubGFzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuXG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGZyb20gPSBtYXRjaC5pbmRleDtcbiAgICAgICAgICBjb25zdCB0byA9IGZyb20gKyBtYXRjaFswXS5sZW5ndGg7XG5cbiAgICAgICAgICBpZiAoaXNJbkNvbW1lbnQoZnJvbSwgdG8pKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGxpbmUgPSB2aWV3LnN0YXRlLmRvYy5saW5lQXQoZnJvbSkubnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHBhdHRlcm5MYWJlbCA9IHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHAgPyBwYXR0ZXJuLnNvdXJjZSA6IHBhdHRlcm47XG5cbiAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICB0byxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogYE3DoyBi4buLIGPhuqVtOiBcIiR7bWF0Y2hbMF19XCIg4oCUIHZpIHBo4bqhbSBjaMOtbmggc8OhY2ggYuG6o28gbeG6rXRgLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHsgZnJvbSwgdG8sIGxpbmUsIHBhdHRlcm46IHBhdHRlcm5MYWJlbCwgbWF0Y2hlZDogbWF0Y2hbMF0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5vdXRWaW9sYXRpb25zLmVtaXQodmlvbGF0aW9ucyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG5cbiAgICAvLyBDaOG6t24gcGFzdGUgbuG6v3UgbuG7mWkgZHVuZyBwYXN0ZSBjaOG7qWEgYuG6pXQga+G7syBwYXR0ZXJuIGPhuqVtIG7DoG9cbiAgICBjb25zdCBwYXN0ZUZpbHRlciA9IEVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRmlsdGVyLm9mKCh0cjogVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGlmICghdHIuZG9jQ2hhbmdlZCkgcmV0dXJuIHRyO1xuICAgICAgaWYgKCF0ci5hbm5vdGF0aW9uKFRyYW5zYWN0aW9uLnVzZXJFdmVudCk/LnN0YXJ0c1dpdGgoJ2lucHV0LnBhc3RlJykpIHJldHVybiB0cjtcblxuICAgICAgY29uc3QgbmV3VGV4dCA9IHRyLm5ld0RvYy50b1N0cmluZygpO1xuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgIGNvbnN0IHJlID0gdG9HbG9iYWxSZWdleChwYXR0ZXJuKTtcbiAgICAgICAgcmUubGFzdEluZGV4ID0gMDtcbiAgICAgICAgaWYgKHJlLnRlc3QobmV3VGV4dCkpIHJldHVybiBbXTsgLy8gW10gPSBibG9jayB0cmFuc2FjdGlvblxuICAgICAgfVxuICAgICAgcmV0dXJuIHRyO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFtmb3JiaWRkZW5MaW50ZXIsIHBhc3RlRmlsdGVyXTtcbiAgfVxuXG4gIHByaXZhdGUgZXNjYXBlUmVnZXgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBNRVRIT0RTIC0gRXZlbnQgaGFuZGxlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNvcHkoKTogdm9pZCB7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5jb250ZW50KCkgfHwgJycpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93Q29tcFR5cGVUZXh0SW5mbygnU2FvIGNow6lwIHRow6BuaCBjw7RuZycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMaW5lV3JhcCgpOiB2b2lkIHtcbiAgICAvLyBM4bqleSBu4buZaSBkdW5nIG3hu5tpIG5o4bqldCB04burIGVkaXRvciBzYXUga2hpIMSRw6MgeMOzYSBuZXdsaW5lc1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LnN0YXRlLmRvYy50b1N0cmluZygpIHx8ICcnO1xuICAgIGlmICh0aGlzLmlzV3JhcCgpKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdGF0ZU5vV3JhcC5zZXQoY3VycmVudENvbnRlbnQpO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHRoaXMuaXNXcmFwKCkgJiYgY3VycmVudENvbnRlbnQgPyBjdXJyZW50Q29udGVudC5yZXBsYWNlKC9cXG4vZywgJyAnKSA6IHRoaXMuY29udGVudFN0YXRlTm9XcmFwKCk7XG4gICAgdGhpcy5pc1dyYXAudXBkYXRlKCh2YWwpID0+ICF2YWwpO1xuXG4gICAgaWYgKGN1cnJlbnRDb250ZW50ICE9PSB1cGRhdGVkQ29udGVudCkge1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgICAgY2hhbmdlczogeyBmcm9tOiAwLCB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLCBpbnNlcnQ6IHVwZGF0ZWRDb250ZW50IH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCYXRjaCBj4bqjIDIgZGlzcGF0Y2ggdGjDoG5oIDEgxJHhu4MgdOG7kWkgxrB1IHBlcmZvcm1hbmNlXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLndyYXBDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gRWRpdG9yVmlldy5saW5lV3JhcHBpbmcgOiBbXSksIHRoaXMubGluZU51bWJlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKHRoaXMuaXNXcmFwKCkgPyBsaW5lTnVtYmVycygpIDogW10pXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0S2V5KGRhdGE/OiBJRW1pdFNlbGVjdEtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZGF0YT8ua2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TGFuZyA9IGRhdGEua2V5IGFzIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ7XG4gICAgdGhpcy5sYW5nU2VsZWN0ZWQuc2V0KG5ld0xhbmcpO1xuXG4gICAgLy8gTG9hZCBsYW5ndWFnZSB2w6AgbGludGVyIG3hu5tpXG4gICAgY29uc3QgW2xhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMubG9hZExhbmd1YWdlRXh0ZW5zaW9uKG5ld0xhbmcpLCB0aGlzLmxvYWRMaW50ZXJFeHRlbnNpb24obmV3TGFuZyldKTtcblxuICAgIC8vIFJlY29uZmlndXJlIHRoYXkgdsOsIHThuqFvIG3hu5tpIHN0YXRlIMSR4buDIGdp4buvIGzhuqFpIGRvY3VtZW50IGNvbnRlbnRcbiAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogW3RoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShsYW5ndWFnZUV4dGVuc2lvbiksIHRoaXMubGludGVyQ29tcGFydG1lbnQucmVjb25maWd1cmUobGludGVyRXh0ZW5zaW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCgpLFxuICAgICAgaXNXcmFwOiAhdGhpcy5pc1dyYXAoKSxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmdTZWxlY3RlZCgpLFxuICAgICAgY29udGV4dENoYW5nZTogJ2xhbmd1YWdlJyxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImxpYnMtdWktcHJldmlldy1kYXRhLWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWF1dG8gcm91bmRlZC1bOHB4XSBsaWJzLXVpLWJvcmRlci1nZW5lcmFsIHB4LVs4cHhdXCJcbiAgW3N0eWxlLi0tYmFja2dyb3VuZC1jb2xvcl09XCJiYWNrZ3JvdW5kKClcIlxuICBbY2xhc3MucHQtWzhweF1dPVwiIWhpZGRlbkFjdGlvbigpXCI+XG4gIEBpZiAoIWhpZGRlbkFjdGlvbigpKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtYmV0d2VlbiBjb2xvci1bIzZhNzM4M11cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgY2xhc3NJbmNsdWRlPVwidy1bMjAwcHhdXCJcbiAgICAgICAgW2xpc3RDb25maWddPVwiY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcoKVwiXG4gICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiNVwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSgpIHx8ICFhY2NlcHRDaGFuZ2VMYW5nKClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0S2V5KCRldmVudClcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJsYWJlbExhbmcoKSB8fCAnJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvblJpZ2h0XT1cImVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCcgOiAnJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzBweF0nICsgKGVkaXRhYmxlKCkgJiYgYWNjZXB0Q2hhbmdlTGFuZygpID8gJycgOiAnIXBvaW50ZXItZXZlbnRzLW5vbmUgIWN1cnNvci1kZWZhdWx0IGhvdmVyOiF0ZXh0LVsjNkE3MzgzXScpXCIgLz5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiaXNXcmFwKCkgPyAnaTE4bl9yZW1vdmVfbGluZV93cmFwJyA6ICdpMThuX2xpbmVfd3JhcCdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cImlzV3JhcCgpID8gJ2xpYnMtdWktaWNvbi11bndyYXAnIDogJ2xpYnMtdWktaWNvbi13cmFwJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4IG1vLWxpYi1tci0xNnB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJMaW5lV3JhcCgpXCIgLz5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9jb3B5J1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1jb3B5J1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInbW8tbGliLXAtMHB4J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDb3B5KClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIH1cbiAgPGRpdiAjY29udGFpbmVyUHJldmlldz48L2Rpdj5cbjwvZGl2PlxuIl19
@@ -22,7 +22,7 @@ export const optionsLangData = [
22
22
  { id: 'go', label: 'Go' },
23
23
  ];
24
24
  export const httpRequestConfigGetOptionsLang = (langsAccept, langsChangeLabel) => {
25
- const langs = [...optionsLangData].filter((item) => !langsAccept || !langsAccept.length || langsAccept.includes(item.id));
25
+ const langs = [...optionsLangData].filter((item) => !langsAccept?.length || langsAccept.includes(item.id));
26
26
  langs.forEach((item) => ({
27
27
  id: item.id,
28
28
  label: langsChangeLabel?.label || item.label,
@@ -156,4 +156,4 @@ export const createDefaultLanguage = async () => {
156
156
  },
157
157
  });
158
158
  };
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuZGVmaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2QyxPQUFPLEVBQXNCLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUE0QjtJQUN0RCxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtJQUNuQyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFO0lBQ3BELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO0lBQ3JDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO0lBQ3JDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzNCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzNCLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO0lBQ2pDLEVBQUUsRUFBRSxFQUFFLE1BQU0s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QixLQUFLLENBQUMsTUFBTTtZQUNWLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQcmV2aWV3VGV4dERhdGFDb21wb25lbnQgfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTGFuZ3VhZ2VPcHRpb25zLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JULCBUX0ZvcmJpZGRlblBhdHRlcm4gfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuXG4vKipcbiAqIERhbmggc8OhY2ggY8OhYyBuZ8O0biBuZ+G7ryDEkcaw4bujYyBo4buXIHRy4bujXG4gKiBT4butIGThu6VuZyBjb25zdCBhcnJheSDEkeG7gyB0csOhbmggdOG6oW8gbeG7m2kgbeG7l2kgbOG6p24gdHJ1eSBj4bqtcFxuICovXG5leHBvcnQgY29uc3Qgb3B0aW9uc0xhbmdEYXRhOiBBcnJheTxJTGFuZ3VhZ2VPcHRpb25zPiA9IFtcbiAgeyBpZDogJ3RleHQnLCBsYWJlbDogJ1BsYWluIFRleHQnIH0sXG4gIHsgaWQ6ICdqYXZhc2NyaXB0JywgbGFiZWw6ICdKYXZhU2NyaXB0L1R5cGVTY3JpcHQnIH0sXG4gIHsgaWQ6ICdodG1sJywgbGFiZWw6ICdIVE1MJyB9LFxuICB7IGlkOiAnY3NzJywgbGFiZWw6ICdDU1MvU0NTUy9TQVNTJyB9LFxuICB7IGlkOiAnbWFya2Rvd24nLCBsYWJlbDogJ01hcmtkb3duJyB9LFxuICB7IGlkOiAnanNvbicsIGxhYmVsOiAnSlNPTicgfSxcbiAgeyBpZDogJ3NxbCcsIGxhYmVsOiAnU1FMJyB9LFxuICB7IGlkOiAneG1sJywgbGFiZWw6ICdYTUwnIH0sXG4gIHsgaWQ6ICd5YW1sJywgbGFiZWw6ICdZQU1MJyB9LFxuICB7IGlkOiAncHl0aG9uJywgbGFiZWw6ICdQeXRob24nIH0sXG4gIHsgaWQ6ICdqYXZhJywgbGFiZWw6ICdKYXZhJyB9LFxuICB7IGlkOiAnY3BwJywgbGFiZWw6ICdDL0MrKycgfSxcbiAgeyBpZDogJ3BocCcsIGxhYmVsOiAnUEhQJyB9LFxuICB7IGlkOiAnZ28nLCBsYWJlbDogJ0dvJyB9LFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcgPSAobGFuZ3NBY2NlcHQ/OiBBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiwgbGFuZ3NDaGFuZ2VMYWJlbD86IElMYW5ndWFnZU9wdGlvbnMpOiBJTGlzdENvbmZpZ0l0ZW0gPT4ge1xuICBjb25zdCBsYW5ncyA9IFsuLi5vcHRpb25zTGFuZ0RhdGFdLmZpbHRlcigoaXRlbSkgPT4gIWxhbmdzQWNjZXB0IHx8ICFsYW5nc0FjY2VwdC5sZW5ndGggfHwgbGFuZ3NBY2NlcHQuaW5jbHVkZXMoaXRlbS5pZCBhcyBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUKSk7XG5cbiAgbGFuZ3MuZm9yRWFjaCgoaXRlbSkgPT4gKHtcbiAgICBpZDogaXRlbS5pZCxcbiAgICBsYWJlbDogbGFuZ3NDaGFuZ2VMYWJlbD8ubGFiZWwgfHwgaXRlbS5sYWJlbCxcbiAgfSkpO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3RleHQnLFxuICAgIGh0dHBSZXF1ZXN0RGF0YTogc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZz4oe1xuICAgICAgb2JqZWN0SW5zdGFuY2U6IHJldHVybkxpc3RPYmplY3QobGFuZ3MpLFxuICAgICAgZnVuY3Rpb25OYW1lOiAnbGlzdCcsXG4gICAgICBhcmd1bWVudHNWYWx1ZTogW25ldyBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0KHsgZnJvbU9iamVjdDogeyBwYWdlOiAxLCBwZXJfcGFnZTogNDAgfSB9KV0sXG4gICAgfSksXG4gICAgY29uZmlnVGVtcGxhdGVUZXh0OiBzaWduYWwoe1xuICAgICAgZmllbGRLZXk6ICdpZCcsXG4gICAgICBub3RVc2VWaXJ0dWFsU2Nyb2xsOiB0cnVlLFxuICAgIH0pLFxuICB9O1xufTtcblxudHlwZSBUX0xhbmd1YWdlTG9hZGVyID0gKCkgPT4gUHJvbWlzZTxFeHRlbnNpb24+O1xudHlwZSBUX0xpbnRlckxvYWRlciA9IChjb21wb25lbnQ6IExpYnNVaUNvbXBvbmVudHNQcmV2aWV3VGV4dERhdGFDb21wb25lbnQpID0+IFByb21pc2U8RXh0ZW5zaW9uPjtcbmludGVyZmFjZSBJX0xhbmd1YWdlUmVnaXN0cnlJdGVtIHtcbiAgbG9hZGVyOiBUX0xhbmd1YWdlTG9hZGVyO1xuICBsaW50ZXI/OiBUX0xpbnRlckxvYWRlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlUmVnaXN0cnk6IFJlY29yZDxzdHJpbmcsIElfTGFuZ3VhZ2VSZWdpc3RyeUl0ZW0+ID0ge1xuICBqYXZhc2NyaXB0OiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGphdmFzY3JpcHQgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1qYXZhc2NyaXB0Jyk7XG4gICAgICByZXR1cm4gamF2YXNjcmlwdCh7IGpzeDogdHJ1ZSwgdHlwZXNjcmlwdDogdHJ1ZSB9KTtcbiAgICB9LFxuICAgIGxpbnRlcjogYXN5bmMgKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmNyZWF0ZUpzTGludGVyKCksXG4gIH0sXG4gIGh0bWw6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaHRtbCB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWh0bWwnKTtcbiAgICAgIHJldHVybiBodG1sKCk7XG4gICAgfSxcbiAgfSxcbiAgY3NzOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNzcyB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWNzcycpO1xuICAgICAgcmV0dXJuIGNzcygpO1xuICAgIH0sXG4gIH0sXG4gIG1hcmtkb3duOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IG1hcmtkb3duIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctbWFya2Rvd24nKTtcbiAgICAgIHJldHVybiBtYXJrZG93bigpO1xuICAgIH0sXG4gIH0sXG4gIGpzb246IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsganNvbiB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWpzb24nKTtcbiAgICAgIHJldHVybiBqc29uKCk7XG4gICAgfSxcbiAgICBsaW50ZXI6IGFzeW5jIChjb21wb25lbnQpID0+IGNvbXBvbmVudC5jcmVhdGVKc29uTGludGVyKCksXG4gIH0sXG4gIHNxbDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBzcWwgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1zcWwnKTtcbiAgICAgIHJldHVybiBzcWwoKTtcbiAgICB9LFxuICAgIGxpbnRlcjogYXN5bmMgKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmNyZWF0ZVNxbExpbnRlcigpLFxuICB9LFxuICB4bWw6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgeG1sIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmcteG1sJyk7XG4gICAgICByZXR1cm4geG1sKCk7XG4gICAgfSxcbiAgfSxcbiAgeWFtbDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyB5YW1sIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmcteWFtbCcpO1xuICAgICAgcmV0dXJuIHlhbWwoKTtcbiAgICB9LFxuICB9LFxuICBweXRob246IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHl0aG9uIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctcHl0aG9uJyk7XG4gICAgICByZXR1cm4gcHl0aG9uKCk7XG4gICAgfSxcbiAgICBsaW50ZXI6IGFzeW5jIChjb21wb25lbnQpID0+IGNvbXBvbmVudC5jcmVhdGVQeXRob25MaW50ZXIoKSxcbiAgfSxcbiAgamF2YToge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBqYXZhIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctamF2YScpO1xuICAgICAgcmV0dXJuIGphdmEoKTtcbiAgICB9LFxuICB9LFxuICBjcHA6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY3BwIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctY3BwJyk7XG4gICAgICByZXR1cm4gY3BwKCk7XG4gICAgfSxcbiAgfSxcbiAgcGhwOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBocCB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLXBocCcpO1xuICAgICAgcmV0dXJuIHBocCgpO1xuICAgIH0sXG4gIH0sXG4gIGdvOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdvIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctZ28nKTtcbiAgICAgIHJldHVybiBnbygpO1xuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIELhu5kgcGF0dGVybiBi4bqjbyBt4bqtdCBt4bq3YyDEkeG7i25oIGNobyBsb3ctY29kZSBwbGF0Zm9ybS5cbiAqIENo4bq3biBjw6FjIEFQSSBuZ3V5IGhp4buDbTogZXZhbCwgbmV0d29yayBjYWxscywgc3RvcmFnZSwgRE9NIGluamVjdGlvbi4uLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRUNVUklUWV9QQVRURVJOUzogVF9Gb3JiaWRkZW5QYXR0ZXJuW10gPSBbXG4gIC9ldmFsXFxzKlxcKC9pLFxuICAvbmV3XFxzK0Z1bmN0aW9uXFxzKlxcKC9pLFxuICAvZG9jdW1lbnRcXC5jb29raWUvaSxcbiAgL2xvY2FsU3RvcmFnZS9pLFxuICAvc2Vzc2lvblN0b3JhZ2UvaSxcbiAgL2ZldGNoXFxzKlxcKC9pLFxuICAvbmV3XFxzK1hNTEh0dHBSZXF1ZXN0L2ksXG4gIC9yZXF1aXJlXFxzKlxcKC9pLFxuICAvaW1wb3J0XFxzKlxcKC9pLFxuICAvcHJvY2Vzc1xcLmVudi9pLFxuICAvPHNjcmlwdC9pLFxuICAvZG9jdW1lbnRcXC53cml0ZVxccypcXCgvaSxcbiAgL3dpbmRvd1xcLmxvY2F0aW9uXFxzKj0vaSxcbl07XG5cbi8qKlxuICogVOG6oW8gZGVmYXVsdCBsYW5ndWFnZSBleHRlbnNpb24gY2hvIHBsYWluIHRleHRcbiAqIFPhu60gZOG7pW5nIGtoaSBuZ8O0biBuZ+G7ryBraMO0bmcgxJHGsOG7o2MgaOG7lyB0cuG7o1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdExhbmd1YWdlID0gYXN5bmMgKCk6IFByb21pc2U8RXh0ZW5zaW9uPiA9PiB7XG4gIGNvbnN0IHsgU3RyZWFtTGFuZ3VhZ2UgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnKTtcbiAgcmV0dXJuIFN0cmVhbUxhbmd1YWdlLmRlZmluZSh7XG4gICAgdG9rZW4oc3RyZWFtKSB7XG4gICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICB9KTtcbn07XG4iXX0=
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuZGVmaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2QyxPQUFPLEVBQXNCLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUE0QjtJQUN0RCxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRTtJQUNuQyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFO0lBQ3BELEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFO0lBQ3JDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO0lBQ3JDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzNCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO0lBQzNCLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0lBQzdCLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO0lBQ2pDLEVBQUUsRUFBRSxFQUFFLE1BQU0s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TTtZQUNWLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIHJldHVybkxpc3RPYmplY3QgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgVXRpbHNIdHRwUGFyYW1zUmVxdWVzdCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNQcmV2aWV3VGV4dERhdGFDb21wb25lbnQgfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTGFuZ3VhZ2VPcHRpb25zLCBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JULCBUX0ZvcmJpZGRlblBhdHRlcm4gfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuXG4vKipcbiAqIERhbmggc8OhY2ggY8OhYyBuZ8O0biBuZ+G7ryDEkcaw4bujYyBo4buXIHRy4bujXG4gKiBT4butIGThu6VuZyBjb25zdCBhcnJheSDEkeG7gyB0csOhbmggdOG6oW8gbeG7m2kgbeG7l2kgbOG6p24gdHJ1eSBj4bqtcFxuICovXG5leHBvcnQgY29uc3Qgb3B0aW9uc0xhbmdEYXRhOiBBcnJheTxJTGFuZ3VhZ2VPcHRpb25zPiA9IFtcbiAgeyBpZDogJ3RleHQnLCBsYWJlbDogJ1BsYWluIFRleHQnIH0sXG4gIHsgaWQ6ICdqYXZhc2NyaXB0JywgbGFiZWw6ICdKYXZhU2NyaXB0L1R5cGVTY3JpcHQnIH0sXG4gIHsgaWQ6ICdodG1sJywgbGFiZWw6ICdIVE1MJyB9LFxuICB7IGlkOiAnY3NzJywgbGFiZWw6ICdDU1MvU0NTUy9TQVNTJyB9LFxuICB7IGlkOiAnbWFya2Rvd24nLCBsYWJlbDogJ01hcmtkb3duJyB9LFxuICB7IGlkOiAnanNvbicsIGxhYmVsOiAnSlNPTicgfSxcbiAgeyBpZDogJ3NxbCcsIGxhYmVsOiAnU1FMJyB9LFxuICB7IGlkOiAneG1sJywgbGFiZWw6ICdYTUwnIH0sXG4gIHsgaWQ6ICd5YW1sJywgbGFiZWw6ICdZQU1MJyB9LFxuICB7IGlkOiAncHl0aG9uJywgbGFiZWw6ICdQeXRob24nIH0sXG4gIHsgaWQ6ICdqYXZhJywgbGFiZWw6ICdKYXZhJyB9LFxuICB7IGlkOiAnY3BwJywgbGFiZWw6ICdDL0MrKycgfSxcbiAgeyBpZDogJ3BocCcsIGxhYmVsOiAnUEhQJyB9LFxuICB7IGlkOiAnZ28nLCBsYWJlbDogJ0dvJyB9LFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcgPSAobGFuZ3NBY2NlcHQ/OiBBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiwgbGFuZ3NDaGFuZ2VMYWJlbD86IElMYW5ndWFnZU9wdGlvbnMpOiBJTGlzdENvbmZpZ0l0ZW0gPT4ge1xuICBjb25zdCBsYW5ncyA9IFsuLi5vcHRpb25zTGFuZ0RhdGFdLmZpbHRlcigoaXRlbSkgPT4gIWxhbmdzQWNjZXB0Py5sZW5ndGggfHwgKGxhbmdzQWNjZXB0IGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhpdGVtLmlkKSk7XG5cbiAgbGFuZ3MuZm9yRWFjaCgoaXRlbSkgPT4gKHtcbiAgICBpZDogaXRlbS5pZCxcbiAgICBsYWJlbDogbGFuZ3NDaGFuZ2VMYWJlbD8ubGFiZWwgfHwgaXRlbS5sYWJlbCxcbiAgfSkpO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3RleHQnLFxuICAgIGh0dHBSZXF1ZXN0RGF0YTogc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZz4oe1xuICAgICAgb2JqZWN0SW5zdGFuY2U6IHJldHVybkxpc3RPYmplY3QobGFuZ3MpLFxuICAgICAgZnVuY3Rpb25OYW1lOiAnbGlzdCcsXG4gICAgICBhcmd1bWVudHNWYWx1ZTogW25ldyBVdGlsc0h0dHBQYXJhbXNSZXF1ZXN0KHsgZnJvbU9iamVjdDogeyBwYWdlOiAxLCBwZXJfcGFnZTogNDAgfSB9KV0sXG4gICAgfSksXG4gICAgY29uZmlnVGVtcGxhdGVUZXh0OiBzaWduYWwoe1xuICAgICAgZmllbGRLZXk6ICdpZCcsXG4gICAgICBub3RVc2VWaXJ0dWFsU2Nyb2xsOiB0cnVlLFxuICAgIH0pLFxuICB9O1xufTtcblxudHlwZSBUX0xhbmd1YWdlTG9hZGVyID0gKCkgPT4gUHJvbWlzZTxFeHRlbnNpb24+O1xudHlwZSBUX0xpbnRlckxvYWRlciA9IChjb21wb25lbnQ6IExpYnNVaUNvbXBvbmVudHNQcmV2aWV3VGV4dERhdGFDb21wb25lbnQpID0+IFByb21pc2U8RXh0ZW5zaW9uPjtcbmludGVyZmFjZSBJX0xhbmd1YWdlUmVnaXN0cnlJdGVtIHtcbiAgbG9hZGVyOiBUX0xhbmd1YWdlTG9hZGVyO1xuICBsaW50ZXI/OiBUX0xpbnRlckxvYWRlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGxhbmd1YWdlUmVnaXN0cnk6IFJlY29yZDxzdHJpbmcsIElfTGFuZ3VhZ2VSZWdpc3RyeUl0ZW0+ID0ge1xuICBqYXZhc2NyaXB0OiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGphdmFzY3JpcHQgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1qYXZhc2NyaXB0Jyk7XG4gICAgICByZXR1cm4gamF2YXNjcmlwdCh7IGpzeDogdHJ1ZSwgdHlwZXNjcmlwdDogdHJ1ZSB9KTtcbiAgICB9LFxuICAgIGxpbnRlcjogYXN5bmMgKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmNyZWF0ZUpzTGludGVyKCksXG4gIH0sXG4gIGh0bWw6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaHRtbCB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWh0bWwnKTtcbiAgICAgIHJldHVybiBodG1sKCk7XG4gICAgfSxcbiAgfSxcbiAgY3NzOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNzcyB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWNzcycpO1xuICAgICAgcmV0dXJuIGNzcygpO1xuICAgIH0sXG4gIH0sXG4gIG1hcmtkb3duOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IG1hcmtkb3duIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctbWFya2Rvd24nKTtcbiAgICAgIHJldHVybiBtYXJrZG93bigpO1xuICAgIH0sXG4gIH0sXG4gIGpzb246IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsganNvbiB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLWpzb24nKTtcbiAgICAgIHJldHVybiBqc29uKCk7XG4gICAgfSxcbiAgICBsaW50ZXI6IGFzeW5jIChjb21wb25lbnQpID0+IGNvbXBvbmVudC5jcmVhdGVKc29uTGludGVyKCksXG4gIH0sXG4gIHNxbDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBzcWwgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZy1zcWwnKTtcbiAgICAgIHJldHVybiBzcWwoKTtcbiAgICB9LFxuICAgIGxpbnRlcjogYXN5bmMgKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmNyZWF0ZVNxbExpbnRlcigpLFxuICB9LFxuICB4bWw6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgeG1sIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmcteG1sJyk7XG4gICAgICByZXR1cm4geG1sKCk7XG4gICAgfSxcbiAgfSxcbiAgeWFtbDoge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyB5YW1sIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmcteWFtbCcpO1xuICAgICAgcmV0dXJuIHlhbWwoKTtcbiAgICB9LFxuICB9LFxuICBweXRob246IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcHl0aG9uIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctcHl0aG9uJyk7XG4gICAgICByZXR1cm4gcHl0aG9uKCk7XG4gICAgfSxcbiAgICBsaW50ZXI6IGFzeW5jIChjb21wb25lbnQpID0+IGNvbXBvbmVudC5jcmVhdGVQeXRob25MaW50ZXIoKSxcbiAgfSxcbiAgamF2YToge1xuICAgIGxvYWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBqYXZhIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctamF2YScpO1xuICAgICAgcmV0dXJuIGphdmEoKTtcbiAgICB9LFxuICB9LFxuICBjcHA6IHtcbiAgICBsb2FkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY3BwIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctY3BwJyk7XG4gICAgICByZXR1cm4gY3BwKCk7XG4gICAgfSxcbiAgfSxcbiAgcGhwOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IHBocCB9ID0gYXdhaXQgaW1wb3J0KCdAY29kZW1pcnJvci9sYW5nLXBocCcpO1xuICAgICAgcmV0dXJuIHBocCgpO1xuICAgIH0sXG4gIH0sXG4gIGdvOiB7XG4gICAgbG9hZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdvIH0gPSBhd2FpdCBpbXBvcnQoJ0Bjb2RlbWlycm9yL2xhbmctZ28nKTtcbiAgICAgIHJldHVybiBnbygpO1xuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIELhu5kgcGF0dGVybiBi4bqjbyBt4bqtdCBt4bq3YyDEkeG7i25oIGNobyBsb3ctY29kZSBwbGF0Zm9ybS5cbiAqIENo4bq3biBjw6FjIEFQSSBuZ3V5IGhp4buDbTogZXZhbCwgbmV0d29yayBjYWxscywgc3RvcmFnZSwgRE9NIGluamVjdGlvbi4uLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRUNVUklUWV9QQVRURVJOUzogVF9Gb3JiaWRkZW5QYXR0ZXJuW10gPSBbXG4gIC9ldmFsXFxzKlxcKC9pLFxuICAvbmV3XFxzK0Z1bmN0aW9uXFxzKlxcKC9pLFxuICAvZG9jdW1lbnRcXC5jb29raWUvaSxcbiAgL2xvY2FsU3RvcmFnZS9pLFxuICAvc2Vzc2lvblN0b3JhZ2UvaSxcbiAgL2ZldGNoXFxzKlxcKC9pLFxuICAvbmV3XFxzK1hNTEh0dHBSZXF1ZXN0L2ksXG4gIC9yZXF1aXJlXFxzKlxcKC9pLFxuICAvaW1wb3J0XFxzKlxcKC9pLFxuICAvcHJvY2Vzc1xcLmVudi9pLFxuICAvPHNjcmlwdC9pLFxuICAvZG9jdW1lbnRcXC53cml0ZVxccypcXCgvaSxcbiAgL3dpbmRvd1xcLmxvY2F0aW9uXFxzKj0vaSxcbl07XG5cbi8qKlxuICogVOG6oW8gZGVmYXVsdCBsYW5ndWFnZSBleHRlbnNpb24gY2hvIHBsYWluIHRleHRcbiAqIFPhu60gZOG7pW5nIGtoaSBuZ8O0biBuZ+G7ryBraMO0bmcgxJHGsOG7o2MgaOG7lyB0cuG7o1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdExhbmd1YWdlID0gYXN5bmMgKCk6IFByb21pc2U8RXh0ZW5zaW9uPiA9PiB7XG4gIGNvbnN0IHsgU3RyZWFtTGFuZ3VhZ2UgfSA9IGF3YWl0IGltcG9ydCgnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnKTtcbiAgcmV0dXJuIFN0cmVhbUxhbmd1YWdlLmRlZmluZSh7XG4gICAgdG9rZW4oc3RyZWFtKSB7XG4gICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICB9KTtcbn07XG4iXX0=
@@ -33,7 +33,7 @@ const optionsLangData = [
33
33
  { id: 'go', label: 'Go' },
34
34
  ];
35
35
  const httpRequestConfigGetOptionsLang = (langsAccept, langsChangeLabel) => {
36
- const langs = [...optionsLangData].filter((item) => !langsAccept || !langsAccept.length || langsAccept.includes(item.id));
36
+ const langs = [...optionsLangData].filter((item) => !langsAccept?.length || langsAccept.includes(item.id));
37
37
  langs.forEach((item) => ({
38
38
  id: item.id,
39
39
  label: langsChangeLabel?.label || item.label,
@@ -193,7 +193,7 @@ class LibsUiComponentsPreviewTextDataComponent {
193
193
  // PROTECTED SIGNALS
194
194
  // ==========================================================================
195
195
  isWrap = signal(true);
196
- configLoadDataIsHttpConfig = signal(httpRequestConfigGetOptionsLang(undefined));
196
+ configLoadDataIsHttpConfig = signal(httpRequestConfigGetOptionsLang());
197
197
  labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);
198
198
  acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));
199
199
  // ==========================================================================
@@ -425,7 +425,7 @@ class LibsUiComponentsPreviewTextDataComponent {
425
425
  for (let lineNum = 1; lineNum <= doc.lines; lineNum++) {
426
426
  const line = doc.line(lineNum);
427
427
  const trimmed = line.text.trimEnd();
428
- const match = trimmed.match(/(\w+)\.\s*$/);
428
+ const match = /(\w+)\.\s*$/.exec(trimmed);
429
429
  if (!match)
430
430
  continue;
431
431
  trailingDotLines.add(lineNum);
@@ -475,9 +475,9 @@ class LibsUiComponentsPreviewTextDataComponent {
475
475
  const prevToken = this.getTokenBefore(doc, node.from);
476
476
  if (!prevToken)
477
477
  return 'JavaScript syntax error';
478
- if (/\($/.test(prevToken))
478
+ if (prevToken.endsWith('('))
479
479
  return 'Missing closing ")"';
480
- if (/\[$/.test(prevToken))
480
+ if (prevToken.endsWith('['))
481
481
  return 'Missing closing "]"';
482
482
  if (/^function$/i.test(prevToken))
483
483
  return 'Expected function name or "("';
@@ -554,7 +554,7 @@ class LibsUiComponentsPreviewTextDataComponent {
554
554
  if (/WHERE$/i.test(prevToken)) {
555
555
  return 'Expected condition after WHERE';
556
556
  }
557
- if (/\($/.test(prevToken)) {
557
+ if (prevToken.endsWith('(')) {
558
558
  return 'Missing closing ")"';
559
559
  }
560
560
  return `Unexpected end of SQL after "${prevToken}"`;
@@ -562,7 +562,7 @@ class LibsUiComponentsPreviewTextDataComponent {
562
562
  getTokenBefore(doc, pos) {
563
563
  const start = Math.max(0, pos - 30);
564
564
  const text = doc.sliceString(start, pos);
565
- const match = text.match(/(\S+)\s*$/);
565
+ const match = /(\S+)\s*$/.exec(text);
566
566
  return match?.[1] ?? '';
567
567
  }
568
568
  /**
@@ -595,7 +595,8 @@ class LibsUiComponentsPreviewTextDataComponent {
595
595
  buildPythonErrorMessage(doc, node) {
596
596
  if (node.from !== node.to) {
597
597
  const text = doc.sliceString(node.from, node.to).trim();
598
- return `Python syntax error${text ? ` near "${text}"` : ''}`;
598
+ const textSuffix = text ? ` near "${text}"` : '';
599
+ return `Python syntax error${textSuffix}`;
599
600
  }
600
601
  const prevToken = this.getTokenBefore(doc, node.from);
601
602
  if (!prevToken) {
@@ -619,11 +620,11 @@ class LibsUiComponentsPreviewTextDataComponent {
619
620
  return 'Expected condition after "while"';
620
621
  if (/^for$/i.test(prevToken))
621
622
  return 'Expected variable after "for"';
622
- if (/\.$/.test(prevToken))
623
+ if (prevToken.endsWith('.'))
623
624
  return `Incomplete attribute access on "${prevToken.slice(0, -1)}"`;
624
- if (/\($/.test(prevToken))
625
+ if (prevToken.endsWith('('))
625
626
  return 'Missing closing ")"';
626
- if (/\[$/.test(prevToken))
627
+ if (prevToken.endsWith('['))
627
628
  return 'Missing closing "]"';
628
629
  return `Python syntax error near "${prevToken}"`;
629
630
  }
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-preview-text-data.mjs","sources":["../../../../../libs-ui/components/preview-text-data/src/preview-text-data.define.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.html","../../../../../libs-ui/components/preview-text-data/src/libs-ui-components-preview-text-data.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Extension } from '@codemirror/state';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { UtilsHttpParamsRequest } from '@libs-ui/utils';\nimport { LibsUiComponentsPreviewTextDataComponent } from './preview-text-data.component';\nimport { ILanguageOptions, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n/**\n * Danh sách các ngôn ngữ được hỗ trợ\n * Sử dụng const array để tránh tạo mới mỗi lần truy cập\n */\nexport const optionsLangData: Array<ILanguageOptions> = [\n { id: 'text', label: 'Plain Text' },\n { id: 'javascript', label: 'JavaScript/TypeScript' },\n { id: 'html', label: 'HTML' },\n { id: 'css', label: 'CSS/SCSS/SASS' },\n { id: 'markdown', label: 'Markdown' },\n { id: 'json', label: 'JSON' },\n { id: 'sql', label: 'SQL' },\n { id: 'xml', label: 'XML' },\n { id: 'yaml', label: 'YAML' },\n { id: 'python', label: 'Python' },\n { id: 'java', label: 'Java' },\n { id: 'cpp', label: 'C/C++' },\n { id: 'php', label: 'PHP' },\n { id: 'go', label: 'Go' },\n] as const;\n\nexport const httpRequestConfigGetOptionsLang = (langsAccept?: Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>, langsChangeLabel?: ILanguageOptions): IListConfigItem => {\n const langs = [...optionsLangData].filter((item) => !langsAccept || !langsAccept.length || langsAccept.includes(item.id as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT));\n\n langs.forEach((item) => ({\n id: item.id,\n label: langsChangeLabel?.label || item.label,\n }));\n\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject(langs),\n functionName: 'list',\n argumentsValue: [new UtilsHttpParamsRequest({ fromObject: { page: 1, per_page: 40 } })],\n }),\n configTemplateText: signal({\n fieldKey: 'id',\n notUseVirtualScroll: true,\n }),\n };\n};\n\ntype T_LanguageLoader = () => Promise<Extension>;\ntype T_LinterLoader = (component: LibsUiComponentsPreviewTextDataComponent) => Promise<Extension>;\ninterface I_LanguageRegistryItem {\n loader: T_LanguageLoader;\n linter?: T_LinterLoader;\n}\n\nexport const languageRegistry: Record<string, I_LanguageRegistryItem> = {\n javascript: {\n loader: async () => {\n const { javascript } = await import('@codemirror/lang-javascript');\n return javascript({ jsx: true, typescript: true });\n },\n linter: async (component) => component.createJsLinter(),\n },\n html: {\n loader: async () => {\n const { html } = await import('@codemirror/lang-html');\n return html();\n },\n },\n css: {\n loader: async () => {\n const { css } = await import('@codemirror/lang-css');\n return css();\n },\n },\n markdown: {\n loader: async () => {\n const { markdown } = await import('@codemirror/lang-markdown');\n return markdown();\n },\n },\n json: {\n loader: async () => {\n const { json } = await import('@codemirror/lang-json');\n return json();\n },\n linter: async (component) => component.createJsonLinter(),\n },\n sql: {\n loader: async () => {\n const { sql } = await import('@codemirror/lang-sql');\n return sql();\n },\n linter: async (component) => component.createSqlLinter(),\n },\n xml: {\n loader: async () => {\n const { xml } = await import('@codemirror/lang-xml');\n return xml();\n },\n },\n yaml: {\n loader: async () => {\n const { yaml } = await import('@codemirror/lang-yaml');\n return yaml();\n },\n },\n python: {\n loader: async () => {\n const { python } = await import('@codemirror/lang-python');\n return python();\n },\n linter: async (component) => component.createPythonLinter(),\n },\n java: {\n loader: async () => {\n const { java } = await import('@codemirror/lang-java');\n return java();\n },\n },\n cpp: {\n loader: async () => {\n const { cpp } = await import('@codemirror/lang-cpp');\n return cpp();\n },\n },\n php: {\n loader: async () => {\n const { php } = await import('@codemirror/lang-php');\n return php();\n },\n },\n go: {\n loader: async () => {\n const { go } = await import('@codemirror/lang-go');\n return go();\n },\n },\n};\n\n/**\n * Bộ pattern bảo mật mặc định cho low-code platform.\n * Chặn các API nguy hiểm: eval, network calls, storage, DOM injection...\n */\nexport const DEFAULT_SECURITY_PATTERNS: T_ForbiddenPattern[] = [\n /eval\\s*\\(/i,\n /new\\s+Function\\s*\\(/i,\n /document\\.cookie/i,\n /localStorage/i,\n /sessionStorage/i,\n /fetch\\s*\\(/i,\n /new\\s+XMLHttpRequest/i,\n /require\\s*\\(/i,\n /import\\s*\\(/i,\n /process\\.env/i,\n /<script/i,\n /document\\.write\\s*\\(/i,\n /window\\.location\\s*=/i,\n];\n\n/**\n * Tạo default language extension cho plain text\n * Sử dụng khi ngôn ngữ không được hỗ trợ\n */\nexport const createDefaultLanguage = async (): Promise<Extension> => {\n const { StreamLanguage } = await import('@codemirror/language');\n return StreamLanguage.define({\n token(stream) {\n stream.skipToEnd();\n return null;\n },\n });\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnInit, output, signal, viewChild } from '@angular/core';\nimport { autocompletion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { syntaxTree } from '@codemirror/language';\nimport { Diagnostic, linter, lintGutter } from '@codemirror/lint';\nimport { Compartment, EditorState, Extension, Prec, Text, Transaction } from '@codemirror/state';\nimport { EditorView, lineNumbers, ViewUpdate } from '@codemirror/view';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport { get } from '@libs-ui/utils';\nimport { basicSetup } from 'codemirror6';\nimport { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';\nimport { ILanguageOptions, IPreviewTextDataChange, IPreviewTextDataCompletionItem, IPreviewTextDataViolation, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-preview_text_data',\n templateUrl: './preview-text-data.component.html',\n styleUrls: ['./preview-text-data.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent],\n})\nexport class LibsUiComponentsPreviewTextDataComponent implements OnInit, AfterViewInit {\n // ==========================================================================\n // PRIVATE PROPERTIES\n // ==========================================================================\n\n private editorViewInstance?: EditorView;\n private readonly wrapCompartment = new Compartment();\n private readonly languageCompartment = new Compartment();\n private readonly lineNumberCompartment = new Compartment();\n private readonly linterCompartment = new Compartment();\n private readonly completionsCompartment = new Compartment();\n private readonly forbiddenCompartment = new Compartment();\n\n private contentStateNoWrap = signal('');\n\n /** Cache để tránh load lại language đã load */\n private readonly languageCache = new Map<string, Extension>();\n\n /** Flag để tránh update editor khi đang khởi tạo */\n private isInitialized = false;\n\n // ==========================================================================\n // INJECTED SERVICES\n // ==========================================================================\n\n private readonly notificationService = inject(LibsUiNotificationService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==========================================================================\n // PROTECTED SIGNALS\n // ==========================================================================\n\n protected readonly isWrap = signal<boolean>(true);\n protected readonly configLoadDataIsHttpConfig = signal<IListConfigItem>(httpRequestConfigGetOptionsLang(undefined));\n protected readonly labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);\n protected readonly acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));\n\n // ==========================================================================\n // INPUTS\n // ==========================================================================\n\n readonly content = input<string, string | undefined>('', {\n transform: (value?: string) => value ?? '',\n });\n\n readonly langSelected = model.required<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>();\n readonly langsAccept = input<Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT> | undefined>();\n readonly langsChangeLabel = input<ILanguageOptions | undefined>();\n\n readonly editable = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly hiddenAction = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly lintIgnorePatterns = input<Array<string>, Array<string> | undefined>(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {\n transform: (value?: Array<string>) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],\n });\n\n /**\n * Danh sách đối tượng/biến gợi ý khi gõ — giống IntelliSense trong IDE.\n * Hỗ trợ dot-notation: định nghĩa `properties` để gợi ý sau dấu `.`\n * @example\n * [completions]=\"[{ label: 'user', properties: [{ label: 'name', detail: 'string' }] }]\"\n */\n readonly completions = input<IPreviewTextDataCompletionItem[], IPreviewTextDataCompletionItem[] | undefined>([], {\n transform: (value?: IPreviewTextDataCompletionItem[]) => value ?? [],\n });\n\n /**\n * Danh sách pattern cấm — chuỗi literal hoặc RegExp.\n * Khi phát hiện vi phạm: highlight đỏ tại đúng vị trí + chặn paste + emit `(outViolations)`.\n * Dùng `DEFAULT_SECURITY_PATTERNS` để áp dụng bộ quy tắc bảo mật mặc định cho low-code.\n * @example\n * [forbiddenPatterns]=\"defaultSecurityPatterns\"\n * [forbiddenPatterns]=\"[/eval\\s*\\(/, 'localStorage']\"\n */\n readonly forbiddenPatterns = input<T_ForbiddenPattern[], T_ForbiddenPattern[] | undefined>([], {\n transform: (value?: T_ForbiddenPattern[]) => value ?? [],\n });\n\n readonly background = input<string, string | undefined>('#f8f9fa', {\n transform: (value?: string) => value ?? '#f8f9fa',\n });\n\n // ==========================================================================\n // OUTPUTS\n // ==========================================================================\n\n readonly outChange = output<IPreviewTextDataChange>();\n readonly syntaxErrors = output<Diagnostic[]>();\n readonly outViolations = output<IPreviewTextDataViolation[]>();\n\n // ==========================================================================\n // VIEW CHILDREN\n // ==========================================================================\n\n private readonly containerPreview = viewChild.required<ElementRef<HTMLDivElement>>('containerPreview');\n\n // ==========================================================================\n // CONSTRUCTOR - Setup effects\n // ==========================================================================\n\n constructor() {\n // Effect để sync content từ input vào editor\n effect(() => {\n const newContent = this.content();\n if (this.isInitialized && this.editorViewInstance) {\n const currentContent = this.editorViewInstance.state.doc.toString();\n if (newContent !== currentContent) {\n this.editorViewInstance.dispatch({\n changes: {\n from: 0,\n to: currentContent.length,\n insert: newContent,\n },\n });\n }\n }\n });\n\n // Effect để cập nhật custom completions khi input thay đổi\n effect(() => {\n const items = this.completions();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.completionsCompartment.reconfigure(items.length ? this.buildCompletionExtension(items) : []),\n });\n });\n\n // Effect để cập nhật forbidden patterns khi input thay đổi\n effect(() => {\n const patterns = this.forbiddenPatterns();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.forbiddenCompartment.reconfigure(patterns.length ? this.buildForbiddenExtension(patterns) : []),\n });\n });\n\n // Cleanup khi component bị destroy\n this.destroyRef.onDestroy(() => {\n this.editorViewInstance?.destroy();\n this.languageCache.clear();\n });\n }\n\n // ==========================================================================\n // LIFECYCLE HOOKS\n // ==========================================================================\n\n ngOnInit(): void {\n if (this.langsAccept()?.length) {\n this.configLoadDataIsHttpConfig.set(httpRequestConfigGetOptionsLang(this.langsAccept(), this.langsChangeLabel()));\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.initializeEditor();\n this.isInitialized = true;\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Editor initialization\n // ==========================================================================\n\n /**\n * Khởi tạo editor với các extensions cơ bản\n * Language được load async để tối ưu bundle size\n */\n private async initializeEditor(): Promise<void> {\n const languageExtension = await this.loadLanguageExtension(this.langSelected());\n const linterExtension = await this.loadLinterExtension(this.langSelected());\n\n this.editorViewInstance = new EditorView({\n doc: this.content(),\n parent: this.containerPreview().nativeElement,\n extensions: this.createExtensions(languageExtension, linterExtension),\n });\n }\n\n /**\n * Tạo danh sách extensions cho editor\n */\n private createExtensions(languageExtension: Extension, linterExtension: Extension): Extension[] {\n const initialCompletions = this.completions();\n const initialPatterns = this.forbiddenPatterns();\n return [\n basicSetup,\n this.languageCompartment.of(languageExtension),\n this.linterCompartment.of(linterExtension),\n // Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion\n Prec.highest(this.completionsCompartment.of(initialCompletions.length ? this.buildCompletionExtension(initialCompletions) : [])),\n this.forbiddenCompartment.of(initialPatterns.length ? this.buildForbiddenExtension(initialPatterns) : []),\n this.createLightTheme(),\n EditorView.editable.of(this.editable()),\n this.wrapCompartment.of(EditorView.lineWrapping),\n this.lineNumberCompartment.of(lineNumbers()),\n lintGutter(),\n this.createBracketTheme(),\n this.createUpdateListener(),\n ];\n }\n\n /**\n * Load language extension với caching\n * Mỗi language chỉ được load 1 lần\n */\n private async loadLanguageExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n\n const cached = this.languageCache.get(lowerLang);\n if (cached) {\n return cached;\n }\n const registryItem = languageRegistry[lowerLang];\n const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();\n\n this.languageCache.set(lowerLang, extension);\n return extension;\n }\n\n /**\n * Load linter extension nếu có\n */\n private async loadLinterExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n const registryItem = languageRegistry[lowerLang];\n\n if (registryItem?.linter) {\n return registryItem.linter(this);\n }\n\n return linter(() => []);\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Theme configuration\n // ==========================================================================\n\n private createLightTheme(): Extension {\n return EditorView.theme({\n '&': { backgroundColor: this.background(), color: '#333' },\n '.cm-content': { caretColor: '#111' },\n '.cm-activeLine': { backgroundColor: '#f0f0f0' },\n });\n }\n\n private createBracketTheme(): Extension {\n return EditorView.theme({\n '.cm-matchingBracket': {\n backgroundColor: 'rgba(100, 200, 255, 0.15)',\n border: '1px solid rgba(100, 200, 255, 0.4)',\n borderRadius: '3px',\n transition: 'all 0.2s ease',\n },\n '.cm-nonmatchingBracket': {\n backgroundColor: 'rgba(255, 100, 100, 0.15)',\n border: '1px solid rgba(255, 100, 100, 0.3)',\n borderRadius: '3px',\n },\n });\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Update listener\n // ==========================================================================\n\n private createUpdateListener(): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.docChanged && this.editable()) {\n const newValue = update.state.doc.toString();\n this.outChange.emit({\n content: newValue,\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'content',\n });\n }\n });\n }\n\n // ==========================================================================\n // PUBLIC METHODS - Linter factories (được gọi từ registry)\n // ==========================================================================\n\n /**\n * Tạo JavaScript linter với 2-pass detection:\n * 1. Text-based scan cho trailing dot (parser thường đặt error node sai vị trí với pattern này)\n * 2. syntaxTree cho các lỗi thực sự khác, bỏ qua vùng bị ảnh hưởng bởi trailing dot\n */\n createJsLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n\n // Pass 1: Text-based trailing dot detection — đặt diagnostic đúng tại vị trí dấu chấm\n const trailingDotLines = new Set<number>();\n for (let lineNum = 1; lineNum <= doc.lines; lineNum++) {\n const line = doc.line(lineNum);\n const trimmed = line.text.trimEnd();\n const match = trimmed.match(/(\\w+)\\.\\s*$/);\n if (!match) continue;\n\n trailingDotLines.add(lineNum);\n const dotPos = line.from + trimmed.lastIndexOf('.');\n diagnostics.push({\n from: dotPos,\n to: dotPos + 1,\n severity: 'error',\n message: `Incomplete property access on \"${match[1]}\"`,\n });\n }\n\n // Đánh dấu các dòng bị ảnh hưởng bởi trailing dot (trailing-dot line + 4 dòng tiếp theo)\n // để lọc cascading errors từ syntaxTree\n const taintedLines = new Set<number>();\n for (const lineNum of trailingDotLines) {\n for (let i = lineNum; i <= Math.min(lineNum + 4, doc.lines); i++) {\n taintedLines.add(i);\n }\n }\n\n // Pass 2: syntaxTree cho các lỗi khác (chỉ non-empty range, bỏ qua vùng tainted)\n const tree = syntaxTree(view.state);\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n if (node.from === node.to) return; // Bỏ qua empty-range node (cascading error)\n\n const errorLineNum = doc.lineAt(node.from).number;\n if (taintedLines.has(errorLineNum)) return;\n\n diagnostics.push({\n from: node.from,\n to: Math.min(node.to, doc.length),\n severity: 'error',\n message: this.buildJsErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildJsErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n const text = doc.sliceString(node.from, node.to).trim();\n if (text) return `JavaScript syntax error near \"${text}\"`;\n\n const prevToken = this.getTokenBefore(doc, node.from);\n if (!prevToken) return 'JavaScript syntax error';\n if (/\\($/.test(prevToken)) return 'Missing closing \")\"';\n if (/\\[$/.test(prevToken)) return 'Missing closing \"]\"';\n if (/^function$/i.test(prevToken)) return 'Expected function name or \"(\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^=>$/.test(prevToken)) return 'Expected function body after \"=>\"';\n if (/^const$|^let$|^var$/i.test(prevToken)) return 'Expected variable name';\n\n return `JavaScript syntax error near \"${prevToken}\"`;\n }\n\n /**\n * Tạo JSON linter\n * Sử dụng JSON.parse để validate\n */\n createJsonLinter(): Extension {\n return linter((view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n JSON.parse(text);\n } catch (err: unknown) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message: get(err, 'message', ''),\n });\n }\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /**\n * Tạo SQL linter\n */\n createSqlLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n diagnostics.push({\n from: Math.max(0, node.from - 1),\n to: node.from,\n severity: 'error',\n message: this.buildSqlErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildSqlErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to);\n return `SQL syntax error near \"${text}\"`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'SQL syntax error at beginning of statement';\n }\n\n if (/FROM$/i.test(prevToken)) {\n return 'Expected table name after FROM';\n }\n\n if (/SELECT$/i.test(prevToken)) {\n return 'Expected column list after SELECT';\n }\n\n if (/WHERE$/i.test(prevToken)) {\n return 'Expected condition after WHERE';\n }\n\n if (/\\($/.test(prevToken)) {\n return 'Missing closing \")\"';\n }\n\n return `Unexpected end of SQL after \"${prevToken}\"`;\n }\n\n private getTokenBefore(doc: Text, pos: number): string {\n const start = Math.max(0, pos - 30);\n const text = doc.sliceString(start, pos);\n\n const match = text.match(/(\\S+)\\s*$/);\n return match?.[1] ?? '';\n }\n\n /**\n * Tạo Python linter dựa trên syntaxTree parse error — cùng approach với SQL linter.\n * Phát hiện lỗi cú pháp mà CodeMirror Python parser đánh dấu là error node.\n */\n createPythonLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n const from = Math.max(0, node.from - 1);\n const to = node.from === node.to ? node.from + 1 : node.to;\n\n diagnostics.push({\n from,\n to: Math.min(to, doc.length),\n severity: 'error',\n message: this.buildPythonErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildPythonErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to).trim();\n return `Python syntax error${text ? ` near \"${text}\"` : ''}`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'Python syntax error';\n }\n\n if (/^def$/i.test(prevToken)) return 'Expected function name after \"def\"';\n if (/^class$/i.test(prevToken)) return 'Expected class name after \"class\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^import$/i.test(prevToken)) return 'Expected module name after \"import\"';\n if (/^from$/i.test(prevToken)) return 'Expected module name after \"from\"';\n if (/^if$/i.test(prevToken)) return 'Expected condition after \"if\"';\n if (/^elif$/i.test(prevToken)) return 'Expected condition after \"elif\"';\n if (/^while$/i.test(prevToken)) return 'Expected condition after \"while\"';\n if (/^for$/i.test(prevToken)) return 'Expected variable after \"for\"';\n if (/\\.$/.test(prevToken)) return `Incomplete attribute access on \"${prevToken.slice(0, -1)}\"`;\n if (/\\($/.test(prevToken)) return 'Missing closing \")\"';\n if (/\\[$/.test(prevToken)) return 'Missing closing \"]\"';\n\n return `Python syntax error near \"${prevToken}\"`;\n }\n\n /**\n * Tạo CodeMirror extension cho custom completions từ danh sách input.\n * Hỗ trợ 2 chế độ:\n * 1. Gõ tên biến → gợi ý top-level items\n * 2. Gõ `obj.` → gợi ý properties của obj\n */\n private buildCompletionExtension(items: IPreviewTextDataCompletionItem[]): Extension {\n const completionSource = (context: CompletionContext): CompletionResult | null => {\n // Chế độ dot-notation: gõ \"obj.prop\" → gợi ý properties của obj\n const dotMatch = context.matchBefore(/\\w+\\.\\w*/);\n if (dotMatch) {\n const dotPos = dotMatch.text.indexOf('.');\n const objectName = dotMatch.text.slice(0, dotPos);\n const parent = items.find((i) => i.label === objectName);\n if (parent?.properties?.length) {\n return {\n from: dotMatch.from + dotPos + 1,\n options: parent.properties.map((p) => ({\n label: p.label,\n type: p.type ?? 'property',\n detail: p.detail ?? '',\n info: p.info ?? '',\n })),\n };\n }\n }\n\n // Chế độ top-level: gợi ý tên biến/object khi gõ ký tự\n const word = context.matchBefore(/\\w*/);\n if (!word || (word.from === word.to && !context.explicit)) return null;\n\n return {\n from: word.from,\n options: items.map((item) => ({\n label: item.label,\n type: item.type ?? 'variable',\n detail: item.detail ?? '',\n info: item.info ?? '',\n })),\n };\n };\n\n return autocompletion({ override: [completionSource] });\n }\n\n /**\n * Tạo extension bảo mật gồm 2 layer:\n * 1. Linter: highlight đỏ tại đúng vị trí match + emit outViolations\n * 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm\n */\n private buildForbiddenExtension(patterns: T_ForbiddenPattern[]): Extension {\n const toGlobalRegex = (p: T_ForbiddenPattern): RegExp => {\n if (p instanceof RegExp) {\n const flags = p.flags.includes('g') ? p.flags : `${p.flags}g`;\n return new RegExp(p.source, flags);\n }\n return new RegExp(this.escapeRegex(p), 'gi');\n };\n\n const forbiddenLinter = linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const violations: IPreviewTextDataViolation[] = [];\n const text = view.state.doc.toString();\n const tree = syntaxTree(view.state);\n\n // Build a Set of comment ranges từ AST để skip match nằm trong comment\n const commentRanges: { from: number; to: number }[] = [];\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (node.type.name.toLowerCase().includes('comment')) {\n commentRanges.push({ from: node.from, to: node.to });\n }\n },\n });\n\n const isInComment = (from: number, to: number): boolean =>\n commentRanges.some((r) => from >= r.from && to <= r.to);\n\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(text)) !== null) {\n const from = match.index;\n const to = from + match[0].length;\n\n if (isInComment(from, to)) continue;\n\n const line = view.state.doc.lineAt(from).number;\n const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;\n\n diagnostics.push({\n from,\n to,\n severity: 'error',\n message: `Mã bị cấm: \"${match[0]}\" — vi phạm chính sách bảo mật`,\n });\n\n violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });\n }\n }\n\n this.outViolations.emit(violations);\n return diagnostics;\n });\n\n // Chặn paste nếu nội dung paste chứa bất kỳ pattern cấm nào\n const pasteFilter = EditorState.transactionFilter.of((tr: Transaction) => {\n if (!tr.docChanged) return tr;\n if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste')) return tr;\n\n const newText = tr.newDoc.toString();\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n if (re.test(newText)) return []; // [] = block transaction\n }\n return tr;\n });\n\n return [forbiddenLinter, pasteFilter];\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n // ==========================================================================\n // PROTECTED METHODS - Event handlers\n // ==========================================================================\n\n protected handlerCopy(): void {\n navigator.clipboard.writeText(this.content() || '');\n this.notificationService.showCompTypeTextInfo('Sao chép thành công');\n }\n\n protected handlerLineWrap(): void {\n // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines\n const currentContent = this.editorViewInstance?.state.doc.toString() || '';\n if (this.isWrap()) {\n this.contentStateNoWrap.set(currentContent);\n }\n const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\\n/g, ' ') : this.contentStateNoWrap();\n this.isWrap.update((val) => !val);\n\n if (currentContent !== updatedContent) {\n this.editorViewInstance?.dispatch({\n changes: { from: 0, to: currentContent.length, insert: updatedContent },\n });\n }\n\n // Batch cả 2 dispatch thành 1 để tối ưu performance\n this.editorViewInstance?.dispatch({\n effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],\n });\n }\n\n protected async handlerSelectKey(data?: IEmitSelectKey): Promise<void> {\n if (!data?.key) {\n return;\n }\n\n const newLang = data.key as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;\n this.langSelected.set(newLang);\n\n // Load language và linter mới\n const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);\n\n // Reconfigure thay vì tạo mới state để giữ lại document content\n this.editorViewInstance?.dispatch({\n effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],\n });\n\n this.outChange.emit({\n content: this.content(),\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'language',\n });\n }\n}\n","<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-components-preview-text-data.mjs","sources":["../../../../../libs-ui/components/preview-text-data/src/preview-text-data.define.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.html","../../../../../libs-ui/components/preview-text-data/src/libs-ui-components-preview-text-data.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Extension } from '@codemirror/state';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { UtilsHttpParamsRequest } from '@libs-ui/utils';\nimport { LibsUiComponentsPreviewTextDataComponent } from './preview-text-data.component';\nimport { ILanguageOptions, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n/**\n * Danh sách các ngôn ngữ được hỗ trợ\n * Sử dụng const array để tránh tạo mới mỗi lần truy cập\n */\nexport const optionsLangData: Array<ILanguageOptions> = [\n { id: 'text', label: 'Plain Text' },\n { id: 'javascript', label: 'JavaScript/TypeScript' },\n { id: 'html', label: 'HTML' },\n { id: 'css', label: 'CSS/SCSS/SASS' },\n { id: 'markdown', label: 'Markdown' },\n { id: 'json', label: 'JSON' },\n { id: 'sql', label: 'SQL' },\n { id: 'xml', label: 'XML' },\n { id: 'yaml', label: 'YAML' },\n { id: 'python', label: 'Python' },\n { id: 'java', label: 'Java' },\n { id: 'cpp', label: 'C/C++' },\n { id: 'php', label: 'PHP' },\n { id: 'go', label: 'Go' },\n] as const;\n\nexport const httpRequestConfigGetOptionsLang = (langsAccept?: Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>, langsChangeLabel?: ILanguageOptions): IListConfigItem => {\n const langs = [...optionsLangData].filter((item) => !langsAccept?.length || (langsAccept as string[]).includes(item.id));\n\n langs.forEach((item) => ({\n id: item.id,\n label: langsChangeLabel?.label || item.label,\n }));\n\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject(langs),\n functionName: 'list',\n argumentsValue: [new UtilsHttpParamsRequest({ fromObject: { page: 1, per_page: 40 } })],\n }),\n configTemplateText: signal({\n fieldKey: 'id',\n notUseVirtualScroll: true,\n }),\n };\n};\n\ntype T_LanguageLoader = () => Promise<Extension>;\ntype T_LinterLoader = (component: LibsUiComponentsPreviewTextDataComponent) => Promise<Extension>;\ninterface I_LanguageRegistryItem {\n loader: T_LanguageLoader;\n linter?: T_LinterLoader;\n}\n\nexport const languageRegistry: Record<string, I_LanguageRegistryItem> = {\n javascript: {\n loader: async () => {\n const { javascript } = await import('@codemirror/lang-javascript');\n return javascript({ jsx: true, typescript: true });\n },\n linter: async (component) => component.createJsLinter(),\n },\n html: {\n loader: async () => {\n const { html } = await import('@codemirror/lang-html');\n return html();\n },\n },\n css: {\n loader: async () => {\n const { css } = await import('@codemirror/lang-css');\n return css();\n },\n },\n markdown: {\n loader: async () => {\n const { markdown } = await import('@codemirror/lang-markdown');\n return markdown();\n },\n },\n json: {\n loader: async () => {\n const { json } = await import('@codemirror/lang-json');\n return json();\n },\n linter: async (component) => component.createJsonLinter(),\n },\n sql: {\n loader: async () => {\n const { sql } = await import('@codemirror/lang-sql');\n return sql();\n },\n linter: async (component) => component.createSqlLinter(),\n },\n xml: {\n loader: async () => {\n const { xml } = await import('@codemirror/lang-xml');\n return xml();\n },\n },\n yaml: {\n loader: async () => {\n const { yaml } = await import('@codemirror/lang-yaml');\n return yaml();\n },\n },\n python: {\n loader: async () => {\n const { python } = await import('@codemirror/lang-python');\n return python();\n },\n linter: async (component) => component.createPythonLinter(),\n },\n java: {\n loader: async () => {\n const { java } = await import('@codemirror/lang-java');\n return java();\n },\n },\n cpp: {\n loader: async () => {\n const { cpp } = await import('@codemirror/lang-cpp');\n return cpp();\n },\n },\n php: {\n loader: async () => {\n const { php } = await import('@codemirror/lang-php');\n return php();\n },\n },\n go: {\n loader: async () => {\n const { go } = await import('@codemirror/lang-go');\n return go();\n },\n },\n};\n\n/**\n * Bộ pattern bảo mật mặc định cho low-code platform.\n * Chặn các API nguy hiểm: eval, network calls, storage, DOM injection...\n */\nexport const DEFAULT_SECURITY_PATTERNS: T_ForbiddenPattern[] = [\n /eval\\s*\\(/i,\n /new\\s+Function\\s*\\(/i,\n /document\\.cookie/i,\n /localStorage/i,\n /sessionStorage/i,\n /fetch\\s*\\(/i,\n /new\\s+XMLHttpRequest/i,\n /require\\s*\\(/i,\n /import\\s*\\(/i,\n /process\\.env/i,\n /<script/i,\n /document\\.write\\s*\\(/i,\n /window\\.location\\s*=/i,\n];\n\n/**\n * Tạo default language extension cho plain text\n * Sử dụng khi ngôn ngữ không được hỗ trợ\n */\nexport const createDefaultLanguage = async (): Promise<Extension> => {\n const { StreamLanguage } = await import('@codemirror/language');\n return StreamLanguage.define({\n token(stream) {\n stream.skipToEnd();\n return null;\n },\n });\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnInit, output, signal, viewChild } from '@angular/core';\nimport { autocompletion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';\nimport { syntaxTree } from '@codemirror/language';\nimport { Diagnostic, linter, lintGutter } from '@codemirror/lint';\nimport { Compartment, EditorState, Extension, Prec, Text, Transaction } from '@codemirror/state';\nimport { EditorView, lineNumbers, ViewUpdate } from '@codemirror/view';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport { get } from '@libs-ui/utils';\nimport { basicSetup } from 'codemirror6';\nimport { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';\nimport { ILanguageOptions, IPreviewTextDataChange, IPreviewTextDataCompletionItem, IPreviewTextDataViolation, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT, T_ForbiddenPattern } from './preview-text-data.interfaces';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-preview_text_data',\n templateUrl: './preview-text-data.component.html',\n styleUrls: ['./preview-text-data.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent],\n})\nexport class LibsUiComponentsPreviewTextDataComponent implements OnInit, AfterViewInit {\n // ==========================================================================\n // PRIVATE PROPERTIES\n // ==========================================================================\n\n private editorViewInstance?: EditorView;\n private readonly wrapCompartment = new Compartment();\n private readonly languageCompartment = new Compartment();\n private readonly lineNumberCompartment = new Compartment();\n private readonly linterCompartment = new Compartment();\n private readonly completionsCompartment = new Compartment();\n private readonly forbiddenCompartment = new Compartment();\n\n private readonly contentStateNoWrap = signal('');\n\n /** Cache để tránh load lại language đã load */\n private readonly languageCache = new Map<string, Extension>();\n\n /** Flag để tránh update editor khi đang khởi tạo */\n private isInitialized = false;\n\n // ==========================================================================\n // INJECTED SERVICES\n // ==========================================================================\n\n private readonly notificationService = inject(LibsUiNotificationService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==========================================================================\n // PROTECTED SIGNALS\n // ==========================================================================\n\n protected readonly isWrap = signal<boolean>(true);\n protected readonly configLoadDataIsHttpConfig = signal<IListConfigItem>(httpRequestConfigGetOptionsLang());\n protected readonly labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);\n protected readonly acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));\n\n // ==========================================================================\n // INPUTS\n // ==========================================================================\n\n readonly content = input<string, string | undefined>('', {\n transform: (value?: string) => value ?? '',\n });\n\n readonly langSelected = model.required<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>();\n readonly langsAccept = input<Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT> | undefined>();\n readonly langsChangeLabel = input<ILanguageOptions | undefined>();\n\n readonly editable = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly hiddenAction = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly lintIgnorePatterns = input<Array<string>, Array<string> | undefined>(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {\n transform: (value?: Array<string>) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],\n });\n\n /**\n * Danh sách đối tượng/biến gợi ý khi gõ — giống IntelliSense trong IDE.\n * Hỗ trợ dot-notation: định nghĩa `properties` để gợi ý sau dấu `.`\n * @example\n * [completions]=\"[{ label: 'user', properties: [{ label: 'name', detail: 'string' }] }]\"\n */\n readonly completions = input<IPreviewTextDataCompletionItem[], IPreviewTextDataCompletionItem[] | undefined>([], {\n transform: (value?: IPreviewTextDataCompletionItem[]) => value ?? [],\n });\n\n /**\n * Danh sách pattern cấm — chuỗi literal hoặc RegExp.\n * Khi phát hiện vi phạm: highlight đỏ tại đúng vị trí + chặn paste + emit `(outViolations)`.\n * Dùng `DEFAULT_SECURITY_PATTERNS` để áp dụng bộ quy tắc bảo mật mặc định cho low-code.\n * @example\n * [forbiddenPatterns]=\"defaultSecurityPatterns\"\n * [forbiddenPatterns]=\"[/eval\\s*\\(/, 'localStorage']\"\n */\n readonly forbiddenPatterns = input<T_ForbiddenPattern[], T_ForbiddenPattern[] | undefined>([], {\n transform: (value?: T_ForbiddenPattern[]) => value ?? [],\n });\n\n readonly background = input<string, string | undefined>('#f8f9fa', {\n transform: (value?: string) => value ?? '#f8f9fa',\n });\n\n // ==========================================================================\n // OUTPUTS\n // ==========================================================================\n\n readonly outChange = output<IPreviewTextDataChange>();\n readonly syntaxErrors = output<Diagnostic[]>();\n readonly outViolations = output<IPreviewTextDataViolation[]>();\n\n // ==========================================================================\n // VIEW CHILDREN\n // ==========================================================================\n\n private readonly containerPreview = viewChild.required<ElementRef<HTMLDivElement>>('containerPreview');\n\n // ==========================================================================\n // CONSTRUCTOR - Setup effects\n // ==========================================================================\n\n constructor() {\n // Effect để sync content từ input vào editor\n effect(() => {\n const newContent = this.content();\n if (this.isInitialized && this.editorViewInstance) {\n const currentContent = this.editorViewInstance.state.doc.toString();\n if (newContent !== currentContent) {\n this.editorViewInstance.dispatch({\n changes: {\n from: 0,\n to: currentContent.length,\n insert: newContent,\n },\n });\n }\n }\n });\n\n // Effect để cập nhật custom completions khi input thay đổi\n effect(() => {\n const items = this.completions();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.completionsCompartment.reconfigure(items.length ? this.buildCompletionExtension(items) : []),\n });\n });\n\n // Effect để cập nhật forbidden patterns khi input thay đổi\n effect(() => {\n const patterns = this.forbiddenPatterns();\n if (!this.isInitialized || !this.editorViewInstance) return;\n this.editorViewInstance.dispatch({\n effects: this.forbiddenCompartment.reconfigure(patterns.length ? this.buildForbiddenExtension(patterns) : []),\n });\n });\n\n // Cleanup khi component bị destroy\n this.destroyRef.onDestroy(() => {\n this.editorViewInstance?.destroy();\n this.languageCache.clear();\n });\n }\n\n // ==========================================================================\n // LIFECYCLE HOOKS\n // ==========================================================================\n\n ngOnInit(): void {\n if (this.langsAccept()?.length) {\n this.configLoadDataIsHttpConfig.set(httpRequestConfigGetOptionsLang(this.langsAccept(), this.langsChangeLabel()));\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.initializeEditor();\n this.isInitialized = true;\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Editor initialization\n // ==========================================================================\n\n /**\n * Khởi tạo editor với các extensions cơ bản\n * Language được load async để tối ưu bundle size\n */\n private async initializeEditor(): Promise<void> {\n const languageExtension = await this.loadLanguageExtension(this.langSelected());\n const linterExtension = await this.loadLinterExtension(this.langSelected());\n\n this.editorViewInstance = new EditorView({\n doc: this.content(),\n parent: this.containerPreview().nativeElement,\n extensions: this.createExtensions(languageExtension, linterExtension),\n });\n }\n\n /**\n * Tạo danh sách extensions cho editor\n */\n private createExtensions(languageExtension: Extension, linterExtension: Extension): Extension[] {\n const initialCompletions = this.completions();\n const initialPatterns = this.forbiddenPatterns();\n return [\n basicSetup,\n this.languageCompartment.of(languageExtension),\n this.linterCompartment.of(linterExtension),\n // Compartment cho custom completions — Prec.highest để override basicSetup's autocompletion\n Prec.highest(this.completionsCompartment.of(initialCompletions.length ? this.buildCompletionExtension(initialCompletions) : [])),\n this.forbiddenCompartment.of(initialPatterns.length ? this.buildForbiddenExtension(initialPatterns) : []),\n this.createLightTheme(),\n EditorView.editable.of(this.editable()),\n this.wrapCompartment.of(EditorView.lineWrapping),\n this.lineNumberCompartment.of(lineNumbers()),\n lintGutter(),\n this.createBracketTheme(),\n this.createUpdateListener(),\n ];\n }\n\n /**\n * Load language extension với caching\n * Mỗi language chỉ được load 1 lần\n */\n private async loadLanguageExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n\n const cached = this.languageCache.get(lowerLang);\n if (cached) {\n return cached;\n }\n const registryItem = languageRegistry[lowerLang];\n const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();\n\n this.languageCache.set(lowerLang, extension);\n return extension;\n }\n\n /**\n * Load linter extension nếu có\n */\n private async loadLinterExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n const registryItem = languageRegistry[lowerLang];\n\n if (registryItem?.linter) {\n return registryItem.linter(this);\n }\n\n return linter(() => []);\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Theme configuration\n // ==========================================================================\n\n private createLightTheme(): Extension {\n return EditorView.theme({\n '&': { backgroundColor: this.background(), color: '#333' },\n '.cm-content': { caretColor: '#111' },\n '.cm-activeLine': { backgroundColor: '#f0f0f0' },\n });\n }\n\n private createBracketTheme(): Extension {\n return EditorView.theme({\n '.cm-matchingBracket': {\n backgroundColor: 'rgba(100, 200, 255, 0.15)',\n border: '1px solid rgba(100, 200, 255, 0.4)',\n borderRadius: '3px',\n transition: 'all 0.2s ease',\n },\n '.cm-nonmatchingBracket': {\n backgroundColor: 'rgba(255, 100, 100, 0.15)',\n border: '1px solid rgba(255, 100, 100, 0.3)',\n borderRadius: '3px',\n },\n });\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Update listener\n // ==========================================================================\n\n private createUpdateListener(): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.docChanged && this.editable()) {\n const newValue = update.state.doc.toString();\n this.outChange.emit({\n content: newValue,\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'content',\n });\n }\n });\n }\n\n // ==========================================================================\n // PUBLIC METHODS - Linter factories (được gọi từ registry)\n // ==========================================================================\n\n /**\n * Tạo JavaScript linter với 2-pass detection:\n * 1. Text-based scan cho trailing dot (parser thường đặt error node sai vị trí với pattern này)\n * 2. syntaxTree cho các lỗi thực sự khác, bỏ qua vùng bị ảnh hưởng bởi trailing dot\n */\n createJsLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n\n // Pass 1: Text-based trailing dot detection — đặt diagnostic đúng tại vị trí dấu chấm\n const trailingDotLines = new Set<number>();\n for (let lineNum = 1; lineNum <= doc.lines; lineNum++) {\n const line = doc.line(lineNum);\n const trimmed = line.text.trimEnd();\n const match = /(\\w+)\\.\\s*$/.exec(trimmed);\n if (!match) continue;\n\n trailingDotLines.add(lineNum);\n const dotPos = line.from + trimmed.lastIndexOf('.');\n diagnostics.push({\n from: dotPos,\n to: dotPos + 1,\n severity: 'error',\n message: `Incomplete property access on \"${match[1]}\"`,\n });\n }\n\n // Đánh dấu các dòng bị ảnh hưởng bởi trailing dot (trailing-dot line + 4 dòng tiếp theo)\n // để lọc cascading errors từ syntaxTree\n const taintedLines = new Set<number>();\n for (const lineNum of trailingDotLines) {\n for (let i = lineNum; i <= Math.min(lineNum + 4, doc.lines); i++) {\n taintedLines.add(i);\n }\n }\n\n // Pass 2: syntaxTree cho các lỗi khác (chỉ non-empty range, bỏ qua vùng tainted)\n const tree = syntaxTree(view.state);\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n if (node.from === node.to) return; // Bỏ qua empty-range node (cascading error)\n\n const errorLineNum = doc.lineAt(node.from).number;\n if (taintedLines.has(errorLineNum)) return;\n\n diagnostics.push({\n from: node.from,\n to: Math.min(node.to, doc.length),\n severity: 'error',\n message: this.buildJsErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildJsErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n const text = doc.sliceString(node.from, node.to).trim();\n if (text) return `JavaScript syntax error near \"${text}\"`;\n\n const prevToken = this.getTokenBefore(doc, node.from);\n if (!prevToken) return 'JavaScript syntax error';\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n if (/^function$/i.test(prevToken)) return 'Expected function name or \"(\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^=>$/.test(prevToken)) return 'Expected function body after \"=>\"';\n if (/^const$|^let$|^var$/i.test(prevToken)) return 'Expected variable name';\n\n return `JavaScript syntax error near \"${prevToken}\"`;\n }\n\n /**\n * Tạo JSON linter\n * Sử dụng JSON.parse để validate\n */\n createJsonLinter(): Extension {\n return linter((view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n JSON.parse(text);\n } catch (err: unknown) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message: get(err, 'message', ''),\n });\n }\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /**\n * Tạo SQL linter\n */\n createSqlLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n diagnostics.push({\n from: Math.max(0, node.from - 1),\n to: node.from,\n severity: 'error',\n message: this.buildSqlErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildSqlErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to);\n return `SQL syntax error near \"${text}\"`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'SQL syntax error at beginning of statement';\n }\n\n if (/FROM$/i.test(prevToken)) {\n return 'Expected table name after FROM';\n }\n\n if (/SELECT$/i.test(prevToken)) {\n return 'Expected column list after SELECT';\n }\n\n if (/WHERE$/i.test(prevToken)) {\n return 'Expected condition after WHERE';\n }\n\n if (prevToken.endsWith('(')) {\n return 'Missing closing \")\"';\n }\n\n return `Unexpected end of SQL after \"${prevToken}\"`;\n }\n\n private getTokenBefore(doc: Text, pos: number): string {\n const start = Math.max(0, pos - 30);\n const text = doc.sliceString(start, pos);\n\n const match = /(\\S+)\\s*$/.exec(text);\n return match?.[1] ?? '';\n }\n\n /**\n * Tạo Python linter dựa trên syntaxTree parse error — cùng approach với SQL linter.\n * Phát hiện lỗi cú pháp mà CodeMirror Python parser đánh dấu là error node.\n */\n createPythonLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n const from = Math.max(0, node.from - 1);\n const to = node.from === node.to ? node.from + 1 : node.to;\n\n diagnostics.push({\n from,\n to: Math.min(to, doc.length),\n severity: 'error',\n message: this.buildPythonErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildPythonErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to).trim();\n const textSuffix = text ? ` near \"${text}\"` : '';\n return `Python syntax error${textSuffix}`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'Python syntax error';\n }\n\n if (/^def$/i.test(prevToken)) return 'Expected function name after \"def\"';\n if (/^class$/i.test(prevToken)) return 'Expected class name after \"class\"';\n if (/^return$/i.test(prevToken)) return 'Invalid expression after \"return\"';\n if (/^import$/i.test(prevToken)) return 'Expected module name after \"import\"';\n if (/^from$/i.test(prevToken)) return 'Expected module name after \"from\"';\n if (/^if$/i.test(prevToken)) return 'Expected condition after \"if\"';\n if (/^elif$/i.test(prevToken)) return 'Expected condition after \"elif\"';\n if (/^while$/i.test(prevToken)) return 'Expected condition after \"while\"';\n if (/^for$/i.test(prevToken)) return 'Expected variable after \"for\"';\n if (prevToken.endsWith('.')) return `Incomplete attribute access on \"${prevToken.slice(0, -1)}\"`;\n if (prevToken.endsWith('(')) return 'Missing closing \")\"';\n if (prevToken.endsWith('[')) return 'Missing closing \"]\"';\n\n return `Python syntax error near \"${prevToken}\"`;\n }\n\n /**\n * Tạo CodeMirror extension cho custom completions từ danh sách input.\n * Hỗ trợ 2 chế độ:\n * 1. Gõ tên biến → gợi ý top-level items\n * 2. Gõ `obj.` → gợi ý properties của obj\n */\n private buildCompletionExtension(items: IPreviewTextDataCompletionItem[]): Extension {\n const completionSource = (context: CompletionContext): CompletionResult | null => {\n // Chế độ dot-notation: gõ \"obj.prop\" → gợi ý properties của obj\n const dotMatch = context.matchBefore(/\\w+\\.\\w*/);\n if (dotMatch) {\n const dotPos = dotMatch.text.indexOf('.');\n const objectName = dotMatch.text.slice(0, dotPos);\n const parent = items.find((i) => i.label === objectName);\n if (parent?.properties?.length) {\n return {\n from: dotMatch.from + dotPos + 1,\n options: parent.properties.map((p) => ({\n label: p.label,\n type: p.type ?? 'property',\n detail: p.detail ?? '',\n info: p.info ?? '',\n })),\n };\n }\n }\n\n // Chế độ top-level: gợi ý tên biến/object khi gõ ký tự\n const word = context.matchBefore(/\\w*/);\n if (!word || (word.from === word.to && !context.explicit)) return null;\n\n return {\n from: word.from,\n options: items.map((item) => ({\n label: item.label,\n type: item.type ?? 'variable',\n detail: item.detail ?? '',\n info: item.info ?? '',\n })),\n };\n };\n\n return autocompletion({ override: [completionSource] });\n }\n\n /**\n * Tạo extension bảo mật gồm 2 layer:\n * 1. Linter: highlight đỏ tại đúng vị trí match + emit outViolations\n * 2. Transaction filter: chặn paste nếu nội dung paste chứa pattern cấm\n */\n private buildForbiddenExtension(patterns: T_ForbiddenPattern[]): Extension {\n const toGlobalRegex = (p: T_ForbiddenPattern): RegExp => {\n if (p instanceof RegExp) {\n const flags = p.flags.includes('g') ? p.flags : `${p.flags}g`;\n return new RegExp(p.source, flags);\n }\n return new RegExp(this.escapeRegex(p), 'gi');\n };\n\n const forbiddenLinter = linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const violations: IPreviewTextDataViolation[] = [];\n const text = view.state.doc.toString();\n const tree = syntaxTree(view.state);\n\n // Build a Set of comment ranges từ AST để skip match nằm trong comment\n const commentRanges: { from: number; to: number }[] = [];\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (node.type.name.toLowerCase().includes('comment')) {\n commentRanges.push({ from: node.from, to: node.to });\n }\n },\n });\n\n const isInComment = (from: number, to: number): boolean => commentRanges.some((r) => from >= r.from && to <= r.to);\n\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = re.exec(text)) !== null) {\n const from = match.index;\n const to = from + match[0].length;\n\n if (isInComment(from, to)) continue;\n\n const line = view.state.doc.lineAt(from).number;\n const patternLabel = pattern instanceof RegExp ? pattern.source : pattern;\n\n diagnostics.push({\n from,\n to,\n severity: 'error',\n message: `Mã bị cấm: \"${match[0]}\" — vi phạm chính sách bảo mật`,\n });\n\n violations.push({ from, to, line, pattern: patternLabel, matched: match[0] });\n }\n }\n\n this.outViolations.emit(violations);\n return diagnostics;\n });\n\n // Chặn paste nếu nội dung paste chứa bất kỳ pattern cấm nào\n const pasteFilter = EditorState.transactionFilter.of((tr: Transaction) => {\n if (!tr.docChanged) return tr;\n if (!tr.annotation(Transaction.userEvent)?.startsWith('input.paste')) return tr;\n\n const newText = tr.newDoc.toString();\n for (const pattern of patterns) {\n const re = toGlobalRegex(pattern);\n re.lastIndex = 0;\n if (re.test(newText)) return []; // [] = block transaction\n }\n return tr;\n });\n\n return [forbiddenLinter, pasteFilter];\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n // ==========================================================================\n // PROTECTED METHODS - Event handlers\n // ==========================================================================\n\n protected handlerCopy(): void {\n navigator.clipboard.writeText(this.content() || '');\n this.notificationService.showCompTypeTextInfo('Sao chép thành công');\n }\n\n protected handlerLineWrap(): void {\n // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines\n const currentContent = this.editorViewInstance?.state.doc.toString() || '';\n if (this.isWrap()) {\n this.contentStateNoWrap.set(currentContent);\n }\n const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\\n/g, ' ') : this.contentStateNoWrap();\n this.isWrap.update((val) => !val);\n\n if (currentContent !== updatedContent) {\n this.editorViewInstance?.dispatch({\n changes: { from: 0, to: currentContent.length, insert: updatedContent },\n });\n }\n\n // Batch cả 2 dispatch thành 1 để tối ưu performance\n this.editorViewInstance?.dispatch({\n effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],\n });\n }\n\n protected async handlerSelectKey(data?: IEmitSelectKey): Promise<void> {\n if (!data?.key) {\n return;\n }\n\n const newLang = data.key as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;\n this.langSelected.set(newLang);\n\n // Load language và linter mới\n const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);\n\n // Reconfigure thay vì tạo mới state để giữ lại document content\n this.editorViewInstance?.dispatch({\n effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],\n });\n\n this.outChange.emit({\n content: this.content(),\n isWrap: !this.isWrap(),\n language: this.langSelected(),\n contextChange: 'language',\n });\n }\n}\n","<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "name": "@libs-ui/components-preview-text-data",
3
- "version": "0.2.356-38",
3
+ "version": "0.2.356-40",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0",
6
- "@libs-ui/components-buttons-button": "0.2.356-38",
7
- "@libs-ui/components-dropdown": "0.2.356-38",
8
- "@libs-ui/services-notification": "0.2.356-38",
9
- "@libs-ui/utils": "0.2.356-38",
6
+ "@libs-ui/components-buttons-button": "0.2.356-40",
7
+ "@libs-ui/components-dropdown": "0.2.356-40",
8
+ "@libs-ui/services-notification": "0.2.356-40",
9
+ "@libs-ui/utils": "0.2.356-40",
10
10
  "@codemirror/autocomplete": "6.20.0",
11
11
  "@codemirror/language": "6.11.3",
12
12
  "@codemirror/lint": "6.9.1",
13
13
  "@codemirror/state": "6.5.2",
14
14
  "@codemirror/view": "6.38.6",
15
15
  "@lezer/common": "1.4.0",
16
- "@libs-ui/components-list": "0.2.356-38",
16
+ "@libs-ui/components-list": "0.2.356-40",
17
17
  "codemirror6": "npm:codemirror@6.0.2",
18
- "@libs-ui/services-http-request": "0.2.356-38",
18
+ "@libs-ui/services-http-request": "0.2.356-40",
19
19
  "@codemirror/lang-javascript": "6.2.4",
20
20
  "@codemirror/lang-html": "6.4.11",
21
21
  "@codemirror/lang-css": "6.3.1",
@@ -13,7 +13,7 @@ export declare class LibsUiComponentsPreviewTextDataComponent implements OnInit,
13
13
  private readonly linterCompartment;
14
14
  private readonly completionsCompartment;
15
15
  private readonly forbiddenCompartment;
16
- private contentStateNoWrap;
16
+ private readonly contentStateNoWrap;
17
17
  /** Cache để tránh load lại language đã load */
18
18
  private readonly languageCache;
19
19
  /** Flag để tránh update editor khi đang khởi tạo */