UNPKG

@favian/headwind-ui

Version:

Headless UI for Angular - Styleless Angular components to integrate with Tailwind CSS

218 lines 36.1 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { HeadwindClickDetector } from '../../../services/headwind-click-detector.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import * as i0 from "@angular/core"; import * as i1 from "../../../services/headwind-window.service"; import * as i2 from "../../../services/headwind-click-detector.service"; import * as i3 from "../services/headwind-popover.service"; export class HeadwindPopoverOverlayComponent { constructor(_renderer, _elementRef, _headwindWindowService, _headwindClickDetector, _headwindPopoverService) { this._renderer = _renderer; this._elementRef = _elementRef; this._headwindWindowService = _headwindWindowService; this._headwindClickDetector = _headwindClickDetector; this._headwindPopoverService = _headwindPopoverService; this.direction = 'vertical'; this.directionPriority = 'bottom'; this.pinPriority = 'left'; this.actualDirectionChange = new EventEmitter(); this.actualPinChange = new EventEmitter(); this._headwindClickDetector.outsideClick.pipe(takeUntilDestroyed()).subscribe(() => { if (this._headwindPopoverService.popoverOpened) { this._headwindPopoverService.closePopover.emit(); } }); } ngAfterViewInit() { this._headwindClickDetector.register(this._elementRef.nativeElement); } updatePosition(button) { if (this._elementRef) { const host = this._elementRef.nativeElement; // clear all styles this._renderer.removeStyle(host, 'position'); this._renderer.removeStyle(host, 'top'); this._renderer.removeStyle(host, 'bottom'); this._renderer.removeStyle(host, 'left'); this._renderer.removeStyle(host, 'right'); this._renderer.setStyle(host, 'position', 'fixed'); const buttonDomRect = button.getBoundingClientRect(); const hostDomRect = host.getBoundingClientRect(); switch (this.direction) { case 'vertical': { this._updateVerticalDirectionByPriority(host, hostDomRect, buttonDomRect); this._updateVerticalDirectionPin(host, hostDomRect, buttonDomRect); break; } case 'horizontal': { this._updateHorizontalDirectionByPriority(host, hostDomRect, buttonDomRect); this._updateHorizontalDirectionPin(host, hostDomRect, buttonDomRect); break; } } } } _updateVerticalDirectionByPriority(host, hostDomRect, buttonDomRect) { if (this.directionPriority === 'top') { if (this._headwindWindowService.isTopSpaceAvailable(buttonDomRect.top, hostDomRect.height)) { this._renderer.setStyle(host, 'bottom', `calc(100% - ${buttonDomRect.top}px)`); this._emitActualDirectionTop(); } else if (this._headwindWindowService.isBottomSpaceAvailable(buttonDomRect.bottom, hostDomRect.height)) { this._renderer.setStyle(host, 'top', buttonDomRect.bottom + 'px'); this._emitActualDirectionBottom(); } else { this._renderer.setStyle(host, 'bottom', `calc(100% - ${buttonDomRect.top}px)`); this._emitActualDirectionTop(); } } else { if (this._headwindWindowService.isBottomSpaceAvailable(buttonDomRect.bottom, hostDomRect.height)) { this._renderer.setStyle(host, 'top', buttonDomRect.bottom + 'px'); this._emitActualDirectionBottom(); } else if (this._headwindWindowService.isTopSpaceAvailable(buttonDomRect.top, hostDomRect.height)) { this._renderer.setStyle(host, 'bottom', `calc(100% - ${buttonDomRect.top}px)`); this._emitActualDirectionTop(); } else { this._renderer.setStyle(host, 'top', buttonDomRect.bottom + 'px'); this._emitActualDirectionBottom(); } } } _updateHorizontalDirectionByPriority(host, hostDomRect, buttonDomRect) { if (this.directionPriority === 'left') { if (this._headwindWindowService.isLeftSpaceAvailable(buttonDomRect.left, hostDomRect.width)) { this._renderer.setStyle(host, 'right', `calc(100% - ${buttonDomRect.left}px)`); this._emitActualDirectionLeft(); } else if (this._headwindWindowService.isRightSpaceAvailable(buttonDomRect.right, hostDomRect.width)) { this._renderer.setStyle(host, 'left', buttonDomRect.right + 'px'); this._emitActualDirectionRight(); } else { this._renderer.setStyle(host, 'right', `calc(100% - ${buttonDomRect.left}px)`); this._emitActualDirectionLeft(); } } else { if (this._headwindWindowService.isRightSpaceAvailable(buttonDomRect.right, hostDomRect.width)) { this._renderer.setStyle(host, 'left', buttonDomRect.right + 'px'); this._emitActualDirectionRight(); } else if (this._headwindWindowService.isLeftSpaceAvailable(buttonDomRect.left, hostDomRect.width)) { this._renderer.setStyle(host, 'right', `calc(100% - ${buttonDomRect.left}px)`); this._emitActualDirectionLeft(); } else { this._renderer.setStyle(host, 'left', buttonDomRect.right + 'px'); this._emitActualDirectionRight(); } } } _updateVerticalDirectionPin(host, hostDomRect, buttonDomRect) { if (this.pinPriority === 'right') { if (this._headwindWindowService.isLeftSpaceAvailable(buttonDomRect.right, hostDomRect.width)) { this._renderer.setStyle(host, 'right', `calc(100% - ${buttonDomRect.right}px)`); this._emitActualPinRight(); } else if (this._headwindWindowService.isRightSpaceAvailable(buttonDomRect.left, hostDomRect.width)) { this._renderer.setStyle(host, 'left', buttonDomRect.left + 'px'); this._emitActualPinLeft(); } else { this._renderer.setStyle(host, 'right', `calc(100% - ${buttonDomRect.right}px)`); this._emitActualPinRight(); } } else { if (this._headwindWindowService.isRightSpaceAvailable(buttonDomRect.left, hostDomRect.width)) { this._renderer.setStyle(host, 'left', buttonDomRect.left + 'px'); this._emitActualPinLeft(); } else if (this._headwindWindowService.isLeftSpaceAvailable(buttonDomRect.right, hostDomRect.width)) { this._renderer.setStyle(host, 'right', `calc(100% - ${buttonDomRect.right}px)`); this._emitActualPinRight(); } else { this._renderer.setStyle(host, 'left', buttonDomRect.left + 'px'); this._emitActualPinLeft(); } } } _updateHorizontalDirectionPin(host, hostDomRect, buttonDomRect) { if (this.pinPriority === 'bottom') { if (this._headwindWindowService.isTopSpaceAvailable(buttonDomRect.bottom, hostDomRect.height)) { this._renderer.setStyle(host, 'bottom', `calc(100% - ${buttonDomRect.bottom}px)`); this._emitActualPinTop(); } else if (this._headwindWindowService.isBottomSpaceAvailable(buttonDomRect.top, hostDomRect.height)) { this._renderer.setStyle(host, 'top', buttonDomRect.top + 'px'); this._emitActualPinBottom(); } else { this._renderer.setStyle(host, 'bottom', `calc(100% - ${buttonDomRect.bottom}px)`); this._emitActualPinTop(); } } else { if (this._headwindWindowService.isBottomSpaceAvailable(buttonDomRect.top, hostDomRect.height)) { this._renderer.setStyle(host, 'top', buttonDomRect.top + 'px'); this._emitActualPinBottom(); } else if (this._headwindWindowService.isTopSpaceAvailable(buttonDomRect.bottom, hostDomRect.height)) { this._renderer.setStyle(host, 'bottom', `calc(100% - ${buttonDomRect.bottom}px)`); this._emitActualPinTop(); } else { this._renderer.setStyle(host, 'top', buttonDomRect.top + 'px'); this._emitActualPinBottom(); } } } _emitActualDirectionTop() { this.actualDirectionChange.emit('top'); } _emitActualDirectionBottom() { this.actualDirectionChange.emit('bottom'); } _emitActualDirectionLeft() { this.actualDirectionChange.emit('left'); } _emitActualDirectionRight() { this.actualDirectionChange.emit('right'); } _emitActualPinTop() { this.actualPinChange.emit('top'); } _emitActualPinBottom() { this.actualPinChange.emit('bottom'); } _emitActualPinLeft() { this.actualPinChange.emit('left'); } _emitActualPinRight() { this.actualPinChange.emit('right'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadwindPopoverOverlayComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.HeadwindWindowService }, { token: i2.HeadwindClickDetector }, { token: i3.HeadwindPopoverService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: HeadwindPopoverOverlayComponent, isStandalone: true, selector: "headwind-popover-overlay", inputs: { direction: "direction", directionPriority: "directionPriority", pinPriority: "pinPriority" }, outputs: { actualDirectionChange: "actualDirectionChange", actualPinChange: "actualPinChange" }, host: { classAttribute: "headwind-popover-overlay" }, providers: [HeadwindClickDetector], ngImport: i0, template: "<ng-content></ng-content>\r\n", styles: [""] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeadwindPopoverOverlayComponent, decorators: [{ type: Component, args: [{ selector: 'headwind-popover-overlay', standalone: true, imports: [], host: { class: 'headwind-popover-overlay', }, providers: [HeadwindClickDetector], template: "<ng-content></ng-content>\r\n" }] }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.HeadwindWindowService }, { type: i2.HeadwindClickDetector }, { type: i3.HeadwindPopoverService }], propDecorators: { direction: [{ type: Input }], directionPriority: [{ type: Input }], pinPriority: [{ type: Input }], actualDirectionChange: [{ type: Output }], actualPinChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZHdpbmQtcG9wb3Zlci1vdmVybGF5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hlYWR3aW5kLXVpL3NyYy9jb21wb25lbnRzL2hlYWR3aW5kLXBvcG92ZXIvaGVhZHdpbmQtcG9wb3Zlci1vdmVybGF5L2hlYWR3aW5kLXBvcG92ZXItb3ZlcmxheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oZWFkd2luZC11aS9zcmMvY29tcG9uZW50cy9oZWFkd2luZC1wb3BvdmVyL2hlYWR3aW5kLXBvcG92ZXItb3ZlcmxheS9oZWFkd2luZC1wb3BvdmVyLW92ZXJsYXkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFFN0csT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7O0FBZ0JoRSxNQUFNLE9BQU8sK0JBQStCO0lBUTFDLFlBQ21CLFNBQW9CLEVBQ3BCLFdBQW9DLEVBQ3BDLHNCQUE2QyxFQUM3QyxzQkFBNkMsRUFDN0MsdUJBQStDO1FBSi9DLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBQ3BDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBdUI7UUFDN0MsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF1QjtRQUM3Qyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXdCO1FBWnpELGNBQVMsR0FBcUIsVUFBVSxDQUFDO1FBQ3pDLHNCQUFpQixHQUFpQixRQUFRLENBQUM7UUFDM0MsZ0JBQVcsR0FBaUIsTUFBTSxDQUFDO1FBRWxDLDBCQUFxQixHQUFHLElBQUks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QkFBb0I7UUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBbE1VLCtCQUErQjttR0FBL0IsK0JBQStCLHNVQUYvQixDQUFDLHFCQUFxQixDQUFDLDBCQ2pCcEMsK0JBQ0E7OzRGRGtCYSwrQkFBK0I7a0JBWDNDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxFQUFFLFFBR0w7d0JBQ0osS0FBSyxFQUFFLDBCQUEwQjtxQkFDbEMsYUFDVSxDQUFDLHFCQUFxQixDQUFDO29OQUd6QixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVJLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIZWFkd2luZFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9oZWFkd2luZC13aW5kb3cuc2VydmljZSc7XHJcbmltcG9ydCB7IEhlYWR3aW5kQ2xpY2tEZXRlY3RvciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2hlYWR3aW5kLWNsaWNrLWRldGVjdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcbmltcG9ydCB7IEhlYWR3aW5kUG9wb3ZlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9oZWFkd2luZC1wb3BvdmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMaW5lYXJEaXJlY3Rpb25zIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvbGluZWFyLWRpcmVjdGlvbnMnO1xyXG5pbXBvcnQgeyBYWURpcmVjdGlvbnMgfSBmcm9tICcuLi8uLi8uLi90eXBlcy94eS1kaXJlY3Rpb25zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaGVhZHdpbmQtcG9wb3Zlci1vdmVybGF5JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9oZWFkd2luZC1wb3BvdmVyLW92ZXJsYXkuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9oZWFkd2luZC1wb3BvdmVyLW92ZXJsYXkuY29tcG9uZW50LnNjc3MnLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiAnaGVhZHdpbmQtcG9wb3Zlci1vdmVybGF5JyxcclxuICB9LFxyXG4gIHByb3ZpZGVyczogW0hlYWR3aW5kQ2xpY2tEZXRlY3Rvcl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIZWFkd2luZFBvcG92ZXJPdmVybGF5Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQElucHV0KCkgZGlyZWN0aW9uOiBMaW5lYXJEaXJlY3Rpb25zID0gJ3ZlcnRpY2FsJztcclxuICBASW5wdXQoKSBkaXJlY3Rpb25Qcmlvcml0eTogWFlEaXJlY3Rpb25zID0gJ2JvdHRvbSc7XHJcbiAgQElucHV0KCkgcGluUHJpb3JpdHk6IFhZRGlyZWN0aW9ucyA9ICdsZWZ0JztcclxuXHJcbiAgQE91dHB1dCgpIGFjdHVhbERpcmVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8WFlEaXJlY3Rpb25zPigpO1xyXG4gIEBPdXRwdXQoKSBhY3R1YWxQaW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFhZRGlyZWN0aW9ucz4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkd2luZFdpbmRvd1NlcnZpY2U6IEhlYWR3aW5kV2luZG93U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hlYWR3aW5kQ2xpY2tEZXRlY3RvcjogSGVhZHdpbmRDbGlja0RldGVjdG9yLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGVhZHdpbmRQb3BvdmVyU2VydmljZTogSGVhZHdpbmRQb3BvdmVyU2VydmljZSxcclxuICApIHtcclxuICAgIHRoaXMuX2hlYWR3aW5kQ2xpY2tEZXRlY3Rvci5vdXRzaWRlQ2xpY2sucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuX2hlYWR3aW5kUG9wb3ZlclNlcnZpY2UucG9wb3Zlck9wZW5lZCkge1xyXG4gICAgICAgIHRoaXMuX2hlYWR3aW5kUG9wb3ZlclNlcnZpY2UuY2xvc2VQb3BvdmVyLmVtaXQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLl9oZWFkd2luZENsaWNrRGV0ZWN0b3IucmVnaXN0ZXIodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVBvc2l0aW9uKGJ1dHRvbjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9lbGVtZW50UmVmKSB7XHJcbiAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAvLyBjbGVhciBhbGwgc3R5bGVzXHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3QsICdwb3NpdGlvbicpO1xyXG4gICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVTdHlsZShob3N0LCAndG9wJyk7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3QsICdib3R0b20nKTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUoaG9zdCwgJ2xlZnQnKTtcclxuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUoaG9zdCwgJ3JpZ2h0Jyk7XHJcblxyXG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAncG9zaXRpb24nLCAnZml4ZWQnKTtcclxuXHJcbiAgICAgIGNvbnN0IGJ1dHRvbkRvbVJlY3QgPSBidXR0b24uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IGhvc3REb21SZWN0ID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgIHN3aXRjaCAodGhpcy5kaXJlY3Rpb24pIHtcclxuICAgICAgICBjYXNlICd2ZXJ0aWNhbCc6IHtcclxuICAgICAgICAgIHRoaXMuX3VwZGF0ZVZlcnRpY2FsRGlyZWN0aW9uQnlQcmlvcml0eShob3N0LCBob3N0RG9tUmVjdCwgYnV0dG9uRG9tUmVjdCk7XHJcbiAgICAgICAgICB0aGlzLl91cGRhdGVWZXJ0aWNhbERpcmVjdGlvblBpbihob3N0LCBob3N0RG9tUmVjdCwgYnV0dG9uRG9tUmVjdCk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlICdob3Jpem9udGFsJzoge1xyXG4gICAgICAgICAgdGhpcy5fdXBkYXRlSG9yaXpvbnRhbERpcmVjdGlvbkJ5UHJpb3JpdHkoaG9zdCwgaG9zdERvbVJlY3QsIGJ1dHRvbkRvbVJlY3QpO1xyXG4gICAgICAgICAgdGhpcy5fdXBkYXRlSG9yaXpvbnRhbERpcmVjdGlvblBpbihob3N0LCBob3N0RG9tUmVjdCwgYnV0dG9uRG9tUmVjdCk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVWZXJ0aWNhbERpcmVjdGlvbkJ5UHJpb3JpdHkoaG9zdDogSFRNTEVsZW1lbnQsIGhvc3REb21SZWN0OiBET01SZWN0LCBidXR0b25Eb21SZWN0OiBET01SZWN0KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXJlY3Rpb25Qcmlvcml0eSA9PT0gJ3RvcCcpIHtcclxuICAgICAgaWYgKHRoaXMuX2hlYWR3aW5kV2luZG93U2VydmljZS5pc1RvcFNwYWNlQXZhaWxhYmxlKGJ1dHRvbkRvbVJlY3QudG9wLCBob3N0RG9tUmVjdC5oZWlnaHQpKSB7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoaG9zdCwgJ2JvdHRvbScsIGBjYWxjKDEwMCUgLSAke2J1dHRvbkRvbVJlY3QudG9wfXB4KWApO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxEaXJlY3Rpb25Ub3AoKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9oZWFkd2luZFdpbmRvd1NlcnZpY2UuaXNCb3R0b21TcGFjZUF2YWlsYWJsZShidXR0b25Eb21SZWN0LmJvdHRvbSwgaG9zdERvbVJlY3QuaGVpZ2h0KSkge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICd0b3AnLCBidXR0b25Eb21SZWN0LmJvdHRvbSArICdweCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxEaXJlY3Rpb25Cb3R0b20oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAnYm90dG9tJywgYGNhbGMoMTAwJSAtICR7YnV0dG9uRG9tUmVjdC50b3B9cHgpYCk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbERpcmVjdGlvblRvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5faGVhZHdpbmRXaW5kb3dTZXJ2aWNlLmlzQm90dG9tU3BhY2VBdmFpbGFibGUoYnV0dG9uRG9tUmVjdC5ib3R0b20sIGhvc3REb21SZWN0LmhlaWdodCkpIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAndG9wJywgYnV0dG9uRG9tUmVjdC5ib3R0b20gKyAncHgnKTtcclxuICAgICAgICB0aGlzLl9lbWl0QWN0dWFsRGlyZWN0aW9uQm90dG9tKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGVhZHdpbmRXaW5kb3dTZXJ2aWNlLmlzVG9wU3BhY2VBdmFpbGFibGUoYnV0dG9uRG9tUmVjdC50b3AsIGhvc3REb21SZWN0LmhlaWdodCkpIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAnYm90dG9tJywgYGNhbGMoMTAwJSAtICR7YnV0dG9uRG9tUmVjdC50b3B9cHgpYCk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbERpcmVjdGlvblRvcCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICd0b3AnLCBidXR0b25Eb21SZWN0LmJvdHRvbSArICdweCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxEaXJlY3Rpb25Cb3R0b20oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlSG9yaXpvbnRhbERpcmVjdGlvbkJ5UHJpb3JpdHkoaG9zdDogSFRNTEVsZW1lbnQsIGhvc3REb21SZWN0OiBET01SZWN0LCBidXR0b25Eb21SZWN0OiBET01SZWN0KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXJlY3Rpb25Qcmlvcml0eSA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIGlmICh0aGlzLl9oZWFkd2luZFdpbmRvd1NlcnZpY2UuaXNMZWZ0U3BhY2VBdmFpbGFibGUoYnV0dG9uRG9tUmVjdC5sZWZ0LCBob3N0RG9tUmVjdC53aWR0aCkpIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAncmlnaHQnLCBgY2FsYygxMDAlIC0gJHtidXR0b25Eb21SZWN0LmxlZnR9cHgpYCk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbERpcmVjdGlvbkxlZnQoKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9oZWFkd2luZFdpbmRvd1NlcnZpY2UuaXNSaWdodFNwYWNlQXZhaWxhYmxlKGJ1dHRvbkRvbVJlY3QucmlnaHQsIGhvc3REb21SZWN0LndpZHRoKSkge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICdsZWZ0JywgYnV0dG9uRG9tUmVjdC5yaWdodCArICdweCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxEaXJlY3Rpb25SaWdodCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICdyaWdodCcsIGBjYWxjKDEwMCUgLSAke2J1dHRvbkRvbVJlY3QubGVmdH1weClgKTtcclxuICAgICAgICB0aGlzLl9lbWl0QWN0dWFsRGlyZWN0aW9uTGVmdCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5faGVhZHdpbmRXaW5kb3dTZXJ2aWNlLmlzUmlnaHRTcGFjZUF2YWlsYWJsZShidXR0b25Eb21SZWN0LnJpZ2h0LCBob3N0RG9tUmVjdC53aWR0aCkpIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAnbGVmdCcsIGJ1dHRvbkRvbVJlY3QucmlnaHQgKyAncHgnKTtcclxuICAgICAgICB0aGlzLl9lbWl0QWN0dWFsRGlyZWN0aW9uUmlnaHQoKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9oZWFkd2luZFdpbmRvd1NlcnZpY2UuaXNMZWZ0U3BhY2VBdmFpbGFibGUoYnV0dG9uRG9tUmVjdC5sZWZ0LCBob3N0RG9tUmVjdC53aWR0aCkpIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAncmlnaHQnLCBgY2FsYygxMDAlIC0gJHtidXR0b25Eb21SZWN0LmxlZnR9cHgpYCk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbERpcmVjdGlvbkxlZnQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAnbGVmdCcsIGJ1dHRvbkRvbVJlY3QucmlnaHQgKyAncHgnKTtcclxuICAgICAgICB0aGlzLl9lbWl0QWN0dWFsRGlyZWN0aW9uUmlnaHQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlVmVydGljYWxEaXJlY3Rpb25QaW4oaG9zdDogSFRNTEVsZW1lbnQsIGhvc3REb21SZWN0OiBET01SZWN0LCBidXR0b25Eb21SZWN0OiBET01SZWN0KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5waW5Qcmlvcml0eSA9PT0gJ3JpZ2h0Jykge1xyXG4gICAgICBpZiAodGhpcy5faGVhZHdpbmRXaW5kb3dTZXJ2aWNlLmlzTGVmdFNwYWNlQXZhaWxhYmxlKGJ1dHRvbkRvbVJlY3QucmlnaHQsIGhvc3REb21SZWN0LndpZHRoKSkge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICdyaWdodCcsIGBjYWxjKDEwMCUgLSAke2J1dHRvbkRvbVJlY3QucmlnaHR9cHgpYCk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbFBpblJpZ2h0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGVhZHdpbmRXaW5kb3dTZXJ2aWNlLmlzUmlnaHRTcGFjZUF2YWlsYWJsZShidXR0b25Eb21SZWN0LmxlZnQsIGhvc3REb21SZWN0LndpZHRoKSkge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICdsZWZ0JywgYnV0dG9uRG9tUmVjdC5sZWZ0ICsgJ3B4Jyk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbFBpbkxlZnQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAncmlnaHQnLCBgY2FsYygxMDAlIC0gJHtidXR0b25Eb21SZWN0LnJpZ2h0fXB4KWApO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxQaW5SaWdodCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5faGVhZHdpbmRXaW5kb3dTZXJ2aWNlLmlzUmlnaHRTcGFjZUF2YWlsYWJsZShidXR0b25Eb21SZWN0LmxlZnQsIGhvc3REb21SZWN0LndpZHRoKSkge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICdsZWZ0JywgYnV0dG9uRG9tUmVjdC5sZWZ0ICsgJ3B4Jyk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbFBpbkxlZnQoKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9oZWFkd2luZFdpbmRvd1NlcnZpY2UuaXNMZWZ0U3BhY2VBdmFpbGFibGUoYnV0dG9uRG9tUmVjdC5yaWdodCwgaG9zdERvbVJlY3Qud2lkdGgpKSB7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoaG9zdCwgJ3JpZ2h0JywgYGNhbGMoMTAwJSAtICR7YnV0dG9uRG9tUmVjdC5yaWdodH1weClgKTtcclxuICAgICAgICB0aGlzLl9lbWl0QWN0dWFsUGluUmlnaHQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAnbGVmdCcsIGJ1dHRvbkRvbVJlY3QubGVmdCArICdweCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxQaW5MZWZ0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZUhvcml6b250YWxEaXJlY3Rpb25QaW4oaG9zdDogSFRNTEVsZW1lbnQsIGhvc3REb21SZWN0OiBET01SZWN0LCBidXR0b25Eb21SZWN0OiBET01SZWN0KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5waW5Qcmlvcml0eSA9PT0gJ2JvdHRvbScpIHtcclxuICAgICAgaWYgKHRoaXMuX2hlYWR3aW5kV2luZG93U2VydmljZS5pc1RvcFNwYWNlQXZhaWxhYmxlKGJ1dHRvbkRvbVJlY3QuYm90dG9tLCBob3N0RG9tUmVjdC5oZWlnaHQpKSB7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoaG9zdCwgJ2JvdHRvbScsIGBjYWxjKDEwMCUgLSAke2J1dHRvbkRvbVJlY3QuYm90dG9tfXB4KWApO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxQaW5Ub3AoKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9oZWFkd2luZFdpbmRvd1NlcnZpY2UuaXNCb3R0b21TcGFjZUF2YWlsYWJsZShidXR0b25Eb21SZWN0LnRvcCwgaG9zdERvbVJlY3QuaGVpZ2h0KSkge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICd0b3AnLCBidXR0b25Eb21SZWN0LnRvcCArICdweCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxQaW5Cb3R0b20oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAnYm90dG9tJywgYGNhbGMoMTAwJSAtICR7YnV0dG9uRG9tUmVjdC5ib3R0b219cHgpYCk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbFBpblRvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5faGVhZHdpbmRXaW5kb3dTZXJ2aWNlLmlzQm90dG9tU3BhY2VBdmFpbGFibGUoYnV0dG9uRG9tUmVjdC50b3AsIGhvc3REb21SZWN0LmhlaWdodCkpIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAndG9wJywgYnV0dG9uRG9tUmVjdC50b3AgKyAncHgnKTtcclxuICAgICAgICB0aGlzLl9lbWl0QWN0dWFsUGluQm90dG9tKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGVhZHdpbmRXaW5kb3dTZXJ2aWNlLmlzVG9wU3BhY2VBdmFpbGFibGUoYnV0dG9uRG9tUmVjdC5ib3R0b20sIGhvc3REb21SZWN0LmhlaWdodCkpIHtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShob3N0LCAnYm90dG9tJywgYGNhbGMoMTAwJSAtICR7YnV0dG9uRG9tUmVjdC5ib3R0b219cHgpYCk7XHJcbiAgICAgICAgdGhpcy5fZW1pdEFjdHVhbFBpblRvcCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICd0b3AnLCBidXR0b25Eb21SZWN0LnRvcCArICdweCcpO1xyXG4gICAgICAgIHRoaXMuX2VtaXRBY3R1YWxQaW5Cb3R0b20oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZW1pdEFjdHVhbERpcmVjdGlvblRvcCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0dWFsRGlyZWN0aW9uQ2hhbmdlLmVtaXQoJ3RvcCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZW1pdEFjdHVhbERpcmVjdGlvbkJvdHRvbSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0dWFsRGlyZWN0aW9uQ2hhbmdlLmVtaXQoJ2JvdHRvbScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZW1pdEFjdHVhbERpcmVjdGlvbkxlZnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdHVhbERpcmVjdGlvbkNoYW5nZS5lbWl0KCdsZWZ0Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9lbWl0QWN0dWFsRGlyZWN0aW9uUmlnaHQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdHVhbERpcmVjdGlvbkNoYW5nZS5lbWl0KCdyaWdodCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZW1pdEFjdHVhbFBpblRvcCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0dWFsUGluQ2hhbmdlLmVtaXQoJ3RvcCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZW1pdEFjdHVhbFBpbkJvdHRvbSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0dWFsUGluQ2hhbmdlLmVtaXQoJ2JvdHRvbScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZW1pdEFjdHVhbFBpbkxlZnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdHVhbFBpbkNoYW5nZS5lbWl0KCdsZWZ0Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9lbWl0QWN0dWFsUGluUmlnaHQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdHVhbFBpbkNoYW5nZS5lbWl0KCdyaWdodCcpO1xyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiJdfQ==