@nova-ui/bits
Version:
SolarWinds Nova Framework
322 lines • 47.5 kB
JavaScript
// © 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==