UNPKG

angular-io-pager

Version:
269 lines (268 loc) 24.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter } from '@angular/core'; var AngularIoPagerComponent = /** @class */ (function () { function AngularIoPagerComponent() { this.pageGap = 10; this.id = 1; this.noOfPages = 10; this.pageClick = new EventEmitter(); // page view count selectors this.from = 1; this.to = 0; this.pageLength = 20; this.currentPage = 1; this.pages = []; this.pageNum = []; this.showLeftNav = false; this.showRightNav = false; this.totalPageLength = 0; this.leftNavString = '<<'; this.rightNavString = '>>'; this.lastPageMax = 0; this.lastPageMin = 0; this._total = 0; } Object.defineProperty(AngularIoPagerComponent.prototype, "totalRecords", { get: /** * @return {?} */ function () { return this._total; }, set: /** * @param {?} value * @return {?} */ function (value) { this._total = value; if (value > 0) { this.pagePreparation(); } }, enumerable: true, configurable: true }); /** * @return {?} */ AngularIoPagerComponent.prototype.ngOnInit = /** * @return {?} */ function () { for (var i = 1; i <= this.pageLength; i++) { this.pages.push(i * this.pageGap); } this.to = this.pages[0]; }; /** * @return {?} */ AngularIoPagerComponent.prototype.pagePreparation = /** * @return {?} */ function () { var _this = this; this.reCalculatePageNumbers(); setTimeout(function () { _this.setSelectedPage(); }, 0); }; /** * @return {?} */ AngularIoPagerComponent.prototype.reCalculatePageNumbers = /** * @return {?} */ function () { /** @type {?} */ var divided = (this.totalRecords / this.pageGap).toString().split('.'); /** @type {?} */ var wholePageLen = parseInt(divided[0], 10); /** @type {?} */ var partialPageLen = 0; if (divided.length === 2) { // has one more page with limited records partialPageLen = 1; } this.totalPageLength = wholePageLen + partialPageLen; this.pageNum.length = 0; this.populatePages(1); }; /** * @param {?} start * @return {?} */ AngularIoPagerComponent.prototype.populatePages = /** * @param {?} start * @return {?} */ function (start) { /** @type {?} */ var until = 1; this.pageNum.length = 0; for (var i = start; i <= this.totalPageLength && until <= this.noOfPages; i++) { this.pageNum.push(i); until++; } this.currentPage = this.lastPageMin = Math.min.apply(Math, tslib_1.__spread(this.pageNum)); this.lastPageMax = Math.max.apply(Math, tslib_1.__spread(this.pageNum)); this.setPrevNextNav(); }; /** * @return {?} */ AngularIoPagerComponent.prototype.pageLengthChange = /** * @return {?} */ function () { this.reCalculatePageNumbers(); this.setSelectedPage(); }; /** * @param {?} e * @return {?} */ AngularIoPagerComponent.prototype.pageChange = /** * @param {?} e * @return {?} */ function (e) { if (e.target.classList.contains('cmdLeft')) { this.populatePages(this.lastPageMin - this.noOfPages); this.setSelectedPage(); } else if (e.target.classList.contains('cmdRight')) { this.populatePages(++this.lastPageMax); this.setSelectedPage(); } else { this.setSelectedPage(e.target); } }; /** * @param {?=} el * @return {?} */ AngularIoPagerComponent.prototype.setSelectedPage = /** * @param {?=} el * @return {?} */ function (el) { var _this = this; if (el === void 0) { el = null; } if (el != null) { this.currentPage = parseInt(el.innerText, 10); } this.to = Math.min(this.currentPage * this.pageGap, this.totalRecords); this.from = this.currentPage * this.pageGap - this.pageGap + 1; setTimeout(function () { el = /** @type {?} */ (((el == null ? document .getElementById('pager' + _this.id) .querySelector('.pageElements') : el))); /** @type {?} */ var closePageNum = el; while ((closePageNum = closePageNum.parentElement) && !closePageNum.classList.contains('pageNumbers')) { } Array.from(closePageNum.children).forEach(function (x) { return x.classList.remove('selected'); }); el.classList.add('selected'); }, 0); this.emitPageClick(); }; /** * @return {?} */ AngularIoPagerComponent.prototype.setPrevNextNav = /** * @return {?} */ function () { this.showLeftNav = this.showRightNav = false; if (this.currentPage > this.noOfPages) { // current page is out of maximum pages can be shown, it means it is not the first set of page numbers. show left this.showLeftNav = true; } /** @type {?} */ var currentPageIsInBetween = (this.currentPage / this.noOfPages).toString().split('.') .length === 2; /** @type {?} */ var currHighestPageShowing = parseInt((this.currentPage / this.noOfPages).toString(), 10) * this.noOfPages + (currentPageIsInBetween ? this.noOfPages : 0); if (currHighestPageShowing < this.totalPageLength) { this.showRightNav = true; } }; /** * @return {?} */ AngularIoPagerComponent.prototype.emitPageClick = /** * @return {?} */ function () { this.pageClick.emit({ from: this.from, to: this.to }); }; AngularIoPagerComponent.decorators = [ { type: Component, args: [{ selector: 'sr-angular-io-pager', template: "<div class=\"pager\" [ngClass]=\"{'hidden': totalRecords <= 0}\" [id]=\"'pager' + id\">\n <div class=\"left\">\n Show\n <select [(ngModel)]=\"pageGap\" (change)=\"pageLengthChange()\"\n id=\"pageGap\">\n <option *ngFor=\"let pg of pages\" [value]=\"pg\">{{pg}}</option>\n </select>\n Showing {{from}}-{{to}} of {{totalRecords}}\n </div>\n <div class=\"right\">\n <ul class=\"pageNumbers\" id=\"pageList\">\n <li *ngIf=\"showLeftNav\" (click)=\"pageChange($event)\"\n class=\"cmdLeft\"> {{leftNavString}} </li>\n <li *ngFor=\"let pn of pageNum\" (click)=\"pageChange($event)\"\n class=\"pageElements\">{{pn}}</li>\n <li *ngIf=\"showRightNav\" (click)=\"pageChange($event)\"\n class=\"cmdRight\"> {{rightNavString}} </li>\n </ul>\n </div>\n</div>", styles: [".pager{font:bold 13px Arial;color:#377bba}.pageNumbers{list-style:none;border:1px solid #dfdfdf;display:inline-block;padding-left:0;margin:0}.pageNumbers li{float:left;padding:8px 10px;background:#fff;border-left:1px solid #dfdfdf;border-collapse:collapse;color:#377bba;cursor:pointer;min-width:15px;text-align:center}.pageNumbers li.selected{background:#377bba;color:#fff}.pageNumbers li:first-of-type{border-left:0}.pageNumbers li:hover{background:#3a4046;color:#fff}div.left{padding:9px 0}select{color:#377bba;font-weight:700;font-size:.9em;padding:2px;border:1px solid #377bba}.left{float:left}.right{float:right}.hidden{display:none}"] },] }, ]; /** @nocollapse */ AngularIoPagerComponent.ctorParameters = function () { return []; }; AngularIoPagerComponent.propDecorators = { pageGap: [{ type: Input }], id: [{ type: Input }], noOfPages: [{ type: Input }], totalRecords: [{ type: Input }], pageClick: [{ type: Output }] }; return AngularIoPagerComponent; }()); export { AngularIoPagerComponent }; if (false) { /** @type {?} */ AngularIoPagerComponent.prototype.pageGap; /** @type {?} */ AngularIoPagerComponent.prototype.id; /** @type {?} */ AngularIoPagerComponent.prototype.noOfPages; /** @type {?} */ AngularIoPagerComponent.prototype.pageClick; /** @type {?} */ AngularIoPagerComponent.prototype.from; /** @type {?} */ AngularIoPagerComponent.prototype.to; /** @type {?} */ AngularIoPagerComponent.prototype.pageLength; /** @type {?} */ AngularIoPagerComponent.prototype.currentPage; /** @type {?} */ AngularIoPagerComponent.prototype.pages; /** @type {?} */ AngularIoPagerComponent.prototype.pageNum; /** @type {?} */ AngularIoPagerComponent.prototype.showLeftNav; /** @type {?} */ AngularIoPagerComponent.prototype.showRightNav; /** @type {?} */ AngularIoPagerComponent.prototype.totalPageLength; /** @type {?} */ AngularIoPagerComponent.prototype.leftNavString; /** @type {?} */ AngularIoPagerComponent.prototype.rightNavString; /** @type {?} */ AngularIoPagerComponent.prototype.lastPageMax; /** @type {?} */ AngularIoPagerComponent.prototype.lastPageMin; /** @type {?} */ AngularIoPagerComponent.prototype._total; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1pby1wYWdlci8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLWlvLXBhZ2VyL3BhZ2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7O0lBaUU3RTt1QkFyQ1UsRUFBRTtrQkFFUCxDQUFDO3lCQUVNLEVBQUU7eUJBZW9CLElBQUksWUFBWSxFQUFFOztvQkFHN0MsQ0FBQztrQkFDSCxDQUFDOzBCQUNPLEVBQUU7MkJBQ0QsQ0FBQztxQkFDRyxFQUFFO3VCQUNBLEVBQUU7MkJBQ1IsS0FBSzs0QkFDSixLQUFLOytCQUNGLENBQUM7NkJBQ0gsSUFBSTs4QkFDSCxJQUFJOzJCQUNQLENBQUM7MkJBQ0QsQ0FBQztzQkFDTixDQUFDO0tBRU07SUFoQ2hCLHNCQUNXLGlEQUFZOzs7OztZQVNyQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7O1FBVnJCLFVBQ3dCLEtBQWE7WUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFFcEIsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2FBQ3hCO1NBQ0Y7OztPQUFBOzs7O0lBMkJELDBDQUFROzs7SUFBUjtRQUNFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7UUFFRCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FB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QUFFLGcyQkFtQkw7b0JBQ0wsTUFBTSxFQUFFLENBQUMsZ29CQUFnb0IsQ0FBQztpQkFDM29COzs7OzswQkFFRSxLQUFLO3FCQUVMLEtBQUs7NEJBRUwsS0FBSzsrQkFFTCxLQUFLOzRCQWFMLE1BQU07O2tDQTlDVDs7U0EwQmEsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzci1hbmd1bGFyLWlvLXBhZ2VyJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGFnZXJcIiBbbmdDbGFzc109XCJ7J2hpZGRlbic6IHRvdGFsUmVjb3JkcyA8PSAwfVwiIFtpZF09XCIncGFnZXInICsgaWRcIj5cbiAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgIFNob3dcbiAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJwYWdlR2FwXCIgKGNoYW5nZSk9XCJwYWdlTGVuZ3RoQ2hhbmdlKClcIlxuICAgICAgICAgIGlkPVwicGFnZUdhcFwiPlxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHBnIG9mIHBhZ2VzXCIgW3ZhbHVlXT1cInBnXCI+e3twZ319PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICAgIFNob3dpbmcge3tmcm9tfX0te3t0b319IG9mIHt7dG90YWxSZWNvcmRzfX1cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgPHVsIGNsYXNzPVwicGFnZU51bWJlcnNcIiBpZD1cInBhZ2VMaXN0XCI+XG4gICAgICAgICAgPGxpICpuZ0lmPVwic2hvd0xlZnROYXZcIiAoY2xpY2spPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbWRMZWZ0XCI+IHt7bGVmdE5hdlN0cmluZ319IDwvbGk+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBwbiBvZiBwYWdlTnVtXCIgKGNsaWNrKT1cInBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicGFnZUVsZW1lbnRzXCI+e3twbn19PC9saT5cbiAgICAgICAgICA8bGkgKm5nSWY9XCJzaG93UmlnaHROYXZcIiAoY2xpY2spPVwicGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbWRSaWdodFwiPiB7e3JpZ2h0TmF2U3RyaW5nfX0gPC9saT5cbiAgICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9kaXY+YCxcbiAgc3R5bGVzOiBbYC5wYWdlcntmb250OmJvbGQgMTNweCBBcmlhbDtjb2xvcjojMzc3YmJhfS5wYWdlTnVtYmVyc3tsaXN0LXN0eWxlOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZGZkZmRmO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmctbGVmdDowO21hcmdpbjowfS5wYWdlTnVtYmVycyBsaXtmbG9hdDpsZWZ0O3BhZGRpbmc6OHB4IDEwcHg7YmFja2dyb3VuZDojZmZmO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZGZkZmRmO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtjb2xvcjojMzc3YmJhO2N1cnNvcjpwb2ludGVyO21pbi13aWR0aDoxNXB4O3RleHQtYWxpZ246Y2VudGVyfS5wYWdlTnVtYmVycyBsaS5zZWxlY3RlZHtiYWNrZ3JvdW5kOiMzNzdiYmE7Y29sb3I6I2ZmZn0ucGFnZU51bWJlcnMgbGk6Zmlyc3Qtb2YtdHlwZXtib3JkZXItbGVmdDowfS5wYWdlTnVtYmVycyBsaTpob3ZlcntiYWNrZ3JvdW5kOiMzYTQwNDY7Y29sb3I6I2ZmZn1kaXYubGVmdHtwYWRkaW5nOjlweCAwfXNlbGVjdHtjb2xvcjojMzc3YmJhO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6LjllbTtwYWRkaW5nOjJweDtib3JkZXI6MXB4IHNvbGlkICMzNzdiYmF9LmxlZnR7ZmxvYXQ6bGVmdH0ucmlnaHR7ZmxvYXQ6cmlnaHR9LmhpZGRlbntkaXNwbGF5Om5vbmV9YF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhcklvUGFnZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwYWdlR2FwID0gMTA7XG4gIEBJbnB1dCgpXG4gIGlkID0gMTtcbiAgQElucHV0KClcbiAgbm9PZlBhZ2VzID0gMTA7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90b3RhbCA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlID4gMCkge1xuICAgICAgdGhpcy5wYWdlUHJlcGFyYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvdGFsUmVjb3JkcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBwYWdlQ2xpY2s6IEV2ZW50RW1pdHRlcjxvYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8vIHBhZ2UgdmlldyBjb3VudCBzZWxlY3RvcnNcbiAgZnJvbSA9IDE7XG4gIHRvID0gMDtcbiAgcGFnZUxlbmd0aCA9IDIwO1xuICBjdXJyZW50UGFnZSA9IDE7XG4gIHBhZ2VzOiBudW1iZXJbXSA9IFtdO1xuICBwYWdlTnVtOiBudW1iZXJbXSA9IFtdO1xuICBzaG93TGVmdE5hdiA9IGZhbHNlO1xuICBzaG93UmlnaHROYXYgPSBmYWxzZTtcbiAgdG90YWxQYWdlTGVuZ3RoID0gMDtcbiAgbGVmdE5hdlN0cmluZyA9ICc8PCc7XG4gIHJpZ2h0TmF2U3RyaW5nID0gJz4+JztcbiAgbGFzdFBhZ2VNYXggPSAwO1xuICBsYXN0UGFnZU1pbiA9IDA7XG4gIF90b3RhbCA9IDA7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMucGFnZUxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzLnB1c2goaSAqIHRoaXMucGFnZUdhcCk7XG4gICAgfVxuXG4gICAgdGhpcy50byA9IHRoaXMucGFnZXNbMF07XG4gIH1cblxuICBwYWdlUHJlcGFyYXRpb24oKSB7XG4gICAgdGhpcy5yZUNhbGN1bGF0ZVBhZ2VOdW1iZXJzKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRQYWdlKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICByZUNhbGN1bGF0ZVBhZ2VOdW1iZXJzKCkge1xuICAgIGNvbnN0IGRpdmlkZWQgPSAodGhpcy50b3RhbFJlY29yZHMgLyB0aGlzLnBhZ2VHYXApLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCB3aG9sZVBhZ2VMZW4gPSBwYXJzZUludChkaXZpZGVkWzBdLCAxMCk7XG4gICAgbGV0IHBhcnRpYWxQYWdlTGVuID0gMDtcbiAgICBpZiAoZGl2aWRlZC5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIGhhcyBvbmUgbW9yZSBwYWdlIHdpdGggbGltaXRlZCByZWNvcmRzXG4gICAgICBwYXJ0aWFsUGFnZUxlbiA9IDE7XG4gICAgfVxuXG4gICAgdGhpcy50b3RhbFBhZ2VMZW5ndGggPSB3aG9sZVBhZ2VMZW4gKyBwYXJ0aWFsUGFnZUxlbjtcbiAgICB0aGlzLnBhZ2VOdW0ubGVuZ3RoID0gMDtcbiAgICB0aGlzLnBvcHVsYXRlUGFnZXMoMSk7XG4gIH1cblxuICBwb3B1bGF0ZVBhZ2VzKHN0YXJ0OiBudW1iZXIpIHtcbiAgICBsZXQgdW50aWwgPSAxO1xuICAgIHRoaXMucGFnZU51bS5sZW5ndGggPSAwO1xuXG4gICAgZm9yIChcbiAgICAgIGxldCBpID0gc3RhcnQ7XG4gICAgICBpIDw9IHRoaXMudG90YWxQYWdlTGVuZ3RoICYmIHVudGlsIDw9IHRoaXMubm9PZlBhZ2VzO1xuICAgICAgaSsrXG4gICAgKSB7XG4gICAgICB0aGlzLnBhZ2VOdW0ucHVzaChpKTtcbiAgICAgIHVudGlsKys7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMubGFzdFBhZ2VNaW4gPSBNYXRoLm1pbiguLi50aGlzLnBhZ2VOdW0pO1xuICAgIHRoaXMubGFzdFBhZ2VNYXggPSBNYXRoLm1heCguLi50aGlzLnBhZ2VOdW0pO1xuICAgIHRoaXMuc2V0UHJldk5leHROYXYoKTtcbiAgfVxuXG4gIHBhZ2VMZW5ndGhDaGFuZ2UoKSB7XG4gICAgdGhpcy5yZUNhbGN1bGF0ZVBhZ2VOdW1iZXJzKCk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFBhZ2UoKTtcbiAgfVxuXG4gIHBhZ2VDaGFuZ2UoZSkge1xuICAgIGlmIChlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2NtZExlZnQnKSkge1xuICAgICAgdGhpcy5wb3B1bGF0ZVBhZ2VzKHRoaXMubGFzdFBhZ2VNaW4gLSB0aGlzLm5vT2ZQYWdlcyk7XG4gICAgICB0aGlzLnNldFNlbGVjdGVkUGFnZSgpO1xuICAgIH0gZWxzZSBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbWRSaWdodCcpKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlUGFnZXMoKyt0aGlzLmxhc3RQYWdlTWF4KTtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRQYWdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRQYWdlKGUudGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICBzZXRTZWxlY3RlZFBhZ2UoZWw6IEhUTUxFbGVtZW50ID0gbnVsbCkge1xuICAgIGlmIChlbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQoZWwuaW5uZXJUZXh0LCAxMCk7XG4gICAgfVxuICAgIHRoaXMudG8gPSBNYXRoLm1pbih0aGlzLmN1cnJlbnRQYWdlICogdGhpcy5wYWdlR2FwLCB0aGlzLnRvdGFsUmVjb3Jkcyk7XG4gICAgdGhpcy5mcm9tID0gdGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucGFnZUdhcCAtIHRoaXMucGFnZUdhcCArIDE7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVsID0gPEhUTUxFbGVtZW50PihcbiAgICAgICAgKGVsID09IG51bGxcbiAgICAgICAgICA/IGRvY3VtZW50XG4gICAgICAgICAgICAgIC5nZXRFbGVtZW50QnlJZCgncGFnZXInICsgdGhpcy5pZClcbiAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5wYWdlRWxlbWVudHMnKVxuICAgICAgICAgIDogZWwpXG4gICAgICApO1xuXG4gICAgICBsZXQgY2xvc2VQYWdlTnVtID0gZWw7XG4gICAgICB3aGlsZSAoXG4gICAgICAgIChjbG9zZVBhZ2VOdW0gPSBjbG9zZVBhZ2VOdW0ucGFyZW50RWxlbWVudCkgJiZcbiAgICAgICAgIWNsb3NlUGFnZU51bS5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2VOdW1iZXJzJylcbiAgICAgICkge31cblxuICAgICAgQXJyYXkuZnJvbShjbG9zZVBhZ2VOdW0uY2hpbGRyZW4pLmZvckVhY2goeCA9PlxuICAgICAgICB4LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJylcbiAgICAgICk7XG5cbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgfSwgMCk7XG5cbiAgICB0aGlzLmVtaXRQYWdlQ2xpY2soKTtcbiAgfVxuXG4gIHNldFByZXZOZXh0TmF2KCkge1xuICAgIHRoaXMuc2hvd0xlZnROYXYgPSB0aGlzLnNob3dSaWdodE5hdiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdGhpcy5ub09mUGFnZXMpIHtcbiAgICAgIC8vIGN1cnJlbnQgcGFnZSBpcyBvdXQgb2YgbWF4aW11bSBwYWdlcyBjYW4gYmUgc2hvd24sIGl0IG1lYW5zIGl0IGlzIG5vdCB0aGUgZmlyc3Qgc2V0IG9mIHBhZ2UgbnVtYmVycy4gc2hvdyBsZWZ0XG4gICAgICB0aGlzLnNob3dMZWZ0TmF2ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBnZXQgd2hldGhlciBwYWdlIGlzIG5vdCBhIG11bHRpcGxlIG9mIFBhZ2VzVG9TaG93XG4gICAgY29uc3QgY3VycmVudFBhZ2VJc0luQmV0d2VlbiA9XG4gICAgICAodGhpcy5jdXJyZW50UGFnZSAvIHRoaXMubm9PZlBhZ2VzKS50b1N0cmluZygpLnNwbGl0KCcuJylcbiAgICAgICAgLmxlbmd0aCA9PT0gMjtcblxuICAgIC8vIGdldCBoaWdoZXN0IHBhZ2UgbnVtYmVyIGluIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAvLyBmb3JtdWxhIHVzZWQgPSBjdXJyZW50IHBhZ2UgZGl2aWRlZCB3aXRoIG1heFBhZ2V0b1Nob3csIGlmIGZvdW5kIHJlbWFpbmRlcixcbiAgICAvLyBwYWdlIG1pZ2h0IGhhdmUgdXBjb21pbmcgcGFnZSBsaW5rcywgc28gZmluZGluZyBsYXJnZXN0IHBhZ2UgbnVtYmVyIGluIHRoYXQgcGFnZS5cbiAgICAvLyBleC4gaWYgdGhlIGJhc2Ugc2hvd2luZyBpcyA0MCBpbiB0aGUgY2FzZSBvZiAxMCBhcyB0aGUgcGFnZSBsZW5ndGguXG4gICAgLy8gbm93IDQwIGlzIHRoZSBoaWdoZXN0IHBhZ2Ugc2hvd2luZywgaWYgNDIgdGhlbiA1MCBpcyB0aGUgaGlnaGVzdCBwYWdlIHNob3dpbmcuXG5cbiAgICBjb25zdCBjdXJySGlnaGVzdFBhZ2VTaG93aW5nID1cbiAgICAgIHBhcnNlSW50KCh0aGlzLmN1cnJlbnRQYWdlIC8gdGhpcy5ub09mUGFnZXMpLnRvU3RyaW5nKCksIDEwKSAqXG4gICAgICAgIHRoaXMubm9PZlBhZ2VzICtcbiAgICAgIChjdXJyZW50UGFnZUlzSW5CZXR3ZWVuID8gdGhpcy5ub09mUGFnZXMgOiAwKTtcblxuICAgIGlmIChjdXJySGlnaGVzdFBhZ2VTaG93aW5nIDwgdGhpcy50b3RhbFBhZ2VMZW5ndGgpIHtcbiAgICAgIHRoaXMuc2hvd1JpZ2h0TmF2ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBlbWl0UGFnZUNsaWNrKCkge1xuICAgIHRoaXMucGFnZUNsaWNrLmVtaXQoeyBmcm9tOiB0aGlzLmZyb20sIHRvOiB0aGlzLnRvIH0pO1xuICB9XG59XG4iXX0=