UNPKG

@taiga-ui/core

Version:

Core library for creating Angular components and applications using Taiga UI

128 lines 30.8 kB
import { ChangeDetectionStrategy, Component, computed, EventEmitter, inject, Input, Output, signal, } from '@angular/core'; import { MAX_YEAR, MIN_YEAR, TuiDay, TuiMonth, TuiMonthRange, TuiYear, } from '@taiga-ui/cdk/date-time'; import { TuiHovered } from '@taiga-ui/cdk/directives/hovered'; import { TuiLet } from '@taiga-ui/cdk/directives/let'; import { TuiRepeatTimes } from '@taiga-ui/cdk/directives/repeat-times'; import { tuiIsNumber } from '@taiga-ui/cdk/utils/miscellaneous'; import { TuiScrollIntoView } from '@taiga-ui/core/components/scrollbar'; import { TUI_ITEMS_HANDLERS } from '@taiga-ui/core/directives'; import { tuiAsAuxiliary } from '@taiga-ui/core/tokens'; import * as i0 from "@angular/core"; const LIMIT = 100; const ITEMS_IN_ROW = 4; const CURRENT_YEAR = TuiMonth.currentLocal().year; class TuiCalendarYear { constructor() { this.hoveredItem = signal(null); this.isRangePicking = computed((x = this.value()) => this.rangeMode && (x instanceof TuiDay || x instanceof TuiMonth)); this.rangeMode = false; this.disabledItemHandler = inject(TUI_ITEMS_HANDLERS).disabledItemHandler(); this.yearClick = new EventEmitter(); this.initialItem = signal(CURRENT_YEAR); this.min = signal(MIN_YEAR); this.max = signal(MAX_YEAR); this.value = signal(null); } // TODO(v5): use signal inputs set initialItemSetter(x) { this.initialItem.set(x ?? CURRENT_YEAR); } // TODO(v5): use signal inputs set minSetter(x) { this.min.set(x); } // TODO(v5): use signal inputs set maxSetter(x) { this.max.set(x); } // TODO(v5): use signal inputs set valueSetter(x) { this.value.set(x); } isDisabled(item) { return ((this.max() && this.max() < item) || (this.min() && this.min() > item) || this.disabledItemHandler(item)); } getItemRange(item) { const value = this.value(); const hoveredItem = this.hoveredItem(); if (value instanceof TuiYear && value.year === item) { return 'active'; } if (tuiIsNumber(value)) { return value === item ? 'active' : null; } if (!(value instanceof TuiMonthRange) && !(value instanceof TuiYear)) { return value?.find((day) => day.year === item) ? 'active' : null; } const hovered = this.isRangePicking() ? hoveredItem : null; const from = 'from' in value ? value.from?.year : value.year; const to = 'from' in value ? value.to.year : value.year; const min = Math.min(from, hovered ?? to); const max = Math.max(from, hovered ?? to); if (min === max && from === to && from === item) { return 'active'; } if (min === item) { return 'start'; } if (max === item) { return 'end'; } return min < item && item < max ? 'middle' : null; } onItemHovered(hovered, item) { this.hoveredItem.set(hovered ? item : null); } get rows() { return Math.ceil((this.calculatedMax - this.calculatedMin) / ITEMS_IN_ROW); } scrollItemIntoView(item) { return this.initialItem() === item; } getItem(rowIndex, colIndex) { return rowIndex * ITEMS_IN_ROW + colIndex + this.calculatedMin; } itemIsToday(item) { return CURRENT_YEAR === item; } get calculatedMin() { const initial = this.initialItem() - LIMIT; const min = this.min() ?? MIN_YEAR; return min > initial ? min : initial; } get calculatedMax() { const initial = this.initialItem() + LIMIT; const max = this.max() ?? MAX_YEAR; return max < initial ? max + 1 : initial; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendarYear, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: TuiCalendarYear, isStandalone: true, selector: "tui-calendar-year", inputs: { rangeMode: "rangeMode", disabledItemHandler: "disabledItemHandler", initialItemSetter: ["initialItem", "initialItemSetter", (x) => x ?? CURRENT_YEAR], minSetter: ["min", "minSetter", (x) => x ?? MIN_YEAR], maxSetter: ["max", "maxSetter", (x) => x ?? MAX_YEAR], valueSetter: ["value", "valueSetter"] }, outputs: { yearClick: "yearClick" }, host: { properties: { "class._picking": "isRangePicking()" } }, providers: [tuiAsAuxiliary(TuiCalendarYear)], ngImport: i0, template: "<div\n *tuiRepeatTimes=\"let rowIndex of rows\"\n automation-id=\"tui-calendar-year__row\"\n class=\"t-row\"\n>\n <ng-container *tuiRepeatTimes=\"let colIndex of 4\">\n <div\n *tuiLet=\"getItem(rowIndex, colIndex) as item\"\n automation-id=\"tui-calendar-year__cell\"\n class=\"t-cell\"\n [attr.data-range]=\"getItemRange(item)\"\n [class.t-cell_disabled]=\"isDisabled(item)\"\n [class.t-cell_today]=\"itemIsToday(item)\"\n [tuiScrollIntoView]=\"scrollItemIntoView(item)\"\n (click)=\"yearClick.emit(item)\"\n (tuiHoveredChange)=\"onItemHovered($event, item)\"\n >\n {{ item }}\n </div>\n </ng-container>\n</div>\n", styles: [".t-row{display:flex;justify-content:flex-start;font:var(--tui-font-text-m)}.t-row:first-child{justify-content:flex-end}.t-row:last-child{justify-content:flex-start}.t-cell{position:relative;display:flex;align-items:center;justify-content:center;line-height:2rem;isolation:isolate;cursor:pointer;overflow:hidden;border:.125rem solid transparent;box-sizing:border-box;-webkit-mask:linear-gradient(transparent calc(50% - 1rem),#000 calc(50% - 1rem),#000 calc(50% + 1rem),transparent calc(50% + 1rem));mask:linear-gradient(transparent calc(50% - 1rem),#000 calc(50% - 1rem),#000 calc(50% + 1rem),transparent calc(50% + 1rem))}.t-cell:first-child{border-inline-start-color:transparent!important}.t-cell:last-child{border-inline-end-color:transparent!important}.t-cell:before,.t-cell:after{position:absolute;top:0;left:0;bottom:0;right:0;content:\"\";z-index:-1;border-radius:var(--tui-radius-m)}.t-cell:after{-webkit-mask:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 32\"><path d=\"M0.2856 0L0.6763 0C2.9265 0 4.9876 1.259 6.0147 3.2611L10.2442 11.5048C11.5301 14.0113 11.5683 16.9754 10.3472 19.5141L5.9766 28.6007C4.9772 30.6786 2.8754 32 0.5696 32H0.285645V0Z\"></path></svg>') right / .75rem 100% no-repeat,linear-gradient(#000,#000) left / calc(100% - .7rem) 100% no-repeat;mask:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 32\"><path d=\"M0.2856 0L0.6763 0C2.9265 0 4.9876 1.259 6.0147 3.2611L10.2442 11.5048C11.5301 14.0113 11.5683 16.9754 10.3472 19.5141L5.9766 28.6007C4.9772 30.6786 2.8754 32 0.5696 32H0.285645V0Z\"></path></svg>') right / .75rem 100% no-repeat,linear-gradient(#000,#000) left / calc(100% - .7rem) 100% no-repeat}.t-cell[data-range]:before{background:var(--tui-background-neutral-1)}:host._picking .t-cell[data-range]:before{background:var(--tui-background-neutral-1-hover)}.t-cell[data-range=middle]{border-color:var(--tui-background-neutral-1)}:host._picking .t-cell[data-range=middle]{border-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=middle]:not(:first-child):before{border-top-left-radius:0;border-bottom-left-radius:0}.t-cell[data-range=middle]:not(:last-child):before{border-top-right-radius:0;border-bottom-right-radius:0}.t-cell[data-range=start]{border-inline-end-color:var(--tui-background-neutral-1);color:var(--tui-text-primary-on-accent-1)}:host._picking .t-cell[data-range=start]{border-inline-end-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=start]:not(:last-child):before{right:-1rem}.t-cell[data-range=start]:after{background:var(--tui-background-accent-1)}.t-cell[data-range=end]{border-inline-start-color:var(--tui-background-neutral-1);color:var(--tui-text-primary-on-accent-1)}:host._picking .t-cell[data-range=end]{border-inline-start-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=end]:not(:first-child):before{left:-1rem}.t-cell[data-range=end]:after{background:var(--tui-background-accent-1);transform:scaleX(-1)}.t-cell[data-range=active]{color:var(--tui-text-primary-on-accent-1)}.t-cell[data-range=active]:after{background:var(--tui-background-accent-1);-webkit-mask:none;mask:none}.t-cell_disabled{opacity:var(--tui-disabled-opacity);pointer-events:none}.t-cell_today{text-decoration:underline;text-underline-offset:.25rem}@media (hover: hover) and (pointer: fine){.t-cell:hover:not([data-range=start]):not([data-range=end]):before{background:var(--tui-background-neutral-1-hover)}.t-cell[data-range=start]:hover:after,.t-cell[data-range=end]:hover:after,.t-cell[data-range=active]:hover:after{background:var(--tui-background-accent-1-hover)}}:host{display:block;padding-inline-end:1rem;inline-size:15.75rem;padding:0 1.125rem}.t-cell{flex:1;border-block-start-width:.5rem;border-block-end-width:.5rem}\n"], dependencies: [{ kind: "directive", type: TuiHovered, selector: "[tuiHoveredChange]", outputs: ["tuiHoveredChange"] }, { kind: "directive", type: TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }, { kind: "directive", type: TuiScrollIntoView, selector: "[tuiScrollIntoView]", inputs: ["tuiScrollIntoView"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiCalendarYear }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendarYear, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-calendar-year', imports: [TuiHovered, TuiLet, TuiRepeatTimes, TuiScrollIntoView], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiAsAuxiliary(TuiCalendarYear)], host: { '[class._picking]': 'isRangePicking()', }, template: "<div\n *tuiRepeatTimes=\"let rowIndex of rows\"\n automation-id=\"tui-calendar-year__row\"\n class=\"t-row\"\n>\n <ng-container *tuiRepeatTimes=\"let colIndex of 4\">\n <div\n *tuiLet=\"getItem(rowIndex, colIndex) as item\"\n automation-id=\"tui-calendar-year__cell\"\n class=\"t-cell\"\n [attr.data-range]=\"getItemRange(item)\"\n [class.t-cell_disabled]=\"isDisabled(item)\"\n [class.t-cell_today]=\"itemIsToday(item)\"\n [tuiScrollIntoView]=\"scrollItemIntoView(item)\"\n (click)=\"yearClick.emit(item)\"\n (tuiHoveredChange)=\"onItemHovered($event, item)\"\n >\n {{ item }}\n </div>\n </ng-container>\n</div>\n", styles: [".t-row{display:flex;justify-content:flex-start;font:var(--tui-font-text-m)}.t-row:first-child{justify-content:flex-end}.t-row:last-child{justify-content:flex-start}.t-cell{position:relative;display:flex;align-items:center;justify-content:center;line-height:2rem;isolation:isolate;cursor:pointer;overflow:hidden;border:.125rem solid transparent;box-sizing:border-box;-webkit-mask:linear-gradient(transparent calc(50% - 1rem),#000 calc(50% - 1rem),#000 calc(50% + 1rem),transparent calc(50% + 1rem));mask:linear-gradient(transparent calc(50% - 1rem),#000 calc(50% - 1rem),#000 calc(50% + 1rem),transparent calc(50% + 1rem))}.t-cell:first-child{border-inline-start-color:transparent!important}.t-cell:last-child{border-inline-end-color:transparent!important}.t-cell:before,.t-cell:after{position:absolute;top:0;left:0;bottom:0;right:0;content:\"\";z-index:-1;border-radius:var(--tui-radius-m)}.t-cell:after{-webkit-mask:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 32\"><path d=\"M0.2856 0L0.6763 0C2.9265 0 4.9876 1.259 6.0147 3.2611L10.2442 11.5048C11.5301 14.0113 11.5683 16.9754 10.3472 19.5141L5.9766 28.6007C4.9772 30.6786 2.8754 32 0.5696 32H0.285645V0Z\"></path></svg>') right / .75rem 100% no-repeat,linear-gradient(#000,#000) left / calc(100% - .7rem) 100% no-repeat;mask:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 32\"><path d=\"M0.2856 0L0.6763 0C2.9265 0 4.9876 1.259 6.0147 3.2611L10.2442 11.5048C11.5301 14.0113 11.5683 16.9754 10.3472 19.5141L5.9766 28.6007C4.9772 30.6786 2.8754 32 0.5696 32H0.285645V0Z\"></path></svg>') right / .75rem 100% no-repeat,linear-gradient(#000,#000) left / calc(100% - .7rem) 100% no-repeat}.t-cell[data-range]:before{background:var(--tui-background-neutral-1)}:host._picking .t-cell[data-range]:before{background:var(--tui-background-neutral-1-hover)}.t-cell[data-range=middle]{border-color:var(--tui-background-neutral-1)}:host._picking .t-cell[data-range=middle]{border-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=middle]:not(:first-child):before{border-top-left-radius:0;border-bottom-left-radius:0}.t-cell[data-range=middle]:not(:last-child):before{border-top-right-radius:0;border-bottom-right-radius:0}.t-cell[data-range=start]{border-inline-end-color:var(--tui-background-neutral-1);color:var(--tui-text-primary-on-accent-1)}:host._picking .t-cell[data-range=start]{border-inline-end-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=start]:not(:last-child):before{right:-1rem}.t-cell[data-range=start]:after{background:var(--tui-background-accent-1)}.t-cell[data-range=end]{border-inline-start-color:var(--tui-background-neutral-1);color:var(--tui-text-primary-on-accent-1)}:host._picking .t-cell[data-range=end]{border-inline-start-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=end]:not(:first-child):before{left:-1rem}.t-cell[data-range=end]:after{background:var(--tui-background-accent-1);transform:scaleX(-1)}.t-cell[data-range=active]{color:var(--tui-text-primary-on-accent-1)}.t-cell[data-range=active]:after{background:var(--tui-background-accent-1);-webkit-mask:none;mask:none}.t-cell_disabled{opacity:var(--tui-disabled-opacity);pointer-events:none}.t-cell_today{text-decoration:underline;text-underline-offset:.25rem}@media (hover: hover) and (pointer: fine){.t-cell:hover:not([data-range=start]):not([data-range=end]):before{background:var(--tui-background-neutral-1-hover)}.t-cell[data-range=start]:hover:after,.t-cell[data-range=end]:hover:after,.t-cell[data-range=active]:hover:after{background:var(--tui-background-accent-1-hover)}}:host{display:block;padding-inline-end:1rem;inline-size:15.75rem;padding:0 1.125rem}.t-cell{flex:1;border-block-start-width:.5rem;border-block-end-width:.5rem}\n"] }] }], propDecorators: { rangeMode: [{ type: Input }], disabledItemHandler: [{ type: Input }], yearClick: [{ type: Output }], initialItemSetter: [{ type: Input, args: [{ alias: 'initialItem', transform: (x) => x ?? CURRENT_YEAR }] }], minSetter: [{ type: Input, args: [{ alias: 'min', transform: (x) => x ?? MIN_YEAR }] }], maxSetter: [{ type: Input, args: [{ alias: 'max', transform: (x) => x ?? MAX_YEAR }] }], valueSetter: [{ type: Input, args: ['value'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIteWVhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIteWVhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NvbXBvbmVudHMvY2FsZW5kYXIvY2FsZW5kYXIteWVhci50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFFTixRQUFRLEVBQ1IsYUFBYSxFQUNiLE9BQU8sR0FDVixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUM1RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRXJFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUM5RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7O0FBRXJELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUNsQixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDdkIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQztBQUVsRCxNQVlhLGVB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SERjYyxVQUFVLDhGQUFFLE1BQU0seUVBQUUsY0FBYyw2R0FBRSxpQkFBaUI7O1NBU3RELGVBQWU7NEZBQWYsZUFBZTtrQkFaM0IsU0FBUztpQ0FDTSxJQUFJLFlBQ04sbUJBQW1CLFdBQ3BCLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLENBQUMsbUJBRy9DLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxjQUFjLGlCQUFpQixDQUFDLFFBQ3RDO3dCQUNGLGtCQUFrQixFQUFFLGtCQUFrQjtxQkFDekM7OEJBV00sU0FBUztzQkFEZixLQUFLO2dCQUlDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFLVSxTQUFTO3NCQUR4QixNQUFNO2dCQVlJLGlCQUFpQjtzQkFEM0IsS0FBSzt1QkFBQyxFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLFlBQVksRUFBQztnQkFPdEUsU0FBUztzQkFEbkIsS0FBSzt1QkFBQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBQztnQkFPMUQsU0FBUztzQkFEbkIsS0FBSzt1QkFBQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBQztnQkFPMUQsV0FBVztzQkFEckIsS0FBSzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgTUFYX1lFQVIsXG4gICAgTUlOX1lFQVIsXG4gICAgVHVpRGF5LFxuICAgIHR5cGUgVHVpRGF5UmFuZ2UsXG4gICAgVHVpTW9udGgsXG4gICAgVHVpTW9udGhSYW5nZSxcbiAgICBUdWlZZWFyLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RhdGUtdGltZSc7XG5pbXBvcnQge1R1aUhvdmVyZWR9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGlyZWN0aXZlcy9ob3ZlcmVkJztcbmltcG9ydCB7VHVpTGV0fSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvbGV0JztcbmltcG9ydCB7VHVpUmVwZWF0VGltZXN9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGlyZWN0aXZlcy9yZXBlYXQtdGltZXMnO1xuaW1wb3J0IHt0eXBlIFR1aUJvb2xlYW5IYW5kbGVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3R5cGVzJztcbmltcG9ydCB7dHVpSXNOdW1iZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5pbXBvcnQge1R1aVNjcm9sbEludG9WaWV3fSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL3Njcm9sbGJhcic7XG5pbXBvcnQge1RVSV9JVEVNU19IQU5ETEVSU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcyc7XG5pbXBvcnQge3R1aUFzQXV4aWxpYXJ5fSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuXG5jb25zdCBMSU1JVCA9IDEwMDtcbmNvbnN0IElURU1TX0lOX1JPVyA9IDQ7XG5jb25zdCBDVVJSRU5UX1lFQVIgPSBUdWlNb250aC5jdXJyZW50TG9jYWwoKS55ZWFyO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLWNhbGVuZGFyLXllYXInLFxuICAgIGltcG9ydHM6IFtUdWlIb3ZlcmVkLCBUdWlMZXQsIFR1aVJlcGVhdFRpbWVzLCBUdWlTY3JvbGxJbnRvVmlld10sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLXllYXIudGVtcGxhdGUuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIteWVhci5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbdHVpQXNBdXhpbGlhcnkoVHVpQ2FsZW5kYXJZZWFyKV0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLl9waWNraW5nXSc6ICdpc1JhbmdlUGlja2luZygpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlDYWxlbmRhclllYXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaG92ZXJlZEl0ZW0gPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNSYW5nZVBpY2tpbmcgPSBjb21wdXRlZChcbiAgICAgICAgKHggPSB0aGlzLnZhbHVlKCkpID0+XG4gICAgICAgICAgICB0aGlzLnJhbmdlTW9kZSAmJiAoeCBpbnN0YW5jZW9mIFR1aURheSB8fCB4IGluc3RhbmNlb2YgVHVpTW9udGgpLFxuICAgICk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByYW5nZU1vZGUgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpc2FibGVkSXRlbUhhbmRsZXI6IFR1aUJvb2xlYW5IYW5kbGVyPG51bWJlcj4gPVxuICAgICAgICBpbmplY3QoVFVJX0lURU1TX0hBTkRMRVJTKS5kaXNhYmxlZEl0ZW1IYW5kbGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgeWVhckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgaW5pdGlhbEl0ZW0gPSBzaWduYWw8bnVtYmVyPihDVVJSRU5UX1lFQVIpO1xuICAgIHB1YmxpYyByZWFkb25seSBtaW4gPSBzaWduYWwoTUlOX1lFQVIpO1xuICAgIHB1YmxpYyByZWFkb25seSBtYXggPSBzaWduYWwoTUFYX1lFQVIpO1xuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZSA9IHNpZ25hbDxcbiAgICAgICAgVHVpRGF5UmFuZ2UgfCBUdWlNb250aFJhbmdlIHwgVHVpWWVhciB8IG51bWJlciB8IHJlYWRvbmx5IFR1aURheVtdIHwgbnVsbFxuICAgID4obnVsbCk7XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dHNcbiAgICBASW5wdXQoe2FsaWFzOiAnaW5pdGlhbEl0ZW0nLCB0cmFuc2Zvcm06ICh4OiBudW1iZXIgfCBudWxsKSA9PiB4ID8/IENVUlJFTlRfWUVBUn0pXG4gICAgcHVibGljIHNldCBpbml0aWFsSXRlbVNldHRlcih4OiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbEl0ZW0uc2V0KHggPz8gQ1VSUkVOVF9ZRUFSKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dHNcbiAgICBASW5wdXQoe2FsaWFzOiAnbWluJywgdHJhbnNmb3JtOiAoeDogbnVtYmVyIHwgbnVsbCkgPT4geCA/PyBNSU5fWUVBUn0pXG4gICAgcHVibGljIHNldCBtaW5TZXR0ZXIoeDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubWluLnNldCh4KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dHNcbiAgICBASW5wdXQoe2FsaWFzOiAnbWF4JywgdHJhbnNmb3JtOiAoeDogbnVtYmVyIHwgbnVsbCkgPT4geCA/PyBNQVhfWUVBUn0pXG4gICAgcHVibGljIHNldCBtYXhTZXR0ZXIoeDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubWF4LnNldCh4KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dHNcbiAgICBASW5wdXQoJ3ZhbHVlJylcbiAgICBwdWJsaWMgc2V0IHZhbHVlU2V0dGVyKFxuICAgICAgICB4OiBUdWlEYXlSYW5nZSB8IFR1aU1vbnRoUmFuZ2UgfCBUdWlZZWFyIHwgbnVtYmVyIHwgcmVhZG9ubHkgVHVpRGF5W10gfCBudWxsLFxuICAgICkge1xuICAgICAgICB0aGlzLnZhbHVlLnNldCh4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNEaXNhYmxlZChpdGVtOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0aGlzLm1heCgpICYmIHRoaXMubWF4KCkgPCBpdGVtKSB8fFxuICAgICAgICAgICAgKHRoaXMubWluKCkgJiYgdGhpcy5taW4oKSA+IGl0ZW0pIHx8XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkSXRlbUhhbmRsZXIoaXRlbSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbVJhbmdlKGl0ZW06IG51bWJlcik6ICdhY3RpdmUnIHwgJ2VuZCcgfCAnbWlkZGxlJyB8ICdzdGFydCcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGhvdmVyZWRJdGVtID0gdGhpcy5ob3ZlcmVkSXRlbSgpO1xuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFR1aVllYXIgJiYgdmFsdWUueWVhciA9PT0gaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuICdhY3RpdmUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR1aUlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBpdGVtID8gJ2FjdGl2ZScgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBUdWlNb250aFJhbmdlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgVHVpWWVhcikpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZT8uZmluZCgoZGF5KSA9PiBkYXkueWVhciA9PT0gaXRlbSkgPyAnYWN0aXZlJyA6IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob3ZlcmVkID0gdGhpcy5pc1JhbmdlUGlja2luZygpID8gaG92ZXJlZEl0ZW0gOiBudWxsO1xuICAgICAgICBjb25zdCBmcm9tID0gJ2Zyb20nIGluIHZhbHVlID8gdmFsdWUuZnJvbT8ueWVhciA6IHZhbHVlLnllYXI7XG4gICAgICAgIGNvbnN0IHRvID0gJ2Zyb20nIGluIHZhbHVlID8gdmFsdWUudG8ueWVhciA6IHZhbHVlLnllYXI7XG5cbiAgICAgICAgY29uc3QgbWluID0gTWF0aC5taW4oZnJvbSwgaG92ZXJlZCA/PyB0byk7XG4gICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KGZyb20sIGhvdmVyZWQgPz8gdG8pO1xuXG4gICAgICAgIGlmIChtaW4gPT09IG1heCAmJiBmcm9tID09PSB0byAmJiBmcm9tID09PSBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWluID09PSBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3N0YXJ0JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXggPT09IGl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiAnZW5kJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaW4gPCBpdGVtICYmIGl0ZW0gPCBtYXggPyAnbWlkZGxlJyA6IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSXRlbUhvdmVyZWQoaG92ZXJlZDogYm9vbGVhbiwgaXRlbTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW0uc2V0KGhvdmVyZWQgPyBpdGVtIDogbnVsbCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCByb3dzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoKHRoaXMuY2FsY3VsYXRlZE1heCAtIHRoaXMuY2FsY3VsYXRlZE1pbikgLyBJVEVNU19JTl9ST1cpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzY3JvbGxJdGVtSW50b1ZpZXcoaXRlbTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxJdGVtKCkgPT09IGl0ZW07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldEl0ZW0ocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiByb3dJbmRleCAqIElURU1TX0lOX1JPVyArIGNvbEluZGV4ICsgdGhpcy5jYWxjdWxhdGVkTWluO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpdGVtSXNUb2RheShpdGVtOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIENVUlJFTlRfWUVBUiA9PT0gaXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBjYWxjdWxhdGVkTWluKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSB0aGlzLmluaXRpYWxJdGVtKCkgLSBMSU1JVDtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKSA/PyBNSU5fWUVBUjtcblxuICAgICAgICByZXR1cm4gbWluID4gaW5pdGlhbCA/IG1pbiA6IGluaXRpYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgY2FsY3VsYXRlZE1heCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpbml0aWFsID0gdGhpcy5pbml0aWFsSXRlbSgpICsgTElNSVQ7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCkgPz8gTUFYX1lFQVI7XG5cbiAgICAgICAgcmV0dXJuIG1heCA8IGluaXRpYWwgPyBtYXggKyAxIDogaW5pdGlhbDtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgKnR1aVJlcGVhdFRpbWVzPVwibGV0IHJvd0luZGV4IG9mIHJvd3NcIlxuICAgIGF1dG9tYXRpb24taWQ9XCJ0dWktY2FsZW5kYXIteWVhcl9fcm93XCJcbiAgICBjbGFzcz1cInQtcm93XCJcbj5cbiAgICA8bmctY29udGFpbmVyICp0dWlSZXBlYXRUaW1lcz1cImxldCBjb2xJbmRleCBvZiA0XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICp0dWlMZXQ9XCJnZXRJdGVtKHJvd0luZGV4LCBjb2xJbmRleCkgYXMgaXRlbVwiXG4gICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLXllYXJfX2NlbGxcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0LWNlbGxcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1yYW5nZV09XCJnZXRJdGVtUmFuZ2UoaXRlbSlcIlxuICAgICAgICAgICAgW2NsYXNzLnQtY2VsbF9kaXNhYmxlZF09XCJpc0Rpc2FibGVkKGl0ZW0pXCJcbiAgICAgICAgICAgIFtjbGFzcy50LWNlbGxfdG9kYXldPVwiaXRlbUlzVG9kYXkoaXRlbSlcIlxuICAgICAgICAgICAgW3R1aVNjcm9sbEludG9WaWV3XT1cInNjcm9sbEl0ZW1JbnRvVmlldyhpdGVtKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwieWVhckNsaWNrLmVtaXQoaXRlbSlcIlxuICAgICAgICAgICAgKHR1aUhvdmVyZWRDaGFuZ2UpPVwib25JdGVtSG92ZXJlZCgkZXZlbnQsIGl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgaXRlbSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19