UNPKG

ngx-slice-kit

Version:

[![npm version](https://badge.fury.io/js/ngx-slice-kit.svg)](https://badge.fury.io/js/ngx-slice-kit)

134 lines 23.7 kB
import { Component, EventEmitter, HostBinding, Inject, Input, Output, ViewChild } from '@angular/core'; import { NavigationStart } from '@angular/router'; import { fromEvent } from 'rxjs'; import { filter, take } from 'rxjs/operators'; import { OverlayDirective } from './overlay.directive'; import { DOCUMENT } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@angular/common"; import * as i3 from "./overlay.directive"; export class OverlayComponent { constructor(document, cfResolver, router, renderer) { this.document = document; this.cfResolver = cfResolver; this.router = router; this.renderer = renderer; this.className = ``; this.br = `0`; this.state = 'closed'; this.resultEvent = new EventEmitter(); } loadComponent() { const componentFactory = this.cfResolver.resolveComponentFactory(this.options.component); const viewRef = this.modalDirective.viewContainerRef; viewRef.clear(); const componentRef = viewRef.createComponent(componentFactory); componentRef.instance.options = this.options; componentRef.instance.resultEvent.subscribe(res => { this.onResult(res); }); } onResult(res) { this.resultEvent.next(res); this.resultEvent.complete(); } onBackdrop() { if (this.options.hideOnBackdrop) { this.onResult(); } } /** * - if `fitWidth` config options is true * there are width declared depending on its parent element * - if `rects.top` calculated there is enough place to drop it down, * if it hits `rects.bottom` – show it above the element */ setDropdownPosition() { if (this.rects.width) { this.renderer.setStyle(this.overlayElem.nativeElement, `width`, `${this.rects.width}px`); } if (this.rects.top) { this.renderer.setStyle(this.overlayElem.nativeElement, `top`, `${this.rects.top}px`); } else { this.renderer.setStyle(this.overlayElem.nativeElement, `bottom`, `${this.rects.bottom}px`); } this.renderer.setStyle(this.overlayElem.nativeElement, `left`, `${this.rects.left || this.options.triggerRect.left}px`); this.renderer.setStyle(this.overlayElem.nativeElement, `opacity`, 1); } hideOnRouterEvents() { const sub = this.router.events.pipe(filter(event => event instanceof NavigationStart)).subscribe(() => { this.onBackdrop(); }); this.sub ? this.sub.add(sub) : this.sub = sub; } /** * detect window resize and scroll to prevent failed dropdown position */ initClosingSubscriptions() { if (this.options.hideOnScroll) { const sub = fromEvent(window, 'scroll').pipe(take(1)).subscribe(() => { this.onResult(); }); this.sub ? this.sub.add(sub) : this.sub = sub; } if (this.options.hideOnWindowResize) { const sub = fromEvent(window, 'resize').pipe(take(1)).subscribe(() => { this.onResult(); }); this.sub ? this.sub.add(sub) : this.sub = sub; } } /** * keyboard events */ initKeydownSubscription() { this.sub.add(fromEvent(this.document, 'keydown').subscribe((e) => { switch (e.key || e.code) { case 'Escape': e.preventDefault(); e.stopPropagation(); this.onResult(); break; default: return; } })); } ngOnInit() { this.state = 'opened'; if (this.options.borderRadius > 0) { this.br = `${this.options.borderRadius}px`; } this.loadComponent(); this.hideOnRouterEvents(); } ngOnDestroy() { this.resultEvent?.complete(); this.sub?.unsubscribe(); } } OverlayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: OverlayComponent, deps: [{ token: DOCUMENT }, { token: i0.ComponentFactoryResolver }, { token: i1.Router }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); OverlayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: OverlayComponent, selector: "sdk-overlay", inputs: { options: "options" }, outputs: { resultEvent: "resultEvent" }, host: { properties: { "attr.state": "this.state" } }, viewQueries: [{ propertyName: "modalDirective", first: true, predicate: OverlayDirective, descendants: true, static: true }, { propertyName: "overlayElem", first: true, predicate: ["overlay"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"sdk-overlay-wrap flex-column layout-center-center\" [style.zIndex]=\"options.index\" autofocus>\n <div class=\"sdk-overlay-container flex-row layout-center-center\">\n <div class=\"sdk-overlay-backdrop\" [class.visible]=\"options.backdropVisible\" (click)=\"onBackdrop()\"></div>\n <div class=\"sdk-overlay-content-wrap flex-column\" [style.borderRadius]=\"br\">\n <div class=\"sdk-overlay-content\"\n [ngStyle]=\"options.styles\"\n [class.disable-scroll]=\"options.disableScroll\">\n <ng-template sdkOverlay #overlay></ng-template>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@keyframes openOverlay{0%{transform:scale(.5) translateY(100px);opacity:0}}.sdk-overlay-wrap{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;width:100vw;height:100vh;overflow:hidden}.sdk-overlay-wrap .sdk-overlay-container{position:relative;z-index:1;width:100%;height:100%;overflow-x:hidden;overflow-y:auto}.sdk-overlay-wrap .sdk-overlay-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;animation:opacity .2s}.sdk-overlay-wrap .sdk-overlay-backdrop.visible{background:rgba(21,21,21,.6)}.sdk-overlay-wrap .sdk-overlay-content-wrap{position:relative;z-index:2;min-width:64px;max-width:100%;min-height:64px;max-height:100%;animation:openOverlay .3s}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content{position:relative}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.full-width,.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.fullscreen{width:100vw}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.full-height,.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.fullscreen{height:100vh}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.fit-width{width:100%}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.fit-height{height:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.OverlayDirective, selector: "[sdkOverlay]" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: OverlayComponent, decorators: [{ type: Component, args: [{ selector: 'sdk-overlay', template: "<div class=\"sdk-overlay-wrap flex-column layout-center-center\" [style.zIndex]=\"options.index\" autofocus>\n <div class=\"sdk-overlay-container flex-row layout-center-center\">\n <div class=\"sdk-overlay-backdrop\" [class.visible]=\"options.backdropVisible\" (click)=\"onBackdrop()\"></div>\n <div class=\"sdk-overlay-content-wrap flex-column\" [style.borderRadius]=\"br\">\n <div class=\"sdk-overlay-content\"\n [ngStyle]=\"options.styles\"\n [class.disable-scroll]=\"options.disableScroll\">\n <ng-template sdkOverlay #overlay></ng-template>\n </div>\n </div>\n </div>\n</div>\n", styles: ["@keyframes openOverlay{0%{transform:scale(.5) translateY(100px);opacity:0}}.sdk-overlay-wrap{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;width:100vw;height:100vh;overflow:hidden}.sdk-overlay-wrap .sdk-overlay-container{position:relative;z-index:1;width:100%;height:100%;overflow-x:hidden;overflow-y:auto}.sdk-overlay-wrap .sdk-overlay-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;height:100%;animation:opacity .2s}.sdk-overlay-wrap .sdk-overlay-backdrop.visible{background:rgba(21,21,21,.6)}.sdk-overlay-wrap .sdk-overlay-content-wrap{position:relative;z-index:2;min-width:64px;max-width:100%;min-height:64px;max-height:100%;animation:openOverlay .3s}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content{position:relative}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.full-width,.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.fullscreen{width:100vw}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.full-height,.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.fullscreen{height:100vh}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.fit-width{width:100%}.sdk-overlay-wrap .sdk-overlay-content-wrap .sdk-overlay-content.fit-height{height:100%}\n"] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i0.ComponentFactoryResolver }, { type: i1.Router }, { type: i0.Renderer2 }]; }, propDecorators: { options: [{ type: Input }], modalDirective: [{ type: ViewChild, args: [OverlayDirective, { static: true }] }], overlayElem: [{ type: ViewChild, args: ['overlay', { static: true }] }], state: [{ type: HostBinding, args: ['attr.state'] }], resultEvent: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25neC1zbGljZS1raXQvc3JjL2xpYi9vdmVybGF5L292ZXJsYXkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtc2xpY2Uta2l0L3NyYy9saWIvb3ZlcmxheS9vdmVybGF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBR1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7OztBQU8zQyxNQUFNLE9BQU8sZ0JBQWdCO0lBYXpCLFlBQzhCLFFBQWEsRUFDL0IsVUFBb0MsRUFDcEMsTUFBYyxFQUNkLFFBQW1CO1FBSEQsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUMvQixlQUFVLEdBQVYsVUFBVSxDQUEwQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWR4QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLE9BQUUsR0FBVyxHQUFHLENBQUM7UUFNVSxVQUFLLEdBQXdCLFFBQVEsQ0FBQztRQUN2RCxnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO0lBUTFFLENBQUM7SUFFTSxhQUFhO1FBQ2hCLE1BQU0sZ0JB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QUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2hCLE1BQU07Z0JBQ1Y7b0JBQ0ksT0FBTzthQUNkO1FBQ0wsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUM7U0FDOUM7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDNUIsQ0FBQzs7NkdBcklRLGdCQUFnQixrQkFjYixRQUFRO2lHQWRYLGdCQUFnQixrT0FRZCxnQkFBZ0IscUtDbEMvQix3cUJBWUE7MkZEY2EsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNJLGFBQWE7OzBCQWtCbEIsTUFBTTsyQkFBQyxRQUFRO2dJQVBKLE9BQU87c0JBQXRCLEtBQUs7Z0JBQzhDLGNBQWM7c0JBQWpFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNFLFdBQVc7c0JBQXZELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDRixLQUFLO3NCQUF0QyxXQUFXO3VCQUFDLFlBQVk7Z0JBQ1IsV0FBVztzQkFBM0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE92ZXJsYXlNb2RlbCwgT3ZlcmxheU9wdGlvbnMgfSBmcm9tICcuL292ZXJsYXkubW9kZWwnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICcuL292ZXJsYXkuZGlyZWN0aXZlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzZGstb3ZlcmxheScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL292ZXJsYXkuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL292ZXJsYXkuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBPdmVybGF5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE92ZXJsYXlNb2RlbCB7XG5cbiAgICBwdWJsaWMgc3ViOiBTdWJzY3JpcHRpb247XG4gICAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nID0gYGA7XG4gICAgcHVibGljIGJyOiBzdHJpbmcgPSBgMGA7XG4gICAgcHVibGljIHJlY3RzOiB7IHRvcCwgYm90dG9tLCByaWdodCwgbGVmdCwgd2lkdGgsIGhlaWdodCwgeCwgeSB9O1xuXG4gICAgQElucHV0KCkgcHVibGljIG9wdGlvbnM6IE92ZXJsYXlPcHRpb25zO1xuICAgIEBWaWV3Q2hpbGQoT3ZlcmxheURpcmVjdGl2ZSwge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyBtb2RhbERpcmVjdGl2ZTogT3ZlcmxheURpcmVjdGl2ZTtcbiAgICBAVmlld0NoaWxkKCdvdmVybGF5Jywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyBvdmVybGF5RWxlbTogRWxlbWVudFJlZjtcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuc3RhdGUnKSBwdWJsaWMgc3RhdGU6ICdvcGVuZWQnIHwgJ2Nsb3NlZCcgPSAnY2xvc2VkJztcbiAgICBAT3V0cHV0KCkgcHVibGljIHJlc3VsdEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSBjZlJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICAgICkge1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gdGhpcy5jZlJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMub3B0aW9ucy5jb21wb25lbnQpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLm1vZGFsRGlyZWN0aXZlLnZpZXdDb250YWluZXJSZWY7XG4gICAgICAgIHZpZXdSZWYuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2aWV3UmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICAgICAgKGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBPdmVybGF5TW9kZWwpLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIChjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgT3ZlcmxheU1vZGVsKS5yZXN1bHRFdmVudC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIHRoaXMub25SZXN1bHQocmVzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVzdWx0KHJlcz86IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc3VsdEV2ZW50Lm5leHQocmVzKTtcbiAgICAgICAgdGhpcy5yZXN1bHRFdmVudC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJhY2tkcm9wKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhpZGVPbkJhY2tkcm9wKSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAtIGlmIGBmaXRXaWR0aGAgY29uZmlnIG9wdGlvbnMgaXMgdHJ1ZVxuICAgICAqIHRoZXJlIGFyZSB3aWR0aCBkZWNsYXJlZCBkZXBlbmRpbmcgb24gaXRzIHBhcmVudCBlbGVtZW50XG4gICAgICogLSBpZiBgcmVjdHMudG9wYCBjYWxjdWxhdGVkIHRoZXJlIGlzIGVub3VnaCBwbGFjZSB0byBkcm9wIGl0IGRvd24sXG4gICAgICogIGlmIGl0IGhpdHMgYHJlY3RzLmJvdHRvbWAg4oCTIHNob3cgaXQgYWJvdmUgdGhlIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RHJvcGRvd25Qb3NpdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucmVjdHMud2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5vdmVybGF5RWxlbS5uYXRpdmVFbGVtZW50LCBgd2lkdGhgLCBgJHt0aGlzLnJlY3RzLndpZHRofXB4YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWN0cy50b3ApIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5vdmVybGF5RWxlbS5uYXRpdmVFbGVtZW50LCBgdG9wYCwgYCR7dGhpcy5yZWN0cy50b3B9cHhgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5vdmVybGF5RWxlbS5uYXRpdmVFbGVtZW50LCBgYm90dG9tYCwgYCR7dGhpcy5yZWN0cy5ib3R0b219cHhgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5vdmVybGF5RWxlbS5uYXRpdmVFbGVtZW50LCBgbGVmdGAsIGAke3RoaXMucmVjdHMubGVmdCB8fCB0aGlzLm9wdGlvbnMudHJpZ2dlclJlY3QubGVmdH1weGApO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMub3ZlcmxheUVsZW0ubmF0aXZlRWxlbWVudCwgYG9wYWNpdHlgLCAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZU9uUm91dGVyRXZlbnRzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdWIgPSB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcbiAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydClcbiAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkJhY2tkcm9wKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3ViID8gdGhpcy5zdWIuYWRkKHN1YikgOiB0aGlzLnN1YiA9IHN1YjtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIGRldGVjdCB3aW5kb3cgcmVzaXplIGFuZCBzY3JvbGwgdG8gcHJldmVudCBmYWlsZWQgZHJvcGRvd24gcG9zaXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdENsb3NpbmdTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhpZGVPblNjcm9sbCkge1xuICAgICAgICAgICAgY29uc3Qgc3ViID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Njcm9sbCcpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZSgxKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25SZXN1bHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zdWIgPyB0aGlzLnN1Yi5hZGQoc3ViKSA6IHRoaXMuc3ViID0gc3ViO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5oaWRlT25XaW5kb3dSZXNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YiA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKFxuICAgICAgICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVzdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc3ViID8gdGhpcy5zdWIuYWRkKHN1YikgOiB0aGlzLnN1YiA9IHN1YjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGtleWJvYXJkIGV2ZW50c1xuICAgICAqL1xuICAgIHB1YmxpYyBpbml0S2V5ZG93blN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWIuYWRkKFxuICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMuZG9jdW1lbnQsICdrZXlkb3duJykuc3Vic2NyaWJlKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChlLmtleSB8fCBlLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdvcGVuZWQnO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJvcmRlclJhZGl1cyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnIgPSBgJHt0aGlzLm9wdGlvbnMuYm9yZGVyUmFkaXVzfXB4YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuXG4gICAgICAgIHRoaXMuaGlkZU9uUm91dGVyRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc3VsdEV2ZW50Py5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLnN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2RrLW92ZXJsYXktd3JhcCBmbGV4LWNvbHVtbiBsYXlvdXQtY2VudGVyLWNlbnRlclwiIFtzdHlsZS56SW5kZXhdPVwib3B0aW9ucy5pbmRleFwiIGF1dG9mb2N1cz5cbiAgICA8ZGl2IGNsYXNzPVwic2RrLW92ZXJsYXktY29udGFpbmVyIGZsZXgtcm93IGxheW91dC1jZW50ZXItY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZGstb3ZlcmxheS1iYWNrZHJvcFwiIFtjbGFzcy52aXNpYmxlXT1cIm9wdGlvbnMuYmFja2Ryb3BWaXNpYmxlXCIgKGNsaWNrKT1cIm9uQmFja2Ryb3AoKVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RrLW92ZXJsYXktY29udGVudC13cmFwIGZsZXgtY29sdW1uXCIgW3N0eWxlLmJvcmRlclJhZGl1c109XCJiclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkay1vdmVybGF5LWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJvcHRpb25zLnN0eWxlc1wiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlLXNjcm9sbF09XCJvcHRpb25zLmRpc2FibGVTY3JvbGxcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgc2RrT3ZlcmxheSAjb3ZlcmxheT48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=