@junte/ui
Version:
Quality Angular UI components kit
146 lines • 16.2 kB
JavaScript
var PagerComponent_1;
import { __decorate, __metadata } from "tslib";
import { Component, forwardRef, HostBinding, HostListener, Input } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { NGXLogger } from 'ngx-logger';
import { PropertyApi } from '../../core/decorators/api';
import { UI } from '../../core/enums/ui';
import { PagerMode } from './enums';
export const DEFAULT_PAGE_SIZE = 10;
export const DEFAULT_PAGE = 1;
let PagerComponent = PagerComponent_1 = class PagerComponent {
constructor(logger) {
this.logger = logger;
this.ui = UI;
this._pageSize = DEFAULT_PAGE_SIZE;
this._selectedPage = DEFAULT_PAGE;
this.size = 3;
this.host = 'jnt-pager-host';
this.mode = PagerMode.offset;
this.onChange = () => this.logger.error('value accessor is not registered');
this.onTouched = () => this.logger.error('value accessor is not registered');
this.registerOnChange = fn => this.onChange = fn;
this.registerOnTouched = fn => this.onTouched = fn;
this.onBlur = () => this.onTouched();
}
get visible() {
return this.pagesCount > 1 ? 'visible' : 'collapse';
}
set count(count) {
this._count = count;
this.render();
}
get pagesCount() {
return Math.ceil(this._count / this.pageSize);
}
set pageSize(pageSize) {
this._pageSize = pageSize;
this.render();
}
get pageSize() {
return this._pageSize;
}
set selectedPage(page) {
this._selectedPage = page;
this.render();
}
get selectedPage() {
return this._selectedPage;
}
writeValue(value) {
switch (this.mode) {
case PagerMode.page:
this.logger.debug('set page ', value);
this.selectedPage = value;
break;
case PagerMode.offset:
const page = Math.ceil(value / this.pageSize) + 1;
this.logger.debug('set page ', page);
this.selectedPage = page;
break;
}
}
setPage(page) {
if (page >= DEFAULT_PAGE && page <= this.pagesCount) {
switch (this.mode) {
case PagerMode.page:
this.onChange(page);
break;
case PagerMode.offset:
this.onChange((page - 1) * this.pageSize);
break;
}
this.selectedPage = page;
}
}
render() {
const pages = [];
let shift = Math.max(this.size - this.selectedPage + 1, 0);
const end = Math.min(this.selectedPage + this.size + shift, this.pagesCount);
shift = Math.max(this.selectedPage + this.size - this.pagesCount, 0);
const start = Math.max(this.selectedPage - this.size - shift, 1);
for (let i = start; i <= end; i++) {
pages.push(i);
}
this.pages = pages;
}
};
PagerComponent.ctorParameters = () => [
{ type: NGXLogger }
];
__decorate([
HostBinding('attr.host'),
__metadata("design:type", Object)
], PagerComponent.prototype, "host", void 0);
__decorate([
HostBinding('style.visibility'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], PagerComponent.prototype, "visible", null);
__decorate([
PropertyApi({
description: 'Items count for pager',
type: 'number',
}),
Input(),
__metadata("design:type", Number),
__metadata("design:paramtypes", [Number])
], PagerComponent.prototype, "count", null);
__decorate([
PropertyApi({
description: 'Page size for pager',
type: 'number',
default: '10'
}),
Input(),
__metadata("design:type", Number),
__metadata("design:paramtypes", [Number])
], PagerComponent.prototype, "pageSize", null);
__decorate([
PropertyApi({
description: 'Mode for pager',
path: 'ui.pager.mode',
options: [PagerMode.offset, PagerMode.page],
default: PagerMode.offset
}),
Input(),
__metadata("design:type", String)
], PagerComponent.prototype, "mode", void 0);
__decorate([
HostListener('blur'),
__metadata("design:type", Object)
], PagerComponent.prototype, "onBlur", void 0);
PagerComponent = PagerComponent_1 = __decorate([
Component({
selector: 'jnt-pager',
template: "<jnt-stack child-of=\"jnt-pager-host\" [orientation]=\"ui.orientation.horizontal\"\n [gutter]=\"ui.gutter.small\"\n [justify]=\"ui.justify.center\">\n <a child-of=\"jnt-pager-host\" [attr.data-href]=\"'?page=' + 1\"\n [attr.disabled]=\"selectedPage === 1\"\n (click)=\"setPage(1)\"\n title=\"First\">\n <jnt-icon child-of=\"jnt-pager-host\" [icon]=\"ui.icons.first\"></jnt-icon>\n </a>\n <a child-of=\"jnt-pager-host\" title=\"Previous\"\n [attr.disabled]=\"selectedPage === 1\"\n (click)=\"setPage(selectedPage - 1)\"\n data-page=\"1\">\n <jnt-icon child-of=\"jnt-pager-host\" [icon]=\"ui.icons.chevronLeft\"></jnt-icon>\n </a>\n <a child-of=\"jnt-pager-host\" *ngFor=\"let page of pages\"\n (click)=\"setPage(page)\"\n [attr.active]=\"page === selectedPage\"\n tabindex=\"0\">{{page}}</a>\n <a child-of=\"jnt-pager-host\" title=\"Next\"\n [attr.disabled]=\"selectedPage >= pagesCount\"\n (click)=\"setPage(selectedPage + 1)\">\n <jnt-icon child-of=\"jnt-pager-host\" [icon]=\"ui.icons.chevronRight\"></jnt-icon>\n </a>\n <a child-of=\"jnt-pager-host\" title=\"Last\"\n (click)=\"setPage(pagesCount)\"\n [attr.disabled]=\"selectedPage >= pagesCount\">\n <jnt-icon child-of=\"jnt-pager-host\" [icon]=\"ui.icons.last\"></jnt-icon>\n </a>\n</jnt-stack>",
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => PagerComponent_1),
multi: true
}]
}),
__metadata("design:paramtypes", [NGXLogger])
], PagerComponent);
export { PagerComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL25hdmlnYXRpb24vcGFnZXIvcGFnZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBVzlCLElBQWEsY0FBYyxzQkFBM0IsTUFBYSxjQUFjO0lBd0V6QixZQUFvQixNQUFpQjtRQUFqQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBdEVyQyxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBR0EsY0FBUyxHQUFHLGlCQUFpQixDQUFDO1FBQzlCLGtCQUFhLEdBQUcsWUFBWSxDQUFDO1FBQzdCLFNBQUksR0FBRyxDQUFDLENBQUM7UUFLUixTQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUEyQ2pDLFNBQUksR0FBYyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRW5DLGFBQVEsR0FBeUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUM3RixjQUFTLEdBQWUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNwRixxQkFBZ0IsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQzVDLHNCQUFpQixHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDeEIsV0FBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQVl0RCxDQUFDO0lBMURELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ3RELENBQUM7SUFPRCxJQUFJLEtBQUssQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFRRCxJQUFJLFFBQVEsQ0FBQyxRQUFnQjtRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBaUJELElBQUksWUFBWSxDQUFDLElBQVk7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUtELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNqQixLQUFLLFNBQVMsQ0FBQyxJQUFJO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixNQUFNO1lBQ1IsS0FBSyxTQUFTLENBQUMsTUFBTTtnQkFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZO1FBQ2xCLElBQUksSUFBSSxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuRCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssU0FBUyxDQUFDLElBQUk7b0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3BCLE1BQU07Z0JBQ1IsS0FBSyxTQUFTLENBQUMsTUFBTTtvQkFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzFDLE1BQU07YUFDVDtZQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFFM0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0UsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWpFLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNmO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztDQUNGLENBQUE7O1lBN0M2QixTQUFTOztBQTVEckM7SUFEQyxXQUFXLENBQUMsV0FBVyxDQUFDOzs0Q0FDUTtBQUdqQztJQURDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQzs7OzZDQUcvQjtBQU9EO0lBTEMsV0FBVyxDQUFDO1FBQ1gsV0FBVyxFQUFFLHVCQUF1QjtRQUNwQyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUM7SUFDRCxLQUFLLEVBQUU7OzsyQ0FJUDtBQVlEO0lBTkMsV0FBVyxDQUFDO1FBQ1gsV0FBVyxFQUFFLHFCQUFxQjtRQUNsQyxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQztJQUNELEtBQUssRUFBRTs7OzhDQUlQO0FBYUQ7SUFQQyxXQUFXLENBQUM7UUFDWCxXQUFXLEVBQUUsZ0JBQWdCO1FBQzdCLElBQUksRUFBRSxlQUFlO1FBQ3JCLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQztRQUMzQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE1BQU07S0FDMUIsQ0FBQztJQUNELEtBQUssRUFBRTs7NENBQzJCO0FBTWI7SUFBckIsWUFBWSxDQUFDLE1BQU0sQ0FBQzs7OENBQWlDO0FBN0QzQyxjQUFjO0lBVDFCLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxXQUFXO1FBQ3JCLDIwQ0FBd0M7UUFDeEMsU0FBUyxFQUFFLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBYyxDQUFDO2dCQUM3QyxLQUFLLEVBQUUsSUFBSTthQUNaLENBQUM7S0FDSCxDQUFDO3FDQXlFNEIsU0FBUztHQXhFMUIsY0FBYyxDQXFIMUI7U0FySFksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5HWExvZ2dlciB9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHsgUHJvcGVydHlBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2RlY29yYXRvcnMvYXBpJztcbmltcG9ydCB7IFVJIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy91aSc7XG5pbXBvcnQgeyBQYWdlck1vZGUgfSBmcm9tICcuL2VudW1zJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTA7XG5leHBvcnQgY29uc3QgREVGQVVMVF9QQUdFID0gMTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LXBhZ2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2VyLmVuY2Fwc3VsYXRlZC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBhZ2VyQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBQYWdlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICB1aSA9IFVJO1xuXG4gIHByaXZhdGUgX2NvdW50OiBudW1iZXI7XG4gIHByaXZhdGUgX3BhZ2VTaXplID0gREVGQVVMVF9QQUdFX1NJWkU7XG4gIHByaXZhdGUgX3NlbGVjdGVkUGFnZSA9IERFRkFVTFRfUEFHRTtcbiAgcHJpdmF0ZSBzaXplID0gMztcblxuICBwYWdlczogbnVtYmVyW107XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKVxuICByZWFkb25seSBob3N0ID0gJ2pudC1wYWdlci1ob3N0JztcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnZpc2liaWxpdHknKVxuICBnZXQgdmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlc0NvdW50ID4gMSA/ICd2aXNpYmxlJyA6ICdjb2xsYXBzZSc7XG4gIH1cblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnSXRlbXMgY291bnQgZm9yIHBhZ2VyJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSlcbiAgQElucHV0KClcbiAgc2V0IGNvdW50KGNvdW50OiBudW1iZXIpIHtcbiAgICB0aGlzLl9jb3VudCA9IGNvdW50O1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBnZXQgcGFnZXNDb3VudCgpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuX2NvdW50IC8gdGhpcy5wYWdlU2l6ZSk7XG4gIH1cblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnUGFnZSBzaXplIGZvciBwYWdlcicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgZGVmYXVsdDogJzEwJ1xuICB9KVxuICBASW5wdXQoKVxuICBzZXQgcGFnZVNpemUocGFnZVNpemU6IG51bWJlcikge1xuICAgIHRoaXMuX3BhZ2VTaXplID0gcGFnZVNpemU7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldCBwYWdlU2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVNpemU7XG4gIH1cblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnTW9kZSBmb3IgcGFnZXInLFxuICAgIHBhdGg6ICd1aS5wYWdlci5tb2RlJyxcbiAgICBvcHRpb25zOiBbUGFnZXJNb2RlLm9mZnNldCwgUGFnZXJNb2RlLnBhZ2VdLFxuICAgIGRlZmF1bHQ6IFBhZ2VyTW9kZS5vZmZzZXRcbiAgfSlcbiAgQElucHV0KClcbiAgbW9kZTogUGFnZXJNb2RlID0gUGFnZXJNb2RlLm9mZnNldDtcblxuICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5lcnJvcigndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gdGhpcy5sb2dnZXIuZXJyb3IoJ3ZhbHVlIGFjY2Vzc29yIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gIHJlZ2lzdGVyT25DaGFuZ2UgPSBmbiA9PiB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIHJlZ2lzdGVyT25Ub3VjaGVkID0gZm4gPT4gdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpIG9uQmx1ciA9ICgpID0+IHRoaXMub25Ub3VjaGVkKCk7XG5cbiAgc2V0IHNlbGVjdGVkUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFBhZ2UgPSBwYWdlO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRQYWdlKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFBhZ2U7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyKSB7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSBQYWdlck1vZGUucGFnZTpcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3NldCBwYWdlICcsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBhZ2UgPSB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFBhZ2VyTW9kZS5vZmZzZXQ6XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmNlaWwodmFsdWUgLyB0aGlzLnBhZ2VTaXplKSArIDE7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdzZXQgcGFnZSAnLCBwYWdlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBhZ2UgPSBwYWdlO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBzZXRQYWdlKHBhZ2U6IG51bWJlcikge1xuICAgIGlmIChwYWdlID49IERFRkFVTFRfUEFHRSAmJiBwYWdlIDw9IHRoaXMucGFnZXNDb3VudCkge1xuICAgICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgICAgY2FzZSBQYWdlck1vZGUucGFnZTpcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHBhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhZ2VyTW9kZS5vZmZzZXQ6XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgocGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkUGFnZSA9IHBhZ2U7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHBhZ2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgbGV0IHNoaWZ0ID0gTWF0aC5tYXgodGhpcy5zaXplIC0gdGhpcy5zZWxlY3RlZFBhZ2UgKyAxLCAwKTtcbiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbih0aGlzLnNlbGVjdGVkUGFnZSArIHRoaXMuc2l6ZSArIHNoaWZ0LCB0aGlzLnBhZ2VzQ291bnQpO1xuXG4gICAgc2hpZnQgPSBNYXRoLm1heCh0aGlzLnNlbGVjdGVkUGFnZSArIHRoaXMuc2l6ZSAtIHRoaXMucGFnZXNDb3VudCwgMCk7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCh0aGlzLnNlbGVjdGVkUGFnZSAtIHRoaXMuc2l6ZSAtIHNoaWZ0LCAxKTtcblxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgcGFnZXMucHVzaChpKTtcbiAgICB9XG4gICAgdGhpcy5wYWdlcyA9IHBhZ2VzO1xuICB9XG59XG4iXX0=