UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

97 lines 20 kB
import { NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, inject, Input, signal, ViewChildren, } from '@angular/core'; import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop'; import { FormsModule } from '@angular/forms'; import { WaMutationObserverService, WA_MUTATION_OBSERVER_INIT, } from '@ng-web-apis/mutation-observer'; import { TuiRepeatTimes } from '@taiga-ui/cdk/directives/repeat-times'; import { tuiWatch } from '@taiga-ui/cdk/observables'; import { delay, map } from 'rxjs'; import * as i0 from "@angular/core"; class TuiPager { constructor() { this.start = 0; this.end = 0; this.left = signal(0); this.maxWidth = toSignal(inject(WaMutationObserverService, { self: true }).pipe(delay(0), map(() => this.visibleWidth), tuiWatch(), takeUntilDestroyed()), { initialValue: 0 }); this.max = 6; this.count = this.max; this.size = 'm'; this.index = 0; } ngOnChanges() { this.move(); } ngAfterViewInit() { this.move(); } get gap() { return this.size === 'm' ? 9 : 7; } get visibleRange() { const max = this.max > this.count ? this.count : this.max; const start = Math.min(Math.max(this.index - Math.floor(max / 2), 0), this.count - max); return [start, start + (max - 1)]; } get visibleWidth() { return ((this.items?.map((item) => item.nativeElement.offsetWidth ?? 0) ?? []) .slice(this.start, this.end + 1) .reduce((sum, item) => sum + item + this.gap, 0) - this.gap); } move() { const [start, end] = this.visibleRange; this.start = start; this.end = end; let left = this.start * this.gap; for (let i = 0; i < this.start; i++) { left += this.items?.get(i)?.nativeElement.offsetWidth ?? 0; } this.left.set(-1 * left); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPager, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiPager, isStandalone: true, selector: "tui-pager", inputs: { max: "max", count: "count", size: "size", valueContent: "valueContent", index: "index" }, host: { properties: { "attr.data-size": "size", "style.--t-gap.px": "gap", "style.max-width.px": "maxWidth()" } }, providers: [ WaMutationObserverService, { provide: WA_MUTATION_OBSERVER_INIT, useValue: { attributeOldValue: true, characterData: true, childList: true, subtree: true, }, }, ], viewQueries: [{ propertyName: "items", predicate: ["item"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"t-items\"\n [style.transform]=\"'translateX(calc(var(--tui-inline) * ' + left() + 'px))'\"\n>\n <div\n *tuiRepeatTimes=\"let i of count\"\n #item\n class=\"t-item\"\n [attr.data-index]=\"i\"\n [class._active]=\"i === index\"\n [class._last]=\"i === count - 1\"\n [class._post-active]=\"i === index + 1\"\n [class._pre-active]=\"i === index - 1\"\n [class._pre-last]=\"i === count - 2\"\n [class._visible]=\"i >= start && i <= end\"\n >\n <ng-container *ngTemplateOutlet=\"valueContent || null; context: {$implicit: i}\" />\n </div>\n</div>\n", styles: [":host{display:flex;align-items:center;overflow:hidden}:host[data-size=m]{--t-size: .5rem;--t-small-dot: scale(.75);--t-super-small-dot: scale(.5);--t-icon-size: 1rem;min-block-size:1.25rem}:host-context(tui-root._mobile) :host[data-size=m]{--t-icon-size: .875rem}:host[data-size=s]{--t-size: .375rem;--t-small-dot: scale(.666);--t-super-small-dot: scale(.333);--t-icon-size: .75rem;min-block-size:1rem}:host-context(tui-root._mobile) :host[data-size=s]{--t-icon-size: .6875rem}.t-items{display:flex;gap:var(--t-gap);transition:transform var(--tui-duration-fast, .15s) var(--tui-curve-productive-standard, cubic-bezier(.2, 0, .4, .9))}.t-item{display:flex;align-self:center;align-items:center;justify-content:center;color:var(--tui-background-neutral-2)}.t-item._active{color:var(--tui-background-accent-1)}.t-item:empty:before{content:\"\";display:flex;min-inline-size:var(--t-size);min-block-size:var(--t-size);border-radius:100%;background:currentColor;transition:inherit}.t-item:empty:not(._visible):before,.t-item:empty:not(._visible)+.t-item:not(._active):not(._pre-active):empty:before,.t-item:empty:not(._last):not(._post-active):not(._active):nth-last-child(1 of._visible):before{transform:var(--t-super-small-dot)!important}.t-item:empty:not(._last)._post-active:nth-last-child(1 of._visible):before,.t-item:empty:not(._visible)+.t-item._pre-active:empty:before,.t-item:empty:not(._visible)+.t-item:empty+.t-item:not(._active):empty:before,.t-item:empty:not(._pre-last):nth-last-child(2 of._visible):not(._active):before{transform:var(--t-small-dot)}.t-item:empty+.t-item:not(:empty)._pre-last{transform:scale(.64)}.t-item:empty+.t-item:not(:empty)._pre-last:nth-last-child(2 of._visible){transform:scale(1)}.t-item::ng-deep>tui-icon{inline-size:var(--t-icon-size);block-size:var(--t-icon-size)}.t-item,.t-item::ng-deep>tui-icon{transition:all var(--tui-duration-fast, .15s) var(--tui-curve-productive-standard, cubic-bezier(.2, 0, .4, .9))}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiPager }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPager, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-pager', imports: [FormsModule, NgTemplateOutlet, TuiRepeatTimes], changeDetection: ChangeDetectionStrategy.OnPush, providers: [ WaMutationObserverService, { provide: WA_MUTATION_OBSERVER_INIT, useValue: { attributeOldValue: true, characterData: true, childList: true, subtree: true, }, }, ], host: { '[attr.data-size]': 'size', '[style.--t-gap.px]': 'gap', '[style.max-width.px]': 'maxWidth()', }, template: "<div\n class=\"t-items\"\n [style.transform]=\"'translateX(calc(var(--tui-inline) * ' + left() + 'px))'\"\n>\n <div\n *tuiRepeatTimes=\"let i of count\"\n #item\n class=\"t-item\"\n [attr.data-index]=\"i\"\n [class._active]=\"i === index\"\n [class._last]=\"i === count - 1\"\n [class._post-active]=\"i === index + 1\"\n [class._pre-active]=\"i === index - 1\"\n [class._pre-last]=\"i === count - 2\"\n [class._visible]=\"i >= start && i <= end\"\n >\n <ng-container *ngTemplateOutlet=\"valueContent || null; context: {$implicit: i}\" />\n </div>\n</div>\n", styles: [":host{display:flex;align-items:center;overflow:hidden}:host[data-size=m]{--t-size: .5rem;--t-small-dot: scale(.75);--t-super-small-dot: scale(.5);--t-icon-size: 1rem;min-block-size:1.25rem}:host-context(tui-root._mobile) :host[data-size=m]{--t-icon-size: .875rem}:host[data-size=s]{--t-size: .375rem;--t-small-dot: scale(.666);--t-super-small-dot: scale(.333);--t-icon-size: .75rem;min-block-size:1rem}:host-context(tui-root._mobile) :host[data-size=s]{--t-icon-size: .6875rem}.t-items{display:flex;gap:var(--t-gap);transition:transform var(--tui-duration-fast, .15s) var(--tui-curve-productive-standard, cubic-bezier(.2, 0, .4, .9))}.t-item{display:flex;align-self:center;align-items:center;justify-content:center;color:var(--tui-background-neutral-2)}.t-item._active{color:var(--tui-background-accent-1)}.t-item:empty:before{content:\"\";display:flex;min-inline-size:var(--t-size);min-block-size:var(--t-size);border-radius:100%;background:currentColor;transition:inherit}.t-item:empty:not(._visible):before,.t-item:empty:not(._visible)+.t-item:not(._active):not(._pre-active):empty:before,.t-item:empty:not(._last):not(._post-active):not(._active):nth-last-child(1 of._visible):before{transform:var(--t-super-small-dot)!important}.t-item:empty:not(._last)._post-active:nth-last-child(1 of._visible):before,.t-item:empty:not(._visible)+.t-item._pre-active:empty:before,.t-item:empty:not(._visible)+.t-item:empty+.t-item:not(._active):empty:before,.t-item:empty:not(._pre-last):nth-last-child(2 of._visible):not(._active):before{transform:var(--t-small-dot)}.t-item:empty+.t-item:not(:empty)._pre-last{transform:scale(.64)}.t-item:empty+.t-item:not(:empty)._pre-last:nth-last-child(2 of._visible){transform:scale(1)}.t-item::ng-deep>tui-icon{inline-size:var(--t-icon-size);block-size:var(--t-icon-size)}.t-item,.t-item::ng-deep>tui-icon{transition:all var(--tui-duration-fast, .15s) var(--tui-curve-productive-standard, cubic-bezier(.2, 0, .4, .9))}\n"] }] }], propDecorators: { items: [{ type: ViewChildren, args: ['item'] }], max: [{ type: Input }], count: [{ type: Input }], size: [{ type: Input }], valueContent: [{ type: Input }], index: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvcGFnZXIvcGFnZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvcGFnZXIvcGFnZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUNILHlCQUF5QixFQUN6Qix5QkFBeUIsR0FDNUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUVoQyxNQXlCYSxRQUFRO0lBekJyQjtRQTZCYyxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsUUFBRyxHQUFHLENBQUMsQ0FBQztRQUNSLFNBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixhQUFRLEdBQUcsUUFBUSxDQUNsQyxNQUFNLENBQUMseUJBQXlCLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2hELEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDUixHQUFHLENB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QUUsSUFBSTtvQkFDZixPQUFPLEVBQUUsSUFBSTtpQkFDaEI7YUFDSjtTQUNKLGlJQzNDTCwwb0JBbUJBLHk5RERTYyxXQUFXLCtCQUFFLGdCQUFnQixvSkFBRSxjQUFjOztTQXNCOUMsUUFBUTs0RkFBUixRQUFRO2tCQXpCcEIsU0FBUztpQ0FDTSxJQUFJLFlBQ04sV0FBVyxXQUNaLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxtQkFHdkMsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDUCx5QkFBeUI7d0JBQ3pCOzRCQUNJLE9BQU8sRUFBRSx5QkFBeUI7NEJBQ2xDLFFBQVEsRUFBRTtnQ0FDTixpQkFBaUIsRUFBRSxJQUFJO2dDQUN2QixhQUFhLEVBQUUsSUFBSTtnQ0FDbkIsU0FBUyxFQUFFLElBQUk7Z0NBQ2YsT0FBTyxFQUFFLElBQUk7NkJBQ2hCO3lCQUNKO3FCQUNKLFFBQ0s7d0JBQ0Ysa0JBQWtCLEVBQUUsTUFBTTt3QkFDMUIsb0JBQW9CLEVBQUUsS0FBSzt3QkFDM0Isc0JBQXNCLEVBQUUsWUFBWTtxQkFDdkM7OEJBSVMsS0FBSztzQkFEZCxZQUFZO3VCQUFDLE1BQU07Z0JBaUJiLEdBQUc7c0JBRFQsS0FBSztnQkFJQyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsS0FBSztzQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICB0eXBlIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIHR5cGUgRWxlbWVudFJlZixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgdHlwZSBPbkNoYW5nZXMsXG4gICAgdHlwZSBRdWVyeUxpc3QsXG4gICAgc2lnbmFsLFxuICAgIHR5cGUgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b1NpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBXYU11dGF0aW9uT2JzZXJ2ZXJTZXJ2aWNlLFxuICAgIFdBX01VVEFUSU9OX09CU0VSVkVSX0lOSVQsXG59IGZyb20gJ0BuZy13ZWItYXBpcy9tdXRhdGlvbi1vYnNlcnZlcic7XG5pbXBvcnQge1R1aVJlcGVhdFRpbWVzfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvcmVwZWF0LXRpbWVzJztcbmltcG9ydCB7dHVpV2F0Y2h9IGZyb20gJ0B0YWlnYS11aS9jZGsvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHt0eXBlIFR1aVNpemVTfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90eXBlcyc7XG5pbXBvcnQge2RlbGF5LCBtYXB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLXBhZ2VyJyxcbiAgICBpbXBvcnRzOiBbRm9ybXNNb2R1bGUsIE5nVGVtcGxhdGVPdXRsZXQsIFR1aVJlcGVhdFRpbWVzXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcGFnZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3BhZ2VyLnN0eWxlcy5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIFdhTXV0YXRpb25PYnNlcnZlclNlcnZpY2UsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFdBX01VVEFUSU9OX09CU0VSVkVSX0lOSVQsXG4gICAgICAgICAgICB1c2VWYWx1ZToge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU9sZFZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuZGF0YS1zaXplXSc6ICdzaXplJyxcbiAgICAgICAgJ1tzdHlsZS4tLXQtZ2FwLnB4XSc6ICdnYXAnLFxuICAgICAgICAnW3N0eWxlLm1heC13aWR0aC5weF0nOiAnbWF4V2lkdGgoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpUGFnZXIgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICAgIEBWaWV3Q2hpbGRyZW4oJ2l0ZW0nKVxuICAgIHByb3RlY3RlZCBpdGVtcz86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XG5cbiAgICBwcm90ZWN0ZWQgc3RhcnQgPSAwO1xuICAgIHByb3RlY3RlZCBlbmQgPSAwO1xuICAgIHByb3RlY3RlZCBsZWZ0ID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhXaWR0aCA9IHRvU2lnbmFsKFxuICAgICAgICBpbmplY3QoV2FNdXRhdGlvbk9ic2VydmVyU2VydmljZSwge3NlbGY6IHRydWV9KS5waXBlKFxuICAgICAgICAgICAgZGVsYXkoMCksXG4gICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy52aXNpYmxlV2lkdGgpLFxuICAgICAgICAgICAgdHVpV2F0Y2goKSxcbiAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICApLFxuICAgICAgICB7aW5pdGlhbFZhbHVlOiAwfSxcbiAgICApO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4ID0gNjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvdW50ID0gdGhpcy5tYXg7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaXplOiBUdWlTaXplUyA9ICdtJztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbHVlQ29udGVudD86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaW5kZXggPSAwO1xuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vdmUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vdmUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGdhcCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplID09PSAnbScgPyA5IDogNztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCB2aXNpYmxlUmFuZ2UoKTogW3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4ID4gdGhpcy5jb3VudCA/IHRoaXMuY291bnQgOiB0aGlzLm1heDtcblxuICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKFxuICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5pbmRleCAtIE1hdGguZmxvb3IobWF4IC8gMiksIDApLFxuICAgICAgICAgICAgdGhpcy5jb3VudCAtIG1heCxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gW3N0YXJ0LCBzdGFydCArIChtYXggLSAxKV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgdmlzaWJsZVdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodGhpcy5pdGVtcz8ubWFwKChpdGVtKSA9PiBpdGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPz8gMCkgPz8gW10pXG4gICAgICAgICAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMuZW5kICsgMSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChzdW0sIGl0ZW0pID0+IHN1bSArIGl0ZW0gKyB0aGlzLmdhcCwgMCkgLSB0aGlzLmdhcFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gdGhpcy52aXNpYmxlUmFuZ2U7XG5cbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcblxuICAgICAgICBsZXQgbGVmdCA9IHRoaXMuc3RhcnQgKiB0aGlzLmdhcDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhcnQ7IGkrKykge1xuICAgICAgICAgICAgbGVmdCArPSB0aGlzLml0ZW1zPy5nZXQoaSk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPz8gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGVmdC5zZXQoLTEgKiBsZWZ0KTtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgY2xhc3M9XCJ0LWl0ZW1zXCJcbiAgICBbc3R5bGUudHJhbnNmb3JtXT1cIid0cmFuc2xhdGVYKGNhbGModmFyKC0tdHVpLWlubGluZSkgKiAnICsgbGVmdCgpICsgJ3B4KSknXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgICp0dWlSZXBlYXRUaW1lcz1cImxldCBpIG9mIGNvdW50XCJcbiAgICAgICAgI2l0ZW1cbiAgICAgICAgY2xhc3M9XCJ0LWl0ZW1cIlxuICAgICAgICBbYXR0ci5kYXRhLWluZGV4XT1cImlcIlxuICAgICAgICBbY2xhc3MuX2FjdGl2ZV09XCJpID09PSBpbmRleFwiXG4gICAgICAgIFtjbGFzcy5fbGFzdF09XCJpID09PSBjb3VudCAtIDFcIlxuICAgICAgICBbY2xhc3MuX3Bvc3QtYWN0aXZlXT1cImkgPT09IGluZGV4ICsgMVwiXG4gICAgICAgIFtjbGFzcy5fcHJlLWFjdGl2ZV09XCJpID09PSBpbmRleCAtIDFcIlxuICAgICAgICBbY2xhc3MuX3ByZS1sYXN0XT1cImkgPT09IGNvdW50IC0gMlwiXG4gICAgICAgIFtjbGFzcy5fdmlzaWJsZV09XCJpID49IHN0YXJ0ICYmIGkgPD0gZW5kXCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ2YWx1ZUNvbnRlbnQgfHwgbnVsbDsgY29udGV4dDogeyRpbXBsaWNpdDogaX1cIiAvPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=