@taiga-ui/kit
Version:
Taiga UI Angular main components kit
118 lines • 20.5 kB
JavaScript
import { __decorate } from "tslib";
import { AsyncPipe, NgIf } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, DestroyRef, ElementRef, EventEmitter, forwardRef, inject, Input, Output, } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { ResizeObserverService } from '@ng-web-apis/resize-observer';
import { EMPTY_QUERY } from '@taiga-ui/cdk/constants';
import { tuiQueryListChanges } from '@taiga-ui/cdk/observables';
import { TuiScrollService } from '@taiga-ui/cdk/services';
import { tuiInjectElement, tuiIsElement } from '@taiga-ui/cdk/utils/dom';
import { tuiMoveFocus } from '@taiga-ui/cdk/utils/focus';
import { tuiGetOriginalArrayFromQueryList, tuiPure, } from '@taiga-ui/cdk/utils/miscellaneous';
import { TUI_ANIMATIONS_SPEED } from '@taiga-ui/core/tokens';
import { tuiGetDuration } from '@taiga-ui/core/utils/miscellaneous';
import { delay } from 'rxjs';
import { TuiStep } from './step.component';
import * as i0 from "@angular/core";
class TuiStepperComponent {
constructor() {
this.steps = EMPTY_QUERY;
this.cdr = inject(ChangeDetectorRef);
this.el = tuiInjectElement();
this.scrollService = inject(TuiScrollService);
this.speed = inject(TUI_ANIMATIONS_SPEED);
this.destroyRef = inject(DestroyRef);
this.$ = inject(ResizeObserverService, { self: true })
.pipe(takeUntilDestroyed())
.subscribe(() => this.scrollIntoView(this.activeItemIndex));
this.activeItemIndex = 0;
this.orientation = 'horizontal';
this.activeItemIndexChange = new EventEmitter();
}
ngOnChanges() {
this.scrollIntoView(this.activeItemIndex);
}
indexOf(step) {
const index = tuiGetOriginalArrayFromQueryList(this.steps).findIndex(({ nativeElement }) => nativeElement === step);
return index < 0 ? NaN : index;
}
isActive(index) {
return index === this.activeItemIndex;
}
activate(index) {
if (this.activeItemIndex === index) {
return;
}
this.activeItemIndex = index;
this.activeItemIndexChange.emit(index);
this.cdr.markForCheck();
this.scrollIntoView(index);
}
get changes$() {
// Delay is required to trigger change detection after steps are rendered,
// so they can update their "active" status
return tuiQueryListChanges(this.steps).pipe(delay(0));
}
onHorizontal(event, step) {
if (this.orientation !== 'horizontal' || !event.target) {
return;
}
event.preventDefault();
this.moveFocus(event.target, step);
}
onVertical(event, step) {
if (this.orientation !== 'vertical' || !event.target) {
return;
}
event.preventDefault();
this.moveFocus(event.target, step);
}
moveFocus(current, step) {
if (!tuiIsElement(current)) {
return;
}
const stepElements = this.steps.toArray().map(({ nativeElement }) => nativeElement);
const index = stepElements.findIndex((element) => element === current);
tuiMoveFocus(index, stepElements, step);
}
scrollIntoView(index) {
const step = this.steps.get(index)?.nativeElement;
if (!step) {
return;
}
const { clientHeight, clientWidth, offsetTop, offsetLeft } = this.el;
const { offsetHeight, offsetWidth, offsetTop: stepOffsetTop, offsetLeft: stepOffsetLeft, } = step;
const top = stepOffsetTop - offsetTop - clientHeight / 2 + offsetHeight / 2;
const left = stepOffsetLeft - offsetLeft - clientWidth / 2 + offsetWidth / 2;
this.scrollService
.scroll$(this.el, Math.max(0, top), Math.max(0, left), tuiGetDuration(this.speed) / 3)
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiStepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiStepperComponent, isStandalone: true, selector: "tui-stepper, nav[tuiStepper]", inputs: { activeItemIndex: "activeItemIndex", orientation: "orientation" }, outputs: { activeItemIndexChange: "activeItemIndexChange" }, host: { listeners: { "keydown.arrowRight": "onHorizontal($event, 1)", "keydown.arrowLeft": "onHorizontal($event, -1)", "keydown.arrowDown": "onVertical($event, 1)", "keydown.arrowUp": "onVertical($event, -1)" }, properties: { "attr.data-orientation": "orientation" } }, providers: [ResizeObserverService], queries: [{ propertyName: "steps", predicate: i0.forwardRef(function () { return TuiStep; }), read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"changes$ | async\" />\n<ng-content />\n", styles: [":host{scrollbar-width:none;-ms-overflow-style:none;display:flex;scroll-behavior:var(--tui-scroll-behavior);overflow:auto;counter-reset:steps;font:var(--tui-font-text-m)}:host::-webkit-scrollbar,:host::-webkit-scrollbar-thumb{display:none}:host[data-orientation=vertical]{flex-direction:column}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
__decorate([
tuiPure
], TuiStepperComponent.prototype, "changes$", null);
export { TuiStepperComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiStepperComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-stepper, nav[tuiStepper]', imports: [AsyncPipe, NgIf], changeDetection: ChangeDetectionStrategy.OnPush, providers: [ResizeObserverService], host: {
'[attr.data-orientation]': 'orientation',
'(keydown.arrowRight)': 'onHorizontal($event, 1)',
'(keydown.arrowLeft)': 'onHorizontal($event, -1)',
'(keydown.arrowDown)': 'onVertical($event, 1)',
'(keydown.arrowUp)': 'onVertical($event, -1)',
}, template: "<ng-container *ngIf=\"changes$ | async\" />\n<ng-content />\n", styles: [":host{scrollbar-width:none;-ms-overflow-style:none;display:flex;scroll-behavior:var(--tui-scroll-behavior);overflow:auto;counter-reset:steps;font:var(--tui-font-text-m)}:host::-webkit-scrollbar,:host::-webkit-scrollbar-thumb{display:none}:host[data-orientation=vertical]{flex-direction:column}\n"] }]
}], propDecorators: { steps: [{
type: ContentChildren,
args: [forwardRef(() => TuiStep), { read: ElementRef }]
}], activeItemIndex: [{
type: Input
}], orientation: [{
type: Input
}], activeItemIndexChange: [{
type: Output
}], changes$: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9zdGVwcGVyL3N0ZXBwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvc3RlcHBlci9zdGVwcGVyLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUNILGdDQUFnQyxFQUNoQyxPQUFPLEdBQ1YsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0NBQW9DLENBQUM7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RUFBRSxFQUNQLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFDakIsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQ2pDO2FBQ0EsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTLEVBQUUsQ0FBQztJQUNyQixDQUFDOytHQWhIUSxtQkFBbUI7bUdBQW5CLG1CQUFtQixrZUFUakIsQ0FBQyxxQkFBcUIsQ0FBQyxtRkFVQSxPQUFPLFlBQVUsVUFBVSxrRENuRGpFLCtEQUVBLDRWRG1DYyxTQUFTLDhDQUFFLElBQUk7O0FBZ0V6QjtJQURDLE9BQU87bURBS1A7U0F2RFEsbUJBQW1COzRGQUFuQixtQkFBbUI7a0JBaEIvQixTQUFTO2lDQUNNLElBQUksWUFDTiw4QkFBOEIsV0FDL0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLG1CQUdULHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxxQkFBcUIsQ0FBQyxRQUM1Qjt3QkFDRix5QkFBeUIsRUFBRSxhQUFhO3dCQUN4QyxzQkFBc0IsRUFBRSx5QkFBeUI7d0JBQ2pELHFCQUFxQixFQUFFLDBCQUEwQjt3QkFDakQscUJBQXFCLEVBQUUsdUJBQXVCO3dCQUM5QyxtQkFBbUIsRUFBRSx3QkFBd0I7cUJBQ2hEOzhCQUlnQixLQUFLO3NCQURyQixlQUFlO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUM7Z0JBY3ZELGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsS0FBSztnQkFJVSxxQkFBcUI7c0JBRHBDLE1BQU07Z0JBK0JPLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jUGlwZSwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0eXBlIHtPbkNoYW5nZXMsIFF1ZXJ5TGlzdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7UmVzaXplT2JzZXJ2ZXJTZXJ2aWNlfSBmcm9tICdAbmctd2ViLWFwaXMvcmVzaXplLW9ic2VydmVyJztcbmltcG9ydCB7RU1QVFlfUVVFUll9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB7dHVpUXVlcnlMaXN0Q2hhbmdlc30gZnJvbSAnQHRhaWdhLXVpL2Nkay9vYnNlcnZhYmxlcyc7XG5pbXBvcnQge1R1aVNjcm9sbFNlcnZpY2V9IGZyb20gJ0B0YWlnYS11aS9jZGsvc2VydmljZXMnO1xuaW1wb3J0IHt0dWlJbmplY3RFbGVtZW50LCB0dWlJc0VsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7dHVpTW92ZUZvY3VzfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2ZvY3VzJztcbmltcG9ydCB7XG4gICAgdHVpR2V0T3JpZ2luYWxBcnJheUZyb21RdWVyeUxpc3QsXG4gICAgdHVpUHVyZSxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7VFVJX0FOSU1BVElPTlNfU1BFRUR9IGZyb20gJ0B0YWlnYS11aS9jb3JlL3Rva2Vucyc7XG5pbXBvcnQgdHlwZSB7VHVpT3JpZW50YXRpb259IGZyb20gJ0B0YWlnYS11aS9jb3JlL3R5cGVzJztcbmltcG9ydCB7dHVpR2V0RHVyYXRpb259IGZyb20gJ0B0YWlnYS11aS9jb3JlL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHR5cGUge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWxheX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7VHVpU3RlcH0gZnJvbSAnLi9zdGVwLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktc3RlcHBlciwgbmF2W3R1aVN0ZXBwZXJdJyxcbiAgICBpbXBvcnRzOiBbQXN5bmNQaXBlLCBOZ0lmXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3RlcHBlci50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zdGVwcGVyLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtSZXNpemVPYnNlcnZlclNlcnZpY2VdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1thdHRyLmRhdGEtb3JpZW50YXRpb25dJzogJ29yaWVudGF0aW9uJyxcbiAgICAgICAgJyhrZXlkb3duLmFycm93UmlnaHQpJzogJ29uSG9yaXpvbnRhbCgkZXZlbnQsIDEpJyxcbiAgICAgICAgJyhrZXlkb3duLmFycm93TGVmdCknOiAnb25Ib3Jpem9udGFsKCRldmVudCwgLTEpJyxcbiAgICAgICAgJyhrZXlkb3duLmFycm93RG93biknOiAnb25WZXJ0aWNhbCgkZXZlbnQsIDEpJyxcbiAgICAgICAgJyhrZXlkb3duLmFycm93VXApJzogJ29uVmVydGljYWwoJGV2ZW50LCAtMSknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aVN0ZXBwZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBUdWlTdGVwKSwge3JlYWQ6IEVsZW1lbnRSZWZ9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RlcHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4gPSBFTVBUWV9RVUVSWTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2Nyb2xsU2VydmljZSA9IGluamVjdChUdWlTY3JvbGxTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNwZWVkID0gaW5qZWN0KFRVSV9BTklNQVRJT05TX1NQRUVEKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgJCA9IGluamVjdChSZXNpemVPYnNlcnZlclNlcnZpY2UsIHtzZWxmOiB0cnVlfSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zY3JvbGxJbnRvVmlldyh0aGlzLmFjdGl2ZUl0ZW1JbmRleCkpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYWN0aXZlSXRlbUluZGV4ID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG9yaWVudGF0aW9uOiBUdWlPcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBhY3RpdmVJdGVtSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zY3JvbGxJbnRvVmlldyh0aGlzLmFjdGl2ZUl0ZW1JbmRleCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluZGV4T2Yoc3RlcDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpbmRleCA9IHR1aUdldE9yaWdpbmFsQXJyYXlGcm9tUXVlcnlMaXN0KHRoaXMuc3RlcHMpLmZpbmRJbmRleChcbiAgICAgICAgICAgICh7bmF0aXZlRWxlbWVudH0pID0+IG5hdGl2ZUVsZW1lbnQgPT09IHN0ZXAsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IE5hTiA6IGluZGV4O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0FjdGl2ZShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gdGhpcy5hY3RpdmVJdGVtSW5kZXg7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSXRlbUluZGV4ID09PSBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVJdGVtSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5hY3RpdmVJdGVtSW5kZXhDaGFuZ2UuZW1pdChpbmRleCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLnNjcm9sbEludG9WaWV3KGluZGV4KTtcbiAgICB9XG5cbiAgICBAdHVpUHVyZVxuICAgIHByb3RlY3RlZCBnZXQgY2hhbmdlcyQoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgICAgIC8vIERlbGF5IGlzIHJlcXVpcmVkIHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBhZnRlciBzdGVwcyBhcmUgcmVuZGVyZWQsXG4gICAgICAgIC8vIHNvIHRoZXkgY2FuIHVwZGF0ZSB0aGVpciBcImFjdGl2ZVwiIHN0YXR1c1xuICAgICAgICByZXR1cm4gdHVpUXVlcnlMaXN0Q2hhbmdlcyh0aGlzLnN0ZXBzKS5waXBlKGRlbGF5KDApKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Ib3Jpem9udGFsKGV2ZW50OiBFdmVudCwgc3RlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uICE9PSAnaG9yaXpvbnRhbCcgfHwgIWV2ZW50LnRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5tb3ZlRm9jdXMoZXZlbnQudGFyZ2V0LCBzdGVwKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25WZXJ0aWNhbChldmVudDogRXZlbnQsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiAhPT0gJ3ZlcnRpY2FsJyB8fCAhZXZlbnQudGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVGb2N1cyhldmVudC50YXJnZXQsIHN0ZXApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZUZvY3VzKGN1cnJlbnQ6IEV2ZW50VGFyZ2V0LCBzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0dWlJc0VsZW1lbnQoY3VycmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0ZXBFbGVtZW50cyA9IHRoaXMuc3RlcHMudG9BcnJheSgpLm1hcCgoe25hdGl2ZUVsZW1lbnR9KSA9PiBuYXRpdmVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBzdGVwRWxlbWVudHMuZmluZEluZGV4KChlbGVtZW50KSA9PiBlbGVtZW50ID09PSBjdXJyZW50KTtcblxuICAgICAgICB0dWlNb3ZlRm9jdXMoaW5kZXgsIHN0ZXBFbGVtZW50cywgc3RlcCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzY3JvbGxJbnRvVmlldyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXBzLmdldChpbmRleCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKCFzdGVwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7Y2xpZW50SGVpZ2h0LCBjbGllbnRXaWR0aCwgb2Zmc2V0VG9wLCBvZmZzZXRMZWZ0fSA9IHRoaXMuZWw7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG9mZnNldEhlaWdodCxcbiAgICAgICAgICAgIG9mZnNldFdpZHRoLFxuICAgICAgICAgICAgb2Zmc2V0VG9wOiBzdGVwT2Zmc2V0VG9wLFxuICAgICAgICAgICAgb2Zmc2V0TGVmdDogc3RlcE9mZnNldExlZnQsXG4gICAgICAgIH0gPSBzdGVwO1xuICAgICAgICBjb25zdCB0b3AgPSBzdGVwT2Zmc2V0VG9wIC0gb2Zmc2V0VG9wIC0gY2xpZW50SGVpZ2h0IC8gMiArIG9mZnNldEhlaWdodCAvIDI7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGVwT2Zmc2V0TGVmdCAtIG9mZnNldExlZnQgLSBjbGllbnRXaWR0aCAvIDIgKyBvZmZzZXRXaWR0aCAvIDI7XG5cbiAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlXG4gICAgICAgICAgICAuc2Nyb2xsJChcbiAgICAgICAgICAgICAgICB0aGlzLmVsLFxuICAgICAgICAgICAgICAgIE1hdGgubWF4KDAsIHRvcCksXG4gICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgbGVmdCksXG4gICAgICAgICAgICAgICAgdHVpR2V0RHVyYXRpb24odGhpcy5zcGVlZCkgLyAzLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImNoYW5nZXMkIHwgYXN5bmNcIiAvPlxuPG5nLWNvbnRlbnQgLz5cbiJdfQ==