ngx-easy-table
Version:
Angular easy table
273 lines • 26.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, HostListener, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
import { Event } from '../..';
import { StyleService } from '../../services/style.service';
import { moveItemInArray } from '@angular/cdk/drag-drop';
var TableTHeadComponent = /** @class */ (function () {
function TableTHeadComponent(styleService) {
this.styleService = styleService;
this.menuActive = false;
this.openedHeaderActionTemplate = null;
this.onSelectAllBinded = this.onSelectAll.bind(this);
this.filter = new EventEmitter();
this.order = new EventEmitter();
this.selectAll = new EventEmitter();
this.event = new EventEmitter();
}
/**
* @param {?} targetElement
* @return {?}
*/
TableTHeadComponent.prototype.onClick = /**
* @param {?} targetElement
* @return {?}
*/
function (targetElement) {
if (this.additionalActionMenu && !this.additionalActionMenu.nativeElement.contains(targetElement)) {
this.menuActive = false;
}
};
/**
* @param {?} column
* @return {?}
*/
TableTHeadComponent.prototype.getColumnDefinition = /**
* @param {?} column
* @return {?}
*/
function (column) {
return column.searchEnabled || typeof column.searchEnabled === 'undefined';
};
/**
* @param {?} column
* @return {?}
*/
TableTHeadComponent.prototype.orderBy = /**
* @param {?} column
* @return {?}
*/
function (column) {
this.order.emit(column);
};
/**
* @param {?} column
* @return {?}
*/
TableTHeadComponent.prototype.isOrderEnabled = /**
* @param {?} column
* @return {?}
*/
function (column) {
/** @type {?} */
var columnOrderEnabled = column.orderEnabled === undefined ? true : !!column.orderEnabled;
return this.config.orderEnabled && columnOrderEnabled;
};
/**
* @param {?} event
* @return {?}
*/
TableTHeadComponent.prototype.columnDrop = /**
* @param {?} event
* @return {?}
*/
function (event) {
moveItemInArray(this.columns, event.previousIndex, event.currentIndex);
};
/**
* @param {?} $event
* @return {?}
*/
TableTHeadComponent.prototype.onSearch = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.filter.emit($event);
};
/**
* @param {?} column
* @return {?}
*/
TableTHeadComponent.prototype.getColumnWidth = /**
* @param {?} column
* @return {?}
*/
function (column) {
if (column.width) {
return column.width;
}
return this.config.fixedColumnWidth ? 100 / this.columns.length + '%' : null;
};
/**
* @return {?}
*/
TableTHeadComponent.prototype.onSelectAll = /**
* @return {?}
*/
function () {
this.selectAll.emit();
};
/**
* @param {?} event
* @param {?} th
* @return {?}
*/
TableTHeadComponent.prototype.onMouseDown = /**
* @param {?} event
* @param {?} th
* @return {?}
*/
function (event, th) {
if (!this.config.resizeColumn) {
return;
}
this.th = th;
this.startOffset = th.offsetWidth - event.pageX;
this.event.emit({
event: Event.onColumnResizeMouseDown,
value: event,
});
};
/**
* @param {?} event
* @return {?}
*/
TableTHeadComponent.prototype.onMouseMove = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.config.resizeColumn) {
return;
}
if (this.th && this.th.style) {
this.th.style.width = this.startOffset + event.pageX + 'px';
this.th.style.cursor = 'col-resize';
this.th.style['user-select'] = 'none';
}
};
/**
* @param {?} event
* @return {?}
*/
TableTHeadComponent.prototype.onMouseUp = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.config.resizeColumn) {
return;
}
this.event.emit({
event: Event.onColumnResizeMouseUp,
value: event,
});
this.th.style.cursor = 'default';
this.th = undefined;
};
/**
* @param {?} column
* @return {?}
*/
TableTHeadComponent.prototype.showHeaderActionTemplateMenu = /**
* @param {?} column
* @return {?}
*/
function (column) {
if (!column.headerActionTemplate) {
console.error('Column [headerActionTemplate] property not defined');
}
if (this.openedHeaderActionTemplate === column.key) {
this.openedHeaderActionTemplate = null;
return;
}
this.openedHeaderActionTemplate = column.key;
};
/**
* @return {?}
*/
TableTHeadComponent.prototype.showMenu = /**
* @return {?}
*/
function () {
if (!this.additionalActionsTemplate) {
console.error('[additionalActionsTemplate] property not defined');
}
this.menuActive = !this.menuActive;
};
TableTHeadComponent.decorators = [
{ type: Component, args: [{
selector: '[table-thead]',
template: "<tr class=\"ngx-table__header\" *ngIf=\"config.headerEnabled && !config.columnReorder\">\n <th *ngIf=\"config.checkboxes || config.radio\" [style.width]=\"'3%'\">\n <ng-container\n *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutlet]=\"selectAllTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\">\n </ng-container>\n <label class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\"\n *ngIf=\"!selectAllTemplate && config.checkboxes\">\n <input type=\"checkbox\" id=\"selectAllCheckboxes\" (change)=\"onSelectAll()\">\n <em class=\"ngx-form-icon\" id=\"selectAllCheckbox\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th class=\"ngx-table__header-cell\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n #th\n [style.width]=\"getColumnWidth(column)\"\n (mousedown)=\"onMouseDown($event, th)\"\n (mouseup)=\"onMouseUp($event)\"\n (mousemove)=\"onMouseMove($event)\">\n <div (click)=\"orderBy(column)\" style=\"display: inline\" [class.pointer]=\"isOrderEnabled(column)\">\n <div class=\"ngx-table__header-title\">{{ column.title }}<span> </span>\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none' \">\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\">\n </em>\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\">\n </em>\n </div>\n </div>\n </div>\n <div class=\"ngx-dropdown\"\n *ngIf=\"!!column.headerActionTemplate\">\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div class=\"ngx-menu ngx-table__table-menu\"\n *ngIf=\"column.key === openedHeaderActionTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"column.headerActionTemplate\">\n </ng-container>\n </div>\n </div>\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\n </th>\n </ng-container>\n <th *ngIf=\"config.additionalActions || config.detailsTemplate || config.collapseAllRows || config.groupRows\"\n class=\"ngx-table__header-cell-additional-actions\">\n <div class=\"ngx-dropdown\"\n #additionalActionMenu\n *ngIf=\"config.additionalActions\">\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul class=\"ngx-menu ngx-table__table-menu\"\n *ngIf=\"menuActive\">\n <ng-container\n *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\">\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr class=\"ngx-table__header ngx-table__header--draggable\"\n *ngIf=\"config.headerEnabled && config.columnReorder\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"columnDrop($event)\"\n>\n <th [style.width]=\"'3%'\">\n <ng-container\n *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutlet]=\"selectAllTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\">\n </ng-container>\n <label class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\"\n *ngIf=\"!selectAllTemplate && config.checkboxes\">\n <input type=\"checkbox\" id=\"selectAllCheckboxesDrag\" (change)=\"onSelectAll()\">\n <em class=\"ngx-form-icon\" id=\"selectAllCheckboxDrag\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th class=\"ngx-table__header-cell ngx-table__header-cell--draggable\"\n cdkDragLockAxis=\"x\"\n cdkDrag\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n #th\n [style.width]=\"getColumnWidth(column)\"\n (mousedown)=\"onMouseDown($event, th)\"\n (mouseup)=\"onMouseUp($event)\"\n (mousemove)=\"onMouseMove($event)\">\n <div (click)=\"orderBy(column)\" style=\"display: inline\"\n cdkDragHandle\n [class.pointer]=\"isOrderEnabled(column)\">\n <div class=\"ngx-table__header-title\">{{ column.title }}<span> </span>\n <em class=\"ngx-icon ngx-icon-pin\" *ngIf=\"column.pinned\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none' \">\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\">\n </em>\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\">\n </em>\n </div>\n </div>\n </div>\n <div class=\"ngx-dropdown\"\n *ngIf=\"!!column.headerActionTemplate\">\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showHeaderActionTemplateMenu(column)\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div class=\"ngx-menu ngx-table__table-menu\"\n *ngIf=\"column.key === openedHeaderActionTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"column.headerActionTemplate\">\n </ng-container>\n </div>\n </div>\n <div class=\"ngx-table__column-resizer\" *ngIf=\"config.resizeColumn && !last\"></div>\n </th>\n </ng-container>\n <th *ngIf=\"config.additionalActions || config.detailsTemplate || config.collapseAllRows || config.groupRows\"\n class=\"ngx-table__header-cell-additional-actions\">\n <div class=\"ngx-dropdown\"\n #additionalActionMenu\n *ngIf=\"config.additionalActions\">\n <a class=\"ngx-btn ngx-btn-link\" (click)=\"showMenu()\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul class=\"ngx-menu ngx-table__table-menu\"\n *ngIf=\"menuActive\">\n <ng-container\n *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\">\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr *ngIf=\"config.searchEnabled && !filtersTemplate\"\n class=\"ngx-table__sort-header\">\n <th *ngIf=\"config.checkboxes || config.radio\"></th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index\">\n <th\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [class.pinned-left]=\"column.pinned\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\">\n <table-header\n *ngIf=\"getColumnDefinition(column)\"\n (update)=\"onSearch($event)\"\n [column]=\"column\">\n </table-header>\n </th>\n </ng-container>\n <th *ngIf=\"config.additionalActions || config.detailsTemplate\"></th>\n</tr>\n<ng-container *ngIf=\"filtersTemplate\">\n <tr>\n <ng-container [ngTemplateOutlet]=\"filtersTemplate\">\n </ng-container>\n </tr>\n</ng-container>\n",
providers: [StyleService],
styles: ["\n .cdk-drag-preview {\n text-align: left;\n padding-top: 9px;\n padding-left: 4px;\n color: #50596c;\n border: 1px solid #e7e9ed;\n }\n "]
}] }
];
/** @nocollapse */
TableTHeadComponent.ctorParameters = function () { return [
{ type: StyleService }
]; };
TableTHeadComponent.propDecorators = {
config: [{ type: Input }],
columns: [{ type: Input }],
sortKey: [{ type: Input }],
sortState: [{ type: Input }],
selectAllTemplate: [{ type: Input }],
filtersTemplate: [{ type: Input }],
additionalActionsTemplate: [{ type: Input }],
filter: [{ type: Output }],
order: [{ type: Output }],
selectAll: [{ type: Output }],
event: [{ type: Output }],
th: [{ type: ViewChild, args: ['th', { static: false },] }],
additionalActionMenu: [{ type: ViewChild, args: ['additionalActionMenu', { static: false },] }],
onClick: [{ type: HostListener, args: ['document:click', ['$event.target'],] }]
};
return TableTHeadComponent;
}());
export { TableTHeadComponent };
if (false) {
/** @type {?} */
TableTHeadComponent.prototype.menuActive;
/** @type {?} */
TableTHeadComponent.prototype.openedHeaderActionTemplate;
/** @type {?} */
TableTHeadComponent.prototype.startOffset;
/** @type {?} */
TableTHeadComponent.prototype.onSelectAllBinded;
/** @type {?} */
TableTHeadComponent.prototype.config;
/** @type {?} */
TableTHeadComponent.prototype.columns;
/** @type {?} */
TableTHeadComponent.prototype.sortKey;
/** @type {?} */
TableTHeadComponent.prototype.sortState;
/** @type {?} */
TableTHeadComponent.prototype.selectAllTemplate;
/** @type {?} */
TableTHeadComponent.prototype.filtersTemplate;
/** @type {?} */
TableTHeadComponent.prototype.additionalActionsTemplate;
/** @type {?} */
TableTHeadComponent.prototype.filter;
/** @type {?} */
TableTHeadComponent.prototype.order;
/** @type {?} */
TableTHeadComponent.prototype.selectAll;
/** @type {?} */
TableTHeadComponent.prototype.event;
/**
* @type {?}
* @private
*/
TableTHeadComponent.prototype.th;
/** @type {?} */
TableTHeadComponent.prototype.additionalActionMenu;
/** @type {?} */
TableTHeadComponent.prototype.styleService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWVhc3ktdGFibGUvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy90aGVhZC90aGVhZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFtQixLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RTtJQXdDRSw2QkFDa0IsWUFBMEI7UUFBMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUExQnJDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsK0JBQTBCLEdBQWtCLElBQUksQ0FBQztRQUVqRCxzQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVNwQyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQXlDLENBQUM7UUFDbkUsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDcEMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDckMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO0lBYzdFLENBQUM7Ozs7O0lBVk0scUNBQU87Ozs7SUFEZCxVQUNlLGFBQWtCO1FBQy9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDakcsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDekI7SUFDSCxDQUFDOzs7OztJ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QUFTLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzBCQUNuRCxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUM7O0lBaUduRCwwQkFBQztDQUFBLEFBbElELElBa0lDO1NBcEhZLG1CQUFtQjs7O0lBQzlCLHlDQUEwQjs7SUFDMUIseURBQXdEOztJQUN4RCwwQ0FBbUI7O0lBQ25CLGdEQUF1RDs7SUFFdkQscUNBQXdCOztJQUN4QixzQ0FBNEI7O0lBQzVCLHNDQUFpQjs7SUFDakIsd0NBQW1COztJQUNuQixnREFBMkI7O0lBQzNCLDhDQUF5Qjs7SUFDekIsd0RBQXNEOztJQUN0RCxxQ0FBc0Y7O0lBQ3RGLG9DQUF1RDs7SUFDdkQsd0NBQXdEOztJQUN4RCxvQ0FBNkU7Ozs7O0lBQzdFLGlDQUErQzs7SUFDL0MsbURBQTJFOztJQVN6RSwyQ0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbnMsIENvbmZpZywgRXZlbnQgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQgeyBTdHlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdHlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW3RhYmxlLXRoZWFkXScsXG4gIHRlbXBsYXRlVXJsOiAnLi90aGVhZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlczogW2BcbiAgICAuY2RrLWRyYWctcHJldmlldyB7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgcGFkZGluZy10b3A6IDlweDtcbiAgICAgIHBhZGRpbmctbGVmdDogNHB4O1xuICAgICAgY29sb3I6ICM1MDU5NmM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTdlOWVkO1xuICAgIH1cbiAgYF0sXG4gIHByb3ZpZGVyczogW1N0eWxlU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlVEhlYWRDb21wb25lbnQge1xuICBwdWJsaWMgbWVudUFjdGl2ZSA9IGZhbHNlO1xuICBwdWJsaWMgb3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgc3RhcnRPZmZzZXQ7XG4gIHB1YmxpYyBvblNlbGVjdEFsbEJpbmRlZCA9IHRoaXMub25TZWxlY3RBbGwuYmluZCh0aGlzKTtcblxuICBASW5wdXQoKSBjb25maWc6IENvbmZpZztcbiAgQElucHV0KCkgY29sdW1uczogQ29sdW1uc1tdO1xuICBASW5wdXQoKSBzb3J0S2V5O1xuICBASW5wdXQoKSBzb3J0U3RhdGU7XG4gIEBJbnB1dCgpIHNlbGVjdEFsbFRlbXBsYXRlO1xuICBASW5wdXQoKSBmaWx0ZXJzVGVtcGxhdGU7XG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgb3JkZXIgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbnM+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RBbGwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogc3RyaW5nLCB2YWx1ZTogYW55IH0+KCk7XG4gIEBWaWV3Q2hpbGQoJ3RoJywgeyBzdGF0aWM6IGZhbHNlIH0pIHByaXZhdGUgdGg7XG4gIEBWaWV3Q2hpbGQoJ2FkZGl0aW9uYWxBY3Rpb25NZW51JywgeyBzdGF0aWM6IGZhbHNlIH0pIGFkZGl0aW9uYWxBY3Rpb25NZW51O1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICBwdWJsaWMgb25DbGljayh0YXJnZXRFbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hZGRpdGlvbmFsQWN0aW9uTWVudSAmJiAhdGhpcy5hZGRpdGlvbmFsQWN0aW9uTWVudS5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldEVsZW1lbnQpKSB7XG4gICAgICB0aGlzLm1lbnVBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3R5bGVTZXJ2aWNlOiBTdHlsZVNlcnZpY2UsXG4gICkge1xuXG4gIH1cblxuICBnZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbjogQ29sdW1ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2x1bW4uc2VhcmNoRW5hYmxlZCB8fCB0eXBlb2YgY29sdW1uLnNlYXJjaEVuYWJsZWQgPT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgb3JkZXJCeShjb2x1bW46IENvbHVtbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9yZGVyLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIGlzT3JkZXJFbmFibGVkKGNvbHVtbjogQ29sdW1ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbHVtbk9yZGVyRW5hYmxlZCA9IGNvbHVtbi5vcmRlckVuYWJsZWQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiAhIWNvbHVtbi5vcmRlckVuYWJsZWQ7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm9yZGVyRW5hYmxlZCAmJiBjb2x1bW5PcmRlckVuYWJsZWQ7XG4gIH1cblxuICBjb2x1bW5Ecm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pOiB2b2lkIHtcbiAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5jb2x1bW5zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICB9XG5cbiAgb25TZWFyY2goJGV2ZW50OiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXIuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgZ2V0Q29sdW1uV2lkdGgoY29sdW1uOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoY29sdW1uLndpZHRoKSB7XG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZml4ZWRDb2x1bW5XaWR0aCA/IDEwMCAvIHRoaXMuY29sdW1ucy5sZW5ndGggKyAnJScgOiBudWxsO1xuICB9XG5cbiAgb25TZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RBbGwuZW1pdCgpO1xuICB9XG5cbiAgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQsIHRoOiBIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcucmVzaXplQ29sdW1uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGggPSB0aDtcbiAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gdGgub2Zmc2V0V2lkdGggLSBldmVudC5wYWdlWDtcbiAgICB0aGlzLmV2ZW50LmVtaXQoe1xuICAgICAgZXZlbnQ6IEV2ZW50Lm9uQ29sdW1uUmVzaXplTW91c2VEb3duLFxuICAgICAgdmFsdWU6IGV2ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnJlc2l6ZUNvbHVtbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50aCAmJiB0aGlzLnRoLnN0eWxlKSB7XG4gICAgICB0aGlzLnRoLnN0eWxlLndpZHRoID0gdGhpcy5zdGFydE9mZnNldCArIGV2ZW50LnBhZ2VYICsgJ3B4JztcbiAgICAgIHRoaXMudGguc3R5bGUuY3Vyc29yID0gJ2NvbC1yZXNpemUnO1xuICAgICAgdGhpcy50aC5zdHlsZVsndXNlci1zZWxlY3QnXSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICBvbk1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnJlc2l6ZUNvbHVtbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50LmVtaXQoe1xuICAgICAgZXZlbnQ6IEV2ZW50Lm9uQ29sdW1uUmVzaXplTW91c2VVcCxcbiAgICAgIHZhbHVlOiBldmVudCxcbiAgICB9KTtcbiAgICB0aGlzLnRoLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB0aGlzLnRoID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgc2hvd0hlYWRlckFjdGlvblRlbXBsYXRlTWVudShjb2x1bW46IENvbHVtbnMpOiB2b2lkIHtcbiAgICBpZiAoIWNvbHVtbi5oZWFkZXJBY3Rpb25UZW1wbGF0ZSkge1xuICAgICAgY29uc29sZS5lcnJvcignQ29sdW1uIFtoZWFkZXJBY3Rpb25UZW1wbGF0ZV0gcHJvcGVydHkgbm90IGRlZmluZWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGUgPT09IGNvbHVtbi5rZXkpIHtcbiAgICAgIHRoaXMub3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlID0gY29sdW1uLmtleTtcbiAgfVxuXG4gIHNob3dNZW51KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hZGRpdGlvbmFsQWN0aW9uc1RlbXBsYXRlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbYWRkaXRpb25hbEFjdGlvbnNUZW1wbGF0ZV0gcHJvcGVydHkgbm90IGRlZmluZWQnKTtcbiAgICB9XG4gICAgdGhpcy5tZW51QWN0aXZlID0gIXRoaXMubWVudUFjdGl2ZTtcbiAgfVxufVxuIl19