@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
296 lines • 28.4 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Component, Input, Output, NgModule, Optional, Inject, EventEmitter, HostBinding } from '@angular/core';
import { CurrentResourceStrings } from '../core/i18n/resources';
import { DisplayDensityToken, DisplayDensityBase, DisplayDensity } from '../core/displayDensity';
import { IgxSelectModule } from '../select/index';
import { IgxIconModule } from '../icon/index';
import { IgxButtonModule } from '../directives/button/button.directive';
import { IgxRippleModule } from '../directives/ripple/ripple.directive';
let IgxPaginatorComponent = class IgxPaginatorComponent extends DisplayDensityBase {
constructor(_displayDensityOptions) {
super(_displayDensityOptions);
this._displayDensityOptions = _displayDensityOptions;
this._page = 0;
this.defaultSelectValues = [5, 10, 15, 25, 50, 100, 500];
this._perPage = 15;
/**
* An @Input property that sets if the pager in the paginator should be enabled.
* ```html
* <igx-paginator [pagerEnabled]="true"></igx-paginator>
* ```
* @memberof IgxPaginatorComponent
*/
this.pagerEnabled = true;
/**
* An @Input property that sets if the pager in the paginator should be hidden.
* ```html
* <igx-paginator [pagerHidden]="true"></igx-paginator>
* ```
* @memberof IgxPaginatorComponent
*/
this.pagerHidden = false;
/**
* An @Input property that sets if the dropdown in the paginator should be enabled.
* ```html
* <igx-paginator [dropdownEnabled]="true"></igx-paginator>
* ```
* @memberof IgxPaginatorComponent
*/
this.dropdownEnabled = true;
/**
* An @Input property that sets if the dropdown in the paginator should be hidden.
* ```html
* <igx-paginator [dropdownHidden]="true"></igx-paginator>
* ```
* @memberof IgxPaginatorComponent
*/
this.dropdownHidden = false;
/**
* An @Input property, sets number of label of the select.
* The default is 'Items per page' localized string.
* ```html
* <igx-paginator label="My custom label"></igx-paginator>
* ```
* @memberof IgxPaginatorComponent
*/
this.selectLabel = CurrentResourceStrings.PaginatorResStrings.igx_paginator_label;
/**
*An event that is emitted when the select in the `IgxPaginatorComponent` changes its value.
*/
this.perPageChange = new EventEmitter();
/**
*An event that is emitted when the paginating is used.
*/
this.pageChange = new EventEmitter();
}
/**
* Sets the class of the IgxPaginatorComponent based
* on the provided displayDensity.
*/
get classCosy() {
return this.displayDensity === DisplayDensity.cosy;
}
get classCompact() {
return this.displayDensity === DisplayDensity.compact;
}
get classComfortable() {
return this.displayDensity === DisplayDensity.comfortable;
}
/**
* An @Input property, sets current page of the `IgxPaginatorComponent`.
* The default is 0.
* ```typescript
* let page = this.paginator.page;
* ```
* @memberof IgxPaginatorComponent
*/
get page() {
return this._page;
}
set page(value) {
this._page = value;
this.pageChange.emit(this._page);
}
/**
* An @Input property, sets number of visible items per page in the `IgxPaginatorComponent`.
* The default is 15.
* ```typescript
* let itemsPerPage = this.paginator.perPage;
* ```
* @memberof IgxPaginatorComponent
*/
get perPage() {
return this._perPage;
}
set perPage(value) {
this._perPage = Number(value);
this.perPageChange.emit(this._perPage);
this._selectOptions = this.sortUniqueOptions(this.defaultSelectValues, this._perPage);
this.totalPages = Math.ceil(this.totalRecords / this._perPage);
}
/**
* An @Input property that sets the total records.
* ```typescript
* let totalRecords = this.paginator.totalRecords;
* ```
* @memberof IgxPaginatorComponent
*/
get totalRecords() {
return this._totalRecords;
}
set totalRecords(value) {
this._totalRecords = value;
this.totalPages = Math.ceil(this.totalRecords / this.perPage);
}
/**
* An @Input property that sets custom options in the select of the paginator
* ```typescript
* let options = this.paginator.selectOptions;
* ```
* @memberof IgxPaginatorComponent
*/
get selectOptions() {
return this._selectOptions;
}
set selectOptions(value) {
this._selectOptions = this.sortUniqueOptions(value, this._perPage);
this.defaultSelectValues = [...this._selectOptions];
}
/**
* Returns if the current page is the last page.
* ```typescript
* const lastPage = this.paginator.isLastPage;
* ```
*/
get isLastPage() {
return this.page + 1 >= this.totalPages;
}
/**
* Returns if the current page is the first page.
* ```typescript
* const lastPage = this.paginator.isFirstPage;
* ```
*/
get isFirstPage() {
return this.page === 0;
}
sortUniqueOptions(values, newOption) {
return Array.from(new Set([...values, newOption])).sort((a, b) => a - b);
}
/**
* Sets DisplayDensity for the <select> inside the paginator
* @hidden
*/
paginatorSelectDisplayDensity() {
if (this.displayDensity === DisplayDensity.comfortable) {
return DisplayDensity.cosy;
}
return DisplayDensity.compact;
}
/**
* Goes to the next page of the `IgxPaginatorComponent`, if the paginator is not already at the last page.
* ```typescript
* this.paginator.nextPage();
* ```
* @memberof IgxPaginatorComponent
*/
nextPage() {
if (!this.isLastPage) {
this.page += 1;
}
}
/**
* Goes to the previous page of the `IgxPaginatorComponent`, if the paginator is not already at the first page.
* ```typescript
* this.paginator.previousPage();
* ```
* @memberof IgxPaginatorComponent
*/
previousPage() {
if (!this.isFirstPage) {
this.page -= 1;
}
}
/**
* Goes to the desired page index.
* ```typescript
* this.pagiantor.paginate(1);
* ```
* @param val
* @memberof IgxPaginatorComponent
*/
paginate(val) {
if (val < 0 || val > this.totalPages - 1) {
return;
}
this.page = val;
}
};
IgxPaginatorComponent.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
];
__decorate([
HostBinding('class.igx-paginator--cosy'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxPaginatorComponent.prototype, "classCosy", null);
__decorate([
HostBinding('class.igx-paginator--compact'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxPaginatorComponent.prototype, "classCompact", null);
__decorate([
HostBinding('class.igx-paginator'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxPaginatorComponent.prototype, "classComfortable", null);
__decorate([
Input(),
__metadata("design:type", Number),
__metadata("design:paramtypes", [Number])
], IgxPaginatorComponent.prototype, "page", null);
__decorate([
Input(),
__metadata("design:type", Number),
__metadata("design:paramtypes", [Number])
], IgxPaginatorComponent.prototype, "perPage", null);
__decorate([
Input(),
__metadata("design:type", Number),
__metadata("design:paramtypes", [Number])
], IgxPaginatorComponent.prototype, "totalRecords", null);
__decorate([
Input(),
__metadata("design:type", Array),
__metadata("design:paramtypes", [Array])
], IgxPaginatorComponent.prototype, "selectOptions", null);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxPaginatorComponent.prototype, "pagerEnabled", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxPaginatorComponent.prototype, "pagerHidden", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxPaginatorComponent.prototype, "dropdownEnabled", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxPaginatorComponent.prototype, "dropdownHidden", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxPaginatorComponent.prototype, "selectLabel", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxPaginatorComponent.prototype, "perPageChange", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxPaginatorComponent.prototype, "pageChange", void 0);
IgxPaginatorComponent = __decorate([
Component({
selector: 'igx-paginator',
template: "<div class=\"igx-paginator__select\" [hidden]=\"dropdownHidden\">\n <label class=\"igx-paginator__label\">{{ selectLabel }}</label>\n <div class=\"igx-paginator__select-input\">\n <igx-select [(ngModel)]=\"perPage\" [displayDensity]=\"paginatorSelectDisplayDensity()\" type=\"border\"\n [disabled]=\"!dropdownEnabled\">\n <igx-select-item [value]=\"val\" *ngFor=\"let val of selectOptions\">\n {{val}}\n </igx-select-item>\n </igx-select>\n </div>\n</div>\n<div class=\"igx-paginator__pager\" [hidden]=\"pagerHidden\">\n <button [disabled]=\"isFirstPage || !pagerEnabled ? true: false\" (click)=\"paginate(0)\" igxButton=\"icon\" igxRipple igxRippleCentered=\"true\">\n <igx-icon fontSet=\"material\">first_page</igx-icon>\n </button>\n <button [disabled]=\"isFirstPage || !pagerEnabled ? true: false\" (click)=\"previousPage()\" igxButton=\"icon\" igxRipple igxRippleCentered=\"true\">\n <igx-icon fontSet=\"material\">chevron_left</igx-icon>\n </button>\n <div class='igx-paginator__pager-text'>\n <span>{{ page + 1 }}</span>\n <span> of </span>\n <span>{{ totalPages }}</span>\n </div>\n <button [disabled]=\"isLastPage || !pagerEnabled ? true: false\" (click)=\"nextPage()\" igxRipple igxRippleCentered=\"true\" igxButton=\"icon\">\n <igx-icon fontSet=\"material\">chevron_right</igx-icon>\n </button>\n <button [disabled]=\"isLastPage || !pagerEnabled ? true: false\" (click)=\"paginate(totalPages - 1)\" igxButton=\"icon\" igxRipple\n igxRippleCentered=\"true\">\n <igx-icon fontSet=\"material\">last_page</igx-icon>\n </button>\n</div>\n"
}),
__param(0, Optional()), __param(0, Inject(DisplayDensityToken)),
__metadata("design:paramtypes", [Object])
], IgxPaginatorComponent);
export { IgxPaginatorComponent };
let IgxPaginatorModule = class IgxPaginatorModule {
};
IgxPaginatorModule = __decorate([
NgModule({
declarations: [IgxPaginatorComponent],
exports: [IgxPaginatorComponent],
imports: [CommonModule, IgxSelectModule, FormsModule, IgxIconModule, IgxButtonModule, IgxRippleModule]
})
], IgxPaginatorModule);
export { IgxPaginatorModule };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvcGFnaW5hdG9yL3BhZ2luYXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6SCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBTXhFLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXNCLFNBQVEsa0JBQWtCO0lBb0t6RCxZQUErRCxzQkFBOEM7UUFFekcsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFGNkIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQTlKbkcsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUdaLHdCQUFtQixHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQs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b250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgTmdNb2R1bGUsIE9wdGlvbmFsLCBJbmplY3QsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcbmltcG9ydCB7IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsIERpc3BsYXlEZW5zaXR5VG9rZW4sIERpc3BsYXlEZW5zaXR5QmFzZSwgRGlzcGxheURlbnNpdHkgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneFNlbGVjdE1vZHVsZSB9IGZyb20gJy4uL3NlbGVjdC9pbmRleCc7XG5pbXBvcnQgeyBJZ3hJY29uTW9kdWxlIH0gZnJvbSAnLi4vaWNvbi9pbmRleCc7XG5pbXBvcnQgeyBJZ3hCdXR0b25Nb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2J1dHRvbi9idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFJpcHBsZU1vZHVsZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvcmlwcGxlL3JpcHBsZS5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1wYWdpbmF0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAncGFnaW5hdG9yLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgSWd4UGFnaW5hdG9yQ29tcG9uZW50IGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIHtcblxuICAgIC8qKlxuICAgICAqIFRvdGFsIHBhZ2VzIGNhbGN1bGF0ZWQgZnJvbSB0b3RhbFJlY29yZHMgYW5kIHBlclBhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgdG90YWxQYWdlczogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfcGFnZSA9IDA7XG4gICAgcHJvdGVjdGVkIF90b3RhbFJlY29yZHM6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3NlbGVjdE9wdGlvbnM7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U2VsZWN0VmFsdWVzID0gWzUsIDEwLCAxNSwgMjUsIDUwLCAxMDAsIDUwMF07XG4gICAgcHJvdGVjdGVkIF9wZXJQYWdlID0gMTU7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjbGFzcyBvZiB0aGUgSWd4UGFnaW5hdG9yQ29tcG9uZW50IGJhc2VkXG4gICAgICogb24gdGhlIHByb3ZpZGVkIGRpc3BsYXlEZW5zaXR5LlxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXBhZ2luYXRvci0tY29zeScpXG4gICAgcHVibGljIGdldCBjbGFzc0Nvc3koKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb3N5O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXBhZ2luYXRvci0tY29tcGFjdCcpXG4gICAgcHVibGljIGdldCBjbGFzc0NvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21wYWN0O1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LXBhZ2luYXRvcicpXG4gICAgcHVibGljIGdldCBjbGFzc0NvbWZvcnRhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tZm9ydGFibGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSwgc2V0cyBjdXJyZW50IHBhZ2Ugb2YgdGhlIGBJZ3hQYWdpbmF0b3JDb21wb25lbnRgLlxuICAgKiBUaGUgZGVmYXVsdCBpcyAwLlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGxldCBwYWdlID0gdGhpcy5wYWdpbmF0b3IucGFnZTtcbiAgICogYGBgXG4gICAqIEBtZW1iZXJvZiBJZ3hQYWdpbmF0b3JDb21wb25lbnRcbiAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3BhZ2UgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5fcGFnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSwgc2V0cyBudW1iZXIgb2YgdmlzaWJsZSBpdGVtcyBwZXIgcGFnZSBpbiB0aGUgYElneFBhZ2luYXRvckNvbXBvbmVudGAuXG4gICAqIFRoZSBkZWZhdWx0IGlzIDE1LlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGxldCBpdGVtc1BlclBhZ2UgPSB0aGlzLnBhZ2luYXRvci5wZXJQYWdlO1xuICAgKiBgYGBcbiAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGVyUGFnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BlclBhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwZXJQYWdlKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fcGVyUGFnZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIHRoaXMucGVyUGFnZUNoYW5nZS5lbWl0KHRoaXMuX3BlclBhZ2UpO1xuICAgICAgICB0aGlzLl9zZWxlY3RPcHRpb25zID0gdGhpcy5zb3J0VW5pcXVlT3B0aW9ucyh0aGlzLmRlZmF1bHRTZWxlY3RWYWx1ZXMsIHRoaXMuX3BlclBhZ2UpO1xuICAgICAgICB0aGlzLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy50b3RhbFJlY29yZHMgLyB0aGlzLl9wZXJQYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgdGhlIHRvdGFsIHJlY29yZHMuXG4gICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgKiBsZXQgdG90YWxSZWNvcmRzID0gdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzO1xuICAgICogYGBgXG4gICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdG90YWxSZWNvcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxSZWNvcmRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fdG90YWxSZWNvcmRzID0gdmFsdWU7XG4gICAgICAgIHRoaXMudG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLnRvdGFsUmVjb3JkcyAvIHRoaXMucGVyUGFnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGN1c3RvbSBvcHRpb25zIGluIHRoZSBzZWxlY3Qgb2YgdGhlIHBhZ2luYXRvclxuICAgICogYGBgdHlwZXNjcmlwdFxuICAgICogbGV0IG9wdGlvbnMgPSB0aGlzLnBhZ2luYXRvci5zZWxlY3RPcHRpb25zO1xuICAgICogYGBgXG4gICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc2VsZWN0T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWxlY3RPcHRpb25zKHZhbHVlOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdE9wdGlvbnMgPSB0aGlzLnNvcnRVbmlxdWVPcHRpb25zKHZhbHVlLCB0aGlzLl9wZXJQYWdlKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2VsZWN0VmFsdWVzID0gWy4uLnRoaXMuX3NlbGVjdE9wdGlvbnNdO1xuICAgIH1cbiAgICAvKipcbiAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgaWYgdGhlIHBhZ2VyIGluIHRoZSBwYWdpbmF0b3Igc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgKiBgYGBodG1sXG4gICAgKiA8aWd4LXBhZ2luYXRvciBbcGFnZXJFbmFibGVkXT1cInRydWVcIj48L2lneC1wYWdpbmF0b3I+XG4gICAgKiBgYGBcbiAgICAqIEBtZW1iZXJvZiBJZ3hQYWdpbmF0b3JDb21wb25lbnRcbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHBhZ2VyRW5hYmxlZCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgaWYgdGhlIHBhZ2VyIGluIHRoZSBwYWdpbmF0b3Igc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAqIGBgYGh0bWxcbiAgICAqIDxpZ3gtcGFnaW5hdG9yIFtwYWdlckhpZGRlbl09XCJ0cnVlXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICogYGBgXG4gICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYWdlckhpZGRlbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGlmIHRoZSBkcm9wZG93biBpbiB0aGUgcGFnaW5hdG9yIHNob3VsZCBiZSBlbmFibGVkLlxuICAgICogYGBgaHRtbFxuICAgICogPGlneC1wYWdpbmF0b3IgW2Ryb3Bkb3duRW5hYmxlZF09XCJ0cnVlXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICogYGBgXG4gICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkcm9wZG93bkVuYWJsZWQgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGlmIHRoZSBkcm9wZG93biBpbiB0aGUgcGFnaW5hdG9yIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgKiBgYGBodG1sXG4gICAgKiA8aWd4LXBhZ2luYXRvciBbZHJvcGRvd25IaWRkZW5dPVwidHJ1ZVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAqIGBgYFxuICAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZHJvcGRvd25IaWRkZW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5LCBzZXRzIG51bWJlciBvZiBsYWJlbCBvZiB0aGUgc2VsZWN0LlxuICAgICogVGhlIGRlZmF1bHQgaXMgJ0l0ZW1zIHBlciBwYWdlJyBsb2NhbGl6ZWQgc3RyaW5nLlxuICAgICogYGBgaHRtbFxuICAgICogPGlneC1wYWdpbmF0b3IgbGFiZWw9XCJNeSBjdXN0b20gbGFiZWxcIj48L2lneC1wYWdpbmF0b3I+XG4gICAgKiBgYGBcbiAgICAqIEBtZW1iZXJvZiBJZ3hQYWdpbmF0b3JDb21wb25lbnRcbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlbGVjdExhYmVsID0gQ3VycmVudFJlc291cmNlU3RyaW5ncy5QYWdpbmF0b3JSZXNTdHJpbmdzLmlneF9wYWdpbmF0b3JfbGFiZWw7XG5cbiAgICAvKipcbiAgICAgKkFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgaW4gdGhlIGBJZ3hQYWdpbmF0b3JDb21wb25lbnRgIGNoYW5nZXMgaXRzIHZhbHVlLlxuICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBlclBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgICAvKipcbiAgICAgKkFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHRoZSBwYWdpbmF0aW5nIGlzIHVzZWQuXG4gICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcm90ZWN0ZWQgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9uc1xuICAgICkge1xuICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3QgcGFnZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbGFzdFBhZ2UgPSB0aGlzLnBhZ2luYXRvci5pc0xhc3RQYWdlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc0xhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdlICsgMSA+PSB0aGlzLnRvdGFsUGFnZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBwYWdlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBsYXN0UGFnZSA9IHRoaXMucGFnaW5hdG9yLmlzRmlyc3RQYWdlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZSA9PT0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNvcnRVbmlxdWVPcHRpb25zKHZhbHVlczogQXJyYXk8bnVtYmVyPiwgbmV3T3B0aW9uOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLnZhbHVlcywgbmV3T3B0aW9uXSkpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIERpc3BsYXlEZW5zaXR5IGZvciB0aGUgPHNlbGVjdD4gaW5zaWRlIHRoZSBwYWdpbmF0b3JcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHBhZ2luYXRvclNlbGVjdERpc3BsYXlEZW5zaXR5KCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXlEZW5zaXR5ID09PSBEaXNwbGF5RGVuc2l0eS5jb21mb3J0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIERpc3BsYXlEZW5zaXR5LmNvc3k7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERpc3BsYXlEZW5zaXR5LmNvbXBhY3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdvZXMgdG8gdGhlIG5leHQgcGFnZSBvZiB0aGUgYElneFBhZ2luYXRvckNvbXBvbmVudGAsIGlmIHRoZSBwYWdpbmF0b3IgaXMgbm90IGFscmVhZHkgYXQgdGhlIGxhc3QgcGFnZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5wYWdpbmF0b3IubmV4dFBhZ2UoKTtcbiAgICAgKiBgYGBcblx0ICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0UGFnZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZSArPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdvZXMgdG8gdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGBJZ3hQYWdpbmF0b3JDb21wb25lbnRgLCBpZiB0aGUgcGFnaW5hdG9yIGlzIG5vdCBhbHJlYWR5IGF0IHRoZSBmaXJzdCBwYWdlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLnBhZ2luYXRvci5wcmV2aW91c1BhZ2UoKTtcbiAgICAgKiBgYGBcblx0ICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0UGFnZSkge1xuICAgICAgICAgICAgdGhpcy5wYWdlIC09IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR29lcyB0byB0aGUgZGVzaXJlZCBwYWdlIGluZGV4LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLnBhZ2lhbnRvci5wYWdpbmF0ZSgxKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdmFsXG4gICAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBwYWdpbmF0ZSh2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiB0aGlzLnRvdGFsUGFnZXMgLSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYWdlID0gdmFsO1xuICAgIH1cbn1cblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtJZ3hQYWdpbmF0b3JDb21wb25lbnRdLFxuICAgIGV4cG9ydHM6IFtJZ3hQYWdpbmF0b3JDb21wb25lbnRdLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElneFNlbGVjdE1vZHVsZSwgRm9ybXNNb2R1bGUsIElneEljb25Nb2R1bGUsIElneEJ1dHRvbk1vZHVsZSwgSWd4UmlwcGxlTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hQYWdpbmF0b3JNb2R1bGUgeyB9XG4iXX0=