ngx-advance-pagination
Version:
An advance pagination for Angular2+ with dots facility.
113 lines • 20.1 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class NgxAdvancePaginationComponent {
constructor() {
this._totalNumberOfData = 0;
this._dataPerPage = 1;
this._currentPageNumber = 1;
this._totalNumberOfPaginationsToShow = 9;
this.pageNumberChanged = new EventEmitter();
this.paginationArr = [];
this.numOfPaginations = 0;
}
set totalNumberOfData(val) {
this._totalNumberOfData = val;
this._paginationCalculations();
}
set dataPerPage(val) {
this._dataPerPage = val;
this._paginationCalculations();
}
set currentPageNumber(val) {
this._currentPageNumber = val;
this._paginationCalculations();
}
set numberOfPagesToShow(val) {
this._totalNumberOfPaginationsToShow = val;
this._paginationCalculations();
}
ngOnInit() {
}
_paginationCalculations() {
this.numOfPaginations = this._totalNumberOfData % this._dataPerPage == 0 ? this._totalNumberOfData / this._dataPerPage : parseInt((this._totalNumberOfData / this._dataPerPage).toString()) + 1;
this.paginationArr = [];
if (this.numOfPaginations <= this._totalNumberOfPaginationsToShow) {
for (let i = 1; i <= this.numOfPaginations; i++) {
this.paginationArr.push(i);
}
}
else if (this._currentPageNumber <= (parseInt((this._totalNumberOfPaginationsToShow / 2).toString()))) {
for (let i = 1; i <= this._totalNumberOfPaginationsToShow - 2; i++) {
this.paginationArr.push(i);
}
this.paginationArr.push('...');
this.paginationArr.push(this.numOfPaginations);
}
else if (this._currentPageNumber >= (this.numOfPaginations - parseInt((this._totalNumberOfPaginationsToShow / 2).toString()))) {
this.paginationArr.push(1);
this.paginationArr.push('...');
for (let i = (this.numOfPaginations - this._totalNumberOfPaginationsToShow + 3); i <= this.numOfPaginations; i++) {
this.paginationArr.push(i);
}
}
else {
let numberOfLoops = this._totalNumberOfPaginationsToShow - 4;
let initCounter = numberOfLoops % 2 == 0 ? this._currentPageNumber - parseInt((numberOfLoops / 2).toString()) + 1 : this._currentPageNumber - parseInt((numberOfLoops / 2).toString());
let endCounter = numberOfLoops % 2 != 0 ? this._currentPageNumber + parseInt((numberOfLoops / 2).toString()) : this._currentPageNumber + (numberOfLoops / 2);
this.paginationArr.push(1);
this.paginationArr.push('...');
for (let i = initCounter; i <= endCounter; i++) {
this.paginationArr.push(i);
}
this.paginationArr.push('...');
this.paginationArr.push(this.numOfPaginations);
}
}
paginationClicked(evnt, pageNum) {
evnt.preventDefault();
if (isNaN(pageNum)) {
return;
}
this._currentPageNumber = pageNum;
this._paginationCalculations();
this.pageNumberChanged.emit(pageNum);
}
prevClicked() {
if (this._currentPageNumber == 1) {
return;
}
this._currentPageNumber = this._currentPageNumber - 1;
this._paginationCalculations();
this.pageNumberChanged.emit(this._currentPageNumber);
}
nextClicked() {
if (this._currentPageNumber == this.numOfPaginations) {
return;
}
this._currentPageNumber = this._currentPageNumber + 1;
this._paginationCalculations();
this.pageNumberChanged.emit(this._currentPageNumber);
}
}
NgxAdvancePaginationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NgxAdvancePaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
NgxAdvancePaginationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: NgxAdvancePaginationComponent, selector: "NgxAdvancePagination", inputs: { totalNumberOfData: "totalNumberOfData", dataPerPage: "dataPerPage", currentPageNumber: "currentPageNumber", numberOfPagesToShow: "numberOfPagesToShow" }, outputs: { pageNumberChanged: "pageNumberChanged" }, ngImport: i0, template: "<div class=\"ngx-advance-pagination-container\" *ngIf=\"numOfPaginations > 0\">\r\n <ul class=\"ngx-advance-pagination\">\r\n <li class=\"ngx-advance-pagination-page-item ngx-advance-pagination-left-control\">\r\n <a href=\"javascript:void(0);\" (click)=\"prevClicked()\" class=\"ngx-advance-pagination-page-link\">‹</a>\r\n </li>\r\n <li *ngFor=\"let data of paginationArr\" [class]=\"data == _currentPageNumber ? 'active ngx-advance-pagination-page-item' : 'ngx-advance-pagination-page-item'\">\r\n <a href=\"javascript:void(0);\" (click)=\"paginationClicked($event, data)\" class=\"ngx-advance-pagination-page-link\" >{{data}}</a>\r\n </li>\r\n <li class=\"ngx-advance-pagination-page-item ngx-advance-pagination-right-control\">\r\n <a href=\"javascript:void(0);\" (click)=\"nextClicked()\" class=\"ngx-advance-pagination-page-link\" >›</a>\r\n </li>\r\n </ul>\r\n</div>", styles: [".ngx-advance-pagination-container .ngx-advance-pagination{margin:0;padding:0}.ngx-advance-pagination-container .ngx-advance-pagination .ngx-advance-pagination-page-item{list-style:none;float:left;border:1px solid rgba(0,0,0,.7);border-right:none;line-height:28px}.ngx-advance-pagination-container .ngx-advance-pagination .ngx-advance-pagination-page-item:first-child{border-radius:2px 0 0 2px}.ngx-advance-pagination-container .ngx-advance-pagination .ngx-advance-pagination-page-item:last-child{border-right:1px solid rgba(0,0,0,.7);border-radius:0 2px 2px 0}.ngx-advance-pagination-container .ngx-advance-pagination .ngx-advance-pagination-page-item.ngx-advance-pagination-left-control,.ngx-advance-pagination-container .ngx-advance-pagination .ngx-advance-pagination-page-item.ngx-advance-pagination-right-control{font-size:20px;line-height:25px}.ngx-advance-pagination-container .ngx-advance-pagination .ngx-advance-pagination-page-item .ngx-advance-pagination-page-link{text-decoration:none;display:block;background:#ffffff;color:#333;padding-left:10px;padding-right:10px;height:28px}.ngx-advance-pagination-container .ngx-advance-pagination .ngx-advance-pagination-page-item.active .ngx-advance-pagination-page-link,.ngx-advance-pagination-container .ngx-advance-pagination .ngx-advance-pagination-page-item:hover:not(.ngx-advance-pagination-left-control):not(.ngx-advance-pagination-right-control) .ngx-advance-pagination-page-link{background:#0b69c0;color:#fff}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NgxAdvancePaginationComponent, decorators: [{
type: Component,
args: [{
selector: 'NgxAdvancePagination',
templateUrl: './ngx-advance-pagination.component.html',
styleUrls: ['./ngx-advance-pagination.component.scss']
}]
}], ctorParameters: function () { return []; }, propDecorators: { pageNumberChanged: [{
type: Output
}], totalNumberOfData: [{
type: Input
}], dataPerPage: [{
type: Input
}], currentPageNumber: [{
type: Input
}], numberOfPagesToShow: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFkdmFuY2UtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYWR2YW5jZS1wYWdpbmF0aW9uL3NyYy9saWIvbmd4LWFkdmFuY2UtcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYWR2YW5jZS1wYWdpbmF0aW9uL3NyYy9saWIvbmd4LWFkdmFuY2UtcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFPL0UsTUFBTSxPQUFPLDZCQUE2QjtJQVd4QztRQVRRLHVCQUFrQixHQUFXLENBQUMsQ0FBQztRQUMvQixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUMxQix1QkFBa0IsR0FBVyxDQUFDLENBQUM7UUFDOUIsb0NBQStCLEdBQVcsQ0FBQyxDQUFDO1FBQzFDLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFL0Msa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFDeEIscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO0lBR3BDLENBQUM7SUFFRCxJQUFhLGlCQUFpQixDQUFDLEdBQVc7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztRQUM5QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBYSxXQUFXLENBQUMsR0FBVztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBYSxpQkFBaUIsQ0FBQyxHQUFXO1FBQ3hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUM7UUFDOUIsSUFBSSxDQUFD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LENBQUM7UUFDdEQsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNuRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7OzBIQXpHVSw2QkFBNkI7OEdBQTdCLDZCQUE2QixxUkNQMUMsMjVCQVlNOzJGRExPLDZCQUE2QjtrQkFMekMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxXQUFXLEVBQUUseUNBQXlDO29CQUN0RCxTQUFTLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQztpQkFDdkQ7MEVBT1csaUJBQWlCO3NCQUExQixNQUFNO2dCQVFNLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFLTyxXQUFXO3NCQUF2QixLQUFLO2dCQUtPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFLTyxtQkFBbUI7c0JBQS9CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ05neEFkdmFuY2VQYWdpbmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1hZHZhbmNlLXBhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtYWR2YW5jZS1wYWdpbmF0aW9uLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd4QWR2YW5jZVBhZ2luYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHByaXZhdGUgX3RvdGFsTnVtYmVyT2ZEYXRhOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9kYXRhUGVyUGFnZTogbnVtYmVyID0gMTtcbiAgcHVibGljIF9jdXJyZW50UGFnZU51bWJlcjogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBfdG90YWxOdW1iZXJPZlBhZ2luYXRpb25zVG9TaG93OiBudW1iZXIgPSA5O1xuICBAT3V0cHV0KCkgcGFnZU51bWJlckNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwdWJsaWMgcGFnaW5hdGlvbkFycjogYW55ID0gW107XG4gIHB1YmxpYyBudW1PZlBhZ2luYXRpb25zOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRvdGFsTnVtYmVyT2ZEYXRhKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdG90YWxOdW1iZXJPZkRhdGEgPSB2YWw7XG4gICAgdGhpcy5fcGFnaW5hdGlvbkNhbGN1bGF0aW9ucygpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRhdGFQZXJQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fZGF0YVBlclBhZ2UgPSB2YWw7XG4gICAgdGhpcy5fcGFnaW5hdGlvbkNhbGN1bGF0aW9ucygpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGN1cnJlbnRQYWdlTnVtYmVyKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPSB2YWw7XG4gICAgdGhpcy5fcGFnaW5hdGlvbkNhbGN1bGF0aW9ucygpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG51bWJlck9mUGFnZXNUb1Nob3codmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl90b3RhbE51bWJlck9mUGFnaW5hdGlvbnNUb1Nob3cgPSB2YWw7XG4gICAgdGhpcy5fcGFnaW5hdGlvbkNhbGN1bGF0aW9ucygpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gIH1cblxuICBwcml2YXRlIF9wYWdpbmF0aW9uQ2FsY3VsYXRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMubnVtT2ZQYWdpbmF0aW9ucyA9IHRoaXMuX3RvdGFsTnVtYmVyT2ZEYXRhICUgdGhpcy5fZGF0YVBlclBhZ2UgPT0gMCA/IHRoaXMuX3RvdGFsTnVtYmVyT2ZEYXRhIC8gdGhpcy5fZGF0YVBlclBhZ2UgOiBwYXJzZUludCgodGhpcy5fdG90YWxOdW1iZXJPZkRhdGEgLyB0aGlzLl9kYXRhUGVyUGFnZSkudG9TdHJpbmcoKSkgKyAxO1xuXG4gICAgdGhpcy5wYWdpbmF0aW9uQXJyID0gW107XG5cbiAgICBpZih0aGlzLm51bU9mUGFnaW5hdGlvbnMgPD0gdGhpcy5fdG90YWxOdW1iZXJPZlBhZ2luYXRpb25zVG9TaG93KSB7XG4gICAgICBmb3IobGV0IGkgPSAxOyBpPD0gdGhpcy5udW1PZlBhZ2luYXRpb25zOyBpKyspIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQXJyLnB1c2goaSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYodGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgPD0gKHBhcnNlSW50KCh0aGlzLl90b3RhbE51bWJlck9mUGFnaW5hdGlvbnNUb1Nob3cgLyAyKS50b1N0cmluZygpKSkpIHtcbiAgICAgIGZvcihsZXQgaSA9IDE7IGk8PSB0aGlzLl90b3RhbE51bWJlck9mUGFnaW5hdGlvbnNUb1Nob3cgLSAyOyBpKyspIHtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQXJyLnB1c2goaSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhZ2luYXRpb25BcnIucHVzaCgnLi4uJyk7XG4gICAgICB0aGlzLnBhZ2luYXRpb25BcnIucHVzaCh0aGlzLm51bU9mUGFnaW5hdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIGlmKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID49ICh0aGlzLm51bU9mUGFnaW5hdGlvbnMgLSBwYXJzZUludCgodGhpcy5fdG90YWxOdW1iZXJPZlBhZ2luYXRpb25zVG9TaG93IC8gMikudG9TdHJpbmcoKSkpKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb25BcnIucHVzaCgxKTtcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFyci5wdXNoKCcuLi4nKTtcbiAgICAgIGZvcihsZXQgaSA9ICh0aGlzLm51bU9mUGFnaW5hdGlvbnMgLSB0aGlzLl90b3RhbE51bWJlck9mUGFnaW5hdGlvbnNUb1Nob3cgKyAzKTsgaSA8PSB0aGlzLm51bU9mUGFnaW5hdGlvbnM7IGkrKykge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25BcnIucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsZXQgbnVtYmVyT2ZMb29wcyA9IHRoaXMuX3RvdGFsTnVtYmVyT2ZQYWdpbmF0aW9uc1RvU2hvdyAtIDQ7XG4gICAgICBsZXQgaW5pdENvdW50ZXIgPSBudW1iZXJPZkxvb3BzICUgMiA9PSAwID8gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgLSBwYXJzZUludCgobnVtYmVyT2ZMb29wcyAvIDIpLnRvU3RyaW5nKCkpICsgMSA6IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gcGFyc2VJbnQoKG51bWJlck9mTG9vcHMgLyAyKS50b1N0cmluZygpKTtcbiAgICAgIGxldCBlbmRDb3VudGVyID0gbnVtYmVyT2ZMb29wcyAlIDIgIT0gMCA/IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyICsgcGFyc2VJbnQoKG51bWJlck9mTG9vcHMgLyAyKS50b1N0cmluZygpKSA6IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyICsgKG51bWJlck9mTG9vcHMgLyAyKTtcblxuICAgICAgdGhpcy5wYWdpbmF0aW9uQXJyLnB1c2goMSk7XG4gICAgICB0aGlzLnBhZ2luYXRpb25BcnIucHVzaCgnLi4uJyk7XG4gICAgICBmb3IobGV0IGk9aW5pdENvdW50ZXI7IGk8PWVuZENvdW50ZXI7IGkrKykge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25BcnIucHVzaChpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFnaW5hdGlvbkFyci5wdXNoKCcuLi4nKTtcbiAgICAgIHRoaXMucGFnaW5hdGlvbkFyci5wdXNoKHRoaXMubnVtT2ZQYWdpbmF0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcGFnaW5hdGlvbkNsaWNrZWQoZXZudDogYW55LCBwYWdlTnVtOiBudW1iZXIpOiB2b2lkIHtcbiAgICBldm50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYoaXNOYU4ocGFnZU51bSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZU51bWJlciA9IHBhZ2VOdW07XG4gICAgdGhpcy5fcGFnaW5hdGlvbkNhbGN1bGF0aW9ucygpO1xuICAgIHRoaXMucGFnZU51bWJlckNoYW5nZWQuZW1pdChwYWdlTnVtKTtcbiAgfVxuXG4gIHByZXZDbGlja2VkKCk6IHZvaWQge1xuICAgIGlmKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID09IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZU51bWJlciA9IHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMTtcbiAgICB0aGlzLl9wYWdpbmF0aW9uQ2FsY3VsYXRpb25zKCk7XG4gICAgdGhpcy5wYWdlTnVtYmVyQ2hhbmdlZC5lbWl0KHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyKTtcbiAgfVxuXG4gIG5leHRDbGlja2VkKCk6IHZvaWQge1xuICAgIGlmKHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID09IHRoaXMubnVtT2ZQYWdpbmF0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIgKyAxO1xuICAgIHRoaXMuX3BhZ2luYXRpb25DYWxjdWxhdGlvbnMoKTtcbiAgICB0aGlzLnBhZ2VOdW1iZXJDaGFuZ2VkLmVtaXQodGhpcy5fY3VycmVudFBhZ2VOdW1iZXIpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJuZ3gtYWR2YW5jZS1wYWdpbmF0aW9uLWNvbnRhaW5lclwiICpuZ0lmPVwibnVtT2ZQYWdpbmF0aW9ucyA+IDBcIj5cclxuICA8dWwgY2xhc3M9XCJuZ3gtYWR2YW5jZS1wYWdpbmF0aW9uXCI+XHJcbiAgICA8bGkgY2xhc3M9XCJuZ3gtYWR2YW5jZS1wYWdpbmF0aW9uLXBhZ2UtaXRlbSBuZ3gtYWR2YW5jZS1wYWdpbmF0aW9uLWxlZnQtY29udHJvbFwiPlxyXG4gICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIChjbGljayk9XCJwcmV2Q2xpY2tlZCgpXCIgY2xhc3M9XCJuZ3gtYWR2YW5jZS1wYWdpbmF0aW9uLXBhZ2UtbGlua1wiPiYjODI0OTs8L2E+XHJcbiAgICA8L2xpPlxyXG4gICAgPGxpICpuZ0Zvcj1cImxldCBkYXRhIG9mIHBhZ2luYXRpb25BcnJcIiBbY2xhc3NdPVwiZGF0YSA9PSBfY3VycmVudFBhZ2VOdW1iZXIgPyAnYWN0aXZlIG5neC1hZHZhbmNlLXBhZ2luYXRpb24tcGFnZS1pdGVtJyA6ICduZ3gtYWR2YW5jZS1wYWdpbmF0aW9uLXBhZ2UtaXRlbSdcIj5cclxuICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiAoY2xpY2spPVwicGFnaW5hdGlvbkNsaWNrZWQoJGV2ZW50LCBkYXRhKVwiIGNsYXNzPVwibmd4LWFkdmFuY2UtcGFnaW5hdGlvbi1wYWdlLWxpbmtcIiA+e3tkYXRhfX08L2E+XHJcbiAgICA8L2xpPlxyXG4gICAgPGxpIGNsYXNzPVwibmd4LWFkdmFuY2UtcGFnaW5hdGlvbi1wYWdlLWl0ZW0gbmd4LWFkdmFuY2UtcGFnaW5hdGlvbi1yaWdodC1jb250cm9sXCI+XHJcbiAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgKGNsaWNrKT1cIm5leHRDbGlja2VkKClcIiBjbGFzcz1cIm5neC1hZHZhbmNlLXBhZ2luYXRpb24tcGFnZS1saW5rXCIgPiYjODI1MDs8L2E+XHJcbiAgICA8L2xpPlxyXG4gIDwvdWw+XHJcbjwvZGl2PiJdfQ==