carbon-components-angular
Version:
Next generation components
314 lines • 25.4 kB
JavaScript
import { Component, Input, Output, EventEmitter, HostBinding, HostListener } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "carbon-components-angular/i18n";
import * as i2 from "@angular/common";
import * as i3 from "../cell/table-data.component";
import * as i4 from "../cell/table-checkbox.component";
import * as i5 from "../cell/table-radio.component";
import * as i6 from "../cell/table-expand-button.component";
export class TableRowComponent {
constructor(i18n) {
this.i18n = i18n;
this.expanded = false;
this.expandable = false;
this.selected = false;
/**
* Size of the table rows.
*/
this.size = "md";
/**
* Controls whether to enable multiple or single row selection.
*/
this.enableSingleSelect = false;
/**
* Controls whether to show the selection checkboxes column or not.
*/
this.showSelectionColumn = true;
/**
* Shows or hide the checkbox in the selection column when `showSelectionColumn`
* is set to true
*/
this.showSelectionColumnCheckbox = true;
this.skeleton = false;
/**
* Emits when the row is selected.
*/
this.selectRow = new EventEmitter();
/**
* Emits when the row is deselected.
*/
this.deselectRow = new EventEmitter();
/**
* Emits when the row is expanded
*/
this.expandRow = new EventEmitter();
/**
* Emits when a row is clicked regardless of `enableSingleSelect` or `showSelectionColumn`.
* Should only get emitted when a row item is selected excluding expand buttons,
* checkboxes, or radios.
*/
this.rowClick = new EventEmitter();
this._checkboxLabel = this.i18n.getOverridable("TABLE.CHECKBOX_ROW");
this._expandButtonAriaLabel = this.i18n.getOverridable("TABLE.EXPAND_BUTTON");
}
set expandButtonAriaLabel(value) {
this._expandButtonAriaLabel.override(value);
}
get expandButtonAriaLabel() {
return this._expandButtonAriaLabel.value;
}
set checkboxLabel(value) {
this._checkboxLabel.override(value);
}
get checkboxLabel() {
return this._checkboxLabel.value;
}
get selectedClass() {
return this.selected;
}
get parentRowClass() {
return this.expandable;
}
get expandableRowClass() {
return this.expanded;
}
get selectableClass() {
return false; // this.singleSelect
}
get isParentRow() {
return this.expandable ? true : null;
}
get isAccessible() {
return this.enableSingleSelect && !this.showSelectionColumn ? 0 : null;
}
onHostClick() {
if (this.enableSingleSelect && !this.showSelectionColumn) {
this.onSelectionChange();
}
}
onRowClick() {
this.rowClick.emit();
}
onSelectionChange() {
if (this.selected) {
this.deselectRow.emit();
}
else {
this.selectRow.emit();
}
}
getCheckboxLabel() {
return this._checkboxLabel.subject;
}
getExpandButtonAriaLabel() {
return this._expandButtonAriaLabel.subject;
}
}
TableRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableRowComponent, deps: [{ token: i1.I18n }], target: i0.ɵɵFactoryTarget.Component });
TableRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableRowComponent, selector: "[cdsTableRow], [ibmTableRow]", inputs: { model: "model", row: "row", expanded: "expanded", expandable: "expandable", selected: "selected", size: "size", enableSingleSelect: "enableSingleSelect", expandButtonAriaLabel: "expandButtonAriaLabel", checkboxLabel: "checkboxLabel", showSelectionColumn: "showSelectionColumn", showSelectionColumnCheckbox: "showSelectionColumnCheckbox", selectionLabelColumn: "selectionLabelColumn", skeleton: "skeleton" }, outputs: { selectRow: "selectRow", deselectRow: "deselectRow", expandRow: "expandRow", rowClick: "rowClick" }, host: { listeners: { "click": "onHostClick()" }, properties: { "class.cds--data-table--selected": "this.selectedClass", "class.cds--parent-row": "this.parentRowClass", "class.cds--expandable-row": "this.expandableRowClass", "class.tbody_row--selectable": "this.selectableClass", "attr.data-parent-row": "this.isParentRow", "attr.tabindex": "this.isAccessible" } }, ngImport: i0, template: `
<ng-container *ngIf="model">
<td
*ngIf="model.hasExpandableRows()"
cdsTableExpandButton
class="cds--table-expand-v2"
[ ]="expanded"
[ ]="expandable"
[ ]="skeleton"
[ ]="getExpandButtonAriaLabel()"
[ ]="model.getHeaderId('expand')"
(expandRow)="expandRow.emit()">
</td>
<ng-container *ngIf="!skeleton && showSelectionColumn && !enableSingleSelect">
<td
*ngIf="!showSelectionColumnCheckbox; else tableCheckboxTemplate">
</td>
<ng-template
<td
cdsTableCheckbox
class="cds--table-column-checkbox"
[ ]="size"
[ ]="selected"
[ ]="getCheckboxLabel()"
[ ]="row"
[ ]="skeleton"
[ ]="model.getHeaderId('select')"
(selectedChange)="onSelectionChange()">
</td>
</ng-template>
</ng-container>
<td
*ngIf="!skeleton && showSelectionColumn && enableSingleSelect"
cdsTableRadio
[ ]="selected"
[ ]="getCheckboxLabel()"
[ ]="row"
[ ]="skeleton"
[ ]="model.getHeaderId('select')"
(change)="onSelectionChange()">
</td>
<ng-container *ngFor="let item of row; let j = index">
<td
*ngIf="item && model.getHeader(j) && model.getHeader(j).visible"
cdsTableData
[ ]="model.getHeaderId(j, item.colSpan)"
[ ]="item"
[ ]="item.title"
[ ]="model.getHeader(j).className"
[ ]="model.getHeader(j).style"
[ ]="skeleton"
[ ]="item.colSpan"
[ ]="item.rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
<td
*ngIf="item && model.getHeader(j) == null"
cdsTableData
[ ]="model.getHeaderId(j, item.colSpan)"
[ ]="item"
[ ]="item.title"
[ ]="skeleton"
[ ]="item.colSpan"
[ ]="item.rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
</ng-container>
</ng-container>
<ng-content></ng-content>
`, isInline: true, dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.TableData, selector: "[cdsTableData], [ibmTableData]", inputs: ["item", "skeleton"] }, { kind: "component", type: i4.TableCheckbox, selector: "[cdsTableCheckbox], [ibmTableCheckbox]", inputs: ["row", "selected", "name", "size", "label", "selectionLabelColumn", "skeleton"], outputs: ["selectedChange"] }, { kind: "component", type: i5.TableRadio, selector: "[cdsTableRadio], [ibmTableRadio]", inputs: ["row", "selected", "label", "selectionLabelColumn", "skeleton"], outputs: ["change"] }, { kind: "component", type: i6.TableExpandButton, selector: "[cdsTableExpandButton], [ibmTableExpandButton]", inputs: ["expanded", "expandable", "ariaLabel", "skeleton"], outputs: ["expandRow"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableRowComponent, decorators: [{
type: Component,
args: [{
// tslint:disable-next-line: component-selector
selector: "[cdsTableRow], [ibmTableRow]",
template: `
<ng-container *ngIf="model">
<td
*ngIf="model.hasExpandableRows()"
cdsTableExpandButton
class="cds--table-expand-v2"
[ ]="expanded"
[ ]="expandable"
[ ]="skeleton"
[ ]="getExpandButtonAriaLabel()"
[ ]="model.getHeaderId('expand')"
(expandRow)="expandRow.emit()">
</td>
<ng-container *ngIf="!skeleton && showSelectionColumn && !enableSingleSelect">
<td
*ngIf="!showSelectionColumnCheckbox; else tableCheckboxTemplate">
</td>
<ng-template
<td
cdsTableCheckbox
class="cds--table-column-checkbox"
[ ]="size"
[ ]="selected"
[ ]="getCheckboxLabel()"
[ ]="row"
[ ]="skeleton"
[ ]="model.getHeaderId('select')"
(selectedChange)="onSelectionChange()">
</td>
</ng-template>
</ng-container>
<td
*ngIf="!skeleton && showSelectionColumn && enableSingleSelect"
cdsTableRadio
[ ]="selected"
[ ]="getCheckboxLabel()"
[ ]="row"
[ ]="skeleton"
[ ]="model.getHeaderId('select')"
(change)="onSelectionChange()">
</td>
<ng-container *ngFor="let item of row; let j = index">
<td
*ngIf="item && model.getHeader(j) && model.getHeader(j).visible"
cdsTableData
[ ]="model.getHeaderId(j, item.colSpan)"
[ ]="item"
[ ]="item.title"
[ ]="model.getHeader(j).className"
[ ]="model.getHeader(j).style"
[ ]="skeleton"
[ ]="item.colSpan"
[ ]="item.rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
<td
*ngIf="item && model.getHeader(j) == null"
cdsTableData
[ ]="model.getHeaderId(j, item.colSpan)"
[ ]="item"
[ ]="item.title"
[ ]="skeleton"
[ ]="item.colSpan"
[ ]="item.rowSpan"
(click)="onRowClick()"
(keydown.enter)="onRowClick()">
</td>
</ng-container>
</ng-container>
<ng-content></ng-content>
`
}]
}], ctorParameters: function () { return [{ type: i1.I18n }]; }, propDecorators: { model: [{
type: Input
}], row: [{
type: Input
}], expanded: [{
type: Input
}], expandable: [{
type: Input
}], selected: [{
type: Input
}], size: [{
type: Input
}], enableSingleSelect: [{
type: Input
}], expandButtonAriaLabel: [{
type: Input
}], checkboxLabel: [{
type: Input
}], showSelectionColumn: [{
type: Input
}], showSelectionColumnCheckbox: [{
type: Input
}], selectionLabelColumn: [{
type: Input
}], skeleton: [{
type: Input
}], selectRow: [{
type: Output
}], deselectRow: [{
type: Output
}], expandRow: [{
type: Output
}], rowClick: [{
type: Output
}], selectedClass: [{
type: HostBinding,
args: ["class.cds--data-table--selected"]
}], parentRowClass: [{
type: HostBinding,
args: ["class.cds--parent-row"]
}], expandableRowClass: [{
type: HostBinding,
args: ["class.cds--expandable-row"]
}], selectableClass: [{
type: HostBinding,
args: ["class.tbody_row--selectable"]
}], isParentRow: [{
type: HostBinding,
args: ["attr.data-parent-row"]
}], isAccessible: [{
type: HostBinding,
args: ["attr.tabindex"]
}], onHostClick: [{
type: HostListener,
args: ["click"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90YWJsZS9ib2R5L3RhYmxlLXJvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQW1GdkIsTUFBTSxPQUFPLGlCQUFpQjtJQW9IN0IsWUFBc0IsSUFBVTtRQUFWLFNBQUksR0FBSixJQUFJLENBQU07UUE1R3ZCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ00sU0FBSSxHQUFpQixJQUFJLENBQUM7UUFFbkM7O1dBRUc7UUFDTSx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFvQnBDOztXQUVHO1FBQ00sd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBRXBDOzs7V0FHRztRQUNNLGdDQUEyQixHQUFHLElBQUksQ0FBQztRQWNuQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFekM7O1dBRUc7UUFDTyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFM0M7O1dBRUc7UUFDTyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6Qzs7OztXQUlHO1FBQ08sYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUEwQjlCLG1CQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNoRSwyQkFBc0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRS9D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c0JBQTVCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFLSSxTQUFTO3NCQUFsQixNQUFNO2dCQUtHLFdBQVc7c0JBQXBCLE1BQU07Z0JBS0csU0FBUztzQkFBbEIsTUFBTTtnQkFPRyxRQUFRO3NCQUFqQixNQUFNO2dCQUU2QyxhQUFhO3NCQUFoRSxXQUFXO3VCQUFDLGlDQUFpQztnQkFJSixjQUFjO3NCQUF2RCxXQUFXO3VCQUFDLHVCQUF1QjtnQkFJVSxrQkFBa0I7c0JBQS9ELFdBQVc7dUJBQUMsMkJBQTJCO2dCQUlRLGVBQWU7c0JBQTlELFdBQVc7dUJBQUMsNkJBQTZCO2dCQUlELFdBQVc7c0JBQW5ELFdBQVc7dUJBQUMsc0JBQXNCO2dCQUlELFlBQVk7c0JBQTdDLFdBQVc7dUJBQUMsZUFBZTtnQkFVNUIsV0FBVztzQkFEVixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0SG9zdEJpbmRpbmcsXG5cdEhvc3RMaXN0ZW5lclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVGFibGVNb2RlbCB9IGZyb20gXCIuLi90YWJsZS1tb2RlbC5jbGFzc1wiO1xuaW1wb3J0IHsgSTE4biwgT3ZlcnJpZGFibGUgfSBmcm9tIFwiY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhci9pMThuXCI7XG5pbXBvcnQgeyBUYWJsZUl0ZW0gfSBmcm9tIFwiLi4vdGFibGUtaXRlbS5jbGFzc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBUYWJsZVJvd1NpemUgfSBmcm9tIFwiLi4vdGFibGUudHlwZXNcIjtcblxuQENvbXBvbmVudCh7XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIltjZHNUYWJsZVJvd10sIFtpYm1UYWJsZVJvd11cIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZWxcIj5cblx0XHRcdDx0ZFxuXHRcdFx0XHQqbmdJZj1cIm1vZGVsLmhhc0V4cGFuZGFibGVSb3dzKClcIlxuXHRcdFx0XHRjZHNUYWJsZUV4cGFuZEJ1dHRvblxuXHRcdFx0XHRjbGFzcz1cImNkcy0tdGFibGUtZXhwYW5kLXYyXCJcblx0XHRcdFx0W2V4cGFuZGVkXT1cImV4cGFuZGVkXCJcblx0XHRcdFx0W2V4cGFuZGFibGVdPVwiZXhwYW5kYWJsZVwiXG5cdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFthcmlhTGFiZWxdPVwiZ2V0RXhwYW5kQnV0dG9uQXJpYUxhYmVsKClcIlxuXHRcdFx0XHRbaGVhZGVyc109XCJtb2RlbC5nZXRIZWFkZXJJZCgnZXhwYW5kJylcIlxuXHRcdFx0XHQoZXhwYW5kUm93KT1cImV4cGFuZFJvdy5lbWl0KClcIj5cblx0XHRcdDwvdGQ+XG5cdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uICYmIHNob3dTZWxlY3Rpb25Db2x1bW4gJiYgIWVuYWJsZVNpbmdsZVNlbGVjdFwiPlxuXHRcdFx0XHQ8dGRcblx0XHRcdFx0XHQqbmdJZj1cIiFzaG93U2VsZWN0aW9uQ29sdW1uQ2hlY2tib3g7IGVsc2UgdGFibGVDaGVja2JveFRlbXBsYXRlXCI+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAjdGFibGVDaGVja2JveFRlbXBsYXRlPlxuXHRcdFx0XHRcdDx0ZFxuXHRcdFx0XHRcdFx0Y2RzVGFibGVDaGVja2JveFxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLXRhYmxlLWNvbHVtbi1jaGVja2JveFwiXG5cdFx0XHRcdFx0XHRbc2l6ZV09XCJzaXplXCJcblx0XHRcdFx0XHRcdFtzZWxlY3RlZF09XCJzZWxlY3RlZFwiXG5cdFx0XHRcdFx0XHRbbGFiZWxdPVwiZ2V0Q2hlY2tib3hMYWJlbCgpXCJcblx0XHRcdFx0XHRcdFtyb3ddPVwicm93XCJcblx0XHRcdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFx0XHRbaGVhZGVyc109XCJtb2RlbC5nZXRIZWFkZXJJZCgnc2VsZWN0JylcIlxuXHRcdFx0XHRcdFx0KHNlbGVjdGVkQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKClcIj5cblx0XHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHQ8dGRcblx0XHRcdFx0Km5nSWY9XCIhc2tlbGV0b24gJiYgc2hvd1NlbGVjdGlvbkNvbHVtbiAmJiBlbmFibGVTaW5nbGVTZWxlY3RcIlxuXHRcdFx0XHRjZHNUYWJsZVJhZGlvXG5cdFx0XHRcdFtzZWxlY3RlZF09XCJzZWxlY3RlZFwiXG5cdFx0XHRcdFtsYWJlbF09XCJnZXRDaGVja2JveExhYmVsKClcIlxuXHRcdFx0XHRbcm93XT1cInJvd1wiXG5cdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFtoZWFkZXJzXT1cIm1vZGVsLmdldEhlYWRlcklkKCdzZWxlY3QnKVwiXG5cdFx0XHRcdChjaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoKVwiPlxuXHRcdFx0PC90ZD5cblx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93OyBsZXQgaiA9IGluZGV4XCI+XG5cdFx0XHRcdDx0ZFxuXHRcdFx0XHRcdCpuZ0lmPVwiaXRlbSAmJiBtb2RlbC5nZXRIZWFkZXIoaikgJiYgbW9kZWwuZ2V0SGVhZGVyKGopLnZpc2libGVcIlxuXHRcdFx0XHRcdGNkc1RhYmxlRGF0YVxuXHRcdFx0XHRcdFtoZWFkZXJzXT1cIm1vZGVsLmdldEhlYWRlcklkKGosIGl0ZW0uY29sU3BhbilcIlxuXHRcdFx0XHRcdFtpdGVtXT1cIml0ZW1cIlxuXHRcdFx0XHRcdFt0aXRsZV09XCJpdGVtLnRpdGxlXCJcblx0XHRcdFx0XHRbY2xhc3NdPVwibW9kZWwuZ2V0SGVhZGVyKGopLmNsYXNzTmFtZVwiXG5cdFx0XHRcdFx0W25nU3R5bGVdPVwibW9kZWwuZ2V0SGVhZGVyKGopLnN0eWxlXCJcblx0XHRcdFx0XHRbc2tlbGV0b25dPVwic2tlbGV0b25cIlxuXHRcdFx0XHRcdFthdHRyLmNvbHNwYW5dPVwiaXRlbS5jb2xTcGFuXCJcblx0XHRcdFx0XHRbYXR0ci5yb3dzcGFuXT1cIml0ZW0ucm93U3BhblwiXG5cdFx0XHRcdFx0KGNsaWNrKT1cIm9uUm93Q2xpY2soKVwiXG5cdFx0XHRcdFx0KGtleWRvd24uZW50ZXIpPVwib25Sb3dDbGljaygpXCI+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHRcdDx0ZFxuXHRcdFx0XHRcdCpuZ0lmPVwiaXRlbSAmJiBtb2RlbC5nZXRIZWFkZXIoaikgPT0gbnVsbFwiXG5cdFx0XHRcdFx0Y2RzVGFibGVEYXRhXG5cdFx0XHRcdFx0W2hlYWRlcnNdPVwibW9kZWwuZ2V0SGVhZGVySWQoaiwgaXRlbS5jb2xTcGFuKVwiXG5cdFx0XHRcdFx0W2l0ZW1dPVwiaXRlbVwiXG5cdFx0XHRcdFx0W3RpdGxlXT1cIml0ZW0udGl0bGVcIlxuXHRcdFx0XHRcdFtza2VsZXRvbl09XCJza2VsZXRvblwiXG5cdFx0XHRcdFx0W2F0dHIuY29sc3Bhbl09XCJpdGVtLmNvbFNwYW5cIlxuXHRcdFx0XHRcdFthdHRyLnJvd3NwYW5dPVwiaXRlbS5yb3dTcGFuXCJcblx0XHRcdFx0XHQoY2xpY2spPVwib25Sb3dDbGljaygpXCJcblx0XHRcdFx0XHQoa2V5ZG93bi5lbnRlcik9XCJvblJvd0NsaWNrKClcIj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVJvd0NvbXBvbmVudCB7XG5cdC8qKlxuXHQgKiBgVGFibGVNb2RlbGAgd2l0aCBkYXRhIHRoZSB0YWJsZSBpcyB0byBkaXNwbGF5LlxuXHQgKi9cblx0QElucHV0KCkgbW9kZWw6IFRhYmxlTW9kZWw7XG5cblx0QElucHV0KCkgcm93OiBUYWJsZUl0ZW1bXTtcblxuXHRASW5wdXQoKSBleHBhbmRlZCA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpIGV4cGFuZGFibGUgPSBmYWxzZTtcblxuXHRASW5wdXQoKSBzZWxlY3RlZCA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBTaXplIG9mIHRoZSB0YWJsZSByb3dzLlxuXHQgKi9cblx0QElucHV0KCkgc2l6ZTogVGFibGVSb3dTaXplID0gXCJtZFwiO1xuXG5cdC8qKlxuXHQgKiBDb250cm9scyB3aGV0aGVyIHRvIGVuYWJsZSBtdWx0aXBsZSBvciBzaW5nbGUgcm93IHNlbGVjdGlvbi5cblx0ICovXG5cdEBJbnB1dCgpIGVuYWJsZVNpbmdsZVNlbGVjdCA9IGZhbHNlO1xuXG5cdEBJbnB1dCgpXG5cdHNldCBleHBhbmRCdXR0b25BcmlhTGFiZWwodmFsdWU6IHN0cmluZyB8IE9ic2VydmFibGU8c3RyaW5nPikge1xuXHRcdHRoaXMuX2V4cGFuZEJ1dHRvbkFyaWFMYWJlbC5vdmVycmlkZSh2YWx1ZSk7XG5cdH1cblxuXHRnZXQgZXhwYW5kQnV0dG9uQXJpYUxhYmVsKCkge1xuXHRcdHJldHVybiB0aGlzLl9leHBhbmRCdXR0b25BcmlhTGFiZWwudmFsdWU7XG5cdH1cblxuXHRASW5wdXQoKVxuXHRzZXQgY2hlY2tib3hMYWJlbCh2YWx1ZTogc3RyaW5nIHwgT2JzZXJ2YWJsZTxzdHJpbmc+KSB7XG5cdFx0dGhpcy5fY2hlY2tib3hMYWJlbC5vdmVycmlkZSh2YWx1ZSk7XG5cdH1cblxuXHRnZXQgY2hlY2tib3hMYWJlbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fY2hlY2tib3hMYWJlbC52YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb250cm9scyB3aGV0aGVyIHRvIHNob3cgdGhlIHNlbGVjdGlvbiBjaGVja2JveGVzIGNvbHVtbiBvciBub3QuXG5cdCAqL1xuXHRASW5wdXQoKSBzaG93U2VsZWN0aW9uQ29sdW1uID0gdHJ1ZTtcblxuXHQvKipcblx0ICogU2hvd3Mgb3IgaGlkZSB0aGUgY2hlY2tib3ggaW4gdGhlIHNlbGVjdGlvbiBjb2x1bW4gd2hlbiBgc2hvd1NlbGVjdGlvbkNvbHVtbmBcblx0ICogaXMgc2V0IHRvIHRydWVcblx0ICovXG5cdEBJbnB1dCgpIHNob3dTZWxlY3Rpb25Db2x1bW5DaGVja2JveCA9IHRydWU7XG5cblx0LyoqXG5cdCAqIFVzZWQgdG8gcG9wdWxhdGUgdGhlIHJvdyBzZWxlY3Rpb24gY2hlY2tib3ggbGFiZWwgd2l0aCBhIHVzZWZ1bCB2YWx1ZSBpZiBzZXQuXG5cdCAqXG5cdCAqIEV4YW1wbGU6XG5cdCAqIGBgYFxuXHQgKiA8Y2RzLXRhYmxlIFtzZWxlY3Rpb25MYWJlbENvbHVtbl09XCIwXCI+PC9jZHMtdGFibGU+XG5cdCAqIDwhLS0gcmVzdWx0cyBpbiBhcmlhLWxhYmVsPVwiU2VsZWN0IGZpcnN0IGNvbHVtbiB2YWx1ZVwiXG5cdCAqICh3aGVyZSBcImZpcnN0IGNvbHVtbiB2YWx1ZVwiIGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgY29sdW1uIGluIHRoZSByb3cgLS0+XG5cdCAqIGBgYFxuXHQgKi9cblx0QElucHV0KCkgc2VsZWN0aW9uTGFiZWxDb2x1bW46IG51bWJlcjtcblxuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBFbWl0cyB3aGVuIHRoZSByb3cgaXMgc2VsZWN0ZWQuXG5cdCAqL1xuXHRAT3V0cHV0KCkgc2VsZWN0Um93ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBFbWl0cyB3aGVuIHRoZSByb3cgaXMgZGVzZWxlY3RlZC5cblx0ICovXG5cdEBPdXRwdXQoKSBkZXNlbGVjdFJvdyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKipcblx0ICogRW1pdHMgd2hlbiB0aGUgcm93IGlzIGV4cGFuZGVkXG5cdCAqL1xuXHRAT3V0cHV0KCkgZXhwYW5kUm93ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKlxuXHQgKiBFbWl0cyB3aGVuIGEgcm93IGlzIGNsaWNrZWQgcmVnYXJkbGVzcyBvZiBgZW5hYmxlU2luZ2xlU2VsZWN0YCBvciBgc2hvd1NlbGVjdGlvbkNvbHVtbmAuXG5cdCAqIFNob3VsZCBvbmx5IGdldCBlbWl0dGVkIHdoZW4gYSByb3cgaXRlbSBpcyBzZWxlY3RlZCBleGNsdWRpbmcgZXhwYW5kIGJ1dHRvbnMsXG5cdCAqIGNoZWNrYm94ZXMsIG9yIHJhZGlvcy5cblx0ICovXG5cdEBPdXRwdXQoKSByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWRhdGEtdGFibGUtLXNlbGVjdGVkXCIpIGdldCBzZWxlY3RlZENsYXNzKCkge1xuXHRcdHJldHVybiB0aGlzLnNlbGVjdGVkO1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1wYXJlbnQtcm93XCIpIGdldCBwYXJlbnRSb3dDbGFzcygpIHtcblx0XHRyZXR1cm4gdGhpcy5leHBhbmRhYmxlO1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1leHBhbmRhYmxlLXJvd1wiKSBnZXQgZXhwYW5kYWJsZVJvd0NsYXNzKCkge1xuXHRcdHJldHVybiB0aGlzLmV4cGFuZGVkO1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MudGJvZHlfcm93LS1zZWxlY3RhYmxlXCIpIGdldCBzZWxlY3RhYmxlQ2xhc3MoKSB7XG5cdFx0cmV0dXJuIGZhbHNlOyAvLyB0aGlzLnNpbmdsZVNlbGVjdFxuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5kYXRhLXBhcmVudC1yb3dcIikgZ2V0IGlzUGFyZW50Um93KCkge1xuXHRcdHJldHVybiB0aGlzLmV4cGFuZGFibGUgPyB0cnVlIDogbnVsbDtcblx0fVxuXG5cdEBIb3N0QmluZGluZyhcImF0dHIudGFiaW5kZXhcIikgZ2V0IGlzQWNjZXNzaWJsZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5lbmFibGVTaW5nbGVTZWxlY3QgJiYgIXRoaXMuc2hvd1NlbGVjdGlvbkNvbHVtbiA/IDAgOiBudWxsO1xuXHR9XG5cblx0cHJvdGVjdGVkIF9jaGVja2JveExhYmVsID0gdGhpcy5pMThuLmdldE92ZXJyaWRhYmxlKFwiVEFCTEUuQ0hFQ0tCT1hfUk9XXCIpO1xuXHRwcm90ZWN0ZWQgX2V4cGFuZEJ1dHRvbkFyaWFMYWJlbCA9IHRoaXMuaTE4bi5nZXRPdmVycmlkYWJsZShcIlRBQkxFLkVYUEFORF9CVVRUT05cIik7XG5cblx0Y29uc3RydWN0b3IocHJvdGVjdGVkIGkxOG46IEkxOG4pIHsgfVxuXG5cdEBIb3N0TGlzdGVuZXIoXCJjbGlja1wiKVxuXHRvbkhvc3RDbGljaygpIHtcblx0XHRpZiAodGhpcy5lbmFibGVTaW5nbGVTZWxlY3QgJiYgIXRoaXMuc2hvd1NlbGVjdGlvbkNvbHVtbikge1xuXHRcdFx0dGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuXHRcdH1cblx0fVxuXG5cdG9uUm93Q2xpY2soKSB7XG5cdFx0dGhpcy5yb3dDbGljay5lbWl0KCk7XG5cdH1cblxuXHRvblNlbGVjdGlvbkNoYW5nZSgpIHtcblx0XHRpZiAodGhpcy5zZWxlY3RlZCkge1xuXHRcdFx0dGhpcy5kZXNlbGVjdFJvdy5lbWl0KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2VsZWN0Um93LmVtaXQoKTtcblx0XHR9XG5cdH1cblxuXHRnZXRDaGVja2JveExhYmVsKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuX2NoZWNrYm94TGFiZWwuc3ViamVjdDtcblx0fVxuXG5cdGdldEV4cGFuZEJ1dHRvbkFyaWFMYWJlbCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLl9leHBhbmRCdXR0b25BcmlhTGFiZWwuc3ViamVjdDtcblx0fVxufVxuIl19