UNPKG

@taiga-ui/addon-table

Version:

A library to display tabled data with filters, search, group actions, etc.

100 lines 24.5 kB
import { AsyncPipe, NgForOf, NgIf } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, } from '@angular/core'; import { TUI_TABLE_PAGINATION_TEXTS } from '@taiga-ui/addon-table/tokens'; import { TuiButton } from '@taiga-ui/core/components/button'; import { TuiDataList } from '@taiga-ui/core/components/data-list'; import { TuiIcon } from '@taiga-ui/core/components/icon'; import { TuiLink } from '@taiga-ui/core/components/link'; import { TuiDropdownDirective, TuiDropdownOpen } from '@taiga-ui/core/directives/dropdown'; import { TUI_COMMON_ICONS, TUI_SPIN_ICONS, TUI_SPIN_TEXTS } from '@taiga-ui/core/tokens'; import { PolymorpheusOutlet, PolymorpheusTemplate } from '@taiga-ui/polymorpheus'; import { TUI_TABLE_PAGINATION_OPTIONS } from './table-pagination.options'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core/components/data-list"; class TuiTablePagination { constructor() { this.options = inject(TUI_TABLE_PAGINATION_OPTIONS); this.open = false; this.icons = inject(TUI_SPIN_ICONS); this.spinTexts$ = inject(TUI_SPIN_TEXTS); this.texts$ = inject(TUI_TABLE_PAGINATION_TEXTS); this.commonIcons = inject(TUI_COMMON_ICONS); this.items = this.options.items; this.total = 0; this.page = 0; this.size = this.options.size; this.paginationChange = new EventEmitter(); } onItem(size) { const { start } = this; this.size = size; this.open = false; this.page = Math.floor(start / this.size); this.paginationChange.emit(this.pagination); } get pages() { return Math.ceil(this.total / this.size); } get showPages() { return this.options.showPages; } get sizeOptionContent() { return this.options.sizeOptionContent; } get start() { return Math.min(this.page, Math.floor(this.total / this.size)) * this.size; } get end() { return Math.min(this.start + this.size, this.total); } get leftDisabled() { return !this.start; } get rightDisabled() { return this.end === this.total; } get pagination() { return { page: this.page, size: this.size, }; } back() { this.page--; this.paginationChange.emit(this.pagination); } forth() { this.page++; this.paginationChange.emit(this.pagination); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTablePagination, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiTablePagination, isStandalone: true, selector: "tui-table-pagination", inputs: { items: "items", total: "total", page: "page", size: "size" }, outputs: { paginationChange: "paginationChange" }, ngImport: i0, template: "<ng-container *ngIf=\"texts$ | async as texts\">\n <span class=\"t-pages\">\n <ng-container *ngIf=\"showPages\">\n {{ texts.pages }}\n <strong class=\"t-strong\">{{ pages }}</strong>\n </ng-container>\n </span>\n <span automation-id=\"tui-table-pagination__lines-per-page-wrapper\">\n {{ texts.linesPerPage }}\n\n <button\n *ngIf=\"total !== 0; else zeroTotal\"\n tuiLink\n type=\"button\"\n [tuiDropdown]=\"content\"\n [(tuiDropdownOpen)]=\"open\"\n >\n <strong>{{ start + 1 }}\u2013{{ end }}</strong>\n </button>\n <ng-template #zeroTotal>\n <strong>0 - 0</strong>\n </ng-template>\n <ng-template #content>\n <tui-data-list size=\"s\">\n <ng-container *ngFor=\"let item of items\">\n <button\n tuiOption\n type=\"button\"\n class=\"t-item\"\n (click)=\"onItem(item)\"\n >\n <ng-container\n *polymorpheusOutlet=\"sizeOptionContent as text; context: {$implicit: item, total: total}\"\n >\n {{ text }}\n </ng-container>\n <tui-icon\n *ngIf=\"item === size; else fakeIcon\"\n class=\"t-checkmark\"\n [icon]=\"commonIcons.check\"\n />\n\n <ng-template #fakeIcon>\n <span class=\"t-checkmark\"></span>\n </ng-template>\n </button>\n </ng-container>\n </tui-data-list>\n </ng-template>\n {{ texts.of }}\n <strong class=\"t-strong\">{{ total }}</strong>\n </span>\n <ng-container *ngIf=\"spinTexts$ | async as spinTexts\">\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-back\"\n [disabled]=\"leftDisabled\"\n [iconStart]=\"icons.decrement\"\n (click)=\"back()\"\n >\n {{ spinTexts[0] }}\n </button>\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n [disabled]=\"rightDisabled\"\n [iconStart]=\"icons.increment\"\n (click)=\"forth()\"\n >\n {{ spinTexts[1] }}\n </button>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;font:var(--tui-font-text-s);align-items:center;color:var(--tui-text-tertiary)}.t-strong{color:var(--tui-text-primary)}.t-pages{margin-right:auto}.t-item{min-inline-size:5.5rem;box-sizing:border-box}.t-checkmark{min-inline-size:1rem;font-size:1rem;margin-inline-start:.25rem}.t-back{margin:0 .25rem 0 1.5rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "component", type: i1.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "directive", type: TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiTablePagination }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTablePagination, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-table-pagination', imports: [ AsyncPipe, NgForOf, NgIf, PolymorpheusOutlet, PolymorpheusTemplate, TuiButton, TuiDataList, TuiDropdownDirective, TuiDropdownOpen, TuiIcon, TuiLink, ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"texts$ | async as texts\">\n <span class=\"t-pages\">\n <ng-container *ngIf=\"showPages\">\n {{ texts.pages }}\n <strong class=\"t-strong\">{{ pages }}</strong>\n </ng-container>\n </span>\n <span automation-id=\"tui-table-pagination__lines-per-page-wrapper\">\n {{ texts.linesPerPage }}\n\n <button\n *ngIf=\"total !== 0; else zeroTotal\"\n tuiLink\n type=\"button\"\n [tuiDropdown]=\"content\"\n [(tuiDropdownOpen)]=\"open\"\n >\n <strong>{{ start + 1 }}\u2013{{ end }}</strong>\n </button>\n <ng-template #zeroTotal>\n <strong>0 - 0</strong>\n </ng-template>\n <ng-template #content>\n <tui-data-list size=\"s\">\n <ng-container *ngFor=\"let item of items\">\n <button\n tuiOption\n type=\"button\"\n class=\"t-item\"\n (click)=\"onItem(item)\"\n >\n <ng-container\n *polymorpheusOutlet=\"sizeOptionContent as text; context: {$implicit: item, total: total}\"\n >\n {{ text }}\n </ng-container>\n <tui-icon\n *ngIf=\"item === size; else fakeIcon\"\n class=\"t-checkmark\"\n [icon]=\"commonIcons.check\"\n />\n\n <ng-template #fakeIcon>\n <span class=\"t-checkmark\"></span>\n </ng-template>\n </button>\n </ng-container>\n </tui-data-list>\n </ng-template>\n {{ texts.of }}\n <strong class=\"t-strong\">{{ total }}</strong>\n </span>\n <ng-container *ngIf=\"spinTexts$ | async as spinTexts\">\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-back\"\n [disabled]=\"leftDisabled\"\n [iconStart]=\"icons.decrement\"\n (click)=\"back()\"\n >\n {{ spinTexts[0] }}\n </button>\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n [disabled]=\"rightDisabled\"\n [iconStart]=\"icons.increment\"\n (click)=\"forth()\"\n >\n {{ spinTexts[1] }}\n </button>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;font:var(--tui-font-text-s);align-items:center;color:var(--tui-text-tertiary)}.t-strong{color:var(--tui-text-primary)}.t-pages{margin-right:auto}.t-item{min-inline-size:5.5rem;box-sizing:border-box}.t-checkmark{min-inline-size:1rem;font-size:1rem;margin-inline-start:.25rem}.t-back{margin:0 .25rem 0 1.5rem}\n"] }] }], propDecorators: { items: [{ type: Input }], total: [{ type: Input }], page: [{ type: Input }], size: [{ type: Input }], paginationChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3RhYmxlLXBhZ2luYXRpb24vdGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3RhYmxlLXBhZ2luYXRpb24vdGFibGUtcGFnaW5hdGlvbi50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDM0QsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFHaEYsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7OztBQU94RSxN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bUhBQ1AsSUFBSSw2RkFDSixrQkFBa0IsOEhBRWxCLFNBQVMsaWFBRVQsb0JBQW9CLGlKQUNwQixlQUFlLHVNQUNmLE9BQU8scUZBQ1AsT0FBTzs7U0FNRixrQkFBa0I7NEZBQWxCLGtCQUFrQjtrQkFwQjlCLFNBQVM7aUNBQ00sSUFBSSxZQUNOLHNCQUFzQixXQUN2Qjt3QkFDTCxTQUFTO3dCQUNULE9BQU87d0JBQ1AsSUFBSTt3QkFDSixrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsU0FBUzt3QkFDVCxXQUFXO3dCQUNYLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixPQUFPO3dCQUNQLE9BQU87cUJBQ1YsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU07OEJBWXhDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlDLElBQUk7c0JBRFYsS0FBSztnQkFJVSxnQkFBZ0I7c0JBRC9CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdGb3JPZiwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VFVJX1RBQkxFX1BBR0lOQVRJT05fVEVYVFN9IGZyb20gJ0B0YWlnYS11aS9hZGRvbi10YWJsZS90b2tlbnMnO1xuaW1wb3J0IHtUdWlCdXR0b259IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7VHVpRGF0YUxpc3R9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7VHVpSWNvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7VHVpTGlua30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9saW5rJztcbmltcG9ydCB7VHVpRHJvcGRvd25EaXJlY3RpdmUsIFR1aURyb3Bkb3duT3Blbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9kcm9wZG93bic7XG5pbXBvcnQge1RVSV9DT01NT05fSUNPTlMsIFRVSV9TUElOX0lDT05TLCBUVUlfU1BJTl9URVhUU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7UG9seW1vcnBoZXVzT3V0bGV0LCBQb2x5bW9ycGhldXNUZW1wbGF0ZX0gZnJvbSAnQHRhaWdhLXVpL3BvbHltb3JwaGV1cyc7XG5cbmltcG9ydCB0eXBlIHtUdWlUYWJsZVBhZ2luYXRpb25PcHRpb25zfSBmcm9tICcuL3RhYmxlLXBhZ2luYXRpb24ub3B0aW9ucyc7XG5pbXBvcnQge1RVSV9UQUJMRV9QQUdJTkFUSU9OX09QVElPTlN9IGZyb20gJy4vdGFibGUtcGFnaW5hdGlvbi5vcHRpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBUdWlUYWJsZVBhZ2luYXRpb25FdmVudCB7XG4gICAgcmVhZG9ubHkgcGFnZTogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS10YWJsZS1wYWdpbmF0aW9uJyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgTmdGb3JPZixcbiAgICAgICAgTmdJZixcbiAgICAgICAgUG9seW1vcnBoZXVzT3V0bGV0LFxuICAgICAgICBQb2x5bW9ycGhldXNUZW1wbGF0ZSxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBUdWlEYXRhTGlzdCxcbiAgICAgICAgVHVpRHJvcGRvd25EaXJlY3RpdmUsXG4gICAgICAgIFR1aURyb3Bkb3duT3BlbixcbiAgICAgICAgVHVpSWNvbixcbiAgICAgICAgVHVpTGluayxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1wYWdpbmF0aW9uLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3RhYmxlLXBhZ2luYXRpb24uc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlUYWJsZVBhZ2luYXRpb24ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucyA9IGluamVjdChUVUlfVEFCTEVfUEFHSU5BVElPTl9PUFRJT05TKTtcblxuICAgIHByb3RlY3RlZCBvcGVuID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb25zID0gaW5qZWN0KFRVSV9TUElOX0lDT05TKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3BpblRleHRzJCA9IGluamVjdChUVUlfU1BJTl9URVhUUyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRleHRzJCA9IGluamVjdChUVUlfVEFCTEVfUEFHSU5BVElPTl9URVhUUyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbW1vbkljb25zID0gaW5qZWN0KFRVSV9DT01NT05fSUNPTlMpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXM6IHJlYWRvbmx5IG51bWJlcltdID0gdGhpcy5vcHRpb25zLml0ZW1zO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdG90YWwgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGFnZSA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaXplID0gdGhpcy5vcHRpb25zLnNpemU7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFnaW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHVpVGFibGVQYWdpbmF0aW9uRXZlbnQ+KCk7XG5cbiAgICBwdWJsaWMgb25JdGVtKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB7c3RhcnR9ID0gdGhpcztcblxuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWdlID0gTWF0aC5mbG9vcihzdGFydCAvIHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZS5lbWl0KHRoaXMucGFnaW5hdGlvbik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBwYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnNpemUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgc2hvd1BhZ2VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNob3dQYWdlcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHNpemVPcHRpb25Db250ZW50KCk6IFR1aVRhYmxlUGFnaW5hdGlvbk9wdGlvbnNbJ3NpemVPcHRpb25Db250ZW50J10ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNpemVPcHRpb25Db250ZW50O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgc3RhcnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMucGFnZSwgTWF0aC5mbG9vcih0aGlzLnRvdGFsIC8gdGhpcy5zaXplKSkgKiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBlbmQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuc3RhcnQgKyB0aGlzLnNpemUsIHRoaXMudG90YWwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgbGVmdERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCByaWdodERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmQgPT09IHRoaXMudG90YWw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBwYWdpbmF0aW9uKCk6IFR1aVRhYmxlUGFnaW5hdGlvbkV2ZW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYmFjaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdlLS07XG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZS5lbWl0KHRoaXMucGFnaW5hdGlvbik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZvcnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2UrKztcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlLmVtaXQodGhpcy5wYWdpbmF0aW9uKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidGV4dHMkIHwgYXN5bmMgYXMgdGV4dHNcIj5cbiAgICA8c3BhbiBjbGFzcz1cInQtcGFnZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dQYWdlc1wiPlxuICAgICAgICAgICAge3sgdGV4dHMucGFnZXMgfX1cbiAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9XCJ0LXN0cm9uZ1wiPnt7IHBhZ2VzIH19PC9zdHJvbmc+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiBhdXRvbWF0aW9uLWlkPVwidHVpLXRhYmxlLXBhZ2luYXRpb25fX2xpbmVzLXBlci1wYWdlLXdyYXBwZXJcIj5cbiAgICAgICAge3sgdGV4dHMubGluZXNQZXJQYWdlIH19XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJ0b3RhbCAhPT0gMDsgZWxzZSB6ZXJvVG90YWxcIlxuICAgICAgICAgICAgdHVpTGlua1xuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbdHVpRHJvcGRvd25dPVwiY29udGVudFwiXG4gICAgICAgICAgICBbKHR1aURyb3Bkb3duT3BlbildPVwib3BlblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgc3RhcnQgKyAxIH194oCTe3sgZW5kIH19PC9zdHJvbmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3plcm9Ub3RhbD5cbiAgICAgICAgICAgIDxzdHJvbmc+MCAtIDA8L3N0cm9uZz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjb250ZW50PlxuICAgICAgICAgICAgPHR1aS1kYXRhLWxpc3Qgc2l6ZT1cInNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInQtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2x5bW9ycGhldXNPdXRsZXQ9XCJzaXplT3B0aW9uQ29udGVudCBhcyB0ZXh0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCB0b3RhbDogdG90YWx9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXh0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbSA9PT0gc2l6ZTsgZWxzZSBmYWtlSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0LWNoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiY29tbW9uSWNvbnMuY2hlY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmYWtlSWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInQtY2hlY2ttYXJrXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3R1aS1kYXRhLWxpc3Q+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIHt7IHRleHRzLm9mIH19XG4gICAgICAgIDxzdHJvbmcgY2xhc3M9XCJ0LXN0cm9uZ1wiPnt7IHRvdGFsIH19PC9zdHJvbmc+XG4gICAgPC9zcGFuPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzcGluVGV4dHMkIHwgYXN5bmMgYXMgc3BpblRleHRzXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJpY29uXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidC1iYWNrXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsZWZ0RGlzYWJsZWRcIlxuICAgICAgICAgICAgW2ljb25TdGFydF09XCJpY29ucy5kZWNyZW1lbnRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImJhY2soKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IHNwaW5UZXh0c1swXSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cImljb25cIlxuICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJpZ2h0RGlzYWJsZWRcIlxuICAgICAgICAgICAgW2ljb25TdGFydF09XCJpY29ucy5pbmNyZW1lbnRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImZvcnRoKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBzcGluVGV4dHNbMV0gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==