UNPKG

ng-devui

Version:

DevUI components based on Angular

143 lines 33.9 kB
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostBinding, Inject, Input, NgZone, Output, } from '@angular/core'; import { DATA_TABLE_ROW } from './data-table-row.token'; import { DATA_TABLE } from './data-table.token'; import { ForceUpdateReason } from './force-update-reason.model'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "ng-devui/checkbox"; import * as i4 from "ng-devui/tooltip"; import * as i5 from "./data-table-cell.component"; export class DataTableRowComponent { constructor(dt, changeDetectorRef, rowRef, ngZone) { this.dt = dt; this.changeDetectorRef = changeDetectorRef; this.rowRef = rowRef; this.ngZone = ngZone; this.fontWeight = 'normal'; this.verticalAlign = 'middle'; this.detailChange = new EventEmitter(); this.forceUpdateEvent = new EventEmitter(); this.clickCount = 0; // 记录点击次数 } ngOnInit() { this.ngZone.runOutsideAngular(() => { this.rowRef.nativeElement.addEventListener('mouseup', this.onRowClick.bind(this)); this.rowRef.nativeElement.addEventListener('dblclick', this.onRowDBClick.bind(this)); if (this.generalRowHoveredData) { this.rowRef.nativeElement.addEventListener('mouseenter', this.onRowMouseEnter.bind(this)); this.rowRef.nativeElement.addEventListener('mouseleave', this.onRowMouseLeave.bind(this)); } }); } forceUpdate() { this.changeDetectorRef.markForCheck(); this.forceUpdateEvent.emit(ForceUpdateReason.RowUpdate); } onRowClick($event) { this.clickCount++; if (this.clickCount === 1) { this.timeoutId = setTimeout(() => { if (this.clickCount === 1) { this.dt.onRowClick({ rowIndex: this.rowIndex, nestedIndex: this.nestedIndex, rowItem: this.rowItem, rowComponent: this, event: $event, }); } this.clickCount = 0; clearTimeout(this.timeoutId); }, this.timeout); } } onRowDBClick($event) { this.dt.onRowDBClick({ rowIndex: this.rowIndex, nestedIndex: this.nestedIndex, rowItem: this.rowItem, rowComponent: this }); } onRowMouseEnter($event) { this.ngZone.run(() => { this.rowItem.$hovered = true; }); } onRowMouseLeave($event) { this.ngZone.run(() => { this.rowItem.$hovered = false; }); } onRowCheckChange($event, rowIndex, nestedIndex, rowItem) { rowItem.$checked = $event; rowItem.$halfChecked = false; this.dt.setRowCheckStatus({ rowItem, rowIndex, nestedIndex, checked: $event }); } toggle() { if (this.rowItem.$isDetailOpen === undefined) { this.rowItem.$isDetailOpen = !!this.rowItem.$expandConfig?.expand; } this.rowItem.$isDetailOpen = !this.rowItem.$isDetailOpen; if (this.rowItem.$expandConfig) { this.rowItem.$expandConfig.expand = !this.rowItem.$expandConfig.expand; } this.detailChange.emit({ state: this.rowItem.$isDetailOpen, index: this.rowIndex }); this.dt.onDetailToggle({ state: this.rowItem.$isDetailOpen, index: this.rowIndex }); } trackByFn(index, item) { return index; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableRowComponent, deps: [{ token: DATA_TABLE }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataTableRowComponent, selector: "d-data-table-row, [dDataTableRow]", inputs: { rowItem: "rowItem", selectable: "selectable", checkable: "checkable", showExpandToggle: "showExpandToggle", rowIndex: "rowIndex", allChecked: "allChecked", columns: "columns", editModel: "editModel", editRowItem: "editRowItem", resizeable: "resizeable", timeout: "timeout", tableLevel: "tableLevel", nestedIndex: "nestedIndex", generalRowHoveredData: "generalRowHoveredData" }, outputs: { detailChange: "detailChange" }, host: { properties: { "style.font-weight": "this.fontWeight", "style.vertical-align": "this.verticalAlign" } }, providers: [ { provide: DATA_TABLE_ROW, useExisting: forwardRef(() => DataTableRowComponent), }, ], ngImport: i0, template: "<td *ngIf=\"showExpandToggle\" class=\"devui-detail-cell\" [ngClass]=\"{ 'devui-sticky-left-cell': columns[0]?.fixedLeft }\" [style.left]=\"0\">\n <div *ngIf=\"rowItem.detail || rowItem?.$expandConfig\" (click)=\"toggle()\">\n <span class=\"expand-icon-wrapper\" *ngIf=\"!rowItem['$isDetailOpen'] && !rowItem.$expandConfig?.expand\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g id=\"\u64CD\u4F5C/collapse2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <polygon\n id=\"\u8DEF\u5F84\"\n fill=\"#293040\"\n fill-rule=\"nonzero\"\n transform=\"translate(8.146447, 8.000000) scale(-1, 1) translate(-8.146447, -8.000000) \"\n points=\"11.7071068 12.2928932 10.2928932 13.7071068 4.58578644 8 10.2928932 2.29289322 11.7071068 3.70710678 7.41421356 8\"\n ></polygon>\n </g>\n </svg>\n </span>\n <span class=\"expand-icon-wrapper\" *ngIf=\"(rowItem && rowItem['$isDetailOpen']) || rowItem.$expandConfig?.expand\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g id=\"\u64CD\u4F5C/chevron_down\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <polygon id=\"chevron_down\" fill=\"#293040\" points=\"4.5 5 8 8.76923077 11.5 5 13 6.61538462 8 12 3 6.61538462\"></polygon>\n </g>\n </svg>\n </span>\n </div>\n</td>\n<td\n *ngIf=\"checkable\"\n class=\"devui-checkable-cell\"\n [ngClass]=\"{ 'devui-sticky-left-cell': columns[0]?.fixedLeft }\"\n [style.left]=\"showExpandToggle && columns[0]?.fixedLeft ? '36px' : '0'\"\n>\n <d-checkbox\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onRowCheckChange($event, rowIndex, nestedIndex, rowItem)\"\n [ngModel]=\"rowItem.$checked\"\n [halfchecked]=\"rowItem.$halfChecked\"\n [disabled]=\"rowItem.$checkDisabled || rowItem.$disabled\"\n dTooltip\n [content]=\"rowItem.$checkBoxTips\"\n [position]=\"['top', 'right', 'bottom', 'left']\"\n [showAnimation]=\"true\"\n (mouseup)=\"$event.stopPropagation()\"\n >\n </d-checkbox>\n</td>\n<ng-container *ngFor=\"let column of columns; let colIndex = index; trackBy: trackByFn\">\n <td\n dDataTableCell\n [rowIndex]=\"rowIndex\"\n [colIndex]=\"colIndex\"\n [column]=\"column\"\n [rowItem]=\"rowItem\"\n [editModel]=\"rowItem.$$editModel || editModel\"\n [isEditRow]=\"rowItem.$$edit\"\n [timeout]=\"timeout\"\n [tableLevel]=\"tableLevel\"\n class=\"{{ column.cellClass ? column.cellClass : '' }}\"\n [ngClass]=\"{\n 'devui-sticky-left-cell': column.fixedLeft,\n 'devui-sticky-right-cell': column.fixedRight,\n 'devui-last-sticky-left-cell': column.fixedLeft && !columns[colIndex + 1]?.fixedLeft,\n 'devui-first-sticky-right-cell': column.fixedRight && !columns[colIndex - 1]?.fixedRight\n }\"\n [style.left]=\"column.fixedLeft ? column.fixedLeft : null\"\n [style.right]=\"column.fixedRight ? column.fixedRight : null\"\n ></td>\n</ng-container>\n", styles: ["svg.svg-icon-arrow>g>polygon{fill:var(--devui-icon-text, #808080)}:host ::ng-deep d-button button.d-btn.d-btn-icon{padding:0!important}:host ::ng-deep .cell-modify{position:absolute;right:0;cursor:pointer}:host ::ng-deep .cell-modify>svg{vertical-align:middle}:host ::ng-deep .cell-modify:hover>svg>g>g{fill:var(--devui-icon-text, #808080)}:host ::ng-deep .cell-placeholder{display:inline-block;height:16px}:host ::ng-deep .cell-container{position:relative;height:24px}:host ::ng-deep .cell-container-inner{position:absolute;max-width:100%;width:100%}:host ::ng-deep .cell-container-inner.modify-holder{padding-right:20px}:host ::ng-deep .cell-container-inner.modify-holder .cell-modify{display:none;cursor:pointer;position:absolute;right:0}:host ::ng-deep .cell-container-inner.modify-holder .cell-modify>svg{vertical-align:middle}:host ::ng-deep .cell-container-inner.modify-holder .cell-modify>svg>g{fill:var(--devui-icon-text, #808080)}:host ::ng-deep .cell-container-inner.modify-holder .cell-modify:hover>svg>g{fill:var(--devui-icon-fill-active-hover, #000000)}:host ::ng-deep .cell-container-inner.modify-holder:hover .cell-modify{display:inline}:host ::ng-deep .not-break{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-spacing:normal;word-wrap:normal}:host ::ng-deep .cell-editable{cursor:pointer;margin-left:-5px;padding-left:5px;min-height:20px}.expand-icon-wrapper{display:flex;justify-content:left}.expand-icon-wrapper polygon{fill:var(--devui-icon-fill, #595959)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.CheckBoxComponent, selector: "d-checkbox", inputs: ["name", "label", "cssClass", "color", "disabled", "isShowTitle", "title", "labelTemplate", "halfchecked", "showAnimation", "showGlowStyle", "beforeChange"], outputs: ["change"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[dTooltip]", inputs: ["content", "position", "showAnimation", "showAnimate", "mouseEnterDelay", "mouseLeaveDelay"], exportAs: ["dTooltip"] }, { kind: "component", type: i5.DataTableCellComponent, selector: "d-data-table-cell,[dDataTableCell]", inputs: ["rowIndex", "colIndex", "column", "rowItem", "editModel", "isEditRow", "timeout", "tableLevel"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableRowComponent, decorators: [{ type: Component, args: [{ selector: 'd-data-table-row, [dDataTableRow]', preserveWhitespaces: false, providers: [ { provide: DATA_TABLE_ROW, useExisting: forwardRef(() => DataTableRowComponent), }, ], template: "<td *ngIf=\"showExpandToggle\" class=\"devui-detail-cell\" [ngClass]=\"{ 'devui-sticky-left-cell': columns[0]?.fixedLeft }\" [style.left]=\"0\">\n <div *ngIf=\"rowItem.detail || rowItem?.$expandConfig\" (click)=\"toggle()\">\n <span class=\"expand-icon-wrapper\" *ngIf=\"!rowItem['$isDetailOpen'] && !rowItem.$expandConfig?.expand\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g id=\"\u64CD\u4F5C/collapse2\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <polygon\n id=\"\u8DEF\u5F84\"\n fill=\"#293040\"\n fill-rule=\"nonzero\"\n transform=\"translate(8.146447, 8.000000) scale(-1, 1) translate(-8.146447, -8.000000) \"\n points=\"11.7071068 12.2928932 10.2928932 13.7071068 4.58578644 8 10.2928932 2.29289322 11.7071068 3.70710678 7.41421356 8\"\n ></polygon>\n </g>\n </svg>\n </span>\n <span class=\"expand-icon-wrapper\" *ngIf=\"(rowItem && rowItem['$isDetailOpen']) || rowItem.$expandConfig?.expand\">\n <svg\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g id=\"\u64CD\u4F5C/chevron_down\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <polygon id=\"chevron_down\" fill=\"#293040\" points=\"4.5 5 8 8.76923077 11.5 5 13 6.61538462 8 12 3 6.61538462\"></polygon>\n </g>\n </svg>\n </span>\n </div>\n</td>\n<td\n *ngIf=\"checkable\"\n class=\"devui-checkable-cell\"\n [ngClass]=\"{ 'devui-sticky-left-cell': columns[0]?.fixedLeft }\"\n [style.left]=\"showExpandToggle && columns[0]?.fixedLeft ? '36px' : '0'\"\n>\n <d-checkbox\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"onRowCheckChange($event, rowIndex, nestedIndex, rowItem)\"\n [ngModel]=\"rowItem.$checked\"\n [halfchecked]=\"rowItem.$halfChecked\"\n [disabled]=\"rowItem.$checkDisabled || rowItem.$disabled\"\n dTooltip\n [content]=\"rowItem.$checkBoxTips\"\n [position]=\"['top', 'right', 'bottom', 'left']\"\n [showAnimation]=\"true\"\n (mouseup)=\"$event.stopPropagation()\"\n >\n </d-checkbox>\n</td>\n<ng-container *ngFor=\"let column of columns; let colIndex = index; trackBy: trackByFn\">\n <td\n dDataTableCell\n [rowIndex]=\"rowIndex\"\n [colIndex]=\"colIndex\"\n [column]=\"column\"\n [rowItem]=\"rowItem\"\n [editModel]=\"rowItem.$$editModel || editModel\"\n [isEditRow]=\"rowItem.$$edit\"\n [timeout]=\"timeout\"\n [tableLevel]=\"tableLevel\"\n class=\"{{ column.cellClass ? column.cellClass : '' }}\"\n [ngClass]=\"{\n 'devui-sticky-left-cell': column.fixedLeft,\n 'devui-sticky-right-cell': column.fixedRight,\n 'devui-last-sticky-left-cell': column.fixedLeft && !columns[colIndex + 1]?.fixedLeft,\n 'devui-first-sticky-right-cell': column.fixedRight && !columns[colIndex - 1]?.fixedRight\n }\"\n [style.left]=\"column.fixedLeft ? column.fixedLeft : null\"\n [style.right]=\"column.fixedRight ? column.fixedRight : null\"\n ></td>\n</ng-container>\n", styles: ["svg.svg-icon-arrow>g>polygon{fill:var(--devui-icon-text, #808080)}:host ::ng-deep d-button button.d-btn.d-btn-icon{padding:0!important}:host ::ng-deep .cell-modify{position:absolute;right:0;cursor:pointer}:host ::ng-deep .cell-modify>svg{vertical-align:middle}:host ::ng-deep .cell-modify:hover>svg>g>g{fill:var(--devui-icon-text, #808080)}:host ::ng-deep .cell-placeholder{display:inline-block;height:16px}:host ::ng-deep .cell-container{position:relative;height:24px}:host ::ng-deep .cell-container-inner{position:absolute;max-width:100%;width:100%}:host ::ng-deep .cell-container-inner.modify-holder{padding-right:20px}:host ::ng-deep .cell-container-inner.modify-holder .cell-modify{display:none;cursor:pointer;position:absolute;right:0}:host ::ng-deep .cell-container-inner.modify-holder .cell-modify>svg{vertical-align:middle}:host ::ng-deep .cell-container-inner.modify-holder .cell-modify>svg>g{fill:var(--devui-icon-text, #808080)}:host ::ng-deep .cell-container-inner.modify-holder .cell-modify:hover>svg>g{fill:var(--devui-icon-fill-active-hover, #000000)}:host ::ng-deep .cell-container-inner.modify-holder:hover .cell-modify{display:inline}:host ::ng-deep .not-break{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-spacing:normal;word-wrap:normal}:host ::ng-deep .cell-editable{cursor:pointer;margin-left:-5px;padding-left:5px;min-height:20px}.expand-icon-wrapper{display:flex;justify-content:left}.expand-icon-wrapper polygon{fill:var(--devui-icon-fill, #595959)}\n"] }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [DATA_TABLE] }] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { rowItem: [{ type: Input }], fontWeight: [{ type: HostBinding, args: ['style.font-weight'] }], verticalAlign: [{ type: HostBinding, args: ['style.vertical-align'] }], selectable: [{ type: Input }], checkable: [{ type: Input }], showExpandToggle: [{ type: Input }], rowIndex: [{ type: Input }], allChecked: [{ type: Input }], columns: [{ type: Input }], editModel: [{ type: Input }], editRowItem: [{ type: Input }], resizeable: [{ type: Input }], timeout: [{ type: Input }], tableLevel: [{ type: Input }], nestedIndex: [{ type: Input }], generalRowHoveredData: [{ type: Input }], detailChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvZGF0YS10YWJsZS9kYXRhLXRhYmxlLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9kZXZ1aS9kYXRhLXRhYmxlL2RhdGEtdGFibGUtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7OztBQWVoRSxNQUFNLE9BQU8scUJBQXFCO0lBd0JoQyxZQUM2QixFQUFPLEVBQzFCLGlCQUFvQyxFQUNwQyxNQUFrQixFQUNsQixNQUFjO1FBSEssT0FBRSxHQUFGLEVBQUUsQ0FBSztRQUMxQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTFCVSxlQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsUUFBUSxDQUFDO1FBY3BELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVqRCxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUV6RCxlQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUztJQVF0QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxF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QUFDLHFCQUFxQixDQUFDO2FBQ3JEO1NBQ0YsMEJDNUJILHMwR0FnRkE7OzRGRGxEYSxxQkFBcUI7a0JBWmpDLFNBQVM7K0JBQ0UsbUNBQW1DLHVCQUd4QixLQUFLLGFBQ2Y7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGNBQWM7NEJBQ3ZCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDO3lCQUNyRDtxQkFDRjs7MEJBMkJFLE1BQU07MkJBQUMsVUFBVTt1SEF4QlgsT0FBTztzQkFBZixLQUFLO2dCQUM0QixVQUFVO3NCQUEzQyxXQUFXO3VCQUFDLG1CQUFtQjtnQkFDSyxhQUFhO3NCQUFqRCxXQUFXO3VCQUFDLHNCQUFzQjtnQkFDMUIsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgREFUQV9UQUJMRV9ST1cgfSBmcm9tICcuL2RhdGEtdGFibGUtcm93LnRva2VuJztcclxuaW1wb3J0IHsgREFUQV9UQUJMRSB9IGZyb20gJy4vZGF0YS10YWJsZS50b2tlbic7XHJcbmltcG9ydCB7IEZvcmNlVXBkYXRlUmVhc29uIH0gZnJvbSAnLi9mb3JjZS11cGRhdGUtcmVhc29uLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uVG1wbENvbXBvbmVudCB9IGZyb20gJy4vdG1wbC9kYXRhLXRhYmxlLWNvbHVtbi10bXBsLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtZGF0YS10YWJsZS1yb3csIFtkRGF0YVRhYmxlUm93XScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUtcm93LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLXJvdy5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBEQVRBX1RBQkxFX1JPVyxcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0YVRhYmxlUm93Q29tcG9uZW50KSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZVJvd0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgcm93SXRlbTogYW55O1xyXG4gIEBIb3N0QmluZGluZygnc3R5bGUuZm9udC13ZWlnaHQnKSBmb250V2VpZ2h0ID0gJ25vcm1hbCc7XHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS52ZXJ0aWNhbC1hbGlnbicpIHZlcnRpY2FsQWxpZ24gPSAnbWlkZGxlJztcclxuICBASW5wdXQoKSBzZWxlY3RhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGNoZWNrYWJsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzaG93RXhwYW5kVG9nZ2xlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHJvd0luZGV4OiBudW1iZXI7XHJcbiAgQElucHV0KCkgYWxsQ2hlY2tlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5UbXBsQ29tcG9uZW50W107XHJcbiAgQElucHV0KCkgZWRpdE1vZGVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZWRpdFJvd0l0ZW06IGFueTtcclxuICBASW5wdXQoKSByZXNpemVhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHRpbWVvdXQ6IG51bWJlcjtcclxuICBASW5wdXQoKSB0YWJsZUxldmVsOiBudW1iZXI7XHJcbiAgQElucHV0KCkgbmVzdGVkSW5kZXg6IHN0cmluZztcclxuICBASW5wdXQoKSBnZW5lcmFsUm93SG92ZXJlZERhdGE6IGJvb2xlYW47XHJcbiAgQE91dHB1dCgpIGRldGFpbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBmb3JjZVVwZGF0ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JjZVVwZGF0ZVJlYXNvbj4oKTtcclxuXHJcbiAgY2xpY2tDb3VudCA9IDA7IC8vIOiusOW9leeCueWHu+asoeaVsFxyXG4gIHRpbWVvdXRJZDsgLy8g5bu25pe2aWRcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KERBVEFfVEFCTEUpIHB1YmxpYyBkdDogYW55LFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHJvd1JlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLnJvd1JlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUm93Q2xpY2suYmluZCh0aGlzKSk7XHJcbiAgICAgIHRoaXMucm93UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uUm93REJDbGljay5iaW5kKHRoaXMpKTtcclxuICAgICAgaWYgKHRoaXMuZ2VuZXJhbFJvd0hvdmVyZWREYXRhKSB7XHJcbiAgICAgICAgdGhpcy5yb3dSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5vblJvd01vdXNlRW50ZXIuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5yb3dSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5vblJvd01vdXNlTGVhdmUuYmluZCh0aGlzKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZm9yY2VVcGRhdGUoKSB7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgdGhpcy5mb3JjZVVwZGF0ZUV2ZW50LmVtaXQoRm9yY2VVcGRhdGVSZWFzb24uUm93VXBkYXRlKTtcclxuICB9XHJcblxyXG4gIG9uUm93Q2xpY2soJGV2ZW50KSB7XHJcbiAgICB0aGlzLmNsaWNrQ291bnQrKztcclxuICAgIGlmICh0aGlzLmNsaWNrQ291bnQgPT09IDEpIHtcclxuICAgICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jbGlja0NvdW50ID09PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLmR0Lm9uUm93Q2xpY2soe1xyXG4gICAgICAgICAgICByb3dJbmRleDogdGhpcy5yb3dJbmRleCxcclxuICAgICAgICAgICAgbmVzdGVkSW5kZXg6IHRoaXMubmVzdGVkSW5kZXgsXHJcbiAgICAgICAgICAgIHJvd0l0ZW06IHRoaXMucm93SXRlbSxcclxuICAgICAgICAgICAgcm93Q29tcG9uZW50OiB0aGlzLFxyXG4gICAgICAgICAgICBldmVudDogJGV2ZW50LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2xpY2tDb3VudCA9IDA7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcclxuICAgICAgfSwgdGhpcy50aW1lb3V0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUm93REJDbGljaygkZXZlbnQpIHtcclxuICAgIHRoaXMuZHQub25Sb3dEQkNsaWNrKHsgcm93SW5kZXg6IHRoaXMucm93SW5kZXgsIG5lc3RlZEluZGV4OiB0aGlzLm5lc3RlZEluZGV4LCByb3dJdGVtOiB0aGlzLnJvd0l0ZW0sIHJvd0NvbXBvbmVudDogdGhpcyB9KTtcclxuICB9XHJcblxyXG4gIG9uUm93TW91c2VFbnRlcigkZXZlbnQpIHtcclxuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgIHRoaXMucm93SXRlbS4kaG92ZXJlZCA9IHRydWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uUm93TW91c2VMZWF2ZSgkZXZlbnQpIHtcclxuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgIHRoaXMucm93SXRlbS4kaG92ZXJlZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblJvd0NoZWNrQ2hhbmdlKCRldmVudCwgcm93SW5kZXgsIG5lc3RlZEluZGV4LCByb3dJdGVtKSB7XHJcbiAgICByb3dJdGVtLiRjaGVja2VkID0gJGV2ZW50O1xyXG4gICAgcm93SXRlbS4kaGFsZkNoZWNrZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZHQuc2V0Um93Q2hlY2tTdGF0dXMoeyByb3dJdGVtLCByb3dJbmRleCwgbmVzdGVkSW5kZXgsIGNoZWNrZWQ6ICRldmVudCB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZSgpIHtcclxuICAgIGlmICh0aGlzLnJvd0l0ZW0uJGlzRGV0YWlsT3BlbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucm93SXRlbS4kaXNEZXRhaWxPcGVuID0gISF0aGlzLnJvd0l0ZW0uJGV4cGFuZENvbmZpZz8uZXhwYW5kO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yb3dJdGVtLiRpc0RldGFpbE9wZW4gPSAhdGhpcy5yb3dJdGVtLiRpc0RldGFpbE9wZW47XHJcbiAgICBpZiAodGhpcy5yb3dJdGVtLiRleHBhbmRDb25maWcpIHtcclxuICAgICAgdGhpcy5yb3dJdGVtLiRleHBhbmRDb25maWcuZXhwYW5kID0gIXRoaXMucm93SXRlbS4kZXhwYW5kQ29uZmlnLmV4cGFuZDtcclxuICAgIH1cclxuICAgIHRoaXMuZGV0YWlsQ2hhbmdlLmVtaXQoeyBzdGF0ZTogdGhpcy5yb3dJdGVtLiRpc0RldGFpbE9wZW4sIGluZGV4OiB0aGlzLnJvd0luZGV4IH0pO1xyXG4gICAgdGhpcy5kdC5vbkRldGFpbFRvZ2dsZSh7IHN0YXRlOiB0aGlzLnJvd0l0ZW0uJGlzRGV0YWlsT3BlbiwgaW5kZXg6IHRoaXMucm93SW5kZXggfSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Rm4oaW5kZXgsIGl0ZW0pIHtcclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcbn1cclxuIiwiPHRkICpuZ0lmPVwic2hvd0V4cGFuZFRvZ2dsZVwiIGNsYXNzPVwiZGV2dWktZGV0YWlsLWNlbGxcIiBbbmdDbGFzc109XCJ7ICdkZXZ1aS1zdGlja3ktbGVmdC1jZWxsJzogY29sdW1uc1swXT8uZml4ZWRMZWZ0IH1cIiBbc3R5bGUubGVmdF09XCIwXCI+XG4gIDxkaXYgKm5nSWY9XCJyb3dJdGVtLmRldGFpbCB8fCByb3dJdGVtPy4kZXhwYW5kQ29uZmlnXCIgKGNsaWNrKT1cInRvZ2dsZSgpXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJleHBhbmQtaWNvbi13cmFwcGVyXCIgKm5nSWY9XCIhcm93SXRlbVsnJGlzRGV0YWlsT3BlbiddICYmICFyb3dJdGVtLiRleHBhbmRDb25maWc/LmV4cGFuZFwiPlxuICAgICAgPHN2Z1xuICAgICAgICB3aWR0aD1cIjE2cHhcIlxuICAgICAgICBoZWlnaHQ9XCIxNnB4XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgIHZlcnNpb249XCIxLjFcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgID5cbiAgICAgICAgPGcgaWQ9XCLmk43kvZwvY29sbGFwc2UyXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICA8cG9seWdvblxuICAgICAgICAgICAgaWQ9XCLot6/lvoRcIlxuICAgICAgICAgICAgZmlsbD1cIiMyOTMwNDBcIlxuICAgICAgICAgICAgZmlsbC1ydWxlPVwibm9uemVyb1wiXG4gICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoOC4xNDY0NDcsIDguMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC04LjE0NjQ0NywgLTguMDAwMDAwKSBcIlxuICAgICAgICAgICAgcG9pbnRzPVwiMTEuNzA3MTA2OCAxMi4yOTI4OTMyIDEwLjI5Mjg5MzIgMTMuNzA3MTA2OCA0LjU4NTc4NjQ0IDggMTAuMjkyODkzMiAyLjI5Mjg5MzIyIDExLjcwNzEwNjggMy43MDcxMDY3OCA3LjQxNDIxMzU2IDhcIlxuICAgICAgICAgID48L3BvbHlnb24+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImV4cGFuZC1pY29uLXdyYXBwZXJcIiAqbmdJZj1cIihyb3dJdGVtICYmIHJvd0l0ZW1bJyRpc0RldGFpbE9wZW4nXSkgfHwgcm93SXRlbS4kZXhwYW5kQ29uZmlnPy5leHBhbmRcIj5cbiAgICAgIDxzdmdcbiAgICAgICAgd2lkdGg9XCIxNnB4XCJcbiAgICAgICAgaGVpZ2h0PVwiMTZweFwiXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICA+XG4gICAgICAgIDxnIGlkPVwi5pON5L2cL2NoZXZyb25fZG93blwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgPHBvbHlnb24gaWQ9XCJjaGV2cm9uX2Rvd25cIiBmaWxsPVwiIzI5MzA0MFwiIHBvaW50cz1cIjQuNSA1IDggOC43NjkyMzA3NyAxMS41IDUgMTMgNi42MTUzODQ2MiA4IDEyIDMgNi42MTUzODQ2MlwiPjwvcG9seWdvbj5cbiAgICAgICAgPC9nPlxuICAgICAgPC9zdmc+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvdGQ+XG48dGRcbiAgKm5nSWY9XCJjaGVja2FibGVcIlxuICBjbGFzcz1cImRldnVpLWNoZWNrYWJsZS1jZWxsXCJcbiAgW25nQ2xhc3NdPVwieyAnZGV2dWktc3RpY2t5LWxlZnQtY2VsbCc6IGNvbHVtbnNbMF0/LmZpeGVkTGVmdCB9XCJcbiAgW3N0eWxlLmxlZnRdPVwic2hvd0V4cGFuZFRvZ2dsZSAmJiBjb2x1bW5zWzBdPy5maXhlZExlZnQgPyAnMzZweCcgOiAnMCdcIlxuPlxuICA8ZC1jaGVja2JveFxuICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Sb3dDaGVja0NoYW5nZSgkZXZlbnQsIHJvd0luZGV4LCBuZXN0ZWRJbmRleCwgcm93SXRlbSlcIlxuICAgIFtuZ01vZGVsXT1cInJvd0l0ZW0uJGNoZWNrZWRcIlxuICAgIFtoYWxmY2hlY2tlZF09XCJyb3dJdGVtLiRoYWxmQ2hlY2tlZFwiXG4gICAgW2Rpc2FibGVkXT1cInJvd0l0ZW0uJGNoZWNrRGlzYWJsZWQgfHwgcm93SXRlbS4kZGlzYWJsZWRcIlxuICAgIGRUb29sdGlwXG4gICAgW2NvbnRlbnRdPVwicm93SXRlbS4kY2hlY2tCb3hUaXBzXCJcbiAgICBbcG9zaXRpb25dPVwiWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXVwiXG4gICAgW3Nob3dBbmltYXRpb25dPVwidHJ1ZVwiXG4gICAgKG1vdXNldXApPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgPlxuICA8L2QtY2hlY2tib3g+XG48L3RkPlxuPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBjb2xJbmRleCA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cbiAgPHRkXG4gICAgZERhdGFUYWJsZUNlbGxcbiAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxuICAgIFtjb2xJbmRleF09XCJjb2xJbmRleFwiXG4gICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgIFtyb3dJdGVtXT1cInJvd0l0ZW1cIlxuICAgIFtlZGl0TW9kZWxdPVwicm93SXRlbS4kJGVkaXRNb2RlbCB8fCBlZGl0TW9kZWxcIlxuICAgIFtpc0VkaXRSb3ddPVwicm93SXRlbS4kJGVkaXRcIlxuICAgIFt0aW1lb3V0XT1cInRpbWVvdXRcIlxuICAgIFt0YWJsZUxldmVsXT1cInRhYmxlTGV2ZWxcIlxuICAgIGNsYXNzPVwie3sgY29sdW1uLmNlbGxDbGFzcyA/IGNvbHVtbi5jZWxsQ2xhc3MgOiAnJyB9fVwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ2RldnVpLXN0aWNreS1sZWZ0LWNlbGwnOiBjb2x1bW4uZml4ZWRMZWZ0LFxuICAgICAgJ2RldnVpLXN0aWNreS1yaWdodC1jZWxsJzogY29sdW1uLmZpeGVkUmlnaHQsXG4gICAgICAnZGV2dWktbGFzdC1zdGlja3ktbGVmdC1jZWxsJzogY29sdW1uLmZpeGVkTGVmdCAmJiAhY29sdW1uc1tjb2xJbmRleCArIDFdPy5maXhlZExlZnQsXG4gICAgICAnZGV2dWktZmlyc3Qtc3RpY2t5LXJpZ2h0LWNlbGwnOiBjb2x1bW4uZml4ZWRSaWdodCAmJiAhY29sdW1uc1tjb2xJbmRleCAtIDFdPy5maXhlZFJpZ2h0XG4gICAgfVwiXG4gICAgW3N0eWxlLmxlZnRdPVwiY29sdW1uLmZpeGVkTGVmdCA/IGNvbHVtbi5maXhlZExlZnQgOiBudWxsXCJcbiAgICBbc3R5bGUucmlnaHRdPVwiY29sdW1uLmZpeGVkUmlnaHQgPyBjb2x1bW4uZml4ZWRSaWdodCA6IG51bGxcIlxuICA+PC90ZD5cbjwvbmctY29udGFpbmVyPlxuIl19