@worktile/theia 17.4.6 → 17.4.8

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.
@@ -1,5 +1,5 @@
1
1
  import { NgFor, NgIf } from '@angular/common';
2
- import { Component, HostBinding, Input, ViewChildren } from '@angular/core';
2
+ import { ChangeDetectorRef, Component, ElementRef, HostBinding, Input, NgZone, ViewChildren, inject, viewChild } from '@angular/core';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { ThyAction } from 'ngx-tethys/action';
5
5
  import { ScrollToService } from 'ngx-tethys/core';
@@ -8,11 +8,11 @@ import { ThyDropdownDirective, ThyDropdownMenuComponent, ThyDropdownMenuGroup, T
8
8
  import { ThyEmptyModule } from 'ngx-tethys/empty';
9
9
  import { ThyIcon } from 'ngx-tethys/icon';
10
10
  import { ThyInputSearch } from 'ngx-tethys/input';
11
- import { ThyPopoverDirective } from 'ngx-tethys/popover';
11
+ import { ThyPopoverDirective, ThyPopoverRef } from 'ngx-tethys/popover';
12
12
  import { ThyTooltipDirective } from 'ngx-tethys/tooltip';
13
13
  import { Editor, Node, Transforms } from 'slate';
14
14
  import { AngularEditor } from 'slate-angular';
15
- import { DefaultPluginMenu, ThePluginMenuItemType } from '../../constants';
15
+ import { DefaultPluginMenu, QUICK_INSERT_HOTKEY, ThePluginMenuItemType } from '../../constants';
16
16
  import { buildPluginMenu, buildPluginMenuItemMap } from '../../core';
17
17
  import { ThePluginMenu } from '../../interfaces';
18
18
  import { PluginMenuPipe } from '../../pipes';
@@ -22,15 +22,14 @@ import { ThePreventDefaultDirective } from '../action/prevent-default';
22
22
  import { TheListboxDirective, TheListboxGroupDirective, TheListboxOptionDirective } from '../listbox/listbox';
23
23
  import { TheTableSelect } from '../table-select/table-select.component';
24
24
  import * as i0 from "@angular/core";
25
- import * as i1 from "ngx-tethys/popover";
26
- import * as i2 from "@angular/forms";
27
- import * as i3 from "ngx-tethys/empty";
25
+ import * as i1 from "@angular/forms";
26
+ import * as i2 from "ngx-tethys/empty";
28
27
  export class ThePluginMenuComponent {
29
- constructor(elementRef, cdr, ngZone, thyPopoverRef) {
30
- this.elementRef = elementRef;
31
- this.cdr = cdr;
32
- this.ngZone = ngZone;
33
- this.thyPopoverRef = thyPopoverRef;
28
+ constructor() {
29
+ this.theDisplaySearch = false;
30
+ this.autoActiveFirstItem = true;
31
+ this.containerClassName = `the-plugin-menu-container`;
32
+ this.listBox = viewChild(TheListboxDirective);
34
33
  this.listBoxAutoActiveFirstItem = true;
35
34
  this.groupMenu = [];
36
35
  this.iconMenu = [];
@@ -50,13 +49,14 @@ export class ThePluginMenuComponent {
50
49
  // 避免重写
51
50
  originActiveClass: 'thy-popover-origin-active'
52
51
  };
53
- this.containerClassName = `the-plugin-menu-container`;
54
- this.theDisplaySearch = false;
55
- this.autoActiveFirstItem = true;
52
+ this.elementRef = inject((ElementRef));
53
+ this.ngZone = inject(NgZone);
54
+ this.cdr = inject(ChangeDetectorRef);
55
+ this.thyPopoverRef = inject((ThyPopoverRef));
56
56
  this.removeBlock = () => {
57
57
  const node = Node.get(this.editor, this.editor.selection.anchor.path);
58
58
  const nodeString = Node.string(node);
59
- const isStartWithHotkey = nodeString.startsWith('/');
59
+ const isStartWithHotkey = nodeString.startsWith(QUICK_INSERT_HOTKEY);
60
60
  const isIncludeKeywords = nodeString.toLocaleLowerCase().trim().includes(this.keyWords);
61
61
  if (node && nodeString.length > 0 && (isStartWithHotkey || isIncludeKeywords)) {
62
62
  Editor.deleteBackward(this.editor, { unit: 'block' });
@@ -65,7 +65,7 @@ export class ThePluginMenuComponent {
65
65
  this.removeCharacter = () => {
66
66
  const node = Node.get(this.editor, this.editor.selection.anchor.path);
67
67
  const nodeString = Node.string(node);
68
- const isStartWithHotkey = nodeString.startsWith('/') || nodeString.startsWith('#');
68
+ const isStartWithHotkey = nodeString.startsWith(QUICK_INSERT_HOTKEY) || nodeString.startsWith('#');
69
69
  const isIncludeKeywords = nodeString.toLocaleLowerCase().trim().includes(this.keyWords);
70
70
  if (this.originKeywords?.length > 0 && (isStartWithHotkey || isIncludeKeywords)) {
71
71
  Transforms.delete(this.editor, { distance: this.originKeywords.length, reverse: true });
@@ -150,6 +150,20 @@ export class ThePluginMenuComponent {
150
150
  }
151
151
  this.cdr.markForCheck();
152
152
  }
153
+ listBoxOptionMouseenter(e, menu) {
154
+ e.preventDefault();
155
+ const listBox = this.listBox();
156
+ if (listBox) {
157
+ const activeOption = listBox.activeOption;
158
+ const newActiveOption = listBox.getOption(menu?.key);
159
+ listBox.setActiveItem(activeOption, newActiveOption, 'turn');
160
+ }
161
+ }
162
+ listBoxOptionMouseleave(e, menu) {
163
+ e.preventDefault();
164
+ const listBox = this.listBox();
165
+ listBox?.clearActiveItem();
166
+ }
153
167
  handleItemSelection(menuItem) {
154
168
  if (menuItem.isDisabled && menuItem.isDisabled(this.editor)) {
155
169
  return;
@@ -175,22 +189,27 @@ export class ThePluginMenuComponent {
175
189
  this.scrollContainer.scrollTop = 0;
176
190
  }
177
191
  }
178
- theListboxChange(event) {
179
- if (event.type === 'select') {
180
- this.handleItemSelection(event.option.theOptionValue);
181
- }
182
- if (event.type === 'child') {
183
- const dropdown = this.findDropdownTrigger(event.option.parentOption);
184
- this.ngZone.run(() => {
185
- dropdown.show();
186
- });
187
- }
188
- if (event.type === 'parent') {
189
- const dropdown = this.findDropdownTrigger(event.option);
190
- dropdown.hide();
192
+ listBoxChange(event) {
193
+ if (!event.option) {
194
+ return;
191
195
  }
192
- if (event.type === 'turn' && !event.option.parentOption) {
193
- ScrollToService.scrollToElement(event.option.elementRef.nativeElement, this.scrollContainer);
196
+ switch (event.type) {
197
+ case 'select':
198
+ this.handleItemSelection(event.option.theOptionValue);
199
+ break;
200
+ case 'child':
201
+ const dropdownComponent = this.findDropdownTrigger(event.option.parentOption);
202
+ this.ngZone.run(() => {
203
+ dropdownComponent.show();
204
+ });
205
+ break;
206
+ case 'parent':
207
+ const dropdown = this.findDropdownTrigger(event.option);
208
+ dropdown.hide();
209
+ break;
210
+ case 'turn':
211
+ ScrollToService.scrollToElement(event.option.elementRef.nativeElement, this.scrollContainer);
212
+ break;
194
213
  }
195
214
  }
196
215
  findDropdownTrigger(option) {
@@ -202,8 +221,8 @@ export class ThePluginMenuComponent {
202
221
  trackByFn(index, item) {
203
222
  return item?.key ?? index;
204
223
  }
205
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: ThePluginMenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1.ThyPopoverRef }], target: i0.ɵɵFactoryTarget.Component }); }
206
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.0", type: ThePluginMenuComponent, isStandalone: true, selector: "the-plugin-menu", inputs: { editor: "editor", theDisplaySearch: "theDisplaySearch", thePluginMenu: "thePluginMenu", sceneKey: "sceneKey", subPanelClass: "subPanelClass", autoActiveFirstItem: "autoActiveFirstItem" }, host: { properties: { "class": "this.containerClassName" } }, viewQueries: [{ propertyName: "dropdownTriggers", predicate: ["dropdownTriggers"], descendants: true, read: ThyDropdownDirective }], ngImport: i0, template: "<div *ngIf=\"theDisplaySearch\" class=\"menu-search px-5 pt-5 pb-2\">\n <thy-input-search [(ngModel)]=\"keyWords\" placeholder=\"\u641C\u7D22\" thyIconPosition=\"after\" (ngModelChange)=\"updateKeywords(keyWords)\">\n </thy-input-search>\n</div>\n\n<div\n *ngIf=\"groupMenu.length > 0; else empty\"\n theListBox\n [keyboardContainer]=\"keyboardContainer\"\n [autoActiveFirstItem]=\"listBoxAutoActiveFirstItem\"\n (theListboxChange)=\"theListboxChange($event)\"\n class=\"thy-dropdown-menu the-plugin-menu-scroll-container pb-2 pt-0\"\n>\n <ng-container *ngIf=\"iconMenu?.length > 0\">\n <div theListboxGroup [horizontalColumn]=\"6\" class=\"icon-menu d-flex pl-5 py-1\">\n <ng-container *ngFor=\"let item of iconMenu; trackBy: trackByFn\">\n <a\n *ngIf=\"item.type === ThePluginMenuItemType.icon\"\n href=\"javascript:;\"\n class=\"mt-2\"\n thyAction\n theListboxOption\n [theOptionValue]=\"item\"\n [thyActionIcon]=\"item.icon\"\n [thyTooltip]=\"item?.name\"\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n ></a>\n </ng-container>\n </div>\n <thy-divider class=\"my-2\"></thy-divider>\n </ng-container>\n\n <div theListboxGroup>\n <ng-container *ngFor=\"let item of groupMenu; trackBy: trackByFn\">\n <ng-container *ngIf=\"item.isMenuItem && !(item.children?.length > 0) && item.key !== 'table'\">\n <div\n thyDropdownMenuItem\n theListboxOption\n [theOptionValue]=\"item\"\n class=\"py-0\"\n thePreventDefault\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n (click)=\"handleItemSelection(item)\"\n >\n <div *ngIf=\"item.menuIcon\" class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.isMenuItem && item.children?.length > 0\" #hasExpanded>\n <div\n #dropdownTriggers\n [thyDropdown]=\"expand\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n [thyDisabled]=\"item.disabled\"\n theListboxOption\n [theOptionValue]=\"item\"\n [theOptionDisabled]=\"item.disabled\"\n [thyPopoverOptions]=\"expandPopoverOptions\"\n class=\"py-0\"\n thePreventDefault\n [thyPanelClass]=\"subPanelClass\"\n (click)=\"handleItemSelection(item)\"\n >\n <div *ngIf=\"item.menuIcon\" class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n <div *ngIf=\"item.children?.length > 0\">\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n <thy-dropdown-menu #expand>\n <div class=\"the-plugin-menu-container expand-menu\" theListboxGroup>\n <ng-container *ngFor=\"let child of item.children\">\n <div\n *ngIf=\"child.type === ThePluginMenuItemType.group\"\n thyDropdownMenuItem\n theListboxOption\n class=\"py-0\"\n thePreventDefault\n [theOptionDisabled]=\"item.disabled\"\n [thyDisabled]=\"child.disabled\"\n (click)=\"handleItemSelection(child)\"\n [theOptionValue]=\"child\"\n >\n <div *ngIf=\"child.menuIcon\" class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"child.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ child.name }}\n </div>\n </div>\n </div>\n <thy-divider *ngIf=\"child === 'divider'\" class=\"my-2\"></thy-divider>\n </ng-container>\n </div>\n </thy-dropdown-menu>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.isMenuItem && item.key === 'table'\">\n <div\n #dropdownTriggers\n [thyPopover]=\"tableSelect\"\n thyPlacement=\"rightTop\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n theListboxOption\n [thyConfig]=\"tableSelectPopoverConfig\"\n [theOptionValue]=\"item\"\n [theOptionDisabled]=\"item.disabled\"\n [thyDisabled]=\"item.disabled\"\n class=\"py-0\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n <div>\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n\n <ng-template #tableSelect>\n <table-select class=\"plugin-menu-table the-table-selector-panel\" [editor]=\"editor\" [beforeInsert]=\"removeBlock\"></table-select>\n </ng-template>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isMenuItem\" #menuGroup>\n <thy-dropdown-menu-group class=\"font-size-sm\" [thyTitle]=\"item.groupName\"></thy-dropdown-menu-group>\n </ng-container>\n </ng-container>\n </div>\n</div>\n\n<ng-template #empty>\n <div class=\"empty d-flex align-items-center justify-content-center\">\n <thy-empty [thyMessage]=\"thyMessage\"></thy-empty>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ThyEmptyModule }, { kind: "component", type: i3.ThyEmpty, selector: "thy-empty", inputs: ["thyMessage", "thyTranslationKey", "thyTranslationValues", "thyEntityName", "thyEntityNameTranslateKey", "thyIconName", "thySize", "thyMarginTop", "thyTopAuto", "thyContainer", "thyImageUrl", "thyImageLoading", "thyImageFetchPriority", "thyDescription"] }, { kind: "component", type: TheTableSelect, selector: "table-select", inputs: ["optionsParam", "editor", "beforeInsert"] }, { kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "component", type: ThyAction, selector: "thy-action, [thyAction]", inputs: ["thyType", "thyIcon", "thyActionIcon", "thyActive", "thyActionActive", "thyTheme", "thyHoverIcon", "thyDisabled"] }, { kind: "component", type: ThyDivider, selector: "thy-divider", inputs: ["thyVertical", "thyStyle", "thyColor", "thyText", "thyTextDirection", "thyDeeper"] }, { kind: "component", type: ThyInputSearch, selector: "thy-input-search", inputs: ["name", "placeholder", "thyTheme", "thySearchFocus", "thyIconPosition", "thySize"], outputs: ["clear", "thyClear"] }, { kind: "component", type: ThyDropdownMenuComponent, selector: "thy-dropdown-menu", inputs: ["thyWidth", "thyImmediateRender"] }, { kind: "component", type: ThyDropdownMenuGroup, selector: "thy-dropdown-menu-group", inputs: ["thyTitle"] }, { kind: "pipe", type: PluginMenuPipe, name: "getMenuIcon" }, { kind: "directive", type: ThyTooltipDirective, selector: "[thyTooltip],[thy-tooltip]", inputs: ["thyTooltip", "thyTooltipPlacement", "thyTooltipClass", "thyTooltipShowDelay", "thyTooltipHideDelay", "thyTooltipTrigger", "thyTooltipDisabled", "thyTooltipTemplateContext", "thyTooltipOffset", "thyTooltipPin"], exportAs: ["thyTooltip"] }, { kind: "directive", type: ThyPopoverDirective, selector: "[thyPopover]", inputs: ["thyPopover", "thyTrigger", "thyPlacement", "thyOffset", "thyConfig", "thyShowDelay", "thyHideDelay", "thyAutoAdaptive", "thyDisabled"] }, { kind: "directive", type: TheListboxDirective, selector: "[theListBox]", inputs: ["keyboardContainer", "autoActiveFirstItem"], outputs: ["theListboxChange"], exportAs: ["theListBox"] }, { kind: "directive", type: ThyDropdownDirective, selector: "[thyDropdown]", inputs: ["thyDropdownMenu", "thyDropdown", "thyTrigger", "thyShowDelay", "thyHideDelay", "thyActiveClass", "thyPopoverOptions", "thyPlacement", "thyMenuInsideClosable", "thyPanelClass"], outputs: ["thyActiveChange"] }, { kind: "directive", type: TheListboxGroupDirective, selector: "[theListboxGroup]", inputs: ["horizontalColumn"], exportAs: ["theListboxGroup"] }, { kind: "directive", type: TheListboxOptionDirective, selector: "[theListboxOption]", inputs: ["theOptionValue", "theOptionDisabled"], exportAs: ["theListboxOption"] }, { kind: "directive", type: ThePreventDefaultDirective, selector: "[thePreventDefault]", exportAs: ["thePreventDefault"] }, { kind: "directive", type: ThyDropdownMenuItemDirective, selector: "[thyDropdownMenuItem]", inputs: ["thyType", "thyDisabled"] }] }); }
224
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: ThePluginMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
225
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: ThePluginMenuComponent, isStandalone: true, selector: "the-plugin-menu", inputs: { editor: "editor", theDisplaySearch: "theDisplaySearch", thePluginMenu: "thePluginMenu", sceneKey: "sceneKey", subPanelClass: "subPanelClass", autoActiveFirstItem: "autoActiveFirstItem" }, host: { properties: { "class": "this.containerClassName" } }, viewQueries: [{ propertyName: "listBox", first: true, predicate: TheListboxDirective, descendants: true, isSignal: true }, { propertyName: "dropdownTriggers", predicate: ["dropdownTriggers"], descendants: true, read: ThyDropdownDirective }], ngImport: i0, template: "@if (theDisplaySearch) {\n <div class=\"menu-search px-5 pt-5 pb-2\">\n <thy-input-search placeholder=\"\u641C\u7D22\" thyIconPosition=\"after\" [(ngModel)]=\"keyWords\" (ngModelChange)=\"updateKeywords(keyWords)\">\n </thy-input-search>\n </div>\n}\n\n@if (groupMenu.length > 0) {\n <div\n class=\"thy-dropdown-menu the-plugin-menu-scroll-container pb-2 pt-0\"\n theListBox\n [keyboardContainer]=\"keyboardContainer\"\n [autoActiveFirstItem]=\"listBoxAutoActiveFirstItem\"\n (theListboxChange)=\"listBoxChange($event)\"\n >\n <ng-container *ngIf=\"iconMenu?.length > 0\">\n <div theListboxGroup [horizontalColumn]=\"6\" class=\"icon-menu d-flex pl-5 py-1\">\n @for (item of iconMenu; track $index) {\n @if (item.type === ThePluginMenuItemType.icon) {\n <a\n href=\"javascript:;\"\n class=\"mt-2\"\n thyAction\n theListboxOption\n thePreventDefault\n [theOptionValue]=\"item\"\n [thyActionIcon]=\"item.icon\"\n [thyTooltip]=\"item?.name\"\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n (mouseenter)=\"listBoxOptionMouseenter($event, item)\"\n (mouseleave)=\"listBoxOptionMouseleave($event, item)\"\n (click)=\"handleItemSelection(item)\"\n ></a>\n }\n }\n </div>\n <thy-divider class=\"my-2\"></thy-divider>\n </ng-container>\n\n <div theListboxGroup>\n <ng-container *ngFor=\"let item of groupMenu; trackBy: trackByFn\">\n <ng-container *ngIf=\"item.isMenuItem && !(item.children?.length > 0) && item.key !== 'table'\">\n <div\n class=\"py-0\"\n thyDropdownMenuItem\n theListboxOption\n thePreventDefault\n [theOptionValue]=\"item\"\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n (mouseenter)=\"listBoxOptionMouseenter($event, item)\"\n (mouseleave)=\"listBoxOptionMouseleave($event, item)\"\n (click)=\"handleItemSelection(item)\"\n >\n @if (item?.menuIcon) {\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n }\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.isMenuItem && item.children?.length > 0\" #hasExpanded>\n <div\n #dropdownTriggers\n class=\"py-0\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n theListboxOption\n thePreventDefault\n [theOptionValue]=\"item\"\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n [thyDropdown]=\"expand\"\n [thyPopoverOptions]=\"expandPopoverOptions\"\n [thyPanelClass]=\"subPanelClass\"\n (click)=\"handleItemSelection(item)\"\n >\n @if (item?.menuIcon) {\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n }\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n @if (item.children?.length > 0) {\n <div>\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n }\n <thy-dropdown-menu #expand>\n <div class=\"the-plugin-menu-container expand-menu\" theListboxGroup>\n @for (child of item.children; track item?.key ?? $index) {\n @if (child.type === ThePluginMenuItemType.group) {\n <div\n class=\"py-0\"\n thyDropdownMenuItem\n theListboxOption\n thePreventDefault\n [theOptionDisabled]=\"item.disabled\"\n [thyDisabled]=\"child.disabled\"\n [theOptionValue]=\"child\"\n (mouseenter)=\"listBoxOptionMouseenter($event, child)\"\n (mouseleave)=\"listBoxOptionMouseleave($event, child)\"\n (click)=\"handleItemSelection(child)\"\n >\n @if (child?.menuIcon) {\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"child.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n }\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ child.name }}\n </div>\n </div>\n </div>\n } @else if (child === 'divider') {\n <thy-divider class=\"my-2\"></thy-divider>\n }\n }\n </div>\n </thy-dropdown-menu>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.isMenuItem && item.key === 'table'\">\n <div\n #dropdownTriggers\n class=\"py-0\"\n thyPlacement=\"rightTop\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n theListboxOption\n thePreventDefault\n [theOptionValue]=\"item\"\n [theOptionDisabled]=\"item.disabled\"\n [thyDisabled]=\"item.disabled\"\n [thyPopover]=\"tableSelect\"\n [thyConfig]=\"tableSelectPopoverConfig\"\n (mouseenter)=\"listBoxOptionMouseenter($event, item)\"\n (mouseleave)=\"listBoxOptionMouseleave($event, item)\"\n (click)=\"handleItemSelection(item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n <div>\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n\n <ng-template #tableSelect>\n <table-select\n class=\"plugin-menu-table the-table-selector-panel\"\n [editor]=\"editor\"\n [beforeInsert]=\"removeBlock\"\n ></table-select>\n </ng-template>\n </div>\n </ng-container>\n\n @if (!item.isMenuItem) {\n <thy-dropdown-menu-group class=\"font-size-sm\" [thyTitle]=\"item.groupName\"></thy-dropdown-menu-group>\n }\n </ng-container>\n </div>\n </div>\n} @else {\n <div class=\"empty d-flex align-items-center justify-content-center\">\n <thy-empty [thyMessage]=\"thyMessage\"></thy-empty>\n </div>\n}\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ThyEmptyModule }, { kind: "component", type: i2.ThyEmpty, selector: "thy-empty", inputs: ["thyMessage", "thyTranslationKey", "thyTranslationValues", "thyEntityName", "thyEntityNameTranslateKey", "thyIconName", "thySize", "thyMarginTop", "thyTopAuto", "thyContainer", "thyImageUrl", "thyImageLoading", "thyImageFetchPriority", "thyDescription"] }, { kind: "component", type: TheTableSelect, selector: "table-select", inputs: ["optionsParam", "editor", "beforeInsert"] }, { kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "component", type: ThyAction, selector: "thy-action, [thyAction]", inputs: ["thyType", "thyIcon", "thyActionIcon", "thyActive", "thyActionActive", "thyTheme", "thyHoverIcon", "thyDisabled"] }, { kind: "component", type: ThyDivider, selector: "thy-divider", inputs: ["thyVertical", "thyStyle", "thyColor", "thyText", "thyTextDirection", "thyDeeper"] }, { kind: "component", type: ThyInputSearch, selector: "thy-input-search", inputs: ["name", "placeholder", "thyTheme", "thySearchFocus", "thyIconPosition", "thySize"], outputs: ["clear", "thyClear"] }, { kind: "component", type: ThyDropdownMenuComponent, selector: "thy-dropdown-menu", inputs: ["thyWidth", "thyImmediateRender"] }, { kind: "component", type: ThyDropdownMenuGroup, selector: "thy-dropdown-menu-group", inputs: ["thyTitle"] }, { kind: "pipe", type: PluginMenuPipe, name: "getMenuIcon" }, { kind: "directive", type: ThyTooltipDirective, selector: "[thyTooltip],[thy-tooltip]", inputs: ["thyTooltip", "thyTooltipPlacement", "thyTooltipClass", "thyTooltipShowDelay", "thyTooltipHideDelay", "thyTooltipTrigger", "thyTooltipDisabled", "thyTooltipTemplateContext", "thyTooltipOffset", "thyTooltipPin"], exportAs: ["thyTooltip"] }, { kind: "directive", type: ThyPopoverDirective, selector: "[thyPopover]", inputs: ["thyPopover", "thyTrigger", "thyPlacement", "thyOffset", "thyConfig", "thyShowDelay", "thyHideDelay", "thyAutoAdaptive", "thyDisabled"] }, { kind: "directive", type: TheListboxDirective, selector: "[theListBox]", inputs: ["keyboardContainer", "autoActiveFirstItem"], outputs: ["theListboxChange"], exportAs: ["theListBox"] }, { kind: "directive", type: ThyDropdownDirective, selector: "[thyDropdown]", inputs: ["thyDropdownMenu", "thyDropdown", "thyTrigger", "thyShowDelay", "thyHideDelay", "thyActiveClass", "thyPopoverOptions", "thyPlacement", "thyMenuInsideClosable", "thyPanelClass"], outputs: ["thyActiveChange"] }, { kind: "directive", type: TheListboxGroupDirective, selector: "[theListboxGroup]", inputs: ["horizontalColumn"], exportAs: ["theListboxGroup"] }, { kind: "directive", type: TheListboxOptionDirective, selector: "[theListboxOption]", inputs: ["theOptionValue", "theOptionDisabled"], exportAs: ["theListboxOption"] }, { kind: "directive", type: ThePreventDefaultDirective, selector: "[thePreventDefault]", exportAs: ["thePreventDefault"] }, { kind: "directive", type: ThyDropdownMenuItemDirective, selector: "[thyDropdownMenuItem]", inputs: ["thyType", "thyDisabled"] }] }); }
207
226
  }
208
227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: ThePluginMenuComponent, decorators: [{
209
228
  type: Component,
@@ -228,14 +247,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
228
247
  TheListboxOptionDirective,
229
248
  ThePreventDefaultDirective,
230
249
  ThyDropdownMenuItemDirective
231
- ], template: "<div *ngIf=\"theDisplaySearch\" class=\"menu-search px-5 pt-5 pb-2\">\n <thy-input-search [(ngModel)]=\"keyWords\" placeholder=\"\u641C\u7D22\" thyIconPosition=\"after\" (ngModelChange)=\"updateKeywords(keyWords)\">\n </thy-input-search>\n</div>\n\n<div\n *ngIf=\"groupMenu.length > 0; else empty\"\n theListBox\n [keyboardContainer]=\"keyboardContainer\"\n [autoActiveFirstItem]=\"listBoxAutoActiveFirstItem\"\n (theListboxChange)=\"theListboxChange($event)\"\n class=\"thy-dropdown-menu the-plugin-menu-scroll-container pb-2 pt-0\"\n>\n <ng-container *ngIf=\"iconMenu?.length > 0\">\n <div theListboxGroup [horizontalColumn]=\"6\" class=\"icon-menu d-flex pl-5 py-1\">\n <ng-container *ngFor=\"let item of iconMenu; trackBy: trackByFn\">\n <a\n *ngIf=\"item.type === ThePluginMenuItemType.icon\"\n href=\"javascript:;\"\n class=\"mt-2\"\n thyAction\n theListboxOption\n [theOptionValue]=\"item\"\n [thyActionIcon]=\"item.icon\"\n [thyTooltip]=\"item?.name\"\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n ></a>\n </ng-container>\n </div>\n <thy-divider class=\"my-2\"></thy-divider>\n </ng-container>\n\n <div theListboxGroup>\n <ng-container *ngFor=\"let item of groupMenu; trackBy: trackByFn\">\n <ng-container *ngIf=\"item.isMenuItem && !(item.children?.length > 0) && item.key !== 'table'\">\n <div\n thyDropdownMenuItem\n theListboxOption\n [theOptionValue]=\"item\"\n class=\"py-0\"\n thePreventDefault\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n (click)=\"handleItemSelection(item)\"\n >\n <div *ngIf=\"item.menuIcon\" class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.isMenuItem && item.children?.length > 0\" #hasExpanded>\n <div\n #dropdownTriggers\n [thyDropdown]=\"expand\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n [thyDisabled]=\"item.disabled\"\n theListboxOption\n [theOptionValue]=\"item\"\n [theOptionDisabled]=\"item.disabled\"\n [thyPopoverOptions]=\"expandPopoverOptions\"\n class=\"py-0\"\n thePreventDefault\n [thyPanelClass]=\"subPanelClass\"\n (click)=\"handleItemSelection(item)\"\n >\n <div *ngIf=\"item.menuIcon\" class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n <div *ngIf=\"item.children?.length > 0\">\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n <thy-dropdown-menu #expand>\n <div class=\"the-plugin-menu-container expand-menu\" theListboxGroup>\n <ng-container *ngFor=\"let child of item.children\">\n <div\n *ngIf=\"child.type === ThePluginMenuItemType.group\"\n thyDropdownMenuItem\n theListboxOption\n class=\"py-0\"\n thePreventDefault\n [theOptionDisabled]=\"item.disabled\"\n [thyDisabled]=\"child.disabled\"\n (click)=\"handleItemSelection(child)\"\n [theOptionValue]=\"child\"\n >\n <div *ngIf=\"child.menuIcon\" class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"child.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ child.name }}\n </div>\n </div>\n </div>\n <thy-divider *ngIf=\"child === 'divider'\" class=\"my-2\"></thy-divider>\n </ng-container>\n </div>\n </thy-dropdown-menu>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.isMenuItem && item.key === 'table'\">\n <div\n #dropdownTriggers\n [thyPopover]=\"tableSelect\"\n thyPlacement=\"rightTop\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n theListboxOption\n [thyConfig]=\"tableSelectPopoverConfig\"\n [theOptionValue]=\"item\"\n [theOptionDisabled]=\"item.disabled\"\n [thyDisabled]=\"item.disabled\"\n class=\"py-0\"\n thePreventDefault\n (click)=\"handleItemSelection(item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n <div>\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n\n <ng-template #tableSelect>\n <table-select class=\"plugin-menu-table the-table-selector-panel\" [editor]=\"editor\" [beforeInsert]=\"removeBlock\"></table-select>\n </ng-template>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!item.isMenuItem\" #menuGroup>\n <thy-dropdown-menu-group class=\"font-size-sm\" [thyTitle]=\"item.groupName\"></thy-dropdown-menu-group>\n </ng-container>\n </ng-container>\n </div>\n</div>\n\n<ng-template #empty>\n <div class=\"empty d-flex align-items-center justify-content-center\">\n <thy-empty [thyMessage]=\"thyMessage\"></thy-empty>\n </div>\n</ng-template>\n" }]
232
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1.ThyPopoverRef }], propDecorators: { dropdownTriggers: [{
233
- type: ViewChildren,
234
- args: ['dropdownTriggers', { read: ThyDropdownDirective }]
235
- }], containerClassName: [{
236
- type: HostBinding,
237
- args: ['class']
238
- }], editor: [{
250
+ ], template: "@if (theDisplaySearch) {\n <div class=\"menu-search px-5 pt-5 pb-2\">\n <thy-input-search placeholder=\"\u641C\u7D22\" thyIconPosition=\"after\" [(ngModel)]=\"keyWords\" (ngModelChange)=\"updateKeywords(keyWords)\">\n </thy-input-search>\n </div>\n}\n\n@if (groupMenu.length > 0) {\n <div\n class=\"thy-dropdown-menu the-plugin-menu-scroll-container pb-2 pt-0\"\n theListBox\n [keyboardContainer]=\"keyboardContainer\"\n [autoActiveFirstItem]=\"listBoxAutoActiveFirstItem\"\n (theListboxChange)=\"listBoxChange($event)\"\n >\n <ng-container *ngIf=\"iconMenu?.length > 0\">\n <div theListboxGroup [horizontalColumn]=\"6\" class=\"icon-menu d-flex pl-5 py-1\">\n @for (item of iconMenu; track $index) {\n @if (item.type === ThePluginMenuItemType.icon) {\n <a\n href=\"javascript:;\"\n class=\"mt-2\"\n thyAction\n theListboxOption\n thePreventDefault\n [theOptionValue]=\"item\"\n [thyActionIcon]=\"item.icon\"\n [thyTooltip]=\"item?.name\"\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n (mouseenter)=\"listBoxOptionMouseenter($event, item)\"\n (mouseleave)=\"listBoxOptionMouseleave($event, item)\"\n (click)=\"handleItemSelection(item)\"\n ></a>\n }\n }\n </div>\n <thy-divider class=\"my-2\"></thy-divider>\n </ng-container>\n\n <div theListboxGroup>\n <ng-container *ngFor=\"let item of groupMenu; trackBy: trackByFn\">\n <ng-container *ngIf=\"item.isMenuItem && !(item.children?.length > 0) && item.key !== 'table'\">\n <div\n class=\"py-0\"\n thyDropdownMenuItem\n theListboxOption\n thePreventDefault\n [theOptionValue]=\"item\"\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n (mouseenter)=\"listBoxOptionMouseenter($event, item)\"\n (mouseleave)=\"listBoxOptionMouseleave($event, item)\"\n (click)=\"handleItemSelection(item)\"\n >\n @if (item?.menuIcon) {\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n }\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.isMenuItem && item.children?.length > 0\" #hasExpanded>\n <div\n #dropdownTriggers\n class=\"py-0\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n theListboxOption\n thePreventDefault\n [theOptionValue]=\"item\"\n [thyDisabled]=\"item.disabled\"\n [theOptionDisabled]=\"item.disabled\"\n [thyDropdown]=\"expand\"\n [thyPopoverOptions]=\"expandPopoverOptions\"\n [thyPanelClass]=\"subPanelClass\"\n (click)=\"handleItemSelection(item)\"\n >\n @if (item?.menuIcon) {\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n }\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n @if (item.children?.length > 0) {\n <div>\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n }\n <thy-dropdown-menu #expand>\n <div class=\"the-plugin-menu-container expand-menu\" theListboxGroup>\n @for (child of item.children; track item?.key ?? $index) {\n @if (child.type === ThePluginMenuItemType.group) {\n <div\n class=\"py-0\"\n thyDropdownMenuItem\n theListboxOption\n thePreventDefault\n [theOptionDisabled]=\"item.disabled\"\n [thyDisabled]=\"child.disabled\"\n [theOptionValue]=\"child\"\n (mouseenter)=\"listBoxOptionMouseenter($event, child)\"\n (mouseleave)=\"listBoxOptionMouseleave($event, child)\"\n (click)=\"handleItemSelection(child)\"\n >\n @if (child?.menuIcon) {\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"child.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n }\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ child.name }}\n </div>\n </div>\n </div>\n } @else if (child === 'divider') {\n <thy-divider class=\"my-2\"></thy-divider>\n }\n }\n </div>\n </thy-dropdown-menu>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.isMenuItem && item.key === 'table'\">\n <div\n #dropdownTriggers\n class=\"py-0\"\n thyPlacement=\"rightTop\"\n thyTrigger=\"hover\"\n thyDropdownMenuItem\n theListboxOption\n thePreventDefault\n [theOptionValue]=\"item\"\n [theOptionDisabled]=\"item.disabled\"\n [thyDisabled]=\"item.disabled\"\n [thyPopover]=\"tableSelect\"\n [thyConfig]=\"tableSelectPopoverConfig\"\n (mouseenter)=\"listBoxOptionMouseenter($event, item)\"\n (mouseleave)=\"listBoxOptionMouseleave($event, item)\"\n (click)=\"handleItemSelection(item)\"\n >\n <div class=\"menu-icon mr-2\">\n <thy-icon [thyIconName]=\"item.menuIcon | getMenuIcon: sceneKey\"></thy-icon>\n </div>\n <div class=\"menu-content d-flex align-items-center\">\n <div class=\"menu-item-title w-100\">\n {{ item.name }}\n </div>\n </div>\n <div>\n <thy-icon class=\"text-muted\" thyIconName=\"angle-right\"></thy-icon>\n </div>\n\n <ng-template #tableSelect>\n <table-select\n class=\"plugin-menu-table the-table-selector-panel\"\n [editor]=\"editor\"\n [beforeInsert]=\"removeBlock\"\n ></table-select>\n </ng-template>\n </div>\n </ng-container>\n\n @if (!item.isMenuItem) {\n <thy-dropdown-menu-group class=\"font-size-sm\" [thyTitle]=\"item.groupName\"></thy-dropdown-menu-group>\n }\n </ng-container>\n </div>\n </div>\n} @else {\n <div class=\"empty d-flex align-items-center justify-content-center\">\n <thy-empty [thyMessage]=\"thyMessage\"></thy-empty>\n </div>\n}\n" }]
251
+ }], propDecorators: { editor: [{
239
252
  type: Input
240
253
  }], theDisplaySearch: [{
241
254
  type: Input
@@ -247,5 +260,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
247
260
  type: Input
248
261
  }], autoActiveFirstItem: [{
249
262
  type: Input
263
+ }], containerClassName: [{
264
+ type: HostBinding,
265
+ args: ['class']
266
+ }], dropdownTriggers: [{
267
+ type: ViewChildren,
268
+ args: ['dropdownTriggers', { read: ThyDropdownDirective }]
250
269
  }] } });
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvcGx1Z2luLW1lbnUvcGx1Z2luLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvcGx1Z2luLW1lbnUvcGx1Z2luLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQXFCLFNBQVMsRUFBYyxXQUFXLEVBQUUsS0FBSyxFQUFrQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0IsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pJLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxtQkFBbUIsRUFBaUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBaUIsVUFBVSxFQUFF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QWM7d0JBQ2QsY0FBYzt3QkFDZCxPQUFPO3dCQUNQLFNBQVM7d0JBQ1QsVUFBVTt3QkFDVixjQUFjO3dCQUNkLHdCQUF3Qjt3QkFDeEIsb0JBQW9CO3dCQUNwQixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFDcEIsd0JBQXdCO3dCQUN4Qix5QkFBeUI7d0JBQ3pCLDBCQUEwQjt3QkFDMUIsNEJBQTRCO3FCQUMvQjtnS0EwQ2lFLGdCQUFnQjtzQkFBakYsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRTtnQkFFMUMsa0JBQWtCO3NCQUF2QyxXQUFXO3VCQUFDLE9BQU87Z0JBRVgsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE5nWm9uZSwgT25Jbml0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVGh5QWN0aW9uIH0gZnJvbSAnbmd4LXRldGh5cy9hY3Rpb24nO1xuaW1wb3J0IHsgU2Nyb2xsVG9TZXJ2aWNlIH0gZnJvbSAnbmd4LXRldGh5cy9jb3JlJztcbmltcG9ydCB7IFRoeURpdmlkZXIgfSBmcm9tICduZ3gtdGV0aHlzL2RpdmlkZXInO1xuaW1wb3J0IHsgVGh5RHJvcGRvd25EaXJlY3RpdmUsIFRoeURyb3Bkb3duTWVudUNvbXBvbmVudCwgVGh5RHJvcGRvd25NZW51R3JvdXAsIFRoeURyb3Bkb3duTWVudUl0ZW1EaXJlY3RpdmUgfSBmcm9tICduZ3gtdGV0aHlzL2Ryb3Bkb3duJztcbmltcG9ydCB7IFRoeUVtcHR5TW9kdWxlIH0gZnJvbSAnbmd4LXRldGh5cy9lbXB0eSc7XG5pbXBvcnQgeyBUaHlJY29uIH0gZnJvbSAnbmd4LXRldGh5cy9pY29uJztcbmltcG9ydCB7IFRoeUlucHV0U2VhcmNoIH0gZnJvbSAnbmd4LXRldGh5cy9pbnB1dCc7XG5pbXBvcnQgeyBUaHlQb3BvdmVyRGlyZWN0aXZlLCBUaHlQb3BvdmVyUmVmIH0gZnJvbSAnbmd4LXRldGh5cy9wb3BvdmVyJztcbmltcG9ydCB7IFRoeVRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICduZ3gtdGV0aHlzL3Rvb2x0aXAnO1xuaW1wb3J0IHsgRWRpdG9yLCBOb2RlLCBQYXRoUmVmLCBUZXh0LCBUcmFuc2Zvcm1zIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJ3NsYXRlLWFuZ3VsYXInO1xuaW1wb3J0IHsgRGVmYXVsdFBsdWdpbk1lbnUsIFRoZVBsdWdpbk1lbnVJdGVtVHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBidWlsZFBsdWdpbk1lbnUsIGJ1aWxkUGx1Z2luTWVudUl0ZW1NYXAgfSBmcm9tICcuLi8uLi9jb3JlJztcbmltcG9ydCB7IFRoZVBsdWdpbk1lbnUsIFRoZVBsdWdpbk1lbnVHcm91cCwgVGhlUGx1Z2luTWVudUl0ZW0sIFRoZVBsdWdpbk1lbnVJdGVtQ29uZmlnLCBUaGVQbHVnaW5NZW51SXRlbVdyYXAgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBsdWdpbk1lbnVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMnO1xuaW1wb3J0IHsgUXVpY2tJbnNlcnRFZGl0b3IgfSBmcm9tICcuLi8uLi9wbHVnaW5zL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgcmVmb2N1cyB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IFRoZVByZXZlbnREZWZhdWx0RGlyZWN0aXZlIH0gZnJvbSAnLi4vYWN0aW9uL3ByZXZlbnQtZGVmYXVsdCc7XG5pbXBvcnQgeyBUaGVMaXN0Ym94Q2hhbmdlRXZlbnQsIFRoZUxpc3Rib3hEaXJlY3RpdmUsIFRoZUxpc3Rib3hHcm91cERpcmVjdGl2ZSwgVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2xpc3Rib3gvbGlzdGJveCc7XG5pbXBvcnQgeyBUaGVUYWJsZVNlbGVjdCB9IGZyb20gJy4uL3RhYmxlLXNlbGVjdC90YWJsZS1zZWxlY3QuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aGUtcGx1Z2luLW1lbnUnLFxuICAgIHRlbXBsYXRlVXJsOiAncGx1Z2luLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ0ZvcixcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFRoeUVtcHR5TW9kdWxlLFxuICAgICAgICBUaGVUYWJsZVNlbGVjdCxcbiAgICAgICAgVGh5SWNvbixcbiAgICAgICAgVGh5QWN0aW9uLFxuICAgICAgICBUaHlEaXZpZGVyLFxuICAgICAgICBUaHlJbnB1dFNlYXJjaCxcbiAgICAgICAgVGh5RHJvcGRvd25NZW51Q29tcG9uZW50LFxuICAgICAgICBUaHlEcm9wZG93bk1lbnVHcm91cCxcbiAgICAgICAgUGx1Z2luTWVudVBpcGUsXG4gICAgICAgIFRoeVRvb2x0aXBEaXJlY3RpdmUsXG4gICAgICAgIFRoeVBvcG92ZXJEaXJlY3RpdmUsXG4gICAgICAgIFRoZUxpc3Rib3hEaXJlY3RpdmUsXG4gICAgICAgIFRoeURyb3Bkb3duRGlyZWN0aXZlLFxuICAgICAgICBUaGVMaXN0Ym94R3JvdXBEaXJlY3RpdmUsXG4gICAgICAgIFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmUsXG4gICAgICAgIFRoZVByZXZlbnREZWZhdWx0RGlyZWN0aXZlLFxuICAgICAgICBUaHlEcm9wZG93bk1lbnVJdGVtRGlyZWN0aXZlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUaGVQbHVnaW5NZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBsaXN0Qm94QXV0b0FjdGl2ZUZpcnN0SXRlbSA9IHRydWU7XG5cbiAgICBwYXRoUmVmOiBQYXRoUmVmO1xuXG4gICAga2V5Ym9hcmRDb250YWluZXI6IEhUTUxFbGVtZW50O1xuXG4gICAgX3BsdWdpbk1lbnU6IFRoZVBsdWdpbk1lbnU7XG5cbiAgICBncm91cE1lbnU6IFRoZVBsdWdpbk1lbnUgPSBbXTtcblxuICAgIGljb25NZW51OiBUaGVQbHVnaW5NZW51ID0gW107XG5cbiAgICBUaGVQbHVnaW5NZW51SXRlbVR5cGUgPSBUaGVQbHVnaW5NZW51SXRlbVR5cGU7XG5cbiAgICBrZXlXb3Jkczogc3RyaW5nO1xuXG4gICAgdGh5TWVzc2FnZSA9ICfmmoLml6DmlbDmja4nO1xuXG4gICAgc2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICAgIHNlYXJjaEdyb3VwOiBUaGVQbHVnaW5NZW51R3JvdXAgPSB7XG4gICAgICAgIGdyb3VwTmFtZTogJ+aQnOe0oue7k+aenCdcbiAgICB9O1xuXG4gICAgZXhwYW5kUG9wb3Zlck9wdGlvbnMgPSB7XG4gICAgICAgIHBsYWNlbWVudDogJ3JpZ2h0VG9wJyxcbiAgICAgICAgd2lkdGg6ICcyNjJweCcsXG4gICAgICAgIG1pbldpZHRoOiAnMjYycHgnXG4gICAgfTtcblxuICAgIHRhYmxlU2VsZWN0UG9wb3ZlckNvbmZpZyA9IHtcbiAgICAgICAgcGFuZWxDbGFzczogJ3BsdWdpbi1tZW51LXRhYmxlLXNlbGVjdC1jb250YWluZXInLFxuICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgLy8gIOmBv+WFjemHjeWGmVxuICAgICAgICBvcmlnaW5BY3RpdmVDbGFzczogJ3RoeS1wb3BvdmVyLW9yaWdpbi1hY3RpdmUnXG4gICAgfTtcblxuICAgIG9yaWdpbktleXdvcmRzOiBzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkcmVuKCdkcm9wZG93blRyaWdnZXJzJywgeyByZWFkOiBUaHlEcm9wZG93bkRpcmVjdGl2ZSB9KSBkcm9wZG93blRyaWdnZXJzOiBUaHlEcm9wZG93bkRpcmVjdGl2ZVtdO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNvbnRhaW5lckNsYXNzTmFtZSA9IGB0aGUtcGx1Z2luLW1lbnUtY29udGFpbmVyYDtcblxuICAgIEBJbnB1dCgpIGVkaXRvcjogRWRpdG9yO1xuXG4gICAgQElucHV0KCkgdGhlRGlzcGxheVNlYXJjaDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgdGhlUGx1Z2luTWVudTogVGhlUGx1Z2luTWVudUl0ZW1Db25maWdbXTtcblxuICAgIEBJbnB1dCgpIHNjZW5lS2V5Pzogc3RyaW5nO1xuXG4gICAgQElucHV0KCkgc3ViUGFuZWxDbGFzczogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgICBASW5wdXQoKSBhdXRvQWN0aXZlRmlyc3RJdGVtOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIHRoeVBvcG92ZXJSZWY6IFRoeVBvcG92ZXJSZWY8VGhlUGx1Z2luTWVudUNvbXBvbmVudD5cbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9BY3RpdmVGaXJzdEl0ZW0gfHwgdGhpcy50aGVEaXNwbGF5U2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RCb3hBdXRvQWN0aXZlRmlyc3RJdGVtID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWFsaXplU2VhcmNoKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVBsdWdpbk1lbnUoKTtcbiAgICAgICAgdGhpcy5idWlsZE1lbnVzKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGhlLXBsdWdpbi1tZW51LXNjcm9sbC1jb250YWluZXInKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVNlYXJjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGhlRGlzcGxheVNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5rZXlib2FyZENvbnRhaW5lciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8g6K6w5L2P5L2N572uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGhSZWYgPSBFZGl0b3IucGF0aFJlZih0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkQ29udGFpbmVyID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemVQbHVnaW5NZW51KCkge1xuICAgICAgICBjb25zdCBjdXJyZW50TWVudSA9IHRoaXMudGhlUGx1Z2luTWVudSB8fCBEZWZhdWx0UGx1Z2luTWVudTtcbiAgICAgICAgY29uc3QgbWVudUl0ZW1zTWFwID0gYnVpbGRQbHVnaW5NZW51SXRlbU1hcCh0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMuX3BsdWdpbk1lbnUgPSBidWlsZFBsdWdpbk1lbnUobWVudUl0ZW1zTWFwLCBjdXJyZW50TWVudSk7XG4gICAgfVxuXG4gICAgYnVpbGRNZW51cygpIHtcbiAgICAgICAgdGhpcy5pY29uTWVudSA9IFtdO1xuICAgICAgICB0aGlzLmdyb3VwTWVudSA9IFtdO1xuXG4gICAgICAgIHRoaXMuX3BsdWdpbk1lbnUuZm9yRWFjaCgoaXRlbTogVGhlUGx1Z2luTWVudUl0ZW1XcmFwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IGl0ZW0/LmlzSGlkZGVuICYmIGl0ZW0uaXNIaWRkZW4odGhpcy5lZGl0b3IpO1xuXG4gICAgICAgICAgICBpZiAoVGhlUGx1Z2luTWVudS5pc01lbnVJdGVtKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5pc01lbnVJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpdGVtLmRpc2FibGVkID0gaXRlbS5pc0Rpc2FibGVkICYmIGl0ZW0uaXNEaXNhYmxlZCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMua2V5V29yZHMgJiYgIWlzSGlkZGVuICYmIGl0ZW0ua2V5d29yZHMgJiYgaXRlbS5rZXl3b3Jkcz8uaW5jbHVkZXModGhpcy5rZXlXb3JkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpc0hpZGRlbiAmJiBpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkcmVuPy5mb3JFYWNoKChjaGlsZDogVGhlUGx1Z2luTWVudUl0ZW1XcmFwIHwgJ2RpdmlkZXInKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT09ICdkaXZpZGVyJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5pc01lbnVJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpc2FibGVkID0gY2hpbGQuaXNEaXNhYmxlZCAmJiBjaGlsZC5pc0Rpc2FibGVkKHRoaXMuZWRpdG9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNIaWRkZW5DaGlkID0gaXRlbS5pc0hpZGRlbiAmJiBpdGVtLmlzSGlkZGVuKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmtleVdvcmRzICYmICFpc0hpZGRlbkNoaWQgJiYgY2hpbGQua2V5d29yZHMgJiYgY2hpbGQua2V5d29yZHM/LmluY2x1ZGVzKHRoaXMua2V5V29yZHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmtleVdvcmRzICYmICFpc0hpZGRlbikge1xuICAgICAgICAgICAgICAgIGl0ZW0/LnR5cGUgPT09IFRoZVBsdWdpbk1lbnVJdGVtVHlwZS5pY29uID8gdGhpcy5pY29uTWVudS5wdXNoKGl0ZW0pIDogdGhpcy5ncm91cE1lbnUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMua2V5V29yZHMgJiYgdGhpcy5ncm91cE1lbnUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUudW5zaGlmdCh0aGlzLnNlYXJjaEdyb3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5rZXlXb3Jkcykge1xuICAgICAgICAgICAgY29uc3QgbWVudXMgPSBbLi4udGhpcy5ncm91cE1lbnVdO1xuICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUgPSBtZW51cy5maWx0ZXIoKGl0ZW06IFRoZVBsdWdpbk1lbnVJdGVtV3JhcCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzR3JvdXBNZW51ID0gVGhlUGx1Z2luTWVudS5pc01lbnVHcm91cChpdGVtKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0TWVudSA9IG1lbnVzW2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgY29uc3QgaXNMYXN0TWVudSA9IGluZGV4ID09PSBtZW51cy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAobmV4dE1lbnUgJiYgaXNHcm91cE1lbnUgJiYgVGhlUGx1Z2luTWVudS5pc01lbnVHcm91cChuZXh0TWVudSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChpc0xhc3RNZW51ICYmIGlzR3JvdXBNZW51KSB8fFxuICAgICAgICAgICAgICAgICAgICAoaXRlbT8uY2hpbGRyZW4gJiYgaXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGhhbmRsZUl0ZW1TZWxlY3Rpb24obWVudUl0ZW06IFRoZVBsdWdpbk1lbnVJdGVtKSB7XG4gICAgICAgIGlmIChtZW51SXRlbS5pc0Rpc2FibGVkICYmIG1lbnVJdGVtLmlzRGlzYWJsZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVkaXRvci5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJlZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50aGVEaXNwbGF5U2VhcmNoKSB7XG4gICAgICAgICAgICBtZW51SXRlbT8ucmVtb3ZlS2V5d29yZHNUeXBlID09PSAnY2hhcmFjdGVyJyA/IHRoaXMucmVtb3ZlQ2hhcmFjdGVyKCkgOiB0aGlzLnJlbW92ZUJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVudUl0ZW0uZXhlY3V0ZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMudGh5UG9wb3ZlclJlZi5jbG9zZSgpO1xuICAgICAgICBRdWlja0luc2VydEVkaXRvci51cGRhdGVQbHVnaW5NZW51UmVmKHRoaXMuZWRpdG9yLCBudWxsKTtcbiAgICB9XG5cbiAgICByZW1vdmVCbG9jayA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IE5vZGUuZ2V0KHRoaXMuZWRpdG9yLCB0aGlzLmVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLnBhdGgpIGFzIFRleHQ7XG4gICAgICAgIGNvbnN0IG5vZGVTdHJpbmcgPSBOb2RlLnN0cmluZyhub2RlKTtcbiAgICAgICAgY29uc3QgaXNTdGFydFdpdGhIb3RrZXkgPSBub2RlU3RyaW5nLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICAgICAgY29uc3QgaXNJbmNsdWRlS2V5d29yZHMgPSBub2RlU3RyaW5nLnRvTG9jYWxlTG93ZXJDYXNlKCkudHJpbSgpLmluY2x1ZGVzKHRoaXMua2V5V29yZHMpO1xuICAgICAgICBpZiAobm9kZSAmJiBub2RlU3RyaW5nLmxlbmd0aCA+IDAgJiYgKGlzU3RhcnRXaXRoSG90a2V5IHx8IGlzSW5jbHVkZUtleXdvcmRzKSkge1xuICAgICAgICAgICAgRWRpdG9yLmRlbGV0ZUJhY2t3YXJkKHRoaXMuZWRpdG9yLCB7IHVuaXQ6ICdibG9jaycgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVtb3ZlQ2hhcmFjdGVyID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBub2RlID0gTm9kZS5nZXQodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yLnNlbGVjdGlvbi5hbmNob3IucGF0aCkgYXMgVGV4dDtcbiAgICAgICAgY29uc3Qgbm9kZVN0cmluZyA9IE5vZGUuc3RyaW5nKG5vZGUpO1xuICAgICAgICBjb25zdCBpc1N0YXJ0V2l0aEhvdGtleSA9IG5vZGVTdHJpbmcuc3RhcnRzV2l0aCgnLycpIHx8IG5vZGVTdHJpbmcuc3RhcnRzV2l0aCgnIycpO1xuICAgICAgICBjb25zdCBpc0luY2x1ZGVLZXl3b3JkcyA9IG5vZGVTdHJpbmcudG9Mb2NhbGVMb3dlckNhc2UoKS50cmltKCkuaW5jbHVkZXModGhpcy5rZXlXb3Jkcyk7XG4gICAgICAgIGlmICh0aGlzLm9yaWdpbktleXdvcmRzPy5sZW5ndGggPiAwICYmIChpc1N0YXJ0V2l0aEhvdGtleSB8fCBpc0luY2x1ZGVLZXl3b3JkcykpIHtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuZGVsZXRlKHRoaXMuZWRpdG9yLCB7IGRpc3RhbmNlOiB0aGlzLm9yaWdpbktleXdvcmRzLmxlbmd0aCwgcmV2ZXJzZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB1cGRhdGVLZXl3b3JkcyhrZXl3b3Jkczogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9BY3RpdmVGaXJzdEl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubGlzdEJveEF1dG9BY3RpdmVGaXJzdEl0ZW0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3JpZ2luS2V5d29yZHMgPSBrZXl3b3JkcztcbiAgICAgICAgdGhpcy5rZXlXb3JkcyA9IGtleXdvcmRzLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICB0aGlzLmJ1aWxkTWVudXMoKTtcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5zY3JvbGxUb3AgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhlTGlzdGJveENoYW5nZShldmVudDogVGhlTGlzdGJveENoYW5nZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVJdGVtU2VsZWN0aW9uKGV2ZW50Lm9wdGlvbi50aGVPcHRpb25WYWx1ZSBhcyBUaGVQbHVnaW5NZW51SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjaGlsZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5maW5kRHJvcGRvd25UcmlnZ2VyKGV2ZW50Lm9wdGlvbi5wYXJlbnRPcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5zaG93KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3BhcmVudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5maW5kRHJvcGRvd25UcmlnZ2VyKGV2ZW50Lm9wdGlvbik7XG4gICAgICAgICAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0dXJuJyAmJiAhZXZlbnQub3B0aW9uLnBhcmVudE9wdGlvbikge1xuICAgICAgICAgICAgU2Nyb2xsVG9TZXJ2aWNlLnNjcm9sbFRvRWxlbWVudChldmVudC5vcHRpb24uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnNjcm9sbENvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5kRHJvcGRvd25UcmlnZ2VyKG9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSkge1xuICAgICAgICBjb25zdCBkcm9wZG93biA9IHRoaXMuZHJvcGRvd25UcmlnZ2Vycy5maW5kKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVsnZWxlbWVudFJlZiddLm5hdGl2ZUVsZW1lbnQgPT09IG9wdGlvbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZHJvcGRvd247XG4gICAgfVxuXG4gICAgdHJhY2tCeUZuKGluZGV4OiBUaGVQbHVnaW5NZW51SXRlbSwgaXRlbTogYW55KSB7XG4gICAgICAgIHJldHVybiBpdGVtPy5rZXkgPz8gaW5kZXg7XG4gICAgfVxufVxuIiwiPGRpdiAqbmdJZj1cInRoZURpc3BsYXlTZWFyY2hcIiBjbGFzcz1cIm1lbnUtc2VhcmNoIHB4LTUgcHQtNSBwYi0yXCI+XG4gIDx0aHktaW5wdXQtc2VhcmNoIFsobmdNb2RlbCldPVwia2V5V29yZHNcIiBwbGFjZWhvbGRlcj1cIuaQnOe0olwiIHRoeUljb25Qb3NpdGlvbj1cImFmdGVyXCIgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlS2V5d29yZHMoa2V5V29yZHMpXCI+XG4gIDwvdGh5LWlucHV0LXNlYXJjaD5cbjwvZGl2PlxuXG48ZGl2XG4gICpuZ0lmPVwiZ3JvdXBNZW51Lmxlbmd0aCA+IDA7IGVsc2UgZW1wdHlcIlxuICB0aGVMaXN0Qm94XG4gIFtrZXlib2FyZENvbnRhaW5lcl09XCJrZXlib2FyZENvbnRhaW5lclwiXG4gIFthdXRvQWN0aXZlRmlyc3RJdGVtXT1cImxpc3RCb3hBdXRvQWN0aXZlRmlyc3RJdGVtXCJcbiAgKHRoZUxpc3Rib3hDaGFuZ2UpPVwidGhlTGlzdGJveENoYW5nZSgkZXZlbnQpXCJcbiAgY2xhc3M9XCJ0aHktZHJvcGRvd24tbWVudSB0aGUtcGx1Z2luLW1lbnUtc2Nyb2xsLWNvbnRhaW5lciBwYi0yIHB0LTBcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaWNvbk1lbnU/Lmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IHRoZUxpc3Rib3hHcm91cCBbaG9yaXpvbnRhbENvbHVtbl09XCI2XCIgY2xhc3M9XCJpY29uLW1lbnUgZC1mbGV4IHBsLTUgcHktMVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpY29uTWVudTsgdHJhY2tCeTogdHJhY2tCeUZuXCI+XG4gICAgICAgIDxhXG4gICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09IFRoZVBsdWdpbk1lbnVJdGVtVHlwZS5pY29uXCJcbiAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDo7XCJcbiAgICAgICAgICBjbGFzcz1cIm10LTJcIlxuICAgICAgICAgIHRoeUFjdGlvblxuICAgICAgICAgIHRoZUxpc3Rib3hPcHRpb25cbiAgICAgICAgICBbdGhlT3B0aW9uVmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgW3RoeUFjdGlvbkljb25dPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICBbdGh5VG9vbHRpcF09XCJpdGVtPy5uYW1lXCJcbiAgICAgICAgICBbdGh5RGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgW3RoZU9wdGlvbkRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgIHRoZVByZXZlbnREZWZhdWx0XG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUl0ZW1TZWxlY3Rpb24oaXRlbSlcIlxuICAgICAgICA+PC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPHRoeS1kaXZpZGVyIGNsYXNzPVwibXktMlwiPjwvdGh5LWRpdmlkZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgdGhlTGlzdGJveEdyb3VwPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXBNZW51OyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmlzTWVudUl0ZW0gJiYgIShpdGVtLmNoaWxkcmVuPy5sZW5ndGggPiAwKSAmJiBpdGVtLmtleSAhPT0gJ3RhYmxlJ1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgdGh5RHJvcGRvd25NZW51SXRlbVxuICAgICAgICAgIHRoZUxpc3Rib3hPcHRpb25cbiAgICAgICAgICBbdGhlT3B0aW9uVmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgY2xhc3M9XCJweS0wXCJcbiAgICAgICAgICB0aGVQcmV2ZW50RGVmYXVsdFxuICAgICAgICAgIFt0aHlEaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICBbdGhlT3B0aW9uRGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUl0ZW1TZWxlY3Rpb24oaXRlbSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0ubWVudUljb25cIiBjbGFzcz1cIm1lbnUtaWNvbiBtci0yXCI+XG4gICAgICAgICAgICA8dGh5LWljb24gW3RoeUljb25OYW1lXT1cIml0ZW0ubWVudUljb24gfCBnZXRNZW51SWNvbjogc2NlbmVLZXlcIj48L3RoeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWNvbnRlbnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbS10aXRsZSB3LTEwMFwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5pc01lbnVJdGVtICYmIGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCA+IDBcIiAjaGFzRXhwYW5kZWQ+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAjZHJvcGRvd25UcmlnZ2Vyc1xuICAgICAgICAgIFt0aHlEcm9wZG93bl09XCJleHBhbmRcIlxuICAgICAgICAgIHRoeVRyaWdnZXI9XCJob3ZlclwiXG4gICAgICAgICAgdGh5RHJvcGRvd25NZW51SXRlbVxuICAgICAgICAgIFt0aHlEaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICB0aGVMaXN0Ym94T3B0aW9uXG4gICAgICAgICAgW3RoZU9wdGlvblZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgIFt0aGVPcHRpb25EaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICBbdGh5UG9wb3Zlck9wdGlvbnNdPVwiZXhwYW5kUG9wb3Zlck9wdGlvbnNcIlxuICAgICAgICAgIGNsYXNzPVwicHktMFwiXG4gICAgICAgICAgdGhlUHJldmVudERlZmF1bHRcbiAgICAgICAgICBbdGh5UGFuZWxDbGFzc109XCJzdWJQYW5lbENsYXNzXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlSXRlbVNlbGVjdGlvbihpdGVtKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5tZW51SWNvblwiIGNsYXNzPVwibWVudS1pY29uIG1yLTJcIj5cbiAgICAgICAgICAgIDx0aHktaWNvbiBbdGh5SWNvbk5hbWVdPVwiaXRlbS5tZW51SWNvbiB8IGdldE1lbnVJY29uOiBzY2VuZUtleVwiPjwvdGh5LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtY29udGVudCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtLXRpdGxlIHctMTAwXCI+XG4gICAgICAgICAgICAgIHt7IGl0ZW0ubmFtZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uY2hpbGRyZW4/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDx0aHktaWNvbiBjbGFzcz1cInRleHQtbXV0ZWRcIiB0aHlJY29uTmFtZT1cImFuZ2xlLXJpZ2h0XCI+PC90aHktaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8dGh5LWRyb3Bkb3duLW1lbnUgI2V4cGFuZD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtcGx1Z2luLW1lbnUtY29udGFpbmVyIGV4cGFuZC1tZW51XCIgdGhlTGlzdGJveEdyb3VwPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBpdGVtLmNoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGlsZC50eXBlID09PSBUaGVQbHVnaW5NZW51SXRlbVR5cGUuZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgdGh5RHJvcGRvd25NZW51SXRlbVxuICAgICAgICAgICAgICAgICAgdGhlTGlzdGJveE9wdGlvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweS0wXCJcbiAgICAgICAgICAgICAgICAgIHRoZVByZXZlbnREZWZhdWx0XG4gICAgICAgICAgICAgICAgICBbdGhlT3B0aW9uRGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICBbdGh5RGlzYWJsZWRdPVwiY2hpbGQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUl0ZW1TZWxlY3Rpb24oY2hpbGQpXCJcbiAgICAgICAgICAgICAgICAgIFt0aGVPcHRpb25WYWx1ZV09XCJjaGlsZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoaWxkLm1lbnVJY29uXCIgY2xhc3M9XCJtZW51LWljb24gbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8dGh5LWljb24gW3RoeUljb25OYW1lXT1cImNoaWxkLm1lbnVJY29uIHwgZ2V0TWVudUljb246IHNjZW5lS2V5XCI+PC90aHktaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtY29udGVudCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW0tdGl0bGUgdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjaGlsZC5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHRoeS1kaXZpZGVyICpuZ0lmPVwiY2hpbGQgPT09ICdkaXZpZGVyJ1wiIGNsYXNzPVwibXktMlwiPjwvdGh5LWRpdmlkZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90aHktZHJvcGRvd24tbWVudT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uaXNNZW51SXRlbSAmJiBpdGVtLmtleSA9PT0gJ3RhYmxlJ1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgI2Ryb3Bkb3duVHJpZ2dlcnNcbiAgICAgICAgICBbdGh5UG9wb3Zlcl09XCJ0YWJsZVNlbGVjdFwiXG4gICAgICAgICAgdGh5UGxhY2VtZW50PVwicmlnaHRUb3BcIlxuICAgICAgICAgIHRoeVRyaWdnZXI9XCJob3ZlclwiXG4gICAgICAgICAgdGh5RHJvcGRvd25NZW51SXRlbVxuICAgICAgICAgIHRoZUxpc3Rib3hPcHRpb25cbiAgICAgICAgICBbdGh5Q29uZmlnXT1cInRhYmxlU2VsZWN0UG9wb3ZlckNvbmZpZ1wiXG4gICAgICAgICAgW3RoZU9wdGlvblZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgIFt0aGVPcHRpb25EaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICBbdGh5RGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgY2xhc3M9XCJweS0wXCJcbiAgICAgICAgICB0aGVQcmV2ZW50RGVmYXVsdFxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVJdGVtU2VsZWN0aW9uKGl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWljb24gbXItMlwiPlxuICAgICAgICAgICAgPHRoeS1pY29uIFt0aHlJY29uTmFtZV09XCJpdGVtLm1lbnVJY29uIHwgZ2V0TWVudUljb246IHNjZW5lS2V5XCI+PC90aHktaWNvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1jb250ZW50IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW0tdGl0bGUgdy0xMDBcIj5cbiAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHRoeS1pY29uIGNsYXNzPVwidGV4dC1tdXRlZFwiIHRoeUljb25OYW1lPVwiYW5nbGUtcmlnaHRcIj48L3RoeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICN0YWJsZVNlbGVjdD5cbiAgICAgICAgICAgIDx0YWJsZS1zZWxlY3QgY2xhc3M9XCJwbHVnaW4tbWVudS10YWJsZSB0aGUtdGFibGUtc2VsZWN0b3ItcGFuZWxcIiBbZWRpdG9yXT1cImVkaXRvclwiIFtiZWZvcmVJbnNlcnRdPVwicmVtb3ZlQmxvY2tcIj48L3RhYmxlLXNlbGVjdD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWl0ZW0uaXNNZW51SXRlbVwiICNtZW51R3JvdXA+XG4gICAgICAgIDx0aHktZHJvcGRvd24tbWVudS1ncm91cCBjbGFzcz1cImZvbnQtc2l6ZS1zbVwiIFt0aHlUaXRsZV09XCJpdGVtLmdyb3VwTmFtZVwiPjwvdGh5LWRyb3Bkb3duLW1lbnUtZ3JvdXA+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgPGRpdiBjbGFzcz1cImVtcHR5IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgIDx0aHktZW1wdHkgW3RoeU1lc3NhZ2VdPVwidGh5TWVzc2FnZVwiPjwvdGh5LWVtcHR5PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvcGx1Z2luLW1lbnUvcGx1Z2luLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL2NvbXBvbmVudHMvcGx1Z2luLW1lbnUvcGx1Z2luLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxNQUFNLEVBRU4sWUFBWSxFQUNaLE1BQU0sRUFDTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0IsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pJLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFB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QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVnQixrQkFBa0I7c0JBQXZDLFdBQVc7dUJBQUMsT0FBTztnQkFHcEIsZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0ZvciwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkluaXQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIGluamVjdCxcbiAgICB2aWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRoeUFjdGlvbiB9IGZyb20gJ25neC10ZXRoeXMvYWN0aW9uJztcbmltcG9ydCB7IFNjcm9sbFRvU2VydmljZSB9IGZyb20gJ25neC10ZXRoeXMvY29yZSc7XG5pbXBvcnQgeyBUaHlEaXZpZGVyIH0gZnJvbSAnbmd4LXRldGh5cy9kaXZpZGVyJztcbmltcG9ydCB7IFRoeURyb3Bkb3duRGlyZWN0aXZlLCBUaHlEcm9wZG93bk1lbnVDb21wb25lbnQsIFRoeURyb3Bkb3duTWVudUdyb3VwLCBUaHlEcm9wZG93bk1lbnVJdGVtRGlyZWN0aXZlIH0gZnJvbSAnbmd4LXRldGh5cy9kcm9wZG93bic7XG5pbXBvcnQgeyBUaHlFbXB0eU1vZHVsZSB9IGZyb20gJ25neC10ZXRoeXMvZW1wdHknO1xuaW1wb3J0IHsgVGh5SWNvbiB9IGZyb20gJ25neC10ZXRoeXMvaWNvbic7XG5pbXBvcnQgeyBUaHlJbnB1dFNlYXJjaCB9IGZyb20gJ25neC10ZXRoeXMvaW5wdXQnO1xuaW1wb3J0IHsgVGh5UG9wb3ZlckRpcmVjdGl2ZSwgVGh5UG9wb3ZlclJlZiB9IGZyb20gJ25neC10ZXRoeXMvcG9wb3Zlcic7XG5pbXBvcnQgeyBUaHlUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnbmd4LXRldGh5cy90b29sdGlwJztcbmltcG9ydCB7IEVkaXRvciwgTm9kZSwgUGF0aFJlZiwgVGV4dCwgVHJhbnNmb3JtcyB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3IgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IERlZmF1bHRQbHVnaW5NZW51LCBRVUlDS19JTlNFUlRfSE9US0VZLCBUaGVQbHVnaW5NZW51SXRlbVR5cGUgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYnVpbGRQbHVnaW5NZW51LCBidWlsZFBsdWdpbk1lbnVJdGVtTWFwIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBUaGVQbHVnaW5NZW51LCBUaGVQbHVnaW5NZW51R3JvdXAsIFRoZVBsdWdpbk1lbnVJdGVtLCBUaGVQbHVnaW5NZW51SXRlbUNvbmZpZywgVGhlUGx1Z2luTWVudUl0ZW1XcmFwIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBQbHVnaW5NZW51UGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzJztcbmltcG9ydCB7IFF1aWNrSW5zZXJ0RWRpdG9yIH0gZnJvbSAnLi4vLi4vcGx1Z2lucy9wdWJsaWMtYXBpJztcbmltcG9ydCB7IHJlZm9jdXMgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBUaGVQcmV2ZW50RGVmYXVsdERpcmVjdGl2ZSB9IGZyb20gJy4uL2FjdGlvbi9wcmV2ZW50LWRlZmF1bHQnO1xuaW1wb3J0IHsgVGhlTGlzdGJveENoYW5nZUV2ZW50LCBUaGVMaXN0Ym94RGlyZWN0aXZlLCBUaGVMaXN0Ym94R3JvdXBEaXJlY3RpdmUsIFRoZUxpc3Rib3hPcHRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi9saXN0Ym94L2xpc3Rib3gnO1xuaW1wb3J0IHsgVGhlVGFibGVTZWxlY3QgfSBmcm9tICcuLi90YWJsZS1zZWxlY3QvdGFibGUtc2VsZWN0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndGhlLXBsdWdpbi1tZW51JyxcbiAgICB0ZW1wbGF0ZVVybDogJ3BsdWdpbi1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgTmdGb3IsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBUaHlFbXB0eU1vZHVsZSxcbiAgICAgICAgVGhlVGFibGVTZWxlY3QsXG4gICAgICAgIFRoeUljb24sXG4gICAgICAgIFRoeUFjdGlvbixcbiAgICAgICAgVGh5RGl2aWRlcixcbiAgICAgICAgVGh5SW5wdXRTZWFyY2gsXG4gICAgICAgIFRoeURyb3Bkb3duTWVudUNvbXBvbmVudCxcbiAgICAgICAgVGh5RHJvcGRvd25NZW51R3JvdXAsXG4gICAgICAgIFBsdWdpbk1lbnVQaXBlLFxuICAgICAgICBUaHlUb29sdGlwRGlyZWN0aXZlLFxuICAgICAgICBUaHlQb3BvdmVyRGlyZWN0aXZlLFxuICAgICAgICBUaGVMaXN0Ym94RGlyZWN0aXZlLFxuICAgICAgICBUaHlEcm9wZG93bkRpcmVjdGl2ZSxcbiAgICAgICAgVGhlTGlzdGJveEdyb3VwRGlyZWN0aXZlLFxuICAgICAgICBUaGVMaXN0Ym94T3B0aW9uRGlyZWN0aXZlLFxuICAgICAgICBUaGVQcmV2ZW50RGVmYXVsdERpcmVjdGl2ZSxcbiAgICAgICAgVGh5RHJvcGRvd25NZW51SXRlbURpcmVjdGl2ZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgVGhlUGx1Z2luTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgZWRpdG9yOiBFZGl0b3I7XG5cbiAgICBASW5wdXQoKSB0aGVEaXNwbGF5U2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSB0aGVQbHVnaW5NZW51OiBUaGVQbHVnaW5NZW51SXRlbUNvbmZpZ1tdO1xuXG4gICAgQElucHV0KCkgc2NlbmVLZXk/OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKSBzdWJQYW5lbENsYXNzOiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAgIEBJbnB1dCgpIGF1dG9BY3RpdmVGaXJzdEl0ZW06IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGNvbnRhaW5lckNsYXNzTmFtZSA9IGB0aGUtcGx1Z2luLW1lbnUtY29udGFpbmVyYDtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ2Ryb3Bkb3duVHJpZ2dlcnMnLCB7IHJlYWQ6IFRoeURyb3Bkb3duRGlyZWN0aXZlIH0pXG4gICAgZHJvcGRvd25UcmlnZ2VyczogVGh5RHJvcGRvd25EaXJlY3RpdmVbXTtcblxuICAgIGxpc3RCb3ggPSB2aWV3Q2hpbGQoVGhlTGlzdGJveERpcmVjdGl2ZSk7XG5cbiAgICBsaXN0Qm94QXV0b0FjdGl2ZUZpcnN0SXRlbSA9IHRydWU7XG5cbiAgICBwYXRoUmVmOiBQYXRoUmVmO1xuXG4gICAga2V5Ym9hcmRDb250YWluZXI6IEhUTUxFbGVtZW50O1xuXG4gICAgX3BsdWdpbk1lbnU6IFRoZVBsdWdpbk1lbnU7XG5cbiAgICBncm91cE1lbnU6IFRoZVBsdWdpbk1lbnUgPSBbXTtcblxuICAgIGljb25NZW51OiBUaGVQbHVnaW5NZW51ID0gW107XG5cbiAgICBUaGVQbHVnaW5NZW51SXRlbVR5cGUgPSBUaGVQbHVnaW5NZW51SXRlbVR5cGU7XG5cbiAgICBrZXlXb3Jkczogc3RyaW5nO1xuXG4gICAgdGh5TWVzc2FnZSA9ICfmmoLml6DmlbDmja4nO1xuXG4gICAgc2Nyb2xsQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICAgIHNlYXJjaEdyb3VwOiBUaGVQbHVnaW5NZW51R3JvdXAgPSB7XG4gICAgICAgIGdyb3VwTmFtZTogJ+aQnOe0oue7k+aenCdcbiAgICB9O1xuXG4gICAgZXhwYW5kUG9wb3Zlck9wdGlvbnMgPSB7XG4gICAgICAgIHBsYWNlbWVudDogJ3JpZ2h0VG9wJyxcbiAgICAgICAgd2lkdGg6ICcyNjJweCcsXG4gICAgICAgIG1pbldpZHRoOiAnMjYycHgnXG4gICAgfTtcblxuICAgIHRhYmxlU2VsZWN0UG9wb3ZlckNvbmZpZyA9IHtcbiAgICAgICAgcGFuZWxDbGFzczogJ3BsdWdpbi1tZW51LXRhYmxlLXNlbGVjdC1jb250YWluZXInLFxuICAgICAgICBtaW5XaWR0aDogMCxcbiAgICAgICAgLy8gIOmBv+WFjemHjeWGmVxuICAgICAgICBvcmlnaW5BY3RpdmVDbGFzczogJ3RoeS1wb3BvdmVyLW9yaWdpbi1hY3RpdmUnXG4gICAgfTtcblxuICAgIG9yaWdpbktleXdvcmRzOiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XG5cbiAgICBwcml2YXRlIG5nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gICAgcHVibGljIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgICBwcml2YXRlIHRoeVBvcG92ZXJSZWYgPSBpbmplY3QoVGh5UG9wb3ZlclJlZjxUaGVQbHVnaW5NZW51Q29tcG9uZW50Pik7XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9BY3RpdmVGaXJzdEl0ZW0gfHwgdGhpcy50aGVEaXNwbGF5U2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RCb3hBdXRvQWN0aXZlRmlyc3RJdGVtID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbml0aWFsaXplU2VhcmNoKCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVBsdWdpbk1lbnUoKTtcbiAgICAgICAgdGhpcy5idWlsZE1lbnVzKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGhlLXBsdWdpbi1tZW51LXNjcm9sbC1jb250YWluZXInKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6ZVNlYXJjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGhlRGlzcGxheVNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5rZXlib2FyZENvbnRhaW5lciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8g6K6w5L2P5L2N572uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGhSZWYgPSBFZGl0b3IucGF0aFJlZih0aGlzLmVkaXRvciwgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLmFuY2hvci5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkQ29udGFpbmVyID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemVQbHVnaW5NZW51KCkge1xuICAgICAgICBjb25zdCBjdXJyZW50TWVudSA9IHRoaXMudGhlUGx1Z2luTWVudSB8fCBEZWZhdWx0UGx1Z2luTWVudTtcbiAgICAgICAgY29uc3QgbWVudUl0ZW1zTWFwID0gYnVpbGRQbHVnaW5NZW51SXRlbU1hcCh0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMuX3BsdWdpbk1lbnUgPSBidWlsZFBsdWdpbk1lbnUobWVudUl0ZW1zTWFwLCBjdXJyZW50TWVudSk7XG4gICAgfVxuXG4gICAgYnVpbGRNZW51cygpIHtcbiAgICAgICAgdGhpcy5pY29uTWVudSA9IFtdO1xuICAgICAgICB0aGlzLmdyb3VwTWVudSA9IFtdO1xuXG4gICAgICAgIHRoaXMuX3BsdWdpbk1lbnUuZm9yRWFjaCgoaXRlbTogVGhlUGx1Z2luTWVudUl0ZW1XcmFwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IGl0ZW0/LmlzSGlkZGVuICYmIGl0ZW0uaXNIaWRkZW4odGhpcy5lZGl0b3IpO1xuXG4gICAgICAgICAgICBpZiAoVGhlUGx1Z2luTWVudS5pc01lbnVJdGVtKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5pc01lbnVJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpdGVtLmRpc2FibGVkID0gaXRlbS5pc0Rpc2FibGVkICYmIGl0ZW0uaXNEaXNhYmxlZCh0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMua2V5V29yZHMgJiYgIWlzSGlkZGVuICYmIGl0ZW0ua2V5d29yZHMgJiYgaXRlbS5rZXl3b3Jkcz8uaW5jbHVkZXModGhpcy5rZXlXb3JkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpc0hpZGRlbiAmJiBpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkcmVuPy5mb3JFYWNoKChjaGlsZDogVGhlUGx1Z2luTWVudUl0ZW1XcmFwIHwgJ2RpdmlkZXInKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT09ICdkaXZpZGVyJykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5pc01lbnVJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpc2FibGVkID0gY2hpbGQuaXNEaXNhYmxlZCAmJiBjaGlsZC5pc0Rpc2FibGVkKHRoaXMuZWRpdG9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNIaWRkZW5DaGlkID0gaXRlbS5pc0hpZGRlbiAmJiBpdGVtLmlzSGlkZGVuKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmtleVdvcmRzICYmICFpc0hpZGRlbkNoaWQgJiYgY2hpbGQua2V5d29yZHMgJiYgY2hpbGQua2V5d29yZHM/LmluY2x1ZGVzKHRoaXMua2V5V29yZHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmtleVdvcmRzICYmICFpc0hpZGRlbikge1xuICAgICAgICAgICAgICAgIGl0ZW0/LnR5cGUgPT09IFRoZVBsdWdpbk1lbnVJdGVtVHlwZS5pY29uID8gdGhpcy5pY29uTWVudS5wdXNoKGl0ZW0pIDogdGhpcy5ncm91cE1lbnUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMua2V5V29yZHMgJiYgdGhpcy5ncm91cE1lbnUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUudW5zaGlmdCh0aGlzLnNlYXJjaEdyb3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5rZXlXb3Jkcykge1xuICAgICAgICAgICAgY29uc3QgbWVudXMgPSBbLi4udGhpcy5ncm91cE1lbnVdO1xuICAgICAgICAgICAgdGhpcy5ncm91cE1lbnUgPSBtZW51cy5maWx0ZXIoKGl0ZW06IFRoZVBsdWdpbk1lbnVJdGVtV3JhcCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzR3JvdXBNZW51ID0gVGhlUGx1Z2luTWVudS5pc01lbnVHcm91cChpdGVtKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0TWVudSA9IG1lbnVzW2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgY29uc3QgaXNMYXN0TWVudSA9IGluZGV4ID09PSBtZW51cy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAobmV4dE1lbnUgJiYgaXNHcm91cE1lbnUgJiYgVGhlUGx1Z2luTWVudS5pc01lbnVHcm91cChuZXh0TWVudSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChpc0xhc3RNZW51ICYmIGlzR3JvdXBNZW51KSB8fFxuICAgICAgICAgICAgICAgICAgICAoaXRlbT8uY2hpbGRyZW4gJiYgaXRlbT8uY2hpbGRyZW4/Lmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGxpc3RCb3hPcHRpb25Nb3VzZWVudGVyKGU6IE1vdXNlRXZlbnQsIG1lbnU6IFRoZVBsdWdpbk1lbnVJdGVtKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgbGlzdEJveCA9IHRoaXMubGlzdEJveCgpO1xuICAgICAgICBpZiAobGlzdEJveCkge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlT3B0aW9uID0gbGlzdEJveC5hY3RpdmVPcHRpb247XG4gICAgICAgICAgICBjb25zdCBuZXdBY3RpdmVPcHRpb24gPSBsaXN0Qm94LmdldE9wdGlvbihtZW51Py5rZXkpO1xuICAgICAgICAgICAgbGlzdEJveC5zZXRBY3RpdmVJdGVtKGFjdGl2ZU9wdGlvbiwgbmV3QWN0aXZlT3B0aW9uLCAndHVybicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGlzdEJveE9wdGlvbk1vdXNlbGVhdmUoZTogTW91c2VFdmVudCwgbWVudTogVGhlUGx1Z2luTWVudUl0ZW0pIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBsaXN0Qm94ID0gdGhpcy5saXN0Qm94KCk7XG4gICAgICAgIGxpc3RCb3g/LmNsZWFyQWN0aXZlSXRlbSgpO1xuICAgIH1cblxuICAgIGhhbmRsZUl0ZW1TZWxlY3Rpb24obWVudUl0ZW06IFRoZVBsdWdpbk1lbnVJdGVtKSB7XG4gICAgICAgIGlmIChtZW51SXRlbS5pc0Rpc2FibGVkICYmIG1lbnVJdGVtLmlzRGlzYWJsZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmVkaXRvci5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJlZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50aGVEaXNwbGF5U2VhcmNoKSB7XG4gICAgICAgICAgICBtZW51SXRlbT8ucmVtb3ZlS2V5d29yZHNUeXBlID09PSAnY2hhcmFjdGVyJyA/IHRoaXMucmVtb3ZlQ2hhcmFjdGVyKCkgOiB0aGlzLnJlbW92ZUJsb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWVudUl0ZW0uZXhlY3V0ZSh0aGlzLmVkaXRvcik7XG4gICAgICAgIHRoaXMudGh5UG9wb3ZlclJlZi5jbG9zZSgpO1xuICAgICAgICBRdWlja0luc2VydEVkaXRvci51cGRhdGVQbHVnaW5NZW51UmVmKHRoaXMuZWRpdG9yLCBudWxsKTtcbiAgICB9XG5cbiAgICByZW1vdmVCbG9jayA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IE5vZGUuZ2V0KHRoaXMuZWRpdG9yLCB0aGlzLmVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLnBhdGgpIGFzIFRleHQ7XG4gICAgICAgIGNvbnN0IG5vZGVTdHJpbmcgPSBOb2RlLnN0cmluZyhub2RlKTtcbiAgICAgICAgY29uc3QgaXNTdGFydFdpdGhIb3RrZXkgPSBub2RlU3RyaW5nLnN0YXJ0c1dpdGgoUVVJQ0tfSU5TRVJUX0hPVEtFWSk7XG4gICAgICAgIGNvbnN0IGlzSW5jbHVkZUtleXdvcmRzID0gbm9kZVN0cmluZy50b0xvY2FsZUxvd2VyQ2FzZSgpLnRyaW0oKS5pbmNsdWRlcyh0aGlzLmtleVdvcmRzKTtcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZVN0cmluZy5sZW5ndGggPiAwICYmIChpc1N0YXJ0V2l0aEhvdGtleSB8fCBpc0luY2x1ZGVLZXl3b3JkcykpIHtcbiAgICAgICAgICAgIEVkaXRvci5kZWxldGVCYWNrd2FyZCh0aGlzLmVkaXRvciwgeyB1bml0OiAnYmxvY2snIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJlbW92ZUNoYXJhY3RlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IE5vZGUuZ2V0KHRoaXMuZWRpdG9yLCB0aGlzLmVkaXRvci5zZWxlY3Rpb24uYW5jaG9yLnBhdGgpIGFzIFRleHQ7XG4gICAgICAgIGNvbnN0IG5vZGVTdHJpbmcgPSBOb2RlLnN0cmluZyhub2RlKTtcbiAgICAgICAgY29uc3QgaXNTdGFydFdpdGhIb3RrZXkgPSBub2RlU3RyaW5nLnN0YXJ0c1dpdGgoUVVJQ0tfSU5TRVJUX0hPVEtFWSkgfHwgbm9kZVN0cmluZy5zdGFydHNXaXRoKCcjJyk7XG4gICAgICAgIGNvbnN0IGlzSW5jbHVkZUtleXdvcmRzID0gbm9kZVN0cmluZy50b0xvY2FsZUxvd2VyQ2FzZSgpLnRyaW0oKS5pbmNsdWRlcyh0aGlzLmtleVdvcmRzKTtcbiAgICAgICAgaWYgKHRoaXMub3JpZ2luS2V5d29yZHM/Lmxlbmd0aCA+IDAgJiYgKGlzU3RhcnRXaXRoSG90a2V5IHx8IGlzSW5jbHVkZUtleXdvcmRzKSkge1xuICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUodGhpcy5lZGl0b3IsIHsgZGlzdGFuY2U6IHRoaXMub3JpZ2luS2V5d29yZHMubGVuZ3RoLCByZXZlcnNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHVwZGF0ZUtleXdvcmRzKGtleXdvcmRzOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0FjdGl2ZUZpcnN0SXRlbSkge1xuICAgICAgICAgICAgdGhpcy5saXN0Qm94QXV0b0FjdGl2ZUZpcnN0SXRlbSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmlnaW5LZXl3b3JkcyA9IGtleXdvcmRzO1xuICAgICAgICB0aGlzLmtleVdvcmRzID0ga2V5d29yZHMudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIHRoaXMuYnVpbGRNZW51cygpO1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0Qm94Q2hhbmdlKGV2ZW50OiBUaGVMaXN0Ym94Q2hhbmdlRXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5vcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUl0ZW1TZWxlY3Rpb24oZXZlbnQub3B0aW9uLnRoZU9wdGlvblZhbHVlIGFzIFRoZVBsdWdpbk1lbnVJdGVtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NoaWxkJzpcbiAgICAgICAgICAgICAgICBjb25zdCBkcm9wZG93bkNvbXBvbmVudCA9IHRoaXMuZmluZERyb3Bkb3duVHJpZ2dlcihldmVudC5vcHRpb24ucGFyZW50T3B0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkNvbXBvbmVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwYXJlbnQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duID0gdGhpcy5maW5kRHJvcGRvd25UcmlnZ2VyKGV2ZW50Lm9wdGlvbik7XG4gICAgICAgICAgICAgICAgZHJvcGRvd24uaGlkZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndHVybic6XG4gICAgICAgICAgICAgICAgU2Nyb2xsVG9TZXJ2aWNlLnNjcm9sbFRvRWxlbWVudChldmVudC5vcHRpb24uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnNjcm9sbENvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmaW5kRHJvcGRvd25UcmlnZ2VyKG9wdGlvbjogVGhlTGlzdGJveE9wdGlvbkRpcmVjdGl2ZSkge1xuICAgICAgICBjb25zdCBkcm9wZG93biA9IHRoaXMuZHJvcGRvd25UcmlnZ2Vycy5maW5kKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVsnZWxlbWVudFJlZiddLm5hdGl2ZUVsZW1lbnQgPT09IG9wdGlvbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZHJvcGRvd247XG4gICAgfVxuXG4gICAgdHJhY2tCeUZuKGluZGV4OiBUaGVQbHVnaW5NZW51SXRlbSwgaXRlbTogYW55KSB7XG4gICAgICAgIHJldHVybiBpdGVtPy5rZXkgPz8gaW5kZXg7XG4gICAgfVxufVxuIiwiQGlmICh0aGVEaXNwbGF5U2VhcmNoKSB7XG4gIDxkaXYgY2xhc3M9XCJtZW51LXNlYXJjaCBweC01IHB0LTUgcGItMlwiPlxuICAgIDx0aHktaW5wdXQtc2VhcmNoIHBsYWNlaG9sZGVyPVwi5pCc57SiXCIgdGh5SWNvblBvc2l0aW9uPVwiYWZ0ZXJcIiBbKG5nTW9kZWwpXT1cImtleVdvcmRzXCIgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlS2V5d29yZHMoa2V5V29yZHMpXCI+XG4gICAgPC90aHktaW5wdXQtc2VhcmNoPlxuICA8L2Rpdj5cbn1cblxuQGlmIChncm91cE1lbnUubGVuZ3RoID4gMCkge1xuICA8ZGl2XG4gICAgY2xhc3M9XCJ0aHktZHJvcGRvd24tbWVudSB0aGUtcGx1Z2luLW1lbnUtc2Nyb2xsLWNvbnRhaW5lciBwYi0yIHB0LTBcIlxuICAgIHRoZUxpc3RCb3hcbiAgICBba2V5Ym9hcmRDb250YWluZXJdPVwia2V5Ym9hcmRDb250YWluZXJcIlxuICAgIFthdXRvQWN0aXZlRmlyc3RJdGVtXT1cImxpc3RCb3hBdXRvQWN0aXZlRmlyc3RJdGVtXCJcbiAgICAodGhlTGlzdGJveENoYW5nZSk9XCJsaXN0Qm94Q2hhbmdlKCRldmVudClcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImljb25NZW51Py5sZW5ndGggPiAwXCI+XG4gICAgICA8ZGl2IHRoZUxpc3Rib3hHcm91cCBbaG9yaXpvbnRhbENvbHVtbl09XCI2XCIgY2xhc3M9XCJpY29uLW1lbnUgZC1mbGV4IHBsLTUgcHktMVwiPlxuICAgICAgICBAZm9yIChpdGVtIG9mIGljb25NZW51OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICBAaWYgKGl0ZW0udHlwZSA9PT0gVGhlUGx1Z2luTWVudUl0ZW1UeXBlLmljb24pIHtcbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OjtcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgICB0aHlBY3Rpb25cbiAgICAgICAgICAgICAgdGhlTGlzdGJveE9wdGlvblxuICAgICAgICAgICAgICB0aGVQcmV2ZW50RGVmYXVsdFxuICAgICAgICAgICAgICBbdGhlT3B0aW9uVmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgIFt0aHlBY3Rpb25JY29uXT1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgIFt0aHlUb29sdGlwXT1cIml0ZW0/Lm5hbWVcIlxuICAgICAgICAgICAgICBbdGh5RGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFt0aGVPcHRpb25EaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwibGlzdEJveE9wdGlvbk1vdXNlZW50ZXIoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImxpc3RCb3hPcHRpb25Nb3VzZWxlYXZlKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlSXRlbVNlbGVjdGlvbihpdGVtKVwiXG4gICAgICAgICAgICA+PC9hPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8dGh5LWRpdmlkZXIgY2xhc3M9XCJteS0yXCI+PC90aHktZGl2aWRlcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgdGhlTGlzdGJveEdyb3VwPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cE1lbnU7IHRyYWNrQnk6IHRyYWNrQnlGblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5pc01lbnVJdGVtICYmICEoaXRlbS5jaGlsZHJlbj8ubGVuZ3RoID4gMCkgJiYgaXRlbS5rZXkgIT09ICd0YWJsZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInB5LTBcIlxuICAgICAgICAgICAgdGh5RHJvcGRvd25NZW51SXRlbVxuICAgICAgICAgICAgdGhlTGlzdGJveE9wdGlvblxuICAgICAgICAgICAgdGhlUHJldmVudERlZmF1bHRcbiAgICAgICAgICAgIFt0aGVPcHRpb25WYWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgIFt0aHlEaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgIFt0aGVPcHRpb25EaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImxpc3RCb3hPcHRpb25Nb3VzZWVudGVyKCRldmVudCwgaXRlbSlcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwibGlzdEJveE9wdGlvbk1vdXNlbGVhdmUoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlSXRlbVNlbGVjdGlvbihpdGVtKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChpdGVtPy5tZW51SWNvbikge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pY29uIG1yLTJcIj5cbiAgICAgICAgICAgICAgICA8dGh5LWljb24gW3RoeUljb25OYW1lXT1cIml0ZW0ubWVudUljb24gfCBnZXRNZW51SWNvbjogc2NlbmVLZXlcIj48L3RoeS1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWNvbnRlbnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtLXRpdGxlIHctMTAwXCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmlzTWVudUl0ZW0gJiYgaXRlbS5jaGlsZHJlbj8ubGVuZ3RoID4gMFwiICNoYXNFeHBhbmRlZD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZHJvcGRvd25UcmlnZ2Vyc1xuICAgICAgICAgICAgY2xhc3M9XCJweS0wXCJcbiAgICAgICAgICAgIHRoeVRyaWdnZXI9XCJob3ZlclwiXG4gICAgICAgICAgICB0aHlEcm9wZG93bk1lbnVJdGVtXG4gICAgICAgICAgICB0aGVMaXN0Ym94T3B0aW9uXG4gICAgICAgICAgICB0aGVQcmV2ZW50RGVmYXVsdFxuICAgICAgICAgICAgW3RoZU9wdGlvblZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgW3RoeURpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3RoZU9wdGlvbkRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3RoeURyb3Bkb3duXT1cImV4cGFuZFwiXG4gICAgICAgICAgICBbdGh5UG9wb3Zlck9wdGlvbnNdPVwiZXhwYW5kUG9wb3Zlck9wdGlvbnNcIlxuICAgICAgICAgICAgW3RoeVBhbmVsQ2xhc3NdPVwic3ViUGFuZWxDbGFzc1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlSXRlbVNlbGVjdGlvbihpdGVtKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChpdGVtPy5tZW51SWNvbikge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pY29uIG1yLTJcIj5cbiAgICAgICAgICAgICAgICA8dGh5LWljb24gW3RoeUljb25OYW1lXT1cIml0ZW0ubWVudUljb24gfCBnZXRNZW51SWNvbjogc2NlbmVLZXlcIj48L3RoeS1pY29uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWNvbnRlbnQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtLXRpdGxlIHctMTAwXCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKGl0ZW0uY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8dGh5LWljb24gY2xhc3M9XCJ0ZXh0LW11dGVkXCIgdGh5SWNvbk5hbWU9XCJhbmdsZS1yaWdodFwiPjwvdGh5LWljb24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHRoeS1kcm9wZG93bi1tZW51ICNleHBhbmQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtcGx1Z2luLW1lbnUtY29udGFpbmVyIGV4cGFuZC1tZW51XCIgdGhlTGlzdGJveEdyb3VwPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIGl0ZW0/LmtleSA/PyAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoY2hpbGQudHlwZSA9PT0gVGhlUGx1Z2luTWVudUl0ZW1UeXBlLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB5LTBcIlxuICAgICAgICAgICAgICAgICAgICAgIHRoeURyb3Bkb3duTWVudUl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICB0aGVMaXN0Ym94T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgdGhlUHJldmVudERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICBbdGhlT3B0aW9uRGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RoeURpc2FibGVkXT1cImNoaWxkLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGhlT3B0aW9uVmFsdWVdPVwiY2hpbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImxpc3RCb3hPcHRpb25Nb3VzZWVudGVyKCRldmVudCwgY2hpbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJsaXN0Qm94T3B0aW9uTW91c2VsZWF2ZSgkZXZlbnQsIGNoaWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUl0ZW1TZWxlY3Rpb24oY2hpbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2hpbGQ/Lm1lbnVJY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pY29uIG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoeS1pY29uIFt0aHlJY29uTmFtZV09XCJjaGlsZC5tZW51SWNvbiB8IGdldE1lbnVJY29uOiBzY2VuZUtleVwiPjwvdGh5LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtY29udGVudCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtLXRpdGxlIHctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoaWxkLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNoaWxkID09PSAnZGl2aWRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRoeS1kaXZpZGVyIGNsYXNzPVwibXktMlwiPjwvdGh5LWRpdmlkZXI+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGh5LWRyb3Bkb3duLW1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLmlzTWVudUl0ZW0gJiYgaXRlbS5rZXkgPT09ICd0YWJsZSdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZHJvcGRvd25UcmlnZ2Vyc1xuICAgICAgICAgICAgY2xhc3M9XCJweS0wXCJcbiAgICAgICAgICAgIHRoeVBsYWNlbWVudD1cInJpZ2h0VG9wXCJcbiAgICAgICAgICAgIHRoeVRyaWdnZXI9XCJob3ZlclwiXG4gICAgICAgICAgICB0aHlEcm9wZG93bk1lbnVJdGVtXG4gICAgICAgICAgICB0aGVMaXN0Ym94T3B0aW9uXG4gICAgICAgICAgICB0aGVQcmV2ZW50RGVmYXVsdFxuICAgICAgICAgICAgW3RoZU9wdGlvblZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgW3RoZU9wdGlvbkRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3RoeURpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3RoeVBvcG92ZXJdPVwidGFibGVTZWxlY3RcIlxuICAgICAgICAgICAgW3RoeUNvbmZpZ109XCJ0YWJsZVNlbGVjdFBvcG92ZXJDb25maWdcIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwibGlzdEJveE9wdGlvbk1vdXNlZW50ZXIoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJsaXN0Qm94T3B0aW9uTW91c2VsZWF2ZSgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVJdGVtU2VsZWN0aW9uKGl0ZW0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVudS1pY29uIG1yLTJcIj5cbiAgICAgICAgICAgICAgPHRoeS1pY29uIFt0aHlJY29uTmFtZV09XCJpdGVtLm1lbnVJY29uIHwgZ2V0TWVudUljb246IHNjZW5lS2V5XCI+PC90aHktaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtY29udGVudCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW0tdGl0bGUgdy0xMDBcIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDx0aHktaWNvbiBjbGFzcz1cInRleHQtbXV0ZWRcIiB0aHlJY29uTmFtZT1cImFuZ2xlLXJpZ2h0XCI+PC90aHktaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RhYmxlU2VsZWN0PlxuICAgICAgICAgICAgICA8dGFibGUtc2VsZWN0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwbHVnaW4tbWVudS10YWJsZSB0aGUtdGFibGUtc2VsZWN0b3ItcGFuZWxcIlxuICAgICAgICAgICAgICAgIFtlZGl0b3JdPVwiZWRpdG9yXCJcbiAgICAgICAgICAgICAgICBbYmVmb3JlSW5zZXJ0XT1cInJlbW92ZUJsb2NrXCJcbiAgICAgICAgICAgICAgPjwvdGFibGUtc2VsZWN0PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgQGlmICghaXRlbS5pc01lbnVJdGVtKSB7XG4gICAgICAgICAgPHRoeS1kcm9wZG93bi1tZW51LWdyb3VwIGNsYXNzPVwiZm9udC1zaXplLXNtXCIgW3RoeVRpdGxlXT1cIml0ZW0uZ3JvdXBOYW1lXCI+PC90aHktZHJvcGRvd24tbWVudS1ncm91cD5cbiAgICAgICAgfVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxufSBAZWxzZSB7XG4gIDxkaXYgY2xhc3M9XCJlbXB0eSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICA8dGh5LWVtcHR5IFt0aHlNZXNzYWdlXT1cInRoeU1lc3NhZ2VcIj48L3RoeS1lbXB0eT5cbiAgPC9kaXY+XG59XG4iXX0=
@@ -7,4 +7,5 @@ export const CLIPBOARD_FORMAT_KEY = 'x-theia-fragment';
7
7
  export const DEFAULT_SCROLL_CONTAINER = '.the-editable-container';
8
8
  export const ELEMENT_UNIQUE_ID = 'key';
9
9
  export const ZERO_WIDTH_CHAR = '\u200B';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9jb25zdGFudHMvZGVmYXVsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNuSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLDJDQUEyQyxDQUFDO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUN0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLHlCQUF5QixDQUFDO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFBJQ1RVUkVfQUNDRVBURURfVVBMT0FEX01JTUUgPSBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJywgJ2ltYWdlL2dpZicsICdpbWFnZS9ibXAnLCAnaW1hZ2Uvc3ZnK3htbCddO1xuZXhwb3J0IGNvbnN0IFBJQ1RVUkVfQUNDRVBURURfVVBMT0FEX1NJWkUgPSA1MDtcbmV4cG9ydCBjb25zdCBBX1RBR19SRUxfQVRUUiA9ICdub29wZW5lciBub3JlZmVycmVyIG5vZm9sbG93IGV4dGVybmFsIHVnYyc7XG5leHBvcnQgY29uc3QgTElOS19ERUZBVUxUX1RFWFQgPSAn6ZO+5o6lJztcbmV4cG9ydCBjb25zdCBUQUJfU1BBQ0UgPSAnICAgICc7XG5leHBvcnQgY29uc3QgQ0xJUEJPQVJEX0ZPUk1BVF9LRVkgPSAneC10aGVpYS1mcmFnbWVudCc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9TQ1JPTExfQ09OVEFJTkVSID0gJy50aGUtZWRpdGFibGUtY29udGFpbmVyJztcbmV4cG9ydCBjb25zdCBFTEVNRU5UX1VOSVFVRV9JRCA9ICdrZXknO1xuZXhwb3J0IGNvbnN0IFpFUk9fV0lEVEhfQ0hBUiA9ICdcXHUyMDBCJztcbiJdfQ==
10
+ export const QUICK_INSERT_HOTKEY = '/';
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9jb25zdGFudHMvZGVmYXVsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNuSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxFQUFFLENBQUM7QUFDL0MsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLDJDQUEyQyxDQUFDO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUN0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLHlCQUF5QixDQUFDO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBQSUNUVVJFX0FDQ0VQVEVEX1VQTE9BRF9NSU1FID0gWydpbWFnZS9wbmcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS9naWYnLCAnaW1hZ2UvYm1wJywgJ2ltYWdlL3N2Zyt4bWwnXTtcbmV4cG9ydCBjb25zdCBQSUNUVVJFX0FDQ0VQVEVEX1VQTE9BRF9TSVpFID0gNTA7XG5leHBvcnQgY29uc3QgQV9UQUdfUkVMX0FUVFIgPSAnbm9vcGVuZXIgbm9yZWZlcnJlciBub2ZvbGxvdyBleHRlcm5hbCB1Z2MnO1xuZXhwb3J0IGNvbnN0IExJTktfREVGQVVMVF9URVhUID0gJ+mTvuaOpSc7XG5leHBvcnQgY29uc3QgVEFCX1NQQUNFID0gJyAgICAnO1xuZXhwb3J0IGNvbnN0IENMSVBCT0FSRF9GT1JNQVRfS0VZID0gJ3gtdGhlaWEtZnJhZ21lbnQnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0NST0xMX0NPTlRBSU5FUiA9ICcudGhlLWVkaXRhYmxlLWNvbnRhaW5lcic7XG5leHBvcnQgY29uc3QgRUxFTUVOVF9VTklRVUVfSUQgPSAna2V5JztcbmV4cG9ydCBjb25zdCBaRVJPX1dJRFRIX0NIQVIgPSAnXFx1MjAwQic7XG5leHBvcnQgY29uc3QgUVVJQ0tfSU5TRVJUX0hPVEtFWSA9ICcvJztcbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { Component, ElementRef, HostBinding, HostListener, Input, ViewChild } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Input, Renderer2, ViewChild, inject } from '@angular/core';
2
2
  import { ThyIcon } from 'ngx-tethys/icon';
3
3
  import { Node } from 'slate';
4
4
  import { AngularEditor } from 'slate-angular';
@@ -8,19 +8,19 @@ import { isCleanEmptyParagraph } from '../../../utils/is-clean-empty-paragraph';
8
8
  import { QuickInsertEditor } from '../quick-insert.editor';
9
9
  import * as i0 from "@angular/core";
10
10
  export class TheQuickInsert {
11
- handleMousedownNativeElement(event) {
12
- event.preventDefault();
13
- event.stopPropagation();
14
- }
15
- constructor(renderer, elementRef, cdr) {
16
- this.renderer = renderer;
17
- this.elementRef = elementRef;
18
- this.cdr = cdr;
11
+ constructor() {
19
12
  this.className = 'the-quick-insert';
20
13
  this.isVisible = false;
21
14
  this.defaultIconName = 'plus-circle-thin';
22
15
  this.iconNameFill = 'plus-circle-thin-fill';
23
16
  this.displayIconName = this.defaultIconName;
17
+ this.cdr = inject(ChangeDetectorRef);
18
+ this.renderer = inject(Renderer2);
19
+ this.elementRef = inject((ElementRef));
20
+ }
21
+ handleMousedownNativeElement(event) {
22
+ event.preventDefault();
23
+ event.stopPropagation();
24
24
  }
25
25
  ngOnInit() {
26
26
  const { onChange } = this.editor;
@@ -84,11 +84,11 @@ export class TheQuickInsert {
84
84
  }
85
85
  mouseEnter(event) {
86
86
  this.displayIconName = this.iconNameFill;
87
- this.cdr.markForCheck();
87
+ this.cdr.detectChanges();
88
88
  }
89
89
  mouseLeave(event) {
90
90
  this.displayIconName = this.defaultIconName;
91
- this.cdr.markForCheck();
91
+ this.cdr.detectChanges();
92
92
  }
93
93
  handleClick(event) {
94
94
  event.stopPropagation();
@@ -103,13 +103,13 @@ export class TheQuickInsert {
103
103
  this.updateIconDisplay();
104
104
  }, 100);
105
105
  }
106
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: TheQuickInsert, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
107
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.0", type: TheQuickInsert, isStandalone: true, selector: "[theQuickInsert]", inputs: { editor: "editor", isVisible: "isVisible" }, host: { listeners: { "mousedown": "handleMousedownNativeElement($event)" }, properties: { "class": "this.className" } }, viewQueries: [{ propertyName: "iconElement", first: true, predicate: ["iconElement"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<thy-icon\n #iconElement\n [thyIconName]=\"displayIconName\"\n class=\"quick-insert-icon text-desc font-size-xlg\"\n (mouseenter)=\"mouseEnter($event)\"\n (mouseleave)=\"mouseLeave($event)\"\n (mousedown)=\"handleClick($event)\"\n></thy-icon>\n", dependencies: [{ kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }] }); }
106
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: TheQuickInsert, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
107
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.0", type: TheQuickInsert, isStandalone: true, selector: "[theQuickInsert]", inputs: { editor: "editor", isVisible: "isVisible" }, host: { listeners: { "mousedown": "handleMousedownNativeElement($event)" }, properties: { "class": "this.className" } }, viewQueries: [{ propertyName: "iconElement", first: true, predicate: ["iconElement"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<thy-icon\n #iconElement\n class=\"quick-insert-icon text-desc font-size-xlg\"\n [thyIconName]=\"displayIconName\"\n (mouseenter)=\"mouseEnter($event)\"\n (mouseleave)=\"mouseLeave($event)\"\n (mouseup)=\"handleClick($event)\"\n></thy-icon>\n", dependencies: [{ kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
108
108
  }
109
109
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: TheQuickInsert, decorators: [{
110
110
  type: Component,
111
- args: [{ selector: '[theQuickInsert]', standalone: true, imports: [ThyIcon], template: "<thy-icon\n #iconElement\n [thyIconName]=\"displayIconName\"\n class=\"quick-insert-icon text-desc font-size-xlg\"\n (mouseenter)=\"mouseEnter($event)\"\n (mouseleave)=\"mouseLeave($event)\"\n (mousedown)=\"handleClick($event)\"\n></thy-icon>\n" }]
112
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { className: [{
111
+ args: [{ selector: '[theQuickInsert]', standalone: true, imports: [ThyIcon], changeDetection: ChangeDetectionStrategy.OnPush, template: "<thy-icon\n #iconElement\n class=\"quick-insert-icon text-desc font-size-xlg\"\n [thyIconName]=\"displayIconName\"\n (mouseenter)=\"mouseEnter($event)\"\n (mouseleave)=\"mouseLeave($event)\"\n (mouseup)=\"handleClick($event)\"\n></thy-icon>\n" }]
112
+ }], propDecorators: { className: [{
113
113
  type: HostBinding,
114
114
  args: ['class']
115
115
  }], editor: [{
@@ -123,4 +123,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
123
123
  type: HostListener,
124
124
  args: ['mousedown', ['$event']]
125
125
  }] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2staW5zZXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9wbHVnaW5zL3F1aWNrLWluc2VydC9jb21wb25lbnRzL3F1aWNrLWluc2VydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy9xdWljay1pbnNlcnQvY29tcG9uZW50cy9xdWljay1pbnNlcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBS0wsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQVUsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sS0FBSyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBUTNELE1BQU0sT0FBTyxjQUFjO0lBa0J2Qiw0QkFBNEIsQ0FBQyxLQUFLO1FBQzlCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQ1ksUUFBbUIsRUFDbkIsVUFBbUMsRUFDbkMsR0FBc0I7UUFGdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUNuQyxRQUFHLEdBQUgsR0FB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ZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLHNDQUFzQztRQUN0QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7aUJBQ2xDLFdBQVcsRUFBRTtpQkFDYixTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1lBQ1AsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1osQ0FBQzs4R0EzSFEsY0FBYztrR0FBZCxjQUFjLGtWQWNXLFVBQVUsa0RDekNoRCw0UEFRQSw0Q0RpQmMsT0FBTzs7MkZBRVIsY0FBYztrQkFOMUIsU0FBUzsrQkFDSSxrQkFBa0IsY0FFaEIsSUFBSSxXQUNQLENBQUMsT0FBTyxDQUFDO3VJQUlsQixTQUFTO3NCQURSLFdBQVc7dUJBQUMsT0FBTztnQkFHWCxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFTTixXQUFXO3NCQURWLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk3RCw0QkFBNEI7c0JBRDNCLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaHlJY29uIH0gZnJvbSAnbmd4LXRldGh5cy9pY29uJztcbmltcG9ydCB7IEVkaXRvciwgTm9kZSB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3IgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IE1hcmtUeXBlcyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9ub2RlLXR5cGVzJztcbmltcG9ydCAqIGFzIFRoZVF1ZXJpZXMgZnJvbSAnLi4vLi4vLi4vcXVlcmllcyc7XG5pbXBvcnQgeyBpc0NsZWFuRW1wdHlQYXJhZ3JhcGggfSBmcm9tICcuLi8uLi8uLi91dGlscy9pcy1jbGVhbi1lbXB0eS1wYXJhZ3JhcGgnO1xuaW1wb3J0IHsgUXVpY2tJbnNlcnRFZGl0b3IgfSBmcm9tICcuLi9xdWljay1pbnNlcnQuZWRpdG9yJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdbdGhlUXVpY2tJbnNlcnRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcXVpY2staW5zZXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtUaHlJY29uXVxufSlcbmV4cG9ydCBjbGFzcyBUaGVRdWlja0luc2VydCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBjbGFzc05hbWUgPSAndGhlLXF1aWNrLWluc2VydCc7XG5cbiAgICBASW5wdXQoKSBlZGl0b3I6IEVkaXRvcjtcblxuICAgIEBJbnB1dCgpIGlzVmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgZGVmYXVsdEljb25OYW1lID0gJ3BsdXMtY2lyY2xlLXRoaW4nO1xuXG4gICAgaWNvbk5hbWVGaWxsID0gJ3BsdXMtY2lyY2xlLXRoaW4tZmlsbCc7XG5cbiAgICBkaXNwbGF5SWNvbk5hbWUgPSB0aGlzLmRlZmF1bHRJY29uTmFtZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2ljb25FbGVtZW50JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgaWNvbkVsZW1lbnQ6IEVsZW1lbnRSZWY8YW55PjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duTmF0aXZlRWxlbWVudChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBvbkNoYW5nZSB9ID0gdGhpcy5lZGl0b3I7XG4gICAgICAgIHRoaXMuZWRpdG9yLm9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgb25DaGFuZ2UoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdG9yICYmIHRoaXMuZWRpdG9yLm9wdGlvbnMgJiYgIXRoaXMuZWRpdG9yLm9wdGlvbnMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAvLyB3YWl0IGlzT3BlbmVkTWVudSBpcyB1cGRhdGVkXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSWNvbkRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy51cGRhdGVJY29uRGlzcGxheSgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuaXNWaXNpYmxlICYmICFjaGFuZ2VzLmlzVmlzaWJsZS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJY29uRGlzcGxheSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUljb25EaXNwbGF5KCkge1xuICAgICAgICBjb25zdCB7IGVkaXRvciB9ID0gdGhpcztcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgJiZcbiAgICAgICAgICAgICFRdWlja0luc2VydEVkaXRvci5pc09wZW5lZE1lbnUoZWRpdG9yKSAmJlxuICAgICAgICAgICAgaXNDbGVhbkVtcHR5UGFyYWdyYXBoKGVkaXRvcikgJiZcbiAgICAgICAgICAgICF0aGlzLmhhc0V4Y2x1ZGVBdHRyaWJ1dGUoKSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNSaWNoTWVkaWFTY29wZSgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBOb2RlLmFuY2VzdG9yKGVkaXRvciwgW2VkaXRvcj8uc2VsZWN0aW9uPy5hbmNob3IucGF0aFswXV0pO1xuICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGU6IEhUTUxFbGVtZW50ID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUoZWRpdG9yLCBibG9jayk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKHJvb3ROb2RlLm9mZnNldExlZnQsIHJvb3ROb2RlLm9mZnNldFRvcCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRIaWRkZW5DbGFzcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkSGlkZGVuQ2xhc3MoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlSGlkZGVuQ2xhc3MoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNSaWNoTWVkaWFTY29wZSgpIHtcbiAgICAgICAgY29uc3QgeyBlZGl0b3IgfSA9IHRoaXM7XG4gICAgICAgIGlmIChlZGl0b3I/LnNlbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBOb2RlLmFuY2VzdG9yKGVkaXRvciwgW2VkaXRvcj8uc2VsZWN0aW9uPy5hbmNob3IucGF0aFswXV0pO1xuICAgICAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBBbmd1bGFyRWRpdG9yLnRvRE9NTm9kZShlZGl0b3IsIGJsb2NrKTtcbiAgICAgICAgICAgIGNvbnN0IGxlYWZFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtc2xhdGUtbGVhZj1cInRydWVcIl0nKTtcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50UmVjdCA9IHJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgbGVhZkVsZW1lbnRSZWN0ID0gbGVhZkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4gbGVhZkVsZW1lbnRSZWN0Py54ICE9PSByb290RWxlbWVudFJlY3Q/Lng7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzRXhjbHVkZUF0dHJpYnV0ZSgpIHtcbiAgICAgICAgY29uc3QgbWFya3MgPSBUaGVRdWVyaWVzLmdldFNlbGVjdGlvbk1hcmtzKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgY29uc3QgZm9udFNpemVNYXJrOiBudW1iZXIgPSBtYXJrc1tNYXJrVHlwZXMuZm9udFNpemVdO1xuXG4gICAgICAgIHJldHVybiBmb250U2l6ZU1hcms7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQb3NpdGlvbihsZWZ0OiBudW1iZXIsIHRvcD86IG51bWJlcikge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7bGVmdH1weGApO1xuICAgICAgICB0aGlzLnJlbW92ZUhpZGRlbkNsYXNzKCk7XG4gICAgfVxuXG4gICAgbW91c2VFbnRlcihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmRpc3BsYXlJY29uTmFtZSA9IHRoaXMuaWNvbk5hbWVGaWxsO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBtb3VzZUxlYXZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUljb25OYW1lID0gdGhpcy5kZWZhdWx0SWNvbk5hbWU7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBhdm9pZCBwb3BvdmVyIGlzIGNsb3NlZCBpbW1lZGlhdGVseVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIFF1aWNrSW5zZXJ0RWRpdG9yLm9wZW5NZW51KHRoaXMuZWRpdG9yKVxuICAgICAgICAgICAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSWNvbkRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSWNvbkRpc3BsYXkoKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG59XG4iLCI8dGh5LWljb25cbiAgI2ljb25FbGVtZW50XG4gIFt0aHlJY29uTmFtZV09XCJkaXNwbGF5SWNvbk5hbWVcIlxuICBjbGFzcz1cInF1aWNrLWluc2VydC1pY29uIHRleHQtZGVzYyBmb250LXNpemUteGxnXCJcbiAgKG1vdXNlZW50ZXIpPVwibW91c2VFbnRlcigkZXZlbnQpXCJcbiAgKG1vdXNlbGVhdmUpPVwibW91c2VMZWF2ZSgkZXZlbnQpXCJcbiAgKG1vdXNlZG93bik9XCJoYW5kbGVDbGljaygkZXZlbnQpXCJcbj48L3RoeS1pY29uPlxuIl19
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2staW5zZXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy9wbHVnaW5zL3F1aWNrLWluc2VydC9jb21wb25lbnRzL3F1aWNrLWluc2VydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy9xdWljay1pbnNlcnQvY29tcG9uZW50cy9xdWljay1pbnNlcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxTQUFTLEVBRVQsU0FBUyxFQUNULE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFVLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRCxPQUFPLEtBQUssVUFBVSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQVMzRCxNQUFNLE9BQU8sY0FBYztJQVAzQjtRQVEwQixjQUFTLEdBQUcsa0JBQWtCLENBQUM7UUFJNUMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUUzQixvQkFBZSxHQUFHLGtCQUFrQixDQUFDO1FBRXJDLGlCQUFZLEdBQUcsdUJBQXVCLENBQUM7UUFFdkMsb0JBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBVy9CLFFB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QUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWlCO1FBQ3pCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsc0NBQXNDO1FBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDbEMsV0FBVyxFQUFFO2lCQUNiLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7WUFDUCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWixDQUFDOzhHQXZIUSxjQUFjO2tHQUFkLGNBQWMsa1ZBYVcsVUFBVSxrREMzQ2hELDBQQVFBLDRDRG1CYyxPQUFPOzsyRkFHUixjQUFjO2tCQVAxQixTQUFTOytCQUNJLGtCQUFrQixjQUVoQixJQUFJLFdBQ1AsQ0FBQyxPQUFPLENBQUMsbUJBQ0QsdUJBQXVCLENBQUMsTUFBTTs4QkFHekIsU0FBUztzQkFBOUIsV0FBVzt1QkFBQyxPQUFPO2dCQUVYLE1BQU07c0JBQWQsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQVNOLFdBQVc7c0JBRFYsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSTdELDRCQUE0QjtzQkFEM0IsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIFJlbmRlcmVyMixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaHlJY29uIH0gZnJvbSAnbmd4LXRldGh5cy9pY29uJztcbmltcG9ydCB7IEVkaXRvciwgTm9kZSB9IGZyb20gJ3NsYXRlJztcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3IgfSBmcm9tICdzbGF0ZS1hbmd1bGFyJztcbmltcG9ydCB7IE1hcmtUeXBlcyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9ub2RlLXR5cGVzJztcbmltcG9ydCAqIGFzIFRoZVF1ZXJpZXMgZnJvbSAnLi4vLi4vLi4vcXVlcmllcyc7XG5pbXBvcnQgeyBpc0NsZWFuRW1wdHlQYXJhZ3JhcGggfSBmcm9tICcuLi8uLi8uLi91dGlscy9pcy1jbGVhbi1lbXB0eS1wYXJhZ3JhcGgnO1xuaW1wb3J0IHsgUXVpY2tJbnNlcnRFZGl0b3IgfSBmcm9tICcuLi9xdWljay1pbnNlcnQuZWRpdG9yJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdbdGhlUXVpY2tJbnNlcnRdJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcXVpY2staW5zZXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtUaHlJY29uXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUaGVRdWlja0luc2VydCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgY2xhc3NOYW1lID0gJ3RoZS1xdWljay1pbnNlcnQnO1xuXG4gICAgQElucHV0KCkgZWRpdG9yOiBFZGl0b3I7XG5cbiAgICBASW5wdXQoKSBpc1Zpc2libGUgPSBmYWxzZTtcblxuICAgIGRlZmF1bHRJY29uTmFtZSA9ICdwbHVzLWNpcmNsZS10aGluJztcblxuICAgIGljb25OYW1lRmlsbCA9ICdwbHVzLWNpcmNsZS10aGluLWZpbGwnO1xuXG4gICAgZGlzcGxheUljb25OYW1lID0gdGhpcy5kZWZhdWx0SWNvbk5hbWU7XG5cbiAgICBAVmlld0NoaWxkKCdpY29uRWxlbWVudCcsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGljb25FbGVtZW50OiBFbGVtZW50UmVmPGFueT47XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICAgIGhhbmRsZU1vdXNlZG93bk5hdGl2ZUVsZW1lbnQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHByaXZhdGUgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgb25DaGFuZ2UgfSA9IHRoaXMuZWRpdG9yO1xuICAgICAgICB0aGlzLmVkaXRvci5vbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIG9uQ2hhbmdlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLmVkaXRvci5vcHRpb25zICYmICF0aGlzLmVkaXRvci5vcHRpb25zLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgLy8gd2FpdCBpc09wZW5lZE1lbnUgaXMgdXBkYXRlZFxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUljb25EaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudXBkYXRlSWNvbkRpc3BsYXkoKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmlzVmlzaWJsZSAmJiAhY2hhbmdlcy5pc1Zpc2libGUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlSWNvbkRpc3BsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVJY29uRGlzcGxheSgpIHtcbiAgICAgICAgY29uc3QgeyBlZGl0b3IgfSA9IHRoaXM7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlICYmXG4gICAgICAgICAgICAhUXVpY2tJbnNlcnRFZGl0b3IuaXNPcGVuZWRNZW51KGVkaXRvcikgJiZcbiAgICAgICAgICAgIGlzQ2xlYW5FbXB0eVBhcmFncmFwaChlZGl0b3IpICYmXG4gICAgICAgICAgICAhdGhpcy5oYXNFeGNsdWRlQXR0cmlidXRlKCkgJiZcbiAgICAgICAgICAgICF0aGlzLmlzUmljaE1lZGlhU2NvcGUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gTm9kZS5hbmNlc3RvcihlZGl0b3IsIFtlZGl0b3I/LnNlbGVjdGlvbj8uYW5jaG9yLnBhdGhbMF1dKTtcbiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlOiBIVE1MRWxlbWVudCA9IEFuZ3VsYXJFZGl0b3IudG9ET01Ob2RlKGVkaXRvciwgYmxvY2spO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbihyb290Tm9kZS5vZmZzZXRMZWZ0LCByb290Tm9kZS5vZmZzZXRUb3ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkSGlkZGVuQ2xhc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEhpZGRlbkNsYXNzKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUhpZGRlbkNsYXNzKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUmljaE1lZGlhU2NvcGUoKSB7XG4gICAgICAgIGNvbnN0IHsgZWRpdG9yIH0gPSB0aGlzO1xuICAgICAgICBpZiAoZWRpdG9yPy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gTm9kZS5hbmNlc3RvcihlZGl0b3IsIFtlZGl0b3I/LnNlbGVjdGlvbj8uYW5jaG9yLnBhdGhbMF1dKTtcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUoZWRpdG9yLCBibG9jayk7XG4gICAgICAgICAgICBjb25zdCBsZWFmRWxlbWVudCA9IHJvb3RFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNsYXRlLWxlYWY9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudFJlY3QgPSByb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGxlYWZFbGVtZW50UmVjdCA9IGxlYWZFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGxlYWZFbGVtZW50UmVjdD8ueCAhPT0gcm9vdEVsZW1lbnRSZWN0Py54O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0V4Y2x1ZGVBdHRyaWJ1dGUoKSB7XG4gICAgICAgIGNvbnN0IG1hcmtzID0gVGhlUXVlcmllcy5nZXRTZWxlY3Rpb25NYXJrcyh0aGlzLmVkaXRvcik7XG4gICAgICAgIGNvbnN0IGZvbnRTaXplTWFyazogbnVtYmVyID0gbWFya3NbTWFya1R5cGVzLmZvbnRTaXplXTtcbiAgICAgICAgcmV0dXJuIGZvbnRTaXplTWFyaztcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBvc2l0aW9uKGxlZnQ6IG51bWJlciwgdG9wPzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd0b3AnLCBgJHt0b3B9cHhgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xlZnQnLCBgJHtsZWZ0fXB4YCk7XG4gICAgICAgIHRoaXMucmVtb3ZlSGlkZGVuQ2xhc3MoKTtcbiAgICB9XG5cbiAgICBtb3VzZUVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUljb25OYW1lID0gdGhpcy5pY29uTmFtZUZpbGw7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBtb3VzZUxlYXZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUljb25OYW1lID0gdGhpcy5kZWZhdWx0SWNvbk5hbWU7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gYXZvaWQgcG9wb3ZlciBpcyBjbG9zZWQgaW1tZWRpYXRlbHlcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBRdWlja0luc2VydEVkaXRvci5vcGVuTWVudSh0aGlzLmVkaXRvcilcbiAgICAgICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUljb25EaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUljb25EaXNwbGF5KCk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgfVxufVxuIiwiPHRoeS1pY29uXG4gICNpY29uRWxlbWVudFxuICBjbGFzcz1cInF1aWNrLWluc2VydC1pY29uIHRleHQtZGVzYyBmb250LXNpemUteGxnXCJcbiAgW3RoeUljb25OYW1lXT1cImRpc3BsYXlJY29uTmFtZVwiXG4gIChtb3VzZWVudGVyKT1cIm1vdXNlRW50ZXIoJGV2ZW50KVwiXG4gIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoJGV2ZW50KVwiXG4gIChtb3VzZXVwKT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxuPjwvdGh5LWljb24+XG4iXX0=