@messaia/cdk 18.0.0-rc40 → 18.0.0-rc41
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.
|
@@ -516,7 +516,7 @@ export class VdDynamicTableComponent {
|
|
|
516
516
|
this.changeDetector.detectChanges();
|
|
517
517
|
}
|
|
518
518
|
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: VdDynamicTableComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DynamicBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
519
|
-
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.6", type: VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: { dataSource: "dataSource", data: "data", formArray: "formArray", debugValue: "debugValue", classType: "classType", context: "context", dataSourceFilter: "dataSourceFilter", static: "static", filterable: "filterable", paginable: "paginable", selectable: "selectable", sortActive: "sortActive", sortDirection: "sortDirection", stickyHeader: "stickyHeader", stickyFilter: "stickyFilter", rowNgClass: "rowNgClass", detailsTemplate: "detailsTemplate", readonly: "readonly", selectAllFilter: "selectAllFilter", columns: "columns", rowMenuItems: "rowMenuItems", rowAction: "rowAction", excludedColumns: "excludedColumns", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { rowClick: "rowClick" }, queries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "detailsTemplateRef", predicate: ["detailsTemplate"], descendants: true, read: ViewContainerRef }, { propertyName: "rowContextMenuTriggers", predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !detailsTemplate && !templateRef}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t<!-- #region Column def -->\r\n\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\">{{column.header | func:context}}</span>\r\n\t\t\t</th>\r\n\r\n\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\">{{column.enumMetadata[item].display}}</small>\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" [innerHtml]=\"column.enumMetadata[rowValue].display\"></span>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, !$event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</ng-template>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</ng-container>\r\n\r\n\t<!-- #region Filter row -->\r\n\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\">\r\n\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"column.filterOperator\"></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</th>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Details column -->\r\n\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Filter header -->\r\n\t<ng-container *ngIf=\"filterable\">\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t<!-- #region Detrails row -->\r\n\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n</table>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i4.VdDynamicMenuComponent, selector: "vd-dynamic-menu", inputs: ["items", "data", "index", "context", "contextMenu"] }, { kind: "directive", type: i5.DisableControlDirective, selector: "[disableControl]", inputs: ["disableControl"] }, { kind: "directive", type: i6.OnlyNumberDirective, selector: "[onlyNumber]", inputs: ["onlyNumber"] }, { kind: "component", type: i7.VdSelectComponent, selector: "vd-select", inputs: ["triggerCssClass", "triggerMode"] }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i8.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.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: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i13.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i13.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i14.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i14.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i14.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i14.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i14.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i15.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i18.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i19.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i20.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i21.FilterInputComponent, selector: "mat-header-cell[filter-input], [mat-header-cell][filter-input], [filter-input]", inputs: ["field", "operator", "onlyNumber", "debounce", "placeholder"] }, { kind: "component", type: i22.FilterSelectComponent, selector: "mat-header-cell[filter-select], [mat-header-cell][filter-select], [filter-select]", inputs: ["endpoint", "params", "projection", "sortBy", "sorted", "enumFilter", "enum", "enumMetadata", "key", "text", "prefix", "multiple", "options", "filteredOptions", "filterable", "field", "placeholder", "cache"] }, { kind: "component", type: i23.FilterClearComponent, selector: "mat-header-cell[filter-clear], [mat-header-cell][filter-clear], [filter-clear]" }, { kind: "component", type: i24.FilterDateComponent, selector: "mat-header-cell[filter-date], [mat-header-cell][filter-date], [filter-date]", inputs: ["field", "debounce", "placeholder"] }, { kind: "directive", type: i25.DataSourceFilterDirective, selector: "[dataSourceFilter]", inputs: ["dataSource", "dataSourceFilter"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.JsonPipe, name: "json" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i26.EnumPipe, name: "enum" }, { kind: "pipe", type: i27.FormGroupPipe, name: "formGroup" }, { kind: "pipe", type: i28.FuncPipe, name: "func" }, { kind: "pipe", type: i29.PropertyPipe, name: "property" }], animations: [
|
|
519
|
+
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.6", type: VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: { dataSource: "dataSource", data: "data", formArray: "formArray", debugValue: "debugValue", classType: "classType", context: "context", dataSourceFilter: "dataSourceFilter", static: "static", filterable: "filterable", paginable: "paginable", selectable: "selectable", sortActive: "sortActive", sortDirection: "sortDirection", stickyHeader: "stickyHeader", stickyFilter: "stickyFilter", rowNgClass: "rowNgClass", detailsTemplate: "detailsTemplate", readonly: "readonly", selectAllFilter: "selectAllFilter", columns: "columns", rowMenuItems: "rowMenuItems", rowAction: "rowAction", excludedColumns: "excludedColumns", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { rowClick: "rowClick" }, queries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "detailsTemplateRef", predicate: ["detailsTemplate"], descendants: true, read: ViewContainerRef }, { propertyName: "rowContextMenuTriggers", predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !detailsTemplate && !templateRef}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t<!-- #region Column def -->\r\n\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\">{{column.header | func:context}}</span>\r\n\t\t\t</th>\r\n\r\n\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\">{{column.enumMetadata[item].display}}</small>\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" class=\"na\" [innerHtml]=\"(column.enumMetadata[rowValue]||{}).display\"></span>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, !$event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</ng-template>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</ng-container>\r\n\r\n\t<!-- #region Filter row -->\r\n\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\">\r\n\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"column.filterOperator\"></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</th>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Details column -->\r\n\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Filter header -->\r\n\t<ng-container *ngIf=\"filterable\">\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t<!-- #region Detrails row -->\r\n\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n</table>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i4.VdDynamicMenuComponent, selector: "vd-dynamic-menu", inputs: ["items", "data", "index", "context", "contextMenu"] }, { kind: "directive", type: i5.DisableControlDirective, selector: "[disableControl]", inputs: ["disableControl"] }, { kind: "directive", type: i6.OnlyNumberDirective, selector: "[onlyNumber]", inputs: ["onlyNumber"] }, { kind: "component", type: i7.VdSelectComponent, selector: "vd-select", inputs: ["triggerCssClass", "triggerMode"] }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i8.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.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: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i13.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i13.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i14.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i14.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i14.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i14.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i14.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i15.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i18.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i19.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i20.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i21.FilterInputComponent, selector: "mat-header-cell[filter-input], [mat-header-cell][filter-input], [filter-input]", inputs: ["field", "operator", "onlyNumber", "debounce", "placeholder"] }, { kind: "component", type: i22.FilterSelectComponent, selector: "mat-header-cell[filter-select], [mat-header-cell][filter-select], [filter-select]", inputs: ["endpoint", "params", "projection", "sortBy", "sorted", "enumFilter", "enum", "enumMetadata", "key", "text", "prefix", "multiple", "options", "filteredOptions", "filterable", "field", "placeholder", "cache"] }, { kind: "component", type: i23.FilterClearComponent, selector: "mat-header-cell[filter-clear], [mat-header-cell][filter-clear], [filter-clear]" }, { kind: "component", type: i24.FilterDateComponent, selector: "mat-header-cell[filter-date], [mat-header-cell][filter-date], [filter-date]", inputs: ["field", "debounce", "placeholder"] }, { kind: "directive", type: i25.DataSourceFilterDirective, selector: "[dataSourceFilter]", inputs: ["dataSource", "dataSourceFilter"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.JsonPipe, name: "json" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i26.EnumPipe, name: "enum" }, { kind: "pipe", type: i27.FormGroupPipe, name: "formGroup" }, { kind: "pipe", type: i28.FuncPipe, name: "func" }, { kind: "pipe", type: i29.PropertyPipe, name: "property" }], animations: [
|
|
520
520
|
trigger('detailExpand', [
|
|
521
521
|
state('collapsed', style({ height: '0px', minHeight: '0' })),
|
|
522
522
|
state('expanded', style({ height: AUTO_STYLE })),
|
|
@@ -532,7 +532,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
|
|
|
532
532
|
state('expanded', style({ height: AUTO_STYLE })),
|
|
533
533
|
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
534
534
|
]),
|
|
535
|
-
], template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !detailsTemplate && !templateRef}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t<!-- #region Column def -->\r\n\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\">{{column.header | func:context}}</span>\r\n\t\t\t</th>\r\n\r\n\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\">{{column.enumMetadata[item].display}}</small>\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" [innerHtml]=\"column.enumMetadata[rowValue].display\"></span>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, !$event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</ng-template>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</ng-container>\r\n\r\n\t<!-- #region Filter row -->\r\n\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\">\r\n\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"column.filterOperator\"></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</th>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Details column -->\r\n\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Filter header -->\r\n\t<ng-container *ngIf=\"filterable\">\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t<!-- #region Detrails row -->\r\n\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n</table>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}\n"] }]
|
|
535
|
+
], template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !detailsTemplate && !templateRef}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t<!-- #region Column def -->\r\n\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\">{{column.header | func:context}}</span>\r\n\t\t\t</th>\r\n\r\n\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\">{{column.enumMetadata[item].display}}</small>\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" class=\"na\" [innerHtml]=\"(column.enumMetadata[rowValue]||{}).display\"></span>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, !$event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</ng-template>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</ng-container>\r\n\r\n\t<!-- #region Filter row -->\r\n\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\">\r\n\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"column.filterOperator\"></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</th>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Details column -->\r\n\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Filter header -->\r\n\t<ng-container *ngIf=\"filterable\">\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t<!-- #region Detrails row -->\r\n\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n</table>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}\n"] }]
|
|
536
536
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.DynamicBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { table: [{
|
|
537
537
|
type: ViewChild,
|
|
538
538
|
args: ['table']
|
|
@@ -604,4 +604,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
|
|
|
604
604
|
}], pageSizeOptions: [{
|
|
605
605
|
type: Input
|
|
606
606
|
}] } });
|
|
607
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JNLE9BQU8sRUFBYSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztB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QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPcEQsV0FBVztzQkFEakIsWUFBWTt1QkFBQyxXQUFXO2dCQU9sQixVQUFVO3NCQURoQixLQUFLO2dCQU9GLElBQUk7c0JBRFAsS0FBSztnQkFrQkssU0FBUztzQkFEbkIsS0FBSztnQkF1QkMsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0MsT0FBTztzQkFEYixLQUFLO2dCQU9DLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFPQyxNQUFNO3NCQURaLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxVQUFVO3NCQURoQixLQUFLO2dCQU9DLGFBQWE7c0JBRG5CLEtBQUs7Z0JBT0MsWUFBWTtzQkFEbEIsS0FBSztnQkFPQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLFFBQVE7c0JBRGQsTUFBTTtnQkFPQSxVQUFVO3NCQURoQixLQUFLO2dCQU9DLGVBQWU7c0JBRHJCLEtBQUs7Z0JBWUYsUUFBUTtzQkFEWCxLQUFLO2dCQVVDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBT0MsT0FBTztzQkFEYixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBWWhDLFNBQVM7c0JBRFosU0FBUzt1QkFBQyxZQUFZO2dCQWdCbkIsT0FBTztzQkFEVixLQUFLO2dCQTRCQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkFPQyxlQUFlO3NCQURyQixLQUFLO2dCQU9DLHNCQUFzQjtzQkFENUIsWUFBWTt1QkFBQyxjQUFjO2dCQXNCckIsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLGVBQWU7c0JBRHJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBBVVRPX1NUWUxFLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTb3J0LCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdFRhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlscyc7XHJcbmltcG9ydCB7IER5bmFtaWNCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2hlbHBlcnMvZHluYW1pYy1idWlsZGVyJztcclxuaW1wb3J0IHsgQWN0aW9uSXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9tb2RlbHMvYWN0aW9uLWl0ZW0nO1xyXG5pbXBvcnQgeyBHcmlkIH0gZnJvbSAnLi4vLi4vZW51bXMvZ3JpZCc7XHJcbmltcG9ydCB7IFRhYmxlQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3RhYmxlLWNvbHVtbi10eXBlJztcclxuaW1wb3J0IHsgZ2V0VGFibGVEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL2Z1bmN0aW9ucyc7XHJcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLWNvbHVtbic7XHJcbmltcG9ydCB7IFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL3RhYmxlLmRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgVGFibGVTdGF0aWNEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUuc3RhdGljLWRhdGEtc291cmNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAndmQtZHluYW1pYy10YWJsZScsXHJcblx0dGVtcGxhdGVVcmw6ICdkeW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnZHluYW1pYy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG5cdGFuaW1hdGlvbnM6IFtcclxuXHRcdHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcclxuXHRcdFx0c3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxyXG5cdFx0XHRzdGF0ZSgnZXhwYW5kZWQnLCBzdHlsZSh7IGhlaWdodDogQVVUT19TVFlMRSB9KSksXHJcblx0XHRcdHRyYW5zaXRpb24oJ2V4cGFuZGVkIDw9PiBjb2xsYXBzZWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSksXHJcblx0XHRdKSxcclxuXHRdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmREeW5hbWljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xyXG5cdC8qKlxyXG5cdCAqIGRldGFpbHNUZW1wbGF0ZTogVmlld0NvbnRhaW5lclJlZlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoJ3RhYmxlJylcclxuXHRwdWJsaWMgdGFibGU/OiBNYXRUYWJsZTxhbnk+O1xyXG5cclxuXHQvKipcclxuXHQgKiBkZXRhaWxzVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWZcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdkZXRhaWxzVGVtcGxhdGUnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuXHRwdWJsaWMgZGV0YWlsc1RlbXBsYXRlUmVmPzogUXVlcnlMaXN0PGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGFpbHMgdGVtcGxhdGVcclxuXHQgKi9cclxuXHRAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKVxyXG5cdHB1YmxpYyB0ZW1wbGF0ZVJlZj86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdGEtdGFibGUgZGF0YXNvdXJjZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxhbnksIGFueT4gfCBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRhYmxlIGRhdGFcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHNldCBkYXRhKGRhdGE6IGFueSkge1xyXG5cdFx0dGhpcy5kYXRhU291cmNlID0gbmV3IFRhYmxlU3RhdGljRGF0YVNvdXJjZShkYXRhKTtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5tYXRTb3J0O1xyXG5cdFx0dGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMuX3BhZ2luYXRvcjtcclxuXHRcdHRoaXMucGFnaW5hYmxlID0gdHJ1ZTtcclxuXHRcdHRoaXMuc3RhdGljID0gdHJ1ZTtcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBAcHJvcGVydHlcclxuXHQgKi9cclxuXHRwdWJsaWMgX2Zvcm1BcnJheT86IEZvcm1BcnJheTtcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGZvcm1BcnJheSgpOiBGb3JtQXJyYXkgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZm9ybUFycmF5OyB9XHJcblx0cHVibGljIHNldCBmb3JtQXJyYXkoZm9ybUFycmF5OiBGb3JtQXJyYXkpIHtcclxuXHRcdHRoaXMuX2Zvcm1BcnJheSA9IGZvcm1BcnJheTtcclxuXHRcdHRoaXMuZGF0YSA9IHRoaXMuX2Zvcm1BcnJheT8udmFsdWU7XHJcblxyXG5cdFx0LyogVXBkYXRlIHRhYmxlIGRhdGEgKi9cclxuXHRcdHRoaXMuX2Zvcm1BcnJheT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoeCA9PiB7XHJcblx0XHRcdGlmICh4Lmxlbmd0aCAhPT0gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5sZW5ndGgpIHtcclxuXHRcdFx0XHR0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuX2Zvcm1BcnJheT8udmFsdWU7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9ybSByYXcgdmFsdWVcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0IGZvcm1WYWx1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5mb3JtQXJyYXk/LmdldFJhd1ZhbHVlKCk7IH1cclxuXHJcblx0LyoqXHJcblx0ICogZGVidWdWYWx1ZTogYm9vbGVhblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRlYnVnVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQ2xhc3MgdHlwZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNsYXNzVHlwZTogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBDdXJyZW50IGNvbnRleHQgXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgY29udGV4dDogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBkYXRhU291cmNlRmlsdGVyOiBhbnlcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkYXRhU291cmNlRmlsdGVyOiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogU3RhdGljIHRhYmxlXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RhdGljOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGZpbHRlcmFibGU/XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZmlsdGVyYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHBhZ2luYWJsZT9cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdpbmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogU2hvd3MgdGhlIGNvbHVtbiAnQ2hlY2tib3gnXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBDdXJyZW50IHNvcnQgY29sdW1uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydEFjdGl2ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBzb3J0IGRpcmVjdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb24gPSAnYXNjJztcclxuXHJcblx0LyoqXHJcblx0ICogU3RpY2t5IGhlYWRlclxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHN0aWNreUhlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0aWNreSBmaWx0ZXJcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGlja3lGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBSb3cgY2xpY2sgZXZlbnRcclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHJvd05nQ2xhc3M6IEZ1bmN0aW9uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TmdDbGFzcz86IEZ1bmN0aW9uO1xyXG5cclxuXHQvKipcclxuXHQgKiBkZXRhaWxzVGVtcGxhdGU6IEZ1bmN0aW9uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGV0YWlsc1RlbXBsYXRlPzogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBfcmVhZG9ubHk6IGJvb2xlYW47XHJcblx0ICovXHJcblx0cHVibGljIF9yZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiByZWFkb25seTogYm9vbGVhbjtcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCByZWFkb25seSgpIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9XHJcblx0c2V0IHJlYWRvbmx5KHJlYWRvbmx5KSB7XHJcblx0XHR0aGlzLl9yZWFkb25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShyZWFkb25seSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBzZWxlY3RBbGxGaWx0ZXI6IEZ1bmN0aW9uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0QWxsRmlsdGVyPzogKHZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIsIGFycmF5OiBhbnlbXSkgPT4gdW5rbm93bjtcclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gTWRTb3J0IGF0dHJpYnV0ZVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwdWJsaWMgbWF0U29ydD86IE1hdFNvcnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9wYWdpbmF0b3I6IE1hdFBhZ2luYXRvclxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3BhZ2luYXRvcj86IE1hdFBhZ2luYXRvcjtcclxuXHJcblx0LyoqXHJcblx0ICogcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3JcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKE1hdFBhZ2luYXRvcilcclxuXHRzZXQgcGFnaW5hdG9yKHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yKSB7XHJcblx0XHRpZiAocGFnaW5hdG9yKSB7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSBwYWdpbmF0b3I7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogX2NvbHVtbnM6IFRhYmxlQ29sdW1uW11cclxuXHQgKi9cclxuXHRwcml2YXRlIF9jb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNvbHVtbnM6IENvbHVtbltdXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgY29sdW1ucygpOiBUYWJsZUNvbHVtbltdIHsgcmV0dXJuIHRoaXMuX2NvbHVtbnM7IH07XHJcblx0c2V0IGNvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5bXSkgeyB0aGlzLl9jb2x1bW5zID0gY29sdW1uczsgfTtcclxuXHJcblx0LyoqXHJcblx0ICogY29sdW1uc1N1YmplY3Q6IFN1YmplY3Q8KFRhYmxlQ29sdW1uIHwgc3RyaW5nKVtdPlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFRhYmxlQ29sdW1uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZUNvbHVtbltdPihbXSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNvbHVtbnMkOiBPYnNlcnZhYmxlPChUYWJsZUNvbHVtbiB8IHN0cmluZylbXT5cclxuXHQgKi9cclxuXHRwdWJsaWMgY29sdW1ucyQ6IE9ic2VydmFibGU8VGFibGVDb2x1bW5bXT4gPSB0aGlzLmNvbHVtbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpOztcclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGxheWVkIGNvbHVtbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgZGlzcGxheWVkQ29sdW1ucyQ/OiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGxheWVkIGZpbHRlciBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZEZpbHRlckNvbHVtbnMkPzogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRhYmxlIHJvdyBtZW51IGl0ZW1zXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TWVudUl0ZW1zOiBBY3Rpb25JdGVtW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogVGFibGUgcm93IGFjdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHJvd0FjdGlvbj86IEFjdGlvbkl0ZW07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbHVtbnMgdG8gZXhjbHVkZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGV4Y2x1ZGVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBNYXRNZW51VHJpZ2dlciBpbiB0aGUgRE9NXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZHJlbihNYXRNZW51VHJpZ2dlcilcclxuXHRwdWJsaWMgcm93Q29udGV4dE1lbnVUcmlnZ2Vycz86IFF1ZXJ5TGlzdDxNYXRNZW51VHJpZ2dlcj47XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbHVtblR5cGU6IENvbHVtblR5cGVcclxuXHQgKi9cclxuXHRwdWJsaWMgQ29sdW1uVHlwZTogdHlwZW9mIFRhYmxlQ29sdW1uVHlwZSA9IFRhYmxlQ29sdW1uVHlwZTtcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHR5cGUgb2YgdGhlIGVudW0gR3JpZFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBHcmlkOiB0eXBlb2YgR3JpZCA9IEdyaWQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGV4cGFuZGVkUm93OiBhbnlcclxuXHQgKi9cclxuXHRwdWJsaWMgZXhwYW5kZWRSb3c6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogRGVmYXVsdCBwYWdlIHNpemVcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhZ2Ugc2l6ZSBvcHRpb25zXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcGFnZVNpemVPcHRpb25zOiBBcnJheTxudW1iZXI+ID0gWzUsIDEwLCAxNSwgMjAsIDMwLCA1MCwgMTAwLCAyMDBdO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSBkeW5hbWljQnVpbGRlciBcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBkeW5hbWljQnVpbGRlcjogRHluYW1pY0J1aWxkZXIsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxyXG5cdCAqIGRlZmF1bHQgY2hhbmdlIGRldGVjdG9yIGhhcyBjaGVja2VkIHRoZSBkaXJlY3RpdmUnc1xyXG5cdCAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBmb3IgdGhlIGZpcnN0IHRpbWUsXHJcblx0ICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHZpZXcgb3IgY29udGVudCBjaGlsZHJlbiBoYXZlIGJlZW4gY2hlY2tlZC5cclxuXHQgKiBJdCBpcyBpbnZva2VkIG9ubHkgb25jZSB3aGVuIHRoZSBkaXJlY3RpdmUgaXMgaW5zdGFudGlhdGVkLlxyXG5cdCAqL1xyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuY2xhc3NUeXBlKSB7XHJcblx0XHRcdC8qIEdldCB0aGUgdGFibGUgZGVmaW5pdGlvbiB1c2luZyB0aGUgY2xhc3MgdHlwZSAqL1xyXG5cdFx0XHR2YXIgdGFibGVEZWZpbml0aW9uID0gZ2V0VGFibGVEZWZpbml0aW9uKHRoaXMuY2xhc3NUeXBlKTtcclxuXHRcdFx0aWYgKHRhYmxlRGVmaW5pdGlvbikge1xyXG5cdFx0XHRcdHRoaXMuY29sdW1ucyA9IFsuLi50YWJsZURlZmluaXRpb24hLmNvbHVtbnMgPz8gW11dO1xyXG5cdFx0XHRcdGlmICh0aGlzLnJvd01lbnVJdGVtcz8ubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0LyogQ2hlY2sgaWYgdGhlIGFjdGlvbiBjb2x1bW4gYWxyZWFkeSBleGlzdHMgKi9cclxuXHRcdFx0XHRcdHZhciBhY3Rpb25Db2xtdW4gPSB0aGlzLl9jb2x1bW5zPy5maW5kKHggPT4geC5uYW1lID09ICdhY3Rpb24nKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiBzbywganVzdCBhZGQgdGhlIG1lbnUgaXRlbXMgdG8gaXQgKi9cclxuXHRcdFx0XHRcdGlmIChhY3Rpb25Db2xtdW4gIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRhY3Rpb25Db2xtdW4ubWVudSB8fD0geyBpY29uOiAnbW9yZV92ZXJ0JyB9O1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJvd01lbnVJdGVtcy5mb3JFYWNoKHkgPT4gYWN0aW9uQ29sbXVuIS5tZW51IS5pdGVtcz8udW5zaGlmdCh5KSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogT3RoZXJ3aXNlIGFkZCBhIG5ldyBvbmUgKi9cclxuXHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9jb2x1bW5zLnB1c2gobmV3IFRhYmxlQ29sdW1uKHtcclxuXHRcdFx0XHRcdFx0XHRpbmRleDogMjAwMCxcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiAnYWN0aW9uJyxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQWN0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdGRpc2FibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdG1lbnU6IHsgaWNvbjogJ21vcmVfdmVydCcsIGl0ZW1zOiB0aGlzLnJvd01lbnVJdGVtcyB9LFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2VcclxuXHRcdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5yb3dBY3Rpb24pIHtcclxuXHRcdFx0XHRcdHRoaXMuX2NvbHVtbnMucHVzaChuZXcgVGFibGVDb2x1bW4oe1xyXG5cdFx0XHRcdFx0XHRpbmRleDogMjAwMCxcclxuXHRcdFx0XHRcdFx0bmFtZTogJ2FjdGlvbicsXHJcblx0XHRcdFx0XHRcdHR5cGU6IFRhYmxlQ29sdW1uVHlwZS5BY3Rpb24sXHJcblx0XHRcdFx0XHRcdGRpc2FibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRtZW51OiB0aGlzLnJvd0FjdGlvbixcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZVxyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogQWRkIGNoZWNrYm94IGNvbHVtbiAqL1xyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29sdW1ucy51bnNoaWZ0KG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdG5hbWU6ICdzZWxlY3QnLFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQ2hlY2tib3gsXHJcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2VcclxuXHRcdFx0XHRcdH0pKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKiBCdWlsZCBkaXNwbGF5ZWQgY29sdW1ucyAmIGZpbHRlciAqL1xyXG5cdFx0dGhpcy5jb2x1bW5zJD8uc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHR0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gb2YodGhpcy5jb2x1bW5zPy5maWx0ZXIoeCA9PiAhdGhpcy5leGNsdWRlZENvbHVtbnM/LmluY2x1ZGVzKHgubmFtZSkpPy5tYXAoYyA9PiBjLm5hbWUpKTtcclxuXHRcdFx0dGhpcy5kaXNwbGF5ZWRGaWx0ZXJDb2x1bW5zJCA9IG9mKHRoaXMuY29sdW1ucz8uZmlsdGVyKHggPT4gIXRoaXMuZXhjbHVkZWRDb2x1bW5zPy5pbmNsdWRlcyh4Lm5hbWUpKT8ubWFwKGMgPT4gYGZpbHRlci4keyhjLmZpbHRlciB8fCBjLm5hbWUpfWApKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8qIFNldCB0aGUgdGFibGUgY29sdW1ucyAqL1xyXG5cdFx0dGhpcy51cGRhdGVDb2x1bW5zKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB0YWJsZSBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIHVwZGF0ZUNvbHVtbnMoKTogdm9pZCB7XHJcblx0XHQvKiBTb3J0IHRoZSBjb2x1bW5zIGJ5IGluZGV4ICovXHJcblx0XHRVdGlscy5zb3J0QXJyYXkodGhpcy5jb2x1bW5zIHx8IFtdLCAnaW5kZXgnKTtcclxuXHJcblx0XHQvKiBUcmlnZ2VyIGNoYW5nZXMgKi9cclxuXHRcdHRoaXMuY29sdW1uc1N1YmplY3QubmV4dCh0aGlzLmNvbHVtbnMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ291bnRzIHZpc2libGUgYWN0aW9uIG1lbnVzXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdzogYW55LCBjb2x1bW46IFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gKGNvbHVtbj8ucm93TWVudUl0ZW1zPy5maWx0ZXIoeCA9PiAheC5oaWRlIHx8ICF4LmhpZGUocm93KSk/Lmxlbmd0aCA/PyAtMSkgPiAwO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBmdW5jdGlvbiB0byB0byBjb21wdXRlIHRoZSBpZGVudGl0eSBvZiBpdGVtcyBpbiBhbiBpdGVyYWJsZS5cclxuXHQgKiBAcGFyYW0gaW5kZXggXHJcblx0ICogQHBhcmFtIGl0ZW0gXHJcblx0ICovXHJcblx0cHVibGljIHRyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBgJHtpdGVtLmlkfWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGZ1bmN0aW9uIHRvIHRvIGNvbXB1dGUgdGhlIGlkZW50aXR5IG9mIGl0ZW1zIGluIGFuIGl0ZXJhYmxlLlxyXG5cdCAqIEBwYXJhbSBpbmRleCBcclxuXHQgKiBAcGFyYW0gaXRlbSBcclxuXHQgKi9cclxuXHRwdWJsaWMgY29sdW1uc1RyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBpdGVtLm5hbWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIHJvdyBjbGljayBldmVudFxyXG5cdCAqIEBwYXJhbSBpbmRleCBcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVSb3dDbGljayhpbmRleDogYW55LCByb3c6IGFueSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMudGVtcGxhdGVSZWYpIHtcclxuXHRcdFx0dGhpcy5leHBhbmRlZFJvdyA9IHRoaXMuZXhwYW5kZWRSb3cgPT09IHJvdyA/IG51bGwgOiByb3c7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmICh0aGlzLmRldGFpbHNUZW1wbGF0ZSkge1xyXG5cdFx0XHR0aGlzLmV4cGFuZGVkUm93ID0gdGhpcy5leHBhbmRlZFJvdyA9PT0gcm93ID8gbnVsbCA6IHJvdztcclxuXHRcdFx0aWYgKHRoaXMuZGV0YWlsc1RlbXBsYXRlUmVmKSB7XHJcblx0XHRcdFx0dGhpcy5keW5hbWljQnVpbGRlci5jb21waWxlSHRtbCh0aGlzLmRldGFpbHNUZW1wbGF0ZVJlZi5nZXQoaW5kZXgpLCB0aGlzLmRldGFpbHNUZW1wbGF0ZSwgcm93KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTWV0aG9kIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrIHdpdGggdGhlIHJpZ2h0IGJ1dHRvblxyXG5cdCAqIEBwYXJhbSBldmVudCBNb3VzZUV2ZW50LCBpdCBjb250YWlucyB0aGUgY29vcmRpbmF0ZXNcclxuXHQgKiBAcGFyYW0gaXRlbSBPdXIgZGF0YSBjb250YWluZWQgaW4gdGhlIHJvdyBvZiB0aGUgdGFibGVcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlUm93UmlnaHRDbGljayhldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcblx0XHR0aGlzLnJvd0NvbnRleHRNZW51VHJpZ2dlcnM/LnRvQXJyYXkoKT8uZm9yRWFjaCh4ID0+IHguY2xvc2VNZW51KCkpO1xyXG5cdFx0dmFyIG1lbnVUcmlnZ2VyID0gdGhpcy5yb3dDb250ZXh0TWVudVRyaWdnZXJzPy50b0FycmF5KCk/LmZpbHRlcih4ID0+IHhbJ19lbGVtZW50J10/Lm5hdGl2ZUVsZW1lbnQ/LmdldEF0dHJpYnV0ZSgnaWQnKSA9PSBgbWVudS0ke2l0ZW0uaWR9YClbMF07XHJcblx0XHRpZiAobWVudVRyaWdnZXIgIT0gbnVsbCkge1xyXG5cdFx0XHQvKiBBdm9pZHMgdG8gc2hvdyB0aGUgdmlzdWFsaXphdGlvbiBvZiB0aGUgcmlnaHQtY2xpY2sgbWVudSBvZiB0aGUgYnJvd3NlciAqL1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0LyogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSAqL1xyXG5cdFx0XHRtZW51VHJpZ2dlclsnX2VsZW1lbnQnXT8ubmF0aXZlRWxlbWVudD8uc2V0QXR0cmlidXRlKCdzdHlsZScsIGBwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6ICR7ZXZlbnQuY2xpZW50WH1weDsgdG9wOiAke2V2ZW50LmNsaWVudFl9cHhgKTtcclxuXHJcblx0XHRcdC8qIFBhc3MgdG8gdGhlIG1lbnUgdGhlIGN1cnJlbnQgb2JqZWN0ICovXHJcblx0XHRcdG1lbnVUcmlnZ2VyLm1lbnVEYXRhID0geyBpdGVtOiBpdGVtIH1cclxuXHJcblx0XHRcdC8qIE9wZW4gdGhlIG1lbnUgKi9cclxuXHRcdFx0bWVudVRyaWdnZXIub3Blbk1lbnUoKTtcclxuXHJcblx0XHRcdC8qIEhhbmRsZSBjbGlja3Mgb24gdGhlIG1lbnUgb3ZlcmxheSAqL1xyXG5cdFx0XHRkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjZGstb3ZlcmxheS1jb250YWluZXInKVswXT8uYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAob2ZmRXZlbnQ6IGFueSkgPT4ge1xyXG5cdFx0XHRcdG9mZkV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0bWVudVRyaWdnZXIhLmNsb3NlTWVudSgpO1xyXG5cdFx0XHR9LCB7IG9uY2U6IHRydWUgfSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIG1vZGVsIGNoYW5nZXNcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqIEBwYXJhbSByb3cgXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZU1vZGVsQ2hhbmdlKGNvbHVtbjogVGFibGVDb2x1bW4sIHJvdzogYW55LCBmb3JtR3JvdXA/OiBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdGlmICh0eXBlb2YgY29sdW1uPy5ldmVudCA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRjb2x1bW4uZXZlbnQocm93LCBmb3JtR3JvdXAsIGNvbHVtbi5ldmVudEFyZ3MgPz8gdGhpcy5jb250ZXh0KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMga2V5ZG93biBlbnRlciBvZiA8aW5wdXQ+IGFuZCA8dmQtc2VsZWN0PlxyXG5cdCAqIEBwYXJhbSAkZXZlbnQgXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XHJcblx0XHQoJGV2ZW50Py50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LmJsdXIoKTtcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhdGNoZXMgYW4gZW50aXR5XHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcGFyYW0gZmllbGROYW1lIFxyXG5cdCAqIEBwYXJhbSBwYXRoIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXRjaChyb3c6IGFueSwgZmllbGRzOiBBcnJheTxzdHJpbmc+LCB2YWx1ZTogYW55LCBpbmNsdWRlczogYW55KTogdm9pZCB7XHJcblx0XHQvKiBHZXQgZW50aXR5IGJ5IElEICovXHJcblx0XHRsZXQgZW50aXR5ID0gdGhpcy5kYXRhU291cmNlLml0ZW1zPy5maWx0ZXIoKHg6IGFueSkgPT4gKDxhbnk+eCkuaWQgPT09IHJvdy5pZClbMF07XHJcblx0XHRpZiAoZW50aXR5KSB7XHJcblx0XHRcdC8qIEJ1aWxkIHBhdGNoIG1ldGhvZHMgKi9cclxuXHRcdFx0bGV0IHBhdGNoZXMgPSBmaWVsZHMubWFwKHggPT4geyByZXR1cm4geyBvcDogJ3JlcGxhY2UnLCBwYXRoOiBgLyR7eH1gLCB2YWx1ZTogdmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBlbnRpdHlbeF0gfTsgfSk7XHJcblxyXG5cdFx0XHQvKiBTZW5kIHJlcXVlc3QgKi9cclxuXHRcdFx0dGhpcy5kYXRhU291cmNlLnNlcnZpY2VcclxuXHRcdFx0XHQucGF0Y2gocm93LmlkLCBwYXRjaGVzLCBudWxsLCB7IGhlYWRlcnM6IHsgJ1Nob3ctTWVzc2FnZSc6ICdZZXMnIH0sIHBhcmFtczogaW5jbHVkZXMgPyBVdGlscy50b0h0dHBQYXJhbXMoeyBpbmNsdWRlczogaW5jbHVkZXMgfSkgOiBudWxsIH0pXHJcblx0XHRcdFx0LnN1YnNjcmliZSgoXzogYW55KSA9PiB0aGlzLmRhdGFTb3VyY2UucmVsb2FkKCkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyByb3dzIGJhc2VkIG9uIHRoZSB0YWJsZSdzIGxhdGVzdCBzZXQgb2YgZGF0YSwgd2hpY2ggd2FzIGVpdGhlciBwcm92aWRlZCBkaXJlY3RseSBhcyBhblxyXG5cdCAqIGlucHV0IG9yIHJldHJpZXZlZCB0aHJvdWdoIGFuIE9ic2VydmFibGUgc3RyZWFtIChkaXJlY3RseSBvciBmcm9tIGEgRGF0YVNvdXJjZSkuXHJcblx0ICogQ2hlY2tzIGZvciBkaWZmZXJlbmNlcyBpbiB0aGUgZGF0YSBzaW5jZSB0aGUgbGFzdCBkaWZmIHRvIHBlcmZvcm0gb25seSB0aGUgbmVjZXNzYXJ5XHJcblx0ICogY2hhbmdlcyAoYWRkL3JlbW92ZS9tb3ZlIHJvd3MpLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyByZW5kZXJSb3dzKCk6IHZvaWQge1xyXG5cdFx0dGhpcy50YWJsZT8ucmVuZGVyUm93cygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyBhIHN0cmluZyBmdW5jdGlvbiBleHByZXNzaW9uLlxyXG5cdCAqIFxyXG5cdCAqIFRoaXMgbWV0aG9kIHByb2Nlc3NlcyBhbiBpbnB1dCBleHByZXNzaW9uIHRoYXQgY2FuIGVpdGhlciBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiBcclxuXHQgKiBJZiBpdCdzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtIGFuZCBjb250ZXh0LiBcclxuXHQgKiBJZiBpdCdzIGEgc3RyaW5nLCBpdCB3aWxsIGJlIHJldHVybmVkIGFzLWlzLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIGV4cHJlc3Npb24gdG8gaGFuZGxlLCB3aGljaCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi5cclxuXHQgKiBAcGFyYW0gaXRlbSAtIFRoZSBpdGVtIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb24uXHJcblx0ICogQHJldHVybnMgLSBUaGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVtIGFuZCBjb250ZXh0LCBvciB0aGUgc3RyaW5nIGV4cHJlc3Npb24gaXRzZWxmLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZyB8IEZ1bmN0aW9uLCBpdGVtOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG5cdFx0LyogQ2hlY2sgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc3kgKGUuZy4sIG51bGwsIHVuZGVmaW5lZCwgb3IgZW1wdHkpICovXHJcblx0XHRpZiAoIWV4cHJlc3Npb24pIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0IHdpdGggdGhlIGl0ZW0gYW5kIGNvbnRleHQgKi9cclxuXHRcdGlmICh0eXBlb2YgZXhwcmVzc2lvbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbihpdGVtLCB0aGlzLmNvbnRleHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIElmIHRoZSBleHByZXNzaW9uIGlzIG5vdCBhIGZ1bmN0aW9uLCBhc3N1bWUgaXQncyBhIHN0cmluZyBhbmQgcmV0dXJuIGl0ICovXHJcblx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgaW4gYW4gb2JqZWN0IGJhc2VkIG9uIGEgZG90LXNlcGFyYXRlZCBwYXRoLlxyXG5cdCAqIEBwYXJhbSByb3cgLSBUaGUgb2JqZWN0IGluIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBiZWluZyBzZXQuXHJcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCAtIEEgZG90LXNlcGFyYXRlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSBuZXN0ZWQgcHJvcGVydHkuXHJcblx0ICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCBhdCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBwcm9wZXJ0eS5cclxuXHQgKi9cclxuXHRwdWJsaWMgc2V0TmVzdGVkUHJvcGVydHkocm93OiBhbnksIHByb3BlcnR5UGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcblx0XHQvKiBTcGxpdCB0aGUgcHJvcGVydHlQYXRoIGludG8gYW4gYXJyYXkgb2Yga2V5cyAqL1xyXG5cdFx0Y29uc3Qga2V5cyA9IHByb3BlcnR5UGF0aC5zcGxpdCgnLicpO1xyXG5cclxuXHRcdC8qIFVzZSBzbGljZSB0byBnZXQgYWxsIGtleXMgZXhjZXB0IHRoZSBsYXN0IG9uZSBhbmQgcmVkdWNlIHRvIHRyYXZlcnNlIHRvIHRoZSBzZWNvbmQtdG8tbGFzdCBsZXZlbCAqL1xyXG5cdFx0a2V5cy5zbGljZSgwLCAtMSkucmVkdWNlKChhY2MsIGtleSkgPT4gYWNjICYmIGFjY1trZXldLCByb3cpW2tleXNba2V5cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgcm93IGNsYXNzZXNcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqIEBwYXJhbSByb3cgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGdldFJvd0NsYXNzZXMoY29sdW1uOiBUYWJsZUNvbHVtbiwgcm93OiBhbnkpOiBhbnkge1xyXG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe1xyXG5cdFx0XHQnZ3QteHMnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhzLFxyXG5cdFx0XHQnZ3Qtc20nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlNtLFxyXG5cdFx0XHQnZ3QtbWQnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk1kLFxyXG5cdFx0XHQnZ3QtbGcnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLkxnLFxyXG5cdFx0XHQnZ3QteGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhsLFxyXG5cdFx0XHQnZ3QteHhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YeGwsXHJcblx0XHRcdCdoaWRkZW4nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk5vbmUsXHJcblx0XHRcdCd0ZXh0LXJpZ2h0JzogY29sdW1uLmFycm93QmVmb3JlXHJcblx0XHR9LCBjb2x1bW4uY2VsbE5nQ2xhc3MgPyBjb2x1bW4uY2VsbE5nQ2xhc3Mocm93LCB0aGlzLmNvbnRleHQpIDoge30pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9nIHRvIGNvbnNvbGVcclxuXHQgKiBAcGFyYW0gbWVzc2FnZSBcclxuXHQgKiBAcGFyYW0gb3B0aW9uYWxQYXJhbXMgXHJcblx0ICovXHJcblx0cHVibGljIGxvZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xyXG5cdFx0Y29uc29sZS5sb2cobWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxyXG5cdCAqIGRlZmF1bHQgY2hhbmdlIGRldGVjdG9yIGhhcyBjb21wbGV0ZWQgb25lIGNoYW5nZS1jaGVjayBjeWNsZVxyXG5cdCAqIGZvciBhIGNvbXBvbmVudCdzIHZpZXcuXHJcblx0ICovXHJcblx0bmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0fVxyXG59IiwiPGRpdiBjbGFzcz1cImxvYWRpbmctcHJvZ3Jlc3NcIiAqbmdJZj1cIiFzdGF0aWNcIj5cclxuXHQ8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiZGF0YVNvdXJjZT8uaXNMb2FkaW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gI3JlZ2lvbiBEYXRhIHRhYmxlIC0tPlxyXG48dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW2RhdGFTb3VyY2VGaWx0ZXJdPVwiZGF0YVNvdXJjZUZpbHRlclwiIFtuZ0NsYXNzXT1cInsndGFibGUtZml4ZWQnOiAhZGV0YWlsc1RlbXBsYXRlICYmICF0ZW1wbGF0ZVJlZn1cIiBbdHJhY2tCeV09XCJ0cmFja0J5XCIgbWF0U29ydCBtYXRTb3J0RGlzYWJsZUNsZWFyIFttYXRTb3J0QWN0aXZlXT1cInNvcnRBY3RpdmV8fCdpZCdcIiBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCIgbXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxyXG5cdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jOyB0cmFja0J5OmNvbHVtbnNUcmFja0J5XCI+XHJcblx0XHQ8IS0tICNyZWdpb24gQ29sdW1uIGRlZiAtLT5cclxuXHRcdDxuZy1jb250YWluZXIgW2Nka0NvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiIFtzdGlja3ldPVwiY29sdW1uLnN0aWNreVwiIFtzdGlja3lFbmRdPVwiY29sdW1uLnN0aWNreUVuZFwiPlxyXG5cdFx0XHQ8dGggbWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIFttYXQtc29ydC1oZWFkZXJdPVwiY29sdW1uLnNvcnRCeSB8fCBjb2x1bW4ubmFtZVwiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIiBbZGlzYWJsZWRdPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5DaGVja2JveCB8fCBjb2x1bW4uZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7J2d0LXhzJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YcywgJ2d0LXNtJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5TbSwgJ2d0LW1kJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5NZCwgJ2d0LWxnJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5MZywgJ2d0LXhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YbCwgJ2d0LXh4bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHhsLCAnaGlkZGVuJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5Ob25lfVwiIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5hcnJvd0JlZm9yZT8nYmVmb3JlJzonYWZ0ZXInXCI+XHJcblx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQ2hlY2tib3hcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2UudG9nZ2xlU2VsZWN0KCRldmVudCwgc2VsZWN0QWxsRmlsdGVyKSA6IG51bGxcIiBbZGlzYWJsZWRdPVwiIWRhdGFTb3VyY2UucGFnaW5hdG9yPy5sZW5ndGhcIiBbY2hlY2tlZF09XCJkYXRhU291cmNlLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkgJiYgZGF0YVNvdXJjZS5pc0FsbFNlbGVjdGVkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJkYXRhU291cmNlLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkgJiYgIWRhdGFTb3VyY2UuaXNBbGxTZWxlY3RlZCgpXCI+PC9tYXQtY2hlY2tib3g+XHJcblx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSAhPSBDb2x1bW5UeXBlLkNoZWNrYm94XCI+e3tjb2x1bW4uaGVhZGVyIHwgZnVuYzpjb250ZXh0fX08L3NwYW4+XHJcblx0XHRcdDwvdGg+XHJcblxyXG5cdFx0XHQ8dGQgbWF0LWNlbGwgKmNka0NlbGxEZWY9XCJsZXQgcm93OyBsZXQgcm93SW5kZXggPSBkYXRhSW5kZXhcIiBbbWF0VG9vbHRpcF09XCJjb2x1bW4udG9vbHRpcD9jb2x1bW4udG9vbHRpcChyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIFttYXRUb29sdGlwQ2xhc3NdPVwiY29sdW1uLnRvb2x0aXBDbGFzcz8/JydcIiBbaGlkZGVuXT1cImNvbHVtbi5oaWRkZW5cIiBbbmdDbGFzc109XCJnZXRSb3dDbGFzc2VzKGNvbHVtbiwgcm93KVwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgI3Jvd1ZhbCBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dWYWxcIiBsZXQtcm93VmFsdWUgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNvbHVtbj8uY29udGVudCAmJiBjb2x1bW4/LmNvbnRlbnQocm93LCB1bmRlZmluZWQsIGNvbnRleHQpfVwiPlxyXG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIENoZWNrYm94IGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5DaGVja2JveFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2Uuc2VsZWN0aW9uTW9kZWwudG9nZ2xlKHJvdykgOiBudWxsXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIEVudW0gY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5FbnVtXCI+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5lbnVtTWV0YWRhdGE7IGVsc2Ugbm9FbnVtTWV0YWRhdGFcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ubXVsdGlwbGU7IGVsc2UgZWxzZVRlbXBsYXRlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzbWFsbCAqbmdJZj1cImk8MlwiPnt7Y29sdW1uLmVudW1NZXRhZGF0YVtpdGVtXS5kaXNwbGF5fX08L3NtYWxsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzbWFsbCAqbmdJZj1cImk9PTEgJiYgcm93VmFsdWU/Lmxlbmd0aCA+IDJcIj4sIC4uLjwvc21hbGw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI2Vsc2VUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJyb3dWYWx1ZSA+PSAwXCIgW2lubmVySHRtbF09XCJjb2x1bW4uZW51bU1ldGFkYXRhW3Jvd1ZhbHVlXS5kaXNwbGF5XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI25vRW51bU1ldGFkYXRhPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5tdWx0aXBsZTsgZWxzZSBlbHNlVGVtcGxhdGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb3dWYWx1ZTsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaTwyXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e2l0ZW0gfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeCwgc2VsZWN0LCB0eXBlIHt0eXBlfSBvdGhlciB7e3tpdGVtIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXh9fX19PC9zbWFsbD48c21hbGwgKm5nSWY9XCJpPT0xICYmIHJvd1ZhbHVlPy5sZW5ndGggPiAyXCI+LCAuLi48L3NtYWxsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNlbHNlVGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwicm93VmFsdWUgPj0gMFwiIGkxOG49XCJAQHNlbGVjdGlvblwiPntyb3dWYWx1ZSB8IGVudW06Y29sdW1uLmVudW1UeXBlOmNvbHVtbi5lbnVtUHJlZml4LCBzZWxlY3QsIHR5cGUge3R5cGV9IG90aGVyIHt7e3Jvd1ZhbHVlIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXh9fX19PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjcmVjdXJzaXZlQ29udGFpbmVyIGxldC1jb2x1bW5OYW1lU2VnbWVudHM9XCJzZWdtZW50c1wiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIiBsZXQtcGFyZW50Rm9ybUdyb3VwPVwicGFyZW50Rm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1Hcm91cFwiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8IS0tIElmIHRoZSBjb2x1bW5OYW1lU2VnbWVudHMgYXJyYXkgaXMgZW1wdHksIHdlJ3JlIGF0IHRoZSBsZWFmIG5vZGUgLS0+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbk5hbWVTZWdtZW50cy5sZW5ndGg7IGVsc2Ugbm90TGFzdFNlZ21lbnRcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRvZ2dsZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVG9nZ2xlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2UocGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXAsIGNvbnRleHQpOmhhbmRsZU1vZGVsQ2hhbmdlKGNvbHVtbiwgcGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXApXCIgW2Rpc2FibGVDb250cm9sXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KSkpXCIgY29sb3I9XCJhY2NlbnRcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBJbnB1dCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5UZXh0SW5wdXRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXBcIiB0eXBlPVwie3tjb2x1bW4uaW5wdXRUeXBlfX1cIiBhdXRvY29tcGxldGU9XCJub25lXCIgW2Rpc2FibGVDb250cm9sXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KSkpXCIgW21pbl09XCJjb2x1bW4uaW5wdXRNaW4/Y29sdW1uLmlucHV0TWluKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KTpudWxsXCIgW21heF09XCJjb2x1bW4uaW5wdXRNYXg/Y29sdW1uLmlucHV0TWF4KHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KTpudWxsXCIgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlS2V5ZG93bkVudGVyKCRldmVudClcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFZELVNlbGVjdCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHZkLXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwXCIgW2VudW1dPVwiY29sdW1uLmVudW1UeXBlXCIgW2VudW1NZXRhZGF0YV09XCJjb2x1bW4uZW51bU1ldGFkYXRhXCIgW2VudW1GaWx0ZXJdPVwiY29sdW1uLmVudW1GaWx0ZXIgfCBmdW5jOnBhcmVudEZvcm1Hcm91cC52YWx1ZTpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW2RlZmF1bHRPcHRpb25dPVwiY29sdW1uLmRlZmF1bHRPcHRpb24/P3RydWVcIiBbZGlzYWJsZUNvbnRyb2xdPVwicmVhZG9ubHkgfHwgKGNvbHVtbi5kaXNhYmxlZCB8fCAoY29sdW1uLmRpc2FibGUgJiYgY29sdW1uLmRpc2FibGUocGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXAsIGNvbnRleHQpKSlcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cImNvbHVtbi5jaGFuZ2U/Y29sdW1uLmNoYW5nZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6cGF0Y2gocGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBbY29sdW1uLm5hbWVdLCByb3dWYWx1ZSwgY29sdW1uLnBhdGNoSW5jbHVkZXMpXCIgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlS2V5ZG93bkVudGVyKCRldmVudClcIj48L3ZkLXNlbGVjdD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI25vdExhc3RTZWdtZW50PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIElmIG5vdCB0aGUgbGFzdCBzZWdtZW50LCBjcmVhdGUgYSBuZXN0ZWQgZm9ybSBncm91cCAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwTmFtZV09XCJjb2x1bW5OYW1lU2VnbWVudHNbMF1cIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIFJlY3Vyc2l2ZSBjYWxsIHRvIGhhbmRsZSBuZXN0ZWQgc2VnbWVudHMgLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW5OYW1lU2VnbWVudHMuc2xpY2UoMSksIHBhcmVudEZvcm1Hcm91cDpmb3JtR3JvdXAsIGZvcm1Hcm91cDogZm9ybUdyb3VwLmdldChjb2x1bW5OYW1lU2VnbWVudHNbMF0pfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVG9nZ2xlIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5Ub2dnbGVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvcm1BcnJheVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1zbGlkZS10b2dnbGUgW25nTW9kZWxdPVwicm93IHwgcHJvcGVydHk6Y29sdW1uLm5hbWVcIiAobmdNb2RlbENoYW5nZSk9XCJzZXROZXN0ZWRQcm9wZXJ0eShyb3csIGNvbHVtbi5uYW1lLCAhJGV2ZW50KTtoYW5kbGVNb2RlbENoYW5nZShjb2x1bW4sIHJvdywgdW5kZWZpbmVkKTtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIGNvbG9yPVwiYWNjZW50XCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXlcIiBbZm9ybUdyb3VwXT1cIiRhbnkoZm9ybUFycmF5LmNvbnRyb2xzKVtyb3dJbmRleF0gfCBmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVjdXJzaXZlQ29udGFpbmVyXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWdtZW50czogY29sdW1uLm5hbWUuc3BsaXQoJy4nKSwgZm9ybUdyb3VwOiBmb3JtQXJyYXkuY29udHJvbHNbcm93SW5kZXhdfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIERhdGUgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5EYXRlXCI+e3tyb3dWYWx1ZSB8IGRhdGU6Y29sdW1uLnNob3J0RGF0ZT8nZGQuTU0ueXl5eSc6J2RkLk1NLnl5eXkgSEg6bW06c3MnfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBUZXh0IElucHV0IGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5UZXh0SW5wdXRcIj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhZm9ybUFycmF5XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGlucHV0IG1hdElucHV0ICpuZ0lmPVwiIWZvcm1BcnJheVwiIHR5cGU9XCJ7e2NvbHVtbi5pbnB1dFR5cGV9fVwiIGF1dG9jb21wbGV0ZT1cIm5vbmVcIiBuYW1lPVwie3tjb2x1bW4ubmFtZX19e3tyb3dJbmRleH19XCIgW25nTW9kZWxdPVwicm93IHwgcHJvcGVydHk6Y29sdW1uLm5hbWVcIiBbZGlzYWJsZWRdPVwicmVhZG9ubHkgfHwgKGNvbHVtbi5kaXNhYmxlZCB8fCAoY29sdW1uLmRpc2FibGUgJiYgY29sdW1uLmRpc2FibGUocm93LCB1bmRlZmluZWQsIGNvbnRleHQpKSlcIiBbbWluXT1cImNvbHVtbi5pbnB1dE1pbj9jb2x1bW4uaW5wdXRNaW4ocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOm51bGxcIiBbbWF4XT1cImNvbHVtbi5pbnB1dE1heD9jb2x1bW4uaW5wdXRNYXgocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOm51bGxcIiAobmdNb2RlbENoYW5nZSk9XCJzZXROZXN0ZWRQcm9wZXJ0eShyb3csIGNvbHVtbi5uYW1lLCAkZXZlbnQpOyhjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2Uocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOnBhdGNoKHJvdywgW2NvbHVtbi5uYW1lXSwgJGV2ZW50LCBjb2x1bW4ucGF0Y2hJbmNsdWRlcykpO1wiIFtuZ01vZGVsT3B0aW9uc109XCJ7dXBkYXRlT246ICdibHVyJ31cIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPlxyXG5cdFx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1BcnJheVwiIFtmb3JtR3JvdXBdPVwiJGFueShmb3JtQXJyYXkuY29udHJvbHMpW3Jvd0luZGV4XSB8IGZvcm1Hcm91cFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW4ubmFtZS5zcGxpdCgnLicpLCBmb3JtR3JvdXA6IGZvcm1BcnJheS5jb250cm9sc1tyb3dJbmRleF19XCI+PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVkQtU2VsZWN0IGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhZm9ybUFycmF5XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PHZkLXNlbGVjdCAqbmdJZj1cIiFmb3JtQXJyYXlcIiBuYW1lPVwie3tjb2x1bW4ubmFtZX19e3tyb3dJbmRleH19XCIgW2VudW1dPVwiY29sdW1uLmVudW1UeXBlXCIgW2VudW1NZXRhZGF0YV09XCJjb2x1bW4uZW51bU1ldGFkYXRhXCIgW2VudW1GaWx0ZXJdPVwiY29sdW1uPy5lbnVtRmlsdGVyICB8IGZ1bmM6cm93OmNvbnRleHRcIiBbcHJlZml4XT1cImNvbHVtbi5lbnVtUHJlZml4XCIgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbZGVmYXVsdE9wdGlvbl09XCJjb2x1bW4uZGVmYXVsdE9wdGlvbj8/dHJ1ZVwiIFtuZ01vZGVsXT1cInJvdyB8IHByb3BlcnR5OmNvbHVtbi5uYW1lXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0TmVzdGVkUHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSwgJGV2ZW50KTtcIiBbZGlzYWJsZWRdPVwicmVhZG9ubHkgfHwgKGNvbHVtbi5kaXNhYmxlZCB8fCAoY29sdW1uLmRpc2FibGUgJiYgY29sdW1uLmRpc2FibGUocm93LCB1bmRlZmluZWQsIGNvbnRleHQpKSlcIiAoY2hhbmdlKT1cImNvbHVtbi5jaGFuZ2U/Y29sdW1uLmNoYW5nZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6cGF0Y2gocm93LCBbY29sdW1uLm5hbWVdLCAkZXZlbnQudmFsdWUsIGNvbHVtbi5wYXRjaEluY2x1ZGVzKVwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+PC92ZC1zZWxlY3Q+XHJcblx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5XCIgW2Zvcm1Hcm91cF09XCIkYW55KGZvcm1BcnJheS5jb250cm9scylbcm93SW5kZXhdIHwgZm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJlY3Vyc2l2ZUNvbnRhaW5lclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7c2VnbWVudHM6IGNvbHVtbi5uYW1lLnNwbGl0KCcuJyksIGZvcm1Hcm91cDogZm9ybUFycmF5LmNvbnRyb2xzW3Jvd0luZGV4XX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gLS0+XHJcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuQWN0aW9uXCI+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5tZW51XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWVudS17e3Jvdy5pZH19XCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvc2l0aW9uOiBmaXhlZDtcIiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudS5tYXRNZW51IVwiICpuZ0lmPVwibWVudT8ubWF0TWVudSAmJiAhcm93LmxvY2tlZCAmJiBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdywgY29sdW1uKVwiPjwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0PHZkLWR5bmFtaWMtbWVudSBbaXRlbXNdPVwiW2NvbHVtbi5tZW51XVwiIFtkYXRhXT1cInJvd1wiIFtjb250ZXh0XT1cImNvbnRleHRcIiAjbWVudT48L3ZkLWR5bmFtaWMtbWVudT5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBNZW51IC0tPlxyXG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm1lbnVcIj5cclxuXHRcdFx0XHRcdFx0XHQ8dmQtZHluYW1pYy1tZW51ICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLk1lbnVcIiBbaXRlbXNdPVwiW2NvbHVtbi5tZW51XVwiIFtkYXRhXT1cInJvd1wiIFtjb250ZXh0XT1cImNvbnRleHRcIj48L3ZkLWR5bmFtaWMtbWVudT5cclxuXHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBpY29uIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5JY29uXCIgbGF5b3V0PVwicm93XCIgbGF5b3V0LWFsaWduPVwic3RhcnQgY2VudGVyXCI+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/Lm1hdEljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIj57e2hhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/Lm1hdEljb24hLCByb3cpfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtaWNvbiAqbmdJZj1cImNvbHVtbi5pY29uPy5zdmdJY29uXCIgZm9udFNldD1cInt7Y29sdW1uLmljb24/LmZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uY3NzQ2xhc3M/PycnLCByb3cpXCIgW3N2Z0ljb25dPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uc3ZnSWNvbiEsIHJvdykhXCI+PC9tYXQtaWNvbj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvbj8uZm9udEljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIiBbZm9udEljb25dPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uZm9udEljb24hLCByb3cpIVwiPjwvbWF0LWljb24+XHJcblx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIGljb24gYnV0dG9uIC0tPlxyXG5cdFx0XHRcdFx0XHQ8YSBtYXQtaWNvbi1idXR0b24gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvbkJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29sdW1uLmljb25CdXR0b24/LmV2ZW50P2NvbHVtbi5pY29uQnV0dG9uPy5ldmVudChyb3csIGNvbnRleHQpOm51bGxcIj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWljb24gZm9udFNldD1cInt7Y29sdW1uLmljb25CdXR0b24/Lmljb25Gb250U2V0IHx8ICdtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkJ319XCIgW2NsYXNzXT1cImhhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb25CdXR0b24/Lmljb25DbGFzcz8/JycsIHJvdylcIj57e2hhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb25CdXR0b24/Lmljb24/PydyYWRpb19idXR0b25fY2hlY2tlZCcsIHJvdykgfHwgJ3JhZGlvX2J1dHRvbl9jaGVja2VkJ319PC9tYXQtaWNvbj5cclxuXHRcdFx0XHRcdFx0PC9hPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gT3RoZXIgY29sdW1uIHR5cGVzIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IFtpbm5lckh0bWxdPVwicm93VmFsdWU/PycnXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHQ8L3RkPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBGaWx0ZXIgcm93IC0tPlxyXG5cdDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhU291cmNlICYmIGZpbHRlcmFibGVcIj5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHRcdDxuZy1jb250YWluZXIgY2RrQ29sdW1uRGVmPVwiZmlsdGVyLnt7Y29sdW1uLmZpbHRlciB8fCBjb2x1bW4ubmFtZX19XCI+XHJcblx0XHRcdFx0PHRoIG1hdC1oZWFkZXItY2VsbCAqY2RrSGVhZGVyQ2VsbERlZiBbaGlkZGVuXT1cImNvbHVtbi5oaWRkZW5cIiBbbmdTdHlsZV09XCJ7bWF4V2lkdGg6Y29sdW1uLm1heFdpZHRoPyhjb2x1bW4ubWF4V2lkdGgrKGNvbHVtbi5tYXhXaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsbWluV2lkdGg6Y29sdW1uLm1pbldpZHRoPyhjb2x1bW4ubWluV2lkdGgrKGNvbHVtbi5taW5XaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsd2lkdGg6Y29sdW1uLndpZHRoPyhjb2x1bW4ud2lkdGgrKGNvbHVtbi53aWR0aFVuaXQgfHwgJ3B4JykpOm51bGx9XCIgW25nQ2xhc3NdPVwieydndC14cyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHMsICdndC1zbSc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuU20sICdndC1tZCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTWQsICdndC1sZyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTGcsICdndC14bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWGwsICdndC14eGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlh4bCwgJ2hpZGRlbic6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTm9uZX1cIj5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBTZWxlY3QgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCIoY29sdW1uLmVuZHBvaW50IHx8IGNvbHVtbi5lbnVtVHlwZSB8fCBjb2x1bW4ub3B0aW9ucykgZWxzZSBub3RTZWxlY3RGaWx0ZXJcIiBmaWx0ZXItc2VsZWN0IFtlbmRwb2ludF09XCJjb2x1bW4uZW5kcG9pbnRcIiBbZW51bV09XCJjb2x1bW4uZW51bVR5cGVcIiBbZW51bU1ldGFkYXRhXT1cImNvbHVtbi5lbnVtTWV0YWRhdGFcIiBbZW51bUZpbHRlcl09XCJjb2x1bW4uZW51bUZpbHRlciB8IGZ1bmM6e306Y29udGV4dFwiIFtwcmVmaXhdPVwiY29sdW1uLmVudW1QcmVmaXhcIiBbb3B0aW9uc109XCJjb2x1bW4ub3B0aW9uc1wiIFt0ZXh0XT1cImNvbHVtbi5maWx0ZXJPcHRpb25UZXh0IHx8ICduYW1lJ1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBmaWx0ZXIgLS0+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI25vdFNlbGVjdEZpbHRlcj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJub3RTZWxlY3RGaWx0ZXIgJiYgKGNvbHVtbi50eXBlID09IENvbHVtblR5cGUuVGV4dCB8fCBjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLlRleHRJbnB1dCB8fCBjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLk51bWJlcikgZWxzZSBub3RJbnB1dEZpbHRlclwiIGZpbHRlci1pbnB1dCBbb25seU51bWJlcl09XCJjb2x1bW4uZmlsdGVySW5wdXROdW1iZXI/P2ZhbHNlXCIgW29wZXJhdG9yXT1cImNvbHVtbi5maWx0ZXJPcGVyYXRvclwiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIERhdGUgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RJbnB1dEZpbHRlcj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkRhdGUgZWxzZSBub3REYXRlRmlsdGVyXCIgZmlsdGVyLWRhdGU+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gQWN0aW9uIGZpbHRlciAoY2xlYXIpIC0tPlxyXG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3REYXRlRmlsdGVyPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQWN0aW9uXCIgZmlsdGVyLWNsZWFyPjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0XHRcdFx0PC90aD5cclxuXHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHQ8L25nLWNvbnRhaW5lcj5cclxuXHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBEZXRhaWxzIGNvbHVtbiAtLT5cclxuXHQ8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XHJcblx0XHQ8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleFwiIFthdHRyLmNvbHNwYW5dPVwiKGRpc3BsYXllZENvbHVtbnMkIHwgYXN5bmMpPy5sZW5ndGhcIj5cclxuXHRcdFx0PGRpdiBjbGFzcz1cInJvdy1kZXRhaWxcIiBbQGRldGFpbEV4cGFuZF09XCJyb3cgPT0gZXhwYW5kZWRSb3cgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCdcIiAjZGV0YWlsc1RlbXBsYXRlPlxyXG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZVJlZiAmJiByb3cgPT09IGV4cGFuZGVkUm93XCI+XHJcblx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVSZWY7IGNvbnRleHQ6e3Jvdzogcm93LCBpbmRleDogaW5kZXgsIGNvbnRleHQ6IGNvbnRleHR9XCI+PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC90ZD5cclxuXHQ8L25nLWNvbnRhaW5lcj5cclxuXHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBGaWx0ZXIgaGVhZGVyIC0tPlxyXG5cdDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJhYmxlXCI+XHJcblx0XHQ8dHIgbWF0LWhlYWRlci1yb3cgKmNka0hlYWRlclJvd0RlZj1cImRpc3BsYXllZEZpbHRlckNvbHVtbnMkIHwgYXN5bmNcIj48L3RyPlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0PHRyIG1hdC1oZWFkZXItcm93ICpjZGtIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJCB8IGFzeW5jOyBzdGlja3k6IHN0aWNreUZpbHRlclwiPjwvdHI+XHJcblx0PHRyIG1hdC1yb3cgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnMkIHwgYXN5bmM7IGxldCBpbmRleCA9IGRhdGFJbmRleFwiIFtuZ0NsYXNzXT1cInJvd05nQ2xhc3M/cm93TmdDbGFzcyhyb3csIGNvbnRleHQpOm51bGxcIiBbY2xhc3MuZXhwYW5kZWQtcm93XT1cImV4cGFuZGVkUm93ID09PSByb3dcIiAoY2xpY2spPVwiaGFuZGxlUm93Q2xpY2soaW5kZXgsIHJvdylcIiAoY29udGV4dG1lbnUpPVwiaGFuZGxlUm93UmlnaHRDbGljaygkZXZlbnQsIHJvdylcIj48L3RyPlxyXG5cclxuXHQ8IS0tICNyZWdpb24gRGV0cmFpbHMgcm93IC0tPlxyXG5cdDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxzVGVtcGxhdGUgfHwgdGVtcGxhdGVSZWZcIj5cclxuXHRcdDx0ciBtYXQtcm93ICpjZGtSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2V4cGFuZGVkRGV0YWlsJ11cIiBjbGFzcz1cImRldGFpbC1yb3dcIiBbbmdDbGFzc109XCJyb3dOZ0NsYXNzP3Jvd05nQ2xhc3Mocm93LCBjb250ZXh0KTpudWxsXCI+PC90cj5cclxuXHQ8L25nLWNvbnRhaW5lcj5cclxuXHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcbjwvdGFibGU+XHJcbjwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbjwhLS0gI3JlZ2lvbiBSb3cgc2hvd24gd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBkYXRhLi0tPlxyXG48ZGl2IGNsYXNzPVwibWF0LWNlbGwgcGFkIHRhYmxlLWVtcHR5IHR4dC1pdGFsaWNcIiAqbmdJZj1cIiFkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCAmJiAhZGF0YVNvdXJjZT8udG90YWxcIiBpMThuPVwiQEBub1Jlc3VsdHNGb3VuZFwiPk5vIHJlc3VsdHMgd2VyZSBmb3VuZC48L2Rpdj5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPCEtLSAjcmVnaW9uIERlYnVnIHZhbHVlIC0tPlxyXG48Y29kZSAqbmdJZj1cImRlYnVnVmFsdWVcIj5cclxuXHQ8cHJlPnt7Zm9ybVZhbHVlIHwganNvbn19PC9wcmU+XHJcbjwvY29kZT5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPGRpdiBjbGFzcz1cInRhYmxlLWZvb3RlclwiIGxheW91dD1cInJvd1wiPlxyXG5cdDxuZy1jb250ZW50IHNlbGVjdD1cIlt0YWJsZS1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxyXG5cdDxzcGFuIGZsZXg+PC9zcGFuPlxyXG5cdDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hYmxlXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz1cInRydWVcIj48L21hdC1wYWdpbmF0b3I+XHJcbjwvZGl2PiJdfQ==
|
|
607
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JNLE9BQU8sRUFBYSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztB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QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPcEQsV0FBVztzQkFEakIsWUFBWTt1QkFBQyxXQUFXO2dCQU9sQixVQUFVO3NCQURoQixLQUFLO2dCQU9GLElBQUk7c0JBRFAsS0FBSztnQkFrQkssU0FBUztzQkFEbkIsS0FBSztnQkF1QkMsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0MsT0FBTztzQkFEYixLQUFLO2dCQU9DLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFPQyxNQUFNO3NCQURaLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxVQUFVO3NCQURoQixLQUFLO2dCQU9DLGFBQWE7c0JBRG5CLEtBQUs7Z0JBT0MsWUFBWTtzQkFEbEIsS0FBSztnQkFPQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLFFBQVE7c0JBRGQsTUFBTTtnQkFPQSxVQUFVO3NCQURoQixLQUFLO2dCQU9DLGVBQWU7c0JBRHJCLEtBQUs7Z0JBWUYsUUFBUTtzQkFEWCxLQUFLO2dCQVVDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBT0MsT0FBTztzQkFEYixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBWWhDLFNBQVM7c0JBRFosU0FBUzt1QkFBQyxZQUFZO2dCQWdCbkIsT0FBTztzQkFEVixLQUFLO2dCQTRCQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkFPQyxlQUFlO3NCQURyQixLQUFLO2dCQU9DLHNCQUFzQjtzQkFENUIsWUFBWTt1QkFBQyxjQUFjO2dCQXNCckIsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLGVBQWU7c0JBRHJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBBVVRPX1NUWUxFLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTb3J0LCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdFRhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlscyc7XHJcbmltcG9ydCB7IER5bmFtaWNCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2hlbHBlcnMvZHluYW1pYy1idWlsZGVyJztcclxuaW1wb3J0IHsgQWN0aW9uSXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9tb2RlbHMvYWN0aW9uLWl0ZW0nO1xyXG5pbXBvcnQgeyBHcmlkIH0gZnJvbSAnLi4vLi4vZW51bXMvZ3JpZCc7XHJcbmltcG9ydCB7IFRhYmxlQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3RhYmxlLWNvbHVtbi10eXBlJztcclxuaW1wb3J0IHsgZ2V0VGFibGVEZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL2Z1bmN0aW9ucyc7XHJcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLWNvbHVtbic7XHJcbmltcG9ydCB7IFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL3RhYmxlLmRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgVGFibGVTdGF0aWNEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUuc3RhdGljLWRhdGEtc291cmNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAndmQtZHluYW1pYy10YWJsZScsXHJcblx0dGVtcGxhdGVVcmw6ICdkeW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnZHluYW1pYy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG5cdGFuaW1hdGlvbnM6IFtcclxuXHRcdHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcclxuXHRcdFx0c3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JywgbWluSGVpZ2h0OiAnMCcgfSkpLFxyXG5cdFx0XHRzdGF0ZSgnZXhwYW5kZWQnLCBzdHlsZSh7IGhlaWdodDogQVVUT19TVFlMRSB9KSksXHJcblx0XHRcdHRyYW5zaXRpb24oJ2V4cGFuZGVkIDw9PiBjb2xsYXBzZWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSksXHJcblx0XHRdKSxcclxuXHRdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmREeW5hbWljVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xyXG5cdC8qKlxyXG5cdCAqIGRldGFpbHNUZW1wbGF0ZTogVmlld0NvbnRhaW5lclJlZlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoJ3RhYmxlJylcclxuXHRwdWJsaWMgdGFibGU/OiBNYXRUYWJsZTxhbnk+O1xyXG5cclxuXHQvKipcclxuXHQgKiBkZXRhaWxzVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWZcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdkZXRhaWxzVGVtcGxhdGUnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuXHRwdWJsaWMgZGV0YWlsc1RlbXBsYXRlUmVmPzogUXVlcnlMaXN0PGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGFpbHMgdGVtcGxhdGVcclxuXHQgKi9cclxuXHRAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKVxyXG5cdHB1YmxpYyB0ZW1wbGF0ZVJlZj86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdGEtdGFibGUgZGF0YXNvdXJjZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRhdGFTb3VyY2U6IFRhYmxlRGF0YVNvdXJjZTxhbnksIGFueT4gfCBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRhYmxlIGRhdGFcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHNldCBkYXRhKGRhdGE6IGFueSkge1xyXG5cdFx0dGhpcy5kYXRhU291cmNlID0gbmV3IFRhYmxlU3RhdGljRGF0YVNvdXJjZShkYXRhKTtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5tYXRTb3J0O1xyXG5cdFx0dGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMuX3BhZ2luYXRvcjtcclxuXHRcdHRoaXMucGFnaW5hYmxlID0gdHJ1ZTtcclxuXHRcdHRoaXMuc3RhdGljID0gdHJ1ZTtcclxuXHR9O1xyXG5cclxuXHQvKipcclxuXHQgKiBAcHJvcGVydHlcclxuXHQgKi9cclxuXHRwdWJsaWMgX2Zvcm1BcnJheT86IEZvcm1BcnJheTtcclxuXHJcblx0LyoqXHJcblx0ICogQHByb3BlcnR5XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGZvcm1BcnJheSgpOiBGb3JtQXJyYXkgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZm9ybUFycmF5OyB9XHJcblx0cHVibGljIHNldCBmb3JtQXJyYXkoZm9ybUFycmF5OiBGb3JtQXJyYXkpIHtcclxuXHRcdHRoaXMuX2Zvcm1BcnJheSA9IGZvcm1BcnJheTtcclxuXHRcdHRoaXMuZGF0YSA9IHRoaXMuX2Zvcm1BcnJheT8udmFsdWU7XHJcblxyXG5cdFx0LyogVXBkYXRlIHRhYmxlIGRhdGEgKi9cclxuXHRcdHRoaXMuX2Zvcm1BcnJheT8udmFsdWVDaGFuZ2VzPy5zdWJzY3JpYmUoeCA9PiB7XHJcblx0XHRcdGlmICh4Lmxlbmd0aCAhPT0gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5sZW5ndGgpIHtcclxuXHRcdFx0XHR0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuX2Zvcm1BcnJheT8udmFsdWU7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRm9ybSByYXcgdmFsdWVcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0IGZvcm1WYWx1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5mb3JtQXJyYXk/LmdldFJhd1ZhbHVlKCk7IH1cclxuXHJcblx0LyoqXHJcblx0ICogZGVidWdWYWx1ZTogYm9vbGVhblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRlYnVnVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQ2xhc3MgdHlwZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNsYXNzVHlwZTogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBDdXJyZW50IGNvbnRleHQgXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgY29udGV4dDogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBkYXRhU291cmNlRmlsdGVyOiBhbnlcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkYXRhU291cmNlRmlsdGVyOiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogU3RhdGljIHRhYmxlXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RhdGljOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGZpbHRlcmFibGU/XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZmlsdGVyYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHBhZ2luYWJsZT9cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdpbmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogU2hvd3MgdGhlIGNvbHVtbiAnQ2hlY2tib3gnXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBDdXJyZW50IHNvcnQgY29sdW1uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydEFjdGl2ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBzb3J0IGRpcmVjdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb24gPSAnYXNjJztcclxuXHJcblx0LyoqXHJcblx0ICogU3RpY2t5IGhlYWRlclxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHN0aWNreUhlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0aWNreSBmaWx0ZXJcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGlja3lGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBSb3cgY2xpY2sgZXZlbnRcclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHJvd05nQ2xhc3M6IEZ1bmN0aW9uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TmdDbGFzcz86IEZ1bmN0aW9uO1xyXG5cclxuXHQvKipcclxuXHQgKiBkZXRhaWxzVGVtcGxhdGU6IEZ1bmN0aW9uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGV0YWlsc1RlbXBsYXRlPzogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBfcmVhZG9ubHk6IGJvb2xlYW47XHJcblx0ICovXHJcblx0cHVibGljIF9yZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiByZWFkb25seTogYm9vbGVhbjtcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCByZWFkb25seSgpIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9XHJcblx0c2V0IHJlYWRvbmx5KHJlYWRvbmx5KSB7XHJcblx0XHR0aGlzLl9yZWFkb25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShyZWFkb25seSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBzZWxlY3RBbGxGaWx0ZXI6IEZ1bmN0aW9uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0QWxsRmlsdGVyPzogKHZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIsIGFycmF5OiBhbnlbXSkgPT4gdW5rbm93bjtcclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gTWRTb3J0IGF0dHJpYnV0ZVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwdWJsaWMgbWF0U29ydD86IE1hdFNvcnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9wYWdpbmF0b3I6IE1hdFBhZ2luYXRvclxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3BhZ2luYXRvcj86IE1hdFBhZ2luYXRvcjtcclxuXHJcblx0LyoqXHJcblx0ICogcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3JcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKE1hdFBhZ2luYXRvcilcclxuXHRzZXQgcGFnaW5hdG9yKHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yKSB7XHJcblx0XHRpZiAocGFnaW5hdG9yKSB7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSBwYWdpbmF0b3I7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyoqXHJcblx0ICogX2NvbHVtbnM6IFRhYmxlQ29sdW1uW11cclxuXHQgKi9cclxuXHRwcml2YXRlIF9jb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNvbHVtbnM6IENvbHVtbltdXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgY29sdW1ucygpOiBUYWJsZUNvbHVtbltdIHsgcmV0dXJuIHRoaXMuX2NvbHVtbnM7IH07XHJcblx0c2V0IGNvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5bXSkgeyB0aGlzLl9jb2x1bW5zID0gY29sdW1uczsgfTtcclxuXHJcblx0LyoqXHJcblx0ICogY29sdW1uc1N1YmplY3Q6IFN1YmplY3Q8KFRhYmxlQ29sdW1uIHwgc3RyaW5nKVtdPlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFRhYmxlQ29sdW1uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZUNvbHVtbltdPihbXSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNvbHVtbnMkOiBPYnNlcnZhYmxlPChUYWJsZUNvbHVtbiB8IHN0cmluZylbXT5cclxuXHQgKi9cclxuXHRwdWJsaWMgY29sdW1ucyQ6IE9ic2VydmFibGU8VGFibGVDb2x1bW5bXT4gPSB0aGlzLmNvbHVtbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpOztcclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGxheWVkIGNvbHVtbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgZGlzcGxheWVkQ29sdW1ucyQ/OiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGxheWVkIGZpbHRlciBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZEZpbHRlckNvbHVtbnMkPzogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRhYmxlIHJvdyBtZW51IGl0ZW1zXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TWVudUl0ZW1zOiBBY3Rpb25JdGVtW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogVGFibGUgcm93IGFjdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHJvd0FjdGlvbj86IEFjdGlvbkl0ZW07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbHVtbnMgdG8gZXhjbHVkZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGV4Y2x1ZGVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBNYXRNZW51VHJpZ2dlciBpbiB0aGUgRE9NXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZHJlbihNYXRNZW51VHJpZ2dlcilcclxuXHRwdWJsaWMgcm93Q29udGV4dE1lbnVUcmlnZ2Vycz86IFF1ZXJ5TGlzdDxNYXRNZW51VHJpZ2dlcj47XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbHVtblR5cGU6IENvbHVtblR5cGVcclxuXHQgKi9cclxuXHRwdWJsaWMgQ29sdW1uVHlwZTogdHlwZW9mIFRhYmxlQ29sdW1uVHlwZSA9IFRhYmxlQ29sdW1uVHlwZTtcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIHR5cGUgb2YgdGhlIGVudW0gR3JpZFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBHcmlkOiB0eXBlb2YgR3JpZCA9IEdyaWQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGV4cGFuZGVkUm93OiBhbnlcclxuXHQgKi9cclxuXHRwdWJsaWMgZXhwYW5kZWRSb3c6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogRGVmYXVsdCBwYWdlIHNpemVcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhZ2Ugc2l6ZSBvcHRpb25zXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcGFnZVNpemVPcHRpb25zOiBBcnJheTxudW1iZXI+ID0gWzUsIDEwLCAxNSwgMjAsIDMwLCA1MCwgMTAwLCAyMDBdO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSBkeW5hbWljQnVpbGRlciBcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBkeW5hbWljQnVpbGRlcjogRHluYW1pY0J1aWxkZXIsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxyXG5cdCAqIGRlZmF1bHQgY2hhbmdlIGRldGVjdG9yIGhhcyBjaGVja2VkIHRoZSBkaXJlY3RpdmUnc1xyXG5cdCAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBmb3IgdGhlIGZpcnN0IHRpbWUsXHJcblx0ICogYW5kIGJlZm9yZSBhbnkgb2YgdGhlIHZpZXcgb3IgY29udGVudCBjaGlsZHJlbiBoYXZlIGJlZW4gY2hlY2tlZC5cclxuXHQgKiBJdCBpcyBpbnZva2VkIG9ubHkgb25jZSB3aGVuIHRoZSBkaXJlY3RpdmUgaXMgaW5zdGFudGlhdGVkLlxyXG5cdCAqL1xyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuY2xhc3NUeXBlKSB7XHJcblx0XHRcdC8qIEdldCB0aGUgdGFibGUgZGVmaW5pdGlvbiB1c2luZyB0aGUgY2xhc3MgdHlwZSAqL1xyXG5cdFx0XHR2YXIgdGFibGVEZWZpbml0aW9uID0gZ2V0VGFibGVEZWZpbml0aW9uKHRoaXMuY2xhc3NUeXBlKTtcclxuXHRcdFx0aWYgKHRhYmxlRGVmaW5pdGlvbikge1xyXG5cdFx0XHRcdHRoaXMuY29sdW1ucyA9IFsuLi50YWJsZURlZmluaXRpb24hLmNvbHVtbnMgPz8gW11dO1xyXG5cdFx0XHRcdGlmICh0aGlzLnJvd01lbnVJdGVtcz8ubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0LyogQ2hlY2sgaWYgdGhlIGFjdGlvbiBjb2x1bW4gYWxyZWFkeSBleGlzdHMgKi9cclxuXHRcdFx0XHRcdHZhciBhY3Rpb25Db2xtdW4gPSB0aGlzLl9jb2x1bW5zPy5maW5kKHggPT4geC5uYW1lID09ICdhY3Rpb24nKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiBzbywganVzdCBhZGQgdGhlIG1lbnUgaXRlbXMgdG8gaXQgKi9cclxuXHRcdFx0XHRcdGlmIChhY3Rpb25Db2xtdW4gIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRhY3Rpb25Db2xtdW4ubWVudSB8fD0geyBpY29uOiAnbW9yZV92ZXJ0JyB9O1xyXG5cdFx0XHRcdFx0XHR0aGlzLnJvd01lbnVJdGVtcy5mb3JFYWNoKHkgPT4gYWN0aW9uQ29sbXVuIS5tZW51IS5pdGVtcz8udW5zaGlmdCh5KSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogT3RoZXJ3aXNlIGFkZCBhIG5ldyBvbmUgKi9cclxuXHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR0aGlzLl9jb2x1bW5zLnB1c2gobmV3IFRhYmxlQ29sdW1uKHtcclxuXHRcdFx0XHRcdFx0XHRpbmRleDogMjAwMCxcclxuXHRcdFx0XHRcdFx0XHRuYW1lOiAnYWN0aW9uJyxcclxuXHRcdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQWN0aW9uLFxyXG5cdFx0XHRcdFx0XHRcdGRpc2FibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdG1lbnU6IHsgaWNvbjogJ21vcmVfdmVydCcsIGl0ZW1zOiB0aGlzLnJvd01lbnVJdGVtcyB9LFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2VcclxuXHRcdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5yb3dBY3Rpb24pIHtcclxuXHRcdFx0XHRcdHRoaXMuX2NvbHVtbnMucHVzaChuZXcgVGFibGVDb2x1bW4oe1xyXG5cdFx0XHRcdFx0XHRpbmRleDogMjAwMCxcclxuXHRcdFx0XHRcdFx0bmFtZTogJ2FjdGlvbicsXHJcblx0XHRcdFx0XHRcdHR5cGU6IFRhYmxlQ29sdW1uVHlwZS5BY3Rpb24sXHJcblx0XHRcdFx0XHRcdGRpc2FibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRtZW51OiB0aGlzLnJvd0FjdGlvbixcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZVxyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogQWRkIGNoZWNrYm94IGNvbHVtbiAqL1xyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29sdW1ucy51bnNoaWZ0KG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdG5hbWU6ICdzZWxlY3QnLFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQ2hlY2tib3gsXHJcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2VcclxuXHRcdFx0XHRcdH0pKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKiBCdWlsZCBkaXNwbGF5ZWQgY29sdW1ucyAmIGZpbHRlciAqL1xyXG5cdFx0dGhpcy5jb2x1bW5zJD8uc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHR0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gb2YodGhpcy5jb2x1bW5zPy5maWx0ZXIoeCA9PiAhdGhpcy5leGNsdWRlZENvbHVtbnM/LmluY2x1ZGVzKHgubmFtZSkpPy5tYXAoYyA9PiBjLm5hbWUpKTtcclxuXHRcdFx0dGhpcy5kaXNwbGF5ZWRGaWx0ZXJDb2x1bW5zJCA9IG9mKHRoaXMuY29sdW1ucz8uZmlsdGVyKHggPT4gIXRoaXMuZXhjbHVkZWRDb2x1bW5zPy5pbmNsdWRlcyh4Lm5hbWUpKT8ubWFwKGMgPT4gYGZpbHRlci4keyhjLmZpbHRlciB8fCBjLm5hbWUpfWApKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8qIFNldCB0aGUgdGFibGUgY29sdW1ucyAqL1xyXG5cdFx0dGhpcy51cGRhdGVDb2x1bW5zKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB0YWJsZSBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIHVwZGF0ZUNvbHVtbnMoKTogdm9pZCB7XHJcblx0XHQvKiBTb3J0IHRoZSBjb2x1bW5zIGJ5IGluZGV4ICovXHJcblx0XHRVdGlscy5zb3J0QXJyYXkodGhpcy5jb2x1bW5zIHx8IFtdLCAnaW5kZXgnKTtcclxuXHJcblx0XHQvKiBUcmlnZ2VyIGNoYW5nZXMgKi9cclxuXHRcdHRoaXMuY29sdW1uc1N1YmplY3QubmV4dCh0aGlzLmNvbHVtbnMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ291bnRzIHZpc2libGUgYWN0aW9uIG1lbnVzXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdzogYW55LCBjb2x1bW46IFRhYmxlQ29sdW1uKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gKGNvbHVtbj8ucm93TWVudUl0ZW1zPy5maWx0ZXIoeCA9PiAheC5oaWRlIHx8ICF4LmhpZGUocm93KSk/Lmxlbmd0aCA/PyAtMSkgPiAwO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBmdW5jdGlvbiB0byB0byBjb21wdXRlIHRoZSBpZGVudGl0eSBvZiBpdGVtcyBpbiBhbiBpdGVyYWJsZS5cclxuXHQgKiBAcGFyYW0gaW5kZXggXHJcblx0ICogQHBhcmFtIGl0ZW0gXHJcblx0ICovXHJcblx0cHVibGljIHRyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBgJHtpdGVtLmlkfWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGZ1bmN0aW9uIHRvIHRvIGNvbXB1dGUgdGhlIGlkZW50aXR5IG9mIGl0ZW1zIGluIGFuIGl0ZXJhYmxlLlxyXG5cdCAqIEBwYXJhbSBpbmRleCBcclxuXHQgKiBAcGFyYW0gaXRlbSBcclxuXHQgKi9cclxuXHRwdWJsaWMgY29sdW1uc1RyYWNrQnkoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBpdGVtLm5hbWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIHJvdyBjbGljayBldmVudFxyXG5cdCAqIEBwYXJhbSBpbmRleCBcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVSb3dDbGljayhpbmRleDogYW55LCByb3c6IGFueSk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMudGVtcGxhdGVSZWYpIHtcclxuXHRcdFx0dGhpcy5leHBhbmRlZFJvdyA9IHRoaXMuZXhwYW5kZWRSb3cgPT09IHJvdyA/IG51bGwgOiByb3c7XHJcblx0XHR9XHJcblx0XHRlbHNlIGlmICh0aGlzLmRldGFpbHNUZW1wbGF0ZSkge1xyXG5cdFx0XHR0aGlzLmV4cGFuZGVkUm93ID0gdGhpcy5leHBhbmRlZFJvdyA9PT0gcm93ID8gbnVsbCA6IHJvdztcclxuXHRcdFx0aWYgKHRoaXMuZGV0YWlsc1RlbXBsYXRlUmVmKSB7XHJcblx0XHRcdFx0dGhpcy5keW5hbWljQnVpbGRlci5jb21waWxlSHRtbCh0aGlzLmRldGFpbHNUZW1wbGF0ZVJlZi5nZXQoaW5kZXgpLCB0aGlzLmRldGFpbHNUZW1wbGF0ZSwgcm93KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTWV0aG9kIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrIHdpdGggdGhlIHJpZ2h0IGJ1dHRvblxyXG5cdCAqIEBwYXJhbSBldmVudCBNb3VzZUV2ZW50LCBpdCBjb250YWlucyB0aGUgY29vcmRpbmF0ZXNcclxuXHQgKiBAcGFyYW0gaXRlbSBPdXIgZGF0YSBjb250YWluZWQgaW4gdGhlIHJvdyBvZiB0aGUgdGFibGVcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlUm93UmlnaHRDbGljayhldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcblx0XHR0aGlzLnJvd0NvbnRleHRNZW51VHJpZ2dlcnM/LnRvQXJyYXkoKT8uZm9yRWFjaCh4ID0+IHguY2xvc2VNZW51KCkpO1xyXG5cdFx0dmFyIG1lbnVUcmlnZ2VyID0gdGhpcy5yb3dDb250ZXh0TWVudVRyaWdnZXJzPy50b0FycmF5KCk/LmZpbHRlcih4ID0+IHhbJ19lbGVtZW50J10/Lm5hdGl2ZUVsZW1lbnQ/LmdldEF0dHJpYnV0ZSgnaWQnKSA9PSBgbWVudS0ke2l0ZW0uaWR9YClbMF07XHJcblx0XHRpZiAobWVudVRyaWdnZXIgIT0gbnVsbCkge1xyXG5cdFx0XHQvKiBBdm9pZHMgdG8gc2hvdyB0aGUgdmlzdWFsaXphdGlvbiBvZiB0aGUgcmlnaHQtY2xpY2sgbWVudSBvZiB0aGUgYnJvd3NlciAqL1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0LyogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSAqL1xyXG5cdFx0XHRtZW51VHJpZ2dlclsnX2VsZW1lbnQnXT8ubmF0aXZlRWxlbWVudD8uc2V0QXR0cmlidXRlKCdzdHlsZScsIGBwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6ICR7ZXZlbnQuY2xpZW50WH1weDsgdG9wOiAke2V2ZW50LmNsaWVudFl9cHhgKTtcclxuXHJcblx0XHRcdC8qIFBhc3MgdG8gdGhlIG1lbnUgdGhlIGN1cnJlbnQgb2JqZWN0ICovXHJcblx0XHRcdG1lbnVUcmlnZ2VyLm1lbnVEYXRhID0geyBpdGVtOiBpdGVtIH1cclxuXHJcblx0XHRcdC8qIE9wZW4gdGhlIG1lbnUgKi9cclxuXHRcdFx0bWVudVRyaWdnZXIub3Blbk1lbnUoKTtcclxuXHJcblx0XHRcdC8qIEhhbmRsZSBjbGlja3Mgb24gdGhlIG1lbnUgb3ZlcmxheSAqL1xyXG5cdFx0XHRkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjZGstb3ZlcmxheS1jb250YWluZXInKVswXT8uYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAob2ZmRXZlbnQ6IGFueSkgPT4ge1xyXG5cdFx0XHRcdG9mZkV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0bWVudVRyaWdnZXIhLmNsb3NlTWVudSgpO1xyXG5cdFx0XHR9LCB7IG9uY2U6IHRydWUgfSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIG1vZGVsIGNoYW5nZXNcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqIEBwYXJhbSByb3cgXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZU1vZGVsQ2hhbmdlKGNvbHVtbjogVGFibGVDb2x1bW4sIHJvdzogYW55LCBmb3JtR3JvdXA/OiBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdGlmICh0eXBlb2YgY29sdW1uPy5ldmVudCA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRjb2x1bW4uZXZlbnQocm93LCBmb3JtR3JvdXAsIGNvbHVtbi5ldmVudEFyZ3MgPz8gdGhpcy5jb250ZXh0KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMga2V5ZG93biBlbnRlciBvZiA8aW5wdXQ+IGFuZCA8dmQtc2VsZWN0PlxyXG5cdCAqIEBwYXJhbSAkZXZlbnQgXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XHJcblx0XHQoJGV2ZW50Py50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LmJsdXIoKTtcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhdGNoZXMgYW4gZW50aXR5XHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcGFyYW0gZmllbGROYW1lIFxyXG5cdCAqIEBwYXJhbSBwYXRoIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXRjaChyb3c6IGFueSwgZmllbGRzOiBBcnJheTxzdHJpbmc+LCB2YWx1ZTogYW55LCBpbmNsdWRlczogYW55KTogdm9pZCB7XHJcblx0XHQvKiBHZXQgZW50aXR5IGJ5IElEICovXHJcblx0XHRsZXQgZW50aXR5ID0gdGhpcy5kYXRhU291cmNlLml0ZW1zPy5maWx0ZXIoKHg6IGFueSkgPT4gKDxhbnk+eCkuaWQgPT09IHJvdy5pZClbMF07XHJcblx0XHRpZiAoZW50aXR5KSB7XHJcblx0XHRcdC8qIEJ1aWxkIHBhdGNoIG1ldGhvZHMgKi9cclxuXHRcdFx0bGV0IHBhdGNoZXMgPSBmaWVsZHMubWFwKHggPT4geyByZXR1cm4geyBvcDogJ3JlcGxhY2UnLCBwYXRoOiBgLyR7eH1gLCB2YWx1ZTogdmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBlbnRpdHlbeF0gfTsgfSk7XHJcblxyXG5cdFx0XHQvKiBTZW5kIHJlcXVlc3QgKi9cclxuXHRcdFx0dGhpcy5kYXRhU291cmNlLnNlcnZpY2VcclxuXHRcdFx0XHQucGF0Y2gocm93LmlkLCBwYXRjaGVzLCBudWxsLCB7IGhlYWRlcnM6IHsgJ1Nob3ctTWVzc2FnZSc6ICdZZXMnIH0sIHBhcmFtczogaW5jbHVkZXMgPyBVdGlscy50b0h0dHBQYXJhbXMoeyBpbmNsdWRlczogaW5jbHVkZXMgfSkgOiBudWxsIH0pXHJcblx0XHRcdFx0LnN1YnNjcmliZSgoXzogYW55KSA9PiB0aGlzLmRhdGFTb3VyY2UucmVsb2FkKCkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVuZGVycyByb3dzIGJhc2VkIG9uIHRoZSB0YWJsZSdzIGxhdGVzdCBzZXQgb2YgZGF0YSwgd2hpY2ggd2FzIGVpdGhlciBwcm92aWRlZCBkaXJlY3RseSBhcyBhblxyXG5cdCAqIGlucHV0IG9yIHJldHJpZXZlZCB0aHJvdWdoIGFuIE9ic2VydmFibGUgc3RyZWFtIChkaXJlY3RseSBvciBmcm9tIGEgRGF0YVNvdXJjZSkuXHJcblx0ICogQ2hlY2tzIGZvciBkaWZmZXJlbmNlcyBpbiB0aGUgZGF0YSBzaW5jZSB0aGUgbGFzdCBkaWZmIHRvIHBlcmZvcm0gb25seSB0aGUgbmVjZXNzYXJ5XHJcblx0ICogY2hhbmdlcyAoYWRkL3JlbW92ZS9tb3ZlIHJvd3MpLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyByZW5kZXJSb3dzKCk6IHZvaWQge1xyXG5cdFx0dGhpcy50YWJsZT8ucmVuZGVyUm93cygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyBhIHN0cmluZyBmdW5jdGlvbiBleHByZXNzaW9uLlxyXG5cdCAqIFxyXG5cdCAqIFRoaXMgbWV0aG9kIHByb2Nlc3NlcyBhbiBpbnB1dCBleHByZXNzaW9uIHRoYXQgY2FuIGVpdGhlciBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiBcclxuXHQgKiBJZiBpdCdzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBwcm92aWRlZCBpdGVtIGFuZCBjb250ZXh0LiBcclxuXHQgKiBJZiBpdCdzIGEgc3RyaW5nLCBpdCB3aWxsIGJlIHJldHVybmVkIGFzLWlzLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIGV4cHJlc3Npb24gdG8gaGFuZGxlLCB3aGljaCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBmdW5jdGlvbi5cclxuXHQgKiBAcGFyYW0gaXRlbSAtIFRoZSBpdGVtIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb24uXHJcblx0ICogQHJldHVybnMgLSBUaGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVtIGFuZCBjb250ZXh0LCBvciB0aGUgc3RyaW5nIGV4cHJlc3Npb24gaXRzZWxmLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZyB8IEZ1bmN0aW9uLCBpdGVtOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG5cdFx0LyogQ2hlY2sgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc3kgKGUuZy4sIG51bGwsIHVuZGVmaW5lZCwgb3IgZW1wdHkpICovXHJcblx0XHRpZiAoIWV4cHJlc3Npb24pIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBJZiB0aGUgZXhwcmVzc2lvbiBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0IHdpdGggdGhlIGl0ZW0gYW5kIGNvbnRleHQgKi9cclxuXHRcdGlmICh0eXBlb2YgZXhwcmVzc2lvbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRyZXR1cm4gZXhwcmVzc2lvbihpdGVtLCB0aGlzLmNvbnRleHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIElmIHRoZSBleHByZXNzaW9uIGlzIG5vdCBhIGZ1bmN0aW9uLCBhc3N1bWUgaXQncyBhIHN0cmluZyBhbmQgcmV0dXJuIGl0ICovXHJcblx0XHRyZXR1cm4gZXhwcmVzc2lvbjtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgYSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgaW4gYW4gb2JqZWN0IGJhc2VkIG9uIGEgZG90LXNlcGFyYXRlZCBwYXRoLlxyXG5cdCAqIEBwYXJhbSByb3cgLSBUaGUgb2JqZWN0IGluIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBiZWluZyBzZXQuXHJcblx0ICogQHBhcmFtIHByb3BlcnR5UGF0aCAtIEEgZG90LXNlcGFyYXRlZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSBuZXN0ZWQgcHJvcGVydHkuXHJcblx0ICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCBhdCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBwcm9wZXJ0eS5cclxuXHQgKi9cclxuXHRwdWJsaWMgc2V0TmVzdGVkUHJvcGVydHkocm93OiBhbnksIHByb3BlcnR5UGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcblx0XHQvKiBTcGxpdCB0aGUgcHJvcGVydHlQYXRoIGludG8gYW4gYXJyYXkgb2Yga2V5cyAqL1xyXG5cdFx0Y29uc3Qga2V5cyA9IHByb3BlcnR5UGF0aC5zcGxpdCgnLicpO1xyXG5cclxuXHRcdC8qIFVzZSBzbGljZSB0byBnZXQgYWxsIGtleXMgZXhjZXB0IHRoZSBsYXN0IG9uZSBhbmQgcmVkdWNlIHRvIHRyYXZlcnNlIHRvIHRoZSBzZWNvbmQtdG8tbGFzdCBsZXZlbCAqL1xyXG5cdFx0a2V5cy5zbGljZSgwLCAtMSkucmVkdWNlKChhY2MsIGtleSkgPT4gYWNjICYmIGFjY1trZXldLCByb3cpW2tleXNba2V5cy5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgcm93IGNsYXNzZXNcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqIEBwYXJhbSByb3cgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGdldFJvd0NsYXNzZXMoY29sdW1uOiBUYWJsZUNvbHVtbiwgcm93OiBhbnkpOiBhbnkge1xyXG5cdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe1xyXG5cdFx0XHQnZ3QteHMnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhzLFxyXG5cdFx0XHQnZ3Qtc20nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlNtLFxyXG5cdFx0XHQnZ3QtbWQnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk1kLFxyXG5cdFx0XHQnZ3QtbGcnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLkxnLFxyXG5cdFx0XHQnZ3QteGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhsLFxyXG5cdFx0XHQnZ3QteHhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YeGwsXHJcblx0XHRcdCdoaWRkZW4nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk5vbmUsXHJcblx0XHRcdCd0ZXh0LXJpZ2h0JzogY29sdW1uLmFycm93QmVmb3JlXHJcblx0XHR9LCBjb2x1bW4uY2VsbE5nQ2xhc3MgPyBjb2x1bW4uY2VsbE5nQ2xhc3Mocm93LCB0aGlzLmNvbnRleHQpIDoge30pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9nIHRvIGNvbnNvbGVcclxuXHQgKiBAcGFyYW0gbWVzc2FnZSBcclxuXHQgKiBAcGFyYW0gb3B0aW9uYWxQYXJhbXMgXHJcblx0ICovXHJcblx0cHVibGljIGxvZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xyXG5cdFx0Y29uc29sZS5sb2cobWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBpcyBpbnZva2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxyXG5cdCAqIGRlZmF1bHQgY2hhbmdlIGRldGVjdG9yIGhhcyBjb21wbGV0ZWQgb25lIGNoYW5nZS1jaGVjayBjeWNsZVxyXG5cdCAqIGZvciBhIGNvbXBvbmVudCdzIHZpZXcuXHJcblx0ICovXHJcblx0bmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0fVxyXG59IiwiPGRpdiBjbGFzcz1cImxvYWRpbmctcHJvZ3Jlc3NcIiAqbmdJZj1cIiFzdGF0aWNcIj5cclxuXHQ8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiZGF0YVNvdXJjZT8uaXNMb2FkaW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gI3JlZ2lvbiBEYXRhIHRhYmxlIC0tPlxyXG48dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW2RhdGFTb3VyY2VGaWx0ZXJdPVwiZGF0YVNvdXJjZUZpbHRlclwiIFtuZ0NsYXNzXT1cInsndGFibGUtZml4ZWQnOiAhZGV0YWlsc1RlbXBsYXRlICYmICF0ZW1wbGF0ZVJlZn1cIiBbdHJhY2tCeV09XCJ0cmFja0J5XCIgbWF0U29ydCBtYXRTb3J0RGlzYWJsZUNsZWFyIFttYXRTb3J0QWN0aXZlXT1cInNvcnRBY3RpdmV8fCdpZCdcIiBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCIgbXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxyXG5cdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jOyB0cmFja0J5OmNvbHVtbnNUcmFja0J5XCI+XHJcblx0XHQ8IS0tICNyZWdpb24gQ29sdW1uIGRlZiAtLT5cclxuXHRcdDxuZy1jb250YWluZXIgW2Nka0NvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiIFtzdGlja3ldPVwiY29sdW1uLnN0aWNreVwiIFtzdGlja3lFbmRdPVwiY29sdW1uLnN0aWNreUVuZFwiPlxyXG5cdFx0XHQ8dGggbWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIFttYXQtc29ydC1oZWFkZXJdPVwiY29sdW1uLnNvcnRCeSB8fCBjb2x1bW4ubmFtZVwiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIiBbZGlzYWJsZWRdPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5DaGVja2JveCB8fCBjb2x1bW4uZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7J2d0LXhzJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YcywgJ2d0LXNtJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5TbSwgJ2d0LW1kJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5NZCwgJ2d0LWxnJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5MZywgJ2d0LXhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YbCwgJ2d0LXh4bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHhsLCAnaGlkZGVuJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5Ob25lfVwiIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5hcnJvd0JlZm9yZT8nYmVmb3JlJzonYWZ0ZXInXCI+XHJcblx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQ2hlY2tib3hcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2UudG9nZ2xlU2VsZWN0KCRldmVudCwgc2VsZWN0QWxsRmlsdGVyKSA6IG51bGxcIiBbZGlzYWJsZWRdPVwiIWRhdGFTb3VyY2UucGFnaW5hdG9yPy5sZW5ndGhcIiBbY2hlY2tlZF09XCJkYXRhU291cmNlLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkgJiYgZGF0YVNvdXJjZS5pc0FsbFNlbGVjdGVkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJkYXRhU291cmNlLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkgJiYgIWRhdGFTb3VyY2UuaXNBbGxTZWxlY3RlZCgpXCI+PC9tYXQtY2hlY2tib3g+XHJcblx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSAhPSBDb2x1bW5UeXBlLkNoZWNrYm94XCI+e3tjb2x1bW4uaGVhZGVyIHwgZnVuYzpjb250ZXh0fX08L3NwYW4+XHJcblx0XHRcdDwvdGg+XHJcblxyXG5cdFx0XHQ8dGQgbWF0LWNlbGwgKmNka0NlbGxEZWY9XCJsZXQgcm93OyBsZXQgcm93SW5kZXggPSBkYXRhSW5kZXhcIiBbbWF0VG9vbHRpcF09XCJjb2x1bW4udG9vbHRpcD9jb2x1bW4udG9vbHRpcChyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIFttYXRUb29sdGlwQ2xhc3NdPVwiY29sdW1uLnRvb2x0aXBDbGFzcz8/JydcIiBbaGlkZGVuXT1cImNvbHVtbi5oaWRkZW5cIiBbbmdDbGFzc109XCJnZXRSb3dDbGFzc2VzKGNvbHVtbiwgcm93KVwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgI3Jvd1ZhbCBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dWYWxcIiBsZXQtcm93VmFsdWUgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNvbHVtbj8uY29udGVudCAmJiBjb2x1bW4/LmNvbnRlbnQocm93LCB1bmRlZmluZWQsIGNvbnRleHQpfVwiPlxyXG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnR5cGVcIj5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIENoZWNrYm94IGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5DaGVja2JveFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2Uuc2VsZWN0aW9uTW9kZWwudG9nZ2xlKHJvdykgOiBudWxsXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIEVudW0gY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5FbnVtXCI+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5lbnVtTWV0YWRhdGE7IGVsc2Ugbm9FbnVtTWV0YWRhdGFcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ubXVsdGlwbGU7IGVsc2UgZWxzZVRlbXBsYXRlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzbWFsbCAqbmdJZj1cImk8MlwiPnt7Y29sdW1uLmVudW1NZXRhZGF0YVtpdGVtXS5kaXNwbGF5fX08L3NtYWxsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzbWFsbCAqbmdJZj1cImk9PTEgJiYgcm93VmFsdWU/Lmxlbmd0aCA+IDJcIj4sIC4uLjwvc21hbGw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI2Vsc2VUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJyb3dWYWx1ZSA+PSAwXCIgY2xhc3M9XCJuYVwiIFtpbm5lckh0bWxdPVwiKGNvbHVtbi5lbnVtTWV0YWRhdGFbcm93VmFsdWVdfHx7fSkuZGlzcGxheVwiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub0VudW1NZXRhZGF0YT5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ubXVsdGlwbGU7IGVsc2UgZWxzZVRlbXBsYXRlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzbWFsbCAqbmdJZj1cImk8MlwiIGkxOG49XCJAQHNlbGVjdGlvblwiPntpdGVtIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXgsIHNlbGVjdCwgdHlwZSB7dHlwZX0gb3RoZXIge3t7aXRlbSB8IGVudW06Y29sdW1uLmVudW1UeXBlOmNvbHVtbi5lbnVtUHJlZml4fX19fTwvc21hbGw+PHNtYWxsICpuZ0lmPVwiaT09MSAmJiByb3dWYWx1ZT8ubGVuZ3RoID4gMlwiPiwgLi4uPC9zbWFsbD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjZWxzZVRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cInJvd1ZhbHVlID49IDBcIiBpMThuPVwiQEBzZWxlY3Rpb25cIj57cm93VmFsdWUgfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeCwgc2VsZWN0LCB0eXBlIHt0eXBlfSBvdGhlciB7e3tyb3dWYWx1ZSB8IGVudW06Y29sdW1uLmVudW1UeXBlOmNvbHVtbi5lbnVtUHJlZml4fX19fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI3JlY3Vyc2l2ZUNvbnRhaW5lciBsZXQtY29sdW1uTmFtZVNlZ21lbnRzPVwic2VnbWVudHNcIiBsZXQtZm9ybUdyb3VwPVwiZm9ybUdyb3VwXCIgbGV0LXBhcmVudEZvcm1Hcm91cD1cInBhcmVudEZvcm1Hcm91cFwiPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtR3JvdXBcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PCEtLSBJZiB0aGUgY29sdW1uTmFtZVNlZ21lbnRzIGFycmF5IGlzIGVtcHR5LCB3ZSdyZSBhdCB0aGUgbGVhZiBub2RlIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW5OYW1lU2VnbWVudHMubGVuZ3RoOyBlbHNlIG5vdExhc3RTZWdtZW50XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBUb2dnbGUgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRvZ2dsZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtc2xpZGUtdG9nZ2xlIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXBcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiIChjaGFuZ2UpPVwiY29sdW1uLmNoYW5nZT9jb2x1bW4uY2hhbmdlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KTpoYW5kbGVNb2RlbENoYW5nZShjb2x1bW4sIHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwKVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIGNvbG9yPVwiYWNjZW50XCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRleHQgSW5wdXQgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVGV4dElucHV0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwXCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBWRC1TZWxlY3QgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuU2VsZWN0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDx2ZC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cFwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbi5lbnVtRmlsdGVyIHwgZnVuYzpwYXJlbnRGb3JtR3JvdXAudmFsdWU6Y29udGV4dFwiIFtwcmVmaXhdPVwiY29sdW1uLmVudW1QcmVmaXhcIiBbb3B0aW9uc109XCJjb2x1bW4ub3B0aW9uc1wiIFtkZWZhdWx0T3B0aW9uXT1cImNvbHVtbi5kZWZhdWx0T3B0aW9uPz90cnVlXCIgW2Rpc2FibGVDb250cm9sXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KSkpXCIgKHNlbGVjdGlvbkNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2UocGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXAsIGNvbnRleHQpOnBhdGNoKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgW2NvbHVtbi5uYW1lXSwgcm93VmFsdWUsIGNvbHVtbi5wYXRjaEluY2x1ZGVzKVwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+PC92ZC1zZWxlY3Q+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RMYXN0U2VnbWVudD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBJZiBub3QgdGhlIGxhc3Qgc2VnbWVudCwgY3JlYXRlIGEgbmVzdGVkIGZvcm0gZ3JvdXAgLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cE5hbWVdPVwiY29sdW1uTmFtZVNlZ21lbnRzWzBdXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBSZWN1cnNpdmUgY2FsbCB0byBoYW5kbGUgbmVzdGVkIHNlZ21lbnRzIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVjdXJzaXZlQ29udGFpbmVyXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWdtZW50czogY29sdW1uTmFtZVNlZ21lbnRzLnNsaWNlKDEpLCBwYXJlbnRGb3JtR3JvdXA6Zm9ybUdyb3VwLCBmb3JtR3JvdXA6IGZvcm1Hcm91cC5nZXQoY29sdW1uTmFtZVNlZ21lbnRzWzBdKX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRvZ2dsZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVG9nZ2xlXCI+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JtQXJyYXlcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtc2xpZGUtdG9nZ2xlIFtuZ01vZGVsXT1cInJvdyB8IHByb3BlcnR5OmNvbHVtbi5uYW1lXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0TmVzdGVkUHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSwgISRldmVudCk7aGFuZGxlTW9kZWxDaGFuZ2UoY29sdW1uLCByb3csIHVuZGVmaW5lZCk7XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIiBbZGlzYWJsZWRdPVwicmVhZG9ubHkgfHwgKGNvbHVtbi5kaXNhYmxlZCB8fCAoY29sdW1uLmRpc2FibGUgJiYgY29sdW1uLmRpc2FibGUocm93LCB1bmRlZmluZWQsIGNvbnRleHQpKSlcIiBjb2xvcj1cImFjY2VudFwiPjwvbWF0LXNsaWRlLXRvZ2dsZT5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5XCIgW2Zvcm1Hcm91cF09XCIkYW55KGZvcm1BcnJheS5jb250cm9scylbcm93SW5kZXhdIHwgZm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJlY3Vyc2l2ZUNvbnRhaW5lclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7c2VnbWVudHM6IGNvbHVtbi5uYW1lLnNwbGl0KCcuJyksIGZvcm1Hcm91cDogZm9ybUFycmF5LmNvbnRyb2xzW3Jvd0luZGV4XX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBEYXRlIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuRGF0ZVwiPnt7cm93VmFsdWUgfCBkYXRlOmNvbHVtbi5zaG9ydERhdGU/J2RkLk1NLnl5eXknOidkZC5NTS55eXl5IEhIOm1tOnNzJ319PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBJbnB1dCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVGV4dElucHV0XCI+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiIWZvcm1BcnJheVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxpbnB1dCBtYXRJbnB1dCAqbmdJZj1cIiFmb3JtQXJyYXlcIiB0eXBlPVwie3tjb2x1bW4uaW5wdXRUeXBlfX1cIiBhdXRvY29tcGxldGU9XCJub25lXCIgbmFtZT1cInt7Y29sdW1uLm5hbWV9fXt7cm93SW5kZXh9fVwiIFtuZ01vZGVsXT1cInJvdyB8IHByb3BlcnR5OmNvbHVtbi5uYW1lXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgW21pbl09XCJjb2x1bW4uaW5wdXRNaW4/Y29sdW1uLmlucHV0TWluKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KTpudWxsXCIgW21heF09XCJjb2x1bW4uaW5wdXRNYXg/Y29sdW1uLmlucHV0TWF4KHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KTpudWxsXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0TmVzdGVkUHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSwgJGV2ZW50KTsoY29sdW1uLmNoYW5nZT9jb2x1bW4uY2hhbmdlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KTpwYXRjaChyb3csIFtjb2x1bW4ubmFtZV0sICRldmVudCwgY29sdW1uLnBhdGNoSW5jbHVkZXMpKTtcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3VwZGF0ZU9uOiAnYmx1cid9XCIgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlS2V5ZG93bkVudGVyKCRldmVudClcIj5cclxuXHRcdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXlcIiBbZm9ybUdyb3VwXT1cIiRhbnkoZm9ybUFycmF5LmNvbnRyb2xzKVtyb3dJbmRleF0gfCBmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVjdXJzaXZlQ29udGFpbmVyXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWdtZW50czogY29sdW1uLm5hbWUuc3BsaXQoJy4nKSwgZm9ybUdyb3VwOiBmb3JtQXJyYXkuY29udHJvbHNbcm93SW5kZXhdfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFZELVNlbGVjdCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuU2VsZWN0XCI+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiIWZvcm1BcnJheVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2ZC1zZWxlY3QgKm5nSWY9XCIhZm9ybUFycmF5XCIgbmFtZT1cInt7Y29sdW1uLm5hbWV9fXt7cm93SW5kZXh9fVwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbj8uZW51bUZpbHRlciAgfCBmdW5jOnJvdzpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW2RlZmF1bHRPcHRpb25dPVwiY29sdW1uLmRlZmF1bHRPcHRpb24/P3RydWVcIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7XCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2Uocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOnBhdGNoKHJvdywgW2NvbHVtbi5uYW1lXSwgJGV2ZW50LnZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1BcnJheVwiIFtmb3JtR3JvdXBdPVwiJGFueShmb3JtQXJyYXkuY29udHJvbHMpW3Jvd0luZGV4XSB8IGZvcm1Hcm91cFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW4ubmFtZS5zcGxpdCgnLicpLCBmb3JtR3JvdXA6IGZvcm1BcnJheS5jb250cm9sc1tyb3dJbmRleF19XCI+PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gQWN0aW9uIC0tPlxyXG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLkFjdGlvblwiPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ubWVudVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBpZD1cIm1lbnUte3tyb3cuaWR9fVwiIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuOyBwb3NpdGlvbjogZml4ZWQ7XCIgI2NvbnRleHRNZW51VHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnUubWF0TWVudSFcIiAqbmdJZj1cIm1lbnU/Lm1hdE1lbnUgJiYgIXJvdy5sb2NrZWQgJiYgaGFzVmlzaWJsZVJvd01lbnVJdGVtcyhyb3csIGNvbHVtbilcIj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgW2l0ZW1zXT1cIltjb2x1bW4ubWVudV1cIiBbZGF0YV09XCJyb3dcIiBbY29udGV4dF09XCJjb250ZXh0XCIgI21lbnU+PC92ZC1keW5hbWljLW1lbnU+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTWVudSAtLT5cclxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5tZW51XCI+XHJcblx0XHRcdFx0XHRcdFx0PHZkLWR5bmFtaWMtbWVudSAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5NZW51XCIgW2l0ZW1zXT1cIltjb2x1bW4ubWVudV1cIiBbZGF0YV09XCJyb3dcIiBbY29udGV4dF09XCJjb250ZXh0XCI+PC92ZC1keW5hbWljLW1lbnU+XHJcblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gaWNvbiAtLT5cclxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvblwiIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHRcdDxtYXQtaWNvbiAqbmdJZj1cImNvbHVtbi5pY29uPy5tYXRJY29uXCIgZm9udFNldD1cInt7Y29sdW1uLmljb24/LmZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uY3NzQ2xhc3M/PycnLCByb3cpXCI+e3toYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5tYXRJY29uISwgcm93KX19PC9tYXQtaWNvbj5cclxuXHRcdFx0XHRcdFx0XHQ8bWF0LWljb24gKm5nSWY9XCJjb2x1bW4uaWNvbj8uc3ZnSWNvblwiIGZvbnRTZXQ9XCJ7e2NvbHVtbi5pY29uPy5mb250U2V0IHx8ICdtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkJ319XCIgW2NsYXNzXT1cImhhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/LmNzc0NsYXNzPz8nJywgcm93KVwiIFtzdmdJY29uXT1cImhhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/LnN2Z0ljb24hLCByb3cpIVwiPjwvbWF0LWljb24+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LmZvbnRJY29uXCIgZm9udFNldD1cInt7Y29sdW1uLmljb24/LmZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uY3NzQ2xhc3M/PycnLCByb3cpXCIgW2ZvbnRJY29uXT1cImhhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/LmZvbnRJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHQ8L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBpY29uIGJ1dHRvbiAtLT5cclxuXHRcdFx0XHRcdFx0PGEgbWF0LWljb24tYnV0dG9uICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLkljb25CdXR0b25cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2NvbHVtbi5pY29uQnV0dG9uPy5ldmVudD9jb2x1bW4uaWNvbkJ1dHRvbj8uZXZlbnQocm93LCBjb250ZXh0KTpudWxsXCI+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1pY29uIGZvbnRTZXQ9XCJ7e2NvbHVtbi5pY29uQnV0dG9uPy5pY29uRm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uQnV0dG9uPy5pY29uQ2xhc3M/PycnLCByb3cpXCI+e3toYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uQnV0dG9uPy5pY29uPz8ncmFkaW9fYnV0dG9uX2NoZWNrZWQnLCByb3cpIHx8ICdyYWRpb19idXR0b25fY2hlY2tlZCd9fTwvbWF0LWljb24+XHJcblx0XHRcdFx0XHRcdDwvYT5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIE90aGVyIGNvbHVtbiB0eXBlcyAtLT5cclxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBbaW5uZXJIdG1sXT1cInJvd1ZhbHVlPz8nJ1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0PC90ZD5cclxuXHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG5cclxuXHQ8IS0tICNyZWdpb24gRmlsdGVyIHJvdyAtLT5cclxuXHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBmaWx0ZXJhYmxlXCI+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucyQgfCBhc3luY1wiPlxyXG5cdFx0XHQ8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImZpbHRlci57e2NvbHVtbi5maWx0ZXIgfHwgY29sdW1uLm5hbWV9fVwiPlxyXG5cdFx0XHRcdDx0aCBtYXQtaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWYgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nU3R5bGVdPVwie21heFdpZHRoOmNvbHVtbi5tYXhXaWR0aD8oY29sdW1uLm1heFdpZHRoKyhjb2x1bW4ubWF4V2lkdGhVbml0IHx8ICdweCcpKTpudWxsLG1pbldpZHRoOmNvbHVtbi5taW5XaWR0aD8oY29sdW1uLm1pbldpZHRoKyhjb2x1bW4ubWluV2lkdGhVbml0IHx8ICdweCcpKTpudWxsLHdpZHRoOmNvbHVtbi53aWR0aD8oY29sdW1uLndpZHRoKyhjb2x1bW4ud2lkdGhVbml0IHx8ICdweCcpKTpudWxsfVwiIFtuZ0NsYXNzXT1cInsnZ3QteHMnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhzLCAnZ3Qtc20nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlNtLCAnZ3QtbWQnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk1kLCAnZ3QtbGcnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLkxnLCAnZ3QteGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhsLCAnZ3QteHhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YeGwsICdoaWRkZW4nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk5vbmV9XCI+XHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gU2VsZWN0IGZpbHRlciAtLT5cclxuXHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwiKGNvbHVtbi5lbmRwb2ludCB8fCBjb2x1bW4uZW51bVR5cGUgfHwgY29sdW1uLm9wdGlvbnMpIGVsc2Ugbm90U2VsZWN0RmlsdGVyXCIgZmlsdGVyLXNlbGVjdCBbZW5kcG9pbnRdPVwiY29sdW1uLmVuZHBvaW50XCIgW2VudW1dPVwiY29sdW1uLmVudW1UeXBlXCIgW2VudW1NZXRhZGF0YV09XCJjb2x1bW4uZW51bU1ldGFkYXRhXCIgW2VudW1GaWx0ZXJdPVwiY29sdW1uLmVudW1GaWx0ZXIgfCBmdW5jOnt9OmNvbnRleHRcIiBbcHJlZml4XT1cImNvbHVtbi5lbnVtUHJlZml4XCIgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbdGV4dF09XCJjb2x1bW4uZmlsdGVyT3B0aW9uVGV4dCB8fCAnbmFtZSdcIj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRleHQgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RTZWxlY3RGaWx0ZXI+XHJcblx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwibm90U2VsZWN0RmlsdGVyICYmIChjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLlRleHQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5UZXh0SW5wdXQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5OdW1iZXIpIGVsc2Ugbm90SW5wdXRGaWx0ZXJcIiBmaWx0ZXItaW5wdXQgW29ubHlOdW1iZXJdPVwiY29sdW1uLmZpbHRlcklucHV0TnVtYmVyPz9mYWxzZVwiIFtvcGVyYXRvcl09XCJjb2x1bW4uZmlsdGVyT3BlcmF0b3JcIj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBEYXRlIGZpbHRlciAtLT5cclxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90SW5wdXRGaWx0ZXI+XHJcblx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5EYXRlIGVsc2Ugbm90RGF0ZUZpbHRlclwiIGZpbHRlci1kYXRlPjwvc3Bhbj5cclxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIEFjdGlvbiBmaWx0ZXIgKGNsZWFyKSAtLT5cclxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90RGF0ZUZpbHRlcj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkFjdGlvblwiIGZpbHRlci1jbGVhcj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdDwvdGg+XHJcblx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHQ8IS0tICNyZWdpb24gRGV0YWlscyBjb2x1bW4gLS0+XHJcblx0PG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJleHBhbmRlZERldGFpbFwiPlxyXG5cdFx0PHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXhcIiBbYXR0ci5jb2xzcGFuXT1cIihkaXNwbGF5ZWRDb2x1bW5zJCB8IGFzeW5jKT8ubGVuZ3RoXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJyb3ctZGV0YWlsXCIgW0BkZXRhaWxFeHBhbmRdPVwicm93ID09IGV4cGFuZGVkUm93ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCIgI2RldGFpbHNUZW1wbGF0ZT5cclxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwidGVtcGxhdGVSZWYgJiYgcm93ID09PSBleHBhbmRlZFJvd1wiPlxyXG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlUmVmOyBjb250ZXh0Ontyb3c6IHJvdywgaW5kZXg6IGluZGV4LCBjb250ZXh0OiBjb250ZXh0fVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvdGQ+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHQ8IS0tICNyZWdpb24gRmlsdGVyIGhlYWRlciAtLT5cclxuXHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyYWJsZVwiPlxyXG5cdFx0PHRyIG1hdC1oZWFkZXItcm93ICpjZGtIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRGaWx0ZXJDb2x1bW5zJCB8IGFzeW5jXCI+PC90cj5cclxuXHQ8L25nLWNvbnRhaW5lcj5cclxuXHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdDx0ciBtYXQtaGVhZGVyLXJvdyAqY2RrSGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYzsgc3RpY2t5OiBzdGlja3lGaWx0ZXJcIj48L3RyPlxyXG5cdDx0ciBtYXQtcm93ICpjZGtSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zJCB8IGFzeW5jOyBsZXQgaW5kZXggPSBkYXRhSW5kZXhcIiBbbmdDbGFzc109XCJyb3dOZ0NsYXNzP3Jvd05nQ2xhc3Mocm93LCBjb250ZXh0KTpudWxsXCIgW2NsYXNzLmV4cGFuZGVkLXJvd109XCJleHBhbmRlZFJvdyA9PT0gcm93XCIgKGNsaWNrKT1cImhhbmRsZVJvd0NsaWNrKGluZGV4LCByb3cpXCIgKGNvbnRleHRtZW51KT1cImhhbmRsZVJvd1JpZ2h0Q2xpY2soJGV2ZW50LCByb3cpXCI+PC90cj5cclxuXHJcblx0PCEtLSAjcmVnaW9uIERldHJhaWxzIHJvdyAtLT5cclxuXHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZGV0YWlsc1RlbXBsYXRlIHx8IHRlbXBsYXRlUmVmXCI+XHJcblx0XHQ8dHIgbWF0LXJvdyAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydleHBhbmRlZERldGFpbCddXCIgY2xhc3M9XCJkZXRhaWwtcm93XCIgW25nQ2xhc3NdPVwicm93TmdDbGFzcz9yb3dOZ0NsYXNzKHJvdywgY29udGV4dCk6bnVsbFwiPjwvdHI+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG48L3RhYmxlPlxyXG48IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG48IS0tICNyZWdpb24gUm93IHNob3duIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgZGF0YS4tLT5cclxuPGRpdiBjbGFzcz1cIm1hdC1jZWxsIHBhZCB0YWJsZS1lbXB0eSB0eHQtaXRhbGljXCIgKm5nSWY9XCIhZGF0YVNvdXJjZT8uZmlsdGVyZWREYXRhPy5sZW5ndGggJiYgIWRhdGFTb3VyY2U/LnRvdGFsXCIgaTE4bj1cIkBAbm9SZXN1bHRzRm91bmRcIj5ObyByZXN1bHRzIHdlcmUgZm91bmQuPC9kaXY+XHJcbjwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbjwhLS0gI3JlZ2lvbiBEZWJ1ZyB2YWx1ZSAtLT5cclxuPGNvZGUgKm5nSWY9XCJkZWJ1Z1ZhbHVlXCI+XHJcblx0PHByZT57e2Zvcm1WYWx1ZSB8IGpzb259fTwvcHJlPlxyXG48L2NvZGU+XHJcbjwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbjxkaXYgY2xhc3M9XCJ0YWJsZS1mb290ZXJcIiBsYXlvdXQ9XCJyb3dcIj5cclxuXHQ8bmctY29udGVudCBzZWxlY3Q9XCJbdGFibGUtZm9vdGVyXVwiPjwvbmctY29udGVudD5cclxuXHQ8c3BhbiBmbGV4Pjwvc3Bhbj5cclxuXHQ8bWF0LXBhZ2luYXRvciAqbmdJZj1cInBhZ2luYWJsZVwiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM9XCJ0cnVlXCI+PC9tYXQtcGFnaW5hdG9yPlxyXG48L2Rpdj4iXX0=
|