UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

328 lines 29.5 kB
var IgxColumnGroupComponent_1; import { __decorate, __metadata } from "tslib"; import { Component, ContentChildren, ChangeDetectionStrategy, Input, forwardRef, QueryList, TemplateRef, Output, EventEmitter } from '@angular/core'; import { IgxColumnComponent } from './column.component'; import { flatten } from '../../core/utils'; let IgxColumnGroupComponent = IgxColumnGroupComponent_1 = class IgxColumnGroupComponent extends IgxColumnComponent { constructor() { super(...arguments); this.children = new QueryList(); /** * Sets/gets whether the column group is `searchable`. * Default value is `true`. * ```typescript * let isSearchable = this.columnGroup.searchable; * ``` * ```html * <igx-column-group [searchable] = "false"></igx-column-group> * ``` * @memberof IgxColumnGroupComponent */ this.searchable = true; /** *@hidden */ this.hiddenChange = new EventEmitter(); // constructor(public gridAPI: GridBaseAPIService<IgxGridBaseDirective & IGridDataBindable>, public cdr: ChangeDetectorRef) { // // D.P. constructor duplication due to es6 compilation, might be obsolete in the future // super(gridAPI, cdr); // } } /** * Set if the column group is collapsible. * Default value is `false` * ```html * <igx-column-group [collapsible] = "true"></igx-column-group> * ``` * @memberof IgxColumnGroupComponent */ set collapsible(value) { this._collapsible = value; this.collapsibleChange.emit(this._collapsible); if (this.children && !this.hidden) { if (this._collapsible) { this.setExpandCollapseState(); } else { this.children.forEach(child => child.hidden = false); } } } get collapsible() { return this._collapsible && this.checkCollapsibleState(); } /** * Set whether the group is expanded or collapsed initially. * Applied only if the collapsible property is set to `true` * Default value is `true` * ```html * const state = false * <igx-column-group [(expand)] = "state"></igx-column-group> * ``` * @memberof IgxColumnGroupComponent */ set expanded(value) { this._expanded = value; this.expandedChange.emit(this._expanded); if (!this.collapsible) { return; } if (!this.hidden && this.children) { this.setExpandCollapseState(); } } get expanded() { return this._expanded; } /** * Gets the column group `summaries`. * ```typescript * let columnGroupSummaries = this.columnGroup.summaries; * ``` * @memberof IgxColumnGroupComponent */ get summaries() { return this._summaries; } /** * Sets the column group `summaries`. * ```typescript * this.columnGroup.summaries = IgxNumberSummaryOperand; * ``` * @memberof IgxColumnGroupComponent */ set summaries(classRef) { } /** * Gets the column group `filters`. * ```typescript * let columnGroupFilters = this.columnGroup.filters; * ``` * @memberof IgxColumnGroupComponent */ get filters() { return this._filters; } /** * Sets the column group `filters`. * ```typescript * this.columnGroup.filters = IgxStringFilteringOperand; * ``` * @memberof IgxColumnGroupComponent */ set filters(classRef) { } /** * Returns a reference to the body template. * ```typescript * let bodyTemplate = this.columnGroup.bodyTemplate; * ``` * @memberof IgxColumnGroupComponent */ get bodyTemplate() { return this._bodyTemplate; } /** * @hidden */ set bodyTemplate(template) { } /** * Allows you to define a custom template for expand/collapse indicator * @memberof IgxColumnGroupComponent */ get collapsibleIndicatorTemplate() { return this._collapseIndicatorTemplate; } set collapsibleIndicatorTemplate(template) { this._collapseIndicatorTemplate = template; } /** * Returns a reference to the inline editor template. * ```typescript * let inlineEditorTemplate = this.columnGroup.inlineEditorTemplate; * ``` * @memberof IgxColumnGroupComponent */ get inlineEditorTemplate() { return this._inlineEditorTemplate; } /** * @hidden */ set inlineEditorTemplate(template) { } /** * Gets the column group cells. * ```typescript * let columnCells = this.columnGroup.cells; * ``` * @memberof IgxColumnGroupComponent */ get cells() { return []; } /** * Gets whether the column group is hidden. * ```typescript * let isHidden = this.columnGroup.hidden; * ``` * @memberof IgxColumnGroupComponent */ get hidden() { return this.allChildren.every(c => c.hidden); } /** * Sets the column group hidden property. * ```html * <igx-column [hidden] = "true"></igx-column> * ``` * * Two-way data binding * ```html * <igx-column [(hidden)] = "model.columns[0].isHidden"></igx-column> * ``` * @memberof IgxColumnGroupComponent */ set hidden(value) { this._hidden = value; this.hiddenChange.emit(this._hidden); if (this._hidden || !this.collapsible) { this.children.forEach(child => child.hidden = this._hidden); } else { this.children.forEach(c => { if (c.visibleWhenCollapsed === undefined) { c.hidden = false; return; } c.hidden = this.expanded ? c.visibleWhenCollapsed : !c.visibleWhenCollapsed; }); } } /** *@hidden */ ngAfterContentInit() { /* @ContentChildren with descendants still returns the `parent` component in the query list. */ if (this.headTemplate && this.headTemplate.length) { this._headerTemplate = this.headTemplate.toArray()[0].template; } if (this.collapseIndicatorTemplate) { this._collapseIndicatorTemplate = this.collapseIndicatorTemplate.template; } // currently only ivy fixes the issue, we have to slice only if the first child is group if (this.children.first === this) { this.children.reset(this.children.toArray().slice(1)); } this.children.forEach(child => { child.parent = this; }); if (this.collapsible) { this.setExpandCollapseState(); } } /** * Returns the children columns collection. * ```typescript * let columns = this.columnGroup.allChildren; * ``` * @memberof IgxColumnGroupComponent */ get allChildren() { return flatten(this.children.toArray()); } /** * Returns a boolean indicating if the column is a `ColumnGroup`. * ```typescript * let isColumnGroup = this.columnGroup.columnGroup * ``` * @memberof IgxColumnGroupComponent */ get columnGroup() { return true; } /** * Returns a boolean indicating if the column is a `ColumnLayout` for multi-row layout. * ```typescript * let columnGroup = this.column.columnGroup; * ``` * @memberof IgxColumnComponent */ get columnLayout() { return false; } /** * Gets the width of the column group. * ```typescript * let columnGroupWidth = this.columnGroup.width; * ``` * @memberof IgxColumnGroupComponent */ get width() { let isChildrenWidthInPercent = false, width; width = `${this.children.reduce((acc, val) => { if (val.hidden) { return acc; } if (typeof val.width === 'string' && val.width.indexOf('%') !== -1) { isChildrenWidthInPercent = true; return acc + parseInt(val.width, 10); } return acc + parseInt(val.calcWidth, 10); }, 0)}`; return isChildrenWidthInPercent ? width + '%' : width + 'px'; } set width(val) { } }; __decorate([ ContentChildren(IgxColumnComponent, { read: IgxColumnComponent }), __metadata("design:type", Object) ], IgxColumnGroupComponent.prototype, "children", void 0); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxColumnGroupComponent.prototype, "collapsible", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxColumnGroupComponent.prototype, "expanded", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxColumnGroupComponent.prototype, "summaries", null); __decorate([ Input(), __metadata("design:type", Object) ], IgxColumnGroupComponent.prototype, "searchable", void 0); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxColumnGroupComponent.prototype, "filters", null); __decorate([ Input(), __metadata("design:type", TemplateRef), __metadata("design:paramtypes", [TemplateRef]) ], IgxColumnGroupComponent.prototype, "collapsibleIndicatorTemplate", null); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], IgxColumnGroupComponent.prototype, "hidden", null); __decorate([ Output(), __metadata("design:type", Object) ], IgxColumnGroupComponent.prototype, "hiddenChange", void 0); IgxColumnGroupComponent = IgxColumnGroupComponent_1 = __decorate([ Component({ changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: IgxColumnComponent, useExisting: forwardRef(() => IgxColumnGroupComponent_1) }], selector: 'igx-column-group', template: `` }) ], IgxColumnGroupComponent); export { IgxColumnGroupComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHMvY29sdW1ucy9jb2x1bW4tZ3JvdXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLEtBQUssRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVMzQyxJQUFhLHVCQUF1QiwrQkFBcEMsTUFBYSx1QkFBd0IsU0FBUSxrQkFBa0I7SUFBL0Q7O1FBR0ksYUFBUSxHQUFHLElBQUksU0FBUyxFQUFzQixDQUFDO1FBb0UvQzs7Ozs7Ozs7OztXQVVHO1FBRUksZUFBVSxHQUFHLElBQUksQ0FBQztRQTRHekI7O1dBRUc7UUFFSSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFrRmxELDZIQUE2SDtRQUM3SCw4RkFBOEY7UUFDOUYsMkJBQTJCO1FBQzNCLElBQUk7SUFDUixDQUFDO0lBcFJHOzs7Ozs7O09BT0c7SUFFSCxJQUFXLFdBQVcsQ0FBQyxLQUFjO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDL0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNuQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzthQUNqQztpQkFB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OzswREFXUDtBQWdCRDtJQURDLEtBQUssRUFBRTs7O3VEQVFQO0FBYUQ7SUFEQyxLQUFLLEVBQUU7Ozt3REFHUDtBQXFCRDtJQURDLEtBQUssRUFBRTs7MkRBQ2lCO0FBU3pCO0lBREMsS0FBSyxFQUFFOzs7c0RBR1A7QUE4QkQ7SUFEQyxLQUFLLEVBQUU7OEJBSW1DLFdBQVc7cUNBQVgsV0FBVzsyRUFEckQ7QUFxQ0Q7SUFEQyxLQUFLLEVBQUU7OztxREFHUDtBQThCRDtJQURDLE1BQU0sRUFBRTs7NkRBQ3lDO0FBbk16Qyx1QkFBdUI7SUFObkMsU0FBUyxDQUFDO1FBQ1AsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07UUFDL0MsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBdUIsQ0FBQyxFQUFFLENBQUM7UUFDcEcsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixRQUFRLEVBQUUsRUFBRTtLQUNmLENBQUM7R0FDVyx1QkFBdUIsQ0F5Um5DO1NBelJZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIElucHV0LFxuICAgIGZvcndhcmRSZWYsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIE91dHB1dCxcbiAgICBFdmVudEVtaXR0ZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IElneENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkQ2VsbENvbXBvbmVudCB9IGZyb20gJy4uL2NlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IElneENvbHVtbkNvbXBvbmVudCwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSWd4Q29sdW1uR3JvdXBDb21wb25lbnQpIH1dLFxuICAgIHNlbGVjdG9yOiAnaWd4LWNvbHVtbi1ncm91cCcsXG4gICAgdGVtcGxhdGU6IGBgXG59KVxuZXhwb3J0IGNsYXNzIElneENvbHVtbkdyb3VwQ29tcG9uZW50IGV4dGVuZHMgSWd4Q29sdW1uQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgICBAQ29udGVudENoaWxkcmVuKElneENvbHVtbkNvbXBvbmVudCwgeyByZWFkOiBJZ3hDb2x1bW5Db21wb25lbnQgfSlcbiAgICBjaGlsZHJlbiA9IG5ldyBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogU2V0IGlmIHRoZSBjb2x1bW4gZ3JvdXAgaXMgY29sbGFwc2libGUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWNvbHVtbi1ncm91cCBbY29sbGFwc2libGVdID0gXCJ0cnVlXCI+PC9pZ3gtY29sdW1uLWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBjb2xsYXBzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9jb2xsYXBzaWJsZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNvbGxhcHNpYmxlQ2hhbmdlLmVtaXQodGhpcy5fY29sbGFwc2libGUpO1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiAhdGhpcy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RXhwYW5kQ29sbGFwc2VTdGF0ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gY2hpbGQuaGlkZGVuID0gZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY29sbGFwc2libGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xsYXBzaWJsZSAmJiB0aGlzLmNoZWNrQ29sbGFwc2libGVTdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB3aGV0aGVyIHRoZSBncm91cCBpcyBleHBhbmRlZCBvciBjb2xsYXBzZWQgaW5pdGlhbGx5LlxuICAgICAqIEFwcGxpZWQgb25seSBpZiB0aGUgY29sbGFwc2libGUgcHJvcGVydHkgaXMgc2V0IHRvIGB0cnVlYFxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgXG4gICAgICogYGBgaHRtbFxuICAgICAqICBjb25zdCBzdGF0ZSA9IGZhbHNlXG4gICAgICogIDxpZ3gtY29sdW1uLWdyb3VwIFsoZXhwYW5kKV0gPSBcInN0YXRlXCI+PC9pZ3gtY29sdW1uLWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBleHBhbmRlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9leHBhbmRlZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlLmVtaXQodGhpcy5fZXhwYW5kZWQpO1xuICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2libGUpIHsgcmV0dXJuOyB9XG4gICAgICAgIGlmICghdGhpcy5oaWRkZW4gJiYgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5zZXRFeHBhbmRDb2xsYXBzZVN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGdldCBleHBhbmRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbHVtbiBncm91cCBgc3VtbWFyaWVzYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkdyb3VwU3VtbWFyaWVzID0gdGhpcy5jb2x1bW5Hcm91cC5zdW1tYXJpZXM7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHN1bW1hcmllcygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyaWVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb2x1bW4gZ3JvdXAgYHN1bW1hcmllc2AuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29sdW1uR3JvdXAuc3VtbWFyaWVzID0gSWd4TnVtYmVyU3VtbWFyeU9wZXJhbmQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBzdW1tYXJpZXMoY2xhc3NSZWY6IGFueSkgeyB9XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBncm91cCBpcyBgc2VhcmNoYWJsZWAuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1NlYXJjaGFibGUgPSAgdGhpcy5jb2x1bW5Hcm91cC5zZWFyY2hhYmxlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1jb2x1bW4tZ3JvdXAgW3NlYXJjaGFibGVdID0gXCJmYWxzZVwiPjwvaWd4LWNvbHVtbi1ncm91cD5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hhYmxlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2x1bW4gZ3JvdXAgYGZpbHRlcnNgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uR3JvdXBGaWx0ZXJzID0gdGhpcy5jb2x1bW5Hcm91cC5maWx0ZXJzO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb2x1bW4gZ3JvdXAgYGZpbHRlcnNgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbHVtbkdyb3VwLmZpbHRlcnMgPSBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgZmlsdGVycyhjbGFzc1JlZjogYW55KSB7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGJvZHkgdGVtcGxhdGUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBib2R5VGVtcGxhdGUgPSB0aGlzLmNvbHVtbkdyb3VwLmJvZHlUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXQgYm9keVRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYm9keVRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGJvZHlUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PikgeyB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgeW91IHRvIGRlZmluZSBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgZXhwYW5kL2NvbGxhcHNlIGluZGljYXRvclxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGNvbGxhcHNpYmxlSW5kaWNhdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2xsYXBzZUluZGljYXRvclRlbXBsYXRlO1xuICAgIH1cbiAgICBzZXQgY29sbGFwc2libGVJbmRpY2F0b3JUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgICAgICB0aGlzLl9jb2xsYXBzZUluZGljYXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgaW5saW5lIGVkaXRvciB0ZW1wbGF0ZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlubGluZUVkaXRvclRlbXBsYXRlID0gdGhpcy5jb2x1bW5Hcm91cC5pbmxpbmVFZGl0b3JUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBnZXQgaW5saW5lRWRpdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmxpbmVFZGl0b3JUZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHNldCBpbmxpbmVFZGl0b3JUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PikgeyB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGdyb3VwIGNlbGxzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uQ2VsbHMgPSB0aGlzLmNvbHVtbkdyb3VwLmNlbGxzO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIGdldCBjZWxscygpOiBJZ3hHcmlkQ2VsbENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBncm91cCBpcyBoaWRkZW4uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hpZGRlbiA9IHRoaXMuY29sdW1uR3JvdXAuaGlkZGVuO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGhpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWxsQ2hpbGRyZW4uZXZlcnkoYyA9PiBjLmhpZGRlbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbHVtbiBncm91cCBoaWRkZW4gcHJvcGVydHkuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtoaWRkZW5dID0gXCJ0cnVlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVHdvLXdheSBkYXRhIGJpbmRpbmdcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gWyhoaWRkZW4pXSA9IFwibW9kZWwuY29sdW1uc1swXS5pc0hpZGRlblwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uR3JvdXBDb21wb25lbnRcbiAgICAgKi9cbiAgICBzZXQgaGlkZGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2hpZGRlbiA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhpZGRlbkNoYW5nZS5lbWl0KHRoaXMuX2hpZGRlbik7XG4gICAgICAgIGlmICh0aGlzLl9oaWRkZW4gfHwgIXRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5oaWRkZW4gPSB0aGlzLl9oaWRkZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGMgPT4gIHtcbiAgICAgICAgICAgICAgICBpZiAoYy52aXNpYmxlV2hlbkNvbGxhcHNlZCA9PT0gdW5kZWZpbmVkKSB7Yy5oaWRkZW4gPSBmYWxzZTsgcmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgYy5oaWRkZW4gPSB0aGlzLmV4cGFuZGVkID8gYy52aXNpYmxlV2hlbkNvbGxhcHNlZCA6ICFjLnZpc2libGVXaGVuQ29sbGFwc2VkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgaGlkZGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICAvKlxuICAgICAgICAgICAgQENvbnRlbnRDaGlsZHJlbiB3aXRoIGRlc2NlbmRhbnRzIHN0aWxsIHJldHVybnMgdGhlIGBwYXJlbnRgXG4gICAgICAgICAgICBjb21wb25lbnQgaW4gdGhlIHF1ZXJ5IGxpc3QuXG4gICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmhlYWRUZW1wbGF0ZSAmJiB0aGlzLmhlYWRUZW1wbGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlclRlbXBsYXRlID0gdGhpcy5oZWFkVGVtcGxhdGUudG9BcnJheSgpWzBdLnRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGUgPSB0aGlzLmNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY3VycmVudGx5IG9ubHkgaXZ5IGZpeGVzIHRoZSBpc3N1ZSwgd2UgaGF2ZSB0byBzbGljZSBvbmx5IGlmIHRoZSBmaXJzdCBjaGlsZCBpcyBncm91cFxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5maXJzdCA9PT0gdGhpcykge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5yZXNldCh0aGlzLmNoaWxkcmVuLnRvQXJyYXkoKS5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRFeHBhbmRDb2xsYXBzZVN0YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjaGlsZHJlbiBjb2x1bW5zIGNvbGxlY3Rpb24uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW5zID0gIHRoaXMuY29sdW1uR3JvdXAuYWxsQ2hpbGRyZW47XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGFsbENoaWxkcmVuKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4odGhpcy5jaGlsZHJlbi50b0FycmF5KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjb2x1bW4gaXMgYSBgQ29sdW1uR3JvdXBgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNDb2x1bW5Hcm91cCA9ICB0aGlzLmNvbHVtbkdyb3VwLmNvbHVtbkdyb3VwXG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGNvbHVtbkdyb3VwKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29sdW1uIGlzIGEgYENvbHVtbkxheW91dGAgZm9yIG11bHRpLXJvdyBsYXlvdXQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW5Hcm91cCA9ICB0aGlzLmNvbHVtbi5jb2x1bW5Hcm91cDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IGNvbHVtbkxheW91dCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIGdyb3VwLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uR3JvdXBXaWR0aCA9IHRoaXMuY29sdW1uR3JvdXAud2lkdGg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkdyb3VwQ29tcG9uZW50XG4gICAgICovXG4gICAgZ2V0IHdpZHRoKCkge1xuICAgICAgICBsZXQgaXNDaGlsZHJlbldpZHRoSW5QZXJjZW50ID0gZmFsc2UsIHdpZHRoO1xuICAgICAgICB3aWR0aCA9IGAke3RoaXMuY2hpbGRyZW4ucmVkdWNlKChhY2MsIHZhbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbC5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwud2lkdGggPT09ICdzdHJpbmcnICYmIHZhbC53aWR0aC5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaXNDaGlsZHJlbldpZHRoSW5QZXJjZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgcGFyc2VJbnQodmFsLndpZHRoLCAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjICsgcGFyc2VJbnQodmFsLmNhbGNXaWR0aCwgMTApO1xuICAgICAgICB9LCAwKX1gO1xuICAgICAgICByZXR1cm4gaXNDaGlsZHJlbldpZHRoSW5QZXJjZW50ID8gd2lkdGggKyAnJScgOiB3aWR0aCArICdweCc7XG4gICAgfVxuXG4gICAgc2V0IHdpZHRoKHZhbCkgeyB9XG5cbiAgICAvLyBjb25zdHJ1Y3RvcihwdWJsaWMgZ3JpZEFQSTogR3JpZEJhc2VBUElTZXJ2aWNlPElneEdyaWRCYXNlRGlyZWN0aXZlICYgSUdyaWREYXRhQmluZGFibGU+LCBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgIC8vICAgICAvLyBELlAuIGNvbnN0cnVjdG9yIGR1cGxpY2F0aW9uIGR1ZSB0byBlczYgY29tcGlsYXRpb24sIG1pZ2h0IGJlIG9ic29sZXRlIGluIHRoZSBmdXR1cmVcbiAgICAvLyAgICAgc3VwZXIoZ3JpZEFQSSwgY2RyKTtcbiAgICAvLyB9XG59XG4iXX0=