@taiga-ui/core
Version:
Core library for creating Angular components and applications using Taiga UI
115 lines • 21.2 kB
JavaScript
import { __decorate } from "tslib";
import { Directive, EventEmitter, inject, Input, Output } from '@angular/core';
import { EMPTY_CLIENT_RECT } from '@taiga-ui/cdk/constants';
import { TUI_IS_MOBILE } from '@taiga-ui/cdk/tokens';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { tuiPure } from '@taiga-ui/cdk/utils/miscellaneous';
import { tuiFallbackAccessor, TuiPositionAccessor, TuiRectAccessor, } from '@taiga-ui/core/classes';
import { TUI_VIEWPORT } from '@taiga-ui/core/tokens';
import { TuiHintDirective } from './hint.directive';
import { TUI_HINT_DIRECTIONS, TUI_HINT_OPTIONS, } from './hint-options.directive';
import * as i0 from "@angular/core";
const GAP = 8;
const ARROW_OFFSET = 24;
const TOP = 0;
const LEFT = 1;
class TuiHintPosition extends TuiPositionAccessor {
constructor() {
super(...arguments);
this.el = tuiInjectElement();
this.viewport = inject(TUI_VIEWPORT);
this.accessor = tuiFallbackAccessor('hint')(inject(TuiRectAccessor), inject(TuiHintDirective));
this.points = TUI_HINT_DIRECTIONS.reduce((acc, direction) => ({ ...acc, [direction]: [0, 0] }), {});
this.direction = inject(TUI_HINT_OPTIONS).direction;
this.offset = inject(TUI_IS_MOBILE) ? 16 : 8;
this.directionChange = new EventEmitter();
this.type = 'hint';
}
emitDirection(direction) {
this.directionChange.emit(direction);
}
getPosition(rect, el) {
const width = el?.clientWidth ?? rect.width;
const height = el?.clientHeight ?? rect.height;
const hostRect = this.accessor.getClientRect() ?? EMPTY_CLIENT_RECT;
const leftCenter = hostRect.left + hostRect.width / 2;
const topCenter = hostRect.top + hostRect.height / 2;
const rtl = this.el.matches('[dir="rtl"] :scope');
this.points['top-left'][TOP] = hostRect.top - height - this.offset;
this.points['top-left'][LEFT] = leftCenter - width + ARROW_OFFSET;
this.points.top[TOP] = this.points['top-left'][TOP];
this.points.top[LEFT] = leftCenter - width / 2;
this.points['top-right'][TOP] = this.points['top-left'][TOP];
this.points['top-right'][LEFT] = leftCenter - ARROW_OFFSET;
this.points['bottom-left'][TOP] = hostRect.bottom + this.offset;
this.points['bottom-left'][LEFT] = this.points['top-left'][LEFT];
this.points.bottom[TOP] = this.points['bottom-left'][TOP];
this.points.bottom[LEFT] = this.points.top[LEFT];
this.points['bottom-right'][TOP] = this.points['bottom-left'][TOP];
this.points['bottom-right'][LEFT] = this.points['top-right'][LEFT];
this.points['left-top'][TOP] = topCenter - height + ARROW_OFFSET;
this.points['left-top'][LEFT] = hostRect.left - width - this.offset;
this.points.left[TOP] = topCenter - height / 2;
this.points.left[LEFT] = this.points['left-top'][LEFT];
this.points['left-bottom'][TOP] = topCenter - ARROW_OFFSET;
this.points['left-bottom'][LEFT] = this.points['left-top'][LEFT];
this.points['right-top'][TOP] = this.points['left-top'][TOP];
this.points['right-top'][LEFT] = hostRect.right + this.offset;
this.points.right[TOP] = this.points.left[TOP];
this.points.right[LEFT] = this.points['right-top'][LEFT];
this.points['right-bottom'][TOP] = this.points['left-bottom'][TOP];
this.points['right-bottom'][LEFT] = this.points['right-top'][LEFT];
const array = Array.isArray(this.direction) ? this.direction : [this.direction];
const priority = array.map((direction) => adjust(direction, rtl));
const direction = priority
.concat(TUI_HINT_DIRECTIONS)
.find((dir) => this.checkPosition(this.points[dir], width, height)) ||
this.fallback;
this.emitDirection(adjust(direction, rtl));
return this.points[direction];
}
get fallback() {
return this.points.top[TOP] >
this.viewport.getClientRect().bottom - this.points.bottom[TOP]
? 'top'
: 'bottom';
}
checkPosition([top, left], width, height) {
const viewport = this.viewport.getClientRect();
return (top > viewport.top + GAP &&
left > viewport.left + GAP &&
top + height < viewport.bottom - GAP &&
left + width < viewport.right - GAP);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiHintPosition, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiHintPosition, isStandalone: true, inputs: { direction: ["tuiHintDirection", "direction"], offset: ["tuiHintOffset", "offset"] }, outputs: { directionChange: "tuiHintDirectionChange" }, usesInheritance: true, ngImport: i0 }); }
}
__decorate([
tuiPure
], TuiHintPosition.prototype, "emitDirection", null);
export { TuiHintPosition };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiHintPosition, decorators: [{
type: Directive,
args: [{
standalone: true,
}]
}], propDecorators: { direction: [{
type: Input,
args: ['tuiHintDirection']
}], offset: [{
type: Input,
args: ['tuiHintOffset']
}], directionChange: [{
type: Output,
args: ['tuiHintDirectionChange']
}], emitDirection: [] } });
function adjust(direction, rtl) {
if (rtl && direction.includes('left')) {
return direction.replace('left', 'right');
}
if (rtl && direction.includes('right')) {
return direction.replace('right', 'left');
}
return direction;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGludC1wb3NpdGlvbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2RpcmVjdGl2ZXMvaGludC9oaW50LXBvc2l0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRCxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixlQUFlLEdBQ2xCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR25ELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsZ0JBQWdCLEdBR25CLE1BQU0sMEJBQTBCLENBQUM7O0FBRWxDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNkLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN4QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDZCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUM7QUFFZixNQUdhLGVBQWdCLFNBQVEsbUJBQW1CO0lBSHhEOztRQUlxQixPQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixhQUFRLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxtQkFB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TUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLEdBQUcsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsR0FBRyxZQUFZLENBQUM7UUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxD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LFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7aUJBQ25COzhCQWdCVSxTQUFTO3NCQURmLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUlsQixNQUFNO3NCQURaLEtBQUs7dUJBQUMsZUFBZTtnQkFJTixlQUFlO3NCQUQ5QixNQUFNO3VCQUFDLHdCQUF3QjtnQkFNekIsYUFBYTtBQXdFeEIsU0FBUyxNQUFNLENBQUMsU0FBMkIsRUFBRSxHQUFZO0lBQ3JELElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbkMsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQXFCLENBQUM7S0FDakU7SUFFRCxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3BDLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFxQixDQUFDO0tBQ2pFO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0VNUFRZX0NMSUVOVF9SRUNUfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQge1RVSV9JU19NT0JJTEV9IGZyb20gJ0B0YWlnYS11aS9jZGsvdG9rZW5zJztcbmltcG9ydCB7dHVpSW5qZWN0RWxlbWVudH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHt0dWlQdXJlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHtcbiAgICB0dWlGYWxsYmFja0FjY2Vzc29yLFxuICAgIFR1aVBvc2l0aW9uQWNjZXNzb3IsXG4gICAgVHVpUmVjdEFjY2Vzc29yLFxufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jbGFzc2VzJztcbmltcG9ydCB7VFVJX1ZJRVdQT1JUfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHt0eXBlIFR1aVBvaW50fSBmcm9tICdAdGFpZ2EtdWkvY29yZS90eXBlcyc7XG5cbmltcG9ydCB7VHVpSGludERpcmVjdGl2ZX0gZnJvbSAnLi9oaW50LmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIFRVSV9ISU5UX0RJUkVDVElPTlMsXG4gICAgVFVJX0hJTlRfT1BUSU9OUyxcbiAgICB0eXBlIFR1aUhpbnREaXJlY3Rpb24sXG4gICAgdHlwZSBUdWlIaW50T3B0aW9ucyxcbn0gZnJvbSAnLi9oaW50LW9wdGlvbnMuZGlyZWN0aXZlJztcblxuY29uc3QgR0FQID0gODtcbmNvbnN0IEFSUk9XX09GRlNFVCA9IDI0O1xuY29uc3QgVE9QID0gMDtcbmNvbnN0IExFRlQgPSAxO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlIaW50UG9zaXRpb24gZXh0ZW5kcyBUdWlQb3NpdGlvbkFjY2Vzc29yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnQgPSBpbmplY3QoVFVJX1ZJRVdQT1JUKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjY2Vzc29yID0gdHVpRmFsbGJhY2tBY2Nlc3NvcjxUdWlSZWN0QWNjZXNzb3I+KCdoaW50JykoXG4gICAgICAgIGluamVjdDxhbnk+KFR1aVJlY3RBY2Nlc3NvciksXG4gICAgICAgIGluamVjdChUdWlIaW50RGlyZWN0aXZlKSxcbiAgICApO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb2ludHM6IFJlY29yZDxUdWlIaW50RGlyZWN0aW9uLCBbbnVtYmVyLCBudW1iZXJdPiA9XG4gICAgICAgIFRVSV9ISU5UX0RJUkVDVElPTlMucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgZGlyZWN0aW9uKSA9PiAoey4uLmFjYywgW2RpcmVjdGlvbl06IFswLCAwXX0pLFxuICAgICAgICAgICAge30gYXMgUmVjb3JkPFR1aUhpbnREaXJlY3Rpb24sIFtudW1iZXIsIG51bWJlcl0+LFxuICAgICAgICApO1xuXG4gICAgQElucHV0KCd0dWlIaW50RGlyZWN0aW9uJylcbiAgICBwdWJsaWMgZGlyZWN0aW9uOiBUdWlIaW50T3B0aW9uc1snZGlyZWN0aW9uJ10gPSBpbmplY3QoVFVJX0hJTlRfT1BUSU9OUykuZGlyZWN0aW9uO1xuXG4gICAgQElucHV0KCd0dWlIaW50T2Zmc2V0JylcbiAgICBwdWJsaWMgb2Zmc2V0OiBudW1iZXIgPSBpbmplY3QoVFVJX0lTX01PQklMRSkgPyAxNiA6IDg7XG5cbiAgICBAT3V0cHV0KCd0dWlIaW50RGlyZWN0aW9uQ2hhbmdlJylcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGlyZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUdWlIaW50RGlyZWN0aW9uPigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSAnaGludCc7XG5cbiAgICBAdHVpUHVyZVxuICAgIHB1YmxpYyBlbWl0RGlyZWN0aW9uKGRpcmVjdGlvbjogVHVpSGludERpcmVjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpcmVjdGlvbkNoYW5nZS5lbWl0KGRpcmVjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBvc2l0aW9uKHJlY3Q6IERPTVJlY3QsIGVsPzogSFRNTEVsZW1lbnQpOiBUdWlQb2ludCB7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZWw/LmNsaWVudFdpZHRoID8/IHJlY3Qud2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGVsPy5jbGllbnRIZWlnaHQgPz8gcmVjdC5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGhvc3RSZWN0ID0gdGhpcy5hY2Nlc3Nvci5nZXRDbGllbnRSZWN0KCkgPz8gRU1QVFlfQ0xJRU5UX1JFQ1Q7XG4gICAgICAgIGNvbnN0IGxlZnRDZW50ZXIgPSBob3N0UmVjdC5sZWZ0ICsgaG9zdFJlY3Qud2lkdGggLyAyO1xuICAgICAgICBjb25zdCB0b3BDZW50ZXIgPSBob3N0UmVjdC50b3AgKyBob3N0UmVjdC5oZWlnaHQgLyAyO1xuICAgICAgICBjb25zdCBydGwgPSB0aGlzLmVsLm1hdGNoZXMoJ1tkaXI9XCJydGxcIl0gOnNjb3BlJyk7XG5cbiAgICAgICAgdGhpcy5wb2ludHNbJ3RvcC1sZWZ0J11bVE9QXSA9IGhvc3RSZWN0LnRvcCAtIGhlaWdodCAtIHRoaXMub2Zmc2V0O1xuICAgICAgICB0aGlzLnBvaW50c1sndG9wLWxlZnQnXVtMRUZUXSA9IGxlZnRDZW50ZXIgLSB3aWR0aCArIEFSUk9XX09GRlNFVDtcbiAgICAgICAgdGhpcy5wb2ludHMudG9wW1RPUF0gPSB0aGlzLnBvaW50c1sndG9wLWxlZnQnXVtUT1BdO1xuICAgICAgICB0aGlzLnBvaW50cy50b3BbTEVGVF0gPSBsZWZ0Q2VudGVyIC0gd2lkdGggLyAyO1xuICAgICAgICB0aGlzLnBvaW50c1sndG9wLXJpZ2h0J11bVE9QXSA9IHRoaXMucG9pbnRzWyd0b3AtbGVmdCddW1RPUF07XG4gICAgICAgIHRoaXMucG9pbnRzWyd0b3AtcmlnaHQnXVtMRUZUXSA9IGxlZnRDZW50ZXIgLSBBUlJPV19PRkZTRVQ7XG5cbiAgICAgICAgdGhpcy5wb2ludHNbJ2JvdHRvbS1sZWZ0J11bVE9QXSA9IGhvc3RSZWN0LmJvdHRvbSArIHRoaXMub2Zmc2V0O1xuICAgICAgICB0aGlzLnBvaW50c1snYm90dG9tLWxlZnQnXVtMRUZUXSA9IHRoaXMucG9pbnRzWyd0b3AtbGVmdCddW0xFRlRdO1xuICAgICAgICB0aGlzLnBvaW50cy5ib3R0b21bVE9QXSA9IHRoaXMucG9pbnRzWydib3R0b20tbGVmdCddW1RPUF07XG4gICAgICAgIHRoaXMucG9pbnRzLmJvdHRvbVtMRUZUXSA9IHRoaXMucG9pbnRzLnRvcFtMRUZUXTtcbiAgICAgICAgdGhpcy5wb2ludHNbJ2JvdHRvbS1yaWdodCddW1RPUF0gPSB0aGlzLnBvaW50c1snYm90dG9tLWxlZnQnXVtUT1BdO1xuICAgICAgICB0aGlzLnBvaW50c1snYm90dG9tLXJpZ2h0J11bTEVGVF0gPSB0aGlzLnBvaW50c1sndG9wLXJpZ2h0J11bTEVGVF07XG5cbiAgICAgICAgdGhpcy5wb2ludHNbJ2xlZnQtdG9wJ11bVE9QXSA9IHRvcENlbnRlciAtIGhlaWdodCArIEFSUk9XX09GRlNFVDtcbiAgICAgICAgdGhpcy5wb2ludHNbJ2xlZnQtdG9wJ11bTEVGVF0gPSBob3N0UmVjdC5sZWZ0IC0gd2lkdGggLSB0aGlzLm9mZnNldDtcbiAgICAgICAgdGhpcy5wb2ludHMubGVmdFtUT1BdID0gdG9wQ2VudGVyIC0gaGVpZ2h0IC8gMjtcbiAgICAgICAgdGhpcy5wb2ludHMubGVmdFtMRUZUXSA9IHRoaXMucG9pbnRzWydsZWZ0LXRvcCddW0xFRlRdO1xuICAgICAgICB0aGlzLnBvaW50c1snbGVmdC1ib3R0b20nXVtUT1BdID0gdG9wQ2VudGVyIC0gQVJST1dfT0ZGU0VUO1xuICAgICAgICB0aGlzLnBvaW50c1snbGVmdC1ib3R0b20nXVtMRUZUXSA9IHRoaXMucG9pbnRzWydsZWZ0LXRvcCddW0xFRlRdO1xuXG4gICAgICAgIHRoaXMucG9pbnRzWydyaWdodC10b3AnXVtUT1BdID0gdGhpcy5wb2ludHNbJ2xlZnQtdG9wJ11bVE9QXTtcbiAgICAgICAgdGhpcy5wb2ludHNbJ3JpZ2h0LXRvcCddW0xFRlRdID0gaG9zdFJlY3QucmlnaHQgKyB0aGlzLm9mZnNldDtcbiAgICAgICAgdGhpcy5wb2ludHMucmlnaHRbVE9QXSA9IHRoaXMucG9pbnRzLmxlZnRbVE9QXTtcbiAgICAgICAgdGhpcy5wb2ludHMucmlnaHRbTEVGVF0gPSB0aGlzLnBvaW50c1sncmlnaHQtdG9wJ11bTEVGVF07XG4gICAgICAgIHRoaXMucG9pbnRzWydyaWdodC1ib3R0b20nXVtUT1BdID0gdGhpcy5wb2ludHNbJ2xlZnQtYm90dG9tJ11bVE9QXTtcbiAgICAgICAgdGhpcy5wb2ludHNbJ3JpZ2h0LWJvdHRvbSddW0xFRlRdID0gdGhpcy5wb2ludHNbJ3JpZ2h0LXRvcCddW0xFRlRdO1xuXG4gICAgICAgIGNvbnN0IGFycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLmRpcmVjdGlvbikgPyB0aGlzLmRpcmVjdGlvbiA6IFt0aGlzLmRpcmVjdGlvbl07XG4gICAgICAgIGNvbnN0IHByaW9yaXR5ID0gYXJyYXkubWFwKChkaXJlY3Rpb24pID0+IGFkanVzdChkaXJlY3Rpb24sIHJ0bCkpO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPVxuICAgICAgICAgICAgcHJpb3JpdHlcbiAgICAgICAgICAgICAgICAuY29uY2F0KFRVSV9ISU5UX0RJUkVDVElPTlMpXG4gICAgICAgICAgICAgICAgLmZpbmQoKGRpcikgPT4gdGhpcy5jaGVja1Bvc2l0aW9uKHRoaXMucG9pbnRzW2Rpcl0sIHdpZHRoLCBoZWlnaHQpKSB8fFxuICAgICAgICAgICAgdGhpcy5mYWxsYmFjaztcblxuICAgICAgICB0aGlzLmVtaXREaXJlY3Rpb24oYWRqdXN0KGRpcmVjdGlvbiwgcnRsKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucG9pbnRzW2RpcmVjdGlvbl07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZmFsbGJhY2soKTogVHVpSGludERpcmVjdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50cy50b3BbVE9QXSA+XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0LmdldENsaWVudFJlY3QoKS5ib3R0b20gLSB0aGlzLnBvaW50cy5ib3R0b21bVE9QXVxuICAgICAgICAgICAgPyAndG9wJ1xuICAgICAgICAgICAgOiAnYm90dG9tJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrUG9zaXRpb24oW3RvcCwgbGVmdF06IFR1aVBvaW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQuZ2V0Q2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0b3AgPiB2aWV3cG9ydC50b3AgKyBHQVAgJiZcbiAgICAgICAgICAgIGxlZnQgPiB2aWV3cG9ydC5sZWZ0ICsgR0FQICYmXG4gICAgICAgICAgICB0b3AgKyBoZWlnaHQgPCB2aWV3cG9ydC5ib3R0b20gLSBHQVAgJiZcbiAgICAgICAgICAgIGxlZnQgKyB3aWR0aCA8IHZpZXdwb3J0LnJpZ2h0IC0gR0FQXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGp1c3QoZGlyZWN0aW9uOiBUdWlIaW50RGlyZWN0aW9uLCBydGw6IGJvb2xlYW4pOiBUdWlIaW50RGlyZWN0aW9uIHtcbiAgICBpZiAocnRsICYmIGRpcmVjdGlvbi5pbmNsdWRlcygnbGVmdCcpKSB7XG4gICAgICAgIHJldHVybiBkaXJlY3Rpb24ucmVwbGFjZSgnbGVmdCcsICdyaWdodCcpIGFzIFR1aUhpbnREaXJlY3Rpb247XG4gICAgfVxuXG4gICAgaWYgKHJ0bCAmJiBkaXJlY3Rpb24uaW5jbHVkZXMoJ3JpZ2h0JykpIHtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGlvbi5yZXBsYWNlKCdyaWdodCcsICdsZWZ0JykgYXMgVHVpSGludERpcmVjdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0aW9uO1xufVxuIl19