@dotglitch/ngx-common 1.1.22 → 1.1.24

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.
@@ -26,6 +26,7 @@ export declare class MenuComponent implements OnInit {
26
26
  hasBootstrapped: boolean;
27
27
  pointerIsOnVoid: boolean;
28
28
  pointerHasBeenOverMask: boolean;
29
+ parentIsNgxMenu: boolean;
29
30
  coverRectCords: {
30
31
  top: number;
31
32
  left: number;
@@ -65,6 +65,7 @@ export class MenuComponent {
65
65
  this.hasBootstrapped = false;
66
66
  this.pointerIsOnVoid = false;
67
67
  this.pointerHasBeenOverMask = false;
68
+ this.parentIsNgxMenu = false;
68
69
  this.coverRectCords = {
69
70
  top: 0,
70
71
  left: 0,
@@ -87,6 +88,7 @@ export class MenuComponent {
87
88
  this.parentItem = this._data?.parentItem;
88
89
  this.parentContext = this._data?.parentContext;
89
90
  this.isLockedOpen = this.isLockedOpen || this._data?.config?.['_isLockedOpen'];
91
+ this.parentIsNgxMenu = this._data?.parentIsNgxMenu;
90
92
  this.template = _data.template;
91
93
  this.templateType = this.template instanceof TemplateRef ? "template" : "component";
92
94
  if (this.templateType == "component") {
@@ -236,6 +238,10 @@ export class MenuComponent {
236
238
  cords.left = bounds.x + bounds.width + "px";
237
239
  const config = structuredClone(this.config);
238
240
  config['_isLockedOpen'] = keepOpen;
241
+ // Do not project in the top left corner -- this scenario
242
+ // happens when a dialog opens as the parent is killed.
243
+ if (cords.left == 0 && cords.top == 0)
244
+ return;
239
245
  const dialogRef = this.dialog.open(MenuComponent, {
240
246
  position: cords,
241
247
  panelClass: ["ngx-menu"].concat(this.config?.customClass || []),
@@ -249,7 +255,8 @@ export class MenuComponent {
249
255
  parentContext: context,
250
256
  items: item['_children'],
251
257
  template: item.childTemplate,
252
- config: config
258
+ config: config,
259
+ parentIsNgxMenu: true
253
260
  }
254
261
  });
255
262
  let _s = dialogRef
@@ -303,6 +310,7 @@ export class MenuComponent {
303
310
  }
304
311
  }
305
312
  startHoverTimer(item, row) {
313
+ this.childDialogs.forEach(cd => cd.close());
306
314
  // Invert check to make the logic simpler
307
315
  // TL;DR: if (any) of these are true, we will do the hover action
308
316
  if (!(Array.isArray(item.children) && item.children.length > 0 ||
@@ -358,7 +366,7 @@ export class MenuComponent {
358
366
  });
359
367
  }
360
368
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: MenuComponent, deps: [{ token: i0.ViewContainerRef }, { token: i1.DomSanitizer }, { token: MAT_DIALOG_DATA, optional: true }, { token: i2.MatDialog, optional: true }, { token: i2.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
361
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: MenuComponent, isStandalone: true, selector: "ngx-menu", inputs: { data: "data", items: "items", config: "config", id: "id", overlayOverlap: "overlayOverlap", hoverDelay: "hoverDelay", showDebugOverlay: "showDebugOverlay", ownerCords: "ownerCords", selfCords: "selfCords", parentItem: "parentItem", parentContext: "parentContext", isLockedOpen: "isLockedOpen" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<!-- Mouse event blocker for pointer leave -->\n@if (coverRectCords) {\n <div\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n (pointerenter)=\"pointerHasBeenOverMask=true\"\n (click)=\"isLockedOpen = true\"\n ></div>\n}\n\n<div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (pointermove)=\"hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (wheel)=\"onWheel($event)\"\n></div>\n\n@if (!template) {\n <table>\n <tbody>\n @for (item of items; track item) {\n <!-- A row with a click action -->\n @if (item != 'separator' && item.separator != true && item['_visible']) {\n <tr #row\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row, true)\"\n [class.hover]=\"row['hover']\"\n [class.open]=\"row['_open']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n @if (showIconColumn) {\n <td class=\"icon\">\n @if (matIconRx.test(item['_icon'] ?? item.icon)) {\n <img [src]=\"item['_icon'] ?? item.icon\"/>\n }\n @else {\n <mat-icon\n [fontIcon]=\"item['_icon'] ?? item.icon\"\n [style.color]=\"item.iconColor\"\n />\n }\n </td>\n }\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n @if ($any(item.labelTemplate)?.prototype) {\n <ng-container\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n }\n @else {\n @if ($any(item)?.labelTemplate) {\n {{$any(item)?.labelTemplate(data || {})}}\n }\n @else {\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n }\n }\n </a>\n </td>\n\n @if (showShortcutColumn) {\n <td class=\"shortcut\">\n {{item.shortcutLabel}}\n </td>\n }\n\n <td style=\"min-width: 16px\">\n @if ((\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n ) {\n <mat-icon\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n }\n\n @if (item['_isResolving']) {\n <mat-progress-spinner\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n }\n </td>\n </tr>\n }\n @else if (item != 'separator' && item.separator == true) {\n <!-- Separator with label -->\n <tr\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n }\n @else if (item == 'separator') {\n <!-- Separator -->\n <tr\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n}\n@else {\n @if (templateType == 'template') {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n }\n @else {\n <ng-container\n [cdkPortalOutlet]=\"componentPortal\"\n />\n }\n}\n\n@if (showDebugOverlay) {\n <div>\n <div>hbs: {{hasBootstrapped}}</div>\n <div>pov: {{pointerIsOnVoid}}</div>\n <div>ilo: {{isLockedOpen}}</div>\n <div>hbom: {{pointerHasBeenOverMask}}</div>\n\n <div>type: {{templateType}}</div>\n </div>\n}\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled).hover,tr:not(.disabled).open{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled).hover a,tr:not(.disabled).open a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}tr img{max-width:100%;max-height:100%;aspect-ratio:1}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
369
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: MenuComponent, isStandalone: true, selector: "ngx-menu", inputs: { data: "data", items: "items", config: "config", id: "id", overlayOverlap: "overlayOverlap", hoverDelay: "hoverDelay", showDebugOverlay: "showDebugOverlay", ownerCords: "ownerCords", selfCords: "selfCords", parentItem: "parentItem", parentContext: "parentContext", isLockedOpen: "isLockedOpen" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<!-- Mouse event blocker for pointer leave -->\n@if (coverRectCords && !parentIsNgxMenu) {\n <div\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n (pointerenter)=\"pointerHasBeenOverMask=true\"\n (pointermove)=\"pointerHasBeenOverMask=true\"\n (click)=\"isLockedOpen = true\"\n ></div>\n}\n\n@if (!parentIsNgxMenu) {\n <div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (pointermove)=\"hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (click)=\"closeOnVoid(true)\"\n (wheel)=\"onWheel($event)\"\n ></div>\n}\n\n@if (!template) {\n <table>\n <tbody>\n @for (item of items; track item) {\n <!-- A row with a click action -->\n @if (item != 'separator' && item.separator != true && item['_visible']) {\n <tr #row\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row, true)\"\n [class.hover]=\"row['hover']\"\n [class.open]=\"row['_open']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n @if (showIconColumn) {\n <td class=\"icon\">\n @if (matIconRx.test(item['_icon'] ?? item.icon)) {\n <img [src]=\"item['_icon'] ?? item.icon\"/>\n }\n @else {\n <mat-icon\n [fontIcon]=\"item['_icon'] ?? item.icon\"\n [style.color]=\"item.iconColor\"\n />\n }\n </td>\n }\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n @if ($any(item.labelTemplate)?.prototype) {\n <ng-container\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n }\n @else {\n @if ($any(item)?.labelTemplate) {\n {{$any(item)?.labelTemplate(data || {})}}\n }\n @else {\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n }\n }\n </a>\n </td>\n\n @if (showShortcutColumn) {\n <td class=\"shortcut\">\n {{item.shortcutLabel}}\n </td>\n }\n\n <td style=\"min-width: 16px\">\n @if ((\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n ) {\n <mat-icon\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n }\n\n @if (item['_isResolving']) {\n <mat-progress-spinner\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n }\n </td>\n </tr>\n }\n @else if (item != 'separator' && item.separator == true) {\n <!-- Separator with label -->\n <tr\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n }\n @else if (item == 'separator') {\n <!-- Separator -->\n <tr\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n}\n@else {\n @if (templateType == 'template') {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n }\n @else {\n <ng-container\n [cdkPortalOutlet]=\"componentPortal\"\n />\n }\n}\n\n@if (showDebugOverlay) {\n <div>\n <div>hbs: {{hasBootstrapped}}</div>\n <div>pov: {{pointerIsOnVoid}}</div>\n <div>ilo: {{isLockedOpen}}</div>\n <div>hbom: {{pointerHasBeenOverMask}}</div>\n\n <div>type: {{templateType}}</div>\n </div>\n}\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled).hover,tr:not(.disabled).open{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled).hover a,tr:not(.disabled).open a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}tr img{max-width:100%;max-height:100%;aspect-ratio:1}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
362
370
  }
363
371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: MenuComponent, decorators: [{
364
372
  type: Component,
@@ -368,7 +376,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
368
376
  MatIconModule,
369
377
  MatProgressSpinnerModule,
370
378
  TooltipDirective
371
- ], standalone: true, template: "<!-- Mouse event blocker for pointer leave -->\n@if (coverRectCords) {\n <div\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n (pointerenter)=\"pointerHasBeenOverMask=true\"\n (click)=\"isLockedOpen = true\"\n ></div>\n}\n\n<div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (pointermove)=\"hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (wheel)=\"onWheel($event)\"\n></div>\n\n@if (!template) {\n <table>\n <tbody>\n @for (item of items; track item) {\n <!-- A row with a click action -->\n @if (item != 'separator' && item.separator != true && item['_visible']) {\n <tr #row\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row, true)\"\n [class.hover]=\"row['hover']\"\n [class.open]=\"row['_open']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n @if (showIconColumn) {\n <td class=\"icon\">\n @if (matIconRx.test(item['_icon'] ?? item.icon)) {\n <img [src]=\"item['_icon'] ?? item.icon\"/>\n }\n @else {\n <mat-icon\n [fontIcon]=\"item['_icon'] ?? item.icon\"\n [style.color]=\"item.iconColor\"\n />\n }\n </td>\n }\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n @if ($any(item.labelTemplate)?.prototype) {\n <ng-container\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n }\n @else {\n @if ($any(item)?.labelTemplate) {\n {{$any(item)?.labelTemplate(data || {})}}\n }\n @else {\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n }\n }\n </a>\n </td>\n\n @if (showShortcutColumn) {\n <td class=\"shortcut\">\n {{item.shortcutLabel}}\n </td>\n }\n\n <td style=\"min-width: 16px\">\n @if ((\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n ) {\n <mat-icon\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n }\n\n @if (item['_isResolving']) {\n <mat-progress-spinner\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n }\n </td>\n </tr>\n }\n @else if (item != 'separator' && item.separator == true) {\n <!-- Separator with label -->\n <tr\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n }\n @else if (item == 'separator') {\n <!-- Separator -->\n <tr\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n}\n@else {\n @if (templateType == 'template') {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n }\n @else {\n <ng-container\n [cdkPortalOutlet]=\"componentPortal\"\n />\n }\n}\n\n@if (showDebugOverlay) {\n <div>\n <div>hbs: {{hasBootstrapped}}</div>\n <div>pov: {{pointerIsOnVoid}}</div>\n <div>ilo: {{isLockedOpen}}</div>\n <div>hbom: {{pointerHasBeenOverMask}}</div>\n\n <div>type: {{templateType}}</div>\n </div>\n}\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled).hover,tr:not(.disabled).open{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled).hover a,tr:not(.disabled).open a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}tr img{max-width:100%;max-height:100%;aspect-ratio:1}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"] }]
379
+ ], standalone: true, template: "<!-- Mouse event blocker for pointer leave -->\n@if (coverRectCords && !parentIsNgxMenu) {\n <div\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n (pointerenter)=\"pointerHasBeenOverMask=true\"\n (pointermove)=\"pointerHasBeenOverMask=true\"\n (click)=\"isLockedOpen = true\"\n ></div>\n}\n\n@if (!parentIsNgxMenu) {\n <div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (pointermove)=\"hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (click)=\"closeOnVoid(true)\"\n (wheel)=\"onWheel($event)\"\n ></div>\n}\n\n@if (!template) {\n <table>\n <tbody>\n @for (item of items; track item) {\n <!-- A row with a click action -->\n @if (item != 'separator' && item.separator != true && item['_visible']) {\n <tr #row\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row, true)\"\n [class.hover]=\"row['hover']\"\n [class.open]=\"row['_open']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n @if (showIconColumn) {\n <td class=\"icon\">\n @if (matIconRx.test(item['_icon'] ?? item.icon)) {\n <img [src]=\"item['_icon'] ?? item.icon\"/>\n }\n @else {\n <mat-icon\n [fontIcon]=\"item['_icon'] ?? item.icon\"\n [style.color]=\"item.iconColor\"\n />\n }\n </td>\n }\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n @if ($any(item.labelTemplate)?.prototype) {\n <ng-container\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n }\n @else {\n @if ($any(item)?.labelTemplate) {\n {{$any(item)?.labelTemplate(data || {})}}\n }\n @else {\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n }\n }\n </a>\n </td>\n\n @if (showShortcutColumn) {\n <td class=\"shortcut\">\n {{item.shortcutLabel}}\n </td>\n }\n\n <td style=\"min-width: 16px\">\n @if ((\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n ) {\n <mat-icon\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n }\n\n @if (item['_isResolving']) {\n <mat-progress-spinner\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n }\n </td>\n </tr>\n }\n @else if (item != 'separator' && item.separator == true) {\n <!-- Separator with label -->\n <tr\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n }\n @else if (item == 'separator') {\n <!-- Separator -->\n <tr\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n}\n@else {\n @if (templateType == 'template') {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n }\n @else {\n <ng-container\n [cdkPortalOutlet]=\"componentPortal\"\n />\n }\n}\n\n@if (showDebugOverlay) {\n <div>\n <div>hbs: {{hasBootstrapped}}</div>\n <div>pov: {{pointerIsOnVoid}}</div>\n <div>ilo: {{isLockedOpen}}</div>\n <div>hbom: {{pointerHasBeenOverMask}}</div>\n\n <div>type: {{templateType}}</div>\n </div>\n}\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled).hover,tr:not(.disabled).open{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled).hover a,tr:not(.disabled).open a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}tr img{max-width:100%;max-height:100%;aspect-ratio:1}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"] }]
372
380
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i1.DomSanitizer }, { type: undefined, decorators: [{
373
381
  type: Optional
374
382
  }, {
@@ -406,4 +414,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
406
414
  type: HostListener,
407
415
  args: ["window:resize"]
408
416
  }] } });
409
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxRQUFRLEVBQUUsV0FBVyxFQUEwQixNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEVBQWdCLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUUsT0FBTyxFQUEyQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7O0FBR3RFLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFakYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLFNBQXFCLEVBQUUsT0FBWSxFQUFFLEVBQUU7SUFDNUUsTUFBTSxJQUFJLEdBQUc7UUFD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QkFDVSxFQUFFO3NCQUFqQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQWdURSxRQUFRO3NCQURmLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwsIFRlbXBsYXRlUmVmLCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIGNyZWF0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLXNwaW5uZXInO1xuXG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwsIFBvcnRhbE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL21lbnUnO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvdG9vbHRpcC5kaXJlY3RpdmUnO1xuXG5kZWNsYXJlIGNvbnN0IFpvbmU6IGFueTtcbmNvbnN0IHpvbmUgPSBuZXcgWm9uZShab25lLmN1cnJlbnQsIHsgbmFtZTogXCJAZG90Z2xpdGNoX21lbnVcIiwgcHJvcGVydGllczoge30gfSk7XG5cbmV4cG9ydCBjb25zdCBjYWxjTWVudUl0ZW1Cb3VuZHMgPSBhc3luYyAobWVudUl0ZW1zOiBNZW51SXRlbVtdLCBkYXRhT2JqOiBhbnkpID0+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBkYXRhOiBkYXRhT2JqLFxuICAgICAgICBpdGVtczogbWVudUl0ZW1zLFxuICAgICAgICBjb25maWc6IHt9LFxuICAgICAgICBzZWxmQ29yZHM6IHsgbGVmdDogXCIwcHhcIiwgdG9wOiBcIjBweFwiIH0sXG4gICAgICAgIG93bmVyQ29yZHM6IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9LFxuICAgICAgICBpZDogbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBjYWxjQ29tcG9uZW50Qm91bmRzKE1lbnVDb21wb25lbnQsIGRhdGEpO1xufVxuXG5jb25zdCBjYWxjQ29tcG9uZW50Qm91bmRzID0gYXN5bmMgKGNvbXBvbmVudDogVHlwZTxhbnk+LCBkYXRhOiBhbnkpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8RE9NUmVjdD4oKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHpvbmUucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcGxpY2F0aW9uKHtcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBwcm92aWRlOiBNQVRfRElBTE9HX0RBVEEsIHVzZVZhbHVlOiBkYXRhIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGRlbC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgICAgIGRlbC5zdHlsZS5sZWZ0ID0gJy0xMDAwdncnO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoZGVsKTtcblxuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGFwcC5ib290c3RyYXAoY29tcG9uZW50LCBkZWwpO1xuICAgICAgICAgICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gYmFzZTtcblxuICAgICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oYXBwLmlzU3RhYmxlKTtcblxuICAgICAgICAgICAgY29uc3QgZWw6IEhUTUxFbGVtZW50ID0gaW5zdGFuY2Uudmlld0NvbnRhaW5lcj8uZWxlbWVudD8ubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgYXBwLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbC5yZW1vdmUoKTtcblxuICAgICAgICAgICAgcmVzKHJlY3QpO1xuICAgICAgICB9KTtcbiAgICB9KVxufVxuXG5jb25zdCAkZGF0YSA9IFN5bWJvbChcImRhdGFcIik7XG5jb25zdCAkaG92ZXIgPSBTeW1ib2woXCJob3ZlclwiKTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWVudScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL21lbnUuY29tcG9uZW50LnNjc3MnXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgICAgIFBvcnRhbE1vZHVsZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgICAgICBUb29sdGlwRGlyZWN0aXZlXG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCkgcHVibGljIGRhdGE6IGFueTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXM6IE1lbnVJdGVtW107XG4gICAgQElucHV0KCkgcHVibGljIGNvbmZpZzogTWVudU9wdGlvbnM7XG4gICAgQElucHV0KCkgcHVibGljIGlkOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIG92ZXJsYXlPdmVybGFwID0gMzI7XG4gICAgQElucHV0KCkgcHVibGljIGhvdmVyRGVsYXkgPSA0MDA7XG4gICAgQElucHV0KCkgcHVibGljIHNob3dEZWJ1Z092ZXJsYXkgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIG93bmVyQ29yZHM6IERPTVJlY3Q7XG4gICAgQElucHV0KCkgc2VsZkNvcmRzO1xuICAgIEBJbnB1dCgpIHBhcmVudEl0ZW07XG4gICAgQElucHV0KCkgcGFyZW50Q29udGV4dDtcbiAgICBASW5wdXQoKSBpc0xvY2tlZE9wZW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBoYXNCb290c3RyYXBwZWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgcG9pbnRlcklzT25Wb2lkID0gZmFsc2U7XG4gICAgcHVibGljIHBvaW50ZXJIYXNCZWVuT3Zlck1hc2sgPSBmYWxzZTtcblxuICAgIGNvdmVyUmVjdENvcmRzID0ge1xuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgd2lkdGg6IDBcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHNsYXNoZXMgb3IgZG90cyAtLSB0aGF0IHdpbGwgY2xlYXJseSBleGNsdWRlIGl0IGZyb20gYmVpbmcgYSBtYXQgaWNvblxuICAgIHB1YmxpYyByZWFkb25seSBtYXRJY29uUnggPSAvW1xcL1xcLl0vaTtcbiAgICBzaG93SWNvbkNvbHVtbiA9IHRydWU7XG4gICAgc2hvd1Nob3J0Y3V0Q29sdW1uID0gdHJ1ZTtcblxuICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIHRlbXBsYXRlVHlwZTogXCJ0ZW1wbGF0ZVwiIHwgXCJjb21wb25lbnRcIjtcbiAgICBjb21wb25lbnRQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxhbnk+O1xuICAgIHByaXZhdGUgY2hpbGREaWFsb2dzOiBNYXREaWFsb2dSZWY8YW55PltdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHB1YmxpYyBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGE6IGFueSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLCAvLyBvcHRpb25hbCBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiBlc3RpbWF0aW5nIGRpbWVuc2lvbnNcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPGFueT5cbiAgICApIHtcbiAgICAgICAgLy8gRGVmYXVsdHMgYXJlIHNldCBiZWZvcmUgQElucHV0KCkgaG9va3MgZXZhbHVhdGVcbiAgICAgICAgdGhpcy5kaWFsb2cgPSB0aGlzLmRpYWxvZyB8fCB0aGlzLl9kYXRhPy5kaWFsb2c7XG4gICAgICAgIHRoaXMuZGF0YSAgPSB0aGlzLl9kYXRhPy5kYXRhO1xuICAgICAgICB0aGlzLm93bmVyQ29yZHMgPSB0aGlzLl9kYXRhPy5vd25lckNvcmRzO1xuICAgICAgICB0aGlzLnNlbGZDb3JkcyA9IHRoaXMuX2RhdGE/LnNlbGZDb3JkcztcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuX2RhdGE/Lml0ZW1zO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuX2RhdGE/LmNvbmZpZztcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuX2RhdGE/LmlkO1xuICAgICAgICB0aGlzLnBhcmVudEl0ZW0gPSB0aGlzLl9kYXRhPy5wYXJlbnRJdGVtO1xuICAgICAgICB0aGlzLnBhcmVudENvbnRleHQgPSB0aGlzLl9kYXRhPy5wYXJlbnRDb250ZXh0O1xuICAgICAgICB0aGlzLmlzTG9ja2VkT3BlbiA9IHRoaXMuaXNMb2NrZWRPcGVuIHx8IHRoaXMuX2RhdGE/LmNvbmZpZz8uWydfaXNMb2NrZWRPcGVuJ107XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IF9kYXRhLnRlbXBsYXRlO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVUeXBlID0gdGhpcy50ZW1wbGF0ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmID8gXCJ0ZW1wbGF0ZVwiIDogXCJjb21wb25lbnRcIjtcblxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVR5cGUgPT0gXCJjb21wb25lbnRcIikge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKHRoaXMudGVtcGxhdGUgYXMgYW55KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuXG4gICAgICAgIHRoaXMuaXRlbXM/LmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGkgPT0gXCJzdHJpbmdcIikgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBTZXQgZGVmYXVsdHNcbiAgICAgICAgICAgIGlbJ19kaXNhYmxlZCddID0gZmFsc2U7XG4gICAgICAgICAgICBpWydfdmlzaWJsZSddID0gdHJ1ZTtcbiAgICAgICAgICAgIGlbJ19jb250ZXh0J10gPSAodHlwZW9mIGkuY29udGV4dCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gaS5jb250ZXh0KHRoaXMuZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpLmNvbnRleHQ7XG5cbiAgICAgICAgICAgIGlmIChpLmxhYmVsKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ19mb3JtYXR0ZWRMYWJlbCddID0gdGhpcy5mb3JtYXRMYWJlbChpLmxhYmVsKTsgfSBjYXRjaCAoZSkgeyBjb25zb2xlLndhcm4oZSkgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGkuaXNEaXNhYmxlZCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX2Rpc2FibGVkJ10gPSBpLmlzRGlzYWJsZWQodGhpcy5kYXRhIHx8IHt9LCBpWydfY29udGV4dCddKTsgfSBjYXRjaChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5pc1Zpc2libGUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ192aXNpYmxlJ10gPSBpLmlzVmlzaWJsZSh0aGlzLmRhdGEgfHwge30sIGlbJ19jb250ZXh0J10pOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5saW5rVGVtcGxhdGUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ19saW5rJ10gPSBpLmxpbmtUZW1wbGF0ZSh0aGlzLmRhdGEgfHwge30sIGlbJ19jb250ZXh0J10pOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5pY29uVGVtcGxhdGUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ19pY29uJ10gPSBpLmljb25UZW1wbGF0ZSh0aGlzLmRhdGEgfHwge30sIGlbJ19jb250ZXh0J10pOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKTsgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTaG93IHRoZSBpY29uIGNvbHVtbiBpZiB0aGVyZSBhcmUgYW55IGl0ZW1zIHdpdGggYW4gaWNvblxuICAgICAgICB0aGlzLnNob3dJY29uQ29sdW1uID0gISF0aGlzLml0ZW1zPy5maW5kKGkgPT5cbiAgICAgICAgICAgICAgICB0eXBlb2YgaSA9PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGlbJ2ljb24nXSA9PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgaVsnaWNvbiddLmxlbmd0aCA+IDJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zaG93U2hvcnRjdXRDb2x1bW4gPSAhIXRoaXMuaXRlbXM/LmZpbmQoaSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpID09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgaVsnc2hvcnRjdXQnXSA9PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgaVsnc2hvcnRjdXQnXS5sZW5ndGggPiAyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLm93bmVyQ29yZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGZZID0gcGFyc2VJbnQodGhpcy5zZWxmQ29yZHMudG9wPy5yZXBsYWNlKCdweCcsICcnKSB8fCAnMCcpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZlggPSBwYXJzZUludCh0aGlzLnNlbGZDb3Jkcy5sZWZ0Py5yZXBsYWNlKCdweCcsICcnKSB8fCAnMCcpO1xuXG4gICAgICAgICAgICB0aGlzLmNvdmVyUmVjdENvcmRzID0ge1xuICAgICAgICAgICAgICAgIHRvcDogdGhpcy5vd25lckNvcmRzLnkgLSBzZWxmWSAtICh0aGlzLm92ZXJsYXlPdmVybGFwLzIpLFxuICAgICAgICAgICAgICAgIGxlZnQ6IHRoaXMub3duZXJDb3Jkcy54IC0gc2VsZlggLSAodGhpcy5vdmVybGF5T3ZlcmxhcC8yKSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMub3duZXJDb3Jkcy5oZWlnaHQgKyB0aGlzLm92ZXJsYXlPdmVybGFwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLm93bmVyQ29yZHMud2lkdGggKyB0aGlzLm92ZXJsYXlPdmVybGFwXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFzQm9vdHN0cmFwcGVkID0gdHJ1ZTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy52aWV3Q29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZXZ0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNMb2NrZWRPcGVuID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBldnQgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0xvY2tlZE9wZW4gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoXCIsIGV2dCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzTG9ja2VkT3BlbiA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLmNoaWxkRGlhbG9ncy5mb3JFYWNoKGQgPT4gZC5jbG9zZSh7WyRkYXRhXTogdHJ1ZX0pKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1cbiAgICAgKiBAcGFyYW0gZXZ0XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBhc3luYyBvbk1lbnVJdGVtQ2xpY2soaXRlbTogTWVudUl0ZW0sIHJvdzogSFRNTFRhYmxlUm93RWxlbWVudCwga2VlcE9wZW4gPSBmYWxzZSkge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoaXRlbS5zZXBhcmF0b3IpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCBpdGVtWydfY29udGV4dCddO1xuXG4gICAgICAgIC8vIElmIGNhY2hlIGlzIGVuYWJsZWQsIG9ubHkgbG9hZCBpZiB3ZSBkb24ndCBoYXZlIGFueSBjaGlsZHJlbi5cbiAgICAgICAgY29uc3QgZm9yY2VMb2FkID0gKGl0ZW0uY2FjaGVSZXNvbHZlZENoaWxkcmVuID8gIWl0ZW0uY2hpbGRyZW4gOiB0cnVlKTtcblxuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlblJlc29sdmVyICYmIGZvcmNlTG9hZCkge1xuICAgICAgICAgICAgaXRlbVsnX2lzUmVzb2x2aW5nJ10gPSB0cnVlO1xuICAgICAgICAgICAgaXRlbVsnX2NoaWxkcmVuJ10gPSBhd2FpdCBpdGVtLmNoaWxkcmVuUmVzb2x2ZXIodGhpcy5kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGl0ZW1bJ19pc1Jlc29sdmluZyddID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGl0ZW0uY2hpbGRyZW4gPT0gXCJmdW5jdGlvblwiICYmIGZvcmNlTG9hZCkge1xuICAgICAgICAgICAgaXRlbVsnX2lzUmVzb2x2aW5nJ10gPSB0cnVlO1xuICAgICAgICAgICAgaXRlbVsnX2NoaWxkcmVuJ10gPSBhd2FpdCBpdGVtLmNoaWxkcmVuKHRoaXMuZGF0YSwgY29udGV4dCk7XG4gICAgICAgICAgICBpdGVtWydfaXNSZXNvbHZpbmcnXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbVsnX2NoaWxkcmVuJ10gPSBpdGVtLmNoaWxkcmVuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW1bJ19jaGlsZHJlbiddIHx8IGl0ZW0uY2hpbGRUZW1wbGF0ZSlcbiAgICAgICAgICAgIHJvd1snX29wZW4nXSA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFpdGVtLmNoaWxkVGVtcGxhdGUgJiYgIWl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbS5hY3Rpb24gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgaXRlbS5hY3Rpb24odGhpcy5kYXRhLCBjb250ZXh0KVxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UocmVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBhY3Rpb24sIHRoaXMgaXMgc2ltcGx5IGEgdGV4dCBpdGVtLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWVkIFggcG9zLCBZIHBvcywgd2lkdGggYW5kIGhlaWdodFxuICAgICAgICBjb25zdCBib3VuZHMgPSByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgY29uc3QgY29yZHMgPSB7XG4gICAgICAgICAgICB0b3A6IG51bGwsXG4gICAgICAgICAgICBsZWZ0OiBudWxsLFxuICAgICAgICAgICAgYm90dG9tOiBudWxsLFxuICAgICAgICAgICAgcmlnaHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgcG9zaXRpb24gY29vcmRpbmF0ZXNcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBhd2FpdCAoaXRlbS5jaGlsZFRlbXBsYXRlXG4gICAgICAgICAgICA/IGNhbGNDb21wb25lbnRCb3VuZHMoTWVudUNvbXBvbmVudCwgeyB0ZW1wbGF0ZTogaXRlbS5jaGlsZFRlbXBsYXRlIH0pXG4gICAgICAgICAgICA6IGNhbGNNZW51SXRlbUJvdW5kcyhpdGVtWydfY2hpbGRyZW4nXSwgdGhpcy5kYXRhKSk7XG5cbiAgICAgICAgaWYgKGJvdW5kcy55ICsgaGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KVxuICAgICAgICAgICAgY29yZHMuYm90dG9tID0gXCIwcHhcIjtcbiAgICAgICAgaWYgKGJvdW5kcy54ICsgYm91bmRzLndpZHRoICsgd2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aClcbiAgICAgICAgICAgIGNvcmRzLmxlZnQgPSAoKGJvdW5kcy54IC0gd2lkdGgpKSArIFwicHhcIjtcblxuICAgICAgICBpZiAoIWNvcmRzLmJvdHRvbSkgY29yZHMudG9wICA9IGJvdW5kcy55ICsgXCJweFwiO1xuICAgICAgICBpZiAoIWNvcmRzLmxlZnQpICAgY29yZHMubGVmdCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoICsgXCJweFwiO1xuXG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gc3RydWN0dXJlZENsb25lKHRoaXMuY29uZmlnKVxuICAgICAgICBjb25maWdbJ19pc0xvY2tlZE9wZW4nXSA9IGtlZXBPcGVuO1xuXG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTWVudUNvbXBvbmVudCwge1xuICAgICAgICAgICAgcG9zaXRpb246IGNvcmRzLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogW1wibmd4LW1lbnVcIl0uY29uY2F0KHRoaXMuY29uZmlnPy5jdXN0b21DbGFzcyB8fCBbXSksXG4gICAgICAgICAgICBiYWNrZHJvcENsYXNzOiBcIm5neC1tZW51LWJhY2tkcm9wXCIsXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgICAgIG93bmVyQ29yZHM6IHJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICAgICAgICBzZWxmQ29yZHM6IGNvcmRzLFxuICAgICAgICAgICAgICAgIHBhcmVudEl0ZW06IGl0ZW0sXG4gICAgICAgICAgICAgICAgcGFyZW50Q29udGV4dDogY29udGV4dCxcbiAgICAgICAgICAgICAgICBpdGVtczogaXRlbVsnX2NoaWxkcmVuJ10sXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGl0ZW0uY2hpbGRUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgX3MgPSBkaWFsb2dSZWZcbiAgICAgICAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsaWNrZWQgXCJ2b2lkXCIgb24gYSBzdWJtZW51XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09IFwib2JqZWN0XCIgJiYgcmVzdWx0WyRkYXRhXSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gV2VudCBiYWNrIHRvIHBhcmVudCBtZW51IC0tIGRvIG5vdCBjbG9zZSAoc2FtZSBhcyByZXN1bHQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHJlc3VsdCA9PSBcIm9iamVjdFwiICYmIHJlc3VsdFskZGF0YV0gPT0gZmFsc2UpIHtcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvdCBzb21lIG90aGVyIHJlc3VsdCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhY3Rpb24gY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbS5hY3Rpb24gPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoYXdhaXQgaXRlbS5hY3Rpb24ocmVzdWx0LCBjb250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGNsb3NlLlxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcm93Wydfb3BlbiddID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZERpYWxvZ3Muc3BsaWNlKHRoaXMuY2hpbGREaWFsb2dzLmluZGV4T2YoZGlhbG9nUmVmKSwgMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgX3MudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNoaWxkRGlhbG9ncy5wdXNoKGRpYWxvZ1JlZik7XG4gICAgICAgIHJldHVybiBkaWFsb2dSZWY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWxcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGZvcm1hdExhYmVsKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gbGFiZWwucmVwbGFjZSgvXyhbYS16MC05XSlfL2ksIChtYXRjaCwgZ3JvdXApID0+IGA8dT4ke2dyb3VwfTwvdT5gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgY29udGV4dCBtZW51IHVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXNcbiAgICAgKi9cbiAgICAvLyBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiLCBbJ2V2ZW50J10pXG4gICAgLy8gQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpibHVyXCIsIFsnZXZlbnQnXSlcbiAgICBjbG9zZShyZXN1bHQ/KSB7XG4gICAgICAgIHRoaXMuY2hpbGREaWFsb2dzLmZvckVhY2goZCA9PiBkLmNsb3NlKCkpXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZShyZXN1bHQpO1xuICAgIH1cblxuICAgIGNsb3NlT25Wb2lkKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTG9ja2VkT3BlbiB8fCBmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSh7WyRkYXRhXTogZm9yY2V9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXJ0SG92ZXJUaW1lcihpdGVtLCByb3cpIHtcblxuICAgICAgICAvLyBJbnZlcnQgY2hlY2sgdG8gbWFrZSB0aGUgbG9naWMgc2ltcGxlclxuICAgICAgICAvLyBUTDtEUjogaWYgKGFueSkgb2YgdGhlc2UgYXJlIHRydWUsIHdlIHdpbGwgZG8gdGhlIGhvdmVyIGFjdGlvblxuICAgICAgICBpZiAoIShcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaXRlbS5jaGlsZHJlbikgJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0eXBlb2YgaXRlbS5jaGlsZHJlbiA9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgICAgIGl0ZW0uY2hpbGRUZW1wbGF0ZSB8fFxuICAgICAgICAgICAgaXRlbS5jaGlsZHJlblJlc29sdmVyXG4gICAgICAgICkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaXRlbVskaG92ZXJdID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgaXRlbVskaG92ZXJdO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMucG9pbnRlcklzT25Wb2lkKSB7XG4gICAgICAgICAgICAgICAgcm93Wydfb3BlbiddID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uTWVudUl0ZW1DbGljayhpdGVtLCByb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLmhvdmVyRGVsYXkpO1xuICAgIH1cbiAgICBzdG9wSG92ZXJUaW1lcihpdGVtKSB7XG4gICAgICAgIGl0ZW1bJGhvdmVyXSAmJiBjbGVhclRpbWVvdXQoaXRlbVskaG92ZXJdKTtcbiAgICAgICAgZGVsZXRlIGl0ZW1bJGhvdmVyXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZGlhbG9nIGlzIGNsaXBwaW5nIG9mZnNjcmVlblxuICAgICAqIGlmIHNvLCBtb3ZlIGl0IGJhY2sgaW50byB2aWV3LlxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIpXG4gICAgcHJpdmF0ZSBvblJlc2l6ZSgpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnZpZXdDb250YWluZXI/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWwpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHgsIHkgfSA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubmd4LW1lbnVcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICAgICAgLy8gTW92ZSBiYWNrIGludG8gdmlldyBpZiB3ZSdyZSBjbGlwcGluZyBvdXRzaWRlIG9mIHRoZSBib3R0b21cbiAgICAgICAgaWYgKHkgKyBoZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1RvcCA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSAoaGVpZ2h0ICsgKHRoaXMuY29uZmlnLmVkZ2VQYWRkaW5nIHx8IDEyKSkpICsgXCJweFwiO1xuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlWydtYXJnaW4tdG9wJ10gPSBuZXdUb3A7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIGJhY2sgaW50byB2aWV3IGlmIHdlJ3JlIGNsaXBwaW5nIG9mZiB0aGUgcmlnaHRcbiAgICAgICAgaWYgKHggKyB3aWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdMZWZ0ID0gKHdpbmRvdy5pbm5lcldpZHRoIC0gKHdpZHRoICsgKHRoaXMuY29uZmlnLmVkZ2VQYWRkaW5nIHx8IDEyKSkpICsgXCJweFwiXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGVbJ21hcmdpbi1sZWZ0J10gPSBuZXdMZWZ0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHZvaWQgZWxlbWVudCBnZXRzIHN0dWNrIG9wZW4sIG1ha2Ugd2hlZWwgZXZlbnRzIHBhc3MgdGhyb3VnaC5cbiAgICBvbldoZWVsKGV2dDogV2hlZWxFdmVudCkge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMudmlld0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuXG4gICAgICAgIHRhcmdldC5zY3JvbGwoe1xuICAgICAgICAgICAgdG9wOiBldnQuZGVsdGFZICsgdGFyZ2V0LnNjcm9sbFRvcCxcbiAgICAgICAgICAgIGxlZnQ6IGV2dC5kZWx0YVggKyB0YXJnZXQuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIGJlaGF2aW9yOiBcInNtb290aFwiXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiPCEtLSBNb3VzZSBldmVudCBibG9ja2VyIGZvciBwb2ludGVyIGxlYXZlIC0tPlxuQGlmIChjb3ZlclJlY3RDb3Jkcykge1xuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJvd25lci1tYXNrXCJcbiAgICAgICAgW3N0eWxlLnRvcF09XCJjb3ZlclJlY3RDb3Jkcy50b3AgKyAncHgnXCJcbiAgICAgICAgW3N0eWxlLmxlZnRdPVwiY292ZXJSZWN0Q29yZHMubGVmdCArICdweCdcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImNvdmVyUmVjdENvcmRzLmhlaWdodCArICdweCdcIlxuICAgICAgICBbc3R5bGUud2lkdGhdPVwiY292ZXJSZWN0Q29yZHMud2lkdGggKyAncHgnXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2hvd0RlYnVnT3ZlcmxheSA/ICcjZjAwNCcgOiAnIzAwMDAnXCJcbiAgICAgICAgc3R5bGU9XCJ6LWluZGV4OiAtMVwiXG4gICAgICAgIChwb2ludGVyZW50ZXIpPVwicG9pbnRlckhhc0JlZW5PdmVyTWFzaz10cnVlXCJcbiAgICAgICAgKGNsaWNrKT1cImlzTG9ja2VkT3BlbiA9IHRydWVcIlxuICAgID48L2Rpdj5cbn1cblxuPGRpdiBjbGFzcz1cInZvaWRcIlxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInNob3dEZWJ1Z092ZXJsYXkgPyAnIzAwZjQnIDogJyMwMDAwJ1wiXG4gICAgKHBvaW50ZXJlbnRlcik9XCJwb2ludGVySXNPblZvaWQgPSB0cnVlOyBoYXNCb290c3RyYXBwZWQgJiYgIWlzTG9ja2VkT3BlbiAmJiBjbG9zZU9uVm9pZCgpXCJcbiAgICAocG9pbnRlcmxlYXZlKT1cInBvaW50ZXJJc09uVm9pZCA9IGZhbHNlXCJcbiAgICAocG9pbnRlcmRvd24pPVwiaGFzQm9vdHN0cmFwcGVkICYmIGNsb3NlT25Wb2lkKHRydWUpXCJcbiAgICAocG9pbnRlcm1vdmUpPVwiaGFzQm9vdHN0cmFwcGVkICYmICFpc0xvY2tlZE9wZW4gJiYgY2xvc2VPblZvaWQoKVwiXG4gICAgKHdoZWVsKT1cIm9uV2hlZWwoJGV2ZW50KVwiXG4+PC9kaXY+XG5cbkBpZiAoIXRlbXBsYXRlKSB7XG4gICAgPHRhYmxlPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBBIHJvdyB3aXRoIGEgY2xpY2sgYWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoaXRlbSAhPSAnc2VwYXJhdG9yJyAmJiBpdGVtLnNlcGFyYXRvciAhPSB0cnVlICYmIGl0ZW1bJ192aXNpYmxlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgPHRyICNyb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpdGVtWydfZGlzYWJsZWQnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIWl0ZW1bJ19kaXNhYmxlZCddICYmIG9uTWVudUl0ZW1DbGljayhpdGVtLCByb3csIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ob3Zlcl09XCJyb3dbJ2hvdmVyJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9wZW5dPVwicm93Wydfb3BlbiddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChwb2ludGVyZW50ZXIpPVwicm93Wydob3ZlciddID0gdHJ1ZTsgc3RhcnRIb3ZlclRpbWVyKGl0ZW0sIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50ZXJsZWF2ZSk9XCJyb3dbJ2hvdmVyJ10gPSBmYWxzZTsgc3RvcEhvdmVyVGltZXIoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0ljb25Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJpY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobWF0SWNvblJ4LnRlc3QoaXRlbVsnX2ljb24nXSA/PyBpdGVtLmljb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaXRlbVsnX2ljb24nXSA/PyBpdGVtLmljb25cIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvbnRJY29uXT1cIml0ZW1bJ19pY29uJ10gPz8gaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiaXRlbS5pY29uQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gJ05vcm1hbCcgYWN0aW9uIGJhc2VkIGl0ZW0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdF09XCJzaG93SWNvbkNvbHVtbiA/IDAgOiAnMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNhbmNob3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFyZ2V0XT1cIml0ZW0ubGlua1RhcmdldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiKGl0ZW1bJ19saW5rJ10gfHwgaXRlbS5saW5rKSA/IHNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGl0ZW1bJ19saW5rJ10gfHwgaXRlbS5saW5rKSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCRhbnkoaXRlbS5sYWJlbFRlbXBsYXRlKT8ucHJvdG90eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShpdGVtKS5sYWJlbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJGltcGxpY2l0JzogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpYWxvZyc6IGRpYWxvZ1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRleHQnOiBpdGVtWydfY29udGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXRlbSc6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50JzogYW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVudSc6IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgkYW55KGl0ZW0pPy5sYWJlbFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3skYW55KGl0ZW0pPy5sYWJlbFRlbXBsYXRlKGRhdGEgfHwge30pfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiaXRlbVsnX2Zvcm1hdHRlZExhYmVsJ11cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd1Nob3J0Y3V0Q29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2hvcnRjdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnNob3J0Y3V0TGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIm1pbi13aWR0aDogMTZweFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW1bJ2NoaWxkcmVuJ10/Lmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbVsnX2NoaWxkcmVuJ10/Lmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkVGVtcGxhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hpbGRyZW4/LlsnY2FsbCddIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkcmVuUmVzb2x2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXRlbVsnX2lzUmVzb2x2aW5nJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogdHJhbnNsYXRlWSgycHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hldnJvbl9yaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbVsnX2lzUmVzb2x2aW5nJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDRweFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGVsc2UgaWYgKGl0ZW0gIT0gJ3NlcGFyYXRvcicgJiYgaXRlbS5zZXBhcmF0b3IgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlcGFyYXRvciB3aXRoIGxhYmVsIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGlzYWJsZWQgc2VwYXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiMiArIChzaG93SWNvbkNvbHVtbiA/IDEgOiAwKSArIChzaG93U2hvcnRjdXRDb2x1bW4gPyAxIDogMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaHJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtWydsYWJlbCddIHx8ICcnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAZWxzZSBpZiAoaXRlbSA9PSAnc2VwYXJhdG9yJykge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlcGFyYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRpc2FibGVkIHNlcGFyYXRvclwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwiMiArIChzaG93SWNvbkNvbHVtbiA/IDEgOiAwKSArIChzaG93U2hvcnRjdXRDb2x1bW4gPyAxIDogMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoci8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxufVxuQGVsc2Uge1xuICAgIEBpZiAodGVtcGxhdGVUeXBlID09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAnJGltcGxpY2l0JzogZGF0YSxcbiAgICAgICAgICAgICAgICAnZGlhbG9nJzogZGlhbG9nUmVmLFxuICAgICAgICAgICAgICAgICdjb250ZXh0JzogcGFyZW50Q29udGV4dCxcbiAgICAgICAgICAgICAgICAnaXRlbSc6IHBhcmVudEl0ZW0sXG4gICAgICAgICAgICAgICAgJ2VsZW1lbnQnOiB0aGlzLnZpZXdDb250YWluZXI/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgJ21lbnUnOiB0aGlzXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgLz5cbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbY2RrUG9ydGFsT3V0bGV0XT1cImNvbXBvbmVudFBvcnRhbFwiXG4gICAgICAgIC8+XG4gICAgfVxufVxuXG5AaWYgKHNob3dEZWJ1Z092ZXJsYXkpIHtcbiAgICA8ZGl2PlxuICAgICAgICA8ZGl2Pmhiczoge3toYXNCb290c3RyYXBwZWR9fTwvZGl2PlxuICAgICAgICA8ZGl2PnBvdjoge3twb2ludGVySXNPblZvaWR9fTwvZGl2PlxuICAgICAgICA8ZGl2Pmlsbzoge3tpc0xvY2tlZE9wZW59fTwvZGl2PlxuICAgICAgICA8ZGl2Pmhib206IHt7cG9pbnRlckhhc0JlZW5PdmVyTWFza319PC9kaXY+XG5cbiAgICAgICAgPGRpdj50eXBlOiB7e3RlbXBsYXRlVHlwZX19PC9kaXY+XG4gICAgPC9kaXY+XG59XG4iXX0=
417
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxRQUFRLEVBQUUsV0FBVyxFQUEwQixNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEVBQWdCLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUUsT0FBTyxFQUEyQixlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7O0FBR3RFLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFakYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLFNBQXFCLEVBQUUsT0FBWSxFQUFFLEVBQUU7SUFDNUUsTUFBTSxJQUFJLEdBQUc7UUFD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VUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsT0FBTSxDQUFDLEVBQUUsQ0FBQztvQkFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUFDLENBQUM7WUFFdkcsSUFBSSxPQUFPLENBQUMsQ0FBQyxTQUFTLElBQUksVUFBVTtnQkFDaEMsSUFBSSxDQUFDO29CQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUFDLENBQUM7WUFFdEcsSUFBSSxPQUFPLENBQUMsQ0FBQyxZQUFZLElBQUksVUFBVTtnQkFDbkMsSUFBSSxDQUFDO29CQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUFDLENBQUM7WUFFdEcsSUFBSSxPQUFPLENBQUMsQ0FBQyxZQUFZLElBQUksVUFBVTtnQkFDbkMsSUFBSSxDQUFDO29CQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFBQyxPQUFPLENBQUMsSUFB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Z0IsbUpBQ2hCLFlBQVksaU1BQ1osYUFBYSxtTEFDYix3QkFBd0I7OzJGQUtuQixhQUFhO2tCQWJ6QixTQUFTOytCQUNJLFVBQVUsV0FHWDt3QkFDTCxnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osYUFBYTt3QkFDYix3QkFBd0I7d0JBQ3hCLGdCQUFnQjtxQkFDbkIsY0FDVyxJQUFJOzswQkEyQ1gsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlOzswQkFDbEMsUUFBUTs7MEJBQ1IsUUFBUTt5Q0F6Q0csSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBQ1UsRUFBRTtzQkFBakIsS0FBSztnQkFDVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkEwVEUsUUFBUTtzQkFEZixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBUZW1wbGF0ZVJlZiwgVHlwZSwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBjcmVhdGVBcHBsaWNhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcblxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBQb3J0YWxNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNZW51SXRlbSwgTWVudU9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9tZW51JztcbmltcG9ydCB7IFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3Rvb2x0aXAuZGlyZWN0aXZlJztcblxuZGVjbGFyZSBjb25zdCBab25lOiBhbnk7XG5jb25zdCB6b25lID0gbmV3IFpvbmUoWm9uZS5jdXJyZW50LCB7IG5hbWU6IFwiQGRvdGdsaXRjaF9tZW51XCIsIHByb3BlcnRpZXM6IHt9IH0pO1xuXG5leHBvcnQgY29uc3QgY2FsY01lbnVJdGVtQm91bmRzID0gYXN5bmMgKG1lbnVJdGVtczogTWVudUl0ZW1bXSwgZGF0YU9iajogYW55KSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgZGF0YTogZGF0YU9iaixcbiAgICAgICAgaXRlbXM6IG1lbnVJdGVtcyxcbiAgICAgICAgY29uZmlnOiB7fSxcbiAgICAgICAgc2VsZkNvcmRzOiB7IGxlZnQ6IFwiMHB4XCIsIHRvcDogXCIwcHhcIiB9LFxuICAgICAgICBvd25lckNvcmRzOiB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSxcbiAgICAgICAgaWQ6IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gY2FsY0NvbXBvbmVudEJvdW5kcyhNZW51Q29tcG9uZW50LCBkYXRhKTtcbn1cblxuY29uc3QgY2FsY0NvbXBvbmVudEJvdW5kcyA9IGFzeW5jIChjb21wb25lbnQ6IFR5cGU8YW55PiwgZGF0YTogYW55KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPERPTVJlY3Q+KChyZXMsIHJlaikgPT4ge1xuICAgICAgICB6b25lLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHBsaWNhdGlvbih7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTUFUX0RJQUxPR19EQVRBLCB1c2VWYWx1ZTogZGF0YSB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBkZWwuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gICAgICAgICAgICBkZWwuc3R5bGUubGVmdCA9ICctMTAwMHZ3JztcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRlbCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBhcHAuYm9vdHN0cmFwKGNvbXBvbmVudCwgZGVsKTtcbiAgICAgICAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGJhc2U7XG5cbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKGFwcC5pc1N0YWJsZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCA9IGluc3RhbmNlLnZpZXdDb250YWluZXI/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGFwcC5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWwucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIHJlcyhyZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfSlcbn1cblxuY29uc3QgJGRhdGEgPSBTeW1ib2woXCJkYXRhXCIpO1xuY29uc3QgJGhvdmVyID0gU3ltYm9sKFwiaG92ZXJcIik7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LW1lbnUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tZW51LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBQb3J0YWxNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcbiAgICAgICAgVG9vbHRpcERpcmVjdGl2ZVxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRhOiBhbnk7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zOiBNZW51SXRlbVtdO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IE1lbnVPcHRpb25zO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvdmVybGF5T3ZlcmxhcCA9IDMyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBob3ZlckRlbGF5ID0gNDAwO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93RGVidWdPdmVybGF5ID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSBvd25lckNvcmRzOiBET01SZWN0O1xuICAgIEBJbnB1dCgpIHNlbGZDb3JkcztcbiAgICBASW5wdXQoKSBwYXJlbnRJdGVtO1xuICAgIEBJbnB1dCgpIHBhcmVudENvbnRleHQ7XG4gICAgQElucHV0KCkgaXNMb2NrZWRPcGVuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgaGFzQm9vdHN0cmFwcGVkID0gZmFsc2U7XG4gICAgcHVibGljIHBvaW50ZXJJc09uVm9pZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBwb2ludGVySGFzQmVlbk92ZXJNYXNrID0gZmFsc2U7XG4gICAgcGFyZW50SXNOZ3hNZW51ID0gZmFsc2U7XG5cbiAgICBjb3ZlclJlY3RDb3JkcyA9IHtcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHdpZHRoOiAwXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBzbGFzaGVzIG9yIGRvdHMgLS0gdGhhdCB3aWxsIGNsZWFybHkgZXhjbHVkZSBpdCBmcm9tIGJlaW5nIGEgbWF0IGljb25cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWF0SWNvblJ4ID0gL1tcXC9cXC5dL2k7XG4gICAgc2hvd0ljb25Db2x1bW4gPSB0cnVlO1xuICAgIHNob3dTaG9ydGN1dENvbHVtbiA9IHRydWU7XG5cbiAgICB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICB0ZW1wbGF0ZVR5cGU6IFwidGVtcGxhdGVcIiB8IFwiY29tcG9uZW50XCI7XG4gICAgY29tcG9uZW50UG9ydGFsOiBDb21wb25lbnRQb3J0YWw8YW55PjtcbiAgICBwcml2YXRlIGNoaWxkRGlhbG9nczogTWF0RGlhbG9nUmVmPGFueT5bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcml2YXRlIF9kYXRhOiBhbnksXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgLy8gb3B0aW9uYWwgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgZXN0aW1hdGluZyBkaW1lbnNpb25zXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnk+XG4gICAgKSB7XG4gICAgICAgIC8vIERlZmF1bHRzIGFyZSBzZXQgYmVmb3JlIEBJbnB1dCgpIGhvb2tzIGV2YWx1YXRlXG4gICAgICAgIHRoaXMuZGlhbG9nID0gdGhpcy5kaWFsb2cgfHwgdGhpcy5fZGF0YT8uZGlhbG9nO1xuICAgICAgICB0aGlzLmRhdGEgID0gdGhpcy5fZGF0YT8uZGF0YTtcbiAgICAgICAgdGhpcy5vd25lckNvcmRzID0gdGhpcy5fZGF0YT8ub3duZXJDb3JkcztcbiAgICAgICAgdGhpcy5zZWxmQ29yZHMgPSB0aGlzLl9kYXRhPy5zZWxmQ29yZHM7XG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLl9kYXRhPy5pdGVtcztcbiAgICAgICAgdGhpcy5jb25maWcgPSB0aGlzLl9kYXRhPy5jb25maWc7XG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLl9kYXRhPy5pZDtcbiAgICAgICAgdGhpcy5wYXJlbnRJdGVtID0gdGhpcy5fZGF0YT8ucGFyZW50SXRlbTtcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gdGhpcy5fZGF0YT8ucGFyZW50Q29udGV4dDtcbiAgICAgICAgdGhpcy5pc0xvY2tlZE9wZW4gPSB0aGlzLmlzTG9ja2VkT3BlbiB8fCB0aGlzLl9kYXRhPy5jb25maWc/LlsnX2lzTG9ja2VkT3BlbiddO1xuICAgICAgICB0aGlzLnBhcmVudElzTmd4TWVudSA9IHRoaXMuX2RhdGE/LnBhcmVudElzTmd4TWVudTtcblxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gX2RhdGEudGVtcGxhdGU7XG5cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGUgPSB0aGlzLnRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgPyBcInRlbXBsYXRlXCIgOiBcImNvbXBvbmVudFwiO1xuXG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlVHlwZSA9PSBcImNvbXBvbmVudFwiKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwodGhpcy50ZW1wbGF0ZSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG5cbiAgICAgICAgdGhpcy5pdGVtcz8uZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaSA9PSBcInN0cmluZ1wiKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0c1xuICAgICAgICAgICAgaVsnX2Rpc2FibGVkJ10gPSBmYWxzZTtcbiAgICAgICAgICAgIGlbJ192aXNpYmxlJ10gPSB0cnVlO1xuICAgICAgICAgICAgaVsnX2NvbnRleHQnXSA9ICh0eXBlb2YgaS5jb250ZXh0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpLmNvbnRleHQodGhpcy5kYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGkuY29udGV4dDtcblxuICAgICAgICAgICAgaWYgKGkubGFiZWwpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX2Zvcm1hdHRlZExhYmVsJ10gPSB0aGlzLmZvcm1hdExhYmVsKGkubGFiZWwpOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5pc0Rpc2FibGVkID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICB0cnkgeyBpWydfZGlzYWJsZWQnXSA9IGkuaXNEaXNhYmxlZCh0aGlzLmRhdGEgfHwge30sIGlbJ19jb250ZXh0J10pOyB9IGNhdGNoKGUpIHsgY29uc29sZS53YXJuKGUpIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpLmlzVmlzaWJsZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX3Zpc2libGUnXSA9IGkuaXNWaXNpYmxlKHRoaXMuZGF0YSB8fCB7fSwgaVsnX2NvbnRleHQnXSk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKGUpIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpLmxpbmtUZW1wbGF0ZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX2xpbmsnXSA9IGkubGlua1RlbXBsYXRlKHRoaXMuZGF0YSB8fCB7fSwgaVsnX2NvbnRleHQnXSk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKGUpIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpLmljb25UZW1wbGF0ZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX2ljb24nXSA9IGkuaWNvblRlbXBsYXRlKHRoaXMuZGF0YSB8fCB7fSwgaVsnX2NvbnRleHQnXSk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKGUpOyB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNob3cgdGhlIGljb24gY29sdW1uIGlmIHRoZXJlIGFyZSBhbnkgaXRlbXMgd2l0aCBhbiBpY29uXG4gICAgICAgIHRoaXMuc2hvd0ljb25Db2x1bW4gPSAhIXRoaXMuaXRlbXM/LmZpbmQoaSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpID09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgaVsnaWNvbiddID09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBpWydpY29uJ10ubGVuZ3RoID4gMlxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNob3dTaG9ydGN1dENvbHVtbiA9ICEhdGhpcy5pdGVtcz8uZmluZChpID0+XG4gICAgICAgICAgICAgICAgdHlwZW9mIGkgPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpWydzaG9ydGN1dCddID09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBpWydzaG9ydGN1dCddLmxlbmd0aCA+IDJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMub3duZXJDb3Jkcykge1xuICAgICAgICAgICAgY29uc3Qgc2VsZlkgPSBwYXJzZUludCh0aGlzLnNlbGZDb3Jkcy50b3A/LnJlcGxhY2UoJ3B4JywgJycpIHx8ICcwJyk7XG4gICAgICAgICAgICBjb25zdCBzZWxmWCA9IHBhcnNlSW50KHRoaXMuc2VsZkNvcmRzLmxlZnQ/LnJlcGxhY2UoJ3B4JywgJycpIHx8ICcwJyk7XG5cbiAgICAgICAgICAgIHRoaXMuY292ZXJSZWN0Q29yZHMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiB0aGlzLm93bmVyQ29yZHMueSAtIHNlbGZZIC0gKHRoaXMub3ZlcmxheU92ZXJsYXAvMiksXG4gICAgICAgICAgICAgICAgbGVmdDogdGhpcy5vd25lckNvcmRzLnggLSBzZWxmWCAtICh0aGlzLm92ZXJsYXlPdmVybGFwLzIpLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5vd25lckNvcmRzLmhlaWdodCArIHRoaXMub3ZlcmxheU92ZXJsYXAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMub3duZXJDb3Jkcy53aWR0aCArIHRoaXMub3ZlcmxheU92ZXJsYXBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNCb290c3RyYXBwZWQgPSB0cnVlO1xuICAgICAgICB9LCAyMDApO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnZpZXdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldnQgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0xvY2tlZE9wZW4gPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGV2dCA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzTG9ja2VkT3BlbiA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hcIiwgZXZ0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNMb2NrZWRPcGVuID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuY2hpbGREaWFsb2dzLmZvckVhY2goZCA9PiBkLmNsb3NlKHtbJGRhdGFdOiB0cnVlfSkpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbVxuICAgICAqIEBwYXJhbSBldnRcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGFzeW5jIG9uTWVudUl0ZW1DbGljayhpdGVtOiBNZW51SXRlbSwgcm93OiBIVE1MVGFibGVSb3dFbGVtZW50LCBrZWVwT3BlbiA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChpdGVtLnNlcGFyYXRvcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IGF3YWl0IGl0ZW1bJ19jb250ZXh0J107XG5cbiAgICAgICAgLy8gSWYgY2FjaGUgaXMgZW5hYmxlZCwgb25seSBsb2FkIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuLlxuICAgICAgICBjb25zdCBmb3JjZUxvYWQgPSAoaXRlbS5jYWNoZVJlc29sdmVkQ2hpbGRyZW4gPyAhaXRlbS5jaGlsZHJlbiA6IHRydWUpO1xuXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuUmVzb2x2ZXIgJiYgZm9yY2VMb2FkKSB7XG4gICAgICAgICAgICBpdGVtWydfaXNSZXNvbHZpbmcnXSA9IHRydWU7XG4gICAgICAgICAgICBpdGVtWydfY2hpbGRyZW4nXSA9IGF3YWl0IGl0ZW0uY2hpbGRyZW5SZXNvbHZlcih0aGlzLmRhdGEsIGNvbnRleHQpO1xuICAgICAgICAgICAgaXRlbVsnX2lzUmVzb2x2aW5nJ10gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgaXRlbS5jaGlsZHJlbiA9PSBcImZ1bmN0aW9uXCIgJiYgZm9yY2VMb2FkKSB7XG4gICAgICAgICAgICBpdGVtWydfaXNSZXNvbHZpbmcnXSA9IHRydWU7XG4gICAgICAgICAgICBpdGVtWydfY2hpbGRyZW4nXSA9IGF3YWl0IGl0ZW0uY2hpbGRyZW4odGhpcy5kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGl0ZW1bJ19pc1Jlc29sdmluZyddID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtWydfY2hpbGRyZW4nXSA9IGl0ZW0uY2hpbGRyZW47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbVsnX2NoaWxkcmVuJ10gfHwgaXRlbS5jaGlsZFRlbXBsYXRlKVxuICAgICAgICAgICAgcm93Wydfb3BlbiddID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWl0ZW0uY2hpbGRUZW1wbGF0ZSAmJiAhaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtLmFjdGlvbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBpdGVtLmFjdGlvbih0aGlzLmRhdGEsIGNvbnRleHQpXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZShyZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGFjdGlvbiwgdGhpcyBpcyBzaW1wbHkgYSB0ZXh0IGl0ZW0uXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5lZWQgWCBwb3MsIFkgcG9zLCB3aWR0aCBhbmQgaGVpZ2h0XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IHJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCBjb3JkcyA9IHtcbiAgICAgICAgICAgIHRvcDogbnVsbCxcbiAgICAgICAgICAgIGxlZnQ6IG51bGwsXG4gICAgICAgICAgICBib3R0b206IG51bGwsXG4gICAgICAgICAgICByaWdodDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldCBwb3NpdGlvbiBjb29yZGluYXRlc1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGF3YWl0IChpdGVtLmNoaWxkVGVtcGxhdGVcbiAgICAgICAgICAgID8gY2FsY0NvbXBvbmVudEJvdW5kcyhNZW51Q29tcG9uZW50LCB7IHRlbXBsYXRlOiBpdGVtLmNoaWxkVGVtcGxhdGUgfSlcbiAgICAgICAgICAgIDogY2FsY01lbnVJdGVtQm91bmRzKGl0ZW1bJ19jaGlsZHJlbiddLCB0aGlzLmRhdGEpKTtcblxuICAgICAgICBpZiAoYm91bmRzLnkgKyBoZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpXG4gICAgICAgICAgICBjb3Jkcy5ib3R0b20gPSBcIjBweFwiO1xuICAgICAgICBpZiAoYm91bmRzLnggKyBib3VuZHMud2lkdGggKyB3aWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKVxuICAgICAgICAgICAgY29yZHMubGVmdCA9ICgoYm91bmRzLnggLSB3aWR0aCkpICsgXCJweFwiO1xuXG4gICAgICAgIGlmICghY29yZHMuYm90dG9tKSBjb3Jkcy50b3AgID0gYm91bmRzLnkgKyBcInB4XCI7XG4gICAgICAgIGlmICghY29yZHMubGVmdCkgICBjb3Jkcy5sZWZ0ID0gYm91bmRzLnggKyBib3VuZHMud2lkdGggKyBcInB4XCI7XG5cblxuICAgICAgICBjb25zdCBjb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5jb25maWcpXG4gICAgICAgIGNvbmZpZ1snX2lzTG9ja2VkT3BlbiddID0ga2VlcE9wZW47XG5cbiAgICAgICAgLy8gRG8gbm90IHByb2plY3QgaW4gdGhlIHRvcCBsZWZ0IGNvcm5lciAtLSB0aGlzIHNjZW5hcmlvXG4gICAgICAgIC8vIGhhcHBlbnMgd2hlbiBhIGRpYWxvZyBvcGVucyBhcyB0aGUgcGFyZW50IGlzIGtpbGxlZC5cbiAgICAgICAgaWYgKGNvcmRzLmxlZnQgPT0gMCAmJiBjb3Jkcy50b3AgPT0gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE1lbnVDb21wb25lbnQsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb3JkcyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFtcIm5neC1tZW51XCJdLmNvbmNhdCh0aGlzLmNvbmZpZz8uY3VzdG9tQ2xhc3MgfHwgW10pLFxuICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogXCJuZ3gtbWVudS1iYWNrZHJvcFwiLFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgICAgICAgICAgICBvd25lckNvcmRzOiByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgc2VsZkNvcmRzOiBjb3JkcyxcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtOiBpdGVtLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbnRleHQ6IGNvbnRleHQsXG4gICAgICAgICAgICAgICAgaXRlbXM6IGl0ZW1bJ19jaGlsZHJlbiddLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBpdGVtLmNoaWxkVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgY29uZmlnOiBjb25maWcsXG4gICAgICAgICAgICAgICAgcGFyZW50SXNOZ3hNZW51OiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBfcyA9IGRpYWxvZ1JlZlxuICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xpY2tlZCBcInZvaWRcIiBvbiBhIHN1Ym1lbnVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT0gXCJvYmplY3RcIiAmJiByZXN1bHRbJGRhdGFdID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBXZW50IGJhY2sgdG8gcGFyZW50IG1lbnUgLS0gZG8gbm90IGNsb3NlIChzYW1lIGFzIHJlc3VsdCA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09IFwib2JqZWN0XCIgJiYgcmVzdWx0WyRkYXRhXSA9PSBmYWxzZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gR290IHNvbWUgb3RoZXIgcmVzdWx0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIGFjdGlvbiBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtLmFjdGlvbiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZShhd2FpdCBpdGVtLmFjdGlvbihyZXN1bHQsIGNvbnRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgY2xvc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByb3dbJ19vcGVuJ10gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkRGlhbG9ncy5zcGxpY2UodGhpcy5jaGlsZERpYWxvZ3MuaW5kZXhPZihkaWFsb2dSZWYpLCAxKTtcblxuICAgICAgICAgICAgICAgICAgICBfcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2hpbGREaWFsb2dzLnB1c2goZGlhbG9nUmVmKTtcbiAgICAgICAgcmV0dXJuIGRpYWxvZ1JlZjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbFxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZm9ybWF0TGFiZWwobGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBsYWJlbC5yZXBsYWNlKC9fKFthLXowLTldKV8vaSwgKG1hdGNoLCBncm91cCkgPT4gYDx1PiR7Z3JvdXB9PC91PmApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjb250ZXh0IG1lbnUgdW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlc1xuICAgICAqL1xuICAgIC8vIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIsIFsnZXZlbnQnXSlcbiAgICAvLyBASG9zdExpc3RlbmVyKFwid2luZG93OmJsdXJcIiwgWydldmVudCddKVxuICAgIGNsb3NlKHJlc3VsdD8pIHtcbiAgICAgICAgdGhpcy5jaGlsZERpYWxvZ3MuZm9yRWFjaChkID0+IGQuY2xvc2UoKSlcbiAgICAgICAgdGhpcy5kaWFsb2dSZWY/LmNsb3NlKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgY2xvc2VPblZvaWQoZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NrZWRPcGVuIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKHtbJGRhdGFdOiBmb3JjZX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhcnRIb3ZlclRpbWVyKGl0ZW0sIHJvdykge1xuICAgICAgICB0aGlzLmNoaWxkRGlhbG9ncy5mb3JFYWNoKGNkID0+IGNkLmNsb3NlKCkpO1xuXG4gICAgICAgIC8vIEludmVydCBjaGVjayB0byBtYWtlIHRoZSBsb2dpYyBzaW1wbGVyXG4gICAgICAgIC8vIFRMO0RSOiBpZiAoYW55KSBvZiB0aGVzZSBhcmUgdHJ1ZSwgd2Ugd2lsbCBkbyB0aGUgaG92ZXIgYWN0aW9uXG4gICAgICAgIGlmICghKFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtLmNoaWxkcmVuKSAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIHR5cGVvZiBpdGVtLmNoaWxkcmVuID09IFwiZnVuY3Rpb25cIiB8fFxuICAgICAgICAgICAgaXRlbS5jaGlsZFRlbXBsYXRlIHx8XG4gICAgICAgICAgICBpdGVtLmNoaWxkcmVuUmVzb2x2ZXJcbiAgICAgICAgKSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpdGVtWyRob3Zlcl0gPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBpdGVtWyRob3Zlcl07XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5wb2ludGVySXNPblZvaWQpIHtcbiAgICAgICAgICAgICAgICByb3dbJ19vcGVuJ10gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMub25NZW51SXRlbUNsaWNrKGl0ZW0sIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuaG92ZXJEZWxheSk7XG4gICAgfVxuXG4gICAgc3RvcEhvdmVyVGltZXIoaXRlbSkge1xuICAgICAgICBpdGVtWyRob3Zlcl0gJiYgY2xlYXJUaW1lb3V0KGl0ZW1bJGhvdmVyXSk7XG4gICAgICAgIGRlbGV0ZSBpdGVtWyRob3Zlcl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGRpYWxvZyBpcyBjbGlwcGluZyBvZmZzY3JlZW5cbiAgICAgKiBpZiBzbywgbW92ZSBpdCBiYWNrIGludG8gdmlldy5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiKVxuICAgIHByaXZhdGUgb25SZXNpemUoKSB7XG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy52aWV3Q29udGFpbmVyPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCB4LCB5IH0gPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLm5neC1tZW51XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIE1vdmUgYmFjayBpbnRvIHZpZXcgaWYgd2UncmUgY2xpcHBpbmcgb3V0c2lkZSBvZiB0aGUgYm90dG9tXG4gICAgICAgIGlmICh5ICsgaGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdUb3AgPSAod2luZG93LmlubmVySGVpZ2h0IC0gKGhlaWdodCArICh0aGlzLmNvbmZpZy5lZGdlUGFkZGluZyB8fCAxMikpKSArIFwicHhcIjtcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZVsnbWFyZ2luLXRvcCddID0gbmV3VG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSBiYWNrIGludG8gdmlldyBpZiB3ZSdyZSBjbGlwcGluZyBvZmYgdGhlIHJpZ2h0XG4gICAgICAgIGlmICh4ICsgd2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgbmV3TGVmdCA9ICh3aW5kb3cuaW5uZXJXaWR0aCAtICh3aWR0aCArICh0aGlzLmNvbmZpZy5lZGdlUGFkZGluZyB8fCAxMikpKSArIFwicHhcIlxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlWydtYXJnaW4tbGVmdCddID0gbmV3TGVmdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSB2b2lkIGVsZW1lbnQgZ2V0cyBzdHVjayBvcGVuLCBtYWtlIHdoZWVsIGV2ZW50cyBwYXNzIHRocm91Z2guXG4gICAgb25XaGVlbChldnQ6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnZpZXdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuICAgICAgICB0YXJnZXQuc2Nyb2xsKHtcbiAgICAgICAgICAgIHRvcDogZXZ0LmRlbHRhWSArIHRhcmdldC5zY3JvbGxUb3AsXG4gICAgICAgICAgICBsZWZ0OiBldnQuZGVsdGFYICsgdGFyZ2V0LnNjcm9sbExlZnQsXG4gICAgICAgICAgICBiZWhhdmlvcjogXCJzbW9vdGhcIlxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsIjwhLS0gTW91c2UgZXZlbnQgYmxvY2tlciBmb3IgcG9pbnRlciBsZWF2ZSAtLT5cbkBpZiAoY292ZXJSZWN0Q29yZHMgJiYgIXBhcmVudElzTmd4TWVudSkge1xuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJvd25lci1tYXNrXCJcbiAgICAgICAgW3N0eWxlLnRvcF09XCJjb3ZlclJlY3RDb3Jkcy50b3AgKyAncHgnXCJcbiAgICAgICAgW3N0eWxlLmxlZnRdPVwiY292ZXJSZWN0Q29yZHMubGVmdCArICdweCdcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImNvdmVyUmVjdENvcmRzLmhlaWdodCArICdweCdcIlxuICAgICAgICBbc3R5bGUud2lkdGhdPVwiY292ZXJSZWN0Q29yZHMud2lkdGggKyAncHgnXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2hvd0RlYnVnT3ZlcmxheSA/ICcjZjAwNCcgOiAnIzAwMDAnXCJcbiAgICAgICAgc3R5bGU9XCJ6LWluZGV4OiAtMVwiXG4gICAgICAgIChwb2ludGVyZW50ZXIpPVwicG9pbnRlckhhc0JlZW5PdmVyTWFzaz10cnVlXCJcbiAgICAgICAgKHBvaW50ZXJtb3ZlKT1cInBvaW50ZXJIYXNCZWVuT3Zlck1hc2s9dHJ1ZVwiXG4gICAgICAgIChjbGljayk9XCJpc0xvY2tlZE9wZW4gPSB0cnVlXCJcbiAgICA+PC9kaXY+XG59XG5cbkBpZiAoIXBhcmVudElzTmd4TWVudSkge1xuICAgIDxkaXYgY2xhc3M9XCJ2b2lkXCJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2hvd0RlYnVnT3ZlcmxheSA/ICcjMDBmNCcgOiAnIzAwMDAnXCJcbiAgICAgICAgKHBvaW50ZXJlbnRlcik9XCJwb2ludGVySXNPblZvaWQgPSB0cnVlOyBoYXNCb290c3RyYXBwZWQgJiYgIWlzTG9ja2VkT3BlbiAmJiBjbG9zZU9uVm9pZCgpXCJcbiAgICAgICAgKHBvaW50ZXJsZWF2ZSk9XCJwb2ludGVySXNPblZvaWQgPSBmYWxzZVwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJoYXNCb290c3RyYXBwZWQgJiYgY2xvc2VPblZvaWQodHJ1ZSlcIlxuICAgICAgICAocG9pbnRlcm1vdmUpPVwiaGFzQm9vdHN0cmFwcGVkICYmICFpc0xvY2tlZE9wZW4gJiYgY2xvc2VPblZvaWQoKVwiXG4gICAgICAgIChjbGljayk9XCJjbG9zZU9uVm9pZCh0cnVlKVwiXG4gICAgICAgICh3aGVlbCk9XCJvbldoZWVsKCRldmVudClcIlxuICAgID48L2Rpdj5cbn1cblxuQGlmICghdGVtcGxhdGUpIHtcbiAgICA8dGFibGU+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICA8IS0tIEEgcm93IHdpdGggYSBjbGljayBhY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtICE9ICdzZXBhcmF0b3InICYmIGl0ZW0uc2VwYXJhdG9yICE9IHRydWUgJiYgaXRlbVsnX3Zpc2libGUnXSkge1xuICAgICAgICAgICAgICAgICAgICA8dHIgI3Jvd1xuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIml0ZW1bJ19kaXNhYmxlZCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhaXRlbVsnX2Rpc2FibGVkJ10gJiYgb25NZW51SXRlbUNsaWNrKGl0ZW0sIHJvdywgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhvdmVyXT1cInJvd1snaG92ZXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3Blbl09XCJyb3dbJ19vcGVuJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50ZXJlbnRlcik9XCJyb3dbJ2hvdmVyJ10gPSB0cnVlOyBzdGFydEhvdmVyVGltZXIoaXRlbSwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAocG9pbnRlcmxlYXZlKT1cInJvd1snaG92ZXInXSA9IGZhbHNlOyBzdG9wSG92ZXJUaW1lcihpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93SWNvbkNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtYXRJY29uUngudGVzdChpdGVtWydfaWNvbiddID8/IGl0ZW0uaWNvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpdGVtWydfaWNvbiddID8/IGl0ZW0uaWNvblwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9udEljb25dPVwiaXRlbVsnX2ljb24nXSA/PyBpdGVtLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJpdGVtLmljb25Db2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAnTm9ybWFsJyBhY3Rpb24gYmFzZWQgaXRlbSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy1sZWZ0XT1cInNob3dJY29uQ29sdW1uID8gMCA6ICcxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2FuY2hvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YXJnZXRdPVwiaXRlbS5saW5rVGFyZ2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaHJlZl09XCIoaXRlbVsnX2xpbmsnXSB8fCBpdGVtLmxpbmspID8gc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwoaXRlbVsnX2xpbmsnXSB8fCBpdGVtLmxpbmspIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoJGFueShpdGVtLmxhYmVsVGVtcGxhdGUpPy5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGl0ZW0pLmxhYmVsVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICckaW1wbGljaXQnOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlhbG9nJzogZGlhbG9nUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGV4dCc6IGl0ZW1bJ19jb250ZXh0J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdGVtJzogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnQnOiBhbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZW51JzogdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCRhbnkoaXRlbSk/LmxhYmVsVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyRhbnkoaXRlbSk/LmxhYmVsVGVtcGxhdGUoZGF0YSB8fCB7fSl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJpdGVtWydfZm9ybWF0dGVkTGFiZWwnXVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93U2hvcnRjdXRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJzaG9ydGN1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uc2hvcnRjdXRMYWJlbH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwibWluLXdpZHRoOiAxNnB4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbVsnY2hpbGRyZW4nXT8ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtWydfY2hpbGRyZW4nXT8ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hpbGRUZW1wbGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jaGlsZHJlbj8uWydjYWxsJ10gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY2hpbGRyZW5SZXNvbHZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpdGVtWydfaXNSZXNvbHZpbmcnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB0cmFuc2xhdGVZKDJweClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGV2cm9uX3JpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtWydfaXNSZXNvbHZpbmcnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaWFtZXRlcl09XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogNHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAZWxzZSBpZiAoaXRlbSAhPSAnc2VwYXJhdG9yJyAmJiBpdGVtLnNlcGFyYXRvciA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VwYXJhdG9yIHdpdGggbGFiZWwgLS0+XG4gICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkaXNhYmxlZCBzZXBhcmF0b3JcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCIyICsgKHNob3dJY29uQ29sdW1uID8gMSA6IDApICsgKHNob3dTaG9ydGN1dENvbHVtbiA/IDEgOiAwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW1bJ2xhYmVsJ10gfHwgJyd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBlbHNlIGlmIChpdGVtID09ICdzZXBhcmF0b3InKSB7XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VwYXJhdG9yIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGlzYWJsZWQgc2VwYXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCIyICsgKHNob3dJY29uQ29sdW1uID8gMSA6IDApICsgKHNob3dTaG9ydGN1dENvbHVtbiA/IDEgOiAwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGhyLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG59XG5AZWxzZSB7XG4gICAgQGlmICh0ZW1wbGF0ZVR5cGUgPT0gJ3RlbXBsYXRlJykge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICckaW1wbGljaXQnOiBkYXRhLFxuICAgICAgICAgICAgICAgICdkaWFsb2cnOiBkaWFsb2dSZWYsXG4gICAgICAgICAgICAgICAgJ2NvbnRleHQnOiBwYXJlbnRDb250ZXh0LFxuICAgICAgICAgICAgICAgICdpdGVtJzogcGFyZW50SXRlbSxcbiAgICAgICAgICAgICAgICAnZWxlbWVudCc6IHRoaXMudmlld0NvbnRhaW5lcj8uZWxlbWVudD8ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAnbWVudSc6IHRoaXNcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAvPlxuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtjZGtQb3J0YWxPdXRsZXRdPVwiY29tcG9uZW50UG9ydGFsXCJcbiAgICAgICAgLz5cbiAgICB9XG59XG5cbkBpZiAoc2hvd0RlYnVnT3ZlcmxheSkge1xuICAgIDxkaXY+XG4gICAgICAgIDxkaXY+aGJzOiB7e2hhc0Jvb3RzdHJhcHBlZH19PC9kaXY+XG4gICAgICAgIDxkaXY+cG92OiB7e3BvaW50ZXJJc09uVm9pZH19PC9kaXY+XG4gICAgICAgIDxkaXY+aWxvOiB7e2lzTG9ja2VkT3Blbn19PC9kaXY+XG4gICAgICAgIDxkaXY+aGJvbToge3twb2ludGVySGFzQmVlbk92ZXJNYXNrfX08L2Rpdj5cblxuICAgICAgICA8ZGl2PnR5cGU6IHt7dGVtcGxhdGVUeXBlfX08L2Rpdj5cbiAgICA8L2Rpdj5cbn1cbiJdfQ==
@@ -515,6 +515,7 @@ class MenuComponent {
515
515
  this.hasBootstrapped = false;
516
516
  this.pointerIsOnVoid = false;
517
517
  this.pointerHasBeenOverMask = false;
518
+ this.parentIsNgxMenu = false;
518
519
  this.coverRectCords = {
519
520
  top: 0,
520
521
  left: 0,
@@ -537,6 +538,7 @@ class MenuComponent {
537
538
  this.parentItem = this._data?.parentItem;
538
539
  this.parentContext = this._data?.parentContext;
539
540
  this.isLockedOpen = this.isLockedOpen || this._data?.config?.['_isLockedOpen'];
541
+ this.parentIsNgxMenu = this._data?.parentIsNgxMenu;
540
542
  this.template = _data.template;
541
543
  this.templateType = this.template instanceof TemplateRef ? "template" : "component";
542
544
  if (this.templateType == "component") {
@@ -686,6 +688,10 @@ class MenuComponent {
686
688
  cords.left = bounds.x + bounds.width + "px";
687
689
  const config = structuredClone(this.config);
688
690
  config['_isLockedOpen'] = keepOpen;
691
+ // Do not project in the top left corner -- this scenario
692
+ // happens when a dialog opens as the parent is killed.
693
+ if (cords.left == 0 && cords.top == 0)
694
+ return;
689
695
  const dialogRef = this.dialog.open(MenuComponent, {
690
696
  position: cords,
691
697
  panelClass: ["ngx-menu"].concat(this.config?.customClass || []),
@@ -699,7 +705,8 @@ class MenuComponent {
699
705
  parentContext: context,
700
706
  items: item['_children'],
701
707
  template: item.childTemplate,
702
- config: config
708
+ config: config,
709
+ parentIsNgxMenu: true
703
710
  }
704
711
  });
705
712
  let _s = dialogRef
@@ -753,6 +760,7 @@ class MenuComponent {
753
760
  }
754
761
  }
755
762
  startHoverTimer(item, row) {
763
+ this.childDialogs.forEach(cd => cd.close());
756
764
  // Invert check to make the logic simpler
757
765
  // TL;DR: if (any) of these are true, we will do the hover action
758
766
  if (!(Array.isArray(item.children) && item.children.length > 0 ||
@@ -808,7 +816,7 @@ class MenuComponent {
808
816
  });
809
817
  }
810
818
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: MenuComponent, deps: [{ token: i0.ViewContainerRef }, { token: i1$1.DomSanitizer }, { token: MAT_DIALOG_DATA, optional: true }, { token: i1.MatDialog, optional: true }, { token: i1.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
811
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: MenuComponent, isStandalone: true, selector: "ngx-menu", inputs: { data: "data", items: "items", config: "config", id: "id", overlayOverlap: "overlayOverlap", hoverDelay: "hoverDelay", showDebugOverlay: "showDebugOverlay", ownerCords: "ownerCords", selfCords: "selfCords", parentItem: "parentItem", parentContext: "parentContext", isLockedOpen: "isLockedOpen" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<!-- Mouse event blocker for pointer leave -->\n@if (coverRectCords) {\n <div\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n (pointerenter)=\"pointerHasBeenOverMask=true\"\n (click)=\"isLockedOpen = true\"\n ></div>\n}\n\n<div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (pointermove)=\"hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (wheel)=\"onWheel($event)\"\n></div>\n\n@if (!template) {\n <table>\n <tbody>\n @for (item of items; track item) {\n <!-- A row with a click action -->\n @if (item != 'separator' && item.separator != true && item['_visible']) {\n <tr #row\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row, true)\"\n [class.hover]=\"row['hover']\"\n [class.open]=\"row['_open']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n @if (showIconColumn) {\n <td class=\"icon\">\n @if (matIconRx.test(item['_icon'] ?? item.icon)) {\n <img [src]=\"item['_icon'] ?? item.icon\"/>\n }\n @else {\n <mat-icon\n [fontIcon]=\"item['_icon'] ?? item.icon\"\n [style.color]=\"item.iconColor\"\n />\n }\n </td>\n }\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n @if ($any(item.labelTemplate)?.prototype) {\n <ng-container\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n }\n @else {\n @if ($any(item)?.labelTemplate) {\n {{$any(item)?.labelTemplate(data || {})}}\n }\n @else {\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n }\n }\n </a>\n </td>\n\n @if (showShortcutColumn) {\n <td class=\"shortcut\">\n {{item.shortcutLabel}}\n </td>\n }\n\n <td style=\"min-width: 16px\">\n @if ((\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n ) {\n <mat-icon\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n }\n\n @if (item['_isResolving']) {\n <mat-progress-spinner\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n }\n </td>\n </tr>\n }\n @else if (item != 'separator' && item.separator == true) {\n <!-- Separator with label -->\n <tr\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n }\n @else if (item == 'separator') {\n <!-- Separator -->\n <tr\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n}\n@else {\n @if (templateType == 'template') {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n }\n @else {\n <ng-container\n [cdkPortalOutlet]=\"componentPortal\"\n />\n }\n}\n\n@if (showDebugOverlay) {\n <div>\n <div>hbs: {{hasBootstrapped}}</div>\n <div>pov: {{pointerIsOnVoid}}</div>\n <div>ilo: {{isLockedOpen}}</div>\n <div>hbom: {{pointerHasBeenOverMask}}</div>\n\n <div>type: {{templateType}}</div>\n </div>\n}\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled).hover,tr:not(.disabled).open{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled).hover a,tr:not(.disabled).open a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}tr img{max-width:100%;max-height:100%;aspect-ratio:1}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
819
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: MenuComponent, isStandalone: true, selector: "ngx-menu", inputs: { data: "data", items: "items", config: "config", id: "id", overlayOverlap: "overlayOverlap", hoverDelay: "hoverDelay", showDebugOverlay: "showDebugOverlay", ownerCords: "ownerCords", selfCords: "selfCords", parentItem: "parentItem", parentContext: "parentContext", isLockedOpen: "isLockedOpen" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<!-- Mouse event blocker for pointer leave -->\n@if (coverRectCords && !parentIsNgxMenu) {\n <div\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n (pointerenter)=\"pointerHasBeenOverMask=true\"\n (pointermove)=\"pointerHasBeenOverMask=true\"\n (click)=\"isLockedOpen = true\"\n ></div>\n}\n\n@if (!parentIsNgxMenu) {\n <div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (pointermove)=\"hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (click)=\"closeOnVoid(true)\"\n (wheel)=\"onWheel($event)\"\n ></div>\n}\n\n@if (!template) {\n <table>\n <tbody>\n @for (item of items; track item) {\n <!-- A row with a click action -->\n @if (item != 'separator' && item.separator != true && item['_visible']) {\n <tr #row\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row, true)\"\n [class.hover]=\"row['hover']\"\n [class.open]=\"row['_open']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n @if (showIconColumn) {\n <td class=\"icon\">\n @if (matIconRx.test(item['_icon'] ?? item.icon)) {\n <img [src]=\"item['_icon'] ?? item.icon\"/>\n }\n @else {\n <mat-icon\n [fontIcon]=\"item['_icon'] ?? item.icon\"\n [style.color]=\"item.iconColor\"\n />\n }\n </td>\n }\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n @if ($any(item.labelTemplate)?.prototype) {\n <ng-container\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n }\n @else {\n @if ($any(item)?.labelTemplate) {\n {{$any(item)?.labelTemplate(data || {})}}\n }\n @else {\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n }\n }\n </a>\n </td>\n\n @if (showShortcutColumn) {\n <td class=\"shortcut\">\n {{item.shortcutLabel}}\n </td>\n }\n\n <td style=\"min-width: 16px\">\n @if ((\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n ) {\n <mat-icon\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n }\n\n @if (item['_isResolving']) {\n <mat-progress-spinner\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n }\n </td>\n </tr>\n }\n @else if (item != 'separator' && item.separator == true) {\n <!-- Separator with label -->\n <tr\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n }\n @else if (item == 'separator') {\n <!-- Separator -->\n <tr\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n}\n@else {\n @if (templateType == 'template') {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n }\n @else {\n <ng-container\n [cdkPortalOutlet]=\"componentPortal\"\n />\n }\n}\n\n@if (showDebugOverlay) {\n <div>\n <div>hbs: {{hasBootstrapped}}</div>\n <div>pov: {{pointerIsOnVoid}}</div>\n <div>ilo: {{isLockedOpen}}</div>\n <div>hbom: {{pointerHasBeenOverMask}}</div>\n\n <div>type: {{templateType}}</div>\n </div>\n}\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled).hover,tr:not(.disabled).open{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled).hover a,tr:not(.disabled).open a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}tr img{max-width:100%;max-height:100%;aspect-ratio:1}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
812
820
  }
813
821
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: MenuComponent, decorators: [{
814
822
  type: Component,
@@ -818,7 +826,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
818
826
  MatIconModule,
819
827
  MatProgressSpinnerModule,
820
828
  TooltipDirective
821
- ], standalone: true, template: "<!-- Mouse event blocker for pointer leave -->\n@if (coverRectCords) {\n <div\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n (pointerenter)=\"pointerHasBeenOverMask=true\"\n (click)=\"isLockedOpen = true\"\n ></div>\n}\n\n<div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (pointermove)=\"hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (wheel)=\"onWheel($event)\"\n></div>\n\n@if (!template) {\n <table>\n <tbody>\n @for (item of items; track item) {\n <!-- A row with a click action -->\n @if (item != 'separator' && item.separator != true && item['_visible']) {\n <tr #row\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row, true)\"\n [class.hover]=\"row['hover']\"\n [class.open]=\"row['_open']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n @if (showIconColumn) {\n <td class=\"icon\">\n @if (matIconRx.test(item['_icon'] ?? item.icon)) {\n <img [src]=\"item['_icon'] ?? item.icon\"/>\n }\n @else {\n <mat-icon\n [fontIcon]=\"item['_icon'] ?? item.icon\"\n [style.color]=\"item.iconColor\"\n />\n }\n </td>\n }\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n @if ($any(item.labelTemplate)?.prototype) {\n <ng-container\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n }\n @else {\n @if ($any(item)?.labelTemplate) {\n {{$any(item)?.labelTemplate(data || {})}}\n }\n @else {\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n }\n }\n </a>\n </td>\n\n @if (showShortcutColumn) {\n <td class=\"shortcut\">\n {{item.shortcutLabel}}\n </td>\n }\n\n <td style=\"min-width: 16px\">\n @if ((\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n ) {\n <mat-icon\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n }\n\n @if (item['_isResolving']) {\n <mat-progress-spinner\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n }\n </td>\n </tr>\n }\n @else if (item != 'separator' && item.separator == true) {\n <!-- Separator with label -->\n <tr\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n }\n @else if (item == 'separator') {\n <!-- Separator -->\n <tr\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n}\n@else {\n @if (templateType == 'template') {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n }\n @else {\n <ng-container\n [cdkPortalOutlet]=\"componentPortal\"\n />\n }\n}\n\n@if (showDebugOverlay) {\n <div>\n <div>hbs: {{hasBootstrapped}}</div>\n <div>pov: {{pointerIsOnVoid}}</div>\n <div>ilo: {{isLockedOpen}}</div>\n <div>hbom: {{pointerHasBeenOverMask}}</div>\n\n <div>type: {{templateType}}</div>\n </div>\n}\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled).hover,tr:not(.disabled).open{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled).hover a,tr:not(.disabled).open a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}tr img{max-width:100%;max-height:100%;aspect-ratio:1}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"] }]
829
+ ], standalone: true, template: "<!-- Mouse event blocker for pointer leave -->\n@if (coverRectCords && !parentIsNgxMenu) {\n <div\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n [style.background]=\"showDebugOverlay ? '#f004' : '#0000'\"\n style=\"z-index: -1\"\n (pointerenter)=\"pointerHasBeenOverMask=true\"\n (pointermove)=\"pointerHasBeenOverMask=true\"\n (click)=\"isLockedOpen = true\"\n ></div>\n}\n\n@if (!parentIsNgxMenu) {\n <div class=\"void\"\n [style.background]=\"showDebugOverlay ? '#00f4' : '#0000'\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && closeOnVoid(true)\"\n (pointermove)=\"hasBootstrapped && !isLockedOpen && closeOnVoid()\"\n (click)=\"closeOnVoid(true)\"\n (wheel)=\"onWheel($event)\"\n ></div>\n}\n\n@if (!template) {\n <table>\n <tbody>\n @for (item of items; track item) {\n <!-- A row with a click action -->\n @if (item != 'separator' && item.separator != true && item['_visible']) {\n <tr #row\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row, true)\"\n [class.hover]=\"row['hover']\"\n [class.open]=\"row['_open']\"\n (pointerenter)=\"row['hover'] = true; startHoverTimer(item, row)\"\n (pointerleave)=\"row['hover'] = false; stopHoverTimer(item)\"\n >\n\n @if (showIconColumn) {\n <td class=\"icon\">\n @if (matIconRx.test(item['_icon'] ?? item.icon)) {\n <img [src]=\"item['_icon'] ?? item.icon\"/>\n }\n @else {\n <mat-icon\n [fontIcon]=\"item['_icon'] ?? item.icon\"\n [style.color]=\"item.iconColor\"\n />\n }\n </td>\n }\n\n <!-- 'Normal' action based item -->\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n #anchor\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n @if ($any(item.labelTemplate)?.prototype) {\n <ng-container\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': item['_context'],\n 'item': item,\n 'element': anchor,\n 'menu': this\n }\"\n />\n }\n @else {\n @if ($any(item)?.labelTemplate) {\n {{$any(item)?.labelTemplate(data || {})}}\n }\n @else {\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n }\n }\n </a>\n </td>\n\n @if (showShortcutColumn) {\n <td class=\"shortcut\">\n {{item.shortcutLabel}}\n </td>\n }\n\n <td style=\"min-width: 16px\">\n @if ((\n (item['children']?.length > 0) ||\n (item['_children']?.length > 0) ||\n item.childTemplate ||\n item.children?.['call'] ||\n item.childrenResolver\n ) &&\n !item['_isResolving']\n ) {\n <mat-icon\n style=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n }\n\n @if (item['_isResolving']) {\n <mat-progress-spinner\n mode=\"indeterminate\"\n [diameter]=\"20\"\n style=\"margin-right: 4px\"\n />\n }\n </td>\n </tr>\n }\n @else if (item != 'separator' && item.separator == true) {\n <!-- Separator with label -->\n <tr\n class=\"disabled separator\"\n >\n <td\n class=\"center\"\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n }\n @else if (item == 'separator') {\n <!-- Separator -->\n <tr\n class=\"disabled separator\"\n >\n <td\n [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\"\n >\n <hr/>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n}\n@else {\n @if (templateType == 'template') {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n '$implicit': data,\n 'dialog': dialogRef,\n 'context': parentContext,\n 'item': parentItem,\n 'element': this.viewContainer?.element?.nativeElement,\n 'menu': this\n }\"\n />\n }\n @else {\n <ng-container\n [cdkPortalOutlet]=\"componentPortal\"\n />\n }\n}\n\n@if (showDebugOverlay) {\n <div>\n <div>hbs: {{hasBootstrapped}}</div>\n <div>pov: {{pointerIsOnVoid}}</div>\n <div>ilo: {{isLockedOpen}}</div>\n <div>hbom: {{pointerHasBeenOverMask}}</div>\n\n <div>type: {{templateType}}</div>\n </div>\n}\n", styles: ["::ng-deep .cdk-overlay-container .ngx-menu{--mdc-dialog-container-color: var(--ngx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled).hover,tr:not(.disabled).open{background-color:var(--ngx-menu-hover-background-color, #94ebeb);color:var(--ngx-menu-hover-text-color, #000)}tr:not(.disabled).hover a,tr:not(.disabled).open a{color:var(--ngx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}tr img{max-width:100%;max-height:100%;aspect-ratio:1}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-menu-item-height, 30px)}td{vertical-align:middle}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}\n"] }]
822
830
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i1$1.DomSanitizer }, { type: undefined, decorators: [{
823
831
  type: Optional
824
832
  }, {