UNPKG

ontimize-web-ngx

Version:
87 lines 25.7 kB
import { ChangeDetectionStrategy, Component, Injector, ViewChild } from '@angular/core'; import { UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; import { MatDialogRef } from '@angular/material/dialog'; import { MatSelectionList } from '@angular/material/list'; import { OTableBaseDialogClass } from '../o-table-base-dialog.class'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; import * as i2 from "@angular/common"; import * as i3 from "@angular/flex-layout/flex"; import * as i4 from "@angular/forms"; import * as i5 from "../../../../../directives/o-mat-error.directive"; import * as i6 from "@angular/material/button"; import * as i7 from "@angular/material/checkbox"; import * as i8 from "@angular/material/icon"; import * as i9 from "@angular/material/input"; import * as i10 from "@angular/material/form-field"; import * as i11 from "@angular/material/list"; import * as i12 from "@angular/material/tooltip"; import * as i13 from "../../../../../pipes/o-translate.pipe"; export class OTableStoreConfigurationDialogComponent extends OTableBaseDialogClass { constructor(dialogRef, injector) { super(injector); this.dialogRef = dialogRef; this.injector = injector; this.properties = [{ property: 'sort-columns', name: 'TABLE.DIALOG.PROPERTIES.SORT', info: 'TABLE.DIALOG.PROPERTIES.SORT.INFO' }, { property: 'oColumns-display', name: 'TABLE.DIALOG.PROPERTIES.COLUMNS_DISPLAY', info: 'TABLE.DIALOG.PROPERTIES.COLUMNS_DISPLAY.INFO' }, { property: 'quick-filter', name: 'TABLE.DIALOG.PROPERTIES.QUICK_FILTER', info: 'TABLE.DIALOG.PROPERTIES.QUICK_FILTER.INFO' }, { property: 'columns-filter', name: 'TABLE.DIALOG.PROPERTIES.COLUMNS_FILTER', info: 'TABLE.DIALOG.PROPERTIES.COLUMNS_FILTER.INFO' }, { property: 'filter-builder', name: 'TABLE.DIALOG.PROPERTIES.FILTER_BUILDER', info: 'TABLE.DIALOG.PROPERTIES.FILTER_BUILDER.INFO' }, { property: 'page', name: 'TABLE.DIALOG.PROPERTIES.PAGE', info: 'TABLE.DIALOG.PROPERTIES.PAGE.INFO' }]; this.formGroup = new UntypedFormGroup({ name: new UntypedFormControl('', [ Validators.required ]), description: new UntypedFormControl('') }); this.setFormControl(this.formGroup.get('name')); } ngAfterViewInit() { this.propertiesList.selectAll(); } areAllSelected() { return this.propertiesList && this.propertiesList.options && this.propertiesList.options.length === this.propertiesList.selectedOptions.selected.length; } onSelectAllChange(event) { event.checked ? this.propertiesList.selectAll() : this.propertiesList.deselectAll(); } getConfigurationAttributes() { return this.formGroup.value; } getSelectedTableProperties() { const selected = this.propertiesList.selectedOptions.selected; return selected.length ? selected.map(item => item.value) : []; } isIndeterminate() { return !this.areAllSelected(); } } OTableStoreConfigurationDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableStoreConfigurationDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); OTableStoreConfigurationDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableStoreConfigurationDialogComponent, selector: "o-table-store-configuration-dialog", viewQueries: [{ propertyName: "propertiesList", first: true, predicate: ["propertiesList"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<span mat-dialog-title>{{ 'TABLE.BUTTONS.SAVE_CONFIGURATION' | oTranslate }}</span>\n\n<mat-dialog-content>\n <div mat-subheader>{{ 'TABLE.DIALOG.SAVE_CONFIGURATION' | oTranslate }}</div>\n <form #form [formGroup]=\"formGroup\" fxLayout=\"column\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput [matTooltip]=\"tooltipText\" [matTooltipClass]=\"tooltipClass\" placeholder=\"{{ 'TABLE.DIALOG.CONFIGURATION_NAME' | oTranslate }}\"\n formControlName=\"name\" required />\n <mat-error *oMatError=\"hasError(formGroup.controls['name'], 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n <mat-form-field class=\"example-full-width\" subscriptSizing=\"dynamic\">\n <textarea matInput placeholder=\"{{ 'TABLE.DIALOG.CONFIGURATION_DESCRIPTION' | oTranslate }}\" formControlName=\"description\" rows=\"4\"\n cols=\"50\"></textarea>\n </mat-form-field>\n <div class=\"inner-subheader\" mat-subheader>{{ 'TABLE.DIALOG.CONFIGURATION_PROPERTIES' | oTranslate }}</div>\n <div fxLayout=\"column\">\n <mat-checkbox (change)=\"onSelectAllChange($event)\" [checked]=\"areAllSelected()\" [indeterminate]=\"isIndeterminate()\" class=\"select-all-checkbox\">\n {{ 'SELECT_ALL' | oTranslate }}\n </mat-checkbox>\n\n <mat-selection-list #propertiesList class=\"o-table-save-configuration-dialog-list o-scroll\">\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let property of properties\" [value]=\"property.property\">\n <span matListItemTitle fxFlex>{{ property.name | oTranslate }}</span>\n <mat-icon matListItemIcon *ngIf=\"property.info\" matTooltip=\"{{ property.info | oTranslate }}\" class=\"o-tscd-list-tooltip\">info</mat-icon>\n </mat-list-option>\n </mat-selection-list>\n </div>\n </form>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button type=\"button\" mat-stroked-button class=\"mat-primary\" [mat-dialog-close]=\"false\" class=\"o-button-default cancel\">\n {{ 'CANCEL' | oTranslate }}</button>\n <button type=\"button\" mat-stroked-button class=\"mat-primary\" [mat-dialog-close]=\"true\"\n [disabled]=\"!formGroup.valid || propertiesList.selectedOptions.selected.length===0\" class=\"o-button-primary\">{{ 'SAVE' | oTranslate }}</button>\n</mat-dialog-actions>\n", styles: [".o-table-save-configuration-dialog-list{max-height:120px;overflow-y:scroll}.o-table-save-configuration-dialog-list .mat-mdc-list-item .o-tscd-list-tooltip.mat-icon{opacity:.25}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i5.OMatErrorDirective, selector: "[oMatError]", inputs: ["oMatError"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i11.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i11.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i11.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i11.MatListSubheaderCssMatStyler, selector: "[mat-subheader], [matSubheader]" }, { kind: "directive", type: i11.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i13.OTranslatePipe, name: "oTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableStoreConfigurationDialogComponent, decorators: [{ type: Component, args: [{ selector: 'o-table-store-configuration-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span mat-dialog-title>{{ 'TABLE.BUTTONS.SAVE_CONFIGURATION' | oTranslate }}</span>\n\n<mat-dialog-content>\n <div mat-subheader>{{ 'TABLE.DIALOG.SAVE_CONFIGURATION' | oTranslate }}</div>\n <form #form [formGroup]=\"formGroup\" fxLayout=\"column\">\n <mat-form-field subscriptSizing=\"dynamic\">\n <input matInput [matTooltip]=\"tooltipText\" [matTooltipClass]=\"tooltipClass\" placeholder=\"{{ 'TABLE.DIALOG.CONFIGURATION_NAME' | oTranslate }}\"\n formControlName=\"name\" required />\n <mat-error *oMatError=\"hasError(formGroup.controls['name'], 'required')\">\n {{ 'FORM_VALIDATION.REQUIRED' | oTranslate }}\n </mat-error>\n </mat-form-field>\n <mat-form-field class=\"example-full-width\" subscriptSizing=\"dynamic\">\n <textarea matInput placeholder=\"{{ 'TABLE.DIALOG.CONFIGURATION_DESCRIPTION' | oTranslate }}\" formControlName=\"description\" rows=\"4\"\n cols=\"50\"></textarea>\n </mat-form-field>\n <div class=\"inner-subheader\" mat-subheader>{{ 'TABLE.DIALOG.CONFIGURATION_PROPERTIES' | oTranslate }}</div>\n <div fxLayout=\"column\">\n <mat-checkbox (change)=\"onSelectAllChange($event)\" [checked]=\"areAllSelected()\" [indeterminate]=\"isIndeterminate()\" class=\"select-all-checkbox\">\n {{ 'SELECT_ALL' | oTranslate }}\n </mat-checkbox>\n\n <mat-selection-list #propertiesList class=\"o-table-save-configuration-dialog-list o-scroll\">\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let property of properties\" [value]=\"property.property\">\n <span matListItemTitle fxFlex>{{ property.name | oTranslate }}</span>\n <mat-icon matListItemIcon *ngIf=\"property.info\" matTooltip=\"{{ property.info | oTranslate }}\" class=\"o-tscd-list-tooltip\">info</mat-icon>\n </mat-list-option>\n </mat-selection-list>\n </div>\n </form>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button type=\"button\" mat-stroked-button class=\"mat-primary\" [mat-dialog-close]=\"false\" class=\"o-button-default cancel\">\n {{ 'CANCEL' | oTranslate }}</button>\n <button type=\"button\" mat-stroked-button class=\"mat-primary\" [mat-dialog-close]=\"true\"\n [disabled]=\"!formGroup.valid || propertiesList.selectedOptions.selected.length===0\" class=\"o-button-primary\">{{ 'SAVE' | oTranslate }}</button>\n</mat-dialog-actions>\n", styles: [".o-table-save-configuration-dialog-list{max-height:120px;overflow-y:scroll}.o-table-save-configuration-dialog-list .mat-mdc-list-item .o-tscd-list-tooltip.mat-icon{opacity:.25}\n"] }] }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i0.Injector }]; }, propDecorators: { propertiesList: [{ type: ViewChild, args: ['propertiesList'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS1zdG9yZS1jb25maWd1cmF0aW9uLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9leHRlbnNpb25zL2RpYWxvZy9zdG9yZS1jb25maWd1cmF0aW9uL28tdGFibGUtc3RvcmUtY29uZmlndXJhdGlvbi1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvZXh0ZW5zaW9ucy9kaWFsb2cvc3RvcmUtY29uZmlndXJhdGlvbi9vLXRhYmxlLXN0b3JlLWNvbmZpZ3VyYXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQWlCLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVFyRSxNQUFNLE9BQU8sdUNBQXdDLFNBQVEscUJBQXFCO0lBc0NoRixZQUNTLFNBQWdFLEVBQzdELFFBQWtCO1FBRTVCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUhULGNBQVMsR0FBVCxTQUFTLENBQXVEO1FBQzdELGFBQVEsR0FBUixRQUFRLENBQVU7UUFuQ3ZCLGVBQVUsR0FBVSxDQUFDO2dCQUMxQixRQUFRLEVBQUUsY0FBYztnQkFDeEIsSUFBSSxFQUFFLDhCQUE4QjtnQkFDcEMsSUFBSSxFQUFFLG1DQUFtQzthQUMxQyxFQUFFO2dCQUNELFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLElBQUksRUFBRSx5Q0FBeUM7Z0JBQy9DLElBQUksRUFBRSw4Q0FBOEM7YUFDckQsRUFBRTtnQkFDRCxRQUFRLEVBQUUsY0FBYztnQkFDeEIsSUFBSSxFQUFFLHNDQUFzQztnQkFDNUMsSUFBSSxFQUFFLDJDQUEyQzthQUNsRCxFQUFFO2dCQUNELFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLElBQUksRUFBRSx3Q0FBd0M7Z0JBQzlDLElBQUksRUFBRSw2Q0FBNkM7YUFDcEQsRUFBRTtnQkFDRCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixJQUFJLEVBQUUsd0NBQXdDO2dCQUM5QyxJQUFJLEVBQUUsNkNBQTZDO2FBQ3BELEVBQUU7Z0JBQ0QsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLElBQUksRUFBRSw4QkFBOEI7Z0JBQ3BDLElBQUksRUFBRSxtQ0FBbUM7YUFDMUMsQ0FBQyxDQUFDO1FBRUksY0FBUyxHQUFxQixJQUFJLGdCQUFnQixDQUFDO1lBQ3hELElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLEVBQUUsRUFBRTtnQkFDL0IsVUFBVSxDQUFDLFFBQVE7YUFDcEIsQ0FBQztZQUNGLFdBQVcsRUFBRSxJQUFJLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztTQUN4QyxDQUFDLENBQUM7UUFPRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDMUosQ0FBQztJQUVNLGlCQUFpQixDQUFDLEtBQXdCO1FBQy9DLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEYsQ0FBQztJQUVNLDBCQUEwQjtRQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFTSwwQkFBMEI7UUFDL0IsTUFBTSxRQUFRLEdBQW9CLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUMvRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ2hDLENBQUM7O3FJQXJFVSx1Q0FBdUM7eUhBQXZDLHVDQUF1QyxtTkNkcEQsbTFFQXNDQTs0RkR4QmEsdUNBQXVDO2tCQU5uRCxTQUFTOytCQUNFLG9DQUFvQyxtQkFHN0IsdUJBQXVCLENBQUMsTUFBTTswSEFLeEMsY0FBYztzQkFEcEIsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbmplY3RvciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRDaGVja2JveENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRMaXN0T3B0aW9uLCBNYXRTZWxlY3Rpb25MaXN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XG5cbmltcG9ydCB7IE9UYWJsZUJhc2VEaWFsb2dDbGFzcyB9IGZyb20gJy4uL28tdGFibGUtYmFzZS1kaWFsb2cuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLXRhYmxlLXN0b3JlLWNvbmZpZ3VyYXRpb24tZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL28tdGFibGUtc3RvcmUtY29uZmlndXJhdGlvbi1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vLXRhYmxlLXN0b3JlLWNvbmZpZ3VyYXRpb24tZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE9UYWJsZVN0b3JlQ29uZmlndXJhdGlvbkRpYWxvZ0NvbXBvbmVudCBleHRlbmRzIE9UYWJsZUJhc2VEaWFsb2dDbGFzcyBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuXG4gIEBWaWV3Q2hpbGQoJ3Byb3BlcnRpZXNMaXN0JylcbiAgcHVibGljIHByb3BlcnRpZXNMaXN0OiBNYXRTZWxlY3Rpb25MaXN0O1xuXG4gIHB1YmxpYyBwcm9wZXJ0aWVzOiBhbnlbXSA9IFt7XG4gICAgcHJvcGVydHk6ICdzb3J0LWNvbHVtbnMnLFxuICAgIG5hbWU6ICdUQUJMRS5ESUFMT0cuUFJPUEVSVElFUy5TT1JUJyxcbiAgICBpbmZvOiAnVEFCTEUuRElBTE9HLlBST1BFUlRJRVMuU09SVC5JTkZPJ1xuICB9LCB7XG4gICAgcHJvcGVydHk6ICdvQ29sdW1ucy1kaXNwbGF5JyxcbiAgICBuYW1lOiAnVEFCTEUuRElBTE9HLlBST1BFUlRJRVMuQ09MVU1OU19ESVNQTEFZJyxcbiAgICBpbmZvOiAnVEFCTEUuRElBTE9HLlBST1BFUlRJRVMuQ09MVU1OU19ESVNQTEFZLklORk8nXG4gIH0sIHtcbiAgICBwcm9wZXJ0eTogJ3F1aWNrLWZpbHRlcicsXG4gICAgbmFtZTogJ1RBQkxFLkRJQUxPRy5QUk9QRVJUSUVTLlFVSUNLX0ZJTFRFUicsXG4gICAgaW5mbzogJ1RBQkxFLkRJQUxPRy5QUk9QRVJUSUVTLlFVSUNLX0ZJTFRFUi5JTkZPJ1xuICB9LCB7XG4gICAgcHJvcGVydHk6ICdjb2x1bW5zLWZpbHRlcicsXG4gICAgbmFtZTogJ1RBQkxFLkRJQUxPRy5QUk9QRVJUSUVTLkNPTFVNTlNfRklMVEVSJyxcbiAgICBpbmZvOiAnVEFCTEUuRElBTE9HLlBST1BFUlRJRVMuQ09MVU1OU19GSUxURVIuSU5GTydcbiAgfSwge1xuICAgIHByb3BlcnR5OiAnZmlsdGVyLWJ1aWxkZXInLFxuICAgIG5hbWU6ICdUQUJMRS5ESUFMT0cuUFJPUEVSVElFUy5GSUxURVJfQlVJTERFUicsXG4gICAgaW5mbzogJ1RBQkxFLkRJQUxPRy5QUk9QRVJUSUVTLkZJTFRFUl9CVUlMREVSLklORk8nXG4gIH0sIHtcbiAgICBwcm9wZXJ0eTogJ3BhZ2UnLFxuICAgIG5hbWU6ICdUQUJMRS5ESUFMT0cuUFJPUEVSVElFUy5QQUdFJyxcbiAgICBpbmZvOiAnVEFCTEUuRElBTE9HLlBST1BFUlRJRVMuUEFHRS5JTkZPJ1xuICB9XTtcblxuICBwdWJsaWMgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgIG5hbWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycsIFtcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcbiAgICBdKSxcbiAgICBkZXNjcmlwdGlvbjogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJylcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE9UYWJsZVN0b3JlQ29uZmlndXJhdGlvbkRpYWxvZ0NvbXBvbmVudD4sXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgdGhpcy5zZXRGb3JtQ29udHJvbCh0aGlzLmZvcm1Hcm91cC5nZXQoJ25hbWUnKSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucHJvcGVydGllc0xpc3Quc2VsZWN0QWxsKCk7XG4gIH1cblxuICBwdWJsaWMgYXJlQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllc0xpc3QgJiYgdGhpcy5wcm9wZXJ0aWVzTGlzdC5vcHRpb25zICYmIHRoaXMucHJvcGVydGllc0xpc3Qub3B0aW9ucy5sZW5ndGggPT09IHRoaXMucHJvcGVydGllc0xpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdEFsbENoYW5nZShldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpOiB2b2lkIHtcbiAgICBldmVudC5jaGVja2VkID8gdGhpcy5wcm9wZXJ0aWVzTGlzdC5zZWxlY3RBbGwoKSA6IHRoaXMucHJvcGVydGllc0xpc3QuZGVzZWxlY3RBbGwoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25maWd1cmF0aW9uQXR0cmlidXRlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFRhYmxlUHJvcGVydGllcygpOiBhbnlbXSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQ6IE1hdExpc3RPcHRpb25bXSA9IHRoaXMucHJvcGVydGllc0xpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkO1xuICAgIHJldHVybiBzZWxlY3RlZC5sZW5ndGggPyBzZWxlY3RlZC5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuYXJlQWxsU2VsZWN0ZWQoKTtcbiAgfVxuXG59XG4iLCI8c3BhbiBtYXQtZGlhbG9nLXRpdGxlPnt7ICdUQUJMRS5CVVRUT05TLlNBVkVfQ09ORklHVVJBVElPTicgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuICA8ZGl2IG1hdC1zdWJoZWFkZXI+e3sgJ1RBQkxFLkRJQUxPRy5TQVZFX0NPTkZJR1VSQVRJT04nIHwgb1RyYW5zbGF0ZSB9fTwvZGl2PlxuICA8Zm9ybSAjZm9ybSBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIGZ4TGF5b3V0PVwiY29sdW1uXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0VG9vbHRpcF09XCJ0b29sdGlwVGV4dFwiIFttYXRUb29sdGlwQ2xhc3NdPVwidG9vbHRpcENsYXNzXCIgcGxhY2Vob2xkZXI9XCJ7eyAnVEFCTEUuRElBTE9HLkNPTkZJR1VSQVRJT05fTkFNRScgfCBvVHJhbnNsYXRlIH19XCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiIHJlcXVpcmVkIC8+XG4gICAgICA8bWF0LWVycm9yICpvTWF0RXJyb3I9XCJoYXNFcnJvcihmb3JtR3JvdXAuY29udHJvbHNbJ25hbWUnXSwgJ3JlcXVpcmVkJylcIj5cbiAgICAgICAge3sgJ0ZPUk1fVkFMSURBVElPTi5SRVFVSVJFRCcgfCBvVHJhbnNsYXRlIH19XG4gICAgICA8L21hdC1lcnJvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImV4YW1wbGUtZnVsbC13aWR0aFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cInt7ICdUQUJMRS5ESUFMT0cuQ09ORklHVVJBVElPTl9ERVNDUklQVElPTicgfCBvVHJhbnNsYXRlIH19XCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIiByb3dzPVwiNFwiXG4gICAgICAgIGNvbHM9XCI1MFwiPjwvdGV4dGFyZWE+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXItc3ViaGVhZGVyXCIgbWF0LXN1YmhlYWRlcj57eyAnVEFCTEUuRElBTE9HLkNPTkZJR1VSQVRJT05fUFJPUEVSVElFUycgfCBvVHJhbnNsYXRlIH19PC9kaXY+XG4gICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiPlxuICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsQ2hhbmdlKCRldmVudClcIiBbY2hlY2tlZF09XCJhcmVBbGxTZWxlY3RlZCgpXCIgW2luZGV0ZXJtaW5hdGVdPVwiaXNJbmRldGVybWluYXRlKClcIiBjbGFzcz1cInNlbGVjdC1hbGwtY2hlY2tib3hcIj5cbiAgICAgICAge3sgJ1NFTEVDVF9BTEwnIHwgb1RyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtY2hlY2tib3g+XG5cbiAgICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgI3Byb3BlcnRpZXNMaXN0IGNsYXNzPVwiby10YWJsZS1zYXZlLWNvbmZpZ3VyYXRpb24tZGlhbG9nLWxpc3Qgby1zY3JvbGxcIj5cbiAgICAgICAgPG1hdC1saXN0LW9wdGlvbiBjaGVja2JveFBvc2l0aW9uPVwiYmVmb3JlXCIgKm5nRm9yPVwibGV0IHByb3BlcnR5IG9mIHByb3BlcnRpZXNcIiBbdmFsdWVdPVwicHJvcGVydHkucHJvcGVydHlcIj5cbiAgICAgICAgICA8c3BhbiBtYXRMaXN0SXRlbVRpdGxlIGZ4RmxleD57eyBwcm9wZXJ0eS5uYW1lIHwgb1RyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWljb24gbWF0TGlzdEl0ZW1JY29uICpuZ0lmPVwicHJvcGVydHkuaW5mb1wiIG1hdFRvb2x0aXA9XCJ7eyBwcm9wZXJ0eS5pbmZvIHwgb1RyYW5zbGF0ZSB9fVwiIGNsYXNzPVwiby10c2NkLWxpc3QtdG9vbHRpcFwiPmluZm88L21hdC1pY29uPlxuICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucyBhbGlnbj1cImVuZFwiPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiIFttYXQtZGlhbG9nLWNsb3NlXT1cImZhbHNlXCIgY2xhc3M9XCJvLWJ1dHRvbi1kZWZhdWx0IGNhbmNlbFwiPlxuICAgIHt7ICdDQU5DRUwnIHwgb1RyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiIFttYXQtZGlhbG9nLWNsb3NlXT1cInRydWVcIlxuICAgIFtkaXNhYmxlZF09XCIhZm9ybUdyb3VwLnZhbGlkIHx8IHByb3BlcnRpZXNMaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGg9PT0wXCIgY2xhc3M9XCJvLWJ1dHRvbi1wcmltYXJ5XCI+e3sgJ1NBVkUnIHwgb1RyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4iXX0=