UNPKG

@duyvu-fsdev/ng-tooltip-directive

Version:
236 lines 38.3 kB
import { DOCUMENT } from "@angular/common"; import { Directive, HostListener, Inject, Input } from "@angular/core"; import { TooltipComponent } from "./ng-tooltip.component"; import * as i0 from "@angular/core"; export class TooltipDirective { el; viewContainerRef; document; option; tooltipComponentRef; constructor(el, viewContainerRef, document) { this.el = el; this.viewContainerRef = viewContainerRef; this.document = document; } ngAfterViewInit() { this.option.position = this.option.position ?? "bottom"; this.option.class = this.option.class ?? ""; } onMouseEnter() { this.showTooltip(); } onMouseLeave() { this.hideTooltip(); } getHostPosition(hostEl) { if (!hostEl) return { h: 0, w: 0, l: 0, t: 0 }; const styles = getComputedStyle(hostEl); const { left, top, height, width } = hostEl.getBoundingClientRect(); const l = styles.left === "auto" ? left : left + parseFloat(styles.marginLeft); const t = styles.top === "auto" ? top : top + parseFloat(styles.marginTop); const w = styles.width === "auto" ? width : parseFloat(styles.width); const h = styles.height === "auto" ? height : parseFloat(styles.height); return { w, h, l, t }; } getStandardPosition(p) { const { h, w, l, t } = this.getHostPosition(this.el.nativeElement); if (p === "top") return { left: l + w / 2, top: t - 6 }; if (p === "left") return { left: l - 6, top: t + h / 2 }; if (p === "right") return { left: l + w + 6, top: t + h / 2 }; else return { left: l + w / 2, top: t + h + 6 }; } showTooltip() { const factory = this.viewContainerRef.createComponent(TooltipComponent); this.tooltipComponentRef = factory; const tooltipInstance = this.tooltipComponentRef.instance; const tooltipEl = this.tooltipComponentRef.location.nativeElement; this.document.body.appendChild(tooltipEl); const { left, top } = this.getStandardPosition(this.option.position ?? "bottom"); tooltipInstance.position = this.option.position ?? "bottom"; tooltipInstance.text = this.option.text; tooltipInstance.left = `${left}px`; tooltipInstance.top = `${top}px`; tooltipInstance.visible = false; setTimeout(() => { const tooltipEl = this.tooltipComponentRef.location.nativeElement.querySelector(".tooltip-container"); if (this.option.class) tooltipEl.classList.add(this.option.class); this.adjustPosition(tooltipEl).then((position) => { const { left, top } = this.getStandardPosition(position); tooltipInstance.position = position; tooltipInstance.left = `${left}px`; tooltipInstance.top = `${top}px`; tooltipInstance.visible = true; }); }, 1); } adjustPosition(initTooltipEl) { return new Promise((resolve) => { const { left, right, top, bottom } = initTooltipEl.getBoundingClientRect(); const windowWidth = document.documentElement.clientWidth; const windowHeight = document.documentElement.clientHeight; const isOverLeft = left < 0; const isOverRight = right > windowWidth; const isOverTop = top < 0; const isOverBottom = bottom > windowHeight; if (!isOverLeft && !isOverRight && !isOverBottom && !isOverTop) resolve(this.option.position ?? "bottom"); else if (isOverLeft && isOverRight && isOverBottom && isOverTop) resolve("bottom"); else if (this.option.position === "top") { if (isOverLeft && !isOverRight && !isOverBottom && !isOverTop) resolve("right"); if (!isOverLeft && isOverRight && !isOverBottom && !isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && isOverBottom && !isOverTop) resolve("top"); if (!isOverLeft && !isOverRight && !isOverBottom && isOverTop) resolve("bottom"); if (isOverLeft && isOverRight && !isOverBottom && !isOverTop) resolve("top"); if (isOverLeft && !isOverRight && isOverBottom && !isOverTop) resolve("right"); if (isOverLeft && !isOverRight && !isOverBottom && isOverTop) resolve("right"); if (!isOverLeft && isOverRight && isOverBottom && !isOverTop) resolve("left"); if (!isOverLeft && isOverRight && !isOverBottom && isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && isOverBottom && isOverTop) resolve("left"); if (isOverLeft && isOverRight && isOverBottom && !isOverTop) resolve("top"); if (isOverLeft && isOverRight && !isOverBottom && isOverTop) resolve("bottom"); if (isOverLeft && !isOverRight && isOverBottom && isOverTop) resolve("right"); if (!isOverLeft && isOverRight && isOverBottom && isOverTop) resolve("left"); } else if (this.option.position === "left") { if (isOverLeft && !isOverRight && !isOverBottom && !isOverTop) resolve("right"); if (!isOverLeft && isOverRight && !isOverBottom && !isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && isOverBottom && !isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && !isOverBottom && isOverTop) resolve("left"); if (isOverLeft && isOverRight && !isOverBottom && !isOverTop) resolve("bottom"); if (isOverLeft && !isOverRight && isOverBottom && !isOverTop) resolve("right"); if (isOverLeft && !isOverRight && !isOverBottom && isOverTop) resolve("right"); if (!isOverLeft && isOverRight && isOverBottom && !isOverTop) resolve("left"); if (!isOverLeft && isOverRight && !isOverBottom && isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && isOverBottom && isOverTop) resolve("left"); if (isOverLeft && isOverRight && isOverBottom && !isOverTop) resolve("top"); if (isOverLeft && isOverRight && !isOverBottom && isOverTop) resolve("bottom"); if (isOverLeft && !isOverRight && isOverBottom && isOverTop) resolve("right"); if (!isOverLeft && isOverRight && isOverBottom && isOverTop) resolve("left"); } else if (this.option.position === "right") { if (isOverLeft && !isOverRight && !isOverBottom && !isOverTop) resolve("right"); if (!isOverLeft && isOverRight && !isOverBottom && !isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && isOverBottom && !isOverTop) resolve("right"); if (!isOverLeft && !isOverRight && !isOverBottom && isOverTop) resolve("right"); if (isOverLeft && isOverRight && !isOverBottom && !isOverTop) resolve("bottom"); if (isOverLeft && !isOverRight && isOverBottom && !isOverTop) resolve("right"); if (isOverLeft && !isOverRight && !isOverBottom && isOverTop) resolve("right"); if (!isOverLeft && isOverRight && isOverBottom && !isOverTop) resolve("left"); if (!isOverLeft && isOverRight && !isOverBottom && isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && isOverBottom && isOverTop) resolve("right"); if (isOverLeft && isOverRight && isOverBottom && !isOverTop) resolve("top"); if (isOverLeft && isOverRight && !isOverBottom && isOverTop) resolve("bottom"); if (isOverLeft && !isOverRight && isOverBottom && isOverTop) resolve("right"); if (!isOverLeft && isOverRight && isOverBottom && isOverTop) resolve("left"); } else if (this.option.position === "bottom") { if (isOverLeft && !isOverRight && !isOverBottom && !isOverTop) resolve("right"); if (!isOverLeft && isOverRight && !isOverBottom && !isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && isOverBottom && !isOverTop) resolve("top"); if (!isOverLeft && !isOverRight && !isOverBottom && isOverTop) resolve("bottom"); if (isOverLeft && isOverRight && !isOverBottom && !isOverTop) resolve("bottom"); if (isOverLeft && !isOverRight && isOverBottom && !isOverTop) resolve("right"); if (isOverLeft && !isOverRight && !isOverBottom && isOverTop) resolve("right"); if (!isOverLeft && isOverRight && isOverBottom && !isOverTop) resolve("right"); if (!isOverLeft && isOverRight && !isOverBottom && isOverTop) resolve("left"); if (!isOverLeft && !isOverRight && isOverBottom && isOverTop) resolve("right"); if (isOverLeft && isOverRight && isOverBottom && !isOverTop) resolve("top"); if (isOverLeft && isOverRight && !isOverBottom && isOverTop) resolve("bottom"); if (isOverLeft && !isOverRight && isOverBottom && isOverTop) resolve("right"); if (!isOverLeft && isOverRight && isOverBottom && isOverTop) resolve("left"); } }); } hideTooltip() { if (this.tooltipComponentRef) { const tooltipInstance = this.tooltipComponentRef.instance; tooltipInstance.visible = false; this.tooltipComponentRef.destroy(); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TooltipDirective, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: TooltipDirective, selector: "[tooltip]", inputs: { option: ["tooltipOption", "option"] }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()" } }, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TooltipDirective, decorators: [{ type: Directive, args: [{ selector: "[tooltip]", }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { option: [{ type: Input, args: ["tooltipOption"] }], onMouseEnter: [{ type: HostListener, args: ["mouseenter"] }], onMouseLeave: [{ type: HostListener, args: ["mouseleave"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy10b29sdGlwLWRpcmVjdGl2ZS9zcmMvbGliL25nLXRvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQStCLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDbEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBTTFELE1BQU0sT0FBTyxnQkFBZ0I7SUFLUDtJQUF3QjtJQUE4RDtJQUpsRixNQUFNLENBQVU7SUFFaEMsbUJBQW1CLENBQWtDO0lBRTdELFlBQW9CLEVBQWMsRUFBVSxnQkFBa0MsRUFBNEIsUUFBa0I7UUFBeEcsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBNEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUFHLENBQUM7SUFFaEksZUFBZTtRQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUUyQixZQUFZO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQzJCLFlBQVk7UUFDdEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBbUI7UUFDekMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxD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Z0JBQy9FLElBQUksVUFBVSxJQUFJLFdBQVcsSUFBSSxZQUFZLElBQUksQ0FBQyxTQUFTO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUUsSUFBSSxVQUFVLElBQUksV0FBVyxJQUFJLENBQUMsWUFBWSxJQUFJLFNBQVM7b0JBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMvRSxJQUFJLFVBQVUsSUFBSSxDQUFDLFdBQVcsSUFBSSxZQUFZLElBQUksU0FBUztvQkFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxVQUFVLElBQUksV0FBVyxJQUFJLFlBQVksSUFBSSxTQUFTO29CQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ08sV0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7WUFDMUQsZUFBZSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO3dHQWhKVSxnQkFBZ0IsNEVBSzZELFFBQVE7NEZBTHJGLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFINUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsV0FBVztpQkFDdEI7OzBCQU1rRixNQUFNOzJCQUFDLFFBQVE7eUNBSnhFLE1BQU07c0JBQTdCLEtBQUs7dUJBQUMsZUFBZTtnQkFXTSxZQUFZO3NCQUF2QyxZQUFZO3VCQUFDLFlBQVk7Z0JBR0UsWUFBWTtzQkFBdkMsWUFBWTt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBUb29sdGlwQ29tcG9uZW50IH0gZnJvbSBcIi4vbmctdG9vbHRpcC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgT3B0aW9uLCBQb3NpdGlvbiB9IGZyb20gXCIuL25nLXRvb2x0aXAubW9kZWxcIjtcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBcIlt0b29sdGlwXVwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVG9vbHRpcERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dChcInRvb2x0aXBPcHRpb25cIikgb3B0aW9uITogT3B0aW9uO1xyXG5cclxuICBwcml2YXRlIHRvb2x0aXBDb21wb25lbnRSZWYhOiBDb21wb25lbnRSZWY8VG9vbHRpcENvbXBvbmVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQpIHt9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMub3B0aW9uLnBvc2l0aW9uID0gdGhpcy5vcHRpb24ucG9zaXRpb24gPz8gXCJib3R0b21cIjtcclxuICAgIHRoaXMub3B0aW9uLmNsYXNzID0gdGhpcy5vcHRpb24uY2xhc3MgPz8gXCJcIjtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIpIG9uTW91c2VFbnRlcigpIHtcclxuICAgIHRoaXMuc2hvd1Rvb2x0aXAoKTtcclxuICB9XHJcbiAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIikgb25Nb3VzZUxlYXZlKCkge1xyXG4gICAgdGhpcy5oaWRlVG9vbHRpcCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIb3N0UG9zaXRpb24oaG9zdEVsOiBIVE1MRWxlbWVudCk6IHsgdzogbnVtYmVyOyBoOiBudW1iZXI7IGw6IG51bWJlcjsgdDogbnVtYmVyIH0ge1xyXG4gICAgaWYgKCFob3N0RWwpIHJldHVybiB7IGg6IDAsIHc6IDAsIGw6IDAsIHQ6IDAgfTtcclxuICAgIGNvbnN0IHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUoaG9zdEVsKTtcclxuICAgIGNvbnN0IHsgbGVmdCwgdG9wLCBoZWlnaHQsIHdpZHRoIH0gPSBob3N0RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCBsID0gc3R5bGVzLmxlZnQgPT09IFwiYXV0b1wiID8gbGVmdCA6IGxlZnQgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0KTtcclxuICAgIGNvbnN0IHQgPSBzdHlsZXMudG9wID09PSBcImF1dG9cIiA/IHRvcCA6IHRvcCArIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCk7XHJcbiAgICBjb25zdCB3ID0gc3R5bGVzLndpZHRoID09PSBcImF1dG9cIiA/IHdpZHRoIDogcGFyc2VGbG9hdChzdHlsZXMud2lkdGgpO1xyXG4gICAgY29uc3QgaCA9IHN0eWxlcy5oZWlnaHQgPT09IFwiYXV0b1wiID8gaGVpZ2h0IDogcGFyc2VGbG9hdChzdHlsZXMuaGVpZ2h0KTtcclxuICAgIHJldHVybiB7IHcsIGgsIGwsIHQgfTtcclxuICB9XHJcblxyXG4gIGdldFN0YW5kYXJkUG9zaXRpb24ocDogUG9zaXRpb24pOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSB7XHJcbiAgICBjb25zdCB7IGgsIHcsIGwsIHQgfSA9IHRoaXMuZ2V0SG9zdFBvc2l0aW9uKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICBpZiAocCA9PT0gXCJ0b3BcIikgcmV0dXJuIHsgbGVmdDogbCArIHcgLyAyLCB0b3A6IHQgLSA2IH07XHJcbiAgICBpZiAocCA9PT0gXCJsZWZ0XCIpIHJldHVybiB7IGxlZnQ6IGwgLSA2LCB0b3A6IHQgKyBoIC8gMiB9O1xyXG4gICAgaWYgKHAgPT09IFwicmlnaHRcIikgcmV0dXJuIHsgbGVmdDogbCArIHcgKyA2LCB0b3A6IHQgKyBoIC8gMiB9O1xyXG4gICAgZWxzZSByZXR1cm4geyBsZWZ0OiBsICsgdyAvIDIsIHRvcDogdCArIGggKyA2IH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dUb29sdGlwKCkge1xyXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoVG9vbHRpcENvbXBvbmVudCk7XHJcbiAgICB0aGlzLnRvb2x0aXBDb21wb25lbnRSZWYgPSBmYWN0b3J5O1xyXG4gICAgY29uc3QgdG9vbHRpcEluc3RhbmNlID0gdGhpcy50b29sdGlwQ29tcG9uZW50UmVmLmluc3RhbmNlO1xyXG4gICAgY29uc3QgdG9vbHRpcEVsID0gdGhpcy50b29sdGlwQ29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9vbHRpcEVsKTtcclxuICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSB0aGlzLmdldFN0YW5kYXJkUG9zaXRpb24odGhpcy5vcHRpb24ucG9zaXRpb24gPz8gXCJib3R0b21cIik7XHJcbiAgICB0b29sdGlwSW5zdGFuY2UucG9zaXRpb24gPSB0aGlzLm9wdGlvbi5wb3NpdGlvbiA/PyBcImJvdHRvbVwiO1xyXG4gICAgdG9vbHRpcEluc3RhbmNlLnRleHQgPSB0aGlzLm9wdGlvbi50ZXh0O1xyXG4gICAgdG9vbHRpcEluc3RhbmNlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcclxuICAgIHRvb2x0aXBJbnN0YW5jZS50b3AgPSBgJHt0b3B9cHhgO1xyXG4gICAgdG9vbHRpcEluc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgdG9vbHRpcEVsID0gdGhpcy50b29sdGlwQ29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcIi50b29sdGlwLWNvbnRhaW5lclwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgaWYgKHRoaXMub3B0aW9uLmNsYXNzKSB0b29sdGlwRWwuY2xhc3NMaXN0LmFkZCh0aGlzLm9wdGlvbi5jbGFzcyk7XHJcbiAgICAgIHRoaXMuYWRqdXN0UG9zaXRpb24odG9vbHRpcEVsKS50aGVuKChwb3NpdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSB0aGlzLmdldFN0YW5kYXJkUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICAgIHRvb2x0aXBJbnN0YW5jZS5wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgICAgIHRvb2x0aXBJbnN0YW5jZS5sZWZ0ID0gYCR7bGVmdH1weGA7XHJcbiAgICAgICAgdG9vbHRpcEluc3RhbmNlLnRvcCA9IGAke3RvcH1weGA7XHJcbiAgICAgICAgdG9vbHRpcEluc3RhbmNlLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH0sIDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGp1c3RQb3NpdGlvbihpbml0VG9vbHRpcEVsOiBIVE1MRWxlbWVudCk6IFByb21pc2U8UG9zaXRpb24+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9ID0gaW5pdFRvb2x0aXBFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3Qgd2luZG93V2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IGlzT3ZlckxlZnQgPSBsZWZ0IDwgMDtcclxuICAgICAgY29uc3QgaXNPdmVyUmlnaHQgPSByaWdodCA+IHdpbmRvd1dpZHRoO1xyXG4gICAgICBjb25zdCBpc092ZXJUb3AgPSB0b3AgPCAwO1xyXG4gICAgICBjb25zdCBpc092ZXJCb3R0b20gPSBib3R0b20gPiB3aW5kb3dIZWlnaHQ7XHJcbiAgICAgIGlmICghaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiAhaXNPdmVyVG9wKSByZXNvbHZlKHRoaXMub3B0aW9uLnBvc2l0aW9uID8/IFwiYm90dG9tXCIpO1xyXG4gICAgICBlbHNlIGlmIChpc092ZXJMZWZ0ICYmIGlzT3ZlclJpZ2h0ICYmIGlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJib3R0b21cIik7XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9uLnBvc2l0aW9uID09PSBcInRvcFwiKSB7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmICFpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJsZWZ0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJ0b3BcIik7XHJcbiAgICAgICAgaWYgKCFpc092ZXJMZWZ0ICYmICFpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcImJvdHRvbVwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJ0b3BcIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmIGlzT3ZlckJvdHRvbSAmJiAhaXNPdmVyVG9wKSByZXNvbHZlKFwicmlnaHRcIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmICFpc092ZXJCb3R0b20gJiYgaXNPdmVyVG9wKSByZXNvbHZlKFwicmlnaHRcIik7XHJcbiAgICAgICAgaWYgKCFpc092ZXJMZWZ0ICYmIGlzT3ZlclJpZ2h0ICYmIGlzT3ZlckJvdHRvbSAmJiAhaXNPdmVyVG9wKSByZXNvbHZlKFwibGVmdFwiKTtcclxuICAgICAgICBpZiAoIWlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJsZWZ0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcImxlZnRcIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJ0b3BcIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJib3R0b21cIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmIGlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJyaWdodFwiKTtcclxuICAgICAgICBpZiAoIWlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcImxlZnRcIik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb24ucG9zaXRpb24gPT09IFwibGVmdFwiKSB7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmICFpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJsZWZ0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJsZWZ0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJsZWZ0XCIpO1xyXG4gICAgICAgIGlmIChpc092ZXJMZWZ0ICYmIGlzT3ZlclJpZ2h0ICYmICFpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcImJvdHRvbVwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJyaWdodFwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJyaWdodFwiKTtcclxuICAgICAgICBpZiAoIWlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJsZWZ0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcImxlZnRcIik7XHJcbiAgICAgICAgaWYgKCFpc092ZXJMZWZ0ICYmICFpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgaXNPdmVyVG9wKSByZXNvbHZlKFwibGVmdFwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcInRvcFwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcImJvdHRvbVwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgaXNPdmVyVG9wKSByZXNvbHZlKFwibGVmdFwiKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbi5wb3NpdGlvbiA9PT0gXCJyaWdodFwiKSB7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmICFpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJsZWZ0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJyaWdodFwiKTtcclxuICAgICAgICBpZiAoIWlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmICFpc092ZXJCb3R0b20gJiYgaXNPdmVyVG9wKSByZXNvbHZlKFwicmlnaHRcIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiAhaXNPdmVyVG9wKSByZXNvbHZlKFwiYm90dG9tXCIpO1xyXG4gICAgICAgIGlmIChpc092ZXJMZWZ0ICYmICFpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmIChpc092ZXJMZWZ0ICYmICFpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcImxlZnRcIik7XHJcbiAgICAgICAgaWYgKCFpc092ZXJMZWZ0ICYmIGlzT3ZlclJpZ2h0ICYmICFpc092ZXJCb3R0b20gJiYgaXNPdmVyVG9wKSByZXNvbHZlKFwibGVmdFwiKTtcclxuICAgICAgICBpZiAoIWlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmIGlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJyaWdodFwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcInRvcFwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcImJvdHRvbVwiKTtcclxuICAgICAgICBpZiAoaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgaXNPdmVyVG9wKSByZXNvbHZlKFwibGVmdFwiKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbi5wb3NpdGlvbiA9PT0gXCJib3R0b21cIikge1xyXG4gICAgICAgIGlmIChpc092ZXJMZWZ0ICYmICFpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJyaWdodFwiKTtcclxuICAgICAgICBpZiAoIWlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiAhaXNPdmVyVG9wKSByZXNvbHZlKFwibGVmdFwiKTtcclxuICAgICAgICBpZiAoIWlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmIGlzT3ZlckJvdHRvbSAmJiAhaXNPdmVyVG9wKSByZXNvbHZlKFwidG9wXCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiAhaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJib3R0b21cIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiAhaXNPdmVyVG9wKSByZXNvbHZlKFwiYm90dG9tXCIpO1xyXG4gICAgICAgIGlmIChpc092ZXJMZWZ0ICYmICFpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmIChpc092ZXJMZWZ0ICYmICFpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgIWlzT3ZlclRvcCkgcmVzb2x2ZShcInJpZ2h0XCIpO1xyXG4gICAgICAgIGlmICghaXNPdmVyTGVmdCAmJiBpc092ZXJSaWdodCAmJiAhaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcImxlZnRcIik7XHJcbiAgICAgICAgaWYgKCFpc092ZXJMZWZ0ICYmICFpc092ZXJSaWdodCAmJiBpc092ZXJCb3R0b20gJiYgaXNPdmVyVG9wKSByZXNvbHZlKFwicmlnaHRcIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmICFpc092ZXJUb3ApIHJlc29sdmUoXCJ0b3BcIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgIWlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJib3R0b21cIik7XHJcbiAgICAgICAgaWYgKGlzT3ZlckxlZnQgJiYgIWlzT3ZlclJpZ2h0ICYmIGlzT3ZlckJvdHRvbSAmJiBpc092ZXJUb3ApIHJlc29sdmUoXCJyaWdodFwiKTtcclxuICAgICAgICBpZiAoIWlzT3ZlckxlZnQgJiYgaXNPdmVyUmlnaHQgJiYgaXNPdmVyQm90dG9tICYmIGlzT3ZlclRvcCkgcmVzb2x2ZShcImxlZnRcIik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBwcml2YXRlIGhpZGVUb29sdGlwKCkge1xyXG4gICAgaWYgKHRoaXMudG9vbHRpcENvbXBvbmVudFJlZikge1xyXG4gICAgICBjb25zdCB0b29sdGlwSW5zdGFuY2UgPSB0aGlzLnRvb2x0aXBDb21wb25lbnRSZWYuaW5zdGFuY2U7XHJcbiAgICAgIHRvb2x0aXBJbnN0YW5jZS52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudG9vbHRpcENvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==