verben-ng-ui 1.4.3 → 1.4.5
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.
- package/esm2022/src/lib/components/data-export/data-export.component.mjs +1 -1
- package/esm2022/src/lib/components/data-extend/data-extend.component.mjs +1 -1
- package/esm2022/src/lib/components/data-filter/data-filter.component.mjs +1 -1
- package/esm2022/src/lib/components/data-import/data-import.component.mjs +1 -1
- package/esm2022/src/lib/components/data-view/data-view.component.mjs +4 -1
- package/esm2022/src/lib/components/data-xport/data-xport.component.mjs +1 -1
- package/esm2022/src/lib/components/date-picker/date-picker.component.mjs +215 -23
- package/esm2022/src/lib/components/drop-down/drop-down.component.mjs +47 -2
- package/esm2022/src/lib/components/number-input/number-input.component.mjs +157 -13
- package/esm2022/src/lib/components/table-filter/table-filter.component.mjs +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-export.mjs +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-export.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-extend.mjs +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-extend.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-filter.mjs +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-filter.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-import.mjs +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-import.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-view.mjs +3 -0
- package/fesm2022/verben-ng-ui-src-lib-components-data-view.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-xport.mjs +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-data-xport.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-date-picker.mjs +214 -22
- package/fesm2022/verben-ng-ui-src-lib-components-date-picker.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-drop-down.mjs +46 -1
- package/fesm2022/verben-ng-ui-src-lib-components-drop-down.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-number-input.mjs +156 -12
- package/fesm2022/verben-ng-ui-src-lib-components-number-input.mjs.map +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-table-filter.mjs +1 -1
- package/fesm2022/verben-ng-ui-src-lib-components-table-filter.mjs.map +1 -1
- package/package.json +78 -78
- package/src/lib/components/data-view/data-view.component.d.ts +1 -0
- package/src/lib/components/date-picker/date-picker.component.d.ts +28 -6
- package/src/lib/components/drop-down/drop-down.component.d.ts +7 -3
- package/src/lib/components/number-input/number-input.component.d.ts +22 -3
|
@@ -194,7 +194,7 @@ export class DataExportComponent {
|
|
|
194
194
|
this.showAllGroups = !this.showAllGroups;
|
|
195
195
|
}
|
|
196
196
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataExportComponent, deps: [{ token: i1.DataExportService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
197
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: DataExportComponent, selector: "lib-data-export", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: false, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, dataFetchUrl: { classPropertyName: "dataFetchUrl", publicName: "dataFetchUrl", isSignal: true, isRequired: false, transformFunction: null }, dataQueryParameters: { classPropertyName: "dataQueryParameters", publicName: "dataQueryParameters", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n <div class=\"operation-grid\">\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select field\"\n [options]=\"numericProperties.concat(stringProperties)\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n [(ngModel)]=\"newOperation.operator\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n\n <section class=\"section\">\n @if (dataFetchUrl()) {\n <div class=\"section-header\">\n <h3 class=\"section-title\">Record Size</h3>\n </div>\n }\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
197
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: DataExportComponent, selector: "lib-data-export", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: false, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, dataFetchUrl: { classPropertyName: "dataFetchUrl", publicName: "dataFetchUrl", isSignal: true, isRequired: false, transformFunction: null }, dataQueryParameters: { classPropertyName: "dataQueryParameters", publicName: "dataQueryParameters", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exportDataEvent: "exportDataEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n <div class=\"operation-grid\">\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select field\"\n [options]=\"numericProperties.concat(stringProperties)\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n height=\"'1.25rem'\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n [(ngModel)]=\"newOperation.operator\"\n >\n </verben-drop-down>\n <verben-drop-down\n width=\"'8rem'\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n\n <section class=\"section\">\n @if (dataFetchUrl()) {\n <div class=\"section-header\">\n <h3 class=\"section-title\">Record Size</h3>\n </div>\n }\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"exportData()\">Export</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "autoScrollToCurrentItem", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
198
198
|
}
|
|
199
199
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataExportComponent, decorators: [{
|
|
200
200
|
type: Component,
|
|
@@ -105,7 +105,7 @@ export class DataExtendComponent {
|
|
|
105
105
|
this.selectedItem = item;
|
|
106
106
|
}
|
|
107
107
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataExtendComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
108
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.10", type: DataExtendComponent, selector: "lib-data-extend", inputs: { properties: { classPropertyName: "properties", publicName: "properties", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { extendDataEvent: "extendDataEvent" }, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Expand</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"reset()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Entity</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let item of visibleItems(); let i = index\" class=\"item\">\n <div class=\"item-label\">\n <!-- <input\n type=\"checkbox\"\n [id]=\"'item-' + i\"\n [(ngModel)]=\"item.selected\"\n /> -->\n <label [for]=\"'item-' + i\" class=\"checkbox-label\">\n {{ item.Name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editItem(i)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeItem(i)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"items().length > 3\"\n (click)=\"toggleShowAll()\"\n class=\"show-more\"\n >\n <span>{{ showAll() ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Properties</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"form\" (ngSubmit)=\"addItem()\">\n <div class=\"\">\n <p class=\"\">Name</p>\n <verbena-input\n placeholder=\"Enter property name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"Name\"\n ></verbena-input>\n </div>\n\n <div>\n <label for=\"DataType\">Data Type</label>\n <verben-drop-down\n id=\"DataType\"\n width=\"'100%'\"\n height=\"'1.25rem'\"\n placeholder=\"Select type\"\n [options]=\"dataTypes\"\n formControlName=\"DataType\"\n >\n </verben-drop-down>\n </div>\n\n <div>\n <label htmlFor=\"Options\" class=\"mb-2\">Enter Options</label>\n <verben-chip\n label=\"Options\"\n id=\"Options\"\n [placeholder]=\"'Enter Options'\"\n formControlName=\"Options\"\n ></verben-chip>\n </div>\n\n <div>\n <label for=\"DefaultValue\">Default Value</label>\n\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n formControlName=\"DefaultValue\"\n id=\"DefaultValue\"\n label=\"Default Value (optional)\"\n />\n </div>\n\n <div>\n <p class=\"mb-2\">Required</p>\n\n <verbena-switch\n label=\"Required\"\n [onColor]=\"'var(--vbn-state-on)'\"\n formControlName=\"IsRequired\"\n ></verbena-switch>\n </div>\n\n <div class=\"value-range\">\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n formControlName=\"MinValue\"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n formControlName=\"MinValue\"\n />\n </div>\n\n <button\n [disabled]=\"!form.valid\"\n class=\"add-button ml-auto\"\n type=\"submit\"\n >\n + Add\n </button>\n </form>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"save()\">Extend</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;margin-left:auto;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}.value-range{display:flex;gap:.5rem;align-items:center}\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: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i7.VerbenaSwitchComponent, selector: "verbena-switch", inputs: ["label", "checked", "disabled", "offColor", "onColor", "onText", "offText", "width", "height", "customStyles"], outputs: ["change"] }, { kind: "component", type: i8.ChipComponent, selector: "verben-chip", inputs: ["width", "placeholder", "max", "styleClass", "separator", "disabled", "required", "invalidMessage", "errorPosition"], outputs: ["onChange"] }] });
|
|
108
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.10", type: DataExtendComponent, selector: "lib-data-extend", inputs: { properties: { classPropertyName: "properties", publicName: "properties", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { extendDataEvent: "extendDataEvent" }, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Expand</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"reset()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Entity</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let item of visibleItems(); let i = index\" class=\"item\">\n <div class=\"item-label\">\n <!-- <input\n type=\"checkbox\"\n [id]=\"'item-' + i\"\n [(ngModel)]=\"item.selected\"\n /> -->\n <label [for]=\"'item-' + i\" class=\"checkbox-label\">\n {{ item.Name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editItem(i)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeItem(i)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"items().length > 3\"\n (click)=\"toggleShowAll()\"\n class=\"show-more\"\n >\n <span>{{ showAll() ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Properties</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"form\" (ngSubmit)=\"addItem()\">\n <div class=\"\">\n <p class=\"\">Name</p>\n <verbena-input\n placeholder=\"Enter property name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"Name\"\n ></verbena-input>\n </div>\n\n <div>\n <label for=\"DataType\">Data Type</label>\n <verben-drop-down\n id=\"DataType\"\n width=\"'100%'\"\n height=\"'1.25rem'\"\n placeholder=\"Select type\"\n [options]=\"dataTypes\"\n formControlName=\"DataType\"\n >\n </verben-drop-down>\n </div>\n\n <div>\n <label htmlFor=\"Options\" class=\"mb-2\">Enter Options</label>\n <verben-chip\n label=\"Options\"\n id=\"Options\"\n [placeholder]=\"'Enter Options'\"\n formControlName=\"Options\"\n ></verben-chip>\n </div>\n\n <div>\n <label for=\"DefaultValue\">Default Value</label>\n\n <verbena-input\n [placeHolder]=\"'Enter default text'\"\n formControlName=\"DefaultValue\"\n id=\"DefaultValue\"\n label=\"Default Value (optional)\"\n />\n </div>\n\n <div>\n <p class=\"mb-2\">Required</p>\n\n <verbena-switch\n label=\"Required\"\n [onColor]=\"'var(--vbn-state-on)'\"\n formControlName=\"IsRequired\"\n ></verbena-switch>\n </div>\n\n <div class=\"value-range\">\n <verbena-input\n [type]=\"'number'\"\n name=\"minValue\"\n label=\"Min Value\"\n formControlName=\"MinValue\"\n />\n <verbena-input\n [type]=\"'number'\"\n name=\"maxValue\"\n label=\"Max Value\"\n formControlName=\"MinValue\"\n />\n </div>\n\n <button\n [disabled]=\"!form.valid\"\n class=\"add-button ml-auto\"\n type=\"submit\"\n >\n + Add\n </button>\n </form>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"save()\">Extend</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;margin-left:auto;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}.value-range{display:flex;gap:.5rem;align-items:center}\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: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "autoScrollToCurrentItem", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i7.VerbenaSwitchComponent, selector: "verbena-switch", inputs: ["label", "checked", "disabled", "offColor", "onColor", "onText", "offText", "width", "height", "customStyles"], outputs: ["change"] }, { kind: "component", type: i8.ChipComponent, selector: "verben-chip", inputs: ["width", "placeholder", "max", "styleClass", "separator", "disabled", "required", "invalidMessage", "errorPosition"], outputs: ["onChange"] }] });
|
|
109
109
|
}
|
|
110
110
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataExtendComponent, decorators: [{
|
|
111
111
|
type: Component,
|
|
@@ -401,7 +401,7 @@ export class DataFilterComponent {
|
|
|
401
401
|
return this.savedFilters.filter((filter) => filter.selected || this.isRequired(filter)).length;
|
|
402
402
|
}
|
|
403
403
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
404
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.10", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data", initialFilters: "initialFilters" }, outputs: { filterApplied: "filterApplied", resetFilter: "resetFilter" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div\n *ngFor=\"let filter of visibleFilters\"\n class=\"item\"\n [class.item-editing]=\"isEditing(filter)\"\n >\n <div class=\"item-label\">\n <!-- A required filter is always active, so its checkbox is ticked and\n locked rather than hidden \u2014 the state stays readable. -->\n <input\n type=\"checkbox\"\n [(ngModel)]=\"filter.selected\"\n [disabled]=\"isRequired(filter)\"\n (ngModelChange)=\"markTouched()\"\n />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n\n <div class=\"item-actions\">\n <button\n type=\"button\"\n class=\"icon-button\"\n aria-label=\"Edit filter\"\n (click)=\"editFilter(filter)\"\n >\n <!-- Only `stroke` is passed: `verben-svg` resolves a single colour as\n `fill || stroke` and applies it to both, so also passing `fill`\n would paint the icon in whatever `fill` holds. -->\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n ></verben-svg>\n </button>\n <button\n type=\"button\"\n class=\"icon-button\"\n aria-label=\"Delete filter\"\n [disabled]=\"isRequired(filter)\"\n (click)=\"deleteFilter(filter)\"\n >\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n ></verben-svg>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [disabled]=\"isEditingRequired\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input \u2014 native rather than the library date picker, whose\n overlay renders off screen from this narrow panel. -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeHolder=\"Select date\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeHolder=\"Enter number\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Yes / No Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'bool'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Enum Member Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'enum'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchDefault\n type=\"text\"\n placeHolder=\"Enter text\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <div class=\"operation-actions\">\n <button class=\"clear-button\" (click)=\"clearCurrentFilter()\">\n Clear\n </button>\n <button class=\"add-button\" (click)=\"addFilter()\">+ Add</button>\n </div>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.item-editing{background-color:var(--vbn-color-surface-alt);border-radius:4px}.item-label{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.item-label label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.icon-button{display:inline-flex;align-items:center;padding:0;border:none;background-color:transparent;cursor:pointer}.icon-button[disabled]{cursor:not-allowed;opacity:.4}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.operation-actions{display:flex;justify-content:flex-end;gap:.75rem}.add-button,.clear-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;font-size:.75rem;font-weight:500;cursor:pointer}.add-button{color:var(--vbn-color-border-focus)}.clear-button{color:var(--vbn-color-text-muted)}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}sup{color:var(--vbn-color-border-focus)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }] });
|
|
404
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.10", type: DataFilterComponent, selector: "lib-data-filter", inputs: { columns: "columns", data: "data", initialFilters: "initialFilters" }, outputs: { filterApplied: "filterApplied", resetFilter: "resetFilter" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">\n Filter <sup>({{ activeFilterCount }})</sup>\n </h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n\n <div card-body class=\"card-body\">\n <!-- Saved Filters Section -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Filters</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div\n *ngFor=\"let filter of visibleFilters\"\n class=\"item\"\n [class.item-editing]=\"isEditing(filter)\"\n >\n <div class=\"item-label\">\n <!-- A required filter is always active, so its checkbox is ticked and\n locked rather than hidden \u2014 the state stays readable. -->\n <input\n type=\"checkbox\"\n [(ngModel)]=\"filter.selected\"\n [disabled]=\"isRequired(filter)\"\n (ngModelChange)=\"markTouched()\"\n />\n <label>{{ getFilterDescription(filter) }}</label>\n </div>\n\n <div class=\"item-actions\">\n <button\n type=\"button\"\n class=\"icon-button\"\n aria-label=\"Edit filter\"\n (click)=\"editFilter(filter)\"\n >\n <!-- Only `stroke` is passed: `verben-svg` resolves a single colour as\n `fill || stroke` and applies it to both, so also passing `fill`\n would paint the icon in whatever `fill` holds. -->\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n ></verben-svg>\n </button>\n <button\n type=\"button\"\n class=\"icon-button\"\n aria-label=\"Delete filter\"\n [disabled]=\"isRequired(filter)\"\n (click)=\"deleteFilter(filter)\"\n >\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n ></verben-svg>\n </button>\n </div>\n </div>\n\n <div\n *ngIf=\"savedFilters.length > maxVisibleItems\"\n class=\"show-more\"\n (click)=\"showAllFilters = !showAllFilters\"\n >\n {{ showAllFilters ? \"Show Less\" : \"Show More\" }}\n </div>\n </section>\n\n <hr class=\"divider\" />\n\n <!-- New Filter Operation -->\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n\n <div class=\"operation-grid\">\n <!-- Column Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select column\"\n [options]=\"filterableColumns\"\n optionLabel=\"header\"\n optionValue=\"id\"\n [disabled]=\"isEditingRequired\"\n [(ngModel)]=\"currentFilter.columnId\"\n (ngModelChange)=\"onColumnSelect($event)\"\n ></verben-drop-down>\n\n <!-- Operator Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"availableOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.operator\"\n ></verben-drop-down>\n\n <!-- Value Input based on type -->\n <ng-container [ngSwitch]=\"currentColumnType\">\n <!-- Date Input \u2014 native rather than the library date picker, whose\n overlay renders off screen from this narrow panel. -->\n <verbena-input\n *ngSwitchCase=\"'date'\"\n type=\"date\"\n placeHolder=\"Select date\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Number Input -->\n <verbena-input\n *ngSwitchCase=\"'number'\"\n type=\"number\"\n placeHolder=\"Enter number\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n\n <!-- Yes / No Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'bool'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Enum Member Selection -->\n <verben-drop-down\n *ngSwitchCase=\"'enum'\"\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select value\"\n [options]=\"valueOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"currentFilter.value\"\n ></verben-drop-down>\n\n <!-- Text Input (default) -->\n <verbena-input\n *ngSwitchDefault\n type=\"text\"\n placeHolder=\"Enter text\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n [(ngModel)]=\"currentFilter.value\"\n ></verbena-input>\n </ng-container>\n </div>\n\n <div class=\"operation-actions\">\n <button class=\"clear-button\" (click)=\"clearCurrentFilter()\">\n Clear\n </button>\n <button class=\"add-button\" (click)=\"addFilter()\">+ Add</button>\n </div>\n </section>\n </div>\n\n <div card-footer class=\"card-footer\">\n <button class=\"export-button\" (click)=\"applyFilters()\">Filter</button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.item-editing{background-color:var(--vbn-color-surface-alt);border-radius:4px}.item-label{display:flex;align-items:center;gap:.5rem;flex:1;min-width:0}.item-label label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.icon-button{display:inline-flex;align-items:center;padding:0;border:none;background-color:transparent;cursor:pointer}.icon-button[disabled]{cursor:not-allowed;opacity:.4}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.operation-actions{display:flex;justify-content:flex-end;gap:.75rem}.add-button,.clear-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;font-size:.75rem;font-weight:500;cursor:pointer}.add-button{color:var(--vbn-color-border-focus)}.clear-button{color:var(--vbn-color-text-muted)}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}sup{color:var(--vbn-color-border-focus)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i4.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i5.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "autoScrollToCurrentItem", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i6.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }] });
|
|
405
405
|
}
|
|
406
406
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataFilterComponent, decorators: [{
|
|
407
407
|
type: Component,
|
|
@@ -177,7 +177,7 @@ export class DataImportComponent {
|
|
|
177
177
|
// this.exportTemplateEvent.emit(this.headers());
|
|
178
178
|
}
|
|
179
179
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataImportComponent, deps: [{ token: i1.DataImportService }], target: i0.ɵɵFactoryTarget.Component });
|
|
180
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.10", type: DataImportComponent, selector: "lib-data-import", inputs: { previewColumns: { classPropertyName: "previewColumns", publicName: "previewColumns", isSignal: true, isRequired: true, transformFunction: null }, formGroupConfig: { classPropertyName: "formGroupConfig", publicName: "formGroupConfig", isSignal: true, isRequired: false, transformFunction: null }, fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, columnTemplates: { classPropertyName: "columnTemplates", publicName: "columnTemplates", isSignal: true, isRequired: false, transformFunction: null }, parser: { classPropertyName: "parser", publicName: "parser", isSignal: true, isRequired: false, transformFunction: null }, previewData: { classPropertyName: "previewData", publicName: "previewData", isSignal: true, isRequired: false, transformFunction: null }, onImportComplete: { classPropertyName: "onImportComplete", publicName: "onImportComplete", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exportTemplateEvent: "exportTemplateEvent", importEvent: "importEvent", importEventData: "importEventData", rowSave: "rowSave" }, providers: [DataImportService], ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Import</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"reset()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <div class=\"flex gap-4 justify-between\">\n <button class=\"export-button\" (click)=\"handleTemplateExport()\">\n Download Template\n </button>\n <label [attr.for]=\"fileInputId\" class=\"export-button\">Upload File</label>\n </div>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div\n class=\"drop-area\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <p>\n Drag and drop files here or\n <label\n [attr.for]=\"fileInputId\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n >click to browse</label\n >\n </p>\n <input\n type=\"file\"\n [attr.id]=\"fileInputId\"\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\n multiple\n />\n </div>\n <div *ngIf=\"files.length > 0\">\n <h3>Uploaded Files:</h3>\n <ul>\n <li *ngFor=\"let file of files\">{{ file.name }}</li>\n </ul>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n [disabled]=\"service.importedData().length < 1\"\n class=\"export-button\"\n (click)=\"save()\"\n >\n Import\n </button>\n </div>\n</verben-card>\n\n<!-- Modal Component -->\n<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'large'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'my-modal-custom-class'\"\n [disableFooter]=\"false\"\n [modalData]=\"[{ data: {} }]\"\n [isVisible]=\"showPreview\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n dialogueWidth=\"85%\"\n>\n <a download=\"\"></a>\n</verben-dialogue>\n\n<!-- Define templates -->\n<ng-template #headerTemplate>\n <h2>Upload Preview</h2>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"flex gap-4 items-center justify-between my-4\">\n <p class=\"\">Total Items: {{ service.importedData().length }}</p>\n\n <p class=\"\">Duplicates: {{ duplicateIndexSet.size }}</p>\n\n <p class=\"\">Invalid Items: {{ invalidIndexSet.size }}</p>\n\n <verben-drop-down\n [multiselect]=\"true\"\n placeholder=\"Find duplicates by\"\n [options]=\"headers()\"\n [ngModel]=\"uniqueIdentifiers()\"\n (ngModelChange)=\"uniqueIdentifiers.set($event)\"\n ></verben-drop-down>\n </div>\n <div style=\"max-height: min(75vh, 780px); overflow: auto\">\n <lib-data-table\n [data]=\"service.importedData()\"\n [columns]=\"previewColumnsList()\"\n [formGroupConfig]=\"formGroupConfig()\"\n [useVirtualScroll]=\"true\"\n (rowSave)=\"service.addRow($event)\"\n >\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n\n <ng-template\n #cellEdit\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"footer-buttons flex gap-4 items-center justify-between my-4\">\n <button\n class=\"btn btn-secondary cancel-button\"\n (click)=\"showPreview = false\"\n >\n Cancel\n </button>\n <button class=\"btn btn-primary export-button\" (click)=\"save()\">\n Complete\n </button>\n </div>\n</ng-template>\n", styles: [".drop-area{border:2px dashed var(--vbn-color-border);padding:20px;text-align:center;cursor:pointer}.drop-area.drag-active{background-color:var(--vbn-color-surface-alt)}.export-card{font-size:.75rem;z-index:10}.card-header,.card-footer{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body{display:flex;flex-direction:column;gap:.5rem;padding-top:-8px!important}.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;margin-left:auto;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.footer-buttons{display:flex;gap:.5rem;align-items:center;justify-content:space-between;width:100%}.cancel-button,.export-button{outline:none;border:none;padding:.2rem 1.6rem;font-size:.75rem;font-weight:600;cursor:pointer}.cancel-button{background-color:var(--vbn-color-on-primary);color:var(--vbn-color-surface)}.export-button{background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary)}.value-range{display:flex;gap:.5rem;align-items:center}.action-buttons{display:flex;align-items:center;gap:2rem}\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: "component", type: i3.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i4.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i5.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i5.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
180
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.10", type: DataImportComponent, selector: "lib-data-import", inputs: { previewColumns: { classPropertyName: "previewColumns", publicName: "previewColumns", isSignal: true, isRequired: true, transformFunction: null }, formGroupConfig: { classPropertyName: "formGroupConfig", publicName: "formGroupConfig", isSignal: true, isRequired: false, transformFunction: null }, fields: { classPropertyName: "fields", publicName: "fields", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, columnTemplates: { classPropertyName: "columnTemplates", publicName: "columnTemplates", isSignal: true, isRequired: false, transformFunction: null }, parser: { classPropertyName: "parser", publicName: "parser", isSignal: true, isRequired: false, transformFunction: null }, previewData: { classPropertyName: "previewData", publicName: "previewData", isSignal: true, isRequired: false, transformFunction: null }, onImportComplete: { classPropertyName: "onImportComplete", publicName: "onImportComplete", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exportTemplateEvent: "exportTemplateEvent", importEvent: "importEvent", importEventData: "importEventData", rowSave: "rowSave" }, providers: [DataImportService], ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Import</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"reset()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <div class=\"flex gap-4 justify-between\">\n <button class=\"export-button\" (click)=\"handleTemplateExport()\">\n Download Template\n </button>\n <label [attr.for]=\"fileInputId\" class=\"export-button\">Upload File</label>\n </div>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div\n class=\"drop-area\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <p>\n Drag and drop files here or\n <label\n [attr.for]=\"fileInputId\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n >click to browse</label\n >\n </p>\n <input\n type=\"file\"\n [attr.id]=\"fileInputId\"\n (change)=\"onFileSelected($event)\"\n style=\"display: none\"\n accept=\".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel\"\n multiple\n />\n </div>\n <div *ngIf=\"files.length > 0\">\n <h3>Uploaded Files:</h3>\n <ul>\n <li *ngFor=\"let file of files\">{{ file.name }}</li>\n </ul>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n [disabled]=\"service.importedData().length < 1\"\n class=\"export-button\"\n (click)=\"save()\"\n >\n Import\n </button>\n </div>\n</verben-card>\n\n<!-- Modal Component -->\n<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'large'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'my-modal-custom-class'\"\n [disableFooter]=\"false\"\n [modalData]=\"[{ data: {} }]\"\n [isVisible]=\"showPreview\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n dialogueWidth=\"85%\"\n>\n <a download=\"\"></a>\n</verben-dialogue>\n\n<!-- Define templates -->\n<ng-template #headerTemplate>\n <h2>Upload Preview</h2>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"flex gap-4 items-center justify-between my-4\">\n <p class=\"\">Total Items: {{ service.importedData().length }}</p>\n\n <p class=\"\">Duplicates: {{ duplicateIndexSet.size }}</p>\n\n <p class=\"\">Invalid Items: {{ invalidIndexSet.size }}</p>\n\n <verben-drop-down\n [multiselect]=\"true\"\n placeholder=\"Find duplicates by\"\n [options]=\"headers()\"\n [ngModel]=\"uniqueIdentifiers()\"\n (ngModelChange)=\"uniqueIdentifiers.set($event)\"\n ></verben-drop-down>\n </div>\n <div style=\"max-height: min(75vh, 780px); overflow: auto\">\n <lib-data-table\n [data]=\"service.importedData()\"\n [columns]=\"previewColumnsList()\"\n [formGroupConfig]=\"formGroupConfig()\"\n [useVirtualScroll]=\"true\"\n (rowSave)=\"service.addRow($event)\"\n >\n <ng-container libColumn=\"actions\">\n <ng-template\n #cell\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n\n <ng-template\n #cellEdit\n let-value\n let-deleteRow=\"deleteRow\"\n let-isEditing=\"isEditing\"\n let-toggleRowEdit=\"toggleRowEdit\"\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n >\n <div class=\"flex action-buttons\">\n <verben-svg\n (click)=\"toggleRowEdit()\"\n icon=\"tick\"\n [width]=\"15\"\n [height]=\"15\"\n class=\"cursor-pointer\"\n ></verben-svg>\n\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n (click)=\"deleteRow()\"\n class=\"cursor-pointer\"\n ></verben-svg>\n </div>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"footer-buttons flex gap-4 items-center justify-between my-4\">\n <button\n class=\"btn btn-secondary cancel-button\"\n (click)=\"showPreview = false\"\n >\n Cancel\n </button>\n <button class=\"btn btn-primary export-button\" (click)=\"save()\">\n Complete\n </button>\n </div>\n</ng-template>\n", styles: [".drop-area{border:2px dashed var(--vbn-color-border);padding:20px;text-align:center;cursor:pointer}.drop-area.drag-active{background-color:var(--vbn-color-surface-alt)}.export-card{font-size:.75rem;z-index:10}.card-header,.card-footer{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body{display:flex;flex-direction:column;gap:.5rem;padding-top:-8px!important}.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;margin-left:auto;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.footer-buttons{display:flex;gap:.5rem;align-items:center;justify-content:space-between;width:100%}.cancel-button,.export-button{outline:none;border:none;padding:.2rem 1.6rem;font-size:.75rem;font-weight:600;cursor:pointer}.cancel-button{background-color:var(--vbn-color-on-primary);color:var(--vbn-color-surface)}.export-button{background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary)}.value-range{display:flex;gap:.5rem;align-items:center}.action-buttons{display:flex;align-items:center;gap:2rem}\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: "component", type: i3.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio"] }, { kind: "component", type: i4.VerbenDialogueComponent, selector: "verben-dialogue", inputs: ["dialogueWidth", "headerTemplate", "bodyTemplate", "footerTemplate", "showCloseIcon", "dismissOutsideClick", "closeOnEscape", "isVisible", "size", "backdropColor", "customClass", "disableFooter", "margin", "padding", "borderRadius", "dialogueBgColor", "width", "closeIconClass", "boxShadow", "enableTransition", "modalData", "mode", "position", "drawerWidth"], outputs: ["openModal", "closeModal"] }, { kind: "component", type: i5.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i5.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "autoScrollToCurrentItem", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
181
181
|
}
|
|
182
182
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataImportComponent, decorators: [{
|
|
183
183
|
type: Component,
|
|
@@ -173,6 +173,9 @@ export class DataViewComponent {
|
|
|
173
173
|
return false;
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
|
+
updateSearchValue(val) {
|
|
177
|
+
this.searchValue = val;
|
|
178
|
+
}
|
|
176
179
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataViewComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
177
180
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.10", type: DataViewComponent, selector: "verben-data-view", inputs: { buttonClass: "buttonClass", iconClass: "iconClass", activeIconClass: "activeIconClass", columnCustomClass: "columnCustomClass", filterCustomClass: "filterCustomClass", sortCustomClass: "sortCustomClass", extendCustomClass: "extendCustomClass", exportCustomClass: "exportCustomClass", selectCustomClass: "selectCustomClass", importCustomClass: "importCustomClass", zIndex: "zIndex", createCustomClass: "createCustomClass", tableIcon: "tableIcon", cardIcon: "cardIcon", cardClass: "cardClass", tableClass: "tableClass", searchKey: "searchKey", searchValue: "searchValue", viewState: "viewState", searchTemplate: "searchTemplate", importTemplate: "importTemplate", columnTemplate: "columnTemplate", extendTemplate: "extendTemplate", filterTemplate: "filterTemplate", sortTemplate: "sortTemplate", children: "children", exportTemplate: "exportTemplate", createTemplate: "createTemplate", selectedColumnCount: "selectedColumnCount", selectedSortCount: "selectedSortCount", selectedFilterTableCount: "selectedFilterTableCount", inputWidth: "inputWidth", milliseconds: "milliseconds", showColumnChild: "showColumnChild", showSortChild: "showSortChild", showFilterChild: "showFilterChild", showImportChild: "showImportChild", showExportChild: "showExportChild", showExtendChild: "showExtendChild", create: "create", showSelected: "showSelected", useTwoWayBinding: "useTwoWayBinding", isTableView: "isTableView" }, outputs: { viewChange: "viewChange", stateChange: "stateChange", onSearchChange: "onSearchChange" }, viewQueries: [{ propertyName: "filterContentWrapper", first: true, predicate: ["filterContentWrapper"], descendants: true }], ngImport: i0, template: "<div class=\"toolbar flex gap justify-between items-center\">\n <div class=\"flex items-center gap flex-1 justify-end\">\n <div *ngIf=\"viewState.isToggle\" class=\"toggle-button-container\">\n <button type=\"button\" (click)=\"toggleView()\" [ngClass]=\"buttonClass\">\n <verben-svg\n [icon]=\"tableIcon\"\n [class.active]=\"!isTableView\"\n [ngClass]=\"!isTableView ? activeIconClass : iconClass\"\n ></verben-svg>\n <verben-svg\n [icon]=\"cardIcon\"\n [class.active]=\"isTableView\"\n [ngClass]=\"isTableView ? activeIconClass : iconClass\"\n [width]=\"25\"\n [height]=\"25\"\n ></verben-svg>\n </button>\n </div>\n <!-- Search Input -->\n <div\n [style.width]=\"inputWidth\"\n class=\"search-input\"\n *ngIf=\"viewState.isSearch\"\n >\n <verben-svg [icon]=\"'search2'\" [width]=\"20\" [height]=\"20\"></verben-svg>\n <input\n *ngIf=\"!useTwoWayBinding\"\n [type]=\"'text'\"\n [placeholder]=\"'Search'\"\n (input)=\"onSearch($event)\"\n [style.border]=\"'0'\"\n [value]=\"searchValue\"\n />\n <input\n *ngIf=\"useTwoWayBinding\"\n [type]=\"'text'\"\n [placeholder]=\"'Search'\"\n (input)=\"onSearch($event)\"\n [style.border]=\"'0'\"\n [(ngModel)]=\"searchValue\"\n />\n <verben-svg\n *ngIf=\"searchValue.length > 0\"\n [icon]=\"'close'\"\n [width]=\"15\"\n (click)=\"onClearSearch()\"\n class=\"close-icon-class\"\n [height]=\"15\"\n ></verben-svg>\n </div>\n </div>\n <div class=\"relative flex items-center gap-2\">\n <!-- Column Section -->\n <ng-container\n [appOutSideClick]=\"showColumnChild\"\n (outSideClick)=\"resetChildViewsExcept('column')\"\n *ngIf=\"viewState.isColumn && isTableView\"\n >\n <ng-container *ngIf=\"columnTemplate; else defaultColumn\"></ng-container>\n <ng-template #defaultColumn>\n <span\n [ngClass]=\"[\n 'flex gap text-xs items-center pd rounded cursor-pointer',\n columnCustomClass ? columnCustomClass : '',\n ]\"\n [style.background-color]=\"'var(--vbn-color-surface-alt)'\"\n (click)=\"toggleChildView('column')\"\n >\n <verben-svg [width]=\"15\" [icon]=\"'column'\"></verben-svg>\n <span\n >Columns <sup>({{ selectedColumnCount }})</sup></span\n >\n </span>\n <div\n [style.z-index]=\"zIndex\"\n class=\"data-view-element\"\n [style.display]=\"showColumnChild ? 'block' : 'none'\"\n >\n <!-- Kept in the DOM (hidden via display) rather than *ngIf so the\n projected panel stays change-detected and reflects host state\n updates (e.g. restored column arrangement) even while collapsed. -->\n <ng-content select=\"[column-content]\"></ng-content>\n </div>\n </ng-template>\n </ng-container>\n\n <!-- Filter Section -->\n <ng-container\n [appOutSideClick]=\"showFilterChild\"\n (outSideClick)=\"resetChildViewsExcept('filter')\"\n *ngIf=\"viewState.isFilter\"\n (click)=\"stopPropagation($event)\"\n >\n <ng-container *ngIf=\"filterTemplate; else defaultFilter\"></ng-container>\n <ng-template #defaultFilter>\n <span\n [ngClass]=\"[\n 'flex gap text-xs items-center pd rounded cursor-pointer',\n filterCustomClass ? filterCustomClass : '',\n ]\"\n [style.background-color]=\"'var(--vbn-color-surface-alt)'\"\n (click)=\"toggleChildView('filter')\"\n >\n <verben-svg [width]=\"15\" [icon]=\"'filter'\"></verben-svg>\n <span\n >Filter <sup>({{ selectedFilterTableCount }})</sup></span\n >\n </span>\n <div\n (click)=\"stopPropagation($event)\"\n [style.z-index]=\"zIndex\"\n class=\"data-view-element\"\n [style.display]=\"showFilterChild ? 'block' : 'none'\"\n >\n <!-- Kept in the DOM (hidden via display) rather than *ngIf so the\n projected panel stays change-detected and reflects host state\n updates (e.g. restored filters) even while collapsed. -->\n <ng-content select=\"[filter-content]\"></ng-content>\n </div>\n </ng-template>\n </ng-container>\n <!--import Section-->\n <ng-container\n [appOutSideClick]=\"showImportChild\"\n (outSideClick)=\"resetChildViewsExcept('import')\"\n *ngIf=\"viewState.isImport\"\n (click)=\"stopPropagation($event)\"\n >\n <ng-container *ngIf=\"importTemplate; else defaultImport\"></ng-container>\n <ng-template #defaultImport>\n <span\n [ngClass]=\"[\n 'flex gap text-xs items-center pd rounded cursor-pointer',\n importCustomClass ? importCustomClass : '',\n ]\"\n [style.background-color]=\"'var(--vbn-color-surface-alt)'\"\n (click)=\"toggleChildView('import')\"\n >\n <verben-svg [width]=\"15\" [icon]=\"'file'\"></verben-svg>\n <span>Import</span>\n </span>\n <div\n (click)=\"stopPropagation($event)\"\n [style.z-index]=\"zIndex\"\n class=\"data-view-element\"\n >\n <ng-content\n *ngIf=\"showImportChild\"\n select=\"[import-content]\"\n ></ng-content>\n </div>\n </ng-template>\n </ng-container>\n <!-- Sort Section -->\n <ng-container\n [appOutSideClick]=\"showSortChild\"\n (outSideClick)=\"resetChildViewsExcept('sort')\"\n *ngIf=\"viewState.isSort\"\n >\n <ng-container *ngIf=\"sortTemplate; else defaultSort\"></ng-container>\n <ng-template #defaultSort>\n <span\n [ngClass]=\"[\n 'flex gap text-xs items-center pd rounded cursor-pointer',\n sortCustomClass ? sortCustomClass : '',\n ]\"\n [style.background-color]=\"'var(--vbn-color-surface-alt)'\"\n (click)=\"toggleChildView('sort')\"\n >\n <verben-svg [width]=\"15\" [icon]=\"'sort'\"></verben-svg>\n <span\n >Sort <sup>({{ selectedSortCount }})</sup></span\n >\n </span>\n <div [style.z-index]=\"zIndex\" class=\"data-view-element\">\n <ng-content\n *ngIf=\"showSortChild\"\n select=\"[sort-content]\"\n ></ng-content>\n </div>\n </ng-template>\n </ng-container>\n <!--Extend Section-->\n <ng-container\n [appOutSideClick]=\"showExtendChild\"\n (outSideClick)=\"resetChildViewsExcept('extend')\"\n *ngIf=\"viewState.isExtend\"\n (click)=\"stopPropagation($event)\"\n >\n <ng-container *ngIf=\"extendTemplate; else defaultExtend\"></ng-container>\n <ng-template #defaultExtend>\n <span\n [ngClass]=\"[\n 'flex gap text-xs items-center pd rounded cursor-pointer',\n importCustomClass ? extendCustomClass : '',\n ]\"\n [style.background-color]=\"'var(--vbn-color-surface-alt)'\"\n (click)=\"toggleChildView('extend')\"\n >\n <verben-svg [width]=\"15\" [icon]=\"'extend'\"></verben-svg>\n <span>Extend</span>\n </span>\n <div\n (click)=\"stopPropagation($event)\"\n [style.z-index]=\"zIndex\"\n class=\"data-view-element\"\n >\n <ng-content\n *ngIf=\"showImportChild\"\n select=\"[extend-content]\"\n ></ng-content>\n </div>\n </ng-template>\n </ng-container>\n <!-- Export Section -->\n <ng-container\n [appOutSideClick]=\"showExportChild\"\n (outSideClick)=\"resetChildViewsExcept('export')\"\n *ngIf=\"viewState.isExport\"\n >\n <ng-container *ngIf=\"exportTemplate; else defaultExport\"></ng-container>\n <ng-template #defaultExport>\n <span\n [ngClass]=\"[\n 'flex gap text-xs items-center pd rounded cursor-pointer',\n exportCustomClass ? exportCustomClass : '',\n ]\"\n [style.background-color]=\"'var(--vbn-color-surface-alt)'\"\n (click)=\"toggleChildView('export')\"\n >\n <verben-svg [width]=\"15\" [icon]=\"'export'\"></verben-svg>\n Export\n </span>\n <div [style.z-index]=\"zIndex\" class=\"data-view-element\">\n <ng-content\n *ngIf=\"showExportChild\"\n select=\"[export-content]\"\n ></ng-content>\n </div>\n </ng-template>\n </ng-container>\n\n <!-- Select Section -->\n <!-- <div *ngIf=\"viewState.isSelect\">\n <span\n [ngClass]=\"[\n 'flex gap text-xs items-center pd rounded cursor-pointer',\n selectCustomClass ? selectCustomClass : ''\n ]\"\n [style.background-color]=\"'var(--vbn-color-surface-alt)'\"\n (click)=\"toggleChildView('select')\"\n >\n <verben-svg [width]=\"15\" [icon]=\"'select'\"></verben-svg>\n <span>Select</span>\n <verben-svg [width]=\"6\" [icon]=\"'chevron-down'\"></verben-svg>\n </span>\n </div> -->\n\n <!-- Create Button jj-->\n\n <div\n [appOutSideClick]=\"create\"\n (outSideClick)=\"resetChildViewsExcept('create')\"\n *ngIf=\"viewState.isCreate\"\n >\n <verbena-button\n class=\"text-sm font-semibold\"\n [bgColor]=\"'var(--vbn-color-primary)'\"\n [buttonClass]=\"createCustomClass\"\n [pd]=\"'6px'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'var(--vbn-color-text)'\"\n [svg]=\"'add'\"\n [svgPosition]=\"'right'\"\n [text]=\"'Create New'\"\n (click)=\"toggleChildView('create')\"\n >\n </verbena-button>\n <ng-container *ngIf=\"createTemplate; else defaultCreate\"></ng-container>\n <ng-template #defaultCreate>\n <div [style.z-index]=\"zIndex\" class=\"data-view-element\">\n <ng-content *ngIf=\"create\" select=\"[create-content]\"></ng-content>\n </div>\n </ng-template>\n </div>\n </div>\n\n <div>\n <ng-container *ngIf=\"children; else defaultChildren\"></ng-container>\n <ng-template #defaultChildren>\n <div>\n <ng-content select=\"[children]\"></ng-content>\n </div>\n </ng-template>\n </div>\n</div>\n\n<!-- Grid and List View Handling -->\n<div *ngIf=\"isTableView; else listViewTemplate\">\n <div [style.overflow]=\"'auto'\" [class]=\"tableClass\">\n <ng-content select=\"[table-content]\"></ng-content>\n </div>\n</div>\n<ng-template #listViewTemplate>\n <div [class]=\"cardClass\">\n <ng-content select=\"[card-content]\"></ng-content>\n </div>\n</ng-template>\n", styles: [".toggle-button-container button{display:flex;justify-content:space-between;align-content:center;border:none;background-color:transparent;cursor:pointer;border:1px solid var(--vbn-color-border);padding:0;border-radius:6px;overflow:hidden;height:35px}.input-class{border:none;min-width:100%;display:block}.toggle-button-container verben-svg{transition:background-color .5s ease;padding:6px;position:relative}.toggle-button-container verben-svg.active{background-color:var(--vbn-color-surface-alt)}.justify-end{justify-self:end}.flex{display:flex}.flex-1{flex:1}.justify-between{justify-content:space-between}.items-center{align-items:center}.font-semibold{font-weight:600}.font-normal{font-weight:400}.text-sm{font-size:14px}.text-xs{font-size:12px}.gap{gap:7px}.pd{padding:5px 8px}.rounded-sm{border-radius:10px}.cursor-pointer{cursor:pointer}.search-input{position:relative;border-radius:10px;overflow:hidden;display:flex;align-items:center;padding:8px 30px 8px 10px;background-color:var(--vbn-color-surface-alt);gap:10px}.search-input input{outline:0;width:100%;display:block;background-color:transparent}.search-input input::placeholder{color:var(--vbn-color-text-muted);font-size:14px}sup{color:var(--vbn-color-border-focus);font-weight:500}.data-view-element{position:absolute;top:40px;left:0}.relative{position:relative}.z-10{z-index:100000000000}.close-icon-class{position:absolute;right:10px;cursor:pointer;top:13px}.toolbar{margin-bottom:15px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i3.VerbenaButtonComponent, selector: "verbena-button", inputs: ["type", "text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "directive", type: i4.OutSideClickDirective, selector: "[appOutSideClick]", inputs: ["appOutSideClick"], outputs: ["outSideClick"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
178
181
|
}
|
|
@@ -275,4 +278,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImpo
|
|
|
275
278
|
type: ViewChild,
|
|
276
279
|
args: ['filterContentWrapper']
|
|
277
280
|
}] } });
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS12aWV3L2RhdGEtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdmlldy9kYXRhLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBb0I5QyxNQUFNLE9BQU8saUJBQWlCO0lBZ0VSO0lBL0RYLFdBQVcsQ0FBVTtJQUNyQixTQUFTLENBQVU7SUFDbkIsZUFBZSxHQUFZLEVBQUUsQ0FBQztJQUM5QixpQkFBaUIsR0FBWSxFQUFFLENBQUM7SUFDaEMsaUJBQWlCLEdBQVksRUFBRSxDQUFDO0lBQ2hDLGVBQWUsR0FBWSxFQUFFLENBQUM7SUFDOUIsaUJBQWlCLEdBQVksRUFBRSxDQUFDO0lBQ2hDLGlCQUFpQixHQUFZLEVBQUUsQ0FBQztJQUNoQyxpQkFBaUIsR0FBWSxFQUFFLENBQUM7SUFDaEMsaUJBQWlCLEdBQVksRUFBRSxDQUFDO0lBQ2hDLE1BQU0sR0FBWSxDQUFDLENBQUM7SUFDcEIsaUJBQWlCLEdBQVcsRUFBRSxDQUFDO0lBQy9CLFNBQVMsR0FBVyxRQUFRLENBQUM7SUFDN0IsUUFBUSxHQUFXLFdBQVcsQ0FBQztJQUMvQixTQUFTLEdBQVcsRUFBRSxDQUFDO0lBQ3ZCLFVBQVUs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QW5CLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFhRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQzRCLG9CQUFvQjtzQkFBdEQsU0FBUzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW50ZXJmYWNlIFZpZXdTdGF0ZSB7XG4gIGlzU2VhcmNoPzogYm9vbGVhbjtcbiAgaXNDb2x1bW4/OiBib29sZWFuO1xuICBpc0ZpbHRlcj86IGJvb2xlYW47XG4gIGlzU29ydD86IGJvb2xlYW47XG4gIGlzRXhwb3J0PzogYm9vbGVhbjtcbiAgaXNTZWxlY3Q/OiBib29sZWFuO1xuICBpc0NyZWF0ZT86IGJvb2xlYW47XG4gIGlzVG9nZ2xlPzogYm9vbGVhbjtcbiAgaXNJbXBvcnQ/OiBib29sZWFuO1xuICBpc0V4dGVuZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZlcmJlbi1kYXRhLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS12aWV3LmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgYnV0dG9uQ2xhc3M/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGljb25DbGFzcz86IHN0cmluZztcbiAgQElucHV0KCkgYWN0aXZlSWNvbkNsYXNzPzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGNvbHVtbkN1c3RvbUNsYXNzPzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckN1c3RvbUNsYXNzPzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNvcnRDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBleHRlbmRDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBleHBvcnRDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzZWxlY3RDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpbXBvcnRDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB6SW5kZXg/OiBudW1iZXIgPSA1O1xuICBASW5wdXQoKSBjcmVhdGVDdXN0b21DbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRhYmxlSWNvbjogc3RyaW5nID0gJ2dyaWQtMyc7XG4gIEBJbnB1dCgpIGNhcmRJY29uOiBzdHJpbmcgPSAnbGlzdC12aWV3JztcbiAgQElucHV0KCkgY2FyZENsYXNzOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdGFibGVDbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlYXJjaEtleTogc3RyaW5nID0gJ3NlYXJjaCc7XG4gIEBJbnB1dCgpIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBASW5wdXQoKSB2aWV3U3RhdGU6IFZpZXdTdGF0ZSA9IHtcbiAgICBpc1NlYXJjaDogdHJ1ZSxcbiAgICBpc0NvbHVtbjogdHJ1ZSxcbiAgICBpc0ZpbHRlcjogdHJ1ZSxcbiAgICBpc1NvcnQ6IHRydWUsXG4gICAgaXNFeHBvcnQ6IHRydWUsXG4gICAgaXNTZWxlY3Q6IHRydWUsXG4gICAgaXNDcmVhdGU6IHRydWUsXG4gICAgaXNUb2dnbGU6IHRydWUsXG4gICAgaXNFeHRlbmQ6IHRydWUsXG4gICAgaXNJbXBvcnQ6IHRydWUsXG4gIH07XG5cbiAgQElucHV0KCkgc2VhcmNoVGVtcGxhdGU/OiBOb2RlO1xuICBASW5wdXQoKSBpbXBvcnRUZW1wbGF0ZT86IE5vZGU7XG4gIEBJbnB1dCgpIGNvbHVtblRlbXBsYXRlPzogTm9kZTtcbiAgQElucHV0KCkgZXh0ZW5kVGVtcGxhdGU/OiBOb2RlO1xuICBASW5wdXQoKSBmaWx0ZXJUZW1wbGF0ZT86IE5vZGU7XG4gIEBJbnB1dCgpIHNvcnRUZW1wbGF0ZT86IE5vZGU7XG4gIEBJbnB1dCgpIGNoaWxkcmVuPzogTm9kZTtcbiAgQElucHV0KCkgZXhwb3J0VGVtcGxhdGU/OiBOb2RlO1xuICBASW5wdXQoKSBjcmVhdGVUZW1wbGF0ZT86IE5vZGU7XG4gIEBJbnB1dCgpIHNlbGVjdGVkQ29sdW1uQ291bnQ/OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBzZWxlY3RlZFNvcnRDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc2VsZWN0ZWRGaWx0ZXJUYWJsZUNvdW50OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBpbnB1dFdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XG4gIEBJbnB1dCgpIG1pbGxpc2Vjb25kczogbnVtYmVyID0gNDAwO1xuICBASW5wdXQoKSBzaG93Q29sdW1uQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd1NvcnRDaGlsZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RmlsdGVyQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0ltcG9ydENoaWxkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dFeHBvcnRDaGlsZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RXh0ZW5kQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY3JlYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB1c2VUd29XYXlCaW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgaXNUYWJsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgdmFsdWU6IGJvb2xlYW4gfT4oKTtcbiAgQE91dHB1dCgpIG9uU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KCk7XG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlckNvbnRlbnRXcmFwcGVyJykgZmlsdGVyQ29udGVudFdyYXBwZXIhOiBFbGVtZW50UmVmO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5zZWFyY2hTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5taWxsaXNlY29uZHMpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaENoYW5nZS5lbWl0KHsga2V5OiB0aGlzLnNlYXJjaEtleSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZVZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5pc1RhYmxlVmlldyA9ICF0aGlzLmlzVGFibGVWaWV3O1xuICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuaXNUYWJsZVZpZXcpO1xuICB9XG5cbiAgb25TZWFyY2goZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQodGhpcy5zZWFyY2hWYWx1ZSk7XG4gIH1cbiAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgb25DbGVhclNlYXJjaCgpIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5vblNlYXJjaENoYW5nZS5lbWl0KHsga2V5OiB0aGlzLnNlYXJjaEtleSwgdmFsdWU6IHRoaXMuc2VhcmNoVmFsdWUgfSk7XG4gIH1cbiAgdG9nZ2xlQ2hpbGRWaWV3KHZpZXdUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHZpZXdUeXBlKSB7XG4gICAgICBjYXNlICdjb2x1bW4nOlxuICAgICAgICB0aGlzLnNob3dDb2x1bW5DaGlsZCA9ICF0aGlzLnNob3dDb2x1bW5DaGlsZDtcbiAgICAgICAgdGhpcy5yZXNldENoaWxkVmlld3NFeGNlcHQoJ2NvbHVtbicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgIHRoaXMuc2hvd0ZpbHRlckNoaWxkID0gIXRoaXMuc2hvd0ZpbHRlckNoaWxkO1xuICAgICAgICB0aGlzLnJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnZmlsdGVyJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgIHRoaXMuc2hvd1NvcnRDaGlsZCA9ICF0aGlzLnNob3dTb3J0Q2hpbGQ7XG4gICAgICAgIHRoaXMucmVzZXRDaGlsZFZpZXdzRXhjZXB0KCdzb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgdGhpcy5zaG93U2VsZWN0ZWQgPSAhdGhpcy5zaG93U2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMucmVzZXRDaGlsZFZpZXdzRXhjZXB0KCdzZWxlY3QnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleHBvcnQnOlxuICAgICAgICB0aGlzLnNob3dFeHBvcnRDaGlsZCA9ICF0aGlzLnNob3dFeHBvcnRDaGlsZDtcbiAgICAgICAgdGhpcy5yZXNldENoaWxkVmlld3NFeGNlcHQoJ2V4cG9ydCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ltcG9ydCc6XG4gICAgICAgIHRoaXMuc2hvd0ltcG9ydENoaWxkID0gIXRoaXMuc2hvd0ltcG9ydENoaWxkO1xuICAgICAgICB0aGlzLnJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnaW1wb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXh0ZW5kJzpcbiAgICAgICAgdGhpcy5zaG93RXh0ZW5kQ2hpbGQgPSAhdGhpcy5zaG93RXh0ZW5kQ2hpbGQ7XG4gICAgICAgIHRoaXMucmVzZXRDaGlsZFZpZXdzRXhjZXB0KCdleHRlbmQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjcmVhdGUnOlxuICAgICAgICB0aGlzLmNyZWF0ZSA9ICF0aGlzLmNyZWF0ZTtcbiAgICAgICAgdGhpcy5yZXNldENoaWxkVmlld3NFeGNlcHQoJ2NyZWF0ZScpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KHtcbiAgICAgIGtleTogdmlld1R5cGUsXG4gICAgICB2YWx1ZTogdGhpcy5nZXRDaGlsZFZpZXdTdGF0ZSh2aWV3VHlwZSksXG4gICAgfSk7XG4gIH1cbiAgcmVzZXRDaGlsZFZpZXdzRXhjZXB0KHZpZXdUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodmlld1R5cGUgIT09ICdjb2x1bW4nKSB0aGlzLnNob3dDb2x1bW5DaGlsZCA9IGZhbHNlO1xuICAgIGlmICh2aWV3VHlwZSAhPT0gJ2ZpbHRlcicpIHRoaXMuc2hvd0ZpbHRlckNoaWxkID0gZmFsc2U7XG4gICAgaWYgKHZpZXdUeXBlICE9PSAnc29ydCcpIHRoaXMuc2hvd1NvcnRDaGlsZCA9IGZhbHNlO1xuICAgIGlmICh2aWV3VHlwZSAhPT0gJ3NlbGVjdCcpIHRoaXMuc2hvd1NlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKHZpZXdUeXBlICE9PSAnZXhwb3J0JykgdGhpcy5zaG93RXhwb3J0Q2hpbGQgPSBmYWxzZTtcbiAgICBpZiAodmlld1R5cGUgIT09ICdpbXBvcnQnKSB0aGlzLnNob3dJbXBvcnRDaGlsZCA9IGZhbHNlO1xuICAgIGlmICh2aWV3VHlwZSAhPT0gJ2V4dGVuZCcpIHRoaXMuc2hvd0V4dGVuZENoaWxkID0gZmFsc2U7XG4gICAgaWYgKHZpZXdUeXBlICE9PSAnY3JlYXRlJykgdGhpcy5jcmVhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBzdGF0ZSBvZiBhIHNwZWNpZmljIGNoaWxkIHZpZXdcbiAgZ2V0Q2hpbGRWaWV3U3RhdGUodmlld1R5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAodmlld1R5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbHVtbic6XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dDb2x1bW5DaGlsZDtcbiAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dGaWx0ZXJDaGlsZDtcbiAgICAgIGNhc2UgJ3NvcnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5zaG93U29ydENoaWxkO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1NlbGVjdGVkO1xuICAgICAgY2FzZSAnZXhwb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0V4cG9ydENoaWxkO1xuICAgICAgY2FzZSAnaW1wb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0ltcG9ydENoaWxkO1xuICAgICAgY2FzZSAnZXh0ZW5kJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0V4dGVuZENoaWxkO1xuICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRvb2xiYXIgZmxleCBnYXAganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlclwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwIGZsZXgtMSBqdXN0aWZ5LWVuZFwiPlxuICAgIDxkaXYgKm5nSWY9XCJ2aWV3U3RhdGUuaXNUb2dnbGVcIiBjbGFzcz1cInRvZ2dsZS1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidG9nZ2xlVmlldygpXCIgW25nQ2xhc3NdPVwiYnV0dG9uQ2xhc3NcIj5cbiAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICBbaWNvbl09XCJ0YWJsZUljb25cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiIWlzVGFibGVWaWV3XCJcbiAgICAgICAgICBbbmdDbGFzc109XCIhaXNUYWJsZVZpZXcgPyBhY3RpdmVJY29uQ2xhc3MgOiBpY29uQ2xhc3NcIlxuICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgIFtpY29uXT1cImNhcmRJY29uXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzVGFibGVWaWV3XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJpc1RhYmxlVmlldyA/IGFjdGl2ZUljb25DbGFzcyA6IGljb25DbGFzc1wiXG4gICAgICAgICAgW3dpZHRoXT1cIjI1XCJcbiAgICAgICAgICBbaGVpZ2h0XT1cIjI1XCJcbiAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gU2VhcmNoIElucHV0IC0tPlxuICAgIDxkaXZcbiAgICAgIFtzdHlsZS53aWR0aF09XCJpbnB1dFdpZHRoXCJcbiAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCJcbiAgICAgICpuZ0lmPVwidmlld1N0YXRlLmlzU2VhcmNoXCJcbiAgICA+XG4gICAgICA8dmVyYmVuLXN2ZyBbaWNvbl09XCInc2VhcmNoMidcIiBbd2lkdGhdPVwiMjBcIiBbaGVpZ2h0XT1cIjIwXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgPGlucHV0XG4gICAgICAgICpuZ0lmPVwiIXVzZVR3b1dheUJpbmRpbmdcIlxuICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlYXJjaCdcIlxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJzAnXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgIC8+XG4gICAgICA8aW5wdXRcbiAgICAgICAgKm5nSWY9XCJ1c2VUd29XYXlCaW5kaW5nXCJcbiAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWFyY2gnXCJcbiAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoKCRldmVudClcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyXT1cIicwJ1wiXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgLz5cbiAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICpuZ0lmPVwic2VhcmNoVmFsdWUubGVuZ3RoID4gMFwiXG4gICAgICAgIFtpY29uXT1cIidjbG9zZSdcIlxuICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhclNlYXJjaCgpXCJcbiAgICAgICAgY2xhc3M9XCJjbG9zZS1pY29uLWNsYXNzXCJcbiAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgPCEtLSBDb2x1bW4gU2VjdGlvbiAtLT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbYXBwT3V0U2lkZUNsaWNrXT1cInNob3dDb2x1bW5DaGlsZFwiXG4gICAgICAob3V0U2lkZUNsaWNrKT1cInJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnY29sdW1uJylcIlxuICAgICAgKm5nSWY9XCJ2aWV3U3RhdGUuaXNDb2x1bW4gJiYgaXNUYWJsZVZpZXdcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5UZW1wbGF0ZTsgZWxzZSBkZWZhdWx0Q29sdW1uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb2x1bW4+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgJ2ZsZXggZ2FwIHRleHQteHMgaXRlbXMtY2VudGVyIHBkIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICAgY29sdW1uQ3VzdG9tQ2xhc3MgPyBjb2x1bW5DdXN0b21DbGFzcyA6ICcnLFxuICAgICAgICAgIF1cIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3Itc3VyZmFjZS1hbHQpJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNoaWxkVmlldygnY29sdW1uJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjE1XCIgW2ljb25dPVwiJ2NvbHVtbidcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgID5Db2x1bW5zIDxzdXA+KHt7IHNlbGVjdGVkQ29sdW1uQ291bnQgfX0pPC9zdXA+PC9zcGFuXG4gICAgICAgICAgPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbc3R5bGUuei1pbmRleF09XCJ6SW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiZGF0YS12aWV3LWVsZW1lbnRcIlxuICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cInNob3dDb2x1bW5DaGlsZCA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBLZXB0IGluIHRoZSBET00gKGhpZGRlbiB2aWEgZGlzcGxheSkgcmF0aGVyIHRoYW4gKm5nSWYgc28gdGhlXG4gICAgICAgICAgICAgIHByb2plY3RlZCBwYW5lbCBzdGF5cyBjaGFuZ2UtZGV0ZWN0ZWQgYW5kIHJlZmxlY3RzIGhvc3Qgc3RhdGVcbiAgICAgICAgICAgICAgdXBkYXRlcyAoZS5nLiByZXN0b3JlZCBjb2x1bW4gYXJyYW5nZW1lbnQpIGV2ZW4gd2hpbGUgY29sbGFwc2VkLiAtLT5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY29sdW1uLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEZpbHRlciBTZWN0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFthcHBPdXRTaWRlQ2xpY2tdPVwic2hvd0ZpbHRlckNoaWxkXCJcbiAgICAgIChvdXRTaWRlQ2xpY2spPVwicmVzZXRDaGlsZFZpZXdzRXhjZXB0KCdmaWx0ZXInKVwiXG4gICAgICAqbmdJZj1cInZpZXdTdGF0ZS5pc0ZpbHRlclwiXG4gICAgICAoY2xpY2spPVwic3RvcFByb3BhZ2F0aW9uKCRldmVudClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0RmlsdGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRGaWx0ZXI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgJ2ZsZXggZ2FwIHRleHQteHMgaXRlbXMtY2VudGVyIHBkIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICAgZmlsdGVyQ3VzdG9tQ2xhc3MgPyBmaWx0ZXJDdXN0b21DbGFzcyA6ICcnLFxuICAgICAgICAgIF1cIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3Itc3VyZmFjZS1hbHQpJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNoaWxkVmlldygnZmlsdGVyJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjE1XCIgW2ljb25dPVwiJ2ZpbHRlcidcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgID5GaWx0ZXIgPHN1cD4oe3sgc2VsZWN0ZWRGaWx0ZXJUYWJsZUNvdW50IH19KTwvc3VwPjwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKGNsaWNrKT1cInN0b3BQcm9wYWdhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICBbc3R5bGUuei1pbmRleF09XCJ6SW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiZGF0YS12aWV3LWVsZW1lbnRcIlxuICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cInNob3dGaWx0ZXJDaGlsZCA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBLZXB0IGluIHRoZSBET00gKGhpZGRlbiB2aWEgZGlzcGxheSkgcmF0aGVyIHRoYW4gKm5nSWYgc28gdGhlXG4gICAgICAgICAgICAgICBwcm9qZWN0ZWQgcGFuZWwgc3RheXMgY2hhbmdlLWRldGVjdGVkIGFuZCByZWZsZWN0cyBob3N0IHN0YXRlXG4gICAgICAgICAgICAgICB1cGRhdGVzIChlLmcuIHJlc3RvcmVkIGZpbHRlcnMpIGV2ZW4gd2hpbGUgY29sbGFwc2VkLiAtLT5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZmlsdGVyLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLWltcG9ydCBTZWN0aW9uLS0+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW2FwcE91dFNpZGVDbGlja109XCJzaG93SW1wb3J0Q2hpbGRcIlxuICAgICAgKG91dFNpZGVDbGljayk9XCJyZXNldENoaWxkVmlld3NFeGNlcHQoJ2ltcG9ydCcpXCJcbiAgICAgICpuZ0lmPVwidmlld1N0YXRlLmlzSW1wb3J0XCJcbiAgICAgIChjbGljayk9XCJzdG9wUHJvcGFnYXRpb24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltcG9ydFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRJbXBvcnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEltcG9ydD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAnZmxleCBnYXAgdGV4dC14cyBpdGVtcy1jZW50ZXIgcGQgcm91bmRlZCBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICBpbXBvcnRDdXN0b21DbGFzcyA/IGltcG9ydEN1c3RvbUNsYXNzIDogJycsXG4gICAgICAgICAgXVwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1zdXJmYWNlLWFsdCknXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2hpbGRWaWV3KCdpbXBvcnQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaWNvbl09XCInZmlsZSdcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPHNwYW4+SW1wb3J0PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAoY2xpY2spPVwic3RvcFByb3BhZ2F0aW9uKCRldmVudClcIlxuICAgICAgICAgIFtzdHlsZS56LWluZGV4XT1cInpJbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJkYXRhLXZpZXctZWxlbWVudFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGVudFxuICAgICAgICAgICAgKm5nSWY9XCJzaG93SW1wb3J0Q2hpbGRcIlxuICAgICAgICAgICAgc2VsZWN0PVwiW2ltcG9ydC1jb250ZW50XVwiXG4gICAgICAgICAgPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gU29ydCBTZWN0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFthcHBPdXRTaWRlQ2xpY2tdPVwic2hvd1NvcnRDaGlsZFwiXG4gICAgICAob3V0U2lkZUNsaWNrKT1cInJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnc29ydCcpXCJcbiAgICAgICpuZ0lmPVwidmlld1N0YXRlLmlzU29ydFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNvcnRUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0U29ydFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U29ydD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAnZmxleCBnYXAgdGV4dC14cyBpdGVtcy1jZW50ZXIgcGQgcm91bmRlZCBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICBzb3J0Q3VzdG9tQ2xhc3MgPyBzb3J0Q3VzdG9tQ2xhc3MgOiAnJyxcbiAgICAgICAgICBdXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCIndmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UtYWx0KSdcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDaGlsZFZpZXcoJ3NvcnQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaWNvbl09XCInc29ydCdcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgID5Tb3J0IDxzdXA+KHt7IHNlbGVjdGVkU29ydENvdW50IH19KTwvc3VwPjwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IFtzdHlsZS56LWluZGV4XT1cInpJbmRleFwiIGNsYXNzPVwiZGF0YS12aWV3LWVsZW1lbnRcIj5cbiAgICAgICAgICA8bmctY29udGVudFxuICAgICAgICAgICAgKm5nSWY9XCJzaG93U29ydENoaWxkXCJcbiAgICAgICAgICAgIHNlbGVjdD1cIltzb3J0LWNvbnRlbnRdXCJcbiAgICAgICAgICA+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLUV4dGVuZCBTZWN0aW9uLS0+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW2FwcE91dFNpZGVDbGlja109XCJzaG93RXh0ZW5kQ2hpbGRcIlxuICAgICAgKG91dFNpZGVDbGljayk9XCJyZXNldENoaWxkVmlld3NFeGNlcHQoJ2V4dGVuZCcpXCJcbiAgICAgICpuZ0lmPVwidmlld1N0YXRlLmlzRXh0ZW5kXCJcbiAgICAgIChjbGljayk9XCJzdG9wUHJvcGFnYXRpb24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4dGVuZFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRFeHRlbmRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEV4dGVuZD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAnZmxleCBnYXAgdGV4dC14cyBpdGVtcy1jZW50ZXIgcGQgcm91bmRlZCBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICBpbXBvcnRDdXN0b21DbGFzcyA/IGV4dGVuZEN1c3RvbUNsYXNzIDogJycsXG4gICAgICAgICAgXVwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1zdXJmYWNlLWFsdCknXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2hpbGRWaWV3KCdleHRlbmQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaWNvbl09XCInZXh0ZW5kJ1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICA8c3Bhbj5FeHRlbmQ8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIChjbGljayk9XCJzdG9wUHJvcGFnYXRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgW3N0eWxlLnotaW5kZXhdPVwiekluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cImRhdGEtdmlldy1lbGVtZW50XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250ZW50XG4gICAgICAgICAgICAqbmdJZj1cInNob3dJbXBvcnRDaGlsZFwiXG4gICAgICAgICAgICBzZWxlY3Q9XCJbZXh0ZW5kLWNvbnRlbnRdXCJcbiAgICAgICAgICA+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBFeHBvcnQgU2VjdGlvbiAtLT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbYXBwT3V0U2lkZUNsaWNrXT1cInNob3dFeHBvcnRDaGlsZFwiXG4gICAgICAob3V0U2lkZUNsaWNrKT1cInJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnZXhwb3J0JylcIlxuICAgICAgKm5nSWY9XCJ2aWV3U3RhdGUuaXNFeHBvcnRcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleHBvcnRUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0RXhwb3J0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRFeHBvcnQ+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgJ2ZsZXggZ2FwIHRleHQteHMgaXRlbXMtY2VudGVyIHBkIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICAgZXhwb3J0Q3VzdG9tQ2xhc3MgPyBleHBvcnRDdXN0b21DbGFzcyA6ICcnLFxuICAgICAgICAgIF1cIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3Itc3VyZmFjZS1hbHQpJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNoaWxkVmlldygnZXhwb3J0JylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjE1XCIgW2ljb25dPVwiJ2V4cG9ydCdcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgRXhwb3J0XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBbc3R5bGUuei1pbmRleF09XCJ6SW5kZXhcIiBjbGFzcz1cImRhdGEtdmlldy1lbGVtZW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnRcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0V4cG9ydENoaWxkXCJcbiAgICAgICAgICAgIHNlbGVjdD1cIltleHBvcnQtY29udGVudF1cIlxuICAgICAgICAgID48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gU2VsZWN0IFNlY3Rpb24gLS0+XG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwidmlld1N0YXRlLmlzU2VsZWN0XCI+XG4gICAgIDxzcGFuXG4gICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgJ2ZsZXggZ2FwIHRleHQteHMgaXRlbXMtY2VudGVyIHBkIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgc2VsZWN0Q3VzdG9tQ2xhc3MgPyBzZWxlY3RDdXN0b21DbGFzcyA6ICcnXG4gICAgICAgXVwiXG4gICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1zdXJmYWNlLWFsdCknXCJcbiAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2hpbGRWaWV3KCdzZWxlY3QnKVwiXG4gICAgID5cbiAgICAgICA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaWNvbl09XCInc2VsZWN0J1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICA8c3Bhbj5TZWxlY3Q8L3NwYW4+XG4gICAgICAgPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjZcIiBbaWNvbl09XCInY2hldnJvbi1kb3duJ1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgPC9zcGFuPlxuICAgPC9kaXY+IC0tPlxuXG4gICAgPCEtLSBDcmVhdGUgQnV0dG9uIGpqLS0+XG5cbiAgICA8ZGl2XG4gICAgICBbYXBwT3V0U2lkZUNsaWNrXT1cImNyZWF0ZVwiXG4gICAgICAob3V0U2lkZUNsaWNrKT1cInJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnY3JlYXRlJylcIlxuICAgICAgKm5nSWY9XCJ2aWV3U3RhdGUuaXNDcmVhdGVcIlxuICAgID5cbiAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICBjbGFzcz1cInRleHQtc20gZm9udC1zZW1pYm9sZFwiXG4gICAgICAgIFtiZ0NvbG9yXT1cIid2YXIoLS12Ym4tY29sb3ItcHJpbWFyeSknXCJcbiAgICAgICAgW2J1dHRvbkNsYXNzXT1cImNyZWF0ZUN1c3RvbUNsYXNzXCJcbiAgICAgICAgW3BkXT1cIic2cHgnXCJcbiAgICAgICAgW2JvcmRlclJhZGl1c109XCInNHB4J1wiXG4gICAgICAgIFt0ZXh0Q29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci10ZXh0KSdcIlxuICAgICAgICBbc3ZnXT1cIidhZGQnXCJcbiAgICAgICAgW3N2Z1Bvc2l0aW9uXT1cIidyaWdodCdcIlxuICAgICAgICBbdGV4dF09XCInQ3JlYXRlIE5ldydcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2hpbGRWaWV3KCdjcmVhdGUnKVwiXG4gICAgICA+XG4gICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVRlbXBsYXRlOyBlbHNlIGRlZmF1bHRDcmVhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENyZWF0ZT5cbiAgICAgICAgPGRpdiBbc3R5bGUuei1pbmRleF09XCJ6SW5kZXhcIiBjbGFzcz1cImRhdGEtdmlldy1lbGVtZW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJjcmVhdGVcIiBzZWxlY3Q9XCJbY3JlYXRlLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNoaWxkcmVuOyBlbHNlIGRlZmF1bHRDaGlsZHJlblwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENoaWxkcmVuPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2NoaWxkcmVuXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gR3JpZCBhbmQgTGlzdCBWaWV3IEhhbmRsaW5nIC0tPlxuPGRpdiAqbmdJZj1cImlzVGFibGVWaWV3OyBlbHNlIGxpc3RWaWV3VGVtcGxhdGVcIj5cbiAgPGRpdiBbc3R5bGUub3ZlcmZsb3ddPVwiJ2F1dG8nXCIgW2NsYXNzXT1cInRhYmxlQ2xhc3NcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbdGFibGUtY29udGVudF1cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2xpc3RWaWV3VGVtcGxhdGU+XG4gIDxkaXYgW2NsYXNzXT1cImNhcmRDbGFzc1wiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjYXJkLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS12aWV3L2RhdGEtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdmlldy9kYXRhLXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBb0I5QyxNQUFNLE9BQU8saUJBQWlCO0lBZ0VSO0lBL0RYLFdBQVcsQ0FBVTtJQUNyQixTQUFTLENBQVU7SUFDbkIsZUFBZSxHQUFZLEVBQUUsQ0FBQztJQUM5QixpQkFBaUIsR0FBWSxFQUFFLENBQUM7SUFDaEMsaUJBQWlCLEdBQVksRUFBRSxDQUFDO0lBQ2hDLGVBQWUsR0FBWSxFQUFFLENBQUM7SUFDOUIsaUJBQWlCLEdBQVksRUFBRSxDQUFDO0lBQ2hDLGlCQUFpQixHQUFZLEVBQUUsQ0FBQztJQUNoQyxpQkFBaUIsR0FBWSxFQUFFLENBQUM7SUFDaEMsaUJBQWlCLEdBQVksRUFBRSxDQUFDO0lBQ2hDLE1BQU0sR0FBWSxDQUFDLENBQUM7SUFDcEIsaUJBQWlCLEdBQVcsRUFBRSxDQUFDO0lBQy9CLFNBQVMsR0FBVyxRQUFRLENBQUM7SUFDN0IsUUFBUSxHQUFXLFdBQVcsQ0FBQztJQUMvQixTQUFTLEdBQVcsRUFBRSxDQUFDO0lBQ3ZCLFVBQVUsR0FBVyxFQUFFLENBQUM7SUFDeEIsU0FBUyxHQUFXLFFBQVEsQ0FBQztJQUM3QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQzFCLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ3JDLFNBQVMsR0FBYztRQUM5QixRQUFRLEVBQUUsSUFBSTtRQUNkLFFBQVEsRUFBRSxJQUFJO1FBQ2QsUUFBUSxFQUFFLElBQUk7UUFDZCxNQUFNLEVBQUUsSUFBSTtRQUNaLFFBQVEsRUFBRSxJQUFJO1FBQ2QsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsSUFBSTtRQUNkLFFBQVEsRUFBRSxJQUFJO1FBQ2QsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUM7SUFFTyxjQUFjLENBQVE7SUFDdEIsY0FBYyxDQUFRO0lBQ3RCLGNBQWMsQ0FBUTtJQUN0QixjQUFjLENBQVE7SUFDdEIsY0FBYyxDQUFRO0lBQ3RCLFlBQVksQ0FBUTtJQUNwQixRQUFRLENBQVE7SUFDaEIsY0FBYyxDQUFRO0lBQ3RCLGNBQWMsQ0FBUTtJQUN0QixtQkFBbUIsR0FBWSxDQUFDLENBQUM7SUFDakMsaUJBQWlCLEdBQVcsQ0FBQyxDQUFDO0lBQzlCLHdCQUF3QixHQUFXLENBQUMsQ0FBQztJQUNyQyxVQUFVLEdBQVcsTUFBTSxDQUFDO0lBQzVCLFlBQVksR0FBVyxHQUFHLENBQUM7SUFDM0IsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxhQUFhLEdBQVksS0FBSyxDQUFDO0lBQy9CLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFDakMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxlQUFlLEdBQVksS0FBSyxDQUFDO0lBQ2pDLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFDakMsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixZQUFZLEdBQVksS0FBSyxDQUFDO0lBQzlCLGdCQUFnQixHQUFZLEtBQUssQ0FBQztJQUVsQyxXQUFXLEdBQVksS0FBSyxDQUFDO0lBQzVCLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQ3pDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBbUMsQ0FBQztJQUNsRSxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7SUFDM0Msb0JBQW9CLENBQWM7SUFFckUsUUFBUSxLQUFVLENBQUM7SUFDbkIsWUFBb0IsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNyQyxJQUFJLENBQUMsYUFBYTthQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3JDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBVTtRQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsZUFBZSxDQUFDLEtBQVk7UUFDMUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUNELGVBQWUsQ0FBQyxRQUFnQjtRQUM5QixRQUFRLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JDLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkMsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDdkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JDLE1BQU07WUFDUixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckMsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JDLE1BQU07UUFDVixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsR0FBRyxFQUFFLFFBQVE7WUFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztTQUN4QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QscUJBQXFCLENBQUMsUUFBZ0I7UUFDcEMsSUFBSSxRQUFRLEtBQUssUUFBUTtZQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hELElBQUksUUFBUSxLQUFLLFFBQVE7WUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUN4RCxJQUFJLFFBQVEsS0FBSyxNQUFNO1lBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDcEQsSUFBSSxRQUFRLEtBQUssUUFBUTtZQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JELElBQUksUUFBUSxLQUFLLFFBQVE7WUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUN4RCxJQUFJLFFBQVEsS0FBSyxRQUFRO1lBQUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEQsSUFBSSxRQUFRLEtBQUssUUFBUTtZQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hELElBQUksUUFBUSxLQUFLLFFBQVE7WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBRUQsMERBQTBEO0lBQzFELGlCQUFpQixDQUFDLFFBQWdCO1FBQ2hDLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUM5QixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzlCLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDNUIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMzQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzlCLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDOUIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUM5QixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3JCO2dCQUNFLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBVztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztJQUN6QixDQUFDO3dHQXRLVSxpQkFBaUI7NEZBQWpCLGlCQUFpQixtcURDaEM5QiwyclZBb1RBOzs0RkRwUmEsaUJBQWlCO2tCQU43QixTQUFTOytCQUNFLGtCQUFrQixtQkFHWCx1QkFBdUIsQ0FBQyxNQUFNOzhFQUd0QyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFhRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQzRCLG9CQUFvQjtzQkFBdEQsU0FBUzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW50ZXJmYWNlIFZpZXdTdGF0ZSB7XG4gIGlzU2VhcmNoPzogYm9vbGVhbjtcbiAgaXNDb2x1bW4/OiBib29sZWFuO1xuICBpc0ZpbHRlcj86IGJvb2xlYW47XG4gIGlzU29ydD86IGJvb2xlYW47XG4gIGlzRXhwb3J0PzogYm9vbGVhbjtcbiAgaXNTZWxlY3Q/OiBib29sZWFuO1xuICBpc0NyZWF0ZT86IGJvb2xlYW47XG4gIGlzVG9nZ2xlPzogYm9vbGVhbjtcbiAgaXNJbXBvcnQ/OiBib29sZWFuO1xuICBpc0V4dGVuZD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZlcmJlbi1kYXRhLXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS12aWV3LmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgYnV0dG9uQ2xhc3M/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGljb25DbGFzcz86IHN0cmluZztcbiAgQElucHV0KCkgYWN0aXZlSWNvbkNsYXNzPzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGNvbHVtbkN1c3RvbUNsYXNzPzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckN1c3RvbUNsYXNzPzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNvcnRDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBleHRlbmRDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBleHBvcnRDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzZWxlY3RDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpbXBvcnRDdXN0b21DbGFzcz86IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB6SW5kZXg/OiBudW1iZXIgPSA1O1xuICBASW5wdXQoKSBjcmVhdGVDdXN0b21DbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHRhYmxlSWNvbjogc3RyaW5nID0gJ2dyaWQtMyc7XG4gIEBJbnB1dCgpIGNhcmRJY29uOiBzdHJpbmcgPSAnbGlzdC12aWV3JztcbiAgQElucHV0KCkgY2FyZENsYXNzOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdGFibGVDbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlYXJjaEtleTogc3RyaW5nID0gJ3NlYXJjaCc7XG4gIEBJbnB1dCgpIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBASW5wdXQoKSB2aWV3U3RhdGU6IFZpZXdTdGF0ZSA9IHtcbiAgICBpc1NlYXJjaDogdHJ1ZSxcbiAgICBpc0NvbHVtbjogdHJ1ZSxcbiAgICBpc0ZpbHRlcjogdHJ1ZSxcbiAgICBpc1NvcnQ6IHRydWUsXG4gICAgaXNFeHBvcnQ6IHRydWUsXG4gICAgaXNTZWxlY3Q6IHRydWUsXG4gICAgaXNDcmVhdGU6IHRydWUsXG4gICAgaXNUb2dnbGU6IHRydWUsXG4gICAgaXNFeHRlbmQ6IHRydWUsXG4gICAgaXNJbXBvcnQ6IHRydWUsXG4gIH07XG5cbiAgQElucHV0KCkgc2VhcmNoVGVtcGxhdGU/OiBOb2RlO1xuICBASW5wdXQoKSBpbXBvcnRUZW1wbGF0ZT86IE5vZGU7XG4gIEBJbnB1dCgpIGNvbHVtblRlbXBsYXRlPzogTm9kZTtcbiAgQElucHV0KCkgZXh0ZW5kVGVtcGxhdGU/OiBOb2RlO1xuICBASW5wdXQoKSBmaWx0ZXJUZW1wbGF0ZT86IE5vZGU7XG4gIEBJbnB1dCgpIHNvcnRUZW1wbGF0ZT86IE5vZGU7XG4gIEBJbnB1dCgpIGNoaWxkcmVuPzogTm9kZTtcbiAgQElucHV0KCkgZXhwb3J0VGVtcGxhdGU/OiBOb2RlO1xuICBASW5wdXQoKSBjcmVhdGVUZW1wbGF0ZT86IE5vZGU7XG4gIEBJbnB1dCgpIHNlbGVjdGVkQ29sdW1uQ291bnQ/OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBzZWxlY3RlZFNvcnRDb3VudDogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc2VsZWN0ZWRGaWx0ZXJUYWJsZUNvdW50OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBpbnB1dFdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XG4gIEBJbnB1dCgpIG1pbGxpc2Vjb25kczogbnVtYmVyID0gNDAwO1xuICBASW5wdXQoKSBzaG93Q29sdW1uQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd1NvcnRDaGlsZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RmlsdGVyQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0ltcG9ydENoaWxkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dFeHBvcnRDaGlsZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93RXh0ZW5kQ2hpbGQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY3JlYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB1c2VUd29XYXlCaW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgaXNUYWJsZVZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBzdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgdmFsdWU6IGJvb2xlYW4gfT4oKTtcbiAgQE91dHB1dCgpIG9uU2VhcmNoQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KCk7XG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlckNvbnRlbnRXcmFwcGVyJykgZmlsdGVyQ29udGVudFdyYXBwZXIhOiBFbGVtZW50UmVmO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5zZWFyY2hTdWJqZWN0XG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5taWxsaXNlY29uZHMpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5vblNlYXJjaENoYW5nZS5lbWl0KHsga2V5OiB0aGlzLnNlYXJjaEtleSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZVZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5pc1RhYmxlVmlldyA9ICF0aGlzLmlzVGFibGVWaWV3O1xuICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuaXNUYWJsZVZpZXcpO1xuICB9XG5cbiAgb25TZWFyY2goZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQodGhpcy5zZWFyY2hWYWx1ZSk7XG4gIH1cbiAgc3RvcFByb3BhZ2F0aW9uKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgb25DbGVhclNlYXJjaCgpIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5vblNlYXJjaENoYW5nZS5lbWl0KHsga2V5OiB0aGlzLnNlYXJjaEtleSwgdmFsdWU6IHRoaXMuc2VhcmNoVmFsdWUgfSk7XG4gIH1cbiAgdG9nZ2xlQ2hpbGRWaWV3KHZpZXdUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHZpZXdUeXBlKSB7XG4gICAgICBjYXNlICdjb2x1bW4nOlxuICAgICAgICB0aGlzLnNob3dDb2x1bW5DaGlsZCA9ICF0aGlzLnNob3dDb2x1bW5DaGlsZDtcbiAgICAgICAgdGhpcy5yZXNldENoaWxkVmlld3NFeGNlcHQoJ2NvbHVtbicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgIHRoaXMuc2hvd0ZpbHRlckNoaWxkID0gIXRoaXMuc2hvd0ZpbHRlckNoaWxkO1xuICAgICAgICB0aGlzLnJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnZmlsdGVyJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgIHRoaXMuc2hvd1NvcnRDaGlsZCA9ICF0aGlzLnNob3dTb3J0Q2hpbGQ7XG4gICAgICAgIHRoaXMucmVzZXRDaGlsZFZpZXdzRXhjZXB0KCdzb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgdGhpcy5zaG93U2VsZWN0ZWQgPSAhdGhpcy5zaG93U2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMucmVzZXRDaGlsZFZpZXdzRXhjZXB0KCdzZWxlY3QnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleHBvcnQnOlxuICAgICAgICB0aGlzLnNob3dFeHBvcnRDaGlsZCA9ICF0aGlzLnNob3dFeHBvcnRDaGlsZDtcbiAgICAgICAgdGhpcy5yZXNldENoaWxkVmlld3NFeGNlcHQoJ2V4cG9ydCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ltcG9ydCc6XG4gICAgICAgIHRoaXMuc2hvd0ltcG9ydENoaWxkID0gIXRoaXMuc2hvd0ltcG9ydENoaWxkO1xuICAgICAgICB0aGlzLnJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnaW1wb3J0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXh0ZW5kJzpcbiAgICAgICAgdGhpcy5zaG93RXh0ZW5kQ2hpbGQgPSAhdGhpcy5zaG93RXh0ZW5kQ2hpbGQ7XG4gICAgICAgIHRoaXMucmVzZXRDaGlsZFZpZXdzRXhjZXB0KCdleHRlbmQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjcmVhdGUnOlxuICAgICAgICB0aGlzLmNyZWF0ZSA9ICF0aGlzLmNyZWF0ZTtcbiAgICAgICAgdGhpcy5yZXNldENoaWxkVmlld3NFeGNlcHQoJ2NyZWF0ZScpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KHtcbiAgICAgIGtleTogdmlld1R5cGUsXG4gICAgICB2YWx1ZTogdGhpcy5nZXRDaGlsZFZpZXdTdGF0ZSh2aWV3VHlwZSksXG4gICAgfSk7XG4gIH1cbiAgcmVzZXRDaGlsZFZpZXdzRXhjZXB0KHZpZXdUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodmlld1R5cGUgIT09ICdjb2x1bW4nKSB0aGlzLnNob3dDb2x1bW5DaGlsZCA9IGZhbHNlO1xuICAgIGlmICh2aWV3VHlwZSAhPT0gJ2ZpbHRlcicpIHRoaXMuc2hvd0ZpbHRlckNoaWxkID0gZmFsc2U7XG4gICAgaWYgKHZpZXdUeXBlICE9PSAnc29ydCcpIHRoaXMuc2hvd1NvcnRDaGlsZCA9IGZhbHNlO1xuICAgIGlmICh2aWV3VHlwZSAhPT0gJ3NlbGVjdCcpIHRoaXMuc2hvd1NlbGVjdGVkID0gZmFsc2U7XG4gICAgaWYgKHZpZXdUeXBlICE9PSAnZXhwb3J0JykgdGhpcy5zaG93RXhwb3J0Q2hpbGQgPSBmYWxzZTtcbiAgICBpZiAodmlld1R5cGUgIT09ICdpbXBvcnQnKSB0aGlzLnNob3dJbXBvcnRDaGlsZCA9IGZhbHNlO1xuICAgIGlmICh2aWV3VHlwZSAhPT0gJ2V4dGVuZCcpIHRoaXMuc2hvd0V4dGVuZENoaWxkID0gZmFsc2U7XG4gICAgaWYgKHZpZXdUeXBlICE9PSAnY3JlYXRlJykgdGhpcy5jcmVhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBzdGF0ZSBvZiBhIHNwZWNpZmljIGNoaWxkIHZpZXdcbiAgZ2V0Q2hpbGRWaWV3U3RhdGUodmlld1R5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAodmlld1R5cGUpIHtcbiAgICAgIGNhc2UgJ2NvbHVtbic6XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dDb2x1bW5DaGlsZDtcbiAgICAgIGNhc2UgJ2ZpbHRlcic6XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dGaWx0ZXJDaGlsZDtcbiAgICAgIGNhc2UgJ3NvcnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5zaG93U29ydENoaWxkO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd1NlbGVjdGVkO1xuICAgICAgY2FzZSAnZXhwb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0V4cG9ydENoaWxkO1xuICAgICAgY2FzZSAnaW1wb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0ltcG9ydENoaWxkO1xuICAgICAgY2FzZSAnZXh0ZW5kJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd0V4dGVuZENoaWxkO1xuICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNlYXJjaFZhbHVlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRvb2xiYXIgZmxleCBnYXAganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlclwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwIGZsZXgtMSBqdXN0aWZ5LWVuZFwiPlxuICAgIDxkaXYgKm5nSWY9XCJ2aWV3U3RhdGUuaXNUb2dnbGVcIiBjbGFzcz1cInRvZ2dsZS1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwidG9nZ2xlVmlldygpXCIgW25nQ2xhc3NdPVwiYnV0dG9uQ2xhc3NcIj5cbiAgICAgICAgPHZlcmJlbi1zdmdcbiAgICAgICAgICBbaWNvbl09XCJ0YWJsZUljb25cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiIWlzVGFibGVWaWV3XCJcbiAgICAgICAgICBbbmdDbGFzc109XCIhaXNUYWJsZVZpZXcgPyBhY3RpdmVJY29uQ2xhc3MgOiBpY29uQ2xhc3NcIlxuICAgICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgICAgICA8dmVyYmVuLXN2Z1xuICAgICAgICAgIFtpY29uXT1cImNhcmRJY29uXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzVGFibGVWaWV3XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJpc1RhYmxlVmlldyA/IGFjdGl2ZUljb25DbGFzcyA6IGljb25DbGFzc1wiXG4gICAgICAgICAgW3dpZHRoXT1cIjI1XCJcbiAgICAgICAgICBbaGVpZ2h0XT1cIjI1XCJcbiAgICAgICAgPjwvdmVyYmVuLXN2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gU2VhcmNoIElucHV0IC0tPlxuICAgIDxkaXZcbiAgICAgIFtzdHlsZS53aWR0aF09XCJpbnB1dFdpZHRoXCJcbiAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCJcbiAgICAgICpuZ0lmPVwidmlld1N0YXRlLmlzU2VhcmNoXCJcbiAgICA+XG4gICAgICA8dmVyYmVuLXN2ZyBbaWNvbl09XCInc2VhcmNoMidcIiBbd2lkdGhdPVwiMjBcIiBbaGVpZ2h0XT1cIjIwXCI+PC92ZXJiZW4tc3ZnPlxuICAgICAgPGlucHV0XG4gICAgICAgICpuZ0lmPVwiIXVzZVR3b1dheUJpbmRpbmdcIlxuICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlYXJjaCdcIlxuICAgICAgICAoaW5wdXQpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJzAnXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgIC8+XG4gICAgICA8aW5wdXRcbiAgICAgICAgKm5nSWY9XCJ1c2VUd29XYXlCaW5kaW5nXCJcbiAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWFyY2gnXCJcbiAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoKCRldmVudClcIlxuICAgICAgICBbc3R5bGUuYm9yZGVyXT1cIicwJ1wiXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgLz5cbiAgICAgIDx2ZXJiZW4tc3ZnXG4gICAgICAgICpuZ0lmPVwic2VhcmNoVmFsdWUubGVuZ3RoID4gMFwiXG4gICAgICAgIFtpY29uXT1cIidjbG9zZSdcIlxuICAgICAgICBbd2lkdGhdPVwiMTVcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhclNlYXJjaCgpXCJcbiAgICAgICAgY2xhc3M9XCJjbG9zZS1pY29uLWNsYXNzXCJcbiAgICAgICAgW2hlaWdodF09XCIxNVwiXG4gICAgICA+PC92ZXJiZW4tc3ZnPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgPCEtLSBDb2x1bW4gU2VjdGlvbiAtLT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbYXBwT3V0U2lkZUNsaWNrXT1cInNob3dDb2x1bW5DaGlsZFwiXG4gICAgICAob3V0U2lkZUNsaWNrKT1cInJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnY29sdW1uJylcIlxuICAgICAgKm5nSWY9XCJ2aWV3U3RhdGUuaXNDb2x1bW4gJiYgaXNUYWJsZVZpZXdcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5UZW1wbGF0ZTsgZWxzZSBkZWZhdWx0Q29sdW1uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb2x1bW4+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgJ2ZsZXggZ2FwIHRleHQteHMgaXRlbXMtY2VudGVyIHBkIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICAgY29sdW1uQ3VzdG9tQ2xhc3MgPyBjb2x1bW5DdXN0b21DbGFzcyA6ICcnLFxuICAgICAgICAgIF1cIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3Itc3VyZmFjZS1hbHQpJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNoaWxkVmlldygnY29sdW1uJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjE1XCIgW2ljb25dPVwiJ2NvbHVtbidcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgID5Db2x1bW5zIDxzdXA+KHt7IHNlbGVjdGVkQ29sdW1uQ291bnQgfX0pPC9zdXA+PC9zcGFuXG4gICAgICAgICAgPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbc3R5bGUuei1pbmRleF09XCJ6SW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiZGF0YS12aWV3LWVsZW1lbnRcIlxuICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cInNob3dDb2x1bW5DaGlsZCA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBLZXB0IGluIHRoZSBET00gKGhpZGRlbiB2aWEgZGlzcGxheSkgcmF0aGVyIHRoYW4gKm5nSWYgc28gdGhlXG4gICAgICAgICAgICAgIHByb2plY3RlZCBwYW5lbCBzdGF5cyBjaGFuZ2UtZGV0ZWN0ZWQgYW5kIHJlZmxlY3RzIGhvc3Qgc3RhdGVcbiAgICAgICAgICAgICAgdXBkYXRlcyAoZS5nLiByZXN0b3JlZCBjb2x1bW4gYXJyYW5nZW1lbnQpIGV2ZW4gd2hpbGUgY29sbGFwc2VkLiAtLT5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY29sdW1uLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEZpbHRlciBTZWN0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFthcHBPdXRTaWRlQ2xpY2tdPVwic2hvd0ZpbHRlckNoaWxkXCJcbiAgICAgIChvdXRTaWRlQ2xpY2spPVwicmVzZXRDaGlsZFZpZXdzRXhjZXB0KCdmaWx0ZXInKVwiXG4gICAgICAqbmdJZj1cInZpZXdTdGF0ZS5pc0ZpbHRlclwiXG4gICAgICAoY2xpY2spPVwic3RvcFByb3BhZ2F0aW9uKCRldmVudClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0RmlsdGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRGaWx0ZXI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgJ2ZsZXggZ2FwIHRleHQteHMgaXRlbXMtY2VudGVyIHBkIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICAgZmlsdGVyQ3VzdG9tQ2xhc3MgPyBmaWx0ZXJDdXN0b21DbGFzcyA6ICcnLFxuICAgICAgICAgIF1cIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3Itc3VyZmFjZS1hbHQpJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNoaWxkVmlldygnZmlsdGVyJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjE1XCIgW2ljb25dPVwiJ2ZpbHRlcidcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgID5GaWx0ZXIgPHN1cD4oe3sgc2VsZWN0ZWRGaWx0ZXJUYWJsZUNvdW50IH19KTwvc3VwPjwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKGNsaWNrKT1cInN0b3BQcm9wYWdhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICBbc3R5bGUuei1pbmRleF09XCJ6SW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiZGF0YS12aWV3LWVsZW1lbnRcIlxuICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cInNob3dGaWx0ZXJDaGlsZCA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBLZXB0IGluIHRoZSBET00gKGhpZGRlbiB2aWEgZGlzcGxheSkgcmF0aGVyIHRoYW4gKm5nSWYgc28gdGhlXG4gICAgICAgICAgICAgICBwcm9qZWN0ZWQgcGFuZWwgc3RheXMgY2hhbmdlLWRldGVjdGVkIGFuZCByZWZsZWN0cyBob3N0IHN0YXRlXG4gICAgICAgICAgICAgICB1cGRhdGVzIChlLmcuIHJlc3RvcmVkIGZpbHRlcnMpIGV2ZW4gd2hpbGUgY29sbGFwc2VkLiAtLT5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZmlsdGVyLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLWltcG9ydCBTZWN0aW9uLS0+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW2FwcE91dFNpZGVDbGlja109XCJzaG93SW1wb3J0Q2hpbGRcIlxuICAgICAgKG91dFNpZGVDbGljayk9XCJyZXNldENoaWxkVmlld3NFeGNlcHQoJ2ltcG9ydCcpXCJcbiAgICAgICpuZ0lmPVwidmlld1N0YXRlLmlzSW1wb3J0XCJcbiAgICAgIChjbGljayk9XCJzdG9wUHJvcGFnYXRpb24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltcG9ydFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRJbXBvcnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEltcG9ydD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAnZmxleCBnYXAgdGV4dC14cyBpdGVtcy1jZW50ZXIgcGQgcm91bmRlZCBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICBpbXBvcnRDdXN0b21DbGFzcyA/IGltcG9ydEN1c3RvbUNsYXNzIDogJycsXG4gICAgICAgICAgXVwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1zdXJmYWNlLWFsdCknXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2hpbGRWaWV3KCdpbXBvcnQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaWNvbl09XCInZmlsZSdcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPHNwYW4+SW1wb3J0PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAoY2xpY2spPVwic3RvcFByb3BhZ2F0aW9uKCRldmVudClcIlxuICAgICAgICAgIFtzdHlsZS56LWluZGV4XT1cInpJbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJkYXRhLXZpZXctZWxlbWVudFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGVudFxuICAgICAgICAgICAgKm5nSWY9XCJzaG93SW1wb3J0Q2hpbGRcIlxuICAgICAgICAgICAgc2VsZWN0PVwiW2ltcG9ydC1jb250ZW50XVwiXG4gICAgICAgICAgPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gU29ydCBTZWN0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFthcHBPdXRTaWRlQ2xpY2tdPVwic2hvd1NvcnRDaGlsZFwiXG4gICAgICAob3V0U2lkZUNsaWNrKT1cInJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnc29ydCcpXCJcbiAgICAgICpuZ0lmPVwidmlld1N0YXRlLmlzU29ydFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNvcnRUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0U29ydFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U29ydD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAnZmxleCBnYXAgdGV4dC14cyBpdGVtcy1jZW50ZXIgcGQgcm91bmRlZCBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICBzb3J0Q3VzdG9tQ2xhc3MgPyBzb3J0Q3VzdG9tQ2xhc3MgOiAnJyxcbiAgICAgICAgICBdXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCIndmFyKC0tdmJuLWNvbG9yLXN1cmZhY2UtYWx0KSdcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDaGlsZFZpZXcoJ3NvcnQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaWNvbl09XCInc29ydCdcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgID5Tb3J0IDxzdXA+KHt7IHNlbGVjdGVkU29ydENvdW50IH19KTwvc3VwPjwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IFtzdHlsZS56LWluZGV4XT1cInpJbmRleFwiIGNsYXNzPVwiZGF0YS12aWV3LWVsZW1lbnRcIj5cbiAgICAgICAgICA8bmctY29udGVudFxuICAgICAgICAgICAgKm5nSWY9XCJzaG93U29ydENoaWxkXCJcbiAgICAgICAgICAgIHNlbGVjdD1cIltzb3J0LWNvbnRlbnRdXCJcbiAgICAgICAgICA+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLUV4dGVuZCBTZWN0aW9uLS0+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW2FwcE91dFNpZGVDbGlja109XCJzaG93RXh0ZW5kQ2hpbGRcIlxuICAgICAgKG91dFNpZGVDbGljayk9XCJyZXNldENoaWxkVmlld3NFeGNlcHQoJ2V4dGVuZCcpXCJcbiAgICAgICpuZ0lmPVwidmlld1N0YXRlLmlzRXh0ZW5kXCJcbiAgICAgIChjbGljayk9XCJzdG9wUHJvcGFnYXRpb24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4dGVuZFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRFeHRlbmRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEV4dGVuZD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgICAgICAnZmxleCBnYXAgdGV4dC14cyBpdGVtcy1jZW50ZXIgcGQgcm91bmRlZCBjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICBpbXBvcnRDdXN0b21DbGFzcyA/IGV4dGVuZEN1c3RvbUNsYXNzIDogJycsXG4gICAgICAgICAgXVwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1zdXJmYWNlLWFsdCknXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2hpbGRWaWV3KCdleHRlbmQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaWNvbl09XCInZXh0ZW5kJ1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICA8c3Bhbj5FeHRlbmQ8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIChjbGljayk9XCJzdG9wUHJvcGFnYXRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgW3N0eWxlLnotaW5kZXhdPVwiekluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cImRhdGEtdmlldy1lbGVtZW50XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250ZW50XG4gICAgICAgICAgICAqbmdJZj1cInNob3dJbXBvcnRDaGlsZFwiXG4gICAgICAgICAgICBzZWxlY3Q9XCJbZXh0ZW5kLWNvbnRlbnRdXCJcbiAgICAgICAgICA+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBFeHBvcnQgU2VjdGlvbiAtLT5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbYXBwT3V0U2lkZUNsaWNrXT1cInNob3dFeHBvcnRDaGlsZFwiXG4gICAgICAob3V0U2lkZUNsaWNrKT1cInJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnZXhwb3J0JylcIlxuICAgICAgKm5nSWY9XCJ2aWV3U3RhdGUuaXNFeHBvcnRcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJleHBvcnRUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0RXhwb3J0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRFeHBvcnQ+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgJ2ZsZXggZ2FwIHRleHQteHMgaXRlbXMtY2VudGVyIHBkIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICAgZXhwb3J0Q3VzdG9tQ2xhc3MgPyBleHBvcnRDdXN0b21DbGFzcyA6ICcnLFxuICAgICAgICAgIF1cIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIid2YXIoLS12Ym4tY29sb3Itc3VyZmFjZS1hbHQpJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNoaWxkVmlldygnZXhwb3J0JylcIlxuICAgICAgICA+XG4gICAgICAgICAgPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjE1XCIgW2ljb25dPVwiJ2V4cG9ydCdcIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgRXhwb3J0XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBbc3R5bGUuei1pbmRleF09XCJ6SW5kZXhcIiBjbGFzcz1cImRhdGEtdmlldy1lbGVtZW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnRcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0V4cG9ydENoaWxkXCJcbiAgICAgICAgICAgIHNlbGVjdD1cIltleHBvcnQtY29udGVudF1cIlxuICAgICAgICAgID48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gU2VsZWN0IFNlY3Rpb24gLS0+XG4gICAgPCEtLSA8ZGl2ICpuZ0lmPVwidmlld1N0YXRlLmlzU2VsZWN0XCI+XG4gICAgIDxzcGFuXG4gICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgJ2ZsZXggZ2FwIHRleHQteHMgaXRlbXMtY2VudGVyIHBkIHJvdW5kZWQgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgc2VsZWN0Q3VzdG9tQ2xhc3MgPyBzZWxlY3RDdXN0b21DbGFzcyA6ICcnXG4gICAgICAgXVwiXG4gICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci1zdXJmYWNlLWFsdCknXCJcbiAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2hpbGRWaWV3KCdzZWxlY3QnKVwiXG4gICAgID5cbiAgICAgICA8dmVyYmVuLXN2ZyBbd2lkdGhdPVwiMTVcIiBbaWNvbl09XCInc2VsZWN0J1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICA8c3Bhbj5TZWxlY3Q8L3NwYW4+XG4gICAgICAgPHZlcmJlbi1zdmcgW3dpZHRoXT1cIjZcIiBbaWNvbl09XCInY2hldnJvbi1kb3duJ1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgPC9zcGFuPlxuICAgPC9kaXY+IC0tPlxuXG4gICAgPCEtLSBDcmVhdGUgQnV0dG9uIGpqLS0+XG5cbiAgICA8ZGl2XG4gICAgICBbYXBwT3V0U2lkZUNsaWNrXT1cImNyZWF0ZVwiXG4gICAgICAob3V0U2lkZUNsaWNrKT1cInJlc2V0Q2hpbGRWaWV3c0V4Y2VwdCgnY3JlYXRlJylcIlxuICAgICAgKm5nSWY9XCJ2aWV3U3RhdGUuaXNDcmVhdGVcIlxuICAgID5cbiAgICAgIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICBjbGFzcz1cInRleHQtc20gZm9udC1zZW1pYm9sZFwiXG4gICAgICAgIFtiZ0NvbG9yXT1cIid2YXIoLS12Ym4tY29sb3ItcHJpbWFyeSknXCJcbiAgICAgICAgW2J1dHRvbkNsYXNzXT1cImNyZWF0ZUN1c3RvbUNsYXNzXCJcbiAgICAgICAgW3BkXT1cIic2cHgnXCJcbiAgICAgICAgW2JvcmRlclJhZGl1c109XCInNHB4J1wiXG4gICAgICAgIFt0ZXh0Q29sb3JdPVwiJ3ZhcigtLXZibi1jb2xvci10ZXh0KSdcIlxuICAgICAgICBbc3ZnXT1cIidhZGQnXCJcbiAgICAgICAgW3N2Z1Bvc2l0aW9uXT1cIidyaWdodCdcIlxuICAgICAgICBbdGV4dF09XCInQ3JlYXRlIE5ldydcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2hpbGRWaWV3KCdjcmVhdGUnKVwiXG4gICAgICA+XG4gICAgICA8L3ZlcmJlbmEtYnV0dG9uPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVRlbXBsYXRlOyBlbHNlIGRlZmF1bHRDcmVhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENyZWF0ZT5cbiAgICAgICAgPGRpdiBbc3R5bGUuei1pbmRleF09XCJ6SW5kZXhcIiBjbGFzcz1cImRhdGEtdmlldy1lbGVtZW50XCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJjcmVhdGVcIiBzZWxlY3Q9XCJbY3JlYXRlLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNoaWxkcmVuOyBlbHNlIGRlZmF1bHRDaGlsZHJlblwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENoaWxkcmVuPlxuICAgICAgPGRpdj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2NoaWxkcmVuXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gR3JpZCBhbmQgTGlzdCBWaWV3IEhhbmRsaW5nIC0tPlxuPGRpdiAqbmdJZj1cImlzVGFibGVWaWV3OyBlbHNlIGxpc3RWaWV3VGVtcGxhdGVcIj5cbiAgPGRpdiBbc3R5bGUub3ZlcmZsb3ddPVwiJ2F1dG8nXCIgW2NsYXNzXT1cInRhYmxlQ2xhc3NcIj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbdGFibGUtY29udGVudF1cIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2xpc3RWaWV3VGVtcGxhdGU+XG4gIDxkaXYgW2NsYXNzXT1cImNhcmRDbGFzc1wiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjYXJkLWNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|