UNPKG

carbon-components-angular

Version:
321 lines 26.7 kB
import { Component, Input, Output, EventEmitter } from "@angular/core"; import { getScrollbarWidth } from "carbon-components-angular/utils"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/i18n"; import * as i2 from "@angular/common"; import * as i3 from "./table-head-cell.component"; import * as i4 from "./table-head-checkbox.component"; import * as i5 from "./table-head-expand.component"; /** * A subcomponent that creates the thead of the table * * ## Basic usage * * ```html * <thead cdsTableHead [model]="model"></thead> * ``` */ export class TableHead { constructor(i18n) { this.i18n = i18n; this.showSelectionColumn = true; this.enableSingleSelect = false; this.selectAllCheckboxSomeSelected = false; this.selectAllCheckbox = false; this.skeleton = false; this.stickyHeader = false; this.showExpandAllToggle = false; /** * Setting sortable to false will disable all headers including headers which are sortable. Is is * possible to set the sortable state on the header item to disable/enable sorting for only some headers. */ this.sortable = true; /** * When true, the first model column is rendered before expand/selection (Carbon AI row decorator column). */ this.withRowAILabels = false; /** * Emits an index of the column that wants to be sorted. */ this.sort = new EventEmitter(); /** * Emits if all rows are selected. * * @param model */ this.selectAll = new EventEmitter(); /** * Emits if all rows are deselected. * * @param model */ this.deselectAll = new EventEmitter(); /** * Emits if all rows are expanded. * * @param model */ this.expandAllRows = new EventEmitter(); /** * Emits if all rows are collapsed. * * @param model */ this.collapseAllRows = new EventEmitter(); this.scrollbarWidth = 0; this._checkboxHeaderLabel = this.i18n.getOverridable("TABLE.CHECKBOX_HEADER"); this._sortDescendingLabel = this.i18n.getOverridable("TABLE.SORT_DESCENDING"); this._sortAscendingLabel = this.i18n.getOverridable("TABLE.SORT_ASCENDING"); this._filterTitle = this.i18n.getOverridable("TABLE.FILTER"); } set checkboxHeaderLabel(value) { this._checkboxHeaderLabel.override(value); } get checkboxHeaderLabel() { return this._checkboxHeaderLabel.value; } set sortDescendingLabel(value) { this._sortDescendingLabel.override(value); } get sortDescendingLabel() { return this._sortDescendingLabel.value; } set sortAscendingLabel(value) { this._sortAscendingLabel.override(value); } get sortAscendingLabel() { return this._sortAscendingLabel.value; } set filterTitle(value) { this._filterTitle.override(value); } get filterTitle() { return this._filterTitle.value; } ngAfterViewInit() { setTimeout(() => { this.scrollbarWidth = getScrollbarWidth(); }); } onSelectAllCheckboxChange() { if (!this.selectAllCheckbox && !this.selectAllCheckboxSomeSelected) { this.selectAll.emit(this.model); } else { this.deselectAll.emit(this.model); } } onExpandAllRowsChange(expand) { if (expand) { this.expandAllRows.emit(this.model); } else { this.collapseAllRows.emit(this.model); } } getCheckboxHeaderLabel() { return this._checkboxHeaderLabel.subject; } getSortDescendingLabel() { return this._sortDescendingLabel.subject; } getSortAscendingLabel() { return this._sortAscendingLabel.subject; } getFilterTitle() { return this._filterTitle.subject; } } TableHead.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableHead, deps: [{ token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component }); TableHead.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableHead, selector: "[cdsTableHead], [ibmTableHead]", inputs: { model: "model", showSelectionColumn: "showSelectionColumn", enableSingleSelect: "enableSingleSelect", selectAllCheckboxSomeSelected: "selectAllCheckboxSomeSelected", selectAllCheckbox: "selectAllCheckbox", skeleton: "skeleton", stickyHeader: "stickyHeader", showExpandAllToggle: "showExpandAllToggle", sortable: "sortable", withRowAILabels: "withRowAILabels", checkboxHeaderLabel: "checkboxHeaderLabel", sortDescendingLabel: "sortDescendingLabel", sortAscendingLabel: "sortAscendingLabel", filterTitle: "filterTitle" }, outputs: { sort: "sort", selectAll: "selectAll", deselectAll: "deselectAll", expandAllRows: "expandAllRows", collapseAllRows: "collapseAllRows" }, ngImport: i0, template: ` <ng-container *ngIf="model"> <tr> <th *ngIf="withRowAILabels && model.header[0] && model.header[0].visible" [ngStyle]="model.header[0].style" cdsTableHeadCell scope="col" [class]="model.header[0].className" [sortable]="sortable" [skeleton]="skeleton" [id]="model.getId(0)" [column]="model.header[0]" [filterTitle]="getFilterTitle()" [attr.colspan]="model.header[0].colSpan" [attr.rowspan]="model.header[0].rowSpan" (sort)="sort.emit(0)"> </th> <th cdsTableHeadExpand *ngIf="model.hasExpandableRows()" scope="col" [showExpandAllToggle]="showExpandAllToggle" [ngClass]="{'cds--table-expand-v2': stickyHeader}" [id]="model.getId('expand')" [expanded]="model.expandableRowsCount() === model.expandedRowsCount()" (expandedChange)="onExpandAllRowsChange($event)"> </th> <th *ngIf="!skeleton && showSelectionColumn && enableSingleSelect" scope="col" [id]="model.getId('select')"> <!-- add width 0; since the carbon styles don't seem to constrain this headers width --> </th> <th cdsTableHeadCheckbox *ngIf="!skeleton && showSelectionColumn && !enableSingleSelect" scope="col" [checked]="selectAllCheckbox" [indeterminate]="selectAllCheckboxSomeSelected" [ariaLabel]="getCheckboxHeaderLabel()" [skeleton]="skeleton" [name]="model.getHeaderId('select')" (change)="onSelectAllCheckboxChange()" [id]="model.getId('select')"> </th> <ng-container *ngFor="let column of model.header; let i = index"> <th *ngIf="column && column.visible && (!withRowAILabels || i > 0)" [ngStyle]="column.style" cdsTableHeadCell scope="col" [class]="column.className" [sortable]="sortable" [skeleton]="skeleton" [id]="model.getId(i)" [column]="column" [filterTitle]="getFilterTitle()" [attr.colspan]="column.colSpan" [attr.rowspan]="column.rowSpan" (sort)="sort.emit(i)"> </th> </ng-container> <th *ngIf="!skeleton && stickyHeader && scrollbarWidth" scope="col" [ngStyle]="{'width': scrollbarWidth + 'px', 'padding': 0, 'border': 0}"> <!-- Scrollbar pushes body to the left so this header column is added to push the title bar the same amount and keep the header and body columns aligned. --> </th> </tr> </ng-container> <ng-content></ng-content> `, isInline: true, styles: [".cds--table-expand-v2{padding-left:2.5rem}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.TableHeadCell, selector: "[cdsTableHeadCell], [ibmTableHeadCell]", inputs: ["column", "skeleton", "sortable", "sortDescendingLabel", "sortAscendingLabel", "filterTitle"], outputs: ["sort"] }, { kind: "component", type: i4.TableHeadCheckbox, selector: "[cdsTableHeadCheckbox], [ibmTableHeadCheckbox]", inputs: ["checked", "indeterminate", "skeleton", "name", "ariaLabel"], outputs: ["change"] }, { kind: "component", type: i5.TableHeadExpand, selector: "[cdsTableHeadExpand], [ibmTableHeadExpand]", inputs: ["showExpandAllToggle", "expanded"], outputs: ["expandedChange"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableHead, decorators: [{ type: Component, args: [{ selector: "[cdsTableHead], [ibmTableHead]", template: ` <ng-container *ngIf="model"> <tr> <th *ngIf="withRowAILabels && model.header[0] && model.header[0].visible" [ngStyle]="model.header[0].style" cdsTableHeadCell scope="col" [class]="model.header[0].className" [sortable]="sortable" [skeleton]="skeleton" [id]="model.getId(0)" [column]="model.header[0]" [filterTitle]="getFilterTitle()" [attr.colspan]="model.header[0].colSpan" [attr.rowspan]="model.header[0].rowSpan" (sort)="sort.emit(0)"> </th> <th cdsTableHeadExpand *ngIf="model.hasExpandableRows()" scope="col" [showExpandAllToggle]="showExpandAllToggle" [ngClass]="{'cds--table-expand-v2': stickyHeader}" [id]="model.getId('expand')" [expanded]="model.expandableRowsCount() === model.expandedRowsCount()" (expandedChange)="onExpandAllRowsChange($event)"> </th> <th *ngIf="!skeleton && showSelectionColumn && enableSingleSelect" scope="col" [id]="model.getId('select')"> <!-- add width 0; since the carbon styles don't seem to constrain this headers width --> </th> <th cdsTableHeadCheckbox *ngIf="!skeleton && showSelectionColumn && !enableSingleSelect" scope="col" [checked]="selectAllCheckbox" [indeterminate]="selectAllCheckboxSomeSelected" [ariaLabel]="getCheckboxHeaderLabel()" [skeleton]="skeleton" [name]="model.getHeaderId('select')" (change)="onSelectAllCheckboxChange()" [id]="model.getId('select')"> </th> <ng-container *ngFor="let column of model.header; let i = index"> <th *ngIf="column && column.visible && (!withRowAILabels || i > 0)" [ngStyle]="column.style" cdsTableHeadCell scope="col" [class]="column.className" [sortable]="sortable" [skeleton]="skeleton" [id]="model.getId(i)" [column]="column" [filterTitle]="getFilterTitle()" [attr.colspan]="column.colSpan" [attr.rowspan]="column.rowSpan" (sort)="sort.emit(i)"> </th> </ng-container> <th *ngIf="!skeleton && stickyHeader && scrollbarWidth" scope="col" [ngStyle]="{'width': scrollbarWidth + 'px', 'padding': 0, 'border': 0}"> <!-- Scrollbar pushes body to the left so this header column is added to push the title bar the same amount and keep the header and body columns aligned. --> </th> </tr> </ng-container> <ng-content></ng-content> `, styles: [".cds--table-expand-v2{padding-left:2.5rem}\n"] }] }], ctorParameters: function () { return [{ type: i1.I18n }]; }, propDecorators: { model: [{ type: Input }], showSelectionColumn: [{ type: Input }], enableSingleSelect: [{ type: Input }], selectAllCheckboxSomeSelected: [{ type: Input }], selectAllCheckbox: [{ type: Input }], skeleton: [{ type: Input }], stickyHeader: [{ type: Input }], showExpandAllToggle: [{ type: Input }], sortable: [{ type: Input }], withRowAILabels: [{ type: Input }], checkboxHeaderLabel: [{ type: Input }], sortDescendingLabel: [{ type: Input }], sortAscendingLabel: [{ type: Input }], filterTitle: [{ type: Input }], sort: [{ type: Output }], selectAll: [{ type: Output }], deselectAll: [{ type: Output }], expandAllRows: [{ type: Output }], collapseAllRows: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaGVhZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGFibGUvaGVhZC90YWJsZS1oZWFkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUVaLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7O0FBS3BFOzs7Ozs7OztHQVFHO0FBcUZILE1BQU0sT0FBTyxTQUFTO0lBb0dyQixZQUFzQixJQUFVO1FBQVYsU0FBSSxHQUFKLElBQUksQ0FBTTtRQWpHdkIsd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBRTNCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUUzQixrQ0FBNkIsR0FBRyxLQUFLLENBQUM7UUFFdEMsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRTFCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRXJDOzs7V0FHRztRQUNNLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFFekI7O1dBRUc7UUFDTSxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQXNDakM7O1dBRUc7UUFDTyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM1Qzs7OztXQUlHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7UUFDckQ7Ozs7V0FJRztRQUNPLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN2RDs7OztXQUlHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3pEOzs7O1dBSUc7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7UUFFcEQsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFF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MEVUOzJGQU9XLFNBQVM7a0JBcEZyQixTQUFTOytCQUVDLGdDQUFnQyxZQUNoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwRVQ7MkZBUVEsS0FBSztzQkFBYixLQUFLO2dCQUVHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFFRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsNkJBQTZCO3NCQUFyQyxLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBVUYsbUJBQW1CO3NCQUR0QixLQUFLO2dCQVVGLGtCQUFrQjtzQkFEckIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBWUksSUFBSTtzQkFBYixNQUFNO2dCQU1HLFNBQVM7c0JBQWxCLE1BQU07Z0JBTUcsV0FBVztzQkFBcEIsTUFBTTtnQkFNRyxhQUFhO3NCQUF0QixNQUFNO2dCQU1HLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0QWZ0ZXJWaWV3SW5pdFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgeyBUYWJsZU1vZGVsIH0gZnJvbSBcIi4uL3RhYmxlLW1vZGVsLmNsYXNzXCI7XG5pbXBvcnQgeyBnZXRTY3JvbGxiYXJXaWR0aCB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL3V0aWxzXCI7XG5pbXBvcnQgeyBJMThuLCBPdmVycmlkYWJsZSB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2kxOG5cIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgVGFibGVSb3dTaXplIH0gZnJvbSBcIi4uL3RhYmxlLnR5cGVzXCI7XG5cbi8qKlxuICogQSBzdWJjb21wb25lbnQgdGhhdCBjcmVhdGVzIHRoZSB0aGVhZCBvZiB0aGUgdGFibGVcbiAqXG4gKiAjIyBCYXNpYyB1c2FnZVxuICpcbiAqIGBgYGh0bWxcbiAqIFx0PHRoZWFkIGNkc1RhYmxlSGVhZCBbbW9kZWxdPVwibW9kZWxcIj48L3RoZWFkPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuXHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIltjZHNUYWJsZUhlYWRdLCBbaWJtVGFibGVIZWFkXVwiLFxuXHR0ZW1wbGF0ZTogYFxuXHQ8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZWxcIj5cblx0XHQ8dHI+XG5cdFx0XHQ8dGhcblx0XHRcdFx0Km5nSWY9XCJ3aXRoUm93QUlMYWJlbHMgJiYgbW9kZWwuaGVhZGVyWzBdICYmIG1vZGVsLmhlYWRlclswXS52aXNpYmxlXCJcblx0XHRcdFx0W25nU3R5bGVdPVwibW9kZWwuaGVhZGVyWzBdLnN0eWxlXCJcblx0XHRcdFx0Y2RzVGFibGVIZWFkQ2VsbFxuXHRcdFx0XHRzY29wZT1cImNvbFwiXG5cdFx0XHRcdFtjbGFzc109XCJtb2RlbC5oZWFkZXJbMF0uY2xhc3NOYW1lXCJcblx0XHRcdFx0W3NvcnRhYmxlXT1cInNvcnRhYmxlXCJcblx0XHRcdFx0W3NrZWxldG9uXT1cInNrZWxldG9uXCJcblx0XHRcdFx0W2lkXT1cIm1vZGVsLmdldElkKDApXCJcblx0XHRcdFx0W2NvbHVtbl09XCJtb2RlbC5oZWFkZXJbMF1cIlxuXHRcdFx0XHRbZmlsdGVyVGl0bGVdPVwiZ2V0RmlsdGVyVGl0bGUoKVwiXG5cdFx0XHRcdFthdHRyLmNvbHNwYW5dPVwibW9kZWwuaGVhZGVyWzBdLmNvbFNwYW5cIlxuXHRcdFx0XHRbYXR0ci5yb3dzcGFuXT1cIm1vZGVsLmhlYWRlclswXS5yb3dTcGFuXCJcblx0XHRcdFx0KHNvcnQpPVwic29ydC5lbWl0KDApXCI+XG5cdFx0XHQ8L3RoPlxuXHRcdFx0PHRoXG5cdFx0XHRcdGNkc1RhYmxlSGVhZEV4cGFuZFxuXHRcdFx0XHQqbmdJZj1cIm1vZGVsLmhhc0V4cGFuZGFibGVSb3dzKClcIlxuXHRcdFx0XHRzY29wZT1cImNvbFwiXG5cdFx0XHRcdFtzaG93RXhwYW5kQWxsVG9nZ2xlXT1cInNob3dFeHBhbmRBbGxUb2dnbGVcIlxuXHRcdFx0XHRbbmdDbGFzc109XCJ7J2Nkcy0tdGFibGUtZXhwYW5kLXYyJzogc3RpY2t5SGVhZGVyfVwiXG5cdFx0XHRcdFtpZF09XCJtb2RlbC5nZXRJZCgnZXhwYW5kJylcIlxuXHRcdFx0XHRbZXhwYW5kZWRdPVwibW9kZWwuZXhwYW5kYWJsZVJvd3NDb3VudCgpID09PSBtb2RlbC5leHBhbmRlZFJvd3NDb3VudCgpXCJcblx0XHRcdFx0KGV4cGFuZGVkQ2hhbmdlKT1cIm9uRXhwYW5kQWxsUm93c0NoYW5nZSgkZXZlbnQpXCI+XG5cdFx0XHQ8L3RoPlxuXHRcdFx0PHRoXG5cdFx0XHRcdCpuZ0lmPVwiIXNrZWxldG9uICYmIHNob3dTZWxlY3Rpb25Db2x1bW4gJiYgZW5hYmxlU2luZ2xlU2VsZWN0XCJcblx0XHRcdFx0c2NvcGU9XCJjb2xcIlxuXHRcdFx0XHRbaWRdPVwibW9kZWwuZ2V0SWQoJ3NlbGVjdCcpXCI+XG5cdFx0XHRcdDwhLS0gYWRkIHdpZHRoIDA7IHNpbmNlIHRoZSBjYXJib24gc3R5bGVzIGRvbid0IHNlZW0gdG8gY29uc3RyYWluIHRoaXMgaGVhZGVycyB3aWR0aCAtLT5cblx0XHRcdDwvdGg+XG5cdFx0XHQ8dGhcblx0XHRcdFx0Y2RzVGFibGVIZWFkQ2hlY2tib3hcblx0XHRcdFx0Km5nSWY9XCIhc2tlbGV0b24gJiYgc2hvd1NlbGVjdGlvbkNvbHVtbiAmJiAhZW5hYmxlU2luZ2xlU2VsZWN0XCJcblx0XHRcdFx0c2NvcGU9XCJjb2xcIlxuXHRcdFx0XHRbY2hlY2tlZF09XCJzZWxlY3RBbGxDaGVja2JveFwiXG5cdFx0XHRcdFtpbmRldGVybWluYXRlXT1cInNlbGVjdEFsbENoZWNrYm94U29tZVNlbGVjdGVkXCJcblx0XHRcdFx0W2FyaWFMYWJlbF09XCJnZXRDaGVja2JveEhlYWRlckxhYmVsKClcIlxuXHRcdFx0XHRbc2tlbGV0b25dPVwic2tlbGV0b25cIlxuXHRcdFx0XHRbbmFtZV09XCJtb2RlbC5nZXRIZWFkZXJJZCgnc2VsZWN0JylcIlxuXHRcdFx0XHQoY2hhbmdlKT1cIm9uU2VsZWN0QWxsQ2hlY2tib3hDaGFuZ2UoKVwiXG5cdFx0XHRcdFtpZF09XCJtb2RlbC5nZXRJZCgnc2VsZWN0JylcIj5cblx0XHRcdDwvdGg+XG5cdFx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgbW9kZWwuaGVhZGVyOyBsZXQgaSA9IGluZGV4XCI+XG5cdFx0XHRcdDx0aFxuXHRcdFx0XHRcdCpuZ0lmPVwiY29sdW1uICYmIGNvbHVtbi52aXNpYmxlICYmICghd2l0aFJvd0FJTGFiZWxzIHx8IGkgPiAwKVwiXG5cdFx0XHRcdFx0W25nU3R5bGVdPVwiY29sdW1uLnN0eWxlXCJcblx0XHRcdFx0XHRjZHNUYWJsZUhlYWRDZWxsXG5cdFx0XHRcdFx0c2NvcGU9XCJjb2xcIlxuXHRcdFx0XHRcdFtjbGFzc109XCJjb2x1bW4uY2xhc3NOYW1lXCJcblx0XHRcdFx0XHRbc29ydGFibGVdPVwic29ydGFibGVcIlxuXHRcdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFx0W2lkXT1cIm1vZGVsLmdldElkKGkpXCJcblx0XHRcdFx0XHRbY29sdW1uXT1cImNvbHVtblwiXG5cdFx0XHRcdFx0W2ZpbHRlclRpdGxlXT1cImdldEZpbHRlclRpdGxlKClcIlxuXHRcdFx0XHRcdFthdHRyLmNvbHNwYW5dPVwiY29sdW1uLmNvbFNwYW5cIlxuXHRcdFx0XHRcdFthdHRyLnJvd3NwYW5dPVwiY29sdW1uLnJvd1NwYW5cIlxuXHRcdFx0XHRcdChzb3J0KT1cInNvcnQuZW1pdChpKVwiPlxuXHRcdFx0XHQ8L3RoPlxuXHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHQ8dGggKm5nSWY9XCIhc2tlbGV0b24gJiYgc3RpY2t5SGVhZGVyICYmIHNjcm9sbGJhcldpZHRoXCJcblx0XHRcdFx0c2NvcGU9XCJjb2xcIlxuXHRcdFx0XHRbbmdTdHlsZV09XCJ7J3dpZHRoJzogc2Nyb2xsYmFyV2lkdGggKyAncHgnLCAncGFkZGluZyc6IDAsICdib3JkZXInOiAwfVwiPlxuXHRcdFx0XHQ8IS0tXG5cdFx0XHRcdFx0U2Nyb2xsYmFyIHB1c2hlcyBib2R5IHRvIHRoZSBsZWZ0IHNvIHRoaXMgaGVhZGVyIGNvbHVtbiBpcyBhZGRlZCB0byBwdXNoXG5cdFx0XHRcdFx0dGhlIHRpdGxlIGJhciB0aGUgc2FtZSBhbW91bnQgYW5kIGtlZXAgdGhlIGhlYWRlciBhbmQgYm9keSBjb2x1bW5zIGFsaWduZWQuXG5cdFx0XHRcdC0tPlxuXHRcdFx0PC90aD5cblx0XHQ8L3RyPlxuXHQ8L25nLWNvbnRhaW5lcj5cblx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRgLFxuXHRzdHlsZXM6IFtgXG5cdFx0LmNkcy0tdGFibGUtZXhwYW5kLXYyIHtcblx0XHRcdHBhZGRpbmctbGVmdDogMi41cmVtO1xuXHRcdH1cblx0YF1cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVIZWFkIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cdEBJbnB1dCgpIG1vZGVsOiBUYWJsZU1vZGVsO1xuXG5cdEBJbnB1dCgpIHNob3dTZWxlY3Rpb25Db2x1bW4gPSB0cnVlO1xuXG5cdEBJbnB1dCgpIGVuYWJsZVNpbmdsZVNlbGVjdCA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpIHNlbGVjdEFsbENoZWNrYm94U29tZVNlbGVjdGVkID0gZmFsc2U7XG5cblx0QElucHV0KCkgc2VsZWN0QWxsQ2hlY2tib3ggPSBmYWxzZTtcblxuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpIHN0aWNreUhlYWRlciA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpIHNob3dFeHBhbmRBbGxUb2dnbGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogU2V0dGluZyBzb3J0YWJsZSB0byBmYWxzZSB3aWxsIGRpc2FibGUgYWxsIGhlYWRlcnMgaW5jbHVkaW5nIGhlYWRlcnMgd2hpY2ggYXJlIHNvcnRhYmxlLiBJcyBpc1xuXHQgKiBwb3NzaWJsZSB0byBzZXQgdGhlIHNvcnRhYmxlIHN0YXRlIG9uIHRoZSBoZWFkZXIgaXRlbSB0byBkaXNhYmxlL2VuYWJsZSBzb3J0aW5nIGZvciBvbmx5IHNvbWUgaGVhZGVycy5cblx0ICovXG5cdEBJbnB1dCgpIHNvcnRhYmxlID0gdHJ1ZTtcblxuXHQvKipcblx0ICogV2hlbiB0cnVlLCB0aGUgZmlyc3QgbW9kZWwgY29sdW1uIGlzIHJlbmRlcmVkIGJlZm9yZSBleHBhbmQvc2VsZWN0aW9uIChDYXJib24gQUkgcm93IGRlY29yYXRvciBjb2x1bW4pLlxuXHQgKi9cblx0QElucHV0KCkgd2l0aFJvd0FJTGFiZWxzID0gZmFsc2U7XG5cblx0QElucHV0KClcblx0c2V0IGNoZWNrYm94SGVhZGVyTGFiZWwodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX2NoZWNrYm94SGVhZGVyTGFiZWwub3ZlcnJpZGUodmFsdWUpO1xuXHR9XG5cblx0Z2V0IGNoZWNrYm94SGVhZGVyTGFiZWwoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2NoZWNrYm94SGVhZGVyTGFiZWwudmFsdWU7XG5cdH1cblxuXHRASW5wdXQoKVxuXHRzZXQgc29ydERlc2NlbmRpbmdMYWJlbCh2YWx1ZTogc3RyaW5nIHwgT2JzZXJ2YWJsZTxzdHJpbmc+KSB7XG5cdFx0dGhpcy5fc29ydERlc2NlbmRpbmdMYWJlbC5vdmVycmlkZSh2YWx1ZSk7XG5cdH1cblxuXHRnZXQgc29ydERlc2NlbmRpbmdMYWJlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fc29ydERlc2NlbmRpbmdMYWJlbC52YWx1ZTtcblx0fVxuXG5cdEBJbnB1dCgpXG5cdHNldCBzb3J0QXNjZW5kaW5nTGFiZWwodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX3NvcnRBc2NlbmRpbmdMYWJlbC5vdmVycmlkZSh2YWx1ZSk7XG5cdH1cblxuXHRnZXQgc29ydEFzY2VuZGluZ0xhYmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9zb3J0QXNjZW5kaW5nTGFiZWwudmFsdWU7XG5cdH1cblxuXHRASW5wdXQoKVxuXHRzZXQgZmlsdGVyVGl0bGUodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX2ZpbHRlclRpdGxlLm92ZXJyaWRlKHZhbHVlKTtcblx0fVxuXG5cdGdldCBmaWx0ZXJUaXRsZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fZmlsdGVyVGl0bGUudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogRW1pdHMgYW4gaW5kZXggb2YgdGhlIGNvbHVtbiB0aGF0IHdhbnRzIHRvIGJlIHNvcnRlZC5cblx0ICovXG5cdEBPdXRwdXQoKSBzb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cdC8qKlxuXHQgKiBFbWl0cyBpZiBhbGwgcm93cyBhcmUgc2VsZWN0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKi9cblx0QE91dHB1dCgpIHNlbGVjdEFsbCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVNb2RlbD4oKTtcblx0LyoqXG5cdCAqIEVtaXRzIGlmIGFsbCByb3dzIGFyZSBkZXNlbGVjdGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbW9kZWxcblx0ICovXG5cdEBPdXRwdXQoKSBkZXNlbGVjdEFsbCA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVNb2RlbD4oKTtcblx0LyoqXG5cdCAqIEVtaXRzIGlmIGFsbCByb3dzIGFyZSBleHBhbmRlZC5cblx0ICpcblx0ICogQHBhcmFtIG1vZGVsXG5cdCAqL1xuXHRAT3V0cHV0KCkgZXhwYW5kQWxsUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVNb2RlbD4oKTtcblx0LyoqXG5cdCAqIEVtaXRzIGlmIGFsbCByb3dzIGFyZSBjb2xsYXBzZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtb2RlbFxuXHQgKi9cblx0QE91dHB1dCgpIGNvbGxhcHNlQWxsUm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVNb2RlbD4oKTtcblxuXHRwdWJsaWMgc2Nyb2xsYmFyV2lkdGggPSAwO1xuXG5cdHByb3RlY3RlZCBfY2hlY2tib3hIZWFkZXJMYWJlbCA9IHRoaXMuaTE4bi5nZXRPdmVycmlkYWJsZShcIlRBQkxFLkNIRUNLQk9YX0hFQURFUlwiKTtcblx0cHJvdGVjdGVkIF9zb3J0RGVzY2VuZGluZ0xhYmVsID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiVEFCTEUuU09SVF9ERVNDRU5ESU5HXCIpO1xuXHRwcm90ZWN0ZWQgX3NvcnRBc2NlbmRpbmdMYWJlbCA9IHRoaXMuaTE4bi5nZXRPdmVycmlkYWJsZShcIlRBQkxFLlNPUlRfQVNDRU5ESU5HXCIpO1xuXHRwcm90ZWN0ZWQgX2ZpbHRlclRpdGxlID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiVEFCTEUuRklMVEVSXCIpO1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpMThuOiBJMThuKSB7fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdHRoaXMuc2Nyb2xsYmFyV2lkdGggPSBnZXRTY3JvbGxiYXJXaWR0aCgpO1xuXHRcdH0pO1xuXHR9XG5cblx0b25TZWxlY3RBbGxDaGVja2JveENoYW5nZSgpIHtcblx0XHRpZiAoIXRoaXMuc2VsZWN0QWxsQ2hlY2tib3ggJiYgIXRoaXMuc2VsZWN0QWxsQ2hlY2tib3hTb21lU2VsZWN0ZWQpIHtcblx0XHRcdHRoaXMuc2VsZWN0QWxsLmVtaXQodGhpcy5tb2RlbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZGVzZWxlY3RBbGwuZW1pdCh0aGlzLm1vZGVsKTtcblx0XHR9XG5cdH1cblxuXHRvbkV4cGFuZEFsbFJvd3NDaGFuZ2UoZXhwYW5kOiBib29sZWFuKSB7XG5cdFx0aWYgKGV4cGFuZCkge1xuXHRcdFx0dGhpcy5leHBhbmRBbGxSb3dzLmVtaXQodGhpcy5tb2RlbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY29sbGFwc2VBbGxSb3dzLmVtaXQodGhpcy5tb2RlbCk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q2hlY2tib3hIZWFkZXJMYWJlbCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLl9jaGVja2JveEhlYWRlckxhYmVsLnN1YmplY3Q7XG5cdH1cblxuXHRnZXRTb3J0RGVzY2VuZGluZ0xhYmVsKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuX3NvcnREZXNjZW5kaW5nTGFiZWwuc3ViamVjdDtcblx0fVxuXG5cdGdldFNvcnRBc2NlbmRpbmdMYWJlbCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLl9zb3J0QXNjZW5kaW5nTGFiZWwuc3ViamVjdDtcblx0fVxuXG5cdGdldEZpbHRlclRpdGxlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuX2ZpbHRlclRpdGxlLnN1YmplY3Q7XG5cdH1cbn1cbiJdfQ==