cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
128 lines • 27.9 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../select/select.component";
export class PaginationComponent {
cdr;
data = [];
itemsPerPageOptions = [
{ value: 10, label: '10', selected: true },
{ value: 20, label: '20', selected: false },
{ value: 30, label: '30', selected: false },
];
allPages = 1;
itemsPerPage = 10;
allItems = 0;
pageChange = new EventEmitter();
itemsPerPageChange = new EventEmitter();
default = false;
currentPage = 1;
displayedData = [];
pagesArray = [{ value: 1, label: '1', selected: true }];
constructor(cdr) {
this.cdr = cdr;
}
ngOnInit() {
this.updateAllItems();
this.updatePagination();
this.updateDisplayedData();
}
ngOnChanges(changes) {
if (changes['data'] || changes['allPages'] || changes['itemsPerPage'] || changes['allItems']) {
this.initializeDefaults();
this.updatePagination();
this.updateDisplayedData();
this.cdr.detectChanges();
}
}
prevPage() {
if (this.currentPage > 1) {
this.currentPage--;
this.updatePageSelection();
}
}
nextPage() {
if (this.currentPage < this.allPages) {
this.currentPage++;
this.updatePageSelection();
}
}
goToPage(page) {
if (typeof page === 'number' && page >= 1 && page <= this.allPages) {
this.currentPage = page;
this.pageChange.emit(page);
}
else if (typeof page.detail[0] === 'number') {
this.currentPage = +page.detail[0];
this.pageChange.emit(+page.detail[0]);
}
this.updatePageSelection();
}
updatePageSelection() {
this.pageChange.emit(this.currentPage);
this.pagesArray.forEach(page => {
page.selected = page.value === this.currentPage;
});
this.updateDisplayedData();
}
initializeDefaults() {
if (this.allItems == 0 && this.data) {
this.allItems = this.data.length;
this.default = true;
}
else {
this.default = false;
}
if (this.default) {
this.allPages = Math.ceil(this.allItems / this.itemsPerPage);
}
}
updateAllItems() {
this.allItems = this.allItems !== 0 ? this.allItems : this.data.length;
}
changeItemsPerPage(event) {
this.itemsPerPage = event.detail[0].label;
this.itemsPerPageChange.emit(event.detail[0].value);
this.currentPage = 1;
this.updateDisplayedData();
}
updatePagination() {
this.pagesArray = [];
const total = this.allPages || Math.ceil(this.allItems / this.itemsPerPage);
for (let i = 1; i <= total; i++) {
this.pagesArray.push({ value: i, label: `${i}`, selected: i === this.currentPage });
}
}
updateDisplayedData() {
const startIndex = (this.currentPage - 1) * this.itemsPerPage;
const endIndex = startIndex + this.itemsPerPage;
if (this.default) {
this.displayedData = this.data.slice(startIndex, endIndex);
}
else {
this.displayedData = [...this.data];
}
this.cdr.detectChanges();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaginationComponent, selector: "cfc-pagination", inputs: { data: "data", itemsPerPageOptions: "itemsPerPageOptions", allPages: "allPages", itemsPerPage: "itemsPerPage", allItems: "allItems" }, outputs: { pageChange: "pageChange", itemsPerPageChange: "itemsPerPageChange" }, usesOnChanges: true, ngImport: i0, template: "<span class=\"br-divider sm-block\"></span>\r\n\r\n<nav class=\"br-pagination sm-block\"\r\n aria-label=\"pagina\u00E7\u00E3o\"\r\n [attr.data-total]=\"allItems\"\r\n [attr.data-current]=\"currentPage\"\r\n [attr.data-per-page]=\"itemsPerPage\">\r\n\r\n <div class=\"pagination-per-page\">\r\n <p\r\n class=\"mx-3 mb-0 d-flex align-items-center\"\r\n style=\"font-size: 14px; font-weight: 400;\">\r\n Exibir\r\n </p>\r\n <cfc-select\r\n id=\"pagination-per-page\"\r\n style=\"min-width: 100px; width: min-content;\"\r\n [options]=\"itemsPerPageOptions\"\r\n [(ngModel)]=\"itemsPerPageOptions\"\r\n (onChange)=\"changeItemsPerPage($event)\">\r\n </cfc-select>\r\n </div>\r\n\r\n <span class=\"br-divider d-none d-sm-block mx-3\"></span>\r\n\r\n <div class=\"pagination-information d-sm-flex\">\r\n {{ currentPage }}-{{ allPages }} de {{ allItems }} itens\r\n </div>\r\n\r\n <span class=\"br-divider d-none d-sm-block mx-3\"></span>\r\n\r\n <div class=\"pagination-per-page\">\r\n <p\r\n class=\"mr-3 mb-0 d-flex align-items-center\"\r\n style=\"font-size: 14px; font-weight: 400;\">\r\n P\u00E1gina\r\n </p>\r\n <cfc-select\r\n style=\"min-width: 100px; width: min-content;\"\r\n ariaLabel=\"Exibir P\u00E1gina\"\r\n id=\"go-to-selection\"\r\n [disabled]=\"allPages === 1\"\r\n [value]=\"currentPage\"\r\n [options]=\"pagesArray\"\r\n (onChange)=\"goToPage($event)\">\r\n </cfc-select>\r\n <!-- <div class=\"br-select\" [class.disabled]=\"allPages === 1\">\r\n <div class=\"br-input\">\r\n <label for=\"go-to-selection\">P\u00E1gina</label>\r\n <input\r\n id=\"go-to-selection\"\r\n type=\"text\"\r\n [value]=\"currentPage\"\r\n [placeholder]=\"currentPage\"\r\n readonly\r\n />\r\n <button\r\n class=\"br-button\"\r\n type=\"button\"\r\n aria-label=\"Exibir lista\"\r\n tabindex=\"-2\"\r\n data-trigger=\"data-trigger\"\r\n >\r\n <i class=\"fas fa-angle-down\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n <div class=\"br-list\" tabindex=\"-2\">\r\n <div\r\n class=\"br-item\"\r\n tabindex=\"-2\"\r\n *ngFor=\"let page of pagesArray\"\r\n (click)=\"goToPage(page.value)\"\r\n >\r\n <div class=\"br-radio\">\r\n <input\r\n [id]=\"'go-to-' + page.value\"\r\n type=\"radio\"\r\n name=\"go-to\"\r\n [value]=\"page.value\"\r\n [checked]=\"page.selected\"\r\n />\r\n <label [for]=\"'go-to-' + page.value\">{{ page.value }}</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <span class=\"br-divider d-none d-sm-block mx-3\"></span>\r\n\r\n <div class=\"pagination-arrows ml-auto ml-sm-0 mr-1\">\r\n <button\r\n class=\"br-button circle\"\r\n type=\"button\"\r\n aria-label=\"Voltar p\u00E1gina\"\r\n (click)=\"prevPage()\"\r\n >\r\n <i class=\"fas fa-angle-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button\r\n class=\"br-button circle\"\r\n type=\"button\"\r\n aria-label=\"P\u00E1gina seguinte\"\r\n (click)=\"nextPage()\"\r\n >\r\n <i class=\"fas fa-angle-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n</nav>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.SelectComponent, selector: "cfc-select", inputs: ["options", "id", "label", "value", "placeholder", "labelInline", "multiple"], outputs: ["onChange"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaginationComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-pagination', template: "<span class=\"br-divider sm-block\"></span>\r\n\r\n<nav class=\"br-pagination sm-block\"\r\n aria-label=\"pagina\u00E7\u00E3o\"\r\n [attr.data-total]=\"allItems\"\r\n [attr.data-current]=\"currentPage\"\r\n [attr.data-per-page]=\"itemsPerPage\">\r\n\r\n <div class=\"pagination-per-page\">\r\n <p\r\n class=\"mx-3 mb-0 d-flex align-items-center\"\r\n style=\"font-size: 14px; font-weight: 400;\">\r\n Exibir\r\n </p>\r\n <cfc-select\r\n id=\"pagination-per-page\"\r\n style=\"min-width: 100px; width: min-content;\"\r\n [options]=\"itemsPerPageOptions\"\r\n [(ngModel)]=\"itemsPerPageOptions\"\r\n (onChange)=\"changeItemsPerPage($event)\">\r\n </cfc-select>\r\n </div>\r\n\r\n <span class=\"br-divider d-none d-sm-block mx-3\"></span>\r\n\r\n <div class=\"pagination-information d-sm-flex\">\r\n {{ currentPage }}-{{ allPages }} de {{ allItems }} itens\r\n </div>\r\n\r\n <span class=\"br-divider d-none d-sm-block mx-3\"></span>\r\n\r\n <div class=\"pagination-per-page\">\r\n <p\r\n class=\"mr-3 mb-0 d-flex align-items-center\"\r\n style=\"font-size: 14px; font-weight: 400;\">\r\n P\u00E1gina\r\n </p>\r\n <cfc-select\r\n style=\"min-width: 100px; width: min-content;\"\r\n ariaLabel=\"Exibir P\u00E1gina\"\r\n id=\"go-to-selection\"\r\n [disabled]=\"allPages === 1\"\r\n [value]=\"currentPage\"\r\n [options]=\"pagesArray\"\r\n (onChange)=\"goToPage($event)\">\r\n </cfc-select>\r\n <!-- <div class=\"br-select\" [class.disabled]=\"allPages === 1\">\r\n <div class=\"br-input\">\r\n <label for=\"go-to-selection\">P\u00E1gina</label>\r\n <input\r\n id=\"go-to-selection\"\r\n type=\"text\"\r\n [value]=\"currentPage\"\r\n [placeholder]=\"currentPage\"\r\n readonly\r\n />\r\n <button\r\n class=\"br-button\"\r\n type=\"button\"\r\n aria-label=\"Exibir lista\"\r\n tabindex=\"-2\"\r\n data-trigger=\"data-trigger\"\r\n >\r\n <i class=\"fas fa-angle-down\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n <div class=\"br-list\" tabindex=\"-2\">\r\n <div\r\n class=\"br-item\"\r\n tabindex=\"-2\"\r\n *ngFor=\"let page of pagesArray\"\r\n (click)=\"goToPage(page.value)\"\r\n >\r\n <div class=\"br-radio\">\r\n <input\r\n [id]=\"'go-to-' + page.value\"\r\n type=\"radio\"\r\n name=\"go-to\"\r\n [value]=\"page.value\"\r\n [checked]=\"page.selected\"\r\n />\r\n <label [for]=\"'go-to-' + page.value\">{{ page.value }}</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <span class=\"br-divider d-none d-sm-block mx-3\"></span>\r\n\r\n <div class=\"pagination-arrows ml-auto ml-sm-0 mr-1\">\r\n <button\r\n class=\"br-button circle\"\r\n type=\"button\"\r\n aria-label=\"Voltar p\u00E1gina\"\r\n (click)=\"prevPage()\"\r\n >\r\n <i class=\"fas fa-angle-left\" aria-hidden=\"true\"></i>\r\n </button>\r\n <button\r\n class=\"br-button circle\"\r\n type=\"button\"\r\n aria-label=\"P\u00E1gina seguinte\"\r\n (click)=\"nextPage()\"\r\n >\r\n <i class=\"fas fa-angle-right\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n</nav>\r\n" }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { data: [{
type: Input
}], itemsPerPageOptions: [{
type: Input
}], allPages: [{
type: Input
}], itemsPerPage: [{
type: Input
}], allItems: [{
type: Input
}], pageChange: [{
type: Output
}], itemsPerPageChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7O0FBTzVILE1BQU0sT0FBTyxtQkFBbUI7SUFzQnBCO0lBbkJELElBQUksR0FBVSxFQUFFLENBQUM7SUFDakIsbUJBQW1CLEdBQUc7UUFDN0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtRQUMxQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1FBQzNDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7S0FDNUMsQ0FBQztJQUNPLFFBQVEsR0FBVyxDQUFDLENBQUM7SUFDckIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixRQUFRLEdBQVcsQ0FBQyxDQUFDO0lBRXBCLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQ3hDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFFMUQsT0FBTyxHQUFZLEtBQUssQ0FBQztJQUN6QixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLGFBQWEsR0FBVSxFQUFFLENBQUM7SUFDMUIsVUFBVSxHQUFHLENB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SUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQztJQUNILENBQUM7SUFFTyxtQkFBbUI7UUFDekIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDaEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFN0QsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0IsQ0FBQzt3R0FwSFUsbUJBQW1COzRGQUFuQixtQkFBbUIsNFNDUGhDLHM3R0E2R0E7OzRGRHRHYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UsZ0JBQWdCO3NGQU9qQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjZmMtcGFnaW5hdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUGFnaW5hdGlvbkNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZU9wdGlvbnMgPSBbXHJcbiAgICB7IHZhbHVlOiAxMCwgbGFiZWw6ICcxMCcsIHNlbGVjdGVkOiB0cnVlIH0sXHJcbiAgICB7IHZhbHVlOiAyMCwgbGFiZWw6ICcyMCcsIHNlbGVjdGVkOiBmYWxzZSB9LFxyXG4gICAgeyB2YWx1ZTogMzAsIGxhYmVsOiAnMzAnLCBzZWxlY3RlZDogZmFsc2UgfSxcclxuICBdO1xyXG4gIEBJbnB1dCgpIGFsbFBhZ2VzOiBudW1iZXIgPSAxO1xyXG4gIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7XHJcbiAgQElucHV0KCkgYWxsSXRlbXM6IG51bWJlciA9IDA7XHJcblxyXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIGl0ZW1zUGVyUGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICBkZWZhdWx0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudFBhZ2UgPSAxO1xyXG4gIGRpc3BsYXllZERhdGE6IGFueVtdID0gW107XHJcbiAgcGFnZXNBcnJheSA9IFt7IHZhbHVlOiAxLCBsYWJlbDogJzEnLCBzZWxlY3RlZDogdHJ1ZSB9XTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUFsbEl0ZW1zKCk7XHJcbiAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKTtcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheWVkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydhbGxQYWdlcyddIHx8IGNoYW5nZXNbJ2l0ZW1zUGVyUGFnZSddIHx8IGNoYW5nZXNbJ2FsbEl0ZW1zJ10pIHtcclxuICAgICAgdGhpcy5pbml0aWFsaXplRGVmYXVsdHMoKTtcclxuICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XHJcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheWVkRGF0YSgpO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcmV2UGFnZSgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLS07XHJcbiAgICAgIHRoaXMudXBkYXRlUGFnZVNlbGVjdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmV4dFBhZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA8IHRoaXMuYWxsUGFnZXMpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSsrO1xyXG4gICAgICB0aGlzLnVwZGF0ZVBhZ2VTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdvVG9QYWdlKHBhZ2U6IGFueSkge1xyXG4gICAgaWYgKHR5cGVvZiBwYWdlID09PSAnbnVtYmVyJyAmJiBwYWdlID49IDEgJiYgcGFnZSA8PSB0aGlzLmFsbFBhZ2VzKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xyXG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdChwYWdlKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhZ2UuZGV0YWlsWzBdID09PSAnbnVtYmVyJykge1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gK3BhZ2UuZGV0YWlsWzBdO1xyXG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCgrcGFnZS5kZXRhaWxbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlUGFnZVNlbGVjdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUGFnZVNlbGVjdGlvbigpIHtcclxuICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMuY3VycmVudFBhZ2UpO1xyXG4gICAgdGhpcy5wYWdlc0FycmF5LmZvckVhY2gocGFnZSA9PiB7XHJcbiAgICAgIHBhZ2Uuc2VsZWN0ZWQgPSBwYWdlLnZhbHVlID09PSB0aGlzLmN1cnJlbnRQYWdlO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXllZERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURlZmF1bHRzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYWxsSXRlbXMgPT0gMCAmJiB0aGlzLmRhdGEpIHtcclxuICAgICAgdGhpcy5hbGxJdGVtcyA9IHRoaXMuZGF0YS5sZW5ndGg7XHJcbiAgICAgIHRoaXMuZGVmYXVsdCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRlZmF1bHQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kZWZhdWx0KSB7XHJcbiAgICAgIHRoaXMuYWxsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5hbGxJdGVtcyAvIHRoaXMuaXRlbXNQZXJQYWdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQWxsSXRlbXMoKSB7XHJcbiAgICB0aGlzLmFsbEl0ZW1zID0gdGhpcy5hbGxJdGVtcyAhPT0gMCA/IHRoaXMuYWxsSXRlbXMgOiB0aGlzLmRhdGEubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlSXRlbXNQZXJQYWdlKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gZXZlbnQuZGV0YWlsWzBdLmxhYmVsO1xyXG4gICAgdGhpcy5pdGVtc1BlclBhZ2VDaGFuZ2UuZW1pdChldmVudC5kZXRhaWxbMF0udmFsdWUpO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXllZERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUGFnaW5hdGlvbigpIHtcclxuICAgIHRoaXMucGFnZXNBcnJheSA9IFtdO1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmFsbFBhZ2VzIHx8IE1hdGguY2VpbCh0aGlzLmFsbEl0ZW1zIC8gdGhpcy5pdGVtc1BlclBhZ2UpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWw7IGkrKykge1xyXG4gICAgICB0aGlzLnBhZ2VzQXJyYXkucHVzaCh7IHZhbHVlOiBpLCBsYWJlbDogYCR7aX1gLCBzZWxlY3RlZDogaSA9PT0gdGhpcy5jdXJyZW50UGFnZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheWVkRGF0YSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5pdGVtc1BlclBhZ2U7XHJcbiAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyB0aGlzLml0ZW1zUGVyUGFnZTtcclxuICAgIGlmICh0aGlzLmRlZmF1bHQpIHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhID0gdGhpcy5kYXRhLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc3BsYXllZERhdGEgPSBbLi4udGhpcy5kYXRhXTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxzcGFuIGNsYXNzPVwiYnItZGl2aWRlciBzbS1ibG9ja1wiPjwvc3Bhbj5cclxuXHJcbjxuYXYgY2xhc3M9XCJici1wYWdpbmF0aW9uIHNtLWJsb2NrXCJcclxuICBhcmlhLWxhYmVsPVwicGFnaW5hw6fDo29cIlxyXG4gIFthdHRyLmRhdGEtdG90YWxdPVwiYWxsSXRlbXNcIlxyXG4gIFthdHRyLmRhdGEtY3VycmVudF09XCJjdXJyZW50UGFnZVwiXHJcbiAgW2F0dHIuZGF0YS1wZXItcGFnZV09XCJpdGVtc1BlclBhZ2VcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInBhZ2luYXRpb24tcGVyLXBhZ2VcIj5cclxuICAgIDxwXHJcbiAgICAgIGNsYXNzPVwibXgtMyBtYi0wIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IDQwMDtcIj5cclxuICAgICAgRXhpYmlyXHJcbiAgICA8L3A+XHJcbiAgICA8Y2ZjLXNlbGVjdFxyXG4gICAgICBpZD1cInBhZ2luYXRpb24tcGVyLXBhZ2VcIlxyXG4gICAgICBzdHlsZT1cIm1pbi13aWR0aDogMTAwcHg7IHdpZHRoOiBtaW4tY29udGVudDtcIlxyXG4gICAgICBbb3B0aW9uc109XCJpdGVtc1BlclBhZ2VPcHRpb25zXCJcclxuICAgICAgWyhuZ01vZGVsKV09XCJpdGVtc1BlclBhZ2VPcHRpb25zXCJcclxuICAgICAgKG9uQ2hhbmdlKT1cImNoYW5nZUl0ZW1zUGVyUGFnZSgkZXZlbnQpXCI+XHJcbiAgICA8L2NmYy1zZWxlY3Q+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxzcGFuIGNsYXNzPVwiYnItZGl2aWRlciBkLW5vbmUgZC1zbS1ibG9jayBteC0zXCI+PC9zcGFuPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwicGFnaW5hdGlvbi1pbmZvcm1hdGlvbiBkLXNtLWZsZXhcIj5cclxuICAgIHt7IGN1cnJlbnRQYWdlIH19LXt7IGFsbFBhZ2VzIH19IGRlIHt7IGFsbEl0ZW1zIH19IGl0ZW5zXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxzcGFuIGNsYXNzPVwiYnItZGl2aWRlciBkLW5vbmUgZC1zbS1ibG9jayBteC0zXCI+PC9zcGFuPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwicGFnaW5hdGlvbi1wZXItcGFnZVwiPlxyXG4gICAgPHBcclxuICAgICAgY2xhc3M9XCJtci0zIG1iLTAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogNDAwO1wiPlxyXG4gICAgICBQw6FnaW5hXHJcbiAgICA8L3A+XHJcbiAgICA8Y2ZjLXNlbGVjdFxyXG4gICAgICBzdHlsZT1cIm1pbi13aWR0aDogMTAwcHg7IHdpZHRoOiBtaW4tY29udGVudDtcIlxyXG4gICAgICBhcmlhTGFiZWw9XCJFeGliaXIgUMOhZ2luYVwiXHJcbiAgICAgIGlkPVwiZ28tdG8tc2VsZWN0aW9uXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImFsbFBhZ2VzID09PSAxXCJcclxuICAgICAgW3ZhbHVlXT1cImN1cnJlbnRQYWdlXCJcclxuICAgICAgW29wdGlvbnNdPVwicGFnZXNBcnJheVwiXHJcbiAgICAgIChvbkNoYW5nZSk9XCJnb1RvUGFnZSgkZXZlbnQpXCI+XHJcbiAgICA8L2NmYy1zZWxlY3Q+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJici1zZWxlY3RcIiBbY2xhc3MuZGlzYWJsZWRdPVwiYWxsUGFnZXMgPT09IDFcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImJyLWlucHV0XCI+XHJcbiAgICAgICAgPGxhYmVsIGZvcj1cImdvLXRvLXNlbGVjdGlvblwiPlDDoWdpbmE8L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgaWQ9XCJnby10by1zZWxlY3Rpb25cIlxyXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRQYWdlXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjdXJyZW50UGFnZVwiXHJcbiAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgY2xhc3M9XCJici1idXR0b25cIlxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRXhpYmlyIGxpc3RhXCJcclxuICAgICAgICAgIHRhYmluZGV4PVwiLTJcIlxyXG4gICAgICAgICAgZGF0YS10cmlnZ2VyPVwiZGF0YS10cmlnZ2VyXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1hbmdsZS1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImJyLWxpc3RcIiB0YWJpbmRleD1cIi0yXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJici1pdGVtXCJcclxuICAgICAgICAgIHRhYmluZGV4PVwiLTJcIlxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHBhZ2Ugb2YgcGFnZXNBcnJheVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZ29Ub1BhZ2UocGFnZS52YWx1ZSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJici1yYWRpb1wiPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBbaWRdPVwiJ2dvLXRvLScgKyBwYWdlLnZhbHVlXCJcclxuICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgICAgICAgIG5hbWU9XCJnby10b1wiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZ2UudmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInBhZ2Uuc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZ28tdG8tJyArIHBhZ2UudmFsdWVcIj57eyBwYWdlLnZhbHVlIH19PC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PiAtLT5cclxuICA8L2Rpdj5cclxuXHJcbiAgPHNwYW4gY2xhc3M9XCJici1kaXZpZGVyIGQtbm9uZSBkLXNtLWJsb2NrIG14LTNcIj48L3NwYW4+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uLWFycm93cyBtbC1hdXRvIG1sLXNtLTAgbXItMVwiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICBjbGFzcz1cImJyLWJ1dHRvbiBjaXJjbGVcIlxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgYXJpYS1sYWJlbD1cIlZvbHRhciBww6FnaW5hXCJcclxuICAgICAgKGNsaWNrKT1cInByZXZQYWdlKClcIlxyXG4gICAgPlxyXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1hbmdsZS1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIGNsYXNzPVwiYnItYnV0dG9uIGNpcmNsZVwiXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiUMOhZ2luYSBzZWd1aW50ZVwiXHJcbiAgICAgIChjbGljayk9XCJuZXh0UGFnZSgpXCJcclxuICAgID5cclxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYW5nbGUtcmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9uYXY+XHJcbiJdfQ==