UNPKG

ngx-popperjs

Version:

ngx-popperjs is an Angular wrapper for @popperjs

475 lines 59.5 kB
// tslint:disable:no-input-rename import { Directive, EventEmitter, Inject, Input, Output } from "@angular/core"; import { NgxPopperjsContentComponent } from "../../components/ngx-popperjs-content/ngx-popperjs-content.component"; import { NgxPopperjsTriggers } from "../../models/ngx-popperjs-triggers.model"; import { NGX_POPPERJS_DEFAULTS } from "../../models/ngx-popperjs-defaults.model"; import { NgxPopperjsUtils } from "../../models/ngx-popperjs-utils.class"; // import { fromEvent, Subject, takeUntil, timer } from "rxjs"; import * as i0 from "@angular/core"; export class NgxPopperjsDirective { _changeDetectorRef; _elementRef; _vcr; _popperDefaults; static baseOptions = { showDelay: 0, hideOnClickOutside: true, hideOnMouseLeave: false, hideOnScroll: false, appendTo: undefined, ariaRole: "popper", ariaDescribe: "", styles: {}, trigger: NgxPopperjsTriggers.click }; set applyClass(newValue) { if (newValue === this._applyClass) { return; } this._applyClass = newValue; this._checkExisting("applyClass", newValue); } get applyClass() { return this._applyClass; } set hideOnClickOutside(newValue) { this._hideOnClickOutside = NgxPopperjsUtils.coerceBooleanProperty(newValue); } get hideOnClickOutside() { return this._hideOnClickOutside; } set content(newValue) { if (newValue === this._content) { return; } this._content = newValue; if (this._popperContent) { if (typeof newValue === "string") { this._popperContent.text = newValue; } else { this._popperContent = newValue; } } } get content() { return this._content; } set flip(newValue) { this._flip = NgxPopperjsUtils.coerceBooleanProperty(newValue); this._checkExisting("preventOverflow", this._preventOverflow); } get flip() { return this._flip; } set placement(newValue) { this._placement = newValue; this._checkExisting("placement", newValue); } get placement() { return this._placement; } set preventOverflow(newValue) { this._preventOverflow = NgxPopperjsUtils.coerceBooleanProperty(newValue); this._checkExisting("preventOverflow", this._preventOverflow); } get preventOverflow() { return this._preventOverflow; } set popperApplyArrowClass(newValue) { if (newValue === this._applyArrowClass) { return; } this._applyArrowClass = newValue; if (this._popperContent) { this._popperContent.popperOptions.applyArrowClass = newValue; if (!this._shown) { return; } this._popperContent.update(); } } get popperApplyArrowClass() { return this._applyArrowClass; } set disabled(newValue) { if (newValue === this._disabled) { return; } this._disabled = !!newValue; if (this._shown) { this.hide(); } } get disabled() { return this._disabled; } ariaDescribe; ariaRole; boundariesElement; disableAnimation; disableStyle; hideOnMouseLeave; hideOnScroll; hideTimeout = 0; popperAppendTo; popperOnHidden = new EventEmitter(); popperOnShown = new EventEmitter(); popperOnUpdate = new EventEmitter(); positionFixed; showDelay; showOnStart; showTrigger; styles; targetElement; timeoutAfterShow = 0; _applyArrowClass; _applyClass; _content; _destroy$ = new Subject(); _disabled; _flip = !0; _globalEventListenersCtrl$ = new Subject(); _hideOnClickOutside = true; _placement; _popperContent; _popperContentClass = NgxPopperjsContentComponent; _popperContentRef; _preventOverflow = !0; _scheduledHideTimeoutCtrl$ = new Subject(); _scheduledShowTimeoutCtrl$ = new Subject(); _shown = false; constructor(_changeDetectorRef, _elementRef, _vcr, _popperDefaults = {}) { this._changeDetectorRef = _changeDetectorRef; this._elementRef = _elementRef; this._vcr = _vcr; this._popperDefaults = _popperDefaults; NgxPopperjsDirective.baseOptions = { ...NgxPopperjsDirective.baseOptions, ...this._popperDefaults }; } static assignDefined(target, ...sources) { for (const source of sources) { for (const key of Object.keys(source)) { const val = source[key]; if (val !== undefined) { target[key] = val; } } } return target; } applyTriggerListeners() { switch (this.showTrigger) { case NgxPopperjsTriggers.click: this._addListener("click", this.toggle.bind(this)); break; case NgxPopperjsTriggers.mousedown: this._addListener("mousedown", this.toggle.bind(this)); break; case NgxPopperjsTriggers.hover: this._addListener("mouseenter", this.scheduledShow.bind(this, this.showDelay)); ["touchend", "touchcancel", "mouseleave"].forEach((eventName) => { this._addListener(eventName, this.scheduledHide.bind(this, null, this.hideTimeout)); }); break; } if (this.showTrigger !== NgxPopperjsTriggers.hover && this.hideOnMouseLeave) { ["touchend", "touchcancel", "mouseleave"].forEach((eventName) => { this._addListener(eventName, this.scheduledHide.bind(this, null, this.hideTimeout)); }); } } getRefElement() { return this.targetElement || this._elementRef.nativeElement; } hide() { if (this.disabled) { return; } if (!this._shown) { this._scheduledShowTimeoutCtrl$.next(); return; } this._shown = false; if (this._popperContentRef) { this._popperContentRef.instance.hide(); } else { this._popperContent.hide(); } this.popperOnHidden.emit(this); this._globalEventListenersCtrl$.next(); } hideOnClickOutsideHandler($event) { if (this.disabled || !this.hideOnClickOutside || $event.target === this._popperContent.elRef.nativeElement || this._popperContent.elRef.nativeElement.contains($event.target)) { return; } this.scheduledHide($event, this.hideTimeout); } hideOnScrollHandler($event) { if (this.disabled || !this.hideOnScroll) { return; } this.scheduledHide($event, this.hideTimeout); } ngOnDestroy() { this._destroy$.next(); this._destroy$.complete(); this._popperContent && this._popperContent.clean(); } ngOnInit() { if (typeof this.content === "string") { this._popperContent = this._constructContent(); this._popperContent.text = this.content; } else if (typeof this.content === typeof void 0) { this._popperContent = this._constructContent(); this._popperContent.text = ""; } else { this._popperContent = this.content; } const popperRef = this._popperContent; popperRef.referenceObject = this.getRefElement(); this._setContentProperties(popperRef); this._setDefaults(); this.applyTriggerListeners(); if (this.showOnStart) { this.scheduledShow(); } } scheduledHide($event = null, delay = this.hideTimeout) { if (this.disabled) { return; } this._scheduledShowTimeoutCtrl$.next(); timer(delay) .pipe(takeUntil(this._scheduledHideTimeoutCtrl$), takeUntil(this._destroy$)) .subscribe({ next: () => { // TODO: check const toElement = $event ? $event.toElement : null; const popperContentView = this._popperContent.popperViewRef ? this._popperContent.popperViewRef.nativeElement : false; if (!popperContentView || popperContentView === toElement || popperContentView.contains(toElement) || (this.content && this.content.isMouseOver)) { return; } this.hide(); this._applyChanges(); } }); } scheduledShow(delay = this.showDelay) { if (this.disabled) { return; } this._scheduledHideTimeoutCtrl$.next(); timer(delay) .pipe(takeUntil(this._scheduledShowTimeoutCtrl$), takeUntil(this._destroy$)) .subscribe({ next: () => { this.show(); this._applyChanges(); } }); } show() { if (this._shown) { this._scheduledHideTimeoutCtrl$.next(); return; } this._shown = true; const popperRef = this._popperContent; const element = this.getRefElement(); if (popperRef.referenceObject !== element) { popperRef.referenceObject = element; } this._setContentProperties(popperRef); popperRef.show(); this.popperOnShown.emit(this); if (this.timeoutAfterShow > 0) { this.scheduledHide(null, this.timeoutAfterShow); } fromEvent(document, "click") .pipe(takeUntil(this._globalEventListenersCtrl$), takeUntil(this._destroy$)) .subscribe({ next: (e) => this.hideOnClickOutsideHandler(e) }); fromEvent(this._getScrollParent(this.getRefElement()), "scroll") .pipe(takeUntil(this._globalEventListenersCtrl$), takeUntil(this._destroy$)) .subscribe({ next: (e) => { this.hideOnScrollHandler(e); } }); } toggle() { if (this.disabled) { return; } this._shown ? this.scheduledHide(null, this.hideTimeout) : this.scheduledShow(); } _addListener(eventName, cb) { fromEvent(this._elementRef.nativeElement, eventName) .pipe(takeUntil(this._destroy$)) .subscribe({ next: cb }); } _applyChanges() { this._changeDetectorRef.markForCheck(); this._changeDetectorRef.detectChanges(); } _checkExisting(key, newValue) { if (this._popperContent) { this._popperContent.popperOptions[key] = newValue; if (!this._shown) { return; } this._popperContent.update(); } } _constructContent() { this._popperContentRef = this._vcr.createComponent(this._popperContentClass); return this._popperContentRef.instance; } _getScrollParent(node) { const isElement = node instanceof HTMLElement; const overflowY = isElement && window.getComputedStyle(node).overflowY; const isScrollable = overflowY !== "visible" && overflowY !== "hidden"; if (!node) { return null; } else if (isScrollable && node.scrollHeight > node.clientHeight) { return node; } return this._getScrollParent(node.parentNode) || document; } _onPopperUpdate(event) { this.popperOnUpdate.emit(event); } _setContentProperties(popperRef) { popperRef.popperOptions = NgxPopperjsDirective.assignDefined(popperRef.popperOptions, NgxPopperjsDirective.baseOptions, { showDelay: this.showDelay, disableAnimation: this.disableAnimation, disableDefaultStyling: this.disableStyle, placement: this.placement, boundariesElement: this.boundariesElement, trigger: this.showTrigger, positionFixed: this.positionFixed, ariaDescribe: this.ariaDescribe, ariaRole: this.ariaRole, applyClass: this.applyClass, applyArrowClass: this.popperApplyArrowClass, hideOnMouseLeave: this.hideOnMouseLeave, styles: this.styles, appendTo: this.popperAppendTo, preventOverflow: this.preventOverflow, }); popperRef.onUpdate = this._onPopperUpdate.bind(this); popperRef.onHidden .pipe(takeUntil(this._destroy$)) .subscribe(this.hide.bind(this)); } _setDefaults() { ["showDelay", "hideOnScroll", "hideOnMouseLeave", "hideOnClickOutside", "ariaRole", "ariaDescribe"].forEach((key) => { this[key] = this[key] === void 0 ? NgxPopperjsDirective.baseOptions[key] : this[key]; }); this.showTrigger = this.showTrigger || NgxPopperjsDirective.baseOptions.trigger; this.styles = this.styles === void 0 ? { ...NgxPopperjsDirective.baseOptions.styles } : this.styles; } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgxPopperjsDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: NGX_POPPERJS_DEFAULTS }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.0", type: NgxPopperjsDirective, isStandalone: true, selector: "[popper]", inputs: { applyClass: ["popperApplyClass", "applyClass"], hideOnClickOutside: ["popperHideOnClickOutside", "hideOnClickOutside"], content: ["popper", "content"], flip: ["popperFlip", "flip"], placement: ["popperPlacement", "placement"], preventOverflow: ["popperPreventOverflow", "preventOverflow"], popperApplyArrowClass: "popperApplyArrowClass", disabled: ["popperDisabled", "disabled"], ariaDescribe: ["popperAriaDescribeBy", "ariaDescribe"], ariaRole: ["popperAriaRole", "ariaRole"], boundariesElement: ["popperBoundaries", "boundariesElement"], disableAnimation: ["popperDisableAnimation", "disableAnimation"], disableStyle: ["popperDisableStyle", "disableStyle"], hideOnMouseLeave: ["popperHideOnMouseLeave", "hideOnMouseLeave"], hideOnScroll: ["popperHideOnScroll", "hideOnScroll"], hideTimeout: ["popperTimeout", "hideTimeout"], popperAppendTo: "popperAppendTo", positionFixed: ["popperPositionFixed", "positionFixed"], showDelay: ["popperDelay", "showDelay"], showOnStart: ["popperShowOnStart", "showOnStart"], showTrigger: ["popperTrigger", "showTrigger"], styles: ["popperStyles", "styles"], targetElement: ["popperTarget", "targetElement"], timeoutAfterShow: ["popperTimeoutAfterShow", "timeoutAfterShow"] }, outputs: { popperOnHidden: "popperOnHidden", popperOnShown: "popperOnShown", popperOnUpdate: "popperOnUpdate" }, exportAs: ["popper"], ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgxPopperjsDirective, decorators: [{ type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: "[popper]", exportAs: "popper", standalone: true }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{ type: Inject, args: [NGX_POPPERJS_DEFAULTS] }] }], propDecorators: { applyClass: [{ type: Input, args: ["popperApplyClass"] }], hideOnClickOutside: [{ type: Input, args: ["popperHideOnClickOutside"] }], content: [{ type: Input, args: ["popper"] }], flip: [{ type: Input, args: ["popperFlip"] }], placement: [{ type: Input, args: ["popperPlacement"] }], preventOverflow: [{ type: Input, args: ["popperPreventOverflow"] }], popperApplyArrowClass: [{ type: Input }], disabled: [{ type: Input, args: ["popperDisabled"] }], ariaDescribe: [{ type: Input, args: ["popperAriaDescribeBy"] }], ariaRole: [{ type: Input, args: ["popperAriaRole"] }], boundariesElement: [{ type: Input, args: ["popperBoundaries"] }], disableAnimation: [{ type: Input, args: ["popperDisableAnimation"] }], disableStyle: [{ type: Input, args: ["popperDisableStyle"] }], hideOnMouseLeave: [{ type: Input, args: ["popperHideOnMouseLeave"] }], hideOnScroll: [{ type: Input, args: ["popperHideOnScroll"] }], hideTimeout: [{ type: Input, args: ["popperTimeout"] }], popperAppendTo: [{ type: Input }], popperOnHidden: [{ type: Output }], popperOnShown: [{ type: Output }], popperOnUpdate: [{ type: Output }], positionFixed: [{ type: Input, args: ["popperPositionFixed"] }], showDelay: [{ type: Input, args: ["popperDelay"] }], showOnStart: [{ type: Input, args: ["popperShowOnStart"] }], showTrigger: [{ type: Input, args: ["popperTrigger"] }], styles: [{ type: Input, args: ["popperStyles"] }], targetElement: [{ type: Input, args: ["popperTarget"] }], timeoutAfterShow: [{ type: Input, args: ["popperTimeoutAfterShow"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBvcHBlcmpzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1wb3BwZXJqcy9zcmMvbGliL2RpcmVjdGl2ZXMvbmd4LXBvcHBlcmpzL25neC1wb3BwZXJqcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBQ2pDLE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHNFQUFzRSxDQUFDO0FBR2pILE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLEVBQUU7QUFDRixPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQVExRCxNQUFNLE9BQU8sb0JBQW9CO0lBc01QO0lBQ0E7SUFDQTtJQUMrQjtJQXZNckQsTUFBTSxDQUFDLFdBQVcsR0FBdUI7UUFDckMsU0FBUyxFQUFFLENBQUM7UUFDWixrQkFBa0IsRUFBRSxJQUFJO1FBQ3hCLGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsWUFBWSxFQUFFLEtBQUs7UUFDbkIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsUUFBUSxFQUFFLFFBQVE7UUFDbEIsWUFBWSxFQUFFLEVBQUU7UUFDaEIsTUFBTSxFQUFFLEVBQUU7UUFDVixPQUFPLEVBQUUsbUJBQW1CLENBQUMsS0FBSztLQUNyQyxDQUFDO0lBRUYsSUFDSSxVQUFVLENBQUMsUUFBZ0I7UUFDM0IsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLFdB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QURmLEtBQUs7dUJBQUMsd0JBQXdCO2dCQUkvQixZQUFZO3NCQURYLEtBQUs7dUJBQUMsb0JBQW9CO2dCQUkzQixnQkFBZ0I7c0JBRGYsS0FBSzt1QkFBQyx3QkFBd0I7Z0JBSS9CLFlBQVk7c0JBRFgsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBSTNCLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxlQUFlO2dCQUl0QixjQUFjO3NCQURiLEtBQUs7Z0JBSU4sY0FBYztzQkFEYixNQUFNO2dCQUlQLGFBQWE7c0JBRFosTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixLQUFLO3VCQUFDLHFCQUFxQjtnQkFJNUIsU0FBUztzQkFEUixLQUFLO3VCQUFDLGFBQWE7Z0JBSXBCLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxtQkFBbUI7Z0JBSTFCLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxlQUFlO2dCQUl0QixNQUFNO3NCQURMLEtBQUs7dUJBQUMsY0FBYztnQkFJckIsYUFBYTtzQkFEWixLQUFLO3VCQUFDLGNBQWM7Z0JBSXJCLGdCQUFnQjtzQkFEZixLQUFLO3VCQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlOm5vLWlucHV0LXJlbmFtZVxyXG5pbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnRSZWYsXHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL25neC1wb3BwZXJqcy1jb250ZW50L25neC1wb3BwZXJqcy1jb250ZW50LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge05neFBvcHBlcmpzT3B0aW9uc30gZnJvbSBcIi4uLy4uL21vZGVscy9uZ3gtcG9wcGVyanMtb3B0aW9ucy5tb2RlbFwiO1xyXG5pbXBvcnQge05neFBvcHBlcmpzUGxhY2VtZW50c30gZnJvbSBcIi4uLy4uL21vZGVscy9uZ3gtcG9wcGVyanMtcGxhY2VtZW50cy5tb2RlbFwiO1xyXG5pbXBvcnQge05neFBvcHBlcmpzVHJpZ2dlcnN9IGZyb20gXCIuLi8uLi9tb2RlbHMvbmd4LXBvcHBlcmpzLXRyaWdnZXJzLm1vZGVsXCI7XHJcbmltcG9ydCB7TkdYX1BPUFBFUkpTX0RFRkFVTFRTfSBmcm9tIFwiLi4vLi4vbW9kZWxzL25neC1wb3BwZXJqcy1kZWZhdWx0cy5tb2RlbFwiO1xyXG5pbXBvcnQge05neFBvcHBlcmpzVXRpbHN9IGZyb20gXCIuLi8uLi9tb2RlbHMvbmd4LXBvcHBlcmpzLXV0aWxzLmNsYXNzXCI7XHJcbi8vXHJcbmltcG9ydCB7ZnJvbUV2ZW50LCBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogXCJbcG9wcGVyXVwiLFxyXG4gICAgZXhwb3J0QXM6IFwicG9wcGVyXCIsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hQb3BwZXJqc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBzdGF0aWMgYmFzZU9wdGlvbnM6IE5neFBvcHBlcmpzT3B0aW9ucyA9IHtcclxuICAgICAgICBzaG93RGVsYXk6IDAsXHJcbiAgICAgICAgaGlkZU9uQ2xpY2tPdXRzaWRlOiB0cnVlLFxyXG4gICAgICAgIGhpZGVPbk1vdXNlTGVhdmU6IGZhbHNlLFxyXG4gICAgICAgIGhpZGVPblNjcm9sbDogZmFsc2UsXHJcbiAgICAgICAgYXBwZW5kVG86IHVuZGVmaW5lZCxcclxuICAgICAgICBhcmlhUm9sZTogXCJwb3BwZXJcIixcclxuICAgICAgICBhcmlhRGVzY3JpYmU6IFwiXCIsXHJcbiAgICAgICAgc3R5bGVzOiB7fSxcclxuICAgICAgICB0cmlnZ2VyOiBOZ3hQb3BwZXJqc1RyaWdnZXJzLmNsaWNrXHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckFwcGx5Q2xhc3NcIilcclxuICAgIHNldCBhcHBseUNsYXNzKG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRoaXMuX2FwcGx5Q2xhc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hcHBseUNsYXNzID0gbmV3VmFsdWU7XHJcbiAgICAgICAgdGhpcy5fY2hlY2tFeGlzdGluZyhcImFwcGx5Q2xhc3NcIiwgbmV3VmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBhcHBseUNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q2xhc3M7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVySGlkZU9uQ2xpY2tPdXRzaWRlXCIpXHJcbiAgICBzZXQgaGlkZU9uQ2xpY2tPdXRzaWRlKG5ld1ZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5faGlkZU9uQ2xpY2tPdXRzaWRlID0gTmd4UG9wcGVyanNVdGlscy5jb2VyY2VCb29sZWFuUHJvcGVydHkobmV3VmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoaWRlT25DbGlja091dHNpZGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVPbkNsaWNrT3V0c2lkZTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJcIilcclxuICAgIHNldCBjb250ZW50KG5ld1ZhbHVlOiBzdHJpbmcgfCBOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnQpIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRoaXMuX2NvbnRlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGVudCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BwZXJDb250ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQudGV4dCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wcGVyQ29udGVudCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250ZW50KCk6IHN0cmluZyB8IE5neFBvcHBlcmpzQ29udGVudENvbXBvbmVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyRmxpcFwiKVxyXG4gICAgc2V0IGZsaXAobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9mbGlwID0gTmd4UG9wcGVyanNVdGlscy5jb2VyY2VCb29sZWFuUHJvcGVydHkobmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMuX2NoZWNrRXhpc3RpbmcoXCJwcmV2ZW50T3ZlcmZsb3dcIiwgdGhpcy5fcHJldmVudE92ZXJmbG93KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZmxpcCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZmxpcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyUGxhY2VtZW50XCIpXHJcbiAgICBzZXQgcGxhY2VtZW50KG5ld1ZhbHVlOiBOZ3hQb3BwZXJqc1BsYWNlbWVudHMpIHtcclxuICAgICAgICB0aGlzLl9wbGFjZW1lbnQgPSBuZXdWYWx1ZTtcclxuICAgICAgICB0aGlzLl9jaGVja0V4aXN0aW5nKFwicGxhY2VtZW50XCIsIG5ld1ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGxhY2VtZW50KCk6IE5neFBvcHBlcmpzUGxhY2VtZW50cyB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wbGFjZW1lbnQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIEBJbnB1dChcInBvcHBlclByZXZlbnRPdmVyZmxvd1wiKVxyXG4gICAgc2V0IHByZXZlbnRPdmVyZmxvdyhuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX3ByZXZlbnRPdmVyZmxvdyA9IE5neFBvcHBlcmpzVXRpbHMuY29lcmNlQm9vbGVhblByb3BlcnR5KG5ld1ZhbHVlKTtcclxuICAgICAgICB0aGlzLl9jaGVja0V4aXN0aW5nKFwicHJldmVudE92ZXJmbG93XCIsIHRoaXMuX3ByZXZlbnRPdmVyZmxvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByZXZlbnRPdmVyZmxvdygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJldmVudE92ZXJmbG93O1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgcG9wcGVyQXBwbHlBcnJvd0NsYXNzKG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRoaXMuX2FwcGx5QXJyb3dDbGFzcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2FwcGx5QXJyb3dDbGFzcyA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BwZXJDb250ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQucG9wcGVyT3B0aW9ucy5hcHBseUFycm93Q2xhc3MgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zaG93bikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb3BwZXJBcHBseUFycm93Q2xhc3MoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlBcnJvd0NsYXNzO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckRpc2FibGVkXCIpXHJcbiAgICBzZXQgZGlzYWJsZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRoaXMuX2Rpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSAhIW5ld1ZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9zaG93bikge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJBcmlhRGVzY3JpYmVCeVwiKVxyXG4gICAgYXJpYURlc2NyaWJlOiBzdHJpbmcgfCB2b2lkO1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckFyaWFSb2xlXCIpXHJcbiAgICBhcmlhUm9sZTogc3RyaW5nIHwgdm9pZDtcclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJCb3VuZGFyaWVzXCIpXHJcbiAgICBib3VuZGFyaWVzRWxlbWVudDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckRpc2FibGVBbmltYXRpb25cIilcclxuICAgIGRpc2FibGVBbmltYXRpb246IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyRGlzYWJsZVN0eWxlXCIpXHJcbiAgICBkaXNhYmxlU3R5bGU6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVySGlkZU9uTW91c2VMZWF2ZVwiKVxyXG4gICAgaGlkZU9uTW91c2VMZWF2ZTogYm9vbGVhbiB8IHZvaWQ7XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVySGlkZU9uU2Nyb2xsXCIpXHJcbiAgICBoaWRlT25TY3JvbGw6IGJvb2xlYW4gfCB2b2lkO1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlclRpbWVvdXRcIilcclxuICAgIGhpZGVUaW1lb3V0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwb3BwZXJBcHBlbmRUbzogc3RyaW5nO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcG9wcGVyT25IaWRkZW46IEV2ZW50RW1pdHRlcjxOZ3hQb3BwZXJqc0RpcmVjdGl2ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPE5neFBvcHBlcmpzRGlyZWN0aXZlPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcG9wcGVyT25TaG93bjogRXZlbnRFbWl0dGVyPE5neFBvcHBlcmpzRGlyZWN0aXZlPiA9IG5ldyBFdmVudEVtaXR0ZXI8Tmd4UG9wcGVyanNEaXJlY3RpdmU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwb3BwZXJPblVwZGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJQb3NpdGlvbkZpeGVkXCIpXHJcbiAgICBwb3NpdGlvbkZpeGVkOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckRlbGF5XCIpXHJcbiAgICBzaG93RGVsYXk6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJTaG93T25TdGFydFwiKVxyXG4gICAgc2hvd09uU3RhcnQ6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyVHJpZ2dlclwiKVxyXG4gICAgc2hvd1RyaWdnZXI6IE5neFBvcHBlcmpzVHJpZ2dlcnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyU3R5bGVzXCIpXHJcbiAgICBzdHlsZXM6IG9iamVjdDtcclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJUYXJnZXRcIilcclxuICAgIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlclRpbWVvdXRBZnRlclNob3dcIilcclxuICAgIHRpbWVvdXRBZnRlclNob3c6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9hcHBseUFycm93Q2xhc3M6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCBfYXBwbHlDbGFzczogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIF9jb250ZW50OiBzdHJpbmcgfCBOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnQ7XHJcbiAgICBwcm90ZWN0ZWQgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgICBwcm90ZWN0ZWQgX2ZsaXA6IGJvb2xlYW4gPSAhMDtcclxuICAgIHByb3RlY3RlZCBfZ2xvYmFsRXZlbnRMaXN0ZW5lcnNDdHJsJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcm90ZWN0ZWQgX2hpZGVPbkNsaWNrT3V0c2lkZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcm90ZWN0ZWQgX3BsYWNlbWVudDogTmd4UG9wcGVyanNQbGFjZW1lbnRzO1xyXG4gICAgcHJvdGVjdGVkIF9wb3BwZXJDb250ZW50OiBOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnQ7XHJcbiAgICBwcm90ZWN0ZWQgX3BvcHBlckNvbnRlbnRDbGFzcyA9IE5neFBvcHBlcmpzQ29udGVudENvbXBvbmVudDtcclxuICAgIHByb3RlY3RlZCBfcG9wcGVyQ29udGVudFJlZjogQ29tcG9uZW50UmVmPE5neFBvcHBlcmpzQ29udGVudENvbXBvbmVudD47XHJcbiAgICBwcm90ZWN0ZWQgX3ByZXZlbnRPdmVyZmxvdzogYm9vbGVhbiA9ICEwO1xyXG4gICAgcHJvdGVjdGVkIF9zY2hlZHVsZWRIaWRlVGltZW91dEN0cmwkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByb3RlY3RlZCBfc2NoZWR1bGVkU2hvd1RpbWVvdXRDdHJsJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcm90ZWN0ZWQgX3Nob3duOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3ZjcjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoTkdYX1BPUFBFUkpTX0RFRkFVTFRTKSBwcm90ZWN0ZWQgX3BvcHBlckRlZmF1bHRzOiBOZ3hQb3BwZXJqc09wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIE5neFBvcHBlcmpzRGlyZWN0aXZlLmJhc2VPcHRpb25zID0gey4uLk5neFBvcHBlcmpzRGlyZWN0aXZlLmJhc2VPcHRpb25zLCAuLi50aGlzLl9wb3BwZXJEZWZhdWx0c307XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFzc2lnbkRlZmluZWQodGFyZ2V0OiBhbnksIC4uLnNvdXJjZXM6IGFueVtdKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5VHJpZ2dlckxpc3RlbmVycygpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2hvd1RyaWdnZXIpIHtcclxuICAgICAgICAgICAgY2FzZSBOZ3hQb3BwZXJqc1RyaWdnZXJzLmNsaWNrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkTGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE5neFBvcHBlcmpzVHJpZ2dlcnMubW91c2Vkb3duOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkTGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy50b2dnbGUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBOZ3hQb3BwZXJqc1RyaWdnZXJzLmhvdmVyOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkTGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHRoaXMuc2NoZWR1bGVkU2hvdy5iaW5kKHRoaXMsIHRoaXMuc2hvd0RlbGF5KSk7XHJcbiAgICAgICAgICAgICAgICBbXCJ0b3VjaGVuZFwiLCBcInRvdWNoY2FuY2VsXCIsIFwibW91c2VsZWF2ZVwiXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuc2NoZWR1bGVkSGlkZS5iaW5kKHRoaXMsIG51bGwsIHRoaXMuaGlkZVRpbWVvdXQpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dUcmlnZ2VyICE9PSBOZ3hQb3BwZXJqc1RyaWdnZXJzLmhvdmVyICYmIHRoaXMuaGlkZU9uTW91c2VMZWF2ZSkge1xyXG4gICAgICAgICAgICBbXCJ0b3VjaGVuZFwiLCBcInRvdWNoY2FuY2VsXCIsIFwibW91c2VsZWF2ZVwiXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZExpc3RlbmVyKGV2ZW50TmFtZSwgdGhpcy5zY2hlZHVsZWRIaWRlLmJpbmQodGhpcywgbnVsbCwgdGhpcy5oaWRlVGltZW91dCkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVmRWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zaG93bikge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRTaG93VGltZW91dEN0cmwkLm5leHQoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3Nob3duID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHBlckNvbnRlbnRSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9wcGVyQ29udGVudFJlZi5pbnN0YW5jZS5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3BwZXJDb250ZW50LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb3BwZXJPbkhpZGRlbi5lbWl0KHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2dsb2JhbEV2ZW50TGlzdGVuZXJzQ3RybCQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVPbkNsaWNrT3V0c2lkZUhhbmRsZXIoJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMuaGlkZU9uQ2xpY2tPdXRzaWRlIHx8ICRldmVudC50YXJnZXQgPT09IHRoaXMuX3BvcHBlckNvbnRlbnQuZWxSZWYubmF0aXZlRWxlbWVudCB8fFxyXG4gICAgICAgICAgICB0aGlzLl9wb3BwZXJDb250ZW50LmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoJGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjaGVkdWxlZEhpZGUoJGV2ZW50LCB0aGlzLmhpZGVUaW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlT25TY3JvbGxIYW5kbGVyKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmhpZGVPblNjcm9sbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVkSGlkZSgkZXZlbnQsIHRoaXMuaGlkZVRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgICAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQgJiYgdGhpcy5fcG9wcGVyQ29udGVudC5jbGVhbigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQgPSB0aGlzL