UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

322 lines 47.5 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Overlay, OverlayConfig, } from "@angular/cdk/overlay"; import { DOCUMENT } from "@angular/common"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Inject, Input, Output, ViewChild, ViewEncapsulation, } from "@angular/core"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { DOCUMENT_CLICK_EVENT } from "../../constants/event.constants"; import { EventBusService } from "../../services/event-bus.service"; import { OVERLAY_WITH_POPUP_STYLES_CLASS } from "../overlay/constants"; import { OverlayComponent } from "../overlay/overlay-component/overlay.component"; import { PopupToggleDirective } from "../popup/popup-toggle.directive"; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; import * as i2 from "../../services/event-bus.service"; import * as i3 from "../../common/directives/click-interceptor/click-interceptor.directive"; import * as i4 from "../overlay/overlay-component/overlay.component"; const POPUP_V2 = "nui-overlay"; const POPUP_VISIBLE = "visible"; const ADAPTER_OVERLAY_CONFIG = { panelClass: ["popup-adapter-overlay", OVERLAY_WITH_POPUP_STYLES_CLASS], }; /** @dynamic */ export class PopupComponent { get overlayConfig() { return this._overlayConfig; } set overlayConfig(value) { this._overlayConfig = { ...ADAPTER_OVERLAY_CONFIG, ...value, }; } set isOpen(open) { if (this.isContentInitialized) { this.isOpenHandler(open); return; } setTimeout(() => this.isOpenHandler(open)); } get isOpen() { return !!this.popup?.showing; } set visible(value) { this._visible = value; if (value) { this.popup.getOverlayRef().addPanelClass(POPUP_VISIBLE); return; } this.popup.getOverlayRef().removePanelClass(POPUP_VISIBLE); } get visible() { return Boolean(this._visible); } constructor(overlay, cdRef, eventBusService, host, document) { this.overlay = overlay; this.cdRef = cdRef; this.eventBusService = eventBusService; this.host = host; this.document = document; this.width = "auto"; this.appendToBody = false; this.ariaLabel = "Popup"; this.opened = new EventEmitter(); this._overlayConfig = ADAPTER_OVERLAY_CONFIG; this.destroy$ = new Subject(); } ngOnChanges(changes) { if (changes.appendToBody) { if (changes.appendToBody?.currentValue === false) { this.customContainer = this.popupArea; } else { this.customContainer = undefined; } } if (changes.width) { this.overlayConfig = { ...this.overlayConfig, width: this.width }; } if (changes.directionTop || changes.directionRight) { this.overlayConfig = { ...this.overlayConfig, positionStrategy: this.getPositionStrategy(), }; } } ngAfterContentInit() { this.isContentInitialized = true; this.initToggleRef(); this.overlayConfig = { ...this.overlayConfig, positionStrategy: this.getPositionStrategy(), }; if (this.popupToggle) { this.popupToggle.toggle.subscribe((e) => this.toggleOpened(e)); } } ngAfterViewInit() { this.overlayConfig = { ...this.overlayConfig, width: this.width }; if (this.manualOpenControl) { this.manualOpenControl.subscribe((e) => this.toggleOpened(e)); } if (!this.appendToBody) { this.customContainer = this.popupArea; } this.eventBusService .getStream(DOCUMENT_CLICK_EVENT) .pipe(takeUntil(this.destroy$)) .subscribe((event) => { const isToggle = this.popupToggle && event ? this.popupToggle.host.nativeElement.contains(event.target) : false; if (this.isOpen && !isToggle) { this.closePopup(); } }); this.cdRef.detectChanges(); } toggleOpened(event) { let emit = true; if (event) { if (this.lastEventType === "focusin" && event.type === "focusin") { if (this.isOpen) { emit = true; } } // since click triggers focusin event, we need to prevent popup from closing // when focus on the input is gained via click if (this.lastEventType === "focusin" && event.type === "click") { emit = false; } // if popup is already closed, prevent it from opening on focusout if (event.type === "focusout" && !this.isOpen) { emit = false; } this.lastEventType = event.type; } if (emit) { this.toggle(); } } closePopup() { this.hide(); } ngOnDestroy() { if (this.isOpen) { this.hide(); } this.destroy$.next(); this.destroy$.complete(); } getPopupConnectedPosition() { const leftBottom = { originX: "start", originY: "bottom", overlayX: "start", overlayY: "top", }; const topRight = { originX: "start", originY: "top", overlayX: "start", overlayY: "bottom", }; const topLeft = { originX: "end", originY: "top", overlayX: "start", overlayY: "bottom", }; const bottomRight = { originX: "end", originY: "bottom", overlayX: "end", overlayY: "top", }; const bottomLeft = { originX: "end", originY: "bottom", overlayX: "end", overlayY: "top", }; const rightTop = { originX: "end", originY: "top", overlayX: "end", overlayY: "bottom", }; if (this.directionTop && this.directionRight) { return [rightTop]; } if (this.directionTop) { return [topRight, topLeft]; } if (this.directionRight) { return [bottomRight, bottomLeft]; } return [ leftBottom, topRight, topLeft, bottomRight, bottomLeft, rightTop, ]; } getPositionStrategy() { const defaultViewportMargin = 0; return this.overlay .position() .flexibleConnectedTo(this.toggleReference) .withPush(false) .withViewportMargin(defaultViewportMargin) .withPositions(this.getPopupConnectedPosition()); } isOpenHandler(open) { open ? this.show() : this.hide(); } show() { if (!this.toggleReference) { return; } this.initToggleRef(); this.popup.show(); const overlayContainer = this.popup.getOverlayRef().overlayElement; this.popupAreaContent = new ElementRef(overlayContainer); this.popupAreaContainer = new ElementRef(overlayContainer.querySelector(`.${POPUP_V2}`)); if (this.contextClass) { this.contextClass.split(" ").forEach((contextClass) => { this.popupAreaContainer.nativeElement.classList.add(contextClass); }); } this.visible = true; this.opened.emit(this.popup.showing); } hide() { this.visible = false; setTimeout(() => { this.popup.hide(); this.opened.emit(this.popup.showing); }); } toggle() { this.popup.showing ? this.hide() : this.show(); this.popup.getOverlayRef().updatePosition(); } initToggleRef() { if (this.isHostToggleRef) { this.toggleReference = this.host.nativeElement; return; } this.toggleReference = this.popupToggle ? this.popupToggle.host.nativeElement : this.document.querySelector(this.baseElementSelector); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopupComponent, deps: [{ token: i1.Overlay }, { token: i0.ChangeDetectorRef }, { token: i2.EventBusService }, { token: i0.ElementRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PopupComponent, selector: "nui-popup", inputs: { width: "width", overlayConfig: "overlayConfig", contextClass: "contextClass", directionTop: "directionTop", directionRight: "directionRight", manualOpenControl: "manualOpenControl", appendToBody: "appendToBody", baseElementSelector: "baseElementSelector", isHostToggleRef: "isHostToggleRef", ariaLabel: "ariaLabel", isOpen: "isOpen", visible: "visible" }, outputs: { opened: "opened" }, host: { attributes: { "role": "dialog" }, properties: { "attr.aria-label": "ariaLabel" }, classAttribute: "nui-popup" }, queries: [{ propertyName: "popupToggle", first: true, predicate: PopupToggleDirective, descendants: true }], viewQueries: [{ propertyName: "popupArea", first: true, predicate: ["popupArea"], descendants: true, static: true }, { propertyName: "popup", first: true, predicate: OverlayComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n nuiClickInterceptor\n class=\"nui-popup-container\"\n [class.nui-popup--opened]=\"isOpen\"\n>\n <div class=\"nui-popup__content\">\n <ng-content></ng-content>\n </div>\n <div #popupArea></div>\n\n <nui-overlay\n [toggleReference]=\"toggleReference\"\n [overlayConfig]=\"overlayConfig\"\n [customContainer]=\"customContainer\"\n >\n <div class=\"nui-popup__area\">\n <div class=\"nui-popup__area--container\">\n <ng-content select=\"[popupAreaContent]\"></ng-content>\n </div>\n </div>\n </nui-overlay>\n</div>\n", styles: [".nui-popup{display:inline-flex;position:relative}.nui-popup__content{display:inline-flex;flex-direction:row}.nui-select-popup-host.nui-popup__area{width:auto}.nui-select-popup-host.nui-popup__area .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui-select-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui-select-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui-select-popup-host.nui-select--justified.nui-popup__area{max-width:none}.nui-select-popup-host.nui-select--justified .nui-popup__content .menu-button{display:flex;flex-grow:1;max-width:none}.nui-combobox-popup-host{max-width:300px;max-height:300px}.nui-combobox-popup-host.nui-overlay .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui-combobox-popup-host.nui-overlay .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui-combobox-popup-host.nui-overlay .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui-combobox-popup-host .nui-combobox__menu{max-height:300px;overflow-y:auto;max-width:400px;overflow-y:initial}.nui-combobox-popup-host.nui-combobox--justified{max-width:none}.nui-selector-append-to-body-host.nui-popup__area{left:-35px;min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-append-to-body-host.nui-popup__area .nui-repeat .nui-repeat-item{border:0}.nui-selector-host.nui-popup__area{min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-host.nui-popup__area .nui-repeat .nui-repeat-item{border:0}.nui-selector-popup-area{min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-popup-area .nui-repeat .nui-repeat-item{border:0}.popup-adapter-overlay .nui-menu-popup-host{min-width:150px;max-width:450px;max-height:300px}.popup-adapter-overlay .nui-menu-popup-host.nui-select--justified{max-width:unset}.popup-adapter-overlay .nui-menu-popup-host .nui-popup__area--container{overflow-x:hidden;overflow-y:auto;margin:5px 0}.popup-adapter-overlay.nui-overlay-panel .nui-overlay{visibility:hidden;padding:0}.popup-adapter-overlay.visible .nui-overlay{visibility:visible}\n"], dependencies: [{ kind: "directive", type: i3.ClickInterceptorDirective, selector: "[nuiClickInterceptor]" }, { kind: "component", type: i4.OverlayComponent, selector: "nui-overlay", inputs: ["overlayConfig", "toggleReference", "viewportMargin", "customContainer", "roleAttr"], outputs: ["clickOutside"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopupComponent, decorators: [{ type: Component, args: [{ selector: "nui-popup", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: "nui-popup", role: "dialog", "[attr.aria-label]": "ariaLabel", }, template: "<div\n nuiClickInterceptor\n class=\"nui-popup-container\"\n [class.nui-popup--opened]=\"isOpen\"\n>\n <div class=\"nui-popup__content\">\n <ng-content></ng-content>\n </div>\n <div #popupArea></div>\n\n <nui-overlay\n [toggleReference]=\"toggleReference\"\n [overlayConfig]=\"overlayConfig\"\n [customContainer]=\"customContainer\"\n >\n <div class=\"nui-popup__area\">\n <div class=\"nui-popup__area--container\">\n <ng-content select=\"[popupAreaContent]\"></ng-content>\n </div>\n </div>\n </nui-overlay>\n</div>\n", styles: [".nui-popup{display:inline-flex;position:relative}.nui-popup__content{display:inline-flex;flex-direction:row}.nui-select-popup-host.nui-popup__area{width:auto}.nui-select-popup-host.nui-popup__area .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui-select-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui-select-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui-select-popup-host.nui-select--justified.nui-popup__area{max-width:none}.nui-select-popup-host.nui-select--justified .nui-popup__content .menu-button{display:flex;flex-grow:1;max-width:none}.nui-combobox-popup-host{max-width:300px;max-height:300px}.nui-combobox-popup-host.nui-overlay .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui-combobox-popup-host.nui-overlay .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui-combobox-popup-host.nui-overlay .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui-combobox-popup-host .nui-combobox__menu{max-height:300px;overflow-y:auto;max-width:400px;overflow-y:initial}.nui-combobox-popup-host.nui-combobox--justified{max-width:none}.nui-selector-append-to-body-host.nui-popup__area{left:-35px;min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-append-to-body-host.nui-popup__area .nui-repeat .nui-repeat-item{border:0}.nui-selector-host.nui-popup__area{min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-host.nui-popup__area .nui-repeat .nui-repeat-item{border:0}.nui-selector-popup-area{min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-popup-area .nui-repeat .nui-repeat-item{border:0}.popup-adapter-overlay .nui-menu-popup-host{min-width:150px;max-width:450px;max-height:300px}.popup-adapter-overlay .nui-menu-popup-host.nui-select--justified{max-width:unset}.popup-adapter-overlay .nui-menu-popup-host .nui-popup__area--container{overflow-x:hidden;overflow-y:auto;margin:5px 0}.popup-adapter-overlay.nui-overlay-panel .nui-overlay{visibility:hidden;padding:0}.popup-adapter-overlay.visible .nui-overlay{visibility:visible}\n"] }] }], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.ChangeDetectorRef }, { type: i2.EventBusService }, { type: i0.ElementRef }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { popupToggle: [{ type: ContentChild, args: [PopupToggleDirective] }], width: [{ type: Input }], overlayConfig: [{ type: Input }], contextClass: [{ type: Input }], directionTop: [{ type: Input }], directionRight: [{ type: Input }], manualOpenControl: [{ type: Input }], appendToBody: [{ type: Input }], baseElementSelector: [{ type: Input }], isHostToggleRef: [{ type: Input }], ariaLabel: [{ type: Input }], isOpen: [{ type: Input }], opened: [{ type: Output }], popupArea: [{ type: ViewChild, args: ["popupArea", { static: true }] }], popup: [{ type: ViewChild, args: [OverlayComponent] }], visible: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAtYWRhcHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BvcHVwLWFkYXB0ZXIvcG9wdXAtYWRhcHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3BvcHVwLWFkYXB0ZXIvcG9wdXAtYWRhcHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUVILE9BQU8sRUFDUCxhQUFhLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFHSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUs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QWxELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDWCxLQUFLO3NCQUFqQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFRaEIsT0FBTztzQkFEakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIENvbm5lY3RlZFBvc2l0aW9uLFxuICAgIE92ZXJsYXksXG4gICAgT3ZlcmxheUNvbmZpZyxcbn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9vdmVybGF5XCI7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgRE9DVU1FTlRfQ0xJQ0tfRVZFTlQgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2V2ZW50LmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgRXZlbnRCdXNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2V2ZW50LWJ1cy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPVkVSTEFZX1dJVEhfUE9QVVBfU1RZTEVTX0NMQVNTIH0gZnJvbSBcIi4uL292ZXJsYXkvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPdmVybGF5Q29tcG9uZW50IH0gZnJvbSBcIi4uL292ZXJsYXkvb3ZlcmxheS1jb21wb25lbnQvb3ZlcmxheS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFBvcHVwVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSBcIi4uL3BvcHVwL3BvcHVwLXRvZ2dsZS5kaXJlY3RpdmVcIjtcblxuY29uc3QgUE9QVVBfVjIgPSBcIm51aS1vdmVybGF5XCI7XG5jb25zdCBQT1BVUF9WSVNJQkxFID0gXCJ2aXNpYmxlXCI7XG5jb25zdCBBREFQVEVSX09WRVJMQVlfQ09ORklHOiBPdmVybGF5Q29uZmlnID0ge1xuICAgIHBhbmVsQ2xhc3M6IFtcInBvcHVwLWFkYXB0ZXItb3ZlcmxheVwiLCBPVkVSTEFZX1dJVEhfUE9QVVBfU1RZTEVTX0NMQVNTXSxcbn07XG5cbi8qKiBAZHluYW1pYyAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXBvcHVwXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9wb3B1cC1hZGFwdGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL3BvcHVwLWFkYXB0ZXIuY29tcG9uZW50Lmxlc3NcIl0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiBcIm51aS1wb3B1cFwiLFxuICAgICAgICByb2xlOiBcImRpYWxvZ1wiLFxuICAgICAgICBcIlthdHRyLmFyaWEtbGFiZWxdXCI6IFwiYXJpYUxhYmVsXCIsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgUG9wdXBDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95XG57XG4gICAgQENvbnRlbnRDaGlsZChQb3B1cFRvZ2dsZURpcmVjdGl2ZSlcbiAgICBwdWJsaWMgcG9wdXBUb2dnbGU6IFBvcHVwVG9nZ2xlRGlyZWN0aXZlO1xuXG4gICAgQElucHV0KCkgcHVibGljIHdpZHRoOiBzdHJpbmcgPSBcImF1dG9cIjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZ2V0IG92ZXJsYXlDb25maWcoKTogT3ZlcmxheUNvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5Q29uZmlnO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IG92ZXJsYXlDb25maWcodmFsdWU6IE92ZXJsYXlDb25maWcpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheUNvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLkFEQVBURVJfT1ZFUkxBWV9DT05GSUcsXG4gICAgICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQElucHV0KCkgcHVibGljIGNvbnRleHRDbGFzczogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkaXJlY3Rpb25Ub3A6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGRpcmVjdGlvblJpZ2h0OiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYW51YWxPcGVuQ29udHJvbDogU3ViamVjdDxNb3VzZUV2ZW50PjtcbiAgICBASW5wdXQoKSBwdWJsaWMgYXBwZW5kVG9Cb2R5OiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGJhc2VFbGVtZW50U2VsZWN0b3I6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNIb3N0VG9nZ2xlUmVmOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyA9IFwiUG9wdXBcIjtcblxuICAgIEBJbnB1dCgpIHNldCBpc09wZW4ob3BlbjogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5pc0NvbnRlbnRJbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5pc09wZW5IYW5kbGVyKG9wZW4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pc09wZW5IYW5kbGVyKG9wZW4pKTtcbiAgICB9XG4gICAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5wb3B1cD8uc2hvd2luZztcbiAgICB9XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQFZpZXdDaGlsZChcInBvcHVwQXJlYVwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBwb3B1cEFyZWE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChPdmVybGF5Q29tcG9uZW50KSBwb3B1cDogT3ZlcmxheUNvbXBvbmVudDtcblxuICAgIHB1YmxpYyBwb3B1cEFyZWFDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIHBvcHVwQXJlYUNvbnRlbnQ6IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIHRvZ2dsZVJlZmVyZW5jZTogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIGN1c3RvbUNvbnRhaW5lcj86IEVsZW1lbnRSZWY7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl92aXNpYmxlID0gdmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cC5nZXRPdmVybGF5UmVmKCkuYWRkUGFuZWxDbGFzcyhQT1BVUF9WSVNJQkxFKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBvcHVwLmdldE92ZXJsYXlSZWYoKS5yZW1vdmVQYW5lbENsYXNzKFBPUFVQX1ZJU0lCTEUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX3Zpc2libGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Zpc2libGU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfb3ZlcmxheUNvbmZpZzogT3ZlcmxheUNvbmZpZyA9IEFEQVBURVJfT1ZFUkxBWV9DT05GSUc7XG4gICAgcHJpdmF0ZSBpc0NvbnRlbnRJbml0aWFsaXplZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIGxhc3RFdmVudFR5cGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGV2ZW50QnVzU2VydmljZTogRXZlbnRCdXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5hcHBlbmRUb0JvZHk/LmN1cnJlbnRWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRhaW5lciA9IHRoaXMucG9wdXBBcmVhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLndpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlDb25maWcgPSB7IC4uLnRoaXMub3ZlcmxheUNvbmZpZywgd2lkdGg6IHRoaXMud2lkdGggfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VzLmRpcmVjdGlvblRvcCB8fCBjaGFuZ2VzLmRpcmVjdGlvblJpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5vdmVybGF5Q29uZmlnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMuZ2V0UG9zaXRpb25TdHJhdGVneSgpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNDb250ZW50SW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRUb2dnbGVSZWYoKTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlDb25maWcgPSB7XG4gICAgICAgICAgICAuLi50aGlzLm92ZXJsYXlDb25maWcsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLmdldFBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5wb3B1cFRvZ2dsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cFRvZ2dsZS50b2dnbGUuc3Vic2NyaWJlKChlOiBFdmVudCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5lZChlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub3ZlcmxheUNvbmZpZyA9IHsgLi4udGhpcy5vdmVybGF5Q29uZmlnLCB3aWR0aDogdGhpcy53aWR0aCB9O1xuXG4gICAgICAgIGlmICh0aGlzLm1hbnVhbE9wZW5Db250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLm1hbnVhbE9wZW5Db250cm9sLnN1YnNjcmliZSgoZTogRXZlbnQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuZWQoZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXBwZW5kVG9Cb2R5KSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRhaW5lciA9IHRoaXMucG9wdXBBcmVhO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudEJ1c1NlcnZpY2VcbiAgICAgICAgICAgIC5nZXRTdHJlYW0oRE9DVU1FTlRfQ0xJQ0tfRVZFTlQpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1RvZ2dsZSA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9wdXBUb2dnbGUgJiYgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1cFRvZ2dsZS5ob3N0Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKS5jb250YWlucyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiAhaXNUb2dnbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvZ2dsZU9wZW5lZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgbGV0IGVtaXQgPSB0cnVlO1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RFdmVudFR5cGUgPT09IFwiZm9jdXNpblwiICYmIGV2ZW50LnR5cGUgPT09IFwiZm9jdXNpblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNpbmNlIGNsaWNrIHRyaWdnZXJzIGZvY3VzaW4gZXZlbnQsIHdlIG5lZWQgdG8gcHJldmVudCBwb3B1cCBmcm9tIGNsb3NpbmdcbiAgICAgICAgICAgIC8vIHdoZW4gZm9jdXMgb24gdGhlIGlucHV0IGlzIGdhaW5lZCB2aWEgY2xpY2tcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RFdmVudFR5cGUgPT09IFwiZm9jdXNpblwiICYmIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIikge1xuICAgICAgICAgICAgICAgIGVtaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgcG9wdXAgaXMgYWxyZWFkeSBjbG9zZWQsIHByZXZlbnQgaXQgZnJvbSBvcGVuaW5nIG9uIGZvY3Vzb3V0XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJmb2N1c291dFwiICYmICF0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIGVtaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sYXN0RXZlbnRUeXBlID0gZXZlbnQudHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW1pdCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZVBvcHVwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBvcHVwQ29ubmVjdGVkUG9zaXRpb24oKTogQ29ubmVjdGVkUG9zaXRpb25bXSB7XG4gICAgICAgIGNvbnN0IGxlZnRCb3R0b206IENvbm5lY3RlZFBvc2l0aW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJib3R0b21cIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdG9wUmlnaHQ6IENvbm5lY3RlZFBvc2l0aW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luWDogXCJzdGFydFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdG9wTGVmdDogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICAgICAgICBvcmlnaW5YOiBcImVuZFwiLFxuICAgICAgICAgICAgb3JpZ2luWTogXCJ0b3BcIixcbiAgICAgICAgICAgIG92ZXJsYXlYOiBcInN0YXJ0XCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJib3R0b21cIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYm90dG9tUmlnaHQ6IENvbm5lY3RlZFBvc2l0aW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luWDogXCJlbmRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwiYm90dG9tXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcInRvcFwiLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBib3R0b21MZWZ0OiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIG9yaWdpblg6IFwiZW5kXCIsXG4gICAgICAgICAgICBvcmlnaW5ZOiBcImJvdHRvbVwiLFxuICAgICAgICAgICAgb3ZlcmxheVg6IFwiZW5kXCIsXG4gICAgICAgICAgICBvdmVybGF5WTogXCJ0b3BcIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmlnaHRUb3A6IENvbm5lY3RlZFBvc2l0aW9uID0ge1xuICAgICAgICAgICAgb3JpZ2luWDogXCJlbmRcIixcbiAgICAgICAgICAgIG9yaWdpblk6IFwidG9wXCIsXG4gICAgICAgICAgICBvdmVybGF5WDogXCJlbmRcIixcbiAgICAgICAgICAgIG92ZXJsYXlZOiBcImJvdHRvbVwiLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvblRvcCAmJiB0aGlzLmRpcmVjdGlvblJpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gW3JpZ2h0VG9wXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvblRvcCkge1xuICAgICAgICAgICAgcmV0dXJuIFt0b3BSaWdodCwgdG9wTGVmdF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb25SaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIFtib3R0b21SaWdodCwgYm90dG9tTGVmdF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbGVmdEJvdHRvbSxcbiAgICAgICAgICAgIHRvcFJpZ2h0LFxuICAgICAgICAgICAgdG9wTGVmdCxcbiAgICAgICAgICAgIGJvdHRvbVJpZ2h0LFxuICAgICAgICAgICAgYm90dG9tTGVmdCxcbiAgICAgICAgICAgIHJpZ2h0VG9wLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UG9zaXRpb25TdHJhdGVneSgpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0TWFyZ2luID0gMDtcblxuICAgICAgICByZXR1cm4gdGhpcy5vdmVybGF5XG4gICAgICAgICAgICAucG9zaXRpb24oKVxuICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy50b2dnbGVSZWZlcmVuY2UpXG4gICAgICAgICAgICAud2l0aFB1c2goZmFsc2UpXG4gICAgICAgICAgICAud2l0aFZpZXdwb3J0TWFyZ2luKGRlZmF1bHRWaWV3cG9ydE1hcmdpbilcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKHRoaXMuZ2V0UG9wdXBDb25uZWN0ZWRQb3NpdGlvbigpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzT3BlbkhhbmRsZXIob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBvcGVuID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3coKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy50b2dnbGVSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdFRvZ2dsZVJlZigpO1xuICAgICAgICB0aGlzLnBvcHVwLnNob3coKTtcblxuICAgICAgICBjb25zdCBvdmVybGF5Q29udGFpbmVyID0gdGhpcy5wb3B1cC5nZXRPdmVybGF5UmVmKCkub3ZlcmxheUVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5wb3B1cEFyZWFDb250ZW50ID0gbmV3IEVsZW1lbnRSZWYob3ZlcmxheUNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMucG9wdXBBcmVhQ29udGFpbmVyID0gbmV3IEVsZW1lbnRSZWYoXG4gICAgICAgICAgICBvdmVybGF5Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYC4ke1BPUFVQX1YyfWApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dENsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRDbGFzcy5zcGxpdChcIiBcIikuZm9yRWFjaCgoY29udGV4dENsYXNzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1cEFyZWFDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q2xhc3NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5lZC5lbWl0KHRoaXMucG9wdXAuc2hvd2luZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoaWRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwLmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMub3BlbmVkLmVtaXQodGhpcy5wb3B1cC5zaG93aW5nKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucG9wdXAuc2hvd2luZyA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KCk7XG4gICAgICAgIHRoaXMucG9wdXAuZ2V0T3ZlcmxheVJlZigpLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0VG9nZ2xlUmVmKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0hvc3RUb2dnbGVSZWYpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUmVmZXJlbmNlID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2dnbGVSZWZlcmVuY2UgPSB0aGlzLnBvcHVwVG9nZ2xlXG4gICAgICAgICAgICA/IHRoaXMucG9wdXBUb2dnbGUuaG9zdC5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICA6IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmJhc2VFbGVtZW50U2VsZWN0b3IpO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBudWlDbGlja0ludGVyY2VwdG9yXG4gICAgY2xhc3M9XCJudWktcG9wdXAtY29udGFpbmVyXCJcbiAgICBbY2xhc3MubnVpLXBvcHVwLS1vcGVuZWRdPVwiaXNPcGVuXCJcbj5cbiAgICA8ZGl2IGNsYXNzPVwibnVpLXBvcHVwX19jb250ZW50XCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICNwb3B1cEFyZWE+PC9kaXY+XG5cbiAgICA8bnVpLW92ZXJsYXlcbiAgICAgICAgW3RvZ2dsZVJlZmVyZW5jZV09XCJ0b2dnbGVSZWZlcmVuY2VcIlxuICAgICAgICBbb3ZlcmxheUNvbmZpZ109XCJvdmVybGF5Q29uZmlnXCJcbiAgICAgICAgW2N1c3RvbUNvbnRhaW5lcl09XCJjdXN0b21Db250YWluZXJcIlxuICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm51aS1wb3B1cF9fYXJlYVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm51aS1wb3B1cF9fYXJlYS0tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3BvcHVwQXJlYUNvbnRlbnRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbnVpLW92ZXJsYXk+XG48L2Rpdj5cbiJdfQ==