@sumaris-net/ngx-components 18.27.7 → 18.27.9

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.
@@ -248,11 +248,11 @@ export class AppPropertiesTable extends AppInMemoryTable {
248
248
  this.markRowAsDirty();
249
249
  }
250
250
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppPropertiesTable, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: PropertyEntityValidator }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
251
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AppPropertiesTable, selector: "app-properties-table", inputs: { definitions: "definitions", showToolbar: "showToolbar" }, providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button\n mat-icon-button\n *ngIf=\"!mobile\"\n [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n (click)=\"emitRefresh()\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat),\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"!showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n [matTooltip]=\"showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '&#xbb;' : '&#xab;' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.label' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n [required]=\"true\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"!showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i3.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: 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: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i9.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i10.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i14.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i15.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i16.MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "autofocus", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "focus", "blur"] }, { kind: "component", type: i17.ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "showPendingSpinner", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplateStart", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: i18.AppRowField, selector: "app-row-field", inputs: ["name", "definition", "definitionFn", "headerI18n", "sortable", "resizable", "required", "readonly", "sticky", "draggable", "disabled", "placeholder", "compact", "floatLabel", "appearance", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i19.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i20.NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: i21.FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
251
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AppPropertiesTable, selector: "app-properties-table", inputs: { definitions: "definitions", showToolbar: "showToolbar" }, providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], viewQueries: [{ propertyName: "filterExpansionPanel", first: true, predicate: MatExpansionPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button\n mat-icon-button\n *ngIf=\"!mobile\"\n [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n (click)=\"emitRefresh()\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat),\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"!showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n [matTooltip]=\"showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '&#xbb;' : '&#xab;' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.label' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"!showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i3.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i4.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: 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: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i6.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "directive", type: i9.MatExpansionPanelActionRow, selector: "mat-action-row" }, { kind: "component", type: i10.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i13.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "directive", type: i14.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i15.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i16.MatBooleanField, selector: "mat-boolean-field", inputs: ["disabled", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "subscriptSizing", "readonly", "required", "compact", "autofocus", "style", "buttonsColCount", "class", "yesLabel", "noLabel", "showButtonIcons", "yesIcon", "noIcon", "clearable", "labelPosition", "tabindex", "showRadio", "value"], outputs: ["keyup.enter", "focus", "blur"] }, { kind: "component", type: i17.ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "showPendingSpinner", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplateStart", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "component", type: i18.AppRowField, selector: "app-row-field", inputs: ["name", "definition", "definitionFn", "headerI18n", "sortable", "resizable", "readonly", "sticky", "draggable", "disabled", "placeholder", "compact", "floatLabel", "appearance", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i19.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i20.NumberFormatPipe, name: "numberFormat" }, { kind: "pipe", type: i21.FormGetValuePipe, name: "formGetValue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
252
252
  }
253
253
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AppPropertiesTable, decorators: [{
254
254
  type: Component,
255
- args: [{ selector: 'app-properties-table', providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button\n mat-icon-button\n *ngIf=\"!mobile\"\n [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n (click)=\"emitRefresh()\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat),\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"!showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n [matTooltip]=\"showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '&#xbb;' : '&#xab;' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.label' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n [required]=\"true\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"!showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n" }]
255
+ args: [{ selector: 'app-properties-table', providers: [{ provide: PropertyEntityValidator, useClass: PropertyEntityValidator }], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<mat-toolbar *ngIf=\"showToolbar\" [class.expanded]=\"filterExpansionPanel.expanded\">\n <!-- Refresh -->\n <button\n mat-icon-button\n *ngIf=\"!mobile\"\n [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n (click)=\"emitRefresh()\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <!-- Reset filter -->\n <button mat-icon-button (click)=\"resetFilter()\" *ngIf=\"filterCriteriaCount\">\n <mat-icon color=\"accent\">filter_list_alt</mat-icon>\n <mat-icon class=\"icon-secondary\" style=\"left: 16px; top: 5px; font-weight: bold\">close</mat-icon>\n </button>\n\n <!-- Show filter -->\n <button mat-icon-button (click)=\"filterExpansionPanel.toggle()\">\n <mat-icon\n [matBadge]=\"filterCriteriaCount\"\n [matBadgeHidden]=\"filterIsEmpty\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n aria-hidden=\"false\"\n >\n filter_list_alt\n </mat-icon>\n </button>\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <!-- search -->\n <mat-expansion-panel\n #filterExpansionPanel\n class=\"filter-panel\"\n [class.ion-no-padding]=\"mobile\"\n [class.filter-panel-floating]=\"filterPanelFloating\"\n >\n <form class=\"form-container\" [formGroup]=\"filterForm\" (ngSubmit)=\"emitRefresh()\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <!-- search -->\n <mat-form-field>\n <mat-label>{{ 'SETTINGS.FILTER.SEARCH' | translate }}</mat-label>\n <input matInput formControlName=\"searchText\" />\n\n <button\n mat-icon-button\n matSuffix\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clearControlValue($event, filterForm.controls.searchText)\"\n [hidden]=\"filterForm.controls.searchText.disabled || !filterForm.controls.searchText.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </mat-form-field>\n </ion-col>\n\n <ion-col>\n <mat-boolean-field\n [style]=\"'checkbox'\"\n formControlName=\"notDefaultOnly\"\n [placeholder]=\"'SETTINGS.FILTER.ONLY_NOT_DEFAULT' | translate\"\n floatLabel=\"always\"\n ></mat-boolean-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n </form>\n\n <mat-action-row>\n <!-- Counter -->\n <ion-label\n [hidden]=\"(loadingSubject | async) || filterForm.dirty\"\n [color]=\"empty && 'danger'\"\n class=\"ion-padding\"\n >\n {{\n (totalRowCount ? 'COMMON.RESULT_COUNT' : 'COMMON.NO_RESULT')\n | translate\n : {\n count: (totalRowCount | numberFormat),\n }\n }}\n </ion-label>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button\n mat-icon-button\n color=\"accent\"\n *ngIf=\"filterPanelFloating\"\n (click)=\"toggleFilterPanelFloating()\"\n class=\"hidden-xs hidden-sm hidden-md\"\n [title]=\"!showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n [matTooltip]=\"showTooltip ? ((filterPanelFloating ? 'COMMON.BTN_EXPAND' : 'COMMON.BTN_HIDE') | translate) : ''\"\n >\n <mat-icon>\n <span style=\"transform: rotate(90deg)\">{{ filterPanelFloating ? '&#xbb;' : '&#xab;' }}</span>\n </mat-icon>\n </button>\n\n <!-- Close panel -->\n <ion-button mat-button fill=\"clear\" color=\"dark\" (click)=\"closeFilterPanel()\" [disabled]=\"loadingSubject | async\">\n <ion-text translate>COMMON.BTN_CLOSE</ion-text>\n </ion-button>\n\n <!-- Search button -->\n <ion-button\n mat-button\n [color]=\"filterForm.dirty ? 'tertiary' : 'dark'\"\n [fill]=\"filterForm.dirty ? 'solid' : 'clear'\"\n (click)=\"applyFilterAndClosePanel($event)\"\n [disabled]=\"loadingSubject | async\"\n >\n <ion-text translate>COMMON.BTN_APPLY</ion-text>\n </ion-button>\n </mat-action-row>\n </mat-expansion-panel>\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n [style.--mat-row-height]=\"'52px'\"\n >\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"true\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"true\"></td>\n </ng-container>\n\n <!-- id column (hidden) -->\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!debug\"></th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!debug\">\n {{ row.currentData.id }}\n </td>\n </ng-container>\n\n <!-- definition column -->\n <ng-container matColumnDef=\"definition\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"ion-padding-start\">\n <ion-label>{{ i18nColumnPrefix + 'DEFINITION' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"ion-padding-start\">\n {{ row.currentData | propertyGet: 'definition.label' }}\n </td>\n </ng-container>\n\n <!-- value column -->\n <app-row-field\n name=\"value\"\n floatLabel=\"never\"\n [definitionFn]=\"definitionByRow\"\n [headerI18n]=\"i18nColumnPrefix + 'VALUE'\"\n ></app-row-field>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"true\"\n [canCancel]=\"false\"\n [canDelete]=\"false\"\n [dirtyIcon]=\"false\"\n [cellTemplate]=\"cellInjection\"\n >\n <!-- cell injection-->\n <ng-template #cellInjection let-row>\n <button\n type=\"button\"\n mat-icon-button\n *ngIf=\"\n !mobile &&\n !disabled &&\n (row.validator | formGetValue: 'value') !== (row.validator | formGetValue: 'definition').defaultValue\n \"\n [class.visible-hover-row]=\"!mobile\"\n [tabindex]=\"-1\"\n [title]=\"!showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('SETTINGS.BTN_RESET_PROPERTY' | translate) : ''\"\n (click)=\"resetProperty($event, row)\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n </ng-template>\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n" }]
256
256
  }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: PropertyEntityValidator }, { type: i22.Environment, decorators: [{
257
257
  type: Inject,
258
258
  args: [ENVIRONMENT]
@@ -264,4 +264,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
264
264
  type: ViewChild,
265
265
  args: [MatExpansionPanel, { static: true }]
266
266
  }] } });
267
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy50YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEksT0FBTyxFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0YsT0FBTyxFQUFFLE1BQU0sRUFBeUIsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDL0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDcEYsT0FBTyxFQUF5RCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRyxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV0RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVB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QUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzt3R0E5S1Usa0JBQWtCLGdIQWdCbkIsV0FBVzs0RkFoQlYsa0JBQWtCLG1IQUhsQixDQUFDLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLGdGQU16RSxpQkFBaUIscUZDMUc5QixrdFFBNE9BOzs0RkRySWEsa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLHNCQUFzQixhQUdyQixDQUFDLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLG1CQUNuRSx1QkFBdUIsQ0FBQyxNQUFNOzswQkFrQjVDLE1BQU07MkJBQUMsV0FBVzt5Q0FmWixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQzBDLG9CQUFvQjtzQkFBbkUsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBJbk1lbW9yeVRhYmxlIH0gZnJvbSAnLi4vLi4vdGFibGUvbWVtb3J5LXRhYmxlLmNsYXNzJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERpcmVjdGl2ZSwgaW5qZWN0LCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJFU0VSVkVEX0VORF9DT0xVTU5TLCBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TIH0gZnJvbSAnLi4vLi4vdGFibGUvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IEVudGl0eSwgRW50aXR5QXNPYmplY3RPcHRpb25zLCBFbnRpdHlVdGlscyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdG9yL2Jhc2UudmFsaWRhdG9yLmNsYXNzJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiwgRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IGlzTm90TmlsLCBzcGxpdEJ5UHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBUYWJsZUVsZW1lbnQgfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHsgRW50aXR5Q2xhc3MgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkuZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBFbnRpdHlGaWx0ZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9maWx0ZXIubW9kZWwnO1xuaW1wb3J0IHsgRmlsdGVyRm4sIFByb3BlcnR5IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBcHBGb3JtVXRpbHMgfSBmcm9tICcuLi9mb3JtLnV0aWxzJztcbmltcG9ydCB7IE1hdEV4cGFuc2lvblBhbmVsIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcblxuaW1wb3J0IHsgQVBQX1NIT1dfVE9PTFRJUCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xuXG5ARW50aXR5Q2xhc3MoeyB0eXBlbmFtZTogJ1Byb3BlcnR5RW50aXR5JyB9KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RW50aXR5IGV4dGVuZHMgRW50aXR5PFByb3BlcnR5RW50aXR5LCBzdHJpbmc+IGltcGxlbWVudHMgUHJvcGVydHkge1xuICBzdGF0aWMgZnJvbU9iamVjdDogKHNvdXJjZTogYW55LCBvcHRzPzogYW55KSA9PiBQcm9wZXJ0eUVudGl0eTtcblxuICBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uID0gbnVsbDtcbiAgdmFsdWU6IGFueSA9IG51bGw7XG5cbiAgZ2V0IGtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRlZmluaXRpb24/LmtleSB8fCB0aGlzLmlkO1xuICB9XG5cbiAgZnJvbU9iamVjdChzb3VyY2U6IGFueSkge1xuICAgIHN1cGVyLmZyb21PYmplY3Qoc291cmNlKTtcbiAgICB0aGlzLmlkID0gc291cmNlLmRlZmluaXRpb24/LmtleSA/PyBzb3VyY2Uua2V5ID8/IHNvdXJjZS5pZDtcbiAgICB0aGlzLmRlZmluaXRpb24gPSBzb3VyY2UuZGVmaW5pdGlvbjtcbiAgICB0aGlzLnZhbHVlID0gc291cmNlLnZhbHVlO1xuICB9XG5cbiAgYXNPYmplY3Qob3B0cz86IEVudGl0eUFzT2JqZWN0T3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc3VwZXIuYXNPYmplY3Qob3B0cyk7XG4gICAgdGFyZ2V0LmlkID0gdGhpcy5kZWZpbml0aW9uLmtleTtcbiAgICBkZWxldGUgdGFyZ2V0LmRlZmluaXRpb247XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFbnRpdHlGaWx0ZXIgZXh0ZW5kcyBFbnRpdHlGaWx0ZXI8UHJvcGVydHlFbnRpdHlGaWx0ZXIsIFByb3BlcnR5RW50aXR5PiB7XG4gIHN0YXRpYyBmcm9tT2JqZWN0OiAoc291cmNlLCBvcHRzPzogYW55KSA9PiBQcm9wZXJ0eUVudGl0eUZpbHRlcjtcblxuICBzZWFyY2hUZXh0OiBzdHJpbmc7XG4gIG5vdERlZmF1bHRPbmx5ID0gZmFsc2U7XG5cbiAgZnJvbU9iamVjdChzb3VyY2U6IGFueSkge1xuICAgIHN1cGVyLmZyb21PYmplY3Qoc291cmNlKTtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBzb3VyY2Uuc2VhcmNoVGV4dDtcbiAgICB0aGlzLm5vdERlZmF1bHRPbmx5ID0gc291cmNlLm5vdERlZmF1bHRPbmx5O1xuICB9XG5cbiAgYXNPYmplY3Qob3B0cz86IEVudGl0eUFzT2JqZWN0T3B0aW9ucyk6IGFueSB7XG4gICAgcmV0dXJuIHN1cGVyLmFzT2JqZWN0KG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRmlsdGVyKCk6IEZpbHRlckZuPFByb3BlcnR5RW50aXR5PltdIHtcbiAgICBjb25zdCBmaWx0ZXJGbnMgPSBzdXBlci5idWlsZEZpbHRlcigpO1xuXG4gICAgY29uc3Qgc2VhcmNoVGV4dEZpbHRlciA9IEVudGl0eVV0aWxzLnNlYXJjaFRleHRGaWx0ZXIoJ2RlZmluaXRpb24udHJhbnNsYXRlZE5hbWUnLCB0aGlzLnNlYXJjaFRleHQpO1xuICAgIGlmIChzZWFyY2hUZXh0RmlsdGVyKSBmaWx0ZXJGbnMucHVzaChzZWFyY2hUZXh0RmlsdGVyKTtcblxuICAgIGlmICh0aGlzLm5vdERlZmF1bHRPbmx5KSB7XG4gICAgICBmaWx0ZXJGbnMucHVzaCgoZGF0YSkgPT4gaXNOb3ROaWwoZGF0YS52YWx1ZSkgJiYgZGF0YS5kZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gZGF0YS52YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlckZucztcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NyaXRlcmlhTm90RW1wdHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoa2V5ID09PSAnbm90RGVmYXVsdE9ubHknKSByZXR1cm4gdmFsdWUgPT09IHRydWU7XG4gICAgcmV0dXJuIHN1cGVyLmlzQ3JpdGVyaWFOb3RFbXB0eShrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVudGl0eVZhbGlkYXRvciBleHRlbmRzIEFwcFZhbGlkYXRvclNlcnZpY2U8UHJvcGVydHlFbnRpdHk+IHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIpIHtcbiAgICBzdXBlcihmb3JtQnVpbGRlciwgbnVsbCk7XG4gIH1cblxuICBnZXRGb3JtR3JvdXBDb25maWcoZGF0YT86IFByb3BlcnR5RW50aXR5KTogeyBbcDogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogW2RhdGE/LmlkID8/IG51bGxdLFxuICAgICAgZGVmaW5pdGlvbjogW2RhdGE/LmRlZmluaXRpb24gfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB2YWx1ZTogW2RhdGE/LnZhbHVlID8/IG51bGxdLFxuICAgIH07XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb3BlcnRpZXMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJ3Byb3BlcnRpZXMudGFibGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWydwcm9wZXJ0aWVzLnRhYmxlLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBQcm9wZXJ0eUVudGl0eVZhbGlkYXRvciwgdXNlQ2xhc3M6IFByb3BlcnR5RW50aXR5VmFsaWRhdG9yIH1dLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwUHJvcGVydGllc1RhYmxlIGV4dGVuZHMgQXBwSW5NZW1vcnlUYWJsZTxQcm9wZXJ0eUVudGl0eSwgUHJvcGVydHlFbnRpdHlGaWx0ZXIsIHN0cmluZz4gaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBkZWZpbml0aW9uczogRm9ybUZpZWxkRGVmaW5pdGlvbltdO1xuICBASW5wdXQoKSBzaG93VG9vbGJhciA9IHRydWU7XG4gIEBWaWV3Q2hpbGQoTWF0RXhwYW5zaW9uUGFuZWwsIHsgc3RhdGljOiB0cnVlIH0pIGZpbHRlckV4cGFuc2lvblBhbmVsOiBNYXRFeHBhbnNpb25QYW5lbDtcblxuICBkZWZpbml0aW9uc01hcEJ5S2V5OiBGb3JtRmllbGREZWZpbml0aW9uTWFwID0ge307XG4gIGZpbHRlckZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIGZpbHRlckNyaXRlcmlhQ291bnQgPSAwO1xuICBmaWx0ZXJQYW5lbEZsb2F0aW5nID0gdHJ1ZTtcblxuICBzaG93VG9vbHRpcCA9IGluamVjdChBUFBfU0hPV19UT09MVElQLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRvclNlcnZpY2U6IFByb3BlcnR5RW50aXR5VmFsaWRhdG9yLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGluamVjdG9yLFxuICAgICAgWy4uLlJFU0VSVkVEX1NUQVJUX0NPTFVNTlMsICdkZWZpbml0aW9uJywgJ3ZhbHVlJywgLi4uUkVTRVJWRURfRU5EX0NPTFVNTlNdLFxuICAgICAgUHJvcGVydHlFbnRpdHksXG4gICAgICBuZXcgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2UoUHJvcGVydHlFbnRpdHksIFByb3BlcnR5RW50aXR5RmlsdGVyLCB7XG4gICAgICAgIHNvcnRCeVJlcGxhY2VtZW50OiB7IGRlZmluaXRpb246ICdkZWZpbml0aW9uLmxhYmVsJyB9LFxuICAgICAgfSksXG4gICAgICB2YWxpZGF0b3JTZXJ2aWNlXG4gICAgKTtcblxuICAgIHRoaXMuaW5saW5lRWRpdGlvbiA9IHRydWU7XG4gICAgdGhpcy5kZWZhdWx0U29ydEJ5ID0gJ2RlZmluaXRpb24nO1xuICAgIHRoaXMuZGVmYXVsdFNvcnREaXJlY3Rpb24gPSAnYXNjJztcbiAgICB0aGlzLmRlYnVnID0gIWVudmlyb25tZW50Py5wcm9kdWN0aW9uO1xuXG4gICAgdGhpcy5maWx0ZXJGb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgc2VhcmNoVGV4dDogW10sXG4gICAgICBub3REZWZhdWx0T25seTogW251bGxdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hdXRvTG9hZCA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIEZpbGwgZGVmaW5pdGlvbnMgbWFwXG4gICAgdGhpcy5kZWZpbml0aW9ucyA9ICh0aGlzLmRlZmluaXRpb25zIHx8IFtdKS5tYXAoKGRlZikgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChkZWYubGFiZWwpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLmRlZmluaXRpb25zTWFwQnlLZXkgPSBzcGxpdEJ5UHJvcGVydHkodGhpcy5kZWZpbml0aW9ucywgJ2tleScpO1xuXG4gICAgdGhpcy5yZWdpc3RlckNlbGxWYWx1ZUNoYW5nZXMoJ2RlZmluaXRpb24nKS5zdWJzY3JpYmUoKGRlZmluaXRpb24pID0+IHtcbiAgICAgIGlmIChpc05vdE5pbChkZWZpbml0aW9uKSAmJiB0aGlzLmVkaXRlZFJvdz8uaWQgPT09IC0xKSB7XG4gICAgICAgIHRoaXMuZWRpdGVkUm93LnZhbGlkYXRvci5wYXRjaFZhbHVlKHsgaWQ6IGRlZmluaXRpb24ua2V5LCB2YWx1ZTogZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyQ2VsbFZhbHVlQ2hhbmdlcygndmFsdWUnKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgZmlsdGVyKChfKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZCA9IHRoaXMuZmlsdGVyRm9ybS52YWxpZDtcbiAgICAgICAgICAgIGlmICghdmFsaWQgJiYgdGhpcy5kZWJ1ZykgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnModGhpcy5maWx0ZXJGb3JtKTtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIGZpbHRlclxuICAgICAgICAgIHRhcCgoanNvbikgPT4gdGhpcy5zZXRGaWx0ZXIoanNvbikpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcblxuICAgIHRoaXMucmVzZXRGaWx0ZXIoKTtcblxuICAgIHRoaXMubWFya0FzUmVhZHkoKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBQcm9wZXJ0eUVudGl0eVtdIHtcbiAgICBsZXQgdmFsdWVzID0gc3VwZXIudmFsdWUgfHwgW107XG5cbiAgICAvLyByZW1vdmUgdW5zZXQgb3B0aW9uc1xuICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIoKHByb3BlcnR5KSA9PiBpc05vdE5pbChwcm9wZXJ0eS52YWx1ZSAhPT0gcHJvcGVydHkuZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUpKTtcblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBzZXQgdmFsdWUoZGF0YTogUHJvcGVydHlFbnRpdHlbXSkge1xuICAgIHN1cGVyLnZhbHVlID0gZGF0YTtcbiAgfVxuXG4gIGRlZmluaXRpb25CeVJvdyA9IChyb3c6IFRhYmxlRWxlbWVudDxQcm9wZXJ0eUVudGl0eT4pOiBGb3JtRmllbGREZWZpbml0aW9uID0+IHRoaXMuZGVmaW5pdGlvbnNNYXBCeUtleVtyb3cuY3VycmVudERhdGEuaWRdO1xuXG4gIHNldFZhbHVlKHZhbHVlOiBQcm9wZXJ0eUVudGl0eVtdLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICAvLyBCdWlsZCBlbnRpdGllc1xuICAgIGNvbnN0IHRhcmdldDogUHJvcGVydHlFbnRpdHlbXSA9IHRoaXMuZGVmaW5pdGlvbnMubWFwKChkZWZpbml0aW9uKSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9ICh2YWx1ZSB8fCBbXSk/LmZpbmQoKHNvdXJjZSkgPT4gc291cmNlLmtleSA9PT0gZGVmaW5pdGlvbi5rZXkpO1xuICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5Py52YWx1ZSA/PyBkZWZpbml0aW9uLmRlZmF1bHRWYWx1ZTtcbiAgICAgIC8vIENvbnZlcnQgdG8gZW50aXR5XG4gICAgICByZXR1cm4gUHJvcGVydHlFbnRpdHkuZnJvbU9iamVjdCh7XG4gICAgICAgIGlkOiBkZWZpbml0aW9uLmtleSxcbiAgICAgICAgZGVmaW5pdGlvbixcbiAgICAgICAgLy8gZ2V0IHVzZXIgdmFsdWUgb3IgZGVmYXVsdCB2YWx1ZVxuICAgICAgICB2YWx1ZTogcHJvcGVydHlWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc3VwZXIuc2V0VmFsdWUodGFyZ2V0LCBvcHRzKTtcbiAgfVxuXG4gIGNsZWFyQ29udHJvbFZhbHVlKGV2ZW50OiBFdmVudCwgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIEF2b2lkIHRvIGVudGVyIGlucHV0IHRoZSBmaWVsZFxuICAgIGZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJlc2V0RmlsdGVyKHZhbHVlPzogYW55LCBvcHRzPzogeyBlbWl0RXZlbnQ6IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IGYgPSA8UHJvcGVydHlFbnRpdHlGaWx0ZXI+eyBzZWFyY2hUZXh0OiBudWxsLCBub3REZWZhdWx0T25seTogZmFsc2UsIC4uLnZhbHVlIH07XG4gICAgdGhpcy5maWx0ZXJGb3JtLnJlc2V0KGYsIG9wdHMpO1xuICAgIHRoaXMuc2V0RmlsdGVyKGYgfHwgbnVsbCwgb3B0cyk7XG4gICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gMDtcbiAgICBpZiAodGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbCAmJiB0aGlzLmZpbHRlclBhbmVsRmxvYXRpbmcpIHRoaXMuZmlsdGVyRXhwYW5zaW9uUGFuZWwuY2xvc2UoKTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgfVxuXG4gIHNldEZpbHRlcihmaWx0ZXI6IFByb3BlcnR5RW50aXR5RmlsdGVyLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBmaWx0ZXIgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YVNlcnZpY2UuYXNGaWx0ZXIoZmlsdGVyKTtcblxuICAgIC8vIFVwZGF0ZSBjcml0ZXJpYSBjb3VudFxuICAgIGNvbnN0IGNyaXRlcmlhQ291bnQgPSBmaWx0ZXIuY291bnROb3RFbXB0eUNyaXRlcmlhKCk7XG4gICAgaWYgKGNyaXRlcmlhQ291bnQgIT09IHRoaXMuZmlsdGVyQ3JpdGVyaWFDb3VudCkge1xuICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gY3JpdGVyaWFDb3VudDtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBmb3JtIGNvbnRlbnRcbiAgICBpZiAodGhpcy5maWx0ZXJGb3JtICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB7XG4gICAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZShmaWx0ZXIuYXNPYmplY3QoKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHN1cGVyLnNldEZpbHRlcihmaWx0ZXIgYXMgUHJvcGVydHlFbnRpdHlGaWx0ZXIsIG9wdHMpO1xuICB9XG5cbiAgZ2V0IGZpbHRlcklzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ3JpdGVyaWFDb3VudCA9PT0gMDtcbiAgfVxuXG4gIHRvZ2dsZUZpbHRlclBhbmVsRmxvYXRpbmcoKSB7XG4gICAgdGhpcy5maWx0ZXJQYW5lbEZsb2F0aW5nID0gIXRoaXMuZmlsdGVyUGFuZWxGbG9hdGluZztcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2xvc2VGaWx0ZXJQYW5lbCgpIHtcbiAgICBpZiAodGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbCkgdGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbC5jbG9zZSgpO1xuICAgIHRoaXMuZmlsdGVyUGFuZWxGbG9hdGluZyA9IHRydWU7XG4gIH1cblxuICBhcHBseUZpbHRlckFuZENsb3NlUGFuZWwoZXZlbnQ/OiBFdmVudCkge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZTtcbiAgICB0aGlzLnNldEZpbHRlcihmaWx0ZXIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmVtaXRSZWZyZXNoKCk7XG4gICAgaWYgKHRoaXMuZmlsdGVyUGFuZWxGbG9hdGluZykgdGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbD8uY2xvc2UoKTtcbiAgfVxuXG4gIHJlc2V0UHJvcGVydHkoZXZlbnQ6IFVJRXZlbnQsIHJvdzogVGFibGVFbGVtZW50PFByb3BlcnR5RW50aXR5Pikge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHJvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZSh7IHZhbHVlOiByb3cuY3VycmVudERhdGEuZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgfSk7XG4gICAgdGhpcy5jb25maXJtRWRpdENyZWF0ZSgpO1xuICAgIHRoaXMubWFya1Jvd0FzRGlydHkoKTtcbiAgfVxufVxuIiwiPG1hdC10b29sYmFyICpuZ0lmPVwic2hvd1Rvb2xiYXJcIiBbY2xhc3MuZXhwYW5kZWRdPVwiZmlsdGVyRXhwYW5zaW9uUGFuZWwuZXhwYW5kZWRcIj5cbiAgPCEtLSBSZWZyZXNoIC0tPlxuICA8YnV0dG9uXG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgKm5nSWY9XCIhbW9iaWxlXCJcbiAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX1JFRlJFU0gnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9SRUZSRVNIJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgKGNsaWNrKT1cImVtaXRSZWZyZXNoKClcIlxuICA+XG4gICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cblxuICA8aW9uLWl0ZW0gKm5nSWY9XCIhbW9iaWxlICYmIGVycm9yOyBsZXQgZXJyb3JcIiBsaW5lcz1cIm5vbmVcIj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgW2lubmVySFRNTF09XCJlcnJvciB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICA8L2lvbi1pdGVtPlxuXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvZGl2PlxuXG4gIDwhLS0gUmVzZXQgZmlsdGVyIC0tPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVzZXRGaWx0ZXIoKVwiICpuZ0lmPVwiZmlsdGVyQ3JpdGVyaWFDb3VudFwiPlxuICAgIDxtYXQtaWNvbiBjb2xvcj1cImFjY2VudFwiPmZpbHRlcl9saXN0X2FsdDwvbWF0LWljb24+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbi1zZWNvbmRhcnlcIiBzdHlsZT1cImxlZnQ6IDE2cHg7IHRvcDogNXB4OyBmb250LXdlaWdodDogYm9sZFwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBTaG93IGZpbHRlciAtLT5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImZpbHRlckV4cGFuc2lvblBhbmVsLnRvZ2dsZSgpXCI+XG4gICAgPG1hdC1pY29uXG4gICAgICBbbWF0QmFkZ2VdPVwiZmlsdGVyQ3JpdGVyaWFDb3VudFwiXG4gICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiZmlsdGVySXNFbXB0eVwiXG4gICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCJcbiAgICAgIG1hdEJhZGdlU2l6ZT1cInNtYWxsXCJcbiAgICAgIG1hdEJhZGdlUG9zaXRpb249XCJhYm92ZSBhZnRlclwiXG4gICAgICBhcmlhLWhpZGRlbj1cImZhbHNlXCJcbiAgICA+XG4gICAgICBmaWx0ZXJfbGlzdF9hbHRcbiAgICA8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbjwvbWF0LXRvb2xiYXI+XG5cbjxpb24tY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gIDwhLS0gc2VhcmNoIC0tPlxuICA8bWF0LWV4cGFuc2lvbi1wYW5lbFxuICAgICNmaWx0ZXJFeHBhbnNpb25QYW5lbFxuICAgIGNsYXNzPVwiZmlsdGVyLXBhbmVsXCJcbiAgICBbY2xhc3MuaW9uLW5vLXBhZGRpbmddPVwibW9iaWxlXCJcbiAgICBbY2xhc3MuZmlsdGVyLXBhbmVsLWZsb2F0aW5nXT1cImZpbHRlclBhbmVsRmxvYXRpbmdcIlxuICA+XG4gICAgPGZvcm0gY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiIChuZ1N1Ym1pdCk9XCJlbWl0UmVmcmVzaCgpXCI+XG4gICAgICA8aW9uLWdyaWQ+XG4gICAgICAgIDxpb24tcm93PlxuICAgICAgICAgIDxpb24tY29sPlxuICAgICAgICAgICAgPCEtLSBzZWFyY2ggLS0+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ1NFVFRJTkdTLkZJTFRFUi5TRUFSQ0gnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hUZXh0XCIgLz5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyQ29udHJvbFZhbHVlKCRldmVudCwgZmlsdGVyRm9ybS5jb250cm9scy5zZWFyY2hUZXh0KVwiXG4gICAgICAgICAgICAgICAgW2hpZGRlbl09XCJmaWx0ZXJGb3JtLmNvbnRyb2xzLnNlYXJjaFRleHQuZGlzYWJsZWQgfHwgIWZpbHRlckZvcm0uY29udHJvbHMuc2VhcmNoVGV4dC52YWx1ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICA8bWF0LWJvb2xlYW4tZmllbGRcbiAgICAgICAgICAgICAgW3N0eWxlXT1cIidjaGVja2JveCdcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJub3REZWZhdWx0T25seVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU0VUVElOR1MuRklMVEVSLk9OTFlfTk9UX0RFRkFVTFQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgZmxvYXRMYWJlbD1cImFsd2F5c1wiXG4gICAgICAgICAgICA+PC9tYXQtYm9vbGVhbi1maWVsZD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDwvaW9uLWdyaWQ+XG4gICAgPC9mb3JtPlxuXG4gICAgPG1hdC1hY3Rpb24tcm93PlxuICAgICAgPCEtLSBDb3VudGVyICAtLT5cbiAgICAgIDxpb24tbGFiZWxcbiAgICAgICAgW2hpZGRlbl09XCIobG9hZGluZ1N1YmplY3QgfCBhc3luYykgfHwgZmlsdGVyRm9ybS5kaXJ0eVwiXG4gICAgICAgIFtjb2xvcl09XCJlbXB0eSAmJiAnZGFuZ2VyJ1wiXG4gICAgICAgIGNsYXNzPVwiaW9uLXBhZGRpbmdcIlxuICAgICAgPlxuICAgICAgICB7e1xuICAgICAgICAgICh0b3RhbFJvd0NvdW50ID8gJ0NPTU1PTi5SRVNVTFRfQ09VTlQnIDogJ0NPTU1PTi5OT19SRVNVTFQnKVxuICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBjb3VudDogKHRvdGFsUm93Q291bnQgfCBudW1iZXJGb3JtYXQpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgIDwvaW9uLWxhYmVsPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1zcGFjZXJcIj48L2Rpdj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgY29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAqbmdJZj1cImZpbHRlclBhbmVsRmxvYXRpbmdcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlRmlsdGVyUGFuZWxGbG9hdGluZygpXCJcbiAgICAgICAgY2xhc3M9XCJoaWRkZW4teHMgaGlkZGVuLXNtIGhpZGRlbi1tZFwiXG4gICAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoKGZpbHRlclBhbmVsRmxvYXRpbmcgPyAnQ09NTU9OLkJUTl9FWFBBTkQnIDogJ0NPTU1PTi5CVE5fSElERScpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoKGZpbHRlclBhbmVsRmxvYXRpbmcgPyAnQ09NTU9OLkJUTl9FWFBBTkQnIDogJ0NPTU1PTi5CVE5fSElERScpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwidHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpXCI+e3sgZmlsdGVyUGFuZWxGbG9hdGluZyA/ICcmI3hiYjsnIDogJyYjeGFiOycgfX08L3NwYW4+XG4gICAgICAgIDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPCEtLSBDbG9zZSBwYW5lbCAtLT5cbiAgICAgIDxpb24tYnV0dG9uIG1hdC1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlRmlsdGVyUGFuZWwoKVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nU3ViamVjdCB8IGFzeW5jXCI+XG4gICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DTE9TRTwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgIDwhLS0gU2VhcmNoIGJ1dHRvbiAtLT5cbiAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgW2NvbG9yXT1cImZpbHRlckZvcm0uZGlydHkgPyAndGVydGlhcnknIDogJ2RhcmsnXCJcbiAgICAgICAgW2ZpbGxdPVwiZmlsdGVyRm9ybS5kaXJ0eSA/ICdzb2xpZCcgOiAnY2xlYXInXCJcbiAgICAgICAgKGNsaWNrKT1cImFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbCgkZXZlbnQpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdTdWJqZWN0IHwgYXN5bmNcIlxuICAgICAgPlxuICAgICAgICA8aW9uLXRleHQgdHJhbnNsYXRlPkNPTU1PTi5CVE5fQVBQTFk8L2lvbi10ZXh0PlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvbWF0LWFjdGlvbi1yb3c+XG4gIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cblxuICA8aW9uLXJlZnJlc2hlciBzbG90PVwiZml4ZWRcIiAqbmdJZj1cIm1vYmlsZVwiIChpb25SZWZyZXNoKT1cImRvUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgPGlvbi1yZWZyZXNoZXItY29udGVudD48L2lvbi1yZWZyZXNoZXItY29udGVudD5cbiAgPC9pb24tcmVmcmVzaGVyPlxuXG4gIDwhLS0gdGFibGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cbiAgICA8dGFibGVcbiAgICAgICN0YWJsZVxuICAgICAgbWF0LXRhYmxlXG4gICAgICBtYXRTb3J0XG4gICAgICBtYXRTb3J0RGlzYWJsZUNsZWFyXG4gICAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcbiAgICAgIFttYXRTb3J0QWN0aXZlXT1cImRlZmF1bHRTb3J0QnlcIlxuICAgICAgW21hdFNvcnREaXJlY3Rpb25dPVwiZGVmYXVsdFNvcnREaXJlY3Rpb25cIlxuICAgICAgW3RyYWNrQnldPVwidHJhY2tCeUZuXCJcbiAgICAgIFtzdHlsZS4tLW1hdC1yb3ctaGVpZ2h0XT1cIic1MnB4J1wiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJ0cnVlXCI+PC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cInRydWVcIj48L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gaWQgY29sdW1uIChoaWRkZW4pIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpZFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFkZWJ1Z1wiPjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhZGVidWdcIj5cbiAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEuaWQgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIGRlZmluaXRpb24gY29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZWZpbml0aW9uXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIGNsYXNzPVwiaW9uLXBhZGRpbmctc3RhcnRcIj5cbiAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnREVGSU5JVElPTicgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwiaW9uLXBhZGRpbmctc3RhcnRcIj5cbiAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEgfCBwcm9wZXJ0eUdldDogJ2RlZmluaXRpb24ubGFiZWwnIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSB2YWx1ZSBjb2x1bW4gLS0+XG4gICAgICA8YXBwLXJvdy1maWVsZFxuICAgICAgICBuYW1lPVwidmFsdWVcIlxuICAgICAgICBmbG9hdExhYmVsPVwibmV2ZXJcIlxuICAgICAgICBbZGVmaW5pdGlvbkZuXT1cImRlZmluaXRpb25CeVJvd1wiXG4gICAgICAgIFtoZWFkZXJJMThuXT1cImkxOG5Db2x1bW5QcmVmaXggKyAnVkFMVUUnXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgPjwvYXBwLXJvdy1maWVsZD5cblxuICAgICAgPCEtLSBBY3Rpb25zIGJ1dHRvbnMgY29sdW1uIC0tPlxuICAgICAgPGFwcC1hY3Rpb25zLWNvbHVtblxuICAgICAgICBbc3RpY2t5RW5kXT1cInRydWVcIlxuICAgICAgICBbY2FuQ2FuY2VsXT1cImZhbHNlXCJcbiAgICAgICAgW2NhbkRlbGV0ZV09XCJmYWxzZVwiXG4gICAgICAgIFtkaXJ0eUljb25dPVwiZmFsc2VcIlxuICAgICAgICBbY2VsbFRlbXBsYXRlXT1cImNlbGxJbmplY3Rpb25cIlxuICAgICAgPlxuICAgICAgICA8IS0tIGNlbGwgaW5qZWN0aW9uLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbEluamVjdGlvbiBsZXQtcm93PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAhbW9iaWxlICYmXG4gICAgICAgICAgICAgICFkaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAocm93LnZhbGlkYXRvciB8IGZvcm1HZXRWYWx1ZTogJ3ZhbHVlJykgIT09IChyb3cudmFsaWRhdG9yIHwgZm9ybUdldFZhbHVlOiAnZGVmaW5pdGlvbicpLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtjbGFzcy52aXNpYmxlLWhvdmVyLXJvd109XCIhbW9iaWxlXCJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdTRVRUSU5HUy5CVE5fUkVTRVRfUFJPUEVSVFknIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdTRVRUSU5HUy5CVE5fUkVTRVRfUFJPUEVSVFknIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZXNldFByb3BlcnR5KCRldmVudCwgcm93KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnVuZG88L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9hcHAtYWN0aW9ucy1jb2x1bW4+XG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgIDx0clxuICAgICAgICBtYXQtcm93XG4gICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCJcbiAgICAgICAgW2NsYXNzLm1hdC1yb3ctc2VsZWN0ZWRdPVwicm93LmVkaXRpbmdcIlxuICAgICAgICBbY2xhc3MubWF0LXJvdy1lcnJvcl09XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCJcbiAgICAgICAgW2NsYXNzLm1hdC1yb3ctZGlydHldPVwicm93LnZhbGlkYXRvcj8uZGlydHlcIlxuICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3coJGV2ZW50LCByb3cpXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImVzY2FwZUVkaXRpbmdSb3coJGV2ZW50KVwiXG4gICAgICAgIFtjZGtUcmFwRm9jdXNdPVwicm93LnZhbGlkYXRvcj8uaW52YWxpZFwiXG4gICAgICA+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdTdWJqZWN0IHwgYXN5bmM7IGVsc2Ugbm9SZXN1bHRcIj5cbiAgICAgIDxpb24taXRlbT5cbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub1Jlc3VsdD5cbiAgICAgIDxpb24taXRlbSAqbmdJZj1cInRvdGFsUm93Q291bnQgPT09IDBcIj5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJ0ZXh0LWl0YWxpY1wiIHRyYW5zbGF0ZT5DT01NT04uTk9fUkVTVUxUPC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2lvbi1jb250ZW50PlxuIl19
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy50YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEksT0FBTyxFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0YsT0FBTyxFQUFFLE1BQU0sRUFBeUIsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDL0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDcEYsT0FBTyxFQUF5RCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRyxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV0RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVB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QUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzt3R0E5S1Usa0JBQWtCLGdIQWdCbkIsV0FBVzs0RkFoQlYsa0JBQWtCLG1IQUpsQixDQUFDLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLGdGQU96RSxpQkFBaUIscUZDM0c5QixxclFBMk9BOzs0RkRuSWEsa0JBQWtCO2tCQVI5QixTQUFTOytCQUNFLHNCQUFzQixhQUdyQixDQUFDLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxDQUFDLG1CQUNuRSx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLEtBQUs7OzBCQWtCZCxNQUFNOzJCQUFDLFdBQVc7eUNBZlosV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUMwQyxvQkFBb0I7c0JBQW5FLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwSW5NZW1vcnlUYWJsZSB9IGZyb20gJy4uLy4uL3RhYmxlL21lbW9yeS10YWJsZS5jbGFzcyc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEaXJlY3RpdmUsIGluamVjdCwgSW5qZWN0LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSRVNFUlZFRF9FTkRfQ09MVU1OUywgUkVTRVJWRURfU1RBUlRfQ09MVU1OUyB9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL21lbW9yeS1lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBFbnRpdHksIEVudGl0eUFzT2JqZWN0T3B0aW9ucywgRW50aXR5VXRpbHMgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgQXBwVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRvci9iYXNlLnZhbGlkYXRvci5jbGFzcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1GaWVsZERlZmluaXRpb24sIEZvcm1GaWVsZERlZmluaXRpb25NYXAgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBpc05vdE5pbCwgc3BsaXRCeVByb3BlcnR5IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgVGFibGVFbGVtZW50IH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7IEVudGl0eUNsYXNzIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvZW50aXR5LmRlY29yYXRvcnMnO1xuaW1wb3J0IHsgRW50aXR5RmlsdGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7IEZpbHRlckZuLCBQcm9wZXJ0eSB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQXBwRm9ybVV0aWxzIH0gZnJvbSAnLi4vZm9ybS51dGlscyc7XG5pbXBvcnQgeyBNYXRFeHBhbnNpb25QYW5lbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XG5cbmltcG9ydCB7IEFQUF9TSE9XX1RPT0xUSVAgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcblxuQEVudGl0eUNsYXNzKHsgdHlwZW5hbWU6ICdQcm9wZXJ0eUVudGl0eScgfSlcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUVudGl0eSBleHRlbmRzIEVudGl0eTxQcm9wZXJ0eUVudGl0eSwgc3RyaW5nPiBpbXBsZW1lbnRzIFByb3BlcnR5IHtcbiAgc3RhdGljIGZyb21PYmplY3Q6IChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkgPT4gUHJvcGVydHlFbnRpdHk7XG5cbiAgZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbiA9IG51bGw7XG4gIHZhbHVlOiBhbnkgPSBudWxsO1xuXG4gIGdldCBrZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uPy5rZXkgfHwgdGhpcy5pZDtcbiAgfVxuXG4gIGZyb21PYmplY3Qoc291cmNlOiBhbnkpIHtcbiAgICBzdXBlci5mcm9tT2JqZWN0KHNvdXJjZSk7XG4gICAgdGhpcy5pZCA9IHNvdXJjZS5kZWZpbml0aW9uPy5rZXkgPz8gc291cmNlLmtleSA/PyBzb3VyY2UuaWQ7XG4gICAgdGhpcy5kZWZpbml0aW9uID0gc291cmNlLmRlZmluaXRpb247XG4gICAgdGhpcy52YWx1ZSA9IHNvdXJjZS52YWx1ZTtcbiAgfVxuXG4gIGFzT2JqZWN0KG9wdHM/OiBFbnRpdHlBc09iamVjdE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHRhcmdldCA9IHN1cGVyLmFzT2JqZWN0KG9wdHMpO1xuICAgIHRhcmdldC5pZCA9IHRoaXMuZGVmaW5pdGlvbi5rZXk7XG4gICAgZGVsZXRlIHRhcmdldC5kZWZpbml0aW9uO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RW50aXR5RmlsdGVyIGV4dGVuZHMgRW50aXR5RmlsdGVyPFByb3BlcnR5RW50aXR5RmlsdGVyLCBQcm9wZXJ0eUVudGl0eT4ge1xuICBzdGF0aWMgZnJvbU9iamVjdDogKHNvdXJjZSwgb3B0cz86IGFueSkgPT4gUHJvcGVydHlFbnRpdHlGaWx0ZXI7XG5cbiAgc2VhcmNoVGV4dDogc3RyaW5nO1xuICBub3REZWZhdWx0T25seSA9IGZhbHNlO1xuXG4gIGZyb21PYmplY3Qoc291cmNlOiBhbnkpIHtcbiAgICBzdXBlci5mcm9tT2JqZWN0KHNvdXJjZSk7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gc291cmNlLnNlYXJjaFRleHQ7XG4gICAgdGhpcy5ub3REZWZhdWx0T25seSA9IHNvdXJjZS5ub3REZWZhdWx0T25seTtcbiAgfVxuXG4gIGFzT2JqZWN0KG9wdHM/OiBFbnRpdHlBc09iamVjdE9wdGlvbnMpOiBhbnkge1xuICAgIHJldHVybiBzdXBlci5hc09iamVjdChvcHRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZEZpbHRlcigpOiBGaWx0ZXJGbjxQcm9wZXJ0eUVudGl0eT5bXSB7XG4gICAgY29uc3QgZmlsdGVyRm5zID0gc3VwZXIuYnVpbGRGaWx0ZXIoKTtcblxuICAgIGNvbnN0IHNlYXJjaFRleHRGaWx0ZXIgPSBFbnRpdHlVdGlscy5zZWFyY2hUZXh0RmlsdGVyKCdkZWZpbml0aW9uLnRyYW5zbGF0ZWROYW1lJywgdGhpcy5zZWFyY2hUZXh0KTtcbiAgICBpZiAoc2VhcmNoVGV4dEZpbHRlcikgZmlsdGVyRm5zLnB1c2goc2VhcmNoVGV4dEZpbHRlcik7XG5cbiAgICBpZiAodGhpcy5ub3REZWZhdWx0T25seSkge1xuICAgICAgZmlsdGVyRm5zLnB1c2goKGRhdGEpID0+IGlzTm90TmlsKGRhdGEudmFsdWUpICYmIGRhdGEuZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgIT09IGRhdGEudmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJGbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNDcml0ZXJpYU5vdEVtcHR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGtleSA9PT0gJ25vdERlZmF1bHRPbmx5JykgcmV0dXJuIHZhbHVlID09PSB0cnVlO1xuICAgIHJldHVybiBzdXBlci5pc0NyaXRlcmlhTm90RW1wdHkoa2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFbnRpdHlWYWxpZGF0b3IgZXh0ZW5kcyBBcHBWYWxpZGF0b3JTZXJ2aWNlPFByb3BlcnR5RW50aXR5PiB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyKSB7XG4gICAgc3VwZXIoZm9ybUJ1aWxkZXIsIG51bGwpO1xuICB9XG5cbiAgZ2V0Rm9ybUdyb3VwQ29uZmlnKGRhdGE/OiBQcm9wZXJ0eUVudGl0eSk6IHsgW3A6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IFtkYXRhPy5pZCA/PyBudWxsXSxcbiAgICAgIGRlZmluaXRpb246IFtkYXRhPy5kZWZpbml0aW9uIHx8IG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmFsdWU6IFtkYXRhPy52YWx1ZSA/PyBudWxsXSxcbiAgICB9O1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9wZXJ0aWVzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICdwcm9wZXJ0aWVzLnRhYmxlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsncHJvcGVydGllcy50YWJsZS5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogUHJvcGVydHlFbnRpdHlWYWxpZGF0b3IsIHVzZUNsYXNzOiBQcm9wZXJ0eUVudGl0eVZhbGlkYXRvciB9XSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBQcm9wZXJ0aWVzVGFibGUgZXh0ZW5kcyBBcHBJbk1lbW9yeVRhYmxlPFByb3BlcnR5RW50aXR5LCBQcm9wZXJ0eUVudGl0eUZpbHRlciwgc3RyaW5nPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGRlZmluaXRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIEBJbnB1dCgpIHNob3dUb29sYmFyID0gdHJ1ZTtcbiAgQFZpZXdDaGlsZChNYXRFeHBhbnNpb25QYW5lbCwgeyBzdGF0aWM6IHRydWUgfSkgZmlsdGVyRXhwYW5zaW9uUGFuZWw6IE1hdEV4cGFuc2lvblBhbmVsO1xuXG4gIGRlZmluaXRpb25zTWFwQnlLZXk6IEZvcm1GaWVsZERlZmluaXRpb25NYXAgPSB7fTtcbiAgZmlsdGVyRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgZmlsdGVyQ3JpdGVyaWFDb3VudCA9IDA7XG4gIGZpbHRlclBhbmVsRmxvYXRpbmcgPSB0cnVlO1xuXG4gIHNob3dUb29sdGlwID0gaW5qZWN0KEFQUF9TSE9XX1RPT0xUSVAsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yU2VydmljZTogUHJvcGVydHlFbnRpdHlWYWxpZGF0b3IsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBbLi4uUkVTRVJWRURfU1RBUlRfQ09MVU1OUywgJ2RlZmluaXRpb24nLCAndmFsdWUnLCAuLi5SRVNFUlZFRF9FTkRfQ09MVU1OU10sXG4gICAgICBQcm9wZXJ0eUVudGl0eSxcbiAgICAgIG5ldyBJbk1lbW9yeUVudGl0aWVzU2VydmljZShQcm9wZXJ0eUVudGl0eSwgUHJvcGVydHlFbnRpdHlGaWx0ZXIsIHtcbiAgICAgICAgc29ydEJ5UmVwbGFjZW1lbnQ6IHsgZGVmaW5pdGlvbjogJ2RlZmluaXRpb24ubGFiZWwnIH0sXG4gICAgICB9KSxcbiAgICAgIHZhbGlkYXRvclNlcnZpY2VcbiAgICApO1xuXG4gICAgdGhpcy5pbmxpbmVFZGl0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmRlZmF1bHRTb3J0QnkgPSAnZGVmaW5pdGlvbic7XG4gICAgdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIHRoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQ/LnByb2R1Y3Rpb247XG5cbiAgICB0aGlzLmZpbHRlckZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBzZWFyY2hUZXh0OiBbXSxcbiAgICAgIG5vdERlZmF1bHRPbmx5OiBbbnVsbF0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmF1dG9Mb2FkID0gZmFsc2U7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgLy8gRmlsbCBkZWZpbml0aW9ucyBtYXBcbiAgICB0aGlzLmRlZmluaXRpb25zID0gKHRoaXMuZGVmaW5pdGlvbnMgfHwgW10pLm1hcCgoZGVmKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGRlZi5sYWJlbCksXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuZGVmaW5pdGlvbnNNYXBCeUtleSA9IHNwbGl0QnlQcm9wZXJ0eSh0aGlzLmRlZmluaXRpb25zLCAna2V5Jyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyQ2VsbFZhbHVlQ2hhbmdlcygnZGVmaW5pdGlvbicpLnN1YnNjcmliZSgoZGVmaW5pdGlvbikgPT4ge1xuICAgICAgaWYgKGlzTm90TmlsKGRlZmluaXRpb24pICYmIHRoaXMuZWRpdGVkUm93Py5pZCA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5lZGl0ZWRSb3cudmFsaWRhdG9yLnBhdGNoVmFsdWUoeyBpZDogZGVmaW5pdGlvbi5rZXksIHZhbHVlOiBkZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJDZWxsVmFsdWVDaGFuZ2VzKCd2YWx1ZScpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5maWx0ZXJGb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMjUwKSxcbiAgICAgICAgICBmaWx0ZXIoKF8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gdGhpcy5maWx0ZXJGb3JtLnZhbGlkO1xuICAgICAgICAgICAgaWYgKCF2YWxpZCAmJiB0aGlzLmRlYnVnKSBBcHBGb3JtVXRpbHMubG9nRm9ybUVycm9ycyh0aGlzLmZpbHRlckZvcm0pO1xuICAgICAgICAgICAgcmV0dXJuIHZhbGlkO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZmlsdGVyXG4gICAgICAgICAgdGFwKChqc29uKSA9PiB0aGlzLnNldEZpbHRlcihqc29uKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuXG4gICAgdGhpcy5yZXNldEZpbHRlcigpO1xuXG4gICAgdGhpcy5tYXJrQXNSZWFkeSgpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFByb3BlcnR5RW50aXR5W10ge1xuICAgIGxldCB2YWx1ZXMgPSBzdXBlci52YWx1ZSB8fCBbXTtcblxuICAgIC8vIHJlbW92ZSB1bnNldCBvcHRpb25zXG4gICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcigocHJvcGVydHkpID0+IGlzTm90TmlsKHByb3BlcnR5LnZhbHVlICE9PSBwcm9wZXJ0eS5kZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSkpO1xuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHNldCB2YWx1ZShkYXRhOiBQcm9wZXJ0eUVudGl0eVtdKSB7XG4gICAgc3VwZXIudmFsdWUgPSBkYXRhO1xuICB9XG5cbiAgZGVmaW5pdGlvbkJ5Um93ID0gKHJvdzogVGFibGVFbGVtZW50PFByb3BlcnR5RW50aXR5Pik6IEZvcm1GaWVsZERlZmluaXRpb24gPT4gdGhpcy5kZWZpbml0aW9uc01hcEJ5S2V5W3Jvdy5jdXJyZW50RGF0YS5pZF07XG5cbiAgc2V0VmFsdWUodmFsdWU6IFByb3BlcnR5RW50aXR5W10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIC8vIEJ1aWxkIGVudGl0aWVzXG4gICAgY29uc3QgdGFyZ2V0OiBQcm9wZXJ0eUVudGl0eVtdID0gdGhpcy5kZWZpbml0aW9ucy5tYXAoKGRlZmluaXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gKHZhbHVlIHx8IFtdKT8uZmluZCgoc291cmNlKSA9PiBzb3VyY2Uua2V5ID09PSBkZWZpbml0aW9uLmtleSk7XG4gICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHk/LnZhbHVlID8/IGRlZmluaXRpb24uZGVmYXVsdFZhbHVlO1xuICAgICAgLy8gQ29udmVydCB0byBlbnRpdHlcbiAgICAgIHJldHVybiBQcm9wZXJ0eUVudGl0eS5mcm9tT2JqZWN0KHtcbiAgICAgICAgaWQ6IGRlZmluaXRpb24ua2V5LFxuICAgICAgICBkZWZpbml0aW9uLFxuICAgICAgICAvLyBnZXQgdXNlciB2YWx1ZSBvciBkZWZhdWx0IHZhbHVlXG4gICAgICAgIHZhbHVlOiBwcm9wZXJ0eVZhbHVlLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzdXBlci5zZXRWYWx1ZSh0YXJnZXQsIG9wdHMpO1xuICB9XG5cbiAgY2xlYXJDb250cm9sVmFsdWUoZXZlbnQ6IEV2ZW50LCBmb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sKTogYm9vbGVhbiB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gQXZvaWQgdG8gZW50ZXIgaW5wdXQgdGhlIGZpZWxkXG4gICAgZm9ybUNvbnRyb2wuc2V0VmFsdWUobnVsbCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIodmFsdWU/OiBhbnksIG9wdHM/OiB7IGVtaXRFdmVudDogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgZiA9IDxQcm9wZXJ0eUVudGl0eUZpbHRlcj57IHNlYXJjaFRleHQ6IG51bGwsIG5vdERlZmF1bHRPbmx5OiBmYWxzZSwgLi4udmFsdWUgfTtcbiAgICB0aGlzLmZpbHRlckZvcm0ucmVzZXQoZiwgb3B0cyk7XG4gICAgdGhpcy5zZXRGaWx0ZXIoZiB8fCBudWxsLCBvcHRzKTtcbiAgICB0aGlzLmZpbHRlckNyaXRlcmlhQ291bnQgPSAwO1xuICAgIGlmICh0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsICYmIHRoaXMuZmlsdGVyUGFuZWxGbG9hdGluZykgdGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbC5jbG9zZSgpO1xuICAgIHRoaXMucmVzZXRFcnJvcigpO1xuICB9XG5cbiAgc2V0RmlsdGVyKGZpbHRlcjogUHJvcGVydHlFbnRpdHlGaWx0ZXIsIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGZpbHRlciA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhU2VydmljZS5hc0ZpbHRlcihmaWx0ZXIpO1xuXG4gICAgLy8gVXBkYXRlIGNyaXRlcmlhIGNvdW50XG4gICAgY29uc3QgY3JpdGVyaWFDb3VudCA9IGZpbHRlci5jb3VudE5vdEVtcHR5Q3JpdGVyaWEoKTtcbiAgICBpZiAoY3JpdGVyaWFDb3VudCAhPT0gdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50KSB7XG4gICAgICB0aGlzLmZpbHRlckNyaXRlcmlhQ291bnQgPSBjcml0ZXJpYUNvdW50O1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGZvcm0gY29udGVudFxuICAgIGlmICh0aGlzLmZpbHRlckZvcm0gJiYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkpIHtcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKGZpbHRlci5hc09iamVjdCgpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgc3VwZXIuc2V0RmlsdGVyKGZpbHRlciBhcyBQcm9wZXJ0eUVudGl0eUZpbHRlciwgb3B0cyk7XG4gIH1cblxuICBnZXQgZmlsdGVySXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID09PSAwO1xuICB9XG5cbiAgdG9nZ2xlRmlsdGVyUGFuZWxGbG9hdGluZygpIHtcbiAgICB0aGlzLmZpbHRlclBhbmVsRmxvYXRpbmcgPSAhdGhpcy5maWx0ZXJQYW5lbEZsb2F0aW5nO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjbG9zZUZpbHRlclBhbmVsKCkge1xuICAgIGlmICh0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsKSB0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsLmNsb3NlKCk7XG4gICAgdGhpcy5maWx0ZXJQYW5lbEZsb2F0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbChldmVudD86IEV2ZW50KSB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlO1xuICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIHRoaXMuZW1pdFJlZnJlc2goKTtcbiAgICBpZiAodGhpcy5maWx0ZXJQYW5lbEZsb2F0aW5nKSB0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsPy5jbG9zZSgpO1xuICB9XG5cbiAgcmVzZXRQcm9wZXJ0eShldmVudDogVUlFdmVudCwgcm93OiBUYWJsZUVsZW1lbnQ8UHJvcGVydHlFbnRpdHk+KSB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgcm93LnZhbGlkYXRvci5wYXRjaFZhbHVlKHsgdmFsdWU6IHJvdy5jdXJyZW50RGF0YS5kZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSB9KTtcbiAgICB0aGlzLmNvbmZpcm1FZGl0Q3JlYXRlKCk7XG4gICAgdGhpcy5tYXJrUm93QXNEaXJ0eSgpO1xuICB9XG59XG4iLCI8bWF0LXRvb2xiYXIgKm5nSWY9XCJzaG93VG9vbGJhclwiIFtjbGFzcy5leHBhbmRlZF09XCJmaWx0ZXJFeHBhbnNpb25QYW5lbC5leHBhbmRlZFwiPlxuICA8IS0tIFJlZnJlc2ggLS0+XG4gIDxidXR0b25cbiAgICBtYXQtaWNvbi1idXR0b25cbiAgICAqbmdJZj1cIiFtb2JpbGVcIlxuICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fUkVGUkVTSCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdDT01NT04uQlROX1JFRlJFU0gnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAoY2xpY2spPVwiZW1pdFJlZnJlc2goKVwiXG4gID5cbiAgICA8bWF0LWljb24+cmVmcmVzaDwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuXG4gIDxpb24taXRlbSAqbmdJZj1cIiFtb2JpbGUgJiYgZXJyb3I7IGxldCBlcnJvclwiIGxpbmVzPVwibm9uZVwiPlxuICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBbaW5uZXJIVE1MXT1cImVycm9yIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPGRpdiBjbGFzcz1cInRvb2xiYXItc3BhY2VyXCI+PC9kaXY+XG5cbiAgPCEtLSBSZXNldCBmaWx0ZXIgLS0+XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZXNldEZpbHRlcigpXCIgKm5nSWY9XCJmaWx0ZXJDcml0ZXJpYUNvdW50XCI+XG4gICAgPG1hdC1pY29uIGNvbG9yPVwiYWNjZW50XCI+ZmlsdGVyX2xpc3RfYWx0PC9tYXQtaWNvbj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLXNlY29uZGFyeVwiIHN0eWxlPVwibGVmdDogMTZweDsgdG9wOiA1cHg7IGZvbnQtd2VpZ2h0OiBib2xkXCI+Y2xvc2U8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIFNob3cgZmlsdGVyIC0tPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZmlsdGVyRXhwYW5zaW9uUGFuZWwudG9nZ2xlKClcIj5cbiAgICA8bWF0LWljb25cbiAgICAgIFttYXRCYWRnZV09XCJmaWx0ZXJDcml0ZXJpYUNvdW50XCJcbiAgICAgIFttYXRCYWRnZUhpZGRlbl09XCJmaWx0ZXJJc0VtcHR5XCJcbiAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgbWF0QmFkZ2VTaXplPVwic21hbGxcIlxuICAgICAgbWF0QmFkZ2VQb3NpdGlvbj1cImFib3ZlIGFmdGVyXCJcbiAgICAgIGFyaWEtaGlkZGVuPVwiZmFsc2VcIlxuICAgID5cbiAgICAgIGZpbHRlcl9saXN0X2FsdFxuICAgIDwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuPC9tYXQtdG9vbGJhcj5cblxuPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgPCEtLSBzZWFyY2ggLS0+XG4gIDxtYXQtZXhwYW5zaW9uLXBhbmVsXG4gICAgI2ZpbHRlckV4cGFuc2lvblBhbmVsXG4gICAgY2xhc3M9XCJmaWx0ZXItcGFuZWxcIlxuICAgIFtjbGFzcy5pb24tbm8tcGFkZGluZ109XCJtb2JpbGVcIlxuICAgIFtjbGFzcy5maWx0ZXItcGFuZWwtZmxvYXRpbmddPVwiZmlsdGVyUGFuZWxGbG9hdGluZ1wiXG4gID5cbiAgICA8Zm9ybSBjbGFzcz1cImZvcm0tY29udGFpbmVyXCIgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgKG5nU3VibWl0KT1cImVtaXRSZWZyZXNoKClcIj5cbiAgICAgIDxpb24tZ3JpZD5cbiAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICA8IS0tIHNlYXJjaCAtLT5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyAnU0VUVElOR1MuRklMVEVSLlNFQVJDSCcgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInNlYXJjaFRleHRcIiAvPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJDb250cm9sVmFsdWUoJGV2ZW50LCBmaWx0ZXJGb3JtLmNvbnRyb2xzLnNlYXJjaFRleHQpXCJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImZpbHRlckZvcm0uY29udHJvbHMuc2VhcmNoVGV4dC5kaXNhYmxlZCB8fCAhZmlsdGVyRm9ybS5jb250cm9scy5zZWFyY2hUZXh0LnZhbHVlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICAgIDxtYXQtYm9vbGVhbi1maWVsZFxuICAgICAgICAgICAgICBbc3R5bGVdPVwiJ2NoZWNrYm94J1wiXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5vdERlZmF1bHRPbmx5XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTRVRUSU5HUy5GSUxURVIuT05MWV9OT1RfREVGQVVMVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBmbG9hdExhYmVsPVwiYWx3YXlzXCJcbiAgICAgICAgICAgID48L21hdC1ib29sZWFuLWZpZWxkPlxuICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgPC9pb24tcm93PlxuICAgICAgPC9pb24tZ3JpZD5cbiAgICA8L2Zvcm0+XG5cbiAgICA8bWF0LWFjdGlvbi1yb3c+XG4gICAgICA8IS0tIENvdW50ZXIgIC0tPlxuICAgICAgPGlvbi1sYWJlbFxuICAgICAgICBbaGlkZGVuXT1cIihsb2FkaW5nU3ViamVjdCB8IGFzeW5jKSB8fCBmaWx0ZXJGb3JtLmRpcnR5XCJcbiAgICAgICAgW2NvbG9yXT1cImVtcHR5ICYmICdkYW5nZXInXCJcbiAgICAgICAgY2xhc3M9XCJpb24tcGFkZGluZ1wiXG4gICAgICA+XG4gICAgICAgIHt7XG4gICAgICAgICAgKHRvdGFsUm93Q291bnQgPyAnQ09NTU9OLlJFU1VMVF9DT1VOVCcgOiAnQ09NTU9OLk5PX1JFU1VMVCcpXG4gICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIGNvdW50OiAodG90YWxSb3dDb3VudCB8IG51bWJlckZvcm1hdCksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgPC9pb24tbGFiZWw+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvZGl2PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBjb2xvcj1cImFjY2VudFwiXG4gICAgICAgICpuZ0lmPVwiZmlsdGVyUGFuZWxGbG9hdGluZ1wiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVGaWx0ZXJQYW5lbEZsb2F0aW5nKClcIlxuICAgICAgICBjbGFzcz1cImhpZGRlbi14cyBoaWRkZW4tc20gaGlkZGVuLW1kXCJcbiAgICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgoZmlsdGVyUGFuZWxGbG9hdGluZyA/ICdDT01NT04uQlROX0VYUEFORCcgOiAnQ09NTU9OLkJUTl9ISURFJykgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgoZmlsdGVyUGFuZWxGbG9hdGluZyA/ICdDT01NT04uQlROX0VYUEFORCcgOiAnQ09NTU9OLkJUTl9ISURFJykgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZylcIj57eyBmaWx0ZXJQYW5lbEZsb2F0aW5nID8gJyYjeGJiOycgOiAnJiN4YWI7JyB9fTwvc3Bhbj5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8IS0tIENsb3NlIHBhbmVsIC0tPlxuICAgICAgPGlvbi1idXR0b24gbWF0LWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiY2xvc2VGaWx0ZXJQYW5lbCgpXCIgW2Rpc2FibGVkXT1cImxvYWRpbmdTdWJqZWN0IHwgYXN5bmNcIj5cbiAgICAgICAgPGlvbi10ZXh0IHRyYW5zbGF0ZT5DT01NT04uQlROX0NMT1NFPC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgPCEtLSBTZWFyY2ggYnV0dG9uIC0tPlxuICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICBbY29sb3JdPVwiZmlsdGVyRm9ybS5kaXJ0eSA/ICd0ZXJ0aWFyeScgOiAnZGFyaydcIlxuICAgICAgICBbZmlsbF09XCJmaWx0ZXJGb3JtLmRpcnR5ID8gJ3NvbGlkJyA6ICdjbGVhcidcIlxuICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXJBbmRDbG9zZVBhbmVsKCRldmVudClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1N1YmplY3QgfCBhc3luY1wiXG4gICAgICA+XG4gICAgICAgIDxpb24tdGV4dCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9BUFBMWTwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9tYXQtYWN0aW9uLXJvdz5cbiAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXG4gIDxpb24tcmVmcmVzaGVyIHNsb3Q9XCJmaXhlZFwiICpuZ0lmPVwibW9iaWxlXCIgKGlvblJlZnJlc2gpPVwiZG9SZWZyZXNoKCRldmVudClcIj5cbiAgICA8aW9uLXJlZnJlc2hlci1jb250ZW50PjwvaW9uLXJlZnJlc2hlci1jb250ZW50PlxuICA8L2lvbi1yZWZyZXNoZXI+XG5cbiAgPCEtLSB0YWJsZSAtLT5cbiAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxuICAgIDx0YWJsZVxuICAgICAgI3RhYmxlXG4gICAgICBtYXQtdGFibGVcbiAgICAgIG1hdFNvcnRcbiAgICAgIG1hdFNvcnREaXNhYmxlQ2xlYXJcbiAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgW21hdFNvcnRBY3RpdmVdPVwiZGVmYXVsdFNvcnRCeVwiXG4gICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJkZWZhdWx0U29ydERpcmVjdGlvblwiXG4gICAgICBbdHJhY2tCeV09XCJ0cmFja0J5Rm5cIlxuICAgICAgW3N0eWxlLi0tbWF0LXJvdy1oZWlnaHRdPVwiJzUycHgnXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cInRydWVcIj48L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwidHJ1ZVwiPjwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBpZCBjb2x1bW4gKGhpZGRlbikgLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImlkXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIWRlYnVnXCI+PC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFkZWJ1Z1wiPlxuICAgICAgICAgIHt7IHJvdy5jdXJyZW50RGF0YS5pZCB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gZGVmaW5pdGlvbiBjb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlZmluaXRpb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgY2xhc3M9XCJpb24tcGFkZGluZy1zdGFydFwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdERUZJTklUSU9OJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJpb24tcGFkZGluZy1zdGFydFwiPlxuICAgICAgICAgIHt7IHJvdy5jdXJyZW50RGF0YSB8IHByb3BlcnR5R2V0OiAnZGVmaW5pdGlvbi5sYWJlbCcgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIHZhbHVlIGNvbHVtbiAtLT5cbiAgICAgIDxhcHAtcm93LWZpZWxkXG4gICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgIGZsb2F0TGFiZWw9XCJuZXZlclwiXG4gICAgICAgIFtkZWZpbml0aW9uRm5dPVwiZGVmaW5pdGlvbkJ5Um93XCJcbiAgICAgICAgW2hlYWRlckkxOG5dPVwiaTE4bkNvbHVtblByZWZpeCArICdWQUxVRSdcIlxuICAgICAgPjwvYXBwLXJvdy1maWVsZD5cblxuICAgICAgPCEtLSBBY3Rpb25zIGJ1dHRvbnMgY29sdW1uIC0tPlxuICAgICAgPGFwcC1hY3Rpb25zLWNvbHVtblxuICAgICAgICBbc3RpY2t5RW5kXT1cInRydWVcIlxuICAgICAgICBbY2FuQ2FuY2VsXT1cImZhbHNlXCJcbiAgICAgICAgW2NhbkRlbGV0ZV09XCJmYWxzZVwiXG4gICAgICAgIFtkaXJ0eUljb25dPVwiZmFsc2VcIlxuICAgICAgICBbY2VsbFRlbXBsYXRlXT1cImNlbGxJbmplY3Rpb25cIlxuICAgICAgPlxuICAgICAgICA8IS0tIGNlbGwgaW5qZWN0aW9uLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbEluamVjdGlvbiBsZXQtcm93PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAhbW9iaWxlICYmXG4gICAgICAgICAgICAgICFkaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAocm93LnZhbGlkYXRvciB8IGZvcm1HZXRWYWx1ZTogJ3ZhbHVlJykgIT09IChyb3cudmFsaWRhdG9yIHwgZm9ybUdldFZhbHVlOiAnZGVmaW5pdGlvbicpLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtjbGFzcy52aXNpYmxlLWhvdmVyLXJvd109XCIhbW9iaWxlXCJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdTRVRUSU5HUy5CVE5fUkVTRVRfUFJPUEVSVFknIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdTRVRUSU5HUy5CVE5fUkVTRVRfUFJPUEVSVFknIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZXNldFByb3BlcnR5KCRldmVudCwgcm93KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnVuZG88L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9hcHAtYWN0aW9ucy1jb2x1bW4+XG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgIDx0clxuICAgICAgICBtYXQtcm93XG4gICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCJcbiAgICAgICAgW2NsYXNzLm1hdC1yb3ctc2VsZWN0ZWRdPVwicm93LmVkaXRpbmdcIlxuICAgICAgICBbY2xhc3MubWF0LXJvdy1lcnJvcl09XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCJcbiAgICAgICAgW2NsYXNzLm1hdC1yb3ctZGlydHldPVwicm93LnZhbGlkYXRvcj8uZGlydHlcIlxuICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3coJGV2ZW50LCByb3cpXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImVzY2FwZUVkaXRpbmdSb3coJGV2ZW50KVwiXG4gICAgICAgIFtjZGtUcmFwRm9jdXNdPVwicm93LnZhbGlkYXRvcj8uaW52YWxpZFwiXG4gICAgICA+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdTdWJqZWN0IHwgYXN5bmM7IGVsc2Ugbm9SZXN1bHRcIj5cbiAgICAgIDxpb24taXRlbT5cbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub1Jlc3VsdD5cbiAgICAgIDxpb24taXRlbSAqbmdJZj1cInRvdGFsUm93Q291bnQgPT09IDBcIj5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJ0ZXh0LWl0YWxpY1wiIHRyYW5zbGF0ZT5DT01NT04uTk9fUkVTVUxUPC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2lvbi1jb250ZW50PlxuIl19
@@ -178,7 +178,7 @@ export class RegisterForm {
178
178
  this.form.enable();
179
179
  }
180
180
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterForm, deps: [{ token: i1.AccountService }, { token: i2.AccountValidatorService }, { token: i3.UntypedFormBuilder }, { token: ENVIRONMENT }, { token: i4.LocalSettingsService }], target: i0.ɵɵFactoryTarget.Component });
181
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RegisterForm, selector: "app-register-form", outputs: { onCancel: "onCancel", onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "stepper", first: true, predicate: ["stepper"], descendants: true, static: true }], ngImport: i0, template: "<mat-horizontal-stepper linear #stepper=\"matHorizontalStepper\">\n <!-- Step 1: Username -->\n <mat-step [stepControl]=\"forms[0]\" *ngIf=\"forms[0].controls; let controls\">\n <form [formGroup]=\"forms[0]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n <ng-template matStepLabel>{{ 'REGISTER.STEP_EMAIL' | translate }}</ng-template>\n\n <!-- Email -->\n <mat-form-field>\n <mat-label>{{ 'USER.EMAIL' | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"email\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"controls.email.hasError('required') && controls.email.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error\n *ngIf=\"controls.email.hasError('email') && !controls.email.hasError('required') && controls.email.touched\"\n >\n <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n <mat-error *ngIf=\"controls.email.hasError('availability') && controls.email.touched\" translate>\n REGISTER.ERROR.EMAIL_ALREADY_REGISTERED\n </mat-error>\n </mat-form-field>\n\n <!-- Confirm Email -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.CONFIRM_EMAIL' | translate }}</mat-label>\n <input matInput autocomplete=\"off\" matFormFieldControl formControlName=\"confirmEmail\"/>\n <mat-error *ngIf=\"controls.confirmEmail.hasError('required') && controls.confirmEmail.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.confirmEmail.hasError('equals') && controls.confirmEmail.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\n </form>\n </mat-step>\n\n <!-- Step 2: Password -->\n <mat-step [stepControl]=\"forms[1]\" *ngIf=\"forms[1].controls; let controls\">\n <form [formGroup]=\"forms[1]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n <ng-template matStepLabel>{{ 'REGISTER.STEP_PASSWORD' | translate }}</ng-template>\n\n <!-- Password -->\n <mat-form-field>\n <mat-label>{{ 'USER.PASSWORD' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"password\"\n autocomplete=\"section-red new-password\"\n [type]=\"showPwd ? 'text' : 'password'\"\n required\n />\n <button matSuffix mat-icon-button type=\"button\" (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"controls.password.hasError('required') && controls.password.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.password.hasError('minlength') && controls.password.touched\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 8} }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- Confirm password -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.CONFIRM_PASSWORD' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"confirmPassword\"\n autocomplete=\"section-red new-password\"\n [type]=\"showConfirmPwd ? 'text' : 'password'\"\n required\n />\n <button mat-icon-button matSuffix (click)=\"showConfirmPwd = !showConfirmPwd\" tabindex=\"-1\">\n <mat-icon>{{ showConfirmPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"controls.confirmPassword.hasError('required') && controls.confirmPassword.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.confirmPassword.hasError('equals') && controls.confirmPassword.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_PASSWORD' | translate }}</span>\n </mat-error>\n </mat-form-field>\n </form>\n </mat-step>\n\n <!-- Step 3: user details -->\n <mat-step [stepControl]=\"forms[2]\" *ngIf=\"forms[2].controls; let controls\">\n <form\n [formGroup]=\"forms[2]\"\n (ngSubmit)=\"doSubmit($event)\"\n class=\"form-container ion-padding\"\n (keyup.enter)=\"doSubmit()\"\n >\n <ng-template matStepLabel>{{ 'REGISTER.STEP_USER_DETAILS' | translate }}</ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error && !sending\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <!-- Last name -->\n <mat-form-field>\n <mat-label>{{ 'USER.LAST_NAME' | translate }}</mat-label>\n <input matInput formControlName=\"lastName\" autocomplete=\"section-blue family-name\" required/>\n <mat-error *ngIf=\"controls.lastName.hasError('required') && controls.lastName.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.lastName.hasError('minlength') && controls.lastName.dirty\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- First name -->\n <mat-form-field>\n <mat-label>{{ 'USER.FIRST_NAME' | translate }}</mat-label>\n <input matInput formControlName=\"firstName\" autocomplete=\"section-blue given-name\" required/>\n <mat-error *ngIf=\"controls.firstName.hasError('required') && controls.firstName.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.firstName.hasError('minlength') && controls.firstName.dirty\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- Additional fields -->\n @for (field of additionalFields; track field.key) {\n @if (field.extra.registration?.description; as description) {\n <ion-text>\n <p [innerHTML]=\"description | translate\"></p>\n </ion-text>\n }\n <app-form-field\n [definition]=\"field\"\n [formControlName]=\"field.key\"\n [required]=\"field.extra?.registration.required ?? field.extra?.account.required ?? false\"\n ></app-form-field>\n }\n </form>\n </mat-step>\n</mat-horizontal-stepper>\n", styles: ["form ion-toolbar.toolbar-buttons .toolbar-content{text-align:right}form ion-toolbar.toolbar-buttons .toolbar-background{border:0;background:inherit!important}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i6.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i6.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i6.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i7.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i12.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i12.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i13.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i14.AppFormField, selector: "app-form-field", inputs: ["definition", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "required", "hideRequiredMarker", "floatLabel", "label", "appearance", "subscriptSizing", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug", "panelClass", "panelWidth"], outputs: ["keyup.enter"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
181
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RegisterForm, selector: "app-register-form", outputs: { onCancel: "onCancel", onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "stepper", first: true, predicate: ["stepper"], descendants: true, static: true }], ngImport: i0, template: "<mat-horizontal-stepper linear #stepper=\"matHorizontalStepper\">\n <!-- Step 1: Username -->\n <mat-step [stepControl]=\"forms[0]\" *ngIf=\"forms[0].controls; let controls\">\n <form [formGroup]=\"forms[0]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n <ng-template matStepLabel>{{ 'REGISTER.STEP_EMAIL' | translate }}</ng-template>\n\n <!-- Email -->\n <mat-form-field>\n <mat-label>{{ 'USER.EMAIL' | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"email\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"controls.email.hasError('required') && controls.email.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error\n *ngIf=\"controls.email.hasError('email') && !controls.email.hasError('required') && controls.email.touched\"\n >\n <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n <mat-error *ngIf=\"controls.email.hasError('availability') && controls.email.touched\" translate>\n REGISTER.ERROR.EMAIL_ALREADY_REGISTERED\n </mat-error>\n </mat-form-field>\n\n <!-- Confirm Email -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.CONFIRM_EMAIL' | translate }}</mat-label>\n <input matInput autocomplete=\"off\" matFormFieldControl formControlName=\"confirmEmail\"/>\n <mat-error *ngIf=\"controls.confirmEmail.hasError('required') && controls.confirmEmail.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.confirmEmail.hasError('equals') && controls.confirmEmail.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\n </form>\n </mat-step>\n\n <!-- Step 2: Password -->\n <mat-step [stepControl]=\"forms[1]\" *ngIf=\"forms[1].controls; let controls\">\n <form [formGroup]=\"forms[1]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n <ng-template matStepLabel>{{ 'REGISTER.STEP_PASSWORD' | translate }}</ng-template>\n\n <!-- Password -->\n <mat-form-field>\n <mat-label>{{ 'USER.PASSWORD' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"password\"\n autocomplete=\"section-red new-password\"\n [type]=\"showPwd ? 'text' : 'password'\"\n required\n />\n <button matSuffix mat-icon-button type=\"button\" (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"controls.password.hasError('required') && controls.password.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.password.hasError('minlength') && controls.password.touched\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 8} }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- Confirm password -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.CONFIRM_PASSWORD' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"confirmPassword\"\n autocomplete=\"section-red new-password\"\n [type]=\"showConfirmPwd ? 'text' : 'password'\"\n required\n />\n <button mat-icon-button matSuffix (click)=\"showConfirmPwd = !showConfirmPwd\" tabindex=\"-1\">\n <mat-icon>{{ showConfirmPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"controls.confirmPassword.hasError('required') && controls.confirmPassword.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.confirmPassword.hasError('equals') && controls.confirmPassword.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_PASSWORD' | translate }}</span>\n </mat-error>\n </mat-form-field>\n </form>\n </mat-step>\n\n <!-- Step 3: user details -->\n <mat-step [stepControl]=\"forms[2]\" *ngIf=\"forms[2].controls; let controls\">\n <form\n [formGroup]=\"forms[2]\"\n (ngSubmit)=\"doSubmit($event)\"\n class=\"form-container ion-padding\"\n (keyup.enter)=\"doSubmit()\"\n >\n <ng-template matStepLabel>{{ 'REGISTER.STEP_USER_DETAILS' | translate }}</ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error && !sending\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <!-- Last name -->\n <mat-form-field>\n <mat-label>{{ 'USER.LAST_NAME' | translate }}</mat-label>\n <input matInput formControlName=\"lastName\" autocomplete=\"section-blue family-name\" required/>\n <mat-error *ngIf=\"controls.lastName.hasError('required') && controls.lastName.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.lastName.hasError('minlength') && controls.lastName.dirty\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- First name -->\n <mat-form-field>\n <mat-label>{{ 'USER.FIRST_NAME' | translate }}</mat-label>\n <input matInput formControlName=\"firstName\" autocomplete=\"section-blue given-name\" required/>\n <mat-error *ngIf=\"controls.firstName.hasError('required') && controls.firstName.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.firstName.hasError('minlength') && controls.firstName.dirty\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: {requiredLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- Additional fields -->\n @for (field of additionalFields; track field.key) {\n @if (field.extra.registration?.description; as description) {\n <ion-text>\n <p [innerHTML]=\"description | translate\"></p>\n </ion-text>\n }\n <app-form-field\n [definition]=\"field\"\n [formControlName]=\"field.key\"\n [required]=\"field.extra?.registration.required ?? field.extra?.account.required ?? false\"\n ></app-form-field>\n }\n </form>\n </mat-step>\n</mat-horizontal-stepper>\n", styles: ["form ion-toolbar.toolbar-buttons .toolbar-content{text-align:right}form ion-toolbar.toolbar-buttons .toolbar-background{border:0;background:inherit!important}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i6.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i6.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i6.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i7.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i12.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i12.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i12.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i13.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i14.AppFormField, selector: "app-form-field", inputs: ["definition", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "required", "hideRequiredMarker", "floatLabel", "label", "appearance", "subscriptSizing", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug", "panelClass", "panelWidth"], outputs: ["keyup.enter", "definitionChanged"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
182
182
  }
183
183
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterForm, decorators: [{
184
184
  type: Component,