ornamentum
Version:
Angular Toolkit
401 lines • 30.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, ViewChild } from '@angular/core';
import { debounceTime } from 'rxjs/operators';
import { DataFetchMode } from '../../models/data-fetch-mode.enum';
import { DataTableConfigService } from '../../services/data-table-config.service';
import { DataTableDataStateService } from '../../services/data-table-data-state.service';
import { DataTableEventStateService } from '../../services/data-table-event.service';
import { ResizeService } from '../../../utility/services/resize.service';
/**
* Data table pagination component. Render data table paginator widget.
*/
var DataTablePaginationComponent = /** @class */ (function () {
function DataTablePaginationComponent(config, dataStateService, eventStateService, resizeService) {
this.config = config;
this.dataStateService = dataStateService;
this.eventStateService = eventStateService;
this.resizeService = resizeService;
this.isMobile = false;
}
/**
* Set mobile mode state.
*/
/**
* Set mobile mode state.
* @private
* @return {?}
*/
DataTablePaginationComponent.prototype.setMobileModeState = /**
* Set mobile mode state.
* @private
* @return {?}
*/
function () {
this.isMobile = this.paginationContainer.nativeElement.clientWidth < 767;
};
/**
* First page click event handler.
*/
/**
* First page click event handler.
* @return {?}
*/
DataTablePaginationComponent.prototype.firstPageClick = /**
* First page click event handler.
* @return {?}
*/
function () {
this.config.offset = 0;
this.eventStateService.dataFetchStream.emit(DataFetchMode.SOFT_LOAD);
};
/**
* Previous page click event handler.
*/
/**
* Previous page click event handler.
* @return {?}
*/
DataTablePaginationComponent.prototype.previousPageClick = /**
* Previous page click event handler.
* @return {?}
*/
function () {
this.config.offset = this.config.offset - Math.min(this.config.limit, this.config.offset);
this.eventStateService.dataFetchStream.emit(DataFetchMode.SOFT_LOAD);
};
/**
* Next page click event handler.
*/
/**
* Next page click event handler.
* @return {?}
*/
DataTablePaginationComponent.prototype.nextPageClick = /**
* Next page click event handler.
* @return {?}
*/
function () {
this.config.offset = this.config.offset + this.config.limit;
this.eventStateService.dataFetchStream.emit(DataFetchMode.SOFT_LOAD);
};
/**
* Last page click event handler.
*/
/**
* Last page click event handler.
* @return {?}
*/
DataTablePaginationComponent.prototype.lastPageClick = /**
* Last page click event handler.
* @return {?}
*/
function () {
this.config.offset = (this.maxPage - 1) * this.config.limit;
this.eventStateService.dataFetchStream.emit(DataFetchMode.SOFT_LOAD);
};
Object.defineProperty(DataTablePaginationComponent.prototype, "maxPage", {
/**
* Get maximum page count.
*/
get: /**
* Get maximum page count.
* @return {?}
*/
function () {
return Math.ceil(this.dataStateService.itemCount / this.config.limit);
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataTablePaginationComponent.prototype, "page", {
/**
* Get page number.
*/
get: /**
* Get page number.
* @return {?}
*/
function () {
return Math.floor(this.config.offset / this.config.limit) + 1;
},
enumerable: true,
configurable: true
});
/**
* Check limit invalid status. True if limit is invalid.
* @param element Limit input DOM element.
* @return Invalid status.
*/
/**
* Check limit invalid status. True if limit is invalid.
* @param {?} element Limit input DOM element.
* @return {?} Invalid status.
*/
DataTablePaginationComponent.prototype.isInvalidLimit = /**
* Check limit invalid status. True if limit is invalid.
* @param {?} element Limit input DOM element.
* @return {?} Invalid status.
*/
function (element) {
/** @type {?} */
var limit = Number(element.value);
return element.value === '' || limit > this.config.maxLimit || limit < 1;
};
/**
* On page size change event handler.
* @param element HTML input element.
*/
/**
* On page size change event handler.
* @param {?} element HTML input element.
* @return {?}
*/
DataTablePaginationComponent.prototype.onPageSizeChange = /**
* On page size change event handler.
* @param {?} element HTML input element.
* @return {?}
*/
function (element) {
if (this.isInvalidLimit(element)) {
element.value = String(this.config.limit);
return;
}
/** @type {?} */
var limit = Number(element.value);
if (this.config.limit !== limit) {
this.config.offset = 0;
this.config.limit = limit;
this.eventStateService.dataFetchStream.emit(DataFetchMode.SOFT_LOAD);
}
};
/**
* On page size revert event handler.
* @param element HTML input element.
*/
/**
* On page size revert event handler.
* @param {?} element HTML input element.
* @return {?}
*/
DataTablePaginationComponent.prototype.onPageSizeRevert = /**
* On page size revert event handler.
* @param {?} element HTML input element.
* @return {?}
*/
function (element) {
element.value = String(this.config.limit);
};
/**
* Is invalid page index; True if page index is invalid.
* @param element Page index DOM element.
* @return Invalid status.
*/
/**
* Is invalid page index; True if page index is invalid.
* @param {?} element Page index DOM element.
* @return {?} Invalid status.
*/
DataTablePaginationComponent.prototype.isInvalidPageIndex = /**
* Is invalid page index; True if page index is invalid.
* @param {?} element Page index DOM element.
* @return {?} Invalid status.
*/
function (element) {
/** @type {?} */
var page = Number(element.value);
return element.value === '' || page > this.maxPage || page < 1;
};
/**
* On page size change event handler.
* @param element HTML input element.
*/
/**
* On page size change event handler.
* @param {?} element HTML input element.
* @return {?}
*/
DataTablePaginationComponent.prototype.onPageIndexChange = /**
* On page size change event handler.
* @param {?} element HTML input element.
* @return {?}
*/
function (element) {
if (this.isInvalidPageIndex(element)) {
element.value = String(this.page);
return;
}
/** @type {?} */
var page = Number(element.value);
if (this.page !== page) {
this.config.offset = (page - 1) * this.config.limit;
this.eventStateService.dataFetchStream.emit(DataFetchMode.SOFT_LOAD);
}
};
/**
* On page size revert event handler.
* @param element HTML input element.
*/
/**
* On page size revert event handler.
* @param {?} element HTML input element.
* @return {?}
*/
DataTablePaginationComponent.prototype.onPageIndexRevert = /**
* On page size revert event handler.
* @param {?} element HTML input element.
* @return {?}
*/
function (element) {
element.value = String(this.page);
};
Object.defineProperty(DataTablePaginationComponent.prototype, "hasPrevious", {
/**
* Get previous page availability status.
*/
get: /**
* Get previous page availability status.
* @return {?}
*/
function () {
return this.config.offset <= 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataTablePaginationComponent.prototype, "hasNext", {
/**
* Get next page availability status.
*/
get: /**
* Get next page availability status.
* @return {?}
*/
function () {
return this.config.offset + this.config.limit >= this.dataStateService.itemCount;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataTablePaginationComponent.prototype, "startRowIndex", {
/**
* Get start row index.
*/
get: /**
* Get start row index.
* @return {?}
*/
function () {
return this.config.offset + 1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(DataTablePaginationComponent.prototype, "endRowIndex", {
/**
* Get end row index.
*/
get: /**
* Get end row index.
* @return {?}
*/
function () {
return Math.min(this.config.offset + this.config.limit, this.dataStateService.itemCount);
},
enumerable: true,
configurable: true
});
/**
* Prevent invalid key press.
* @param event Keyboard event argument object.
*/
/**
* Prevent invalid key press.
* @param {?} event Keyboard event argument object.
* @return {?}
*/
DataTablePaginationComponent.prototype.preventInvalidKeyPress = /**
* Prevent invalid key press.
* @param {?} event Keyboard event argument object.
* @return {?}
*/
function (event) {
if ((event.key >= '0' && event.key <= '9') ||
event.key === 'ArrowLeft' ||
event.key === 'ArrowRight' ||
event.key === 'Delete' ||
event.key === 'Backspace' ||
event.key === 'Escape' ||
event.key === 'Enter') {
return;
}
else {
event.preventDefault();
}
};
/**
* component init lifecycle event handler.
*/
/**
* component init lifecycle event handler.
* @return {?}
*/
DataTablePaginationComponent.prototype.ngOnInit = /**
* component init lifecycle event handler.
* @return {?}
*/
function () {
var _this = this;
this.setMobileModeState();
this.resizeService.resize.pipe(debounceTime(200)).subscribe((/**
* @return {?}
*/
function () {
_this.setMobileModeState();
}));
};
DataTablePaginationComponent.decorators = [
{ type: Component, args: [{
selector: 'ng-data-table-pagination',
template: "<div class=\"ng-data-table-pagination-container\" #paginationContainer>\n <div class=\"ng-data-table-pagination-range\" [hidden]=\"isMobile\">\n {{ config.translations.pagination.rangeKey }} <span [textContent]=\"startRowIndex\"></span>\n -<span [textContent]=\"endRowIndex\"></span>\n {{ config.translations.pagination.rangeSeparator }}\n <span [textContent]=\"dataStateService.itemCount\"></span>\n </div>\n <div class=\"ng-data-table-pagination-controllers\" [class.sm-controllers]=\"isMobile\">\n <div class=\"ng-data-table-pagination-limit\">\n <div class=\"ng-data-table-pagination-input-container\">\n <label class=\"ng-data-table-pagination-input-label\">{{ config.translations.pagination.limit }}</label>\n <input\n #limitInput\n type=\"number\"\n class=\"ng-data-table-pagination-input\"\n min=\"1\"\n step=\"1\"\n [attr.max]=\"config.maxLimit\"\n [class.ng-data-table-input-error]=\"isInvalidLimit(limitInput)\"\n [ngModel]=\"config.limit\"\n required\n (keypress)=\"preventInvalidKeyPress($event)\"\n (keyup.enter)=\"onPageSizeChange(limitInput)\"\n (keyup.esc)=\"onPageSizeRevert(limitInput)\"\n />\n </div>\n </div>\n <div class=\"ng-data-table-pagination-pages\">\n <button\n [disabled]=\"hasPrevious\"\n (click)=\"firstPageClick()\"\n [title]=\"config.translations.pagination.firstTooltip\"\n class=\"ng-data-table-action-button ng-data-table-pagination-firstpage\"\n ></button>\n <button\n [disabled]=\"hasPrevious\"\n (click)=\"previousPageClick()\"\n [title]=\"config.translations.pagination.previousTooltip\"\n class=\"ng-data-table-action-button ng-data-table-pagination-prevpage\"\n ></button>\n <div class=\"ng-data-table-pagination-page\">\n <div class=\"ng-data-table-pagination-input-container\">\n <input\n #pageInput\n type=\"number\"\n class=\"ng-data-table-pagination-input\"\n min=\"1\"\n step=\"1\"\n [attr.max]=\"maxPage\"\n [class.ng-data-table-input-error]=\"isInvalidPageIndex(pageInput)\"\n [ngModel]=\"page\"\n required\n (keypress)=\"preventInvalidKeyPress($event)\"\n (keyup.enter)=\"onPageIndexChange(pageInput)\"\n (keyup.esc)=\"onPageIndexRevert(pageInput)\"\n />\n <div class=\"ng-data-table-pagination-input-label\">\n <span>/ </span>\n <span [textContent]=\"maxPage\"></span>\n </div>\n </div>\n </div>\n <button\n [disabled]=\"hasNext\"\n (click)=\"nextPageClick()\"\n [title]=\"config.translations.pagination.nextTooltip\"\n class=\"ng-data-table-action-button ng-data-table-pagination-nextpage\"\n ></button>\n <button\n [disabled]=\"hasNext\"\n (click)=\"lastPageClick()\"\n [title]=\"config.translations.pagination.lastTooltip\"\n class=\"ng-data-table-action-button ng-data-table-pagination-lastpage\"\n ></button>\n </div>\n </div>\n</div>\n"
}] }
];
/** @nocollapse */
DataTablePaginationComponent.ctorParameters = function () { return [
{ type: DataTableConfigService },
{ type: DataTableDataStateService },
{ type: DataTableEventStateService },
{ type: ResizeService }
]; };
DataTablePaginationComponent.propDecorators = {
paginationContainer: [{ type: ViewChild, args: ['paginationContainer', { static: true },] }]
};
return DataTablePaginationComponent;
}());
export { DataTablePaginationComponent };
if (false) {
/**
* @type {?}
* @private
*/
DataTablePaginationComponent.prototype.paginationContainer;
/** @type {?} */
DataTablePaginationComponent.prototype.isMobile;
/** @type {?} */
DataTablePaginationComponent.prototype.config;
/** @type {?} */
DataTablePaginationComponent.prototype.dataStateService;
/**
* @type {?}
* @private
*/
DataTablePaginationComponent.prototype.eventStateService;
/**
* @type {?}
* @private
*/
DataTablePaginationComponent.prototype.resizeService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1wYWdpbmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL29ybmFtZW50dW0vIiwic291cmNlcyI6WyJkYXRhLXRhYmxlL2NvbXBvbmVudHMvZGF0YS10YWJsZS1wYWdpbmF0aW9uL2RhdGEtdGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7OztBQUt6RTtJQVVFLHNDQUNTLE1BQThCLEVBQzlCLGdCQUEyQyxFQUMxQyxpQkFBNkMsRUFDN0MsYUFBNEI7UUFIN0IsV0FBTSxHQUFOLE1BQU0sQ0FBd0I7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEyQjtRQUMxQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTRCO1FBQzdDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTi9CLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFPckIsQ0FBQztJQUVKOztPQUVHOzs7Ozs7SUFDSyx5REFBa0I7Ozs7O0lBQTFCO1FBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHOzs7OztJQUNJLHFE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LE9BQU8sRUFDckI7WUFDQSxPQUFPO1NBQ1I7YUFBTTtZQUNMLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSSwrQ0FBUTs7OztJQUFmO1FBQUEsaUJBTUM7UUFMQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUzs7O1FBQUM7WUFDMUQsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOztnQkF0TUYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLHVxR0FBcUQ7aUJBQ3REOzs7O2dCQVhRLHNCQUFzQjtnQkFDdEIseUJBQXlCO2dCQUN6QiwwQkFBMEI7Z0JBQzFCLGFBQWE7OztzQ0FVbkIsU0FBUyxTQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7SUFrTXBELG1DQUFDO0NBQUEsQUF2TUQsSUF1TUM7U0FuTVksNEJBQTRCOzs7Ozs7SUFDdkMsMkRBQ3FEOztJQUVyRCxnREFBd0I7O0lBR3RCLDhDQUFxQzs7SUFDckMsd0RBQWtEOzs7OztJQUNsRCx5REFBcUQ7Ozs7O0lBQ3JELHFEQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEYXRhRmV0Y2hNb2RlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGEtZmV0Y2gtbW9kZS5lbnVtJztcblxuaW1wb3J0IHsgRGF0YVRhYmxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtdGFibGUtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0YVRhYmxlRGF0YVN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtdGFibGUtZGF0YS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGFUYWJsZUV2ZW50U3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS10YWJsZS1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlc2l6ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi91dGlsaXR5L3NlcnZpY2VzL3Jlc2l6ZS5zZXJ2aWNlJztcblxuLyoqXG4gKiBEYXRhIHRhYmxlIHBhZ2luYXRpb24gY29tcG9uZW50LiBSZW5kZXIgZGF0YSB0YWJsZSBwYWdpbmF0b3Igd2lkZ2V0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZy1kYXRhLXRhYmxlLXBhZ2luYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS1wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVQYWdpbmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgncGFnaW5hdGlvbkNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgcGFnaW5hdGlvbkNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHVibGljIGlzTW9iaWxlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbmZpZzogRGF0YVRhYmxlQ29uZmlnU2VydmljZSxcbiAgICBwdWJsaWMgZGF0YVN0YXRlU2VydmljZTogRGF0YVRhYmxlRGF0YVN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U3RhdGVTZXJ2aWNlOiBEYXRhVGFibGVFdmVudFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlc2l6ZVNlcnZpY2U6IFJlc2l6ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBTZXQgbW9iaWxlIG1vZGUgc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHNldE1vYmlsZU1vZGVTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTW9iaWxlID0gdGhpcy5wYWdpbmF0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggPCA3Njc7XG4gIH1cblxuICAvKipcbiAgICogRmlyc3QgcGFnZSBjbGljayBldmVudCBoYW5kbGVyLlxuICAgKi9cbiAgcHVibGljIGZpcnN0UGFnZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLm9mZnNldCA9IDA7XG4gICAgdGhpcy5ldmVudFN0YXRlU2VydmljZS5kYXRhRmV0Y2hTdHJlYW0uZW1pdChEYXRhRmV0Y2hNb2RlLlNPRlRfTE9BRCk7XG4gIH1cblxuICAvKipcbiAgICogUHJldmlvdXMgcGFnZSBjbGljayBldmVudCBoYW5kbGVyLlxuICAgKi9cbiAgcHVibGljIHByZXZpb3VzUGFnZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLm9mZnNldCA9IHRoaXMuY29uZmlnLm9mZnNldCAtIE1hdGgubWluKHRoaXMuY29uZmlnLmxpbWl0LCB0aGlzLmNvbmZpZy5vZmZzZXQpO1xuICAgIHRoaXMuZXZlbnRTdGF0ZVNlcnZpY2UuZGF0YUZldGNoU3RyZWFtLmVtaXQoRGF0YUZldGNoTW9kZS5TT0ZUX0xPQUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5leHQgcGFnZSBjbGljayBldmVudCBoYW5kbGVyLlxuICAgKi9cbiAgcHVibGljIG5leHRQYWdlQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcub2Zmc2V0ID0gdGhpcy5jb25maWcub2Zmc2V0ICsgdGhpcy5jb25maWcubGltaXQ7XG4gICAgdGhpcy5ldmVudFN0YXRlU2VydmljZS5kYXRhRmV0Y2hTdHJlYW0uZW1pdChEYXRhRmV0Y2hNb2RlLlNPRlRfTE9BRCk7XG4gIH1cblxuICAvKipcbiAgICogTGFzdCBwYWdlIGNsaWNrIGV2ZW50IGhhbmRsZXIuXG4gICAqL1xuICBwdWJsaWMgbGFzdFBhZ2VDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZy5vZmZzZXQgPSAodGhpcy5tYXhQYWdlIC0gMSkgKiB0aGlzLmNvbmZpZy5saW1pdDtcbiAgICB0aGlzLmV2ZW50U3RhdGVTZXJ2aWNlLmRhdGFGZXRjaFN0cmVhbS5lbWl0KERhdGFGZXRjaE1vZGUuU09GVF9MT0FEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWF4aW11bSBwYWdlIGNvdW50LlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmRhdGFTdGF0ZVNlcnZpY2UuaXRlbUNvdW50IC8gdGhpcy5jb25maWcubGltaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMuY29uZmlnLm9mZnNldCAvIHRoaXMuY29uZmlnLmxpbWl0KSArIDE7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgbGltaXQgaW52YWxpZCBzdGF0dXMuIFRydWUgaWYgbGltaXQgaXMgaW52YWxpZC5cbiAgICogQHBhcmFtIGVsZW1lbnQgTGltaXQgaW5wdXQgRE9NIGVsZW1lbnQuXG4gICAqIEByZXR1cm4gSW52YWxpZCBzdGF0dXMuXG4gICAqL1xuICBwdWJsaWMgaXNJbnZhbGlkTGltaXQoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxpbWl0ID0gTnVtYmVyKGVsZW1lbnQudmFsdWUpO1xuICAgIHJldHVybiBlbGVtZW50LnZhbHVlID09PSAnJyB8fCBsaW1pdCA+IHRoaXMuY29uZmlnLm1heExpbWl0IHx8IGxpbWl0IDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBwYWdlIHNpemUgY2hhbmdlIGV2ZW50IGhhbmRsZXIuXG4gICAqIEBwYXJhbSBlbGVtZW50IEhUTUwgaW5wdXQgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBvblBhZ2VTaXplQ2hhbmdlKGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ludmFsaWRMaW1pdChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC52YWx1ZSA9IFN0cmluZyh0aGlzLmNvbmZpZy5saW1pdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGltaXQgPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxpbWl0ICE9PSBsaW1pdCkge1xuICAgICAgdGhpcy5jb25maWcub2Zmc2V0ID0gMDtcbiAgICAgIHRoaXMuY29uZmlnLmxpbWl0ID0gbGltaXQ7XG4gICAgICB0aGlzLmV2ZW50U3RhdGVTZXJ2aWNlLmRhdGFGZXRjaFN0cmVhbS5lbWl0KERhdGFGZXRjaE1vZGUuU09GVF9MT0FEKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gcGFnZSBzaXplIHJldmVydCBldmVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0gZWxlbWVudCBIVE1MIGlucHV0IGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgb25QYWdlU2l6ZVJldmVydChlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgZWxlbWVudC52YWx1ZSA9IFN0cmluZyh0aGlzLmNvbmZpZy5saW1pdCk7XG4gIH1cblxuICAvKipcbiAgICogSXMgaW52YWxpZCBwYWdlIGluZGV4OyBUcnVlIGlmIHBhZ2UgaW5kZXggaXMgaW52YWxpZC5cbiAgICogQHBhcmFtIGVsZW1lbnQgUGFnZSBpbmRleCBET00gZWxlbWVudC5cbiAgICogQHJldHVybiBJbnZhbGlkIHN0YXR1cy5cbiAgICovXG4gIHB1YmxpYyBpc0ludmFsaWRQYWdlSW5kZXgoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhZ2UgPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XG4gICAgcmV0dXJuIGVsZW1lbnQudmFsdWUgPT09ICcnIHx8IHBhZ2UgPiB0aGlzLm1heFBhZ2UgfHwgcGFnZSA8IDE7XG4gIH1cblxuICAvKipcbiAgICogT24gcGFnZSBzaXplIGNoYW5nZSBldmVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0gZWxlbWVudCBIVE1MIGlucHV0IGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgb25QYWdlSW5kZXhDaGFuZ2UoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzSW52YWxpZFBhZ2VJbmRleChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC52YWx1ZSA9IFN0cmluZyh0aGlzLnBhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2UgPSBOdW1iZXIoZWxlbWVudC52YWx1ZSk7XG4gICAgaWYgKHRoaXMucGFnZSAhPT0gcGFnZSkge1xuICAgICAgdGhpcy5jb25maWcub2Zmc2V0ID0gKHBhZ2UgLSAxKSAqIHRoaXMuY29uZmlnLmxpbWl0O1xuICAgICAgdGhpcy5ldmVudFN0YXRlU2VydmljZS5kYXRhRmV0Y2hTdHJlYW0uZW1pdChEYXRhRmV0Y2hNb2RlLlNPRlRfTE9BRCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIHBhZ2Ugc2l6ZSByZXZlcnQgZXZlbnQgaGFuZGxlci5cbiAgICogQHBhcmFtIGVsZW1lbnQgSFRNTCBpbnB1dCBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIG9uUGFnZUluZGV4UmV2ZXJ0KGVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LnZhbHVlID0gU3RyaW5nKHRoaXMucGFnZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHByZXZpb3VzIHBhZ2UgYXZhaWxhYmlsaXR5IHN0YXR1cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUHJldmlvdXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm9mZnNldCA8PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBuZXh0IHBhZ2UgYXZhaWxhYmlsaXR5IHN0YXR1cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTmV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcub2Zmc2V0ICsgdGhpcy5jb25maWcubGltaXQgPj0gdGhpcy5kYXRhU3RhdGVTZXJ2aWNlLml0ZW1Db3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RhcnQgcm93IGluZGV4LlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFydFJvd0luZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm9mZnNldCArIDE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVuZCByb3cgaW5kZXguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVuZFJvd0luZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMuY29uZmlnLm9mZnNldCArIHRoaXMuY29uZmlnLmxpbWl0LCB0aGlzLmRhdGFTdGF0ZVNlcnZpY2UuaXRlbUNvdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2ZW50IGludmFsaWQga2V5IHByZXNzLlxuICAgKiBAcGFyYW0gZXZlbnQgS2V5Ym9hcmQgZXZlbnQgYXJndW1lbnQgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHByZXZlbnRJbnZhbGlkS2V5UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAoZXZlbnQua2V5ID49ICcwJyAmJiBldmVudC5rZXkgPD0gJzknKSB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJ0VudGVyJ1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjb21wb25lbnQgaW5pdCBsaWZlY3ljbGUgZXZlbnQgaGFuZGxlci5cbiAgICovXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE1vYmlsZU1vZGVTdGF0ZSgpO1xuXG4gICAgdGhpcy5yZXNpemVTZXJ2aWNlLnJlc2l6ZS5waXBlKGRlYm91bmNlVGltZSgyMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRNb2JpbGVNb2RlU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxufVxuIl19