@acrodata/gui 2.0.0 → 2.1.0

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.
@@ -252,7 +252,7 @@ export class GuiForm {
252
252
  tabs.mode = mode;
253
253
  }
254
254
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GuiForm, deps: [{ token: i1.GuiIconsRegistry }], target: i0.ɵɵFactoryTarget.Component }); }
255
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: GuiForm, isStandalone: true, selector: "gui-form", inputs: { form: "form", config: "config", model: "model" }, outputs: { modelChange: "modelChange" }, host: { properties: { "attr.id": "uid" }, classAttribute: "gui-form" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n @for (item of formFields; track item) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n }\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n @if (item.show) {\n <ng-container [formGroup]=\"form\">\n @switch (item.type) {\n @case ('text') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('number') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('select') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('switch') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('slider') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('buttonToggle') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('fill') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('file') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('image') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('video') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('audio') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('imageSelect') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('textarea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('hidden') {\n <input type=\"hidden\" [formControlName]=\"item.key\">\n }\n @case ('inline') {\n <gui-inline-group [config]=\"item\" [formGroupName]=\"item.key\">\n @for (child of item.children; track child) {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n }\n </gui-inline-group>\n }\n @case ('group') {\n <mat-expansion-panel [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @for (child of item.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('tabs') {\n <mat-expansion-panel [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n @if (item.expanded) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"vertical\" />\n </button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n </gui-icon-button-wrapper>\n }\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @if (item.mode!=='list') {\n <!-- Horizontal mode -->\n <mat-tab-group class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n @for (tab of item.children; track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n }\n }\n </mat-tab>\n }\n </mat-tab-group>\n } @else {\n <!-- Vertical mode -->\n <div class=\"gui-list\">\n @for (tab of item.children; track tab; let i = $index) {\n <div class=\"gui-list-item\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</span>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </gui-icon-button-wrapper>\n }\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('menu') {\n <mat-tab-group class=\"gui-menu\" [formGroupName]=\"item.key\" disableRipple>\n @for (menuChild of item.children; track menuChild) {\n <mat-tab [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n @if (menuChild.type==='menuItem') {\n <!-- Must wrap with div -->\n @for (controlItem of menuChild.children; track controlItem) {\n <div [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n }\n </ng-template>\n </mat-tab>\n }\n </mat-tab-group>\n }\n }\n </ng-container>\n }\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel{box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{flex:1;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: .25rem;padding:.25rem;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: MatExpansionPanelContent, selector: "ng-template[matExpansionPanelContent]" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "directive", type: MatTabContent, selector: "[matTabContent]" }, { kind: "component", type: GuiFieldGroup, selector: "gui-field-group", inputs: ["config"] }, { kind: "directive", type: GuiFlexDirective, selector: "[flex]", inputs: ["flex"] }, { kind: "component", type: GuiInputText, selector: "gui-input-text", inputs: ["config", "disabled"] }, { kind: "component", type: GuiInputNumber, selector: "gui-input-number", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSelect, selector: "gui-select", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSwitch, selector: "gui-switch", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSlider, selector: "gui-slider", inputs: ["config", "disabled"] }, { kind: "component", type: GuiButtonToggle, selector: "gui-button-toggle", inputs: ["config", "disabled"] }, { kind: "component", type: GuiFill, selector: "gui-fill", inputs: ["config", "disabled"] }, { kind: "component", type: GuiFileUploader, selector: "gui-file-uploader", inputs: ["config", "disabled", "type", "name", "accept"], outputs: ["fileChange"] }, { kind: "component", type: GuiImageSelect, selector: "gui-image-select", inputs: ["config", "disabled", "appendTo"] }, { kind: "component", type: GuiTextarea, selector: "gui-textarea", inputs: ["config", "disabled"] }, { kind: "component", type: GuiInlineGroup, selector: "gui-inline-group", inputs: ["config"] }, { kind: "component", type: GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "component", type: GuiIconButtonWrapper, selector: "gui-icon-button-wrapper" }, { kind: "pipe", type: GuiEjsPipe, name: "ejs" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
255
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: GuiForm, isStandalone: true, selector: "gui-form", inputs: { form: "form", config: "config", model: "model" }, outputs: { modelChange: "modelChange" }, host: { properties: { "attr.id": "uid" }, classAttribute: "gui-form" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"form\">\n @for (item of formFields; track item) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\" />\n </div>\n }\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n @if (item.show) {\n <ng-container [formGroup]=\"form\">\n @switch (item.type) {\n @case ('text') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('number') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('select') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('switch') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('slider') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('buttonToggle') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('fill') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('file') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('image') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('video') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('audio') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('imageSelect') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('textarea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('hidden') {\n <input type=\"hidden\" [formControlName]=\"item.key\">\n }\n @case ('inline') {\n <gui-inline-group [config]=\"item\" [formGroupName]=\"item.key\">\n @for (child of item.children; track child) {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\" />\n }\n </gui-inline-group>\n }\n @case ('group') {\n <mat-expansion-panel [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @for (child of item.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\" />\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('tabs') {\n <mat-expansion-panel [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n @if (item.expanded) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"vertical\" />\n </button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n </gui-icon-button-wrapper>\n }\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @if (item.mode!=='list') {\n <!-- Horizontal mode -->\n <mat-tab-group class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n @for (tab of item.children; track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\" />\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\" />\n </div>\n }\n }\n </mat-tab>\n }\n </mat-tab-group>\n } @else {\n <!-- Vertical mode -->\n <div class=\"gui-list\">\n @for (tab of item.children; track tab; let i = $index) {\n <div class=\"gui-list-item\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <button class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </gui-icon-button-wrapper>\n }\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\" />\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\" />\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('menu') {\n <mat-tab-group class=\"gui-menu\" [formGroupName]=\"item.key\" disableRipple>\n @for (menuChild of item.children; track menuChild) {\n <mat-tab [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n @if (menuChild.type==='menuItem') {\n <!-- Must wrap with div -->\n @for (controlItem of menuChild.children; track controlItem) {\n <div [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\" />\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\" />\n }\n </ng-template>\n </mat-tab>\n }\n </mat-tab-group>\n }\n }\n </ng-container>\n }\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel{box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem;border-bottom:var(--mat-tab-header-divider-height) solid transparent}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{display:flex;flex:1;padding:0;background-color:transparent;border:none;font-size:inherit;font-family:inherit;letter-spacing:inherit;line-height:inherit;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: .25rem;padding:.25rem;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: MatExpansionPanelContent, selector: "ng-template[matExpansionPanelContent]" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "directive", type: MatTabContent, selector: "[matTabContent]" }, { kind: "component", type: GuiFieldGroup, selector: "gui-field-group", inputs: ["config"] }, { kind: "directive", type: GuiFlexDirective, selector: "[flex]", inputs: ["flex"] }, { kind: "component", type: GuiInputText, selector: "gui-input-text", inputs: ["config", "disabled"] }, { kind: "component", type: GuiInputNumber, selector: "gui-input-number", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSelect, selector: "gui-select", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSwitch, selector: "gui-switch", inputs: ["config", "disabled"] }, { kind: "component", type: GuiSlider, selector: "gui-slider", inputs: ["config", "disabled"] }, { kind: "component", type: GuiButtonToggle, selector: "gui-button-toggle", inputs: ["config", "disabled"] }, { kind: "component", type: GuiFill, selector: "gui-fill", inputs: ["config", "disabled"] }, { kind: "component", type: GuiFileUploader, selector: "gui-file-uploader", inputs: ["config", "disabled", "type", "name", "accept"], outputs: ["fileChange"] }, { kind: "component", type: GuiImageSelect, selector: "gui-image-select", inputs: ["config", "disabled", "appendTo"] }, { kind: "component", type: GuiTextarea, selector: "gui-textarea", inputs: ["config", "disabled"] }, { kind: "component", type: GuiInlineGroup, selector: "gui-inline-group", inputs: ["config"] }, { kind: "component", type: GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }, { kind: "component", type: GuiIconButtonWrapper, selector: "gui-icon-button-wrapper" }, { kind: "pipe", type: GuiEjsPipe, name: "ejs" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
256
256
  }
257
257
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GuiForm, decorators: [{
258
258
  type: Component,
@@ -287,7 +287,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
287
287
  GuiFieldLabel,
288
288
  GuiIconButtonWrapper,
289
289
  GuiEjsPipe,
290
- ], template: "<form [formGroup]=\"form\">\n @for (item of formFields; track item) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\">\n </ng-template>\n </div>\n }\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n @if (item.show) {\n <ng-container [formGroup]=\"form\">\n @switch (item.type) {\n @case ('text') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('number') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('select') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('switch') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('slider') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('buttonToggle') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('fill') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('file') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('image') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('video') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('audio') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('imageSelect') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('textarea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('hidden') {\n <input type=\"hidden\" [formControlName]=\"item.key\">\n }\n @case ('inline') {\n <gui-inline-group [config]=\"item\" [formGroupName]=\"item.key\">\n @for (child of item.children; track child) {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n }\n </gui-inline-group>\n }\n @case ('group') {\n <mat-expansion-panel [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @for (child of item.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\">\n </ng-template>\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('tabs') {\n <mat-expansion-panel [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n @if (item.expanded) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"vertical\" />\n </button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n </gui-icon-button-wrapper>\n }\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @if (item.mode!=='list') {\n <!-- Horizontal mode -->\n <mat-tab-group class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n @for (tab of item.children; track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n }\n }\n </mat-tab>\n }\n </mat-tab-group>\n } @else {\n <!-- Vertical mode -->\n <div class=\"gui-list\">\n @for (tab of item.children; track tab; let i = $index) {\n <div class=\"gui-list-item\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <span class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</span>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </gui-icon-button-wrapper>\n }\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\">\n </ng-template>\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\">\n </ng-template>\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('menu') {\n <mat-tab-group class=\"gui-menu\" [formGroupName]=\"item.key\" disableRipple>\n @for (menuChild of item.children; track menuChild) {\n <mat-tab [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n @if (menuChild.type==='menuItem') {\n <!-- Must wrap with div -->\n @for (controlItem of menuChild.children; track controlItem) {\n <div [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\">\n </ng-template>\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\">\n </ng-template>\n }\n </ng-template>\n </mat-tab>\n }\n </mat-tab-group>\n }\n }\n </ng-container>\n }\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel{box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{flex:1;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: .25rem;padding:.25rem;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"] }]
290
+ ], template: "<form [formGroup]=\"form\">\n @for (item of formFields; track item) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: item, formGroup: form}\" />\n </div>\n }\n</form>\n\n<ng-template #controlType let-item let-parent=\"parent\" let-form=\"formGroup\">\n @if (item.show) {\n <ng-container [formGroup]=\"form\">\n @switch (item.type) {\n @case ('text') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-text [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('number') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-input-number [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('select') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-select [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('switch') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-switch [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('slider') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-slider [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('buttonToggle') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-button-toggle [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('fill') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-fill [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('file') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('image') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"image\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('video') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"video\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('audio') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-file-uploader type=\"audio\" [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('imageSelect') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-image-select [formControlName]=\"item.key\" [config]=\"item\" [appendTo]=\"'#'+uid\" />\n </gui-field-group>\n }\n @case ('textarea') {\n <gui-field-group [config]=\"item\" [flex]=\"item.col\">\n <gui-textarea [formControlName]=\"item.key\" [config]=\"item\" />\n </gui-field-group>\n }\n @case ('hidden') {\n <input type=\"hidden\" [formControlName]=\"item.key\">\n }\n @case ('inline') {\n <gui-inline-group [config]=\"item\" [formGroupName]=\"item.key\">\n @for (child of item.children; track child) {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\" />\n }\n </gui-inline-group>\n }\n @case ('group') {\n <mat-expansion-panel [formGroupName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @for (child of item.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get(item.key)}\" />\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('tabs') {\n <mat-expansion-panel [formArrayName]=\"item.key\"\n [(expanded)]=\"item.expanded\" [disabled]=\"item.disabled\">\n <mat-expansion-panel-header>\n <gui-field-label [config]=\"item\" />\n <!-- Show operation buttons when panel opened -->\n @if (item.expanded) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [color]=\"item.mode!=='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'normal')\">\n <mat-icon svgIcon=\"horizontal\" />\n </button>\n <button mat-icon-button type=\"button\" [color]=\"item.mode==='list'?'primary':''\"\n (click)=\"changeTabsMode($event, item, 'list')\">\n <mat-icon svgIcon=\"vertical\" />\n </button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n }\n </gui-icon-button-wrapper>\n }\n </mat-expansion-panel-header>\n <!-- Lazy rendering -->\n <ng-template matExpansionPanelContent>\n @if (item.mode!=='list') {\n <!-- Horizontal mode -->\n <mat-tab-group class=\"gui-tabs\" disableRipple\n [mat-stretch-tabs]=\"false\" [(selectedIndex)]=\"item.selectedIndex\">\n @for (tab of item.children; track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled\">\n <ng-template mat-tab-label>\n <div>{{tab.name | ejs:{i} }}</div>\n </ng-template>\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\" />\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\" />\n </div>\n }\n }\n </mat-tab>\n }\n </mat-tab-group>\n } @else {\n <!-- Vertical mode -->\n <div class=\"gui-list\">\n @for (tab of item.children; track tab; let i = $index) {\n <div class=\"gui-list-item\"\n [class.gui-list-item-active]=\"item.selectedIndex===i\">\n <div class=\"gui-list-item-heading\">\n <button class=\"gui-list-item-title\"\n (click)=\"item.selectedIndex=i\">{{tab.name | ejs:{i} }}</button>\n @if (item.template && (item.addable || item.addable===undefined)) {\n <gui-icon-button-wrapper>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, true, i)\">\n <mat-icon svgIcon=\"copy\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"addTab($event, form.get(item.key), item, false, i)\">\n <mat-icon svgIcon=\"add\" />\n </button>\n <button mat-icon-button type=\"button\" [disabled]=\"item.disabled\"\n (click)=\"removeTab($event, form.get(item.key), item, i)\">\n <mat-icon svgIcon=\"delete\" />\n </button>\n </gui-icon-button-wrapper>\n }\n </div>\n <div class=\"gui-list-item-content\">\n <!-- FormControl & FormArray -->\n @if (!tab.children || tab.children.length===0 || tab.type==='tabs') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: tab, parent: item, formGroup: form.get([item.key])}\" />\n }\n <!-- FormGroup -->\n @if (tab.children?.length>0 && tab.type!=='tabs') {\n @for (child of tab.children; track child) {\n <div>\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: child, parent: item, formGroup: form.get([item.key, i])}\" />\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n </ng-template>\n </mat-expansion-panel>\n }\n @case ('menu') {\n <mat-tab-group class=\"gui-menu\" [formGroupName]=\"item.key\" disableRipple>\n @for (menuChild of item.children; track menuChild) {\n <mat-tab [label]=\"menuChild.name\"\n [disabled]=\"menuChild.disabled\">\n <ng-template matTabContent>\n @if (menuChild.type==='menuItem') {\n <!-- Must wrap with div -->\n @for (controlItem of menuChild.children; track controlItem) {\n <div [formGroupName]=\"menuChild.key\">\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: controlItem, formGroup: form.get([item.key, menuChild.key])}\" />\n </div>\n }\n }\n <!-- Support for unlimited nesting -->\n @if (menuChild.type==='menu') {\n <ng-template [ngTemplateOutlet]=\"controlType\"\n [ngTemplateOutletContext]=\"{$implicit: menuChild, formGroup: form.get(item.key)}\" />\n }\n </ng-template>\n </mat-tab>\n }\n </mat-tab-group>\n }\n }\n </ng-container>\n }\n</ng-template>\n", styles: [".gui-form{--mat-expansion-header-text-size: .75rem;--mat-expansion-header-collapsed-state-height: 2rem;--mat-expansion-header-expanded-state-height: 2rem;--mat-expansion-container-text-size: .75rem;--mat-expansion-container-shape: 0;position:relative;display:block;font-size:.75rem}.gui-form .mat-expansion-panel{box-shadow:none!important}.gui-form .mat-expansion-panel-body{padding:0}.gui-form .mat-expansion-panel-header{padding:0 .75rem}.gui-form .mat-expansion-panel-header .mat-content{align-items:center;padding-right:.5rem}[dir=rtl] .gui-form .mat-expansion-panel-header .mat-content{padding-right:0;padding-left:.5rem}.gui-form .mat-expansion-panel-header .mat-content gui-field-label{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.gui-form .mat-expansion-indicator svg{width:1.5rem;height:1.5rem;margin:0 -.5rem}.gui-form .mat-expansion-indicator:after{vertical-align:.125rem}.gui-form .mat-mdc-tab-header{--mat-tab-header-label-text-size: .75rem;--mdc-secondary-navigation-tab-container-height: 1.5rem}.gui-form .mat-mdc-tab-header-pagination{min-width:var(--mdc-secondary-navigation-tab-container-height)}.gui-form .mat-mdc-tab{min-width:auto;padding:0 .75rem}.gui-list-item-heading{display:flex;align-items:center;position:relative;padding:0 .75rem;line-height:1.5rem;border-bottom:var(--mat-tab-header-divider-height) solid transparent}.gui-list-item-heading:before{position:absolute;left:0;width:.125rem;height:1rem;background-color:var(--mat-expansion-header-text-color);content:\"\"}[dir=rtl] .gui-list-item-heading:before{left:auto;right:0}.gui-list-item-title{display:flex;flex:1;padding:0;background-color:transparent;border:none;font-size:inherit;font-family:inherit;letter-spacing:inherit;line-height:inherit;cursor:pointer}.gui-list-item-active .gui-list-item-title{font-weight:700}.gui-menu .mat-mdc-tab-header{--mdc-tab-indicator-active-indicator-shape: .25rem;padding:.25rem;background-color:var(--mdc-filled-text-field-container-color)}.gui-menu .mat-mdc-tab-header .mdc-tab__ripple:before{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.gui-menu .mat-mdc-tab-labels{gap:.25rem}.gui-menu .mdc-tab-indicator .mdc-tab-indicator__content{height:100%;background-color:var(--mdc-tab-indicator-active-indicator-color)}.gui-menu .mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:.24}\n"] }]
291
291
  }], ctorParameters: () => [{ type: i1.GuiIconsRegistry }], propDecorators: { form: [{
292
292
  type: Input
293
293
  }], config: [{
@@ -297,4 +297,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
297
297
  }], modelChange: [{
298
298
  type: Output
299
299
  }] } });
300
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHVCQUF1QixHQUN4QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFV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RkFDUCxlQUFlLGlKQUNmLGNBQWMseUdBQ2QsV0FBVyx5RkFDWCxjQUFjLGlGQUNkLGFBQWEseUZBQ2Isb0JBQW9CLCtEQUNwQixVQUFVOzsyRkFHRCxPQUFPO2tCQXpDbkIsU0FBUzsrQkFDRSxVQUFVLFFBR2Q7d0JBQ0osV0FBVyxFQUFFLEtBQUs7d0JBQ2xCLE9BQU8sRUFBRSxVQUFVO3FCQUNwQixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQix1QkFBdUI7d0JBQ3ZCLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixPQUFPO3dCQUNQLFdBQVc7d0JBQ1gsTUFBTTt3QkFDTixXQUFXO3dCQUNYLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxTQUFTO3dCQUNULFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxlQUFlO3dCQUNmLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsVUFBVTtxQkFDWDtxRkFNUSxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtcbiAgTWF0RXhwYW5zaW9uUGFuZWwsXG4gIE1hdEV4cGFuc2lvblBhbmVsQ29udGVudCxcbiAgTWF0RXhwYW5zaW9uUGFuZWxIZWFkZXIsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkNvbnRlbnQsIE1hdFRhYkdyb3VwLCBNYXRUYWJMYWJlbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBtZXJnZVdpdGgsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEd1aUJ1dHRvblRvZ2dsZSB9IGZyb20gJy4vYnV0dG9uLXRvZ2dsZS9idXR0b24tdG9nZ2xlJztcbmltcG9ydCB7IEd1aUZpZWxkR3JvdXAgfSBmcm9tICcuL2ZpZWxkLWdyb3VwL2ZpZWxkLWdyb3VwJztcbmltcG9ydCB7IEd1aUZpZWxkTGFiZWwgfSBmcm9tICcuL2ZpZWxkLWxhYmVsL2ZpZWxkLWxhYmVsJztcbmltcG9ydCB7IEd1aUZpbGVVcGxvYWRlciB9IGZyb20gJy4vZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyJztcbmltcG9ydCB7IEd1aUZpbGwgfSBmcm9tICcuL2ZpbGwvZmlsbCc7XG5pbXBvcnQgeyBHdWlFanNQaXBlLCBHdWlGbGV4RGlyZWN0aXZlLCBjb21wYXJlVmFsdWVzLCBnZXRWYWx1ZUJ5UGF0aCB9IGZyb20gJy4vZ3VpLXV0aWxzJztcbmltcG9ydCB7IEd1aUljb25CdXR0b25XcmFwcGVyIH0gZnJvbSAnLi9pY29uLWJ1dHRvbi13cmFwcGVyL2ljb24tYnV0dG9uLXdyYXBwZXInO1xuaW1wb3J0IHsgR3VpSW1hZ2VTZWxlY3QgfSBmcm9tICcuL2ltYWdlLXNlbGVjdC9pbWFnZS1zZWxlY3QnO1xuaW1wb3J0IHsgR3VpSW5saW5lR3JvdXAgfSBmcm9tICcuL2lubGluZS1ncm91cC9pbmxpbmUtZ3JvdXAnO1xuaW1wb3J0IHsgR3VpSW5wdXROdW1iZXIgfSBmcm9tICcuL2lucHV0LW51bWJlci9pbnB1dC1udW1iZXInO1xuaW1wb3J0IHsgR3VpSW5wdXRUZXh0IH0gZnJvbSAnLi9pbnB1dC10ZXh0L2lucHV0LXRleHQnO1xuaW1wb3J0IHsgR3VpQ29uZGl0aW9uLCBHdWlDb250cm9sLCBHdWlGaWVsZFR5cGUsIEd1aUZpZWxkcywgR3VpVGFic01vZGUgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBHdWlTZWxlY3QgfSBmcm9tICcuL3NlbGVjdC9zZWxlY3QnO1xuaW1wb3J0IHsgR3VpU2xpZGVyIH0gZnJvbSAnLi9zbGlkZXIvc2xpZGVyJztcbmltcG9ydCB7IEd1aVN3aXRjaCB9IGZyb20gJy4vc3dpdGNoL3N3aXRjaCc7XG5pbXBvcnQgeyBHdWlUZXh0YXJlYSB9IGZyb20gJy4vdGV4dGFyZWEvdGV4dGFyZWEnO1xuXG5pbXBvcnQgeyBHdWlJY29uc1JlZ2lzdHJ5IH0gZnJvbSAnLi9ndWktaWNvbnMnO1xuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3VpLWZvcm0uaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ndWktZm9ybS5zY3NzJyxcbiAgaG9zdDoge1xuICAgICdbYXR0ci5pZF0nOiAndWlkJyxcbiAgICAnY2xhc3MnOiAnZ3VpLWZvcm0nLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBNYXRFeHBhbnNpb25QYW5lbCxcbiAgICBNYXRFeHBhbnNpb25QYW5lbEhlYWRlcixcbiAgICBNYXRFeHBhbnNpb25QYW5lbENvbnRlbnQsXG4gICAgTWF0SWNvbkJ1dHRvbixcbiAgICBNYXRJY29uLFxuICAgIE1hdFRhYkdyb3VwLFxuICAgIE1hdFRhYixcbiAgICBNYXRUYWJMYWJlbCxcbiAgICBNYXRUYWJDb250ZW50LFxuICAgIEd1aUZpZWxkR3JvdXAsXG4gICAgR3VpRmxleERpcmVjdGl2ZSxcbiAgICBHdWlJbnB1dFRleHQsXG4gICAgR3VpSW5wdXROdW1iZXIsXG4gICAgR3VpU2VsZWN0LFxuICAgIEd1aVN3aXRjaCxcbiAgICBHdWlTbGlkZXIsXG4gICAgR3VpQnV0dG9uVG9nZ2xlLFxuICAgIEd1aUZpbGwsXG4gICAgR3VpRmlsZVVwbG9hZGVyLFxuICAgIEd1aUltYWdlU2VsZWN0LFxuICAgIEd1aVRleHRhcmVhLFxuICAgIEd1aUlubGluZUdyb3VwLFxuICAgIEd1aUZpZWxkTGFiZWwsXG4gICAgR3VpSWNvbkJ1dHRvbldyYXBwZXIsXG4gICAgR3VpRWpzUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRm9ybSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogVGhlIGZvcm0gaW5zdGFuY2Ugd2hpY2ggYWxsb3cgdG8gdHJhY2sgbW9kZWwgdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdHVzLlxuICAgKi9cbiAgQElucHV0KCkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8YW55Pih7fSk7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBjb25maWd1cmF0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBjb25maWc6IEd1aUZpZWxkcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBtb2RlbDogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIEZpcmVkIG9uIG1vZGVsIHZhbHVlIGNoYW5nZVxuICAgKi9cbiAgQE91dHB1dCgpIG1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGZvcm1GaWVsZHM6IEd1aUNvbnRyb2xbXSA9IFtdO1xuXG4gIGZvcm1TdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29udHJvbFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLy8gVW5pcXVlIGlkIGZvciB0aGlzIGZvcm1cbiAgdWlkID0gYGd1aS1mb3JtLSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICBjb25zdHJ1Y3RvcihpY29uc1JlZ2lzdHJ5OiBHdWlJY29uc1JlZ2lzdHJ5KSB7XG4gICAgaWNvbnNSZWdpc3RyeS5hZGQoJ2hvcml6b250YWwnLCAndmVydGljYWwnLCAnY29weScsICdhZGQnLCAnZGVsZXRlJyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLmZvcm0uY29udHJvbHMgPSB7fTsgLy8gcmVzZXQgY29udHJvbHNcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkodGhpcy5mb3JtLCB0aGlzLmNvbmZpZywgdGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ21vZGVsJ10gJiYgdGhpcy5tb2RlbCAmJiBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMubW9kZWwsIHZhbHVlKTtcbiAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNvbnRyb2xTdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIG9iamVjdCBjb25maWcgdG8gYXJyYXkgY29uZmlnIGFuZCByZWdpc3RlciBpbnRvIHRoZSByZWFjdGl2ZSBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybSAgICAgICAgIFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSBjb25maWcgICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICogQHBhcmFtIG1vZGVsICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbFxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqIEBwYXJhbSBwYXJlbnRUeXBlICAgVGhlIHR5cGUgb2YgdGhlIGZvcm0gZmllbGQgcGFyZW50XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRGb3JtRmllbGRBcnJheShcbiAgICBmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXksXG4gICAgY29uZmlnOiBHdWlGaWVsZHMgfCBHdWlDb250cm9sW10gPSB7fSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCxcbiAgICBwYXJlbnRUeXBlOiBHdWlGaWVsZFR5cGUgPSAnZ3JvdXAnXG4gICkge1xuICAgIGNvbnN0IHRlbXBBcnIgPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgIC8vIEluZmVycmluZyB0aGUgZm9ybSB0eXBlIGJ5IHRoZSBkYXRhIHR5cGUgb2YgYGNoaWxkcmVuYFxuICAgICAgLy8gMS4gYHVuZGVmaW5lZGAgPT4gRm9ybUNvbnRyb2xcbiAgICAgIC8vIDIuIGBhcnJheWAgICAgID0+IEZvcm1BcnJheVxuICAgICAgLy8gMy4gYG9iamVjdGAgICAgPT4gRm9ybUdyb3VwXG4gICAgICBjb25zdCBfY2hpbGRyZW4gPSAoY29uZmlnIGFzIGFueSlba2V5XS50ZW1wbGF0ZSA/IFtdIDogKGNvbmZpZyBhcyBhbnkpW2tleV0uY2hpbGRyZW47XG4gICAgICBjb25zdCBfdHlwZSA9ICFfY2hpbGRyZW4gPyAnY29udHJvbCcgOiBBcnJheS5pc0FycmF5KF9jaGlsZHJlbikgPyAnYXJyYXknIDogJ2dyb3VwJztcblxuICAgICAgY29uc3QgaXRlbTogR3VpQ29udHJvbCA9IHtcbiAgICAgICAgX3R5cGUsXG4gICAgICAgIGtleSxcbiAgICAgICAgcGFyZW50VHlwZSxcbiAgICAgICAgbW9kZWw6IG1vZGVsW2tleV0sXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZT8uW2tleV0sXG4gICAgICAgIGluZGV4OiBOdW1iZXIoa2V5KSwgLy8gdGhlIHN0cmluZyBrZXkgd2lsbCBiZSBgTmFOYFxuICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAuLi4oY29uZmlnIGFzIGFueSlba2V5XSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSBgZ3JvdXBgIHR5cGUgZ2VuZXJhbGx5IGhhdmUgbm8gYGRlZmF1bHRgLCBzbyB3ZSBzaG91bGRcbiAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBtYW51YWxseVxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgbW9kZWxba2V5XSA9PSBudWxsICYmIGl0ZW0uZGVmYXVsdCA9PSBudWxsKSB7XG4gICAgICAgIGl0ZW0ubW9kZWwgPSBtb2RlbFtrZXldID0gaXRlbS5fdHlwZSA9PT0gJ2FycmF5JyA/IFtdIDoge307XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIG1vZGVsIGJ5IHRoZSBgZGVmYXVsdGAga2V5IG9mIHRoZSBmaWVsZCBjb25maWdcbiAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT09ICdvYmplY3QnICYmIG1vZGVsW2tleV0gPT0gbnVsbCkge1xuICAgICAgICBtb2RlbFtrZXldID0gaXRlbS5kZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGp1ZGdtZW50IG9uIGB0YWJzYCB0eXBlLCB0aGUgYGNoaWxkcmVuYCBrZXkgd2lsbCBiZSBpZ25vcmVkIGlmXG4gICAgICAvLyB0aGVyZSBoYXMgYSBgdGVtcGxhdGVgIGtleVxuICAgICAgaWYgKGl0ZW0udGVtcGxhdGUpIHtcbiAgICAgICAgLy8gSWYgbW9kZWwgaXMgYW4gYXJyYXkgYW5kIG5vdCBlbXB0eSwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICAgICAgLy8gd2lsbCB1c2UgdGhlIG1vZGVsJ3MgdmFsdWVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbS5tb2RlbCkgJiYgaXRlbS5tb2RlbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaXRlbS5kZWZhdWx0ID0gaXRlbS5tb2RlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5kZWZhdWx0Py5sZW5ndGgpIHtcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gaXRlbS5kZWZhdWx0Lm1hcCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih2YWx1ZSwgaXRlbS50ZW1wbGF0ZT8uZGVmYXVsdCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0OiB2YWx1ZSxcbiAgICAgICAgICAgICAgLi4uaXRlbS50ZW1wbGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBgc2hvd0lmYCBjb25kaXRpb25zXG4gICAgICBpZiAoaXRlbS5zaG93SWYpIHtcbiAgICAgICAgY29uc3Qgc2V0VmlzaWJpbGl0eSA9IChjb21wYXJlV2l0aDogKGNvbmRpdGlvbjogR3VpQ29uZGl0aW9uKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0uc2hvd0lmIS5sb2dpY2FsVHlwZSA9PT0gJyRvcicpIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLnNvbWUoYyA9PiBjb21wYXJlV2l0aChjKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLmV2ZXJ5KGMgPT4gY29tcGFyZVdpdGgoYykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgdGhlIGluaXQgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGRcbiAgICAgICAgc2V0VmlzaWJpbGl0eShjID0+IHtcbiAgICAgICAgICBjb25zdCBjZmcgPSBnZXRWYWx1ZUJ5UGF0aChjb25maWcsIGNbMF0pID8/IGdldFZhbHVlQnlQYXRoKHRoaXMuY29uZmlnLCBjWzBdKTtcbiAgICAgICAgICBjb25zdCB2YWwgPSBnZXRWYWx1ZUJ5UGF0aChtb2RlbCwgY1swXSkgPz8gZ2V0VmFsdWVCeVBhdGgodGhpcy5tb2RlbCwgY1swXSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoY2ZnPy5bJ2RlZmF1bHQnXSA/PyB2YWwsIGNbMl0sIGNbMV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWxheSB0aGUgc3Vic2NyaXB0aW9uIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGZvcm0gY29udHJvbHMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ2V0Q29udHJvbCA9IChwYXRoOiBzdHJpbmcpID0+IGZvcm0uZ2V0KHBhdGgpIHx8IHRoaXMuZm9ybS5nZXQocGF0aCk7XG5cbiAgICAgICAgICBjb25zdCBjb250cm9scyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLm1hcChjID0+IGdldENvbnRyb2woY1swXSkpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyQgPSBjb250cm9scy5tYXAoY29udHJvbCA9PiBjb250cm9sPy52YWx1ZUNoYW5nZXMgfHwgb2YoKSk7XG4gICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb2YoKVxuICAgICAgICAgICAgLnBpcGUobWVyZ2VXaXRoKHZhbHVlQ2hhbmdlcyQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHNldFZpc2liaWxpdHkoYyA9PiBjb21wYXJlVmFsdWVzKGdldENvbnRyb2woY1swXSk/LnZhbHVlLCBjWzJdLCBjWzFdKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuY29udHJvbFN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uX3R5cGUgPT09ICdjb250cm9sJykge1xuICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7IHZhbHVlOiBpdGVtLmRlZmF1bHQsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH07XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLl90eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGxldCBmb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5PGFueT4oW10pO1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm1BcnJheSA9IGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUFycmF5KFtdKSkgYXMgRm9ybUFycmF5O1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBmb3JtQXJyYXksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1BcnJheSxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuXG4gICAgICAgIGl0ZW0uc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uX3R5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgbGV0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm1Hcm91cCA9IGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUdyb3VwKHt9KSkgYXMgRm9ybUdyb3VwO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBmb3JtR3JvdXAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1Hcm91cCxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0ZW1wQXJyLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBBcnI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdGFiIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlICAgICAgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSBmb3JtQXJyYXkgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIHRhYnMgICAgICBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBjb3B5ICAgICAgV2hldGhlciB0byBjb3B5IHRoZSBjdXJyZW50IHRhYlxuICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgYWRkVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm1BcnJheTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBjb3B5PzogYm9vbGVhbiwgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGluc2VydEluZGV4ID1cbiAgICAgIGluZGV4ICE9PSB2b2lkIDAgPyBpbmRleCArIDEgOiBjb3B5ID8gdGFicy5zZWxlY3RlZEluZGV4ISArIDEgOiB0YWJzLmNoaWxkcmVuIS5sZW5ndGg7XG4gICAgLy8gU2F2ZSB0aGUgaW5kZXggb2YgdGhlIGluc2VydGlvbiBpbiB0aGUgY29uZmlnXG4gICAgdGFicy50ZW1wbGF0ZSEuaW5kZXggPSBpbnNlcnRJbmRleDtcbiAgICAvLyBUaGUga2V5IGluIHRoZSBvYmplY3QgYW5kIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBzYW1lXG4gICAgdGFicy5jaGlsZHJlbiEuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPj0gaW5zZXJ0SW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghICs9IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4ICsgJyc7IC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtQXJyYXkuZ2V0KGluc2VydEluZGV4IC0gMSArICcnKT8udmFsdWU7XG4gICAgLy8gVGhlIGNvbnN0cnVjdGVkIG9iamVjdCBsb29rcyBsaWtlIHRoaXMgYFt7IGtleTogJ3RhYicsIGNoaWxkcmVuOiB0ZW1wbGF0ZSB9XWBcbiAgICAvLyBUaGUga2V5IHNob3VsZCBwcmVmZXJhYmx5IGJlIGBudWxsYFxuICAgIGNvbnN0IG5ld1RhYiA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgICBmb3JtQXJyYXksXG4gICAgICB7IFtpbnNlcnRJbmRleF06IHRhYnMudGVtcGxhdGUgfSBhcyBHdWlGaWVsZHMsXG4gICAgICBjb3B5ID8geyBbaW5zZXJ0SW5kZXhdOiBmb3JtVmFsdWUgfSA6IHt9LFxuICAgICAgY29weSA/IHsgW2luc2VydEluZGV4XTogZm9ybVZhbHVlIH0gOiBudWxsLFxuICAgICAgJ3RhYnMnXG4gICAgKTtcbiAgICB0YWJzLmNoaWxkcmVuIS5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIG5ld1RhYlswXSk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIGZvcm0gbW9kZWxcbiAgICBmb3JtQXJyYXkucGF0Y2hWYWx1ZShmb3JtQXJyYXkudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhYiBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gZSAgICAgICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gZm9ybUFycmF5IFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0YWJzICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgdGFicyBmaWVsZFxuICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgcmVtb3ZlVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm1BcnJheTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBpbmRleD86IG51bWJlcikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgcmVtb3ZlSW5kZXggPSBpbmRleCA9PT0gdm9pZCAwID8gdGFicy5zZWxlY3RlZEluZGV4ISA6IGluZGV4O1xuICAgIHRhYnMuY2hpbGRyZW4hLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID4gcmVtb3ZlSW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghIC09IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4ICsgJyc7IC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGFicy5jaGlsZHJlbiEuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQocmVtb3ZlSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgZGlzcGxheSBtb2RlIG9mIHRhYnMuXG4gICAqXG4gICAqIEBwYXJhbSBlICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gdGFicyBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBtb2RlIFRoZSBkaXNwbGF5IG1vZGUgb2YgdGFic1xuICAgKi9cbiAgY2hhbmdlVGFic01vZGUoZTogTW91c2VFdmVudCwgdGFiczogR3VpQ29udHJvbCwgbW9kZT86IEd1aVRhYnNNb2RlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0YWJzLm1vZGUgPSBtb2RlO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgQGZvciAoaXRlbSBvZiBmb3JtRmllbGRzOyB0cmFjayBpdGVtKSB7XG4gICAgPGRpdj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm19XCI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICB9XG48L2Zvcm0+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFR5cGUgbGV0LWl0ZW0gbGV0LXBhcmVudD1cInBhcmVudFwiIGxldC1mb3JtPVwiZm9ybUdyb3VwXCI+XG4gIEBpZiAoaXRlbS5zaG93KSB7XG4gICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICAgIEBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICBAY2FzZSAoJ3RleHQnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1pbnB1dC10ZXh0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnbnVtYmVyJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktaW5wdXQtbnVtYmVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc2VsZWN0Jykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc3dpdGNoJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc3dpdGNoIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnc2xpZGVyJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktc2xpZGVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnYnV0dG9uVG9nZ2xlJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktYnV0dG9uLXRvZ2dsZSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2ZpbGwnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxsIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZmlsZScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbWFnZScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImltYWdlXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCd2aWRlbycpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cInZpZGVvXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdhdWRpbycpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWZpbGUtdXBsb2FkZXIgdHlwZT1cImF1ZGlvXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbWFnZVNlbGVjdCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWltYWdlLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgW2FwcGVuZFRvXT1cIicjJyt1aWRcIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndGV4dGFyZWEnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS10ZXh0YXJlYSBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2hpZGRlbicpIHtcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2lubGluZScpIHtcbiAgICAgICAgICA8Z3VpLWlubGluZS1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiPlxuICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChpdGVtLmtleSl9XCI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9ndWktaW5saW5lLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZ3JvdXAnKSB7XG4gICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgWyhleHBhbmRlZCldPVwiaXRlbS5leHBhbmRlZFwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCd0YWJzJykge1xuICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtmb3JtQXJyYXlOYW1lXT1cIml0ZW0ua2V5XCJcbiAgICAgICAgICAgIFsoZXhwYW5kZWQpXT1cIml0ZW0uZXhwYW5kZWRcIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICA8Z3VpLWZpZWxkLWxhYmVsIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgICAgIDwhLS0gU2hvdyBvcGVyYXRpb24gYnV0dG9ucyB3aGVuIHBhbmVsIG9wZW5lZCAtLT5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgPGd1aS1pY29uLWJ1dHRvbi13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtjb2xvcl09XCJpdGVtLm1vZGUhPT0nbGlzdCc/J3ByaW1hcnknOicnXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVRhYnNNb2RlKCRldmVudCwgaXRlbSwgJ25vcm1hbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiaG9yaXpvbnRhbFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbY29sb3JdPVwiaXRlbS5tb2RlPT09J2xpc3QnPydwcmltYXJ5JzonJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWJzTW9kZSgkZXZlbnQsIGl0ZW0sICdsaXN0JylcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJ2ZXJ0aWNhbFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS50ZW1wbGF0ZSAmJiAoaXRlbS5hZGRhYmxlIHx8IGl0ZW0uYWRkYWJsZT09PXVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCB0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY29weVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9ndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgIDwhLS0gTGF6eSByZW5kZXJpbmcgLS0+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0RXhwYW5zaW9uUGFuZWxDb250ZW50PlxuICAgICAgICAgICAgICBAaWYgKGl0ZW0ubW9kZSE9PSdsaXN0Jykge1xuICAgICAgICAgICAgICAgIDwhLS0gSG9yaXpvbnRhbCBtb2RlIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGNsYXNzPVwiZ3VpLXRhYnNcIiBkaXNhYmxlUmlwcGxlXG4gICAgICAgICAgICAgICAgICBbbWF0LXN0cmV0Y2gtdGFic109XCJmYWxzZVwiIFsoc2VsZWN0ZWRJbmRleCldPVwiaXRlbS5zZWxlY3RlZEluZGV4XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yICh0YWIgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgdGFiOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYiBbZGlzYWJsZWRdPVwidGFiLmRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7dGFiLm5hbWUgfCBlanM6e2l9IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Db250cm9sICYgRm9ybUFycmF5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIXRhYi5jaGlsZHJlbiB8fCB0YWIuY2hpbGRyZW4ubGVuZ3RoPT09MCB8fCB0YWIudHlwZT09PSd0YWJzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IHRhYiwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleV0pfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtR3JvdXAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICh0YWIuY2hpbGRyZW4/Lmxlbmd0aD4wICYmIHRhYi50eXBlIT09J3RhYnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjaGlsZCBvZiB0YWIuY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjaGlsZCwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleSwgaV0pfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPCEtLSBWZXJ0aWNhbCBtb2RlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodGFiIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIHRhYjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ndWktbGlzdC1pdGVtLWFjdGl2ZV09XCJpdGVtLnNlbGVjdGVkSW5kZXg9PT1pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0LWl0ZW0taGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJndWktbGlzdC1pdGVtLXRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtLnNlbGVjdGVkSW5kZXg9aVwiPnt7dGFiLm5hbWUgfCBlanM6e2l9IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLnRlbXBsYXRlICYmIChpdGVtLmFkZGFibGUgfHwgaXRlbS5hZGRhYmxlPT09dW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3VpLWljb24tYnV0dG9uLXdyYXBwZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIHRydWUsIGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvcHlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCBmYWxzZSwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiYWRkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Db250cm9sICYgRm9ybUFycmF5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghdGFiLmNoaWxkcmVuIHx8IHRhYi5jaGlsZHJlbi5sZW5ndGg9PT0wIHx8IHRhYi50eXBlPT09J3RhYnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IHRhYiwgcGFyZW50OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm0uZ2V0KFtpdGVtLmtleV0pfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtR3JvdXAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRhYi5jaGlsZHJlbj8ubGVuZ3RoPjAgJiYgdGFiLnR5cGUhPT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgdGFiLmNoaWxkcmVuOyB0cmFjayBjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGQsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIGldKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnbWVudScpIHtcbiAgICAgICAgICA8bWF0LXRhYi1ncm91cCBjbGFzcz1cImd1aS1tZW51XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIiBkaXNhYmxlUmlwcGxlPlxuICAgICAgICAgICAgQGZvciAobWVudUNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIG1lbnVDaGlsZCkge1xuICAgICAgICAgICAgICA8bWF0LXRhYiBbbGFiZWxdPVwibWVudUNoaWxkLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51Q2hpbGQuZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0VGFiQ29udGVudD5cbiAgICAgICAgICAgICAgICAgIEBpZiAobWVudUNoaWxkLnR5cGU9PT0nbWVudUl0ZW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTXVzdCB3cmFwIHdpdGggZGl2IC0tPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb250cm9sSXRlbSBvZiBtZW51Q2hpbGQuY2hpbGRyZW47IHRyYWNrIGNvbnRyb2xJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJtZW51Q2hpbGQua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY29udHJvbEl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBtZW51Q2hpbGQua2V5XSl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8IS0tIFN1cHBvcnQgZm9yIHVubGltaXRlZCBuZXN0aW5nIC0tPlxuICAgICAgICAgICAgICAgICAgQGlmIChtZW51Q2hpbGQudHlwZT09PSdtZW51Jykge1xuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBtZW51Q2hpbGQsIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0udHMiLCIuLi8uLi8uLi9wcm9qZWN0cy9ndWkvZ3VpLWZvcm0uaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHVCQUF1QixHQUN4QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFV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RkFDUCxlQUFlLGlKQUNmLGNBQWMseUdBQ2QsV0FBVyx5RkFDWCxjQUFjLGlGQUNkLGFBQWEseUZBQ2Isb0JBQW9CLCtEQUNwQixVQUFVOzsyRkFHRCxPQUFPO2tCQXpDbkIsU0FBUzsrQkFDRSxVQUFVLFFBR2Q7d0JBQ0osV0FBVyxFQUFFLEtBQUs7d0JBQ2xCLE9BQU8sRUFBRSxVQUFVO3FCQUNwQixpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsaUJBQWlCO3dCQUNqQix1QkFBdUI7d0JBQ3ZCLHdCQUF3Qjt3QkFDeEIsYUFBYTt3QkFDYixPQUFPO3dCQUNQLFdBQVc7d0JBQ1gsTUFBTTt3QkFDTixXQUFXO3dCQUNYLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxTQUFTO3dCQUNULFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxlQUFlO3dCQUNmLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLG9CQUFvQjt3QkFDcEIsVUFBVTtxQkFDWDtxRkFNUSxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtcbiAgTWF0RXhwYW5zaW9uUGFuZWwsXG4gIE1hdEV4cGFuc2lvblBhbmVsQ29udGVudCxcbiAgTWF0RXhwYW5zaW9uUGFuZWxIZWFkZXIsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUYWIsIE1hdFRhYkNvbnRlbnQsIE1hdFRhYkdyb3VwLCBNYXRUYWJMYWJlbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBtZXJnZVdpdGgsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEd1aUJ1dHRvblRvZ2dsZSB9IGZyb20gJy4vYnV0dG9uLXRvZ2dsZS9idXR0b24tdG9nZ2xlJztcbmltcG9ydCB7IEd1aUZpZWxkR3JvdXAgfSBmcm9tICcuL2ZpZWxkLWdyb3VwL2ZpZWxkLWdyb3VwJztcbmltcG9ydCB7IEd1aUZpZWxkTGFiZWwgfSBmcm9tICcuL2ZpZWxkLWxhYmVsL2ZpZWxkLWxhYmVsJztcbmltcG9ydCB7IEd1aUZpbGVVcGxvYWRlciB9IGZyb20gJy4vZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyJztcbmltcG9ydCB7IEd1aUZpbGwgfSBmcm9tICcuL2ZpbGwvZmlsbCc7XG5pbXBvcnQgeyBHdWlFanNQaXBlLCBHdWlGbGV4RGlyZWN0aXZlLCBjb21wYXJlVmFsdWVzLCBnZXRWYWx1ZUJ5UGF0aCB9IGZyb20gJy4vZ3VpLXV0aWxzJztcbmltcG9ydCB7IEd1aUljb25CdXR0b25XcmFwcGVyIH0gZnJvbSAnLi9pY29uLWJ1dHRvbi13cmFwcGVyL2ljb24tYnV0dG9uLXdyYXBwZXInO1xuaW1wb3J0IHsgR3VpSW1hZ2VTZWxlY3QgfSBmcm9tICcuL2ltYWdlLXNlbGVjdC9pbWFnZS1zZWxlY3QnO1xuaW1wb3J0IHsgR3VpSW5saW5lR3JvdXAgfSBmcm9tICcuL2lubGluZS1ncm91cC9pbmxpbmUtZ3JvdXAnO1xuaW1wb3J0IHsgR3VpSW5wdXROdW1iZXIgfSBmcm9tICcuL2lucHV0LW51bWJlci9pbnB1dC1udW1iZXInO1xuaW1wb3J0IHsgR3VpSW5wdXRUZXh0IH0gZnJvbSAnLi9pbnB1dC10ZXh0L2lucHV0LXRleHQnO1xuaW1wb3J0IHsgR3VpQ29uZGl0aW9uLCBHdWlDb250cm9sLCBHdWlGaWVsZFR5cGUsIEd1aUZpZWxkcywgR3VpVGFic01vZGUgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBHdWlTZWxlY3QgfSBmcm9tICcuL3NlbGVjdC9zZWxlY3QnO1xuaW1wb3J0IHsgR3VpU2xpZGVyIH0gZnJvbSAnLi9zbGlkZXIvc2xpZGVyJztcbmltcG9ydCB7IEd1aVN3aXRjaCB9IGZyb20gJy4vc3dpdGNoL3N3aXRjaCc7XG5pbXBvcnQgeyBHdWlUZXh0YXJlYSB9IGZyb20gJy4vdGV4dGFyZWEvdGV4dGFyZWEnO1xuXG5pbXBvcnQgeyBHdWlJY29uc1JlZ2lzdHJ5IH0gZnJvbSAnLi9ndWktaWNvbnMnO1xuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3VpLWZvcm0uaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ndWktZm9ybS5zY3NzJyxcbiAgaG9zdDoge1xuICAgICdbYXR0ci5pZF0nOiAndWlkJyxcbiAgICAnY2xhc3MnOiAnZ3VpLWZvcm0nLFxuICB9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBNYXRFeHBhbnNpb25QYW5lbCxcbiAgICBNYXRFeHBhbnNpb25QYW5lbEhlYWRlcixcbiAgICBNYXRFeHBhbnNpb25QYW5lbENvbnRlbnQsXG4gICAgTWF0SWNvbkJ1dHRvbixcbiAgICBNYXRJY29uLFxuICAgIE1hdFRhYkdyb3VwLFxuICAgIE1hdFRhYixcbiAgICBNYXRUYWJMYWJlbCxcbiAgICBNYXRUYWJDb250ZW50LFxuICAgIEd1aUZpZWxkR3JvdXAsXG4gICAgR3VpRmxleERpcmVjdGl2ZSxcbiAgICBHdWlJbnB1dFRleHQsXG4gICAgR3VpSW5wdXROdW1iZXIsXG4gICAgR3VpU2VsZWN0LFxuICAgIEd1aVN3aXRjaCxcbiAgICBHdWlTbGlkZXIsXG4gICAgR3VpQnV0dG9uVG9nZ2xlLFxuICAgIEd1aUZpbGwsXG4gICAgR3VpRmlsZVVwbG9hZGVyLFxuICAgIEd1aUltYWdlU2VsZWN0LFxuICAgIEd1aVRleHRhcmVhLFxuICAgIEd1aUlubGluZUdyb3VwLFxuICAgIEd1aUZpZWxkTGFiZWwsXG4gICAgR3VpSWNvbkJ1dHRvbldyYXBwZXIsXG4gICAgR3VpRWpzUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRm9ybSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogVGhlIGZvcm0gaW5zdGFuY2Ugd2hpY2ggYWxsb3cgdG8gdHJhY2sgbW9kZWwgdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdHVzLlxuICAgKi9cbiAgQElucHV0KCkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8YW55Pih7fSk7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBjb25maWd1cmF0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBjb25maWc6IEd1aUZpZWxkcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gYmUgcmVwcmVzZW50ZWQgYnkgdGhlIGZvcm0uXG4gICAqL1xuICBASW5wdXQoKSBtb2RlbDogYW55ID0ge307XG5cbiAgLyoqXG4gICAqIEZpcmVkIG9uIG1vZGVsIHZhbHVlIGNoYW5nZVxuICAgKi9cbiAgQE91dHB1dCgpIG1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGZvcm1GaWVsZHM6IEd1aUNvbnRyb2xbXSA9IFtdO1xuXG4gIGZvcm1TdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29udHJvbFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgLy8gVW5pcXVlIGlkIGZvciB0aGlzIGZvcm1cbiAgdWlkID0gYGd1aS1mb3JtLSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICBjb25zdHJ1Y3RvcihpY29uc1JlZ2lzdHJ5OiBHdWlJY29uc1JlZ2lzdHJ5KSB7XG4gICAgaWNvbnNSZWdpc3RyeS5hZGQoJ2hvcml6b250YWwnLCAndmVydGljYWwnLCAnY29weScsICdhZGQnLCAnZGVsZXRlJyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZyddKSB7XG4gICAgICB0aGlzLmZvcm0uY29udHJvbHMgPSB7fTsgLy8gcmVzZXQgY29udHJvbHNcbiAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkodGhpcy5mb3JtLCB0aGlzLmNvbmZpZywgdGhpcy5tb2RlbCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ21vZGVsJ10gJiYgdGhpcy5tb2RlbCAmJiBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMubW9kZWwsIHZhbHVlKTtcbiAgICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNvbnRyb2xTdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIG9iamVjdCBjb25maWcgdG8gYXJyYXkgY29uZmlnIGFuZCByZWdpc3RlciBpbnRvIHRoZSByZWFjdGl2ZSBmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybSAgICAgICAgIFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSBjb25maWcgICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICogQHBhcmFtIG1vZGVsICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbFxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqIEBwYXJhbSBwYXJlbnRUeXBlICAgVGhlIHR5cGUgb2YgdGhlIGZvcm0gZmllbGQgcGFyZW50XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRGb3JtRmllbGRBcnJheShcbiAgICBmb3JtOiBGb3JtR3JvdXAgfCBGb3JtQXJyYXksXG4gICAgY29uZmlnOiBHdWlGaWVsZHMgfCBHdWlDb250cm9sW10gPSB7fSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICAgIGRlZmF1bHRWYWx1ZTogYW55ID0gbnVsbCxcbiAgICBwYXJlbnRUeXBlOiBHdWlGaWVsZFR5cGUgPSAnZ3JvdXAnXG4gICkge1xuICAgIGNvbnN0IHRlbXBBcnIgPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgIC8vIEluZmVycmluZyB0aGUgZm9ybSB0eXBlIGJ5IHRoZSBkYXRhIHR5cGUgb2YgYGNoaWxkcmVuYFxuICAgICAgLy8gMS4gYHVuZGVmaW5lZGAgPT4gRm9ybUNvbnRyb2xcbiAgICAgIC8vIDIuIGBhcnJheWAgICAgID0+IEZvcm1BcnJheVxuICAgICAgLy8gMy4gYG9iamVjdGAgICAgPT4gRm9ybUdyb3VwXG4gICAgICBjb25zdCBfY2hpbGRyZW4gPSAoY29uZmlnIGFzIGFueSlba2V5XS50ZW1wbGF0ZSA/IFtdIDogKGNvbmZpZyBhcyBhbnkpW2tleV0uY2hpbGRyZW47XG4gICAgICBjb25zdCBfdHlwZSA9ICFfY2hpbGRyZW4gPyAnY29udHJvbCcgOiBBcnJheS5pc0FycmF5KF9jaGlsZHJlbikgPyAnYXJyYXknIDogJ2dyb3VwJztcblxuICAgICAgY29uc3QgaXRlbTogR3VpQ29udHJvbCA9IHtcbiAgICAgICAgX3R5cGUsXG4gICAgICAgIGtleSxcbiAgICAgICAgcGFyZW50VHlwZSxcbiAgICAgICAgbW9kZWw6IG1vZGVsW2tleV0sXG4gICAgICAgIGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZT8uW2tleV0sXG4gICAgICAgIGluZGV4OiBOdW1iZXIoa2V5KSwgLy8gdGhlIHN0cmluZyBrZXkgd2lsbCBiZSBgTmFOYFxuICAgICAgICBzaG93OiB0cnVlLFxuICAgICAgICAuLi4oY29uZmlnIGFzIGFueSlba2V5XSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoZSBgZ3JvdXBgIHR5cGUgZ2VuZXJhbGx5IGhhdmUgbm8gYGRlZmF1bHRgLCBzbyB3ZSBzaG91bGRcbiAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBtYW51YWxseVxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgbW9kZWxba2V5XSA9PSBudWxsICYmIGl0ZW0uZGVmYXVsdCA9PSBudWxsKSB7XG4gICAgICAgIGl0ZW0ubW9kZWwgPSBtb2RlbFtrZXldID0gaXRlbS5fdHlwZSA9PT0gJ2FycmF5JyA/IFtdIDoge307XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIG1vZGVsIGJ5IHRoZSBgZGVmYXVsdGAga2V5IG9mIHRoZSBmaWVsZCBjb25maWdcbiAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT09ICdvYmplY3QnICYmIG1vZGVsW2tleV0gPT0gbnVsbCkge1xuICAgICAgICBtb2RlbFtrZXldID0gaXRlbS5kZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBTcGVjaWFsIGp1ZGdtZW50IG9uIGB0YWJzYCB0eXBlLCB0aGUgYGNoaWxkcmVuYCBrZXkgd2lsbCBiZSBpZ25vcmVkIGlmXG4gICAgICAvLyB0aGVyZSBoYXMgYSBgdGVtcGxhdGVgIGtleVxuICAgICAgaWYgKGl0ZW0udGVtcGxhdGUpIHtcbiAgICAgICAgLy8gSWYgbW9kZWwgaXMgYW4gYXJyYXkgYW5kIG5vdCBlbXB0eSwgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGRcbiAgICAgICAgLy8gd2lsbCB1c2UgdGhlIG1vZGVsJ3MgdmFsdWVcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbS5tb2RlbCkgJiYgaXRlbS5tb2RlbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaXRlbS5kZWZhdWx0ID0gaXRlbS5tb2RlbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5kZWZhdWx0Py5sZW5ndGgpIHtcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gaXRlbS5kZWZhdWx0Lm1hcCgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih2YWx1ZSwgaXRlbS50ZW1wbGF0ZT8uZGVmYXVsdCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0OiB2YWx1ZSxcbiAgICAgICAgICAgICAgLi4uaXRlbS50ZW1wbGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBgc2hvd0lmYCBjb25kaXRpb25zXG4gICAgICBpZiAoaXRlbS5zaG93SWYpIHtcbiAgICAgICAgY29uc3Qgc2V0VmlzaWJpbGl0eSA9IChjb21wYXJlV2l0aDogKGNvbmRpdGlvbjogR3VpQ29uZGl0aW9uKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0uc2hvd0lmIS5sb2dpY2FsVHlwZSA9PT0gJyRvcicpIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLnNvbWUoYyA9PiBjb21wYXJlV2l0aChjKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLmV2ZXJ5KGMgPT4gY29tcGFyZVdpdGgoYykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgdGhlIGluaXQgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGRcbiAgICAgICAgc2V0VmlzaWJpbGl0eShjID0+IHtcbiAgICAgICAgICBjb25zdCBjZmcgPSBnZXRWYWx1ZUJ5UGF0aChjb25maWcsIGNbMF0pID8/IGdldFZhbHVlQnlQYXRoKHRoaXMuY29uZmlnLCBjWzBdKTtcbiAgICAgICAgICBjb25zdCB2YWwgPSBnZXRWYWx1ZUJ5UGF0aChtb2RlbCwgY1swXSkgPz8gZ2V0VmFsdWVCeVBhdGgodGhpcy5tb2RlbCwgY1swXSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoY2ZnPy5bJ2RlZmF1bHQnXSA/PyB2YWwsIGNbMl0sIGNbMV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWxheSB0aGUgc3Vic2NyaXB0aW9uIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGZvcm0gY29udHJvbHMgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ2V0Q29udHJvbCA9IChwYXRoOiBzdHJpbmcpID0+IGZvcm0uZ2V0KHBhdGgpIHx8IHRoaXMuZm9ybS5nZXQocGF0aCk7XG5cbiAgICAgICAgICBjb25zdCBjb250cm9scyA9IGl0ZW0uc2hvd0lmIS5jb25kaXRpb25zLm1hcChjID0+IGdldENvbnRyb2woY1swXSkpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyQgPSBjb250cm9scy5tYXAoY29udHJvbCA9PiBjb250cm9sPy52YWx1ZUNoYW5nZXMgfHwgb2YoKSk7XG4gICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb2YoKVxuICAgICAgICAgICAgLnBpcGUobWVyZ2VXaXRoKHZhbHVlQ2hhbmdlcyQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHNldFZpc2liaWxpdHkoYyA9PiBjb21wYXJlVmFsdWVzKGdldENvbnRyb2woY1swXSk/LnZhbHVlLCBjWzJdLCBjWzFdKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuY29udHJvbFN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW0uX3R5cGUgPT09ICdjb250cm9sJykge1xuICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7IHZhbHVlOiBpdGVtLmRlZmF1bHQsIGRpc2FibGVkOiBpdGVtLmRpc2FibGVkIH07XG4gICAgICAgIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgZm9ybS5yZWdpc3RlckNvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgZm9ybS5pbnNlcnQoaXRlbS5pbmRleCB8fCBmb3JtLmxlbmd0aCwgbmV3IEZvcm1Db250cm9sKGZvcm1TdGF0ZSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpdGVtLl90eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGxldCBmb3JtQXJyYXkgPSBuZXcgRm9ybUFycmF5PGFueT4oW10pO1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm1BcnJheSA9IGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUFycmF5KFtdKSkgYXMgRm9ybUFycmF5O1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBmb3JtQXJyYXksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1BcnJheSxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuXG4gICAgICAgIGl0ZW0uc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uX3R5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgbGV0IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgICAgICBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgIGZvcm1Hcm91cCA9IGZvcm0ucmVnaXN0ZXJDb250cm9sKGl0ZW0ua2V5LCBuZXcgRm9ybUdyb3VwKHt9KSkgYXMgRm9ybUdyb3VwO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICBmb3JtLmluc2VydChpdGVtLmluZGV4IHx8IGZvcm0ubGVuZ3RoLCBmb3JtR3JvdXAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4gPSB0aGlzLmdldEZvcm1GaWVsZEFycmF5KFxuICAgICAgICAgIGZvcm1Hcm91cCxcbiAgICAgICAgICBpdGVtLmNoaWxkcmVuLFxuICAgICAgICAgIGl0ZW0ubW9kZWwsXG4gICAgICAgICAgaXRlbS5kZWZhdWx0LFxuICAgICAgICAgIGl0ZW0udHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0ZW1wQXJyLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBBcnI7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdGFiIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBlICAgICAgICAgVGhlIG1vdXNlIGV2ZW50XG4gICAqIEBwYXJhbSBmb3JtQXJyYXkgVGhlIHJlYWN0aXZlIGZvcm0gaW5zdGFuY2VcbiAgICogQHBhcmFtIHRhYnMgICAgICBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBjb3B5ICAgICAgV2hldGhlciB0byBjb3B5IHRoZSBjdXJyZW50IHRhYlxuICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgYWRkVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm1BcnJheTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBjb3B5PzogYm9vbGVhbiwgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGluc2VydEluZGV4ID1cbiAgICAgIGluZGV4ICE9PSB2b2lkIDAgPyBpbmRleCArIDEgOiBjb3B5ID8gdGFicy5zZWxlY3RlZEluZGV4ISArIDEgOiB0YWJzLmNoaWxkcmVuIS5sZW5ndGg7XG4gICAgLy8gU2F2ZSB0aGUgaW5kZXggb2YgdGhlIGluc2VydGlvbiBpbiB0aGUgY29uZmlnXG4gICAgdGFicy50ZW1wbGF0ZSEuaW5kZXggPSBpbnNlcnRJbmRleDtcbiAgICAvLyBUaGUga2V5IGluIHRoZSBvYmplY3QgYW5kIHRoZSBpbmRleCBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBzYW1lXG4gICAgdGFicy5jaGlsZHJlbiEuZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoaW5kZXggPj0gaW5zZXJ0SW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghICs9IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4ICsgJyc7IC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3JtVmFsdWUgPSBmb3JtQXJyYXkuZ2V0KGluc2VydEluZGV4IC0gMSArICcnKT8udmFsdWU7XG4gICAgLy8gVGhlIGNvbnN0cnVjdGVkIG9iamVjdCBsb29rcyBsaWtlIHRoaXMgYFt7IGtleTogJ3RhYicsIGNoaWxkcmVuOiB0ZW1wbGF0ZSB9XWBcbiAgICAvLyBUaGUga2V5IHNob3VsZCBwcmVmZXJhYmx5IGJlIGBudWxsYFxuICAgIGNvbnN0IG5ld1RhYiA9IHRoaXMuZ2V0Rm9ybUZpZWxkQXJyYXkoXG4gICAgICBmb3JtQXJyYXksXG4gICAgICB7IFtpbnNlcnRJbmRleF06IHRhYnMudGVtcGxhdGUgfSBhcyBHdWlGaWVsZHMsXG4gICAgICBjb3B5ID8geyBbaW5zZXJ0SW5kZXhdOiBmb3JtVmFsdWUgfSA6IHt9LFxuICAgICAgY29weSA/IHsgW2luc2VydEluZGV4XTogZm9ybVZhbHVlIH0gOiBudWxsLFxuICAgICAgJ3RhYnMnXG4gICAgKTtcbiAgICB0YWJzLmNoaWxkcmVuIS5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIG5ld1RhYlswXSk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIGZvcm0gbW9kZWxcbiAgICBmb3JtQXJyYXkucGF0Y2hWYWx1ZShmb3JtQXJyYXkudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhYiBpdGVtLlxuICAgKlxuICAgKiBAcGFyYW0gZSAgICAgICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gZm9ybUFycmF5IFRoZSByZWFjdGl2ZSBmb3JtIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0YWJzICAgICAgVGhlIGNvbmZpZyBvZiB0aGUgdGFicyBmaWVsZFxuICAgKiBAcGFyYW0gaW5kZXggICAgIFRoZSBpbmRleCBvZiB0aGUgdGFicyBhcnJheVxuICAgKi9cbiAgcmVtb3ZlVGFiKGU6IE1vdXNlRXZlbnQsIGZvcm1BcnJheTogRm9ybUFycmF5LCB0YWJzOiBHdWlDb250cm9sLCBpbmRleD86IG51bWJlcikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgcmVtb3ZlSW5kZXggPSBpbmRleCA9PT0gdm9pZCAwID8gdGFicy5zZWxlY3RlZEluZGV4ISA6IGluZGV4O1xuICAgIHRhYnMuY2hpbGRyZW4hLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID4gcmVtb3ZlSW5kZXgpIHtcbiAgICAgICAgY2hpbGQuaW5kZXghIC09IDE7XG4gICAgICAgIGNoaWxkLmtleSA9IGNoaWxkLmluZGV4ICsgJyc7IC8vIGNvbnZlcnQgdG8gc3RyaW5nXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGFicy5jaGlsZHJlbiEuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQocmVtb3ZlSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgZGlzcGxheSBtb2RlIG9mIHRhYnMuXG4gICAqXG4gICAqIEBwYXJhbSBlICAgIFRoZSBtb3VzZSBldmVudFxuICAgKiBAcGFyYW0gdGFicyBUaGUgY29uZmlnIG9mIHRoZSB0YWJzIGZpZWxkXG4gICAqIEBwYXJhbSBtb2RlIFRoZSBkaXNwbGF5IG1vZGUgb2YgdGFic1xuICAgKi9cbiAgY2hhbmdlVGFic01vZGUoZTogTW91c2VFdmVudCwgdGFiczogR3VpQ29udHJvbCwgbW9kZT86IEd1aVRhYnNNb2RlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0YWJzLm1vZGUgPSBtb2RlO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgQGZvciAoaXRlbSBvZiBmb3JtRmllbGRzOyB0cmFjayBpdGVtKSB7XG4gICAgPGRpdj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBpdGVtLCBmb3JtR3JvdXA6IGZvcm19XCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9mb3JtPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xUeXBlIGxldC1pdGVtIGxldC1wYXJlbnQ9XCJwYXJlbnRcIiBsZXQtZm9ybT1cImZvcm1Hcm91cFwiPlxuICBAaWYgKGl0ZW0uc2hvdykge1xuICAgIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgICBAc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICAgICAgQGNhc2UgKCd0ZXh0Jykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktaW5wdXQtdGV4dCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ251bWJlcicpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWlucHV0LW51bWJlciBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3NlbGVjdCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLXNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3N3aXRjaCcpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLXN3aXRjaCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3NsaWRlcicpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLXNsaWRlciBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2J1dHRvblRvZ2dsZScpIHtcbiAgICAgICAgICA8Z3VpLWZpZWxkLWdyb3VwIFtjb25maWddPVwiaXRlbVwiIFtmbGV4XT1cIml0ZW0uY29sXCI+XG4gICAgICAgICAgICA8Z3VpLWJ1dHRvbi10b2dnbGUgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdmaWxsJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktZmlsbCBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2ZpbGUnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnaW1hZ2UnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJpbWFnZVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndmlkZW8nKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJ2aWRlb1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnYXVkaW8nKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1maWxlLXVwbG9hZGVyIHR5cGU9XCJhdWRpb1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgIDwvZ3VpLWZpZWxkLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnaW1hZ2VTZWxlY3QnKSB7XG4gICAgICAgICAgPGd1aS1maWVsZC1ncm91cCBbY29uZmlnXT1cIml0ZW1cIiBbZmxleF09XCJpdGVtLmNvbFwiPlxuICAgICAgICAgICAgPGd1aS1pbWFnZS1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIFthcHBlbmRUb109XCInIycrdWlkXCIgLz5cbiAgICAgICAgICA8L2d1aS1maWVsZC1ncm91cD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3RleHRhcmVhJykge1xuICAgICAgICAgIDxndWktZmllbGQtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2ZsZXhdPVwiaXRlbS5jb2xcIj5cbiAgICAgICAgICAgIDxndWktdGV4dGFyZWEgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwiaXRlbVwiIC8+XG4gICAgICAgICAgPC9ndWktZmllbGQtZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdoaWRkZW4nKSB7XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdpbmxpbmUnKSB7XG4gICAgICAgICAgPGd1aS1pbmxpbmUtZ3JvdXAgW2NvbmZpZ109XCJpdGVtXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIj5cbiAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIGNoaWxkKSB7XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9ndWktaW5saW5lLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZ3JvdXAnKSB7XG4gICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2Zvcm1Hcm91cE5hbWVdPVwiaXRlbS5rZXlcIlxuICAgICAgICAgICAgWyhleHBhbmRlZCldPVwiaXRlbS5leHBhbmRlZFwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCI+XG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgIDxndWktZmllbGQtbGFiZWwgW2NvbmZpZ109XCJpdGVtXCIgLz5cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgQGZvciAoY2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgndGFicycpIHtcbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZm9ybUFycmF5TmFtZV09XCJpdGVtLmtleVwiXG4gICAgICAgICAgICBbKGV4cGFuZGVkKV09XCJpdGVtLmV4cGFuZGVkXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIj5cbiAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cIml0ZW1cIiAvPlxuICAgICAgICAgICAgICA8IS0tIFNob3cgb3BlcmF0aW9uIGJ1dHRvbnMgd2hlbiBwYW5lbCBvcGVuZWQgLS0+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5leHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIDxndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbY29sb3JdPVwiaXRlbS5tb2RlIT09J2xpc3QnPydwcmltYXJ5JzonJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VUYWJzTW9kZSgkZXZlbnQsIGl0ZW0sICdub3JtYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImhvcml6b250YWxcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NvbG9yXT1cIml0ZW0ubW9kZT09PSdsaXN0Jz8ncHJpbWFyeSc6JydcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlVGFic01vZGUoJGV2ZW50LCBpdGVtLCAnbGlzdCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwidmVydGljYWxcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGVtcGxhdGUgJiYgKGl0ZW0uYWRkYWJsZSB8fCBpdGVtLmFkZGFibGU9PT11bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImNvcHlcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiYWRkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZ3VpLWljb24tYnV0dG9uLXdyYXBwZXI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8IS0tIExhenkgcmVuZGVyaW5nIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG1hdEV4cGFuc2lvblBhbmVsQ29udGVudD5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLm1vZGUhPT0nbGlzdCcpIHtcbiAgICAgICAgICAgICAgICA8IS0tIEhvcml6b250YWwgbW9kZSAtLT5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCBjbGFzcz1cImd1aS10YWJzXCIgZGlzYWJsZVJpcHBsZVxuICAgICAgICAgICAgICAgICAgW21hdC1zdHJldGNoLXRhYnNdPVwiZmFsc2VcIiBbKHNlbGVjdGVkSW5kZXgpXT1cIml0ZW0uc2VsZWN0ZWRJbmRleFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodGFiIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrIHRhYjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgW2Rpc2FibGVkXT1cInRhYi5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e3RhYi5uYW1lIHwgZWpzOntpfSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtQ29udHJvbCAmIEZvcm1BcnJheSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiB0YWIsIHBhcmVudDogaXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXldKX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm1Hcm91cCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRhYi5jaGlsZHJlbj8ubGVuZ3RoPjAgJiYgdGFiLnR5cGUhPT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIHRhYi5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBpXSl9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8IS0tIFZlcnRpY2FsIG1vZGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImd1aS1saXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yICh0YWIgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgdGFiOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmd1aS1saXN0LWl0ZW0tYWN0aXZlXT1cIml0ZW0uc2VsZWN0ZWRJbmRleD09PWlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZ3VpLWxpc3QtaXRlbS10aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtLnNlbGVjdGVkSW5kZXg9aVwiPnt7dGFiLm5hbWUgfCBlanM6e2l9IH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0udGVtcGxhdGUgJiYgKGl0ZW0uYWRkYWJsZSB8fCBpdGVtLmFkZGFibGU9PT11bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxndWktaWNvbi1idXR0b24td3JhcHBlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2Rpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYigkZXZlbnQsIGZvcm0uZ2V0KGl0ZW0ua2V5KSwgaXRlbSwgdHJ1ZSwgaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiY29weVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWIoJGV2ZW50LCBmb3JtLmdldChpdGVtLmtleSksIGl0ZW0sIGZhbHNlLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJhZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGFiKCRldmVudCwgZm9ybS5nZXQoaXRlbS5rZXkpLCBpdGVtLCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJkZWxldGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2d1aS1pY29uLWJ1dHRvbi13cmFwcGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJndWktbGlzdC1pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRm9ybUNvbnRyb2wgJiBGb3JtQXJyYXkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCF0YWIuY2hpbGRyZW4gfHwgdGFiLmNoaWxkcmVuLmxlbmd0aD09PTAgfHwgdGFiLnR5cGU9PT0ndGFicycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogdGFiLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5XSl9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRm9ybUdyb3VwIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0YWIuY2hpbGRyZW4/Lmxlbmd0aD4wICYmIHRhYi50eXBlIT09J3RhYnMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIHRhYi5jaGlsZHJlbjsgdHJhY2sgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRyb2xUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNoaWxkLCBwYXJlbnQ6IGl0ZW0sIGZvcm1Hcm91cDogZm9ybS5nZXQoW2l0ZW0ua2V5LCBpXSl9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdtZW51Jykge1xuICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIGNsYXNzPVwiZ3VpLW1lbnVcIiBbZm9ybUdyb3VwTmFtZV09XCJpdGVtLmtleVwiIGRpc2FibGVSaXBwbGU+XG4gICAgICAgICAgICBAZm9yIChtZW51Q2hpbGQgb2YgaXRlbS5jaGlsZHJlbjsgdHJhY2sgbWVudUNoaWxkKSB7XG4gICAgICAgICAgICAgIDxtYXQtdGFiIFtsYWJlbF09XCJtZW51Q2hpbGQubmFtZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnVDaGlsZC5kaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxuICAgICAgICAgICAgICAgICAgQGlmIChtZW51Q2hpbGQudHlwZT09PSdtZW51SXRlbScpIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNdXN0IHdyYXAgd2l0aCBkaXYgLS0+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbnRyb2xJdGVtIG9mIG1lbnVDaGlsZC5jaGlsZHJlbjsgdHJhY2sgY29udHJvbEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtmb3JtR3JvdXBOYW1lXT1cIm1lbnVDaGlsZC5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBjb250cm9sSXRlbSwgZm9ybUdyb3VwOiBmb3JtLmdldChbaXRlbS5rZXksIG1lbnVDaGlsZC5rZXldKX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8IS0tIFN1cHBvcnQgZm9yIHVubGltaXRlZCBuZXN0aW5nIC0tPlxuICAgICAgICAgICAgICAgICAgQGlmIChtZW51Q2hpbGQudHlwZT09PSdtZW51Jykge1xuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBtZW51Q2hpbGQsIGZvcm1Hcm91cDogZm9ybS5nZXQoaXRlbS5rZXkpfVwiIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvbmctY29udGFpbmVyPlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -18,7 +18,6 @@ import * as i0 from "@angular/core";
18
18
  *
19
19
  */
20
20
  export function ejsTmpl(str, data) {
21
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
22
21
  const fn = new Function('obj', 'var p=[],print=function(){p.push.apply(p,arguments);};' +
23
22
  // Introduce the data as local variables using with(){}
24
23
  'with(obj){p.push("' +
@@ -101,4 +100,4 @@ export function getValueByPath(obj, path) {
101
100
  return acc?.['children']?.[key] ? acc['children'][key] : acc?.[key];
102
101
  }, obj);
103
102
  }
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2d1aS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUcxRjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsR0FBVyxFQUFFLElBQVM7SUFDNUMsOERBQThEO0lBQzlELE1BQU0sRUFBRSxHQUFHLElBQUksUUFBUSxDQUNyQixLQUFLLEVBQ0wsd0RBQXdEO1FBQ3RELHVEQUF1RDtRQUN2RCxvQkFBb0I7UUFDcEIsNENBQTRDO1FBQzVDLEdBQUc7YUFDQSxPQUFPLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQzthQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNWLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUM7YUFDbkMsT0FBTyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUM7YUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQzthQUNYLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDWCxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNoQixLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNaLHdCQUF3QixDQUMzQixDQUFDO0lBRUYsMENBQTBDO0lBQzFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBTUQsTUFBTSxPQUFPLFVBQVU7SUFDckIsU0FBUyxDQUFDLEtBQWEsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUNoQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQzs4R0FIVSxVQUFVOzRHQUFWLFVBQVU7OzJGQUFWLFVBQVU7a0JBSnRCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLEtBQUs7b0JBQ1gsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOztBQVdELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUFGekIsU0FBSSxHQUF1QixHQUFHLENBQUM7SUFFSCxDQUFDO0lBRXRDLFFBQVE7UUFDTixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDekQsQ0FBQzs4R0FSVSxnQkFBZ0I7a0dBQWhCLGdCQUFnQjs7MkZBQWhCLGdCQUFnQjtrQkFKNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOytFQUVVLElBQUk7c0JBQVosS0FBSzs7QUFVUixNQUFNLFVBQVUsYUFBYSxDQUFDLENBQWtCLEVBQUUsQ0FBa0IsRUFBRSxRQUFxQjtJQUN6RixRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssS0FBSztZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQixLQUFLLEtBQUs7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3QixLQUFLLEtBQUs7WUFDUixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdCLEtBQUssTUFBTTtZQUNULE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsS0FBSyxNQUFNO1lBQ1QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QixLQUFLLEtBQUs7WUFDUixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxLQUFLLE1BQU07WUFDVCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDO1lBQ0UsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQXdCLEVBQUUsSUFBWTtJQUNuRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBb0MsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUMxRSxPQUFPLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR3VpRGVmYXVsdFZhbHVlLCBHdWlPcGVyYXRvciB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuLyoqXG4gKiBMaWdodHdlaWdodCBFSlMgdGVtcGxhdGUgZW5naW5lXG4gKlxuICogQHBhcmFtIHN0ciAgdGVtcGxhdGUgc3RyaW5nXG4gKiBAcGFyYW0gZGF0YSBkYXRhIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAqIEByZXR1cm5zXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcGVvcGxlID0gWydnZWRkeScsICduZWlsJywgJ2FsZXgnXTtcbiAqIGNvbnN0IHJlcyA9IGVqc1RtcGwoJzwlPSBwZW9wbGUuam9pbihcIiwgXCIpICU+Jywge3Blb3BsZTogcGVvcGxlfSk7XG4gKiBjb25zb2xlLmxvZyhyZXMpO1xuICogLy8gPT4gJ2dlZGR5LCBuZWlsLCBhbGV4J1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWpzVG1wbChzdHI6IHN0cmluZywgZGF0YTogYW55KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsXG4gIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKFxuICAgICdvYmonLFxuICAgICd2YXIgcD1bXSxwcmludD1mdW5jdGlvbigpe3AucHVzaC5hcHBseShwLGFyZ3VtZW50cyk7fTsnICtcbiAgICAgIC8vIEludHJvZHVjZSB0aGUgZGF0YSBhcyBsb2NhbCB2YXJpYWJsZXMgdXNpbmcgd2l0aCgpe31cbiAgICAgICd3aXRoKG9iail7cC5wdXNoKFwiJyArXG4gICAgICAvLyBDb252ZXJ0IHRoZSB0ZW1wbGF0ZSBpbnRvIHB1cmUgSmF2YVNjcmlwdFxuICAgICAgc3RyXG4gICAgICAgIC5yZXBsYWNlKC9bXFxyXFx0XFxuXS9nLCAnICcpXG4gICAgICAgIC5zcGxpdCgnPCUnKVxuICAgICAgICAuam9pbignXFx0JylcbiAgICAgICAgLnJlcGxhY2UoLygoXnwlPilbXlxcdF0qKScvZywgJyQxXFxyJylcbiAgICAgICAgLnJlcGxhY2UoL1xcdD0oLio/KSU+L2csICdcIiwkMSxcIicpXG4gICAgICAgIC5zcGxpdCgnXFx0JylcbiAgICAgICAgLmpvaW4oJ1wiKTsnKVxuICAgICAgICAuc3BsaXQoJyU+JylcbiAgICAgICAgLmpvaW4oJ3AucHVzaChcIicpXG4gICAgICAgIC5zcGxpdCgnXFxyJylcbiAgICAgICAgLmpvaW4oJ1wiJykgK1xuICAgICAgJ1wiKTt9cmV0dXJuIHAuam9pbihcIlwiKTsnXG4gICk7XG5cbiAgLy8gUHJvdmlkZSBzb21lIGJhc2ljIGN1cnJ5aW5nIHRvIHRoZSB1c2VyXG4gIHJldHVybiBkYXRhID8gZm4oZGF0YSkgOiBmbjtcbn1cblxuQFBpcGUoe1xuICBuYW1lOiAnZWpzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRWpzUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0odmFsdWU6IHN0cmluZywgZGF0YSA9IHt9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZWpzVG1wbCh2YWx1ZSwgZGF0YSk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2ZsZXhdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpRmxleERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZsZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDEwMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4ID0gYDEgMSAke3RoaXMuZmxleH0lYDtcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBgJHt0aGlzLmZsZXh9JWA7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWYWx1ZXMoYTogR3VpRGVmYXVsdFZhbHVlLCBiOiBHdWlEZWZhdWx0VmFsdWUsIG9wZXJhdG9yOiBHdWlPcGVyYXRvcikge1xuICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgY2FzZSAnJGVxJzpcbiAgICAgIHJldHVybiBhID09PSBiO1xuICAgIGNhc2UgJyRuZSc6XG4gICAgICByZXR1cm4gYSAhPT0gYjtcbiAgICBjYXNlICckZ3QnOlxuICAgICAgcmV0dXJuIChhID8/IDApID4gKGIgPz8gMCk7XG4gICAgY2FzZSAnJGx0JzpcbiAgICAgIHJldHVybiAoYSA/PyAwKSA8IChiID8/IDApO1xuICAgIGNhc2UgJyRndGUnOlxuICAgICAgcmV0dXJuIChhID8/IDApID49IChiID8/IDApO1xuICAgIGNhc2UgJyRsdGUnOlxuICAgICAgcmV0dXJuIChhID8/IDApIDw9IChiID8/IDApO1xuICAgIGNhc2UgJyRpbic6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShiKSAmJiBiLmluY2x1ZGVzKGEpO1xuICAgIGNhc2UgJyRuaW4nOlxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYikgJiYgIWIuaW5jbHVkZXMoYSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGgob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGFjYzogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCwga2V5KSA9PiB7XG4gICAgcmV0dXJuIGFjYz8uWydjaGlsZHJlbiddPy5ba2V5XSA/IGFjY1snY2hpbGRyZW4nXVtrZXldIDogYWNjPy5ba2V5XTtcbiAgfSwgb2JqKTtcbn1cbiJdfQ==
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2d1aS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBVSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDOztBQUcxRjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsR0FBVyxFQUFFLElBQVM7SUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxRQUFRLENBQ3JCLEtBQUssRUFDTCx3REFBd0Q7UUFDdEQsdURBQXVEO1FBQ3ZELG9CQUFvQjtRQUNwQiw0Q0FBNEM7UUFDNUMsR0FBRzthQUNBLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO2FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ1YsT0FBTyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQzthQUNuQyxPQUFPLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQzthQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNYLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ1osd0JBQXdCLENBQzNCLENBQUM7SUFFRiwwQ0FBMEM7SUFDMUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUFNRCxNQUFNLE9BQU8sVUFBVTtJQUNyQixTQUFTLENBQUMsS0FBYSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDOzhHQUhVLFVBQVU7NEdBQVYsVUFBVTs7MkZBQVYsVUFBVTtrQkFKdEIsSUFBSTttQkFBQztvQkFDSixJQUFJLEVBQUUsS0FBSztvQkFDWCxVQUFVLEVBQUUsSUFBSTtpQkFDakI7O0FBV0QsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUZ6QixTQUFJLEdBQXVCLEdBQUcsQ0FBQztJQUVILENBQUM7SUFFdEMsUUFBUTtRQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7UUFDdkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUN6RCxDQUFDOzhHQVJVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUo1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxRQUFRO29CQUNsQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7K0VBRVUsSUFBSTtzQkFBWixLQUFLOztBQVVSLE1BQU0sVUFBVSxhQUFhLENBQUMsQ0FBa0IsRUFBRSxDQUFrQixFQUFFLFFBQXFCO0lBQ3pGLFFBQVEsUUFBUSxFQUFFLENBQUM7UUFDakIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLEtBQUssS0FBSztZQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQixLQUFLLEtBQUs7WUFDUixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdCLEtBQUssS0FBSztZQUNSLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0IsS0FBSyxNQUFNO1lBQ1QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QixLQUFLLE1BQU07WUFDVCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzlCLEtBQUssS0FBSztZQUNSLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEtBQUssTUFBTTtZQUNULE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUM7WUFDRSxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBd0IsRUFBRSxJQUFZO0lBQ25FLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFvQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQzFFLE9BQU8sR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDVixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHdWlEZWZhdWx0VmFsdWUsIEd1aU9wZXJhdG9yIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IEVKUyB0ZW1wbGF0ZSBlbmdpbmVcbiAqXG4gKiBAcGFyYW0gc3RyICB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEBwYXJhbSBkYXRhIGRhdGEgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZVxuICogQHJldHVybnNcbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBwZW9wbGUgPSBbJ2dlZGR5JywgJ25laWwnLCAnYWxleCddO1xuICogY29uc3QgcmVzID0gZWpzVG1wbCgnPCU9IHBlb3BsZS5qb2luKFwiLCBcIikgJT4nLCB7cGVvcGxlOiBwZW9wbGV9KTtcbiAqIGNvbnNvbGUubG9nKHJlcyk7XG4gKiAvLyA9PiAnZ2VkZHksIG5laWwsIGFsZXgnXG4gKiBgYGBcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlanNUbXBsKHN0cjogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oXG4gICAgJ29iaicsXG4gICAgJ3ZhciBwPVtdLHByaW50PWZ1bmN0aW9uKCl7cC5wdXNoLmFwcGx5KHAsYXJndW1lbnRzKTt9OycgK1xuICAgICAgLy8gSW50cm9kdWNlIHRoZSBkYXRhIGFzIGxvY2FsIHZhcmlhYmxlcyB1c2luZyB3aXRoKCl7fVxuICAgICAgJ3dpdGgob2JqKXtwLnB1c2goXCInICtcbiAgICAgIC8vIENvbnZlcnQgdGhlIHRlbXBsYXRlIGludG8gcHVyZSBKYXZhU2NyaXB0XG4gICAgICBzdHJcbiAgICAgICAgLnJlcGxhY2UoL1tcXHJcXHRcXG5dL2csICcgJylcbiAgICAgICAgLnNwbGl0KCc8JScpXG4gICAgICAgIC5qb2luKCdcXHQnKVxuICAgICAgICAucmVwbGFjZSgvKChefCU+KVteXFx0XSopJy9nLCAnJDFcXHInKVxuICAgICAgICAucmVwbGFjZSgvXFx0PSguKj8pJT4vZywgJ1wiLCQxLFwiJylcbiAgICAgICAgLnNwbGl0KCdcXHQnKVxuICAgICAgICAuam9pbignXCIpOycpXG4gICAgICAgIC5zcGxpdCgnJT4nKVxuICAgICAgICAuam9pbigncC5wdXNoKFwiJylcbiAgICAgICAgLnNwbGl0KCdcXHInKVxuICAgICAgICAuam9pbignXCInKSArXG4gICAgICAnXCIpO31yZXR1cm4gcC5qb2luKFwiXCIpOydcbiAgKTtcblxuICAvLyBQcm92aWRlIHNvbWUgYmFzaWMgY3VycnlpbmcgdG8gdGhlIHVzZXJcbiAgcmV0dXJuIGRhdGEgPyBmbihkYXRhKSA6IGZuO1xufVxuXG5AUGlwZSh7XG4gIG5hbWU6ICdlanMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBHdWlFanNQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCBkYXRhID0ge30pOiBzdHJpbmcge1xuICAgIHJldHVybiBlanNUbXBsKHZhbHVlLCBkYXRhKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZmxleF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBHdWlGbGV4RGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZmxleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMTAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmZsZXggPSBgMSAxICR7dGhpcy5mbGV4fSVgO1xuICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IGAke3RoaXMuZmxleH0lYDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZVZhbHVlcyhhOiBHdWlEZWZhdWx0VmFsdWUsIGI6IEd1aURlZmF1bHRWYWx1ZSwgb3BlcmF0b3I6IEd1aU9wZXJhdG9yKSB7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlICckZXEnOlxuICAgICAgcmV0dXJuIGEgPT09IGI7XG4gICAgY2FzZSAnJG5lJzpcbiAgICAgIHJldHVybiBhICE9PSBiO1xuICAgIGNhc2UgJyRndCc6XG4gICAgICByZXR1cm4gKGEgPz8gMCkgPiAoYiA/PyAwKTtcbiAgICBjYXNlICckbHQnOlxuICAgICAgcmV0dXJuIChhID8/IDApIDwgKGIgPz8gMCk7XG4gICAgY2FzZSAnJGd0ZSc6XG4gICAgICByZXR1cm4gKGEgPz8gMCkgPj0gKGIgPz8gMCk7XG4gICAgY2FzZSAnJGx0ZSc6XG4gICAgICByZXR1cm4gKGEgPz8gMCkgPD0gKGIgPz8gMCk7XG4gICAgY2FzZSAnJGluJzpcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGIpICYmIGIuaW5jbHVkZXMoYSk7XG4gICAgY2FzZSAnJG5pbic6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShiKSAmJiAhYi5pbmNsdWRlcyhhKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUJ5UGF0aChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sIHBhdGg6IHN0cmluZykge1xuICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLCBrZXkpID0+IHtcbiAgICByZXR1cm4gYWNjPy5bJ2NoaWxkcmVuJ10/LltrZXldID8gYWNjWydjaGlsZHJlbiddW2tleV0gOiBhY2M/LltrZXldO1xuICB9LCBvYmopO1xufVxuIl19
@@ -2,12 +2,12 @@ import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/
2
2
  import * as i0 from "@angular/core";
3
3
  export class GuiIconButtonWrapper {
4
4
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GuiIconButtonWrapper, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: GuiIconButtonWrapper, isStandalone: true, selector: "gui-icon-button-wrapper", host: { classAttribute: "gui-icon-button-wrapper" }, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [".gui-icon-button-wrapper .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 1.5rem;--mdc-icon-button-icon-size: .875rem;padding:0}.gui-icon-button-wrapper .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-icon-button-wrapper .mat-icon{display:inline-flex;justify-content:center;align-items:center;width:1.5rem;height:1.5rem}.gui-icon-button-wrapper .mat-icon svg{width:.875rem;height:.875rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: GuiIconButtonWrapper, isStandalone: true, selector: "gui-icon-button-wrapper", host: { classAttribute: "gui-icon-button-wrapper" }, ngImport: i0, template: "<ng-content />\n", styles: [".gui-icon-button-wrapper{line-height:1}.gui-icon-button-wrapper .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 1.5rem;--mdc-icon-button-icon-size: .875rem;padding:0}.gui-icon-button-wrapper .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-icon-button-wrapper .mat-icon{display:inline-flex;justify-content:center;align-items:center;width:1.5rem;height:1.5rem}.gui-icon-button-wrapper .mat-icon svg{width:.875rem;height:.875rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
6
6
  }
7
7
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GuiIconButtonWrapper, decorators: [{
8
8
  type: Component,
9
9
  args: [{ selector: 'gui-icon-button-wrapper', standalone: true, host: {
10
10
  class: 'gui-icon-button-wrapper',
11
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n", styles: [".gui-icon-button-wrapper .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 1.5rem;--mdc-icon-button-icon-size: .875rem;padding:0}.gui-icon-button-wrapper .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-icon-button-wrapper .mat-icon{display:inline-flex;justify-content:center;align-items:center;width:1.5rem;height:1.5rem}.gui-icon-button-wrapper .mat-icon svg{width:.875rem;height:.875rem}\n"] }]
11
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [".gui-icon-button-wrapper{line-height:1}.gui-icon-button-wrapper .mat-mdc-icon-button{--mdc-icon-button-state-layer-size: 1.5rem;--mdc-icon-button-icon-size: .875rem;padding:0}.gui-icon-button-wrapper .mat-mdc-icon-button .mat-mdc-button-touch-target{width:var(--mdc-icon-button-state-layer-size);height:var(--mdc-icon-button-state-layer-size)}.gui-icon-button-wrapper .mat-icon{display:inline-flex;justify-content:center;align-items:center;width:1.5rem;height:1.5rem}.gui-icon-button-wrapper .mat-icon svg{width:.875rem;height:.875rem}\n"] }]
12
12
  }] });
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1idXR0b24td3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9pY29uLWJ1dHRvbi13cmFwcGVyL2ljb24tYnV0dG9uLXdyYXBwZXIudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvaWNvbi1idXR0b24td3JhcHBlci9pY29uLWJ1dHRvbi13cmFwcGVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFhdEYsTUFBTSxPQUFPLG9CQUFvQjs4R0FBcEIsb0JBQW9CO2tHQUFwQixvQkFBb0Isd0lDYmpDLDZCQUNBOzsyRkRZYSxvQkFBb0I7a0JBWGhDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksUUFHVjt3QkFDSixLQUFLLEVBQUUseUJBQXlCO3FCQUNqQyxpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWljb24tYnV0dG9uLXdyYXBwZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vaWNvbi1idXR0b24td3JhcHBlci5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2ljb24tYnV0dG9uLXdyYXBwZXIuc2NzcycsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2d1aS1pY29uLWJ1dHRvbi13cmFwcGVyJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEd1aUljb25CdXR0b25XcmFwcGVyIHt9XG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4iXX0=
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1idXR0b24td3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2d1aS9pY29uLWJ1dHRvbi13cmFwcGVyL2ljb24tYnV0dG9uLXdyYXBwZXIudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvaWNvbi1idXR0b24td3JhcHBlci9pY29uLWJ1dHRvbi13cmFwcGVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFhdEYsTUFBTSxPQUFPLG9CQUFvQjs4R0FBcEIsb0JBQW9CO2tHQUFwQixvQkFBb0Isd0lDYmpDLGtCQUNBOzsyRkRZYSxvQkFBb0I7a0JBWGhDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksUUFHVjt3QkFDSixLQUFLLEVBQUUseUJBQXlCO3FCQUNqQyxpQkFDYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3VpLWljb24tYnV0dG9uLXdyYXBwZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vaWNvbi1idXR0b24td3JhcHBlci5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2ljb24tYnV0dG9uLXdyYXBwZXIuc2NzcycsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2d1aS1pY29uLWJ1dHRvbi13cmFwcGVyJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEd1aUljb25CdXR0b25XcmFwcGVyIHt9XG4iLCI8bmctY29udGVudCAvPlxuIl19
@@ -6,14 +6,14 @@ export class GuiInlineGroup {
6
6
  this.config = {};
7
7
  }
8
8
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GuiInlineGroup, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: GuiInlineGroup, isStandalone: true, selector: "gui-inline-group", inputs: { config: "config" }, host: { classAttribute: "gui-inline-group" }, ngImport: i0, template: "@if (config.name) {\n <gui-field-label [config]=\"config\" />\n}\n<div class=\"gui-inline-group-content\">\n <ng-content></ng-content>\n</div>\n", styles: [".gui-inline-group{display:flex;padding:.25rem .5rem}.gui-inline-group mat-hint{width:100%;line-height:var(--mat-form-field-subscript-text-line-height);-webkit-font-smoothing:antialiased}.gui-inline-group-content{display:inline-flex;flex:1;flex-flow:row wrap;margin:0 -.25rem}.gui-inline-group-content>.gui-field-group,.gui-inline-group-content>.gui-inline-group,.gui-inline-group-content>.mat-expansion-panel,.gui-inline-group-content>.gui-menu{width:100%;padding:0 .25rem}\n"], dependencies: [{ kind: "component", type: GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
9
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: GuiInlineGroup, isStandalone: true, selector: "gui-inline-group", inputs: { config: "config" }, host: { classAttribute: "gui-inline-group" }, ngImport: i0, template: "@if (config.name) {\n <gui-field-label [config]=\"config\" />\n}\n<div class=\"gui-inline-group-content\">\n <ng-content />\n</div>\n", styles: [".gui-inline-group{display:flex;padding:.25rem .5rem}.gui-inline-group mat-hint{width:100%;line-height:var(--mat-form-field-subscript-text-line-height);-webkit-font-smoothing:antialiased}.gui-inline-group-content{display:inline-flex;flex:1;flex-flow:row wrap;margin:0 -.25rem}.gui-inline-group-content>.gui-field-group,.gui-inline-group-content>.gui-inline-group,.gui-inline-group-content>.mat-expansion-panel,.gui-inline-group-content>.gui-menu{width:100%;padding:0 .25rem}\n"], dependencies: [{ kind: "component", type: GuiFieldLabel, selector: "gui-field-label", inputs: ["config", "index"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
10
10
  }
11
11
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GuiInlineGroup, decorators: [{
12
12
  type: Component,
13
13
  args: [{ selector: 'gui-inline-group', host: {
14
14
  class: 'gui-inline-group',
15
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [GuiFieldLabel], template: "@if (config.name) {\n <gui-field-label [config]=\"config\" />\n}\n<div class=\"gui-inline-group-content\">\n <ng-content></ng-content>\n</div>\n", styles: [".gui-inline-group{display:flex;padding:.25rem .5rem}.gui-inline-group mat-hint{width:100%;line-height:var(--mat-form-field-subscript-text-line-height);-webkit-font-smoothing:antialiased}.gui-inline-group-content{display:inline-flex;flex:1;flex-flow:row wrap;margin:0 -.25rem}.gui-inline-group-content>.gui-field-group,.gui-inline-group-content>.gui-inline-group,.gui-inline-group-content>.mat-expansion-panel,.gui-inline-group-content>.gui-menu{width:100%;padding:0 .25rem}\n"] }]
15
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [GuiFieldLabel], template: "@if (config.name) {\n <gui-field-label [config]=\"config\" />\n}\n<div class=\"gui-inline-group-content\">\n <ng-content />\n</div>\n", styles: [".gui-inline-group{display:flex;padding:.25rem .5rem}.gui-inline-group mat-hint{width:100%;line-height:var(--mat-form-field-subscript-text-line-height);-webkit-font-smoothing:antialiased}.gui-inline-group-content{display:inline-flex;flex:1;flex-flow:row wrap;margin:0 -.25rem}.gui-inline-group-content>.gui-field-group,.gui-inline-group-content>.gui-inline-group,.gui-inline-group-content>.mat-expansion-panel,.gui-inline-group-content>.gui-menu{width:100%;padding:0 .25rem}\n"] }]
16
16
  }], propDecorators: { config: [{
17
17
  type: Input
18
18
  }] } });
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2lubGluZS1ncm91cC9pbmxpbmUtZ3JvdXAudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvaW5saW5lLWdyb3VwL2lubGluZS1ncm91cC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFlM0QsTUFBTSxPQUFPLGNBQWM7SUFaM0I7UUFhVyxXQUFNLEdBQXdCLEVBQUUsQ0FBQztLQUMzQzs4R0FGWSxjQUFjO2tHQUFkLGNBQWMsd0pDaEIzQixvSkFNQSxxaEJEUVksYUFBYTs7MkZBRVosY0FBYztrQkFaMUIsU0FBUzsrQkFDRSxrQkFBa0IsUUFHdEI7d0JBQ0osS0FBSyxFQUFFLGtCQUFrQjtxQkFDMUIsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxhQUFhLENBQUM7OEJBR2YsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHdWlGaWVsZExhYmVsIH0gZnJvbSAnLi4vZmllbGQtbGFiZWwvZmllbGQtbGFiZWwnO1xuaW1wb3J0IHsgR3VpQ29udHJvbCB9IGZyb20gJy4uL2ludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1aS1pbmxpbmUtZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5saW5lLWdyb3VwLmh0bWwnLFxuICBzdHlsZVVybDogJy4vaW5saW5lLWdyb3VwLnNjc3MnLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdndWktaW5saW5lLWdyb3VwJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtHdWlGaWVsZExhYmVsXSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpSW5saW5lR3JvdXAge1xuICBASW5wdXQoKSBjb25maWc6IFBhcnRpYWw8R3VpQ29udHJvbD4gPSB7fTtcbn1cbiIsIkBpZiAoY29uZmlnLm5hbWUpIHtcbiAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cImNvbmZpZ1wiIC8+XG59XG48ZGl2IGNsYXNzPVwiZ3VpLWlubGluZS1ncm91cC1jb250ZW50XCI+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuIl19
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLWdyb3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2lubGluZS1ncm91cC9pbmxpbmUtZ3JvdXAudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvaW5saW5lLWdyb3VwL2lubGluZS1ncm91cC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFlM0QsTUFBTSxPQUFPLGNBQWM7SUFaM0I7UUFhVyxXQUFNLEdBQXdCLEVBQUUsQ0FBQztLQUMzQzs4R0FGWSxjQUFjO2tHQUFkLGNBQWMsd0pDaEIzQix5SUFNQSxxaEJEUVksYUFBYTs7MkZBRVosY0FBYztrQkFaMUIsU0FBUzsrQkFDRSxrQkFBa0IsUUFHdEI7d0JBQ0osS0FBSyxFQUFFLGtCQUFrQjtxQkFDMUIsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1AsQ0FBQyxhQUFhLENBQUM7OEJBR2YsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHdWlGaWVsZExhYmVsIH0gZnJvbSAnLi4vZmllbGQtbGFiZWwvZmllbGQtbGFiZWwnO1xuaW1wb3J0IHsgR3VpQ29udHJvbCB9IGZyb20gJy4uL2ludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2d1aS1pbmxpbmUtZ3JvdXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5saW5lLWdyb3VwLmh0bWwnLFxuICBzdHlsZVVybDogJy4vaW5saW5lLWdyb3VwLnNjc3MnLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdndWktaW5saW5lLWdyb3VwJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtHdWlGaWVsZExhYmVsXSxcbn0pXG5leHBvcnQgY2xhc3MgR3VpSW5saW5lR3JvdXAge1xuICBASW5wdXQoKSBjb25maWc6IFBhcnRpYWw8R3VpQ29udHJvbD4gPSB7fTtcbn1cbiIsIkBpZiAoY29uZmlnLm5hbWUpIHtcbiAgPGd1aS1maWVsZC1sYWJlbCBbY29uZmlnXT1cImNvbmZpZ1wiIC8+XG59XG48ZGl2IGNsYXNzPVwiZ3VpLWlubGluZS1ncm91cC1jb250ZW50XCI+XG4gIDxuZy1jb250ZW50IC8+XG48L2Rpdj5cbiJdfQ==
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2ludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgR3VpRmllbGRUeXBlID1cbiAgfCAnZ3JvdXAnXG4gIHwgJ2lubGluZSdcbiAgfCAndGFicydcbiAgfCAndGFiJ1xuICB8ICdtZW51J1xuICB8ICdtZW51SXRlbSdcbiAgfCAndGV4dCdcbiAgfCAnbnVtYmVyJ1xuICB8ICdzd2l0Y2gnXG4gIHwgJ3NsaWRlcidcbiAgfCAnZmlsbCdcbiAgfCAnc2VsZWN0J1xuICB8ICdidXR0b25Ub2dnbGUnXG4gIHwgJ2ltYWdlU2VsZWN0J1xuICB8ICd0ZXh0YXJlYSdcbiAgfCAnaGlkZGVuJ1xuICB8ICdpbWFnZSdcbiAgfCAndmlkZW8nXG4gIHwgJ2F1ZGlvJ1xuICB8ICdmaWxlJztcblxuZXhwb3J0IHR5cGUgR3VpRmlsbE1vZGUgPSAnZmxhdCcgfCAnZ3JhZGllbnQnIHwgJ2ltYWdlJztcblxuZXhwb3J0IHR5cGUgR3VpU2xpZGVyTW9kZSA9ICdub3JtYWwnIHwgJ3JhbmdlJztcblxuZXhwb3J0IHR5cGUgR3VpVGFic01vZGUgPSAnbm9ybWFsJyB8ICdsaXN0JztcblxuZXhwb3J0IHR5cGUgR3VpQmFzaWNWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEd1aURlZmF1bHRWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsO1xuXG5leHBvcnQgdHlwZSBHdWlPcGVyYXRvciA9ICckZXEnIHwgJyRuZScgfCAnJGd0JyB8ICckbHQnIHwgJyRndGUnIHwgJyRsdGUnIHwgJyRpbicgfCAnJG5pbic7XG5cbmV4cG9ydCB0eXBlIEd1aUNvbmRpdGlvbiA9IFtzdHJpbmcsIEd1aU9wZXJhdG9yLCBHdWlEZWZhdWx0VmFsdWVdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aUZpZWxkU2hvd0lmIHtcbiAgY29uZGl0aW9uczogR3VpQ29uZGl0aW9uW107XG4gIGxvZ2ljYWxUeXBlPzogJyRhbmQnIHwgJyRvcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpRmllbGQge1xuICB0eXBlOiBHdWlGaWVsZFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVmYXVsdD86IEd1aURlZmF1bHRWYWx1ZTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGNvbD86IG51bWJlcjtcbiAgc2hvd0lmPzogR3VpRmllbGRTaG93SWY7XG4gIHNob3c/OiBib29sZWFuO1xuICAvLyBncm91cCAmIHN1Ymdyb3VwICYgbWVudSAmIHRhYnMgJiBpbmxpbmVcbiAgY2hpbGRyZW4/OiBHdWlGaWVsZHMgfCBHdWlGaWVsZFtdO1xuICAvLyBncm91cCAmIHRhYnNcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xuICAvLyBudW1iZXIgJiBzbGlkZXJcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHN0ZXA/OiBudW1iZXI7XG4gIC8vIHRleHQgJiBudW1iZXIgJiBzbGlkZXIgJiBzZWxlY3RcbiAgcHJlZml4Pzogc3RyaW5nO1xuICBzdWZmaXg/OiBzdHJpbmc7XG4gIC8vIHNlbGVjdCAmIGJ1dHRvblRvZ2dsZSAmIGltYWdlU2VsZWN0XG4gIG9wdGlvbnM/OiBHdWlGaWVsZE9wdGlvbltdO1xuICAvLyBzZWxlY3RcbiAgdXNlRm9udD86IGJvb2xlYW47XG4gIC8vIHNlbGVjdCAmIGJ1dHRvblRvZ2dsZVxuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIC8vIGJ1dHRvblRvZ2dsZVxuICB1c2VJY29uPzogYm9vbGVhbjtcbiAgLy8gdGFic1xuICB0ZW1wbGF0ZT86IFBhcnRpYWw8R3VpRmllbGQ+O1xuICBhZGRhYmxlPzogYm9vbGVhbjtcbiAgLy8gZmlsbCAmIHNsaWRlciAmIHRhYnNcbiAgbW9kZT86IEd1aUZpbGxNb2RlIHwgR3VpU2xpZGVyTW9kZSB8IEd1aVRhYnNNb2RlO1xuICAvLyB0ZXh0YXJlYVxuICByb3dzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aUZpZWxkcyB7XG4gIFtrZXk6IHN0cmluZ106IEd1aUZpZWxkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aUZpZWxkT3B0aW9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgc3JjPzogc3RyaW5nO1xuICBjb2w/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpQ29udHJvbCBleHRlbmRzIEd1aUZpZWxkIHtcbiAgX3R5cGU6ICdjb250cm9sJyB8ICdncm91cCcgfCAnYXJyYXknO1xuICBrZXk6IHN0cmluZztcbiAgcGFyZW50VHlwZTogR3VpRmllbGRUeXBlO1xuICBtb2RlbD86IGFueTtcbiAgZGVmYXVsdD86IGFueTtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIGNoaWxkcmVuPzogR3VpQ29udHJvbFtdO1xuICB0ZW1wbGF0ZT86IFBhcnRpYWw8R3VpQ29udHJvbD47XG4gIHNlbGVjdGVkSW5kZXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpQ29udHJvbHMge1xuICBba2V5OiBzdHJpbmddOiBHdWlDb250cm9sO1xufVxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvZ3VpL2ludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgR3VpRmllbGRUeXBlID1cbiAgfCAnZ3JvdXAnXG4gIHwgJ2lubGluZSdcbiAgfCAndGFicydcbiAgfCAndGFiJ1xuICB8ICdtZW51J1xuICB8ICdtZW51SXRlbSdcbiAgfCAndGV4dCdcbiAgfCAnbnVtYmVyJ1xuICB8ICdzd2l0Y2gnXG4gIHwgJ3NsaWRlcidcbiAgfCAnZmlsbCdcbiAgfCAnc2VsZWN0J1xuICB8ICdidXR0b25Ub2dnbGUnXG4gIHwgJ2ltYWdlU2VsZWN0J1xuICB8ICd0ZXh0YXJlYSdcbiAgfCAnaGlkZGVuJ1xuICB8ICdpbWFnZSdcbiAgfCAndmlkZW8nXG4gIHwgJ2F1ZGlvJ1xuICB8ICdmaWxlJztcblxuZXhwb3J0IHR5cGUgR3VpRmlsbE1vZGUgPSAnZmxhdCcgfCAnZ3JhZGllbnQnIHwgJ2ltYWdlJztcblxuZXhwb3J0IHR5cGUgR3VpU2xpZGVyTW9kZSA9ICdub3JtYWwnIHwgJ3JhbmdlJztcblxuZXhwb3J0IHR5cGUgR3VpVGFic01vZGUgPSAnbm9ybWFsJyB8ICdsaXN0JztcblxuZXhwb3J0IHR5cGUgR3VpQmFzaWNWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEd1aURlZmF1bHRWYWx1ZSA9IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBhbnlbXSB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsO1xuXG5leHBvcnQgdHlwZSBHdWlPcGVyYXRvciA9ICckZXEnIHwgJyRuZScgfCAnJGd0JyB8ICckbHQnIHwgJyRndGUnIHwgJyRsdGUnIHwgJyRpbicgfCAnJG5pbic7XG5cbmV4cG9ydCB0eXBlIEd1aUNvbmRpdGlvbiA9IFtzdHJpbmcsIEd1aU9wZXJhdG9yLCBHdWlEZWZhdWx0VmFsdWVdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aUZpZWxkU2hvd0lmIHtcbiAgY29uZGl0aW9uczogR3VpQ29uZGl0aW9uW107XG4gIGxvZ2ljYWxUeXBlPzogJyRhbmQnIHwgJyRvcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpRmllbGQge1xuICB0eXBlOiBHdWlGaWVsZFR5cGU7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVmYXVsdD86IEd1aURlZmF1bHRWYWx1ZTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIGNvbD86IG51bWJlcjtcbiAgc2hvd0lmPzogR3VpRmllbGRTaG93SWY7XG4gIHNob3c/OiBib29sZWFuO1xuICAvLyBncm91cCAmIHN1Ymdyb3VwICYgbWVudSAmIHRhYnMgJiBpbmxpbmVcbiAgY2hpbGRyZW4/OiBHdWlGaWVsZHMgfCBHdWlGaWVsZFtdO1xuICAvLyBncm91cCAmIHRhYnNcbiAgZXhwYW5kZWQ/OiBib29sZWFuO1xuICAvLyBudW1iZXIgJiBzbGlkZXJcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHN0ZXA/OiBudW1iZXI7XG4gIC8vIHRleHQgJiBudW1iZXIgJiBzbGlkZXIgJiBzZWxlY3RcbiAgcHJlZml4Pzogc3RyaW5nO1xuICBzdWZmaXg/OiBzdHJpbmc7XG4gIC8vIHNlbGVjdCAmIGJ1dHRvblRvZ2dsZSAmIGltYWdlU2VsZWN0XG4gIG9wdGlvbnM/OiBHdWlGaWVsZE9wdGlvbltdO1xuICAvLyBzZWxlY3RcbiAgdXNlRm9udD86IGJvb2xlYW47XG4gIC8vIHNlbGVjdCAmIGJ1dHRvblRvZ2dsZVxuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIC8vIGJ1dHRvblRvZ2dsZVxuICB1c2VJY29uPzogYm9vbGVhbjtcbiAgLy8gdGFic1xuICB0ZW1wbGF0ZT86IFBhcnRpYWw8R3VpRmllbGQ+O1xuICBhZGRhYmxlPzogYm9vbGVhbjtcbiAgLy8gZmlsbCAmIHNsaWRlciAmIHRhYnNcbiAgbW9kZT86IEd1aUZpbGxNb2RlIHwgR3VpU2xpZGVyTW9kZSB8IEd1aVRhYnNNb2RlO1xuICAvLyB0ZXh0YXJlYVxuICByb3dzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBHdWlGaWVsZHMgPSBSZWNvcmQ8c3RyaW5nLCBHdWlGaWVsZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpRmllbGRPcHRpb24ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICBzcmM/OiBzdHJpbmc7XG4gIGNvbD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlDb250cm9sIGV4dGVuZHMgR3VpRmllbGQge1xuICBfdHlwZTogJ2NvbnRyb2wnIHwgJ2dyb3VwJyB8ICdhcnJheSc7XG4gIGtleTogc3RyaW5nO1xuICBwYXJlbnRUeXBlOiBHdWlGaWVsZFR5cGU7XG4gIG1vZGVsPzogYW55O1xuICBkZWZhdWx0PzogYW55O1xuICBpbmRleD86IG51bWJlcjtcbiAgY2hpbGRyZW4/OiBHdWlDb250cm9sW107XG4gIHRlbXBsYXRlPzogUGFydGlhbDxHdWlDb250cm9sPjtcbiAgc2VsZWN0ZWRJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgR3VpQ29udHJvbHMgPSBSZWNvcmQ8c3RyaW5nLCBHdWlDb250cm9sPjtcbiJdfQ==