UNPKG

ng-devui

Version:

DevUI components based on Angular

211 lines 44.3 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Host, HostBinding, Input, Renderer2, SkipSelf, } from '@angular/core'; import { I18nService } from 'ng-devui/i18n'; import { Subscription } from 'rxjs'; import { filter, map, switchMap, takeUntil, tap } from 'rxjs/operators'; import { ResizeDirective } from './resize.directive'; import { SplitterService } from './splitter.service'; import * as i0 from "@angular/core"; import * as i1 from "./splitter.service"; import * as i2 from "./resize.directive"; import * as i3 from "ng-devui/i18n"; import * as i4 from "@angular/common"; import * as i5 from "ng-devui/popover"; export class SplitterBarComponent { set splitBarSize(size) { this._splitBarSize = size; this.renderer.setStyle(this.el.nativeElement, 'flex-basis', size); } get splitBarSize() { return this._splitBarSize; } get class() { let bindClass = 'devui-splitter-bar devui-splitter-bar-' + this.orientation; if (!this.splitter.isStaticBar(this.index)) { bindClass += ' resizable'; } else { this.renderer.setStyle(this.el.nativeElement, 'flex-basis', this.disabledBarSize); } return bindClass; } constructor(el, splitter, renderer, resize, cdr, cdrSelf, i18n) { this.el = el; this.splitter = splitter; this.renderer = renderer; this.resize = resize; this.cdr = cdr; this.cdrSelf = cdrSelf; this.i18n = i18n; this.subscriptions = new Subscription(); // 移动的时候,阻止事件冒泡 this.stopPropagation = ({ originalEvent: event }) => { event.stopPropagation(); if (event.cancelable) { event.preventDefault(); } }; // 处理移动过程中的数据流, 合并到pressEvent事件流中 this.moveStream = (resize) => (mouseDown) => resize.dragEvent.pipe(takeUntil(resize.releaseEvent), map(({ pageX, pageY }) => ({ originalX: mouseDown.pageX, originalY: mouseDown.pageY, pageX, pageY, }))); this.splitter.paneChangeSubject.subscribe(() => { this.initialCollapseStatus(); this.cdr.detectChanges(); this.cdrSelf.detectChanges(); }); this.splitterText = this.i18n.getI18nText().splitter; this.subscriptions.add(this.i18n.langChange().subscribe((data) => { this.splitterText = data.splitter; })); } ngOnInit() { let state; const resizeListener = this.resize.pressEvent .pipe(tap(this.stopPropagation), filter(() => this.splitter.isResizable(this.index)), tap(() => { state = this.splitter.dragState(this.index); }), switchMap(this.moveStream(this.resize))) .subscribe(({ pageX, pageY, originalX, originalY }) => { let distance; if (this.orientation === 'vertical') { distance = pageY - originalY; } else { distance = pageX - originalX; } this.splitter.setSize(state, distance); }); this.subscriptions.add(resizeListener); } ngAfterViewInit() { this.initialCollapseStatus(); } ngOnDestroy() { this.subscriptions.unsubscribe(); this.splitter.paneChangeSubject.unsubscribe(); } initialCollapseStatus() { this.collapsePrePane(true); this.collapseNextPane(true); } collapsePrePane(lockStatus) { this.splitter.togglePane(this.index, this.index + 1, lockStatus); this.toggleResize(); this.hidePrevIsCovered(); } collapseNextPane(lockStatus) { this.splitter.togglePane(this.index + 1, this.index, lockStatus); this.toggleResize(); this.hideNextIsCovered(); } queryPanes(index, nearIndex) { const pane = this.splitter.getPane(index); const nearPane = this.splitter.getPane(nearIndex); return { pane, nearPane }; } // 切换是否允许拖拽,收起时不能拖拽 toggleResize() { const { pane, nearPane } = this.queryPanes(this.index, this.index + 1); const isCollapsed = pane.collapsed || nearPane.collapsed; if (isCollapsed) { this.renderer.addClass(this.el.nativeElement, 'none-resizable'); } else { this.renderer.removeClass(this.el.nativeElement, 'none-resizable'); } } // 计算前面板收起操作样式 get prevClass() { const { pane, nearPane } = this.queryPanes(this.index, this.index + 1); this.preTip = pane.collapsed ? this.splitterText.expand : this.splitterText.collapse; // 第一个面板或者其它面板折叠方向不是向后的显示操作按钮 const showIcon = pane.collapseDirection !== 'after' || this.index === 0; return this.generateCollapseClass(pane, nearPane, showIcon); } // 计算相邻面板收起操作样式 get nextClass() { const { pane, nearPane } = this.queryPanes(this.index + 1, this.index); this.nextTip = pane.collapsed ? this.splitterText.expand : this.splitterText.collapse; // 最后一个面板或者其它面板折叠方向不是向前的显示操作按钮 const showIcon = pane.collapseDirection !== 'before' || this.index + 1 === this.splitter.paneCount - 1; return this.generateCollapseClass(pane, nearPane, showIcon); } // 生成拼接样式 generateClass(classes) { return Object.keys(classes) .filter((c) => classes[c]) .join(' '); } // 根据当前状态生成收起按钮样式 generateCollapseClass(pane, nearPane, showIcon) { // 是否允许收起 const isCollapsible = pane.collapsible && showIcon; // 当前收起状态 const isCollapsed = pane.collapsed; // 一个pane收起的时候,隐藏相邻pane的收起按钮 const isNearPaneCollapsed = nearPane.collapsed; return this.generateClass({ 'devui-collapse': isCollapsible, collapsed: isCollapsed, hidden: isNearPaneCollapsed, }); } hidePrevIsCovered() { const pane = this.splitter.getPane(this.index); const prevBar = this.splitter.getBar(this.index - 1); const prevBarDom = prevBar?.el.nativeElement.querySelector('.prev'); if (prevBarDom) { const rules = [pane.collapsed, pane.collapsible, pane.collapseDirection === 'before']; if (rules.includes(false)) { prevBarDom.classList.remove('hidden'); } else { prevBarDom.classList.add('hidden'); } } } hideNextIsCovered() { const pane = this.splitter.getPane(this.index + 1); const nextBar = this.splitter.getBar(this.index + 1); const nextBarDom = nextBar?.el.nativeElement.querySelector('.next'); if (nextBarDom) { const rules = [pane.collapsed, pane.collapsible, pane.collapseDirection === 'after']; if (rules.includes(false)) { nextBarDom.classList.remove('hidden'); } else { nextBarDom.classList.add('hidden'); } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterBarComponent, deps: [{ token: i0.ElementRef }, { token: i1.SplitterService }, { token: i0.Renderer2 }, { token: i2.ResizeDirective, host: true }, { token: i0.ChangeDetectorRef, skipSelf: true }, { token: i0.ChangeDetectorRef }, { token: i3.I18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SplitterBarComponent, selector: "d-splitter-bar", inputs: { index: "index", orientation: "orientation", showCollapseButton: "showCollapseButton", collapsePosLeft: "collapsePosLeft", collapsePosTop: "collapsePosTop", splitBarSize: "splitBarSize", disabledBarSize: "disabledBarSize" }, host: { properties: { "class": "this.class" } }, ngImport: i0, template: "<div\n class=\"prev\"\n *ngIf=\"showCollapseButton\"\n dPopover\n [style.left]=\"collapsePosLeft\"\n [style.top]=\"collapsePosTop\"\n [trigger]=\"'hover'\"\n [controlled]=\"true\"\n [ngClass]=\"prevClass\"\n [content]=\"preTip\"\n [showAnimation]=\"false\"\n [mouseEnterDelay]=\"100\"\n [mouseLeaveDelay]=\"0\"\n (click)=\"collapsePrePane()\"\n (touchstart)=\"collapsePrePane()\"\n></div>\n<div class=\"devui-resize-handle\"></div>\n<div\n class=\"next\"\n *ngIf=\"showCollapseButton\"\n dPopover\n [trigger]=\"'hover'\"\n [controlled]=\"true\"\n [ngClass]=\"nextClass\"\n [content]=\"nextTip\"\n (click)=\"collapseNextPane()\"\n (touchstart)=\"collapseNextPane()\"\n></div>\n", styles: [":host.devui-splitter-bar{background-color:var(--devui-dividing-line, #f0f0f0);display:flex;position:relative;align-items:center;justify-content:center;flex-grow:0;flex-shrink:0}:host.devui-splitter-bar .devui-collapse{background-color:var(--devui-line, #dbdbdb);position:absolute;z-index:15;cursor:pointer}:host.devui-splitter-bar .devui-collapse:before,:host.devui-splitter-bar .devui-collapse:after{content:\"\";width:10px;height:2px;background:#fff;display:block;position:absolute}:host.devui-splitter-bar .devui-collapse:hover{background-color:var(--devui-brand-hover, #3979f9)}:host.devui-splitter-bar-horizontal .devui-collapse{width:12px;height:30px}:host.devui-splitter-bar-horizontal .devui-collapse.prev.hidden,:host.devui-splitter-bar-horizontal .devui-collapse.next.hidden{display:none}:host.devui-splitter-bar-horizontal .devui-collapse.prev{border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0;left:100%}:host.devui-splitter-bar-horizontal .devui-collapse.prev:before,:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:before{top:9px;left:1px}:host.devui-splitter-bar-horizontal .devui-collapse.prev:before{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:before{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev:after,:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:after{top:18px;left:1px}:host.devui-splitter-bar-horizontal .devui-collapse.prev:after{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:after{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next{border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px);right:100%}:host.devui-splitter-bar-horizontal .devui-collapse.next:before,:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:before{top:9px;right:1px}:host.devui-splitter-bar-horizontal .devui-collapse.next:before{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:before{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next:after,:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:after{top:18px;right:1px}:host.devui-splitter-bar-horizontal .devui-collapse.next:after{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:after{transform:rotate(70deg)}:host.devui-splitter-bar-vertical .devui-collapse{height:12px;width:30px}:host.devui-splitter-bar-vertical .devui-collapse.prev.hidden,:host.devui-splitter-bar-vertical .devui-collapse.next.hidden{display:none}:host.devui-splitter-bar-vertical .devui-collapse.prev{border-radius:0 0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px);top:100%}:host.devui-splitter-bar-vertical .devui-collapse.prev:before,:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:before{bottom:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.prev:before{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:before{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev:after,:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:after{bottom:5px;left:14px}:host.devui-splitter-bar-vertical .devui-collapse.prev:after{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:after{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next{border-radius:var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0 0;bottom:100%}:host.devui-splitter-bar-vertical .devui-collapse.next:before,:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:before{top:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.next:before{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:before{transform:rotate(-20deg);top:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.next:after,:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:after{top:5px;left:14px}:host.devui-splitter-bar-vertical .devui-collapse.next:after{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:after{transform:rotate(20deg)}:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):hover,:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):focus,:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):active,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):hover,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):focus,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):active{background-color:var(--devui-brand-hover, #3979f9)}:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):after,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):after{content:\"\";display:block;position:absolute;z-index:10}:host.devui-splitter-bar-horizontal.resizable{cursor:col-resize}:host.devui-splitter-bar-horizontal.resizable:after{cursor:col-resize;height:100%;width:10px;top:0}:host.devui-splitter-bar-vertical.resizable{cursor:row-resize}:host.devui-splitter-bar-vertical.resizable:after{cursor:row-resize;width:100%;height:10px;left:0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.PopoverDirective, selector: "[dPopover]", inputs: ["content", "controlled", "position", "showAnimation", "showAnimate", "scrollElement", "autoHideCoefficient", "appendToBody", "zIndex", "popType", "popMaxWidth", "trigger", "hoverToContent", "hoverDelayTime", "popoverStyle", "mouseEnterDelay", "mouseLeaveDelay", "visible"], exportAs: ["dPopover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterBarComponent, decorators: [{ type: Component, args: [{ selector: 'd-splitter-bar', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<div\n class=\"prev\"\n *ngIf=\"showCollapseButton\"\n dPopover\n [style.left]=\"collapsePosLeft\"\n [style.top]=\"collapsePosTop\"\n [trigger]=\"'hover'\"\n [controlled]=\"true\"\n [ngClass]=\"prevClass\"\n [content]=\"preTip\"\n [showAnimation]=\"false\"\n [mouseEnterDelay]=\"100\"\n [mouseLeaveDelay]=\"0\"\n (click)=\"collapsePrePane()\"\n (touchstart)=\"collapsePrePane()\"\n></div>\n<div class=\"devui-resize-handle\"></div>\n<div\n class=\"next\"\n *ngIf=\"showCollapseButton\"\n dPopover\n [trigger]=\"'hover'\"\n [controlled]=\"true\"\n [ngClass]=\"nextClass\"\n [content]=\"nextTip\"\n (click)=\"collapseNextPane()\"\n (touchstart)=\"collapseNextPane()\"\n></div>\n", styles: [":host.devui-splitter-bar{background-color:var(--devui-dividing-line, #f0f0f0);display:flex;position:relative;align-items:center;justify-content:center;flex-grow:0;flex-shrink:0}:host.devui-splitter-bar .devui-collapse{background-color:var(--devui-line, #dbdbdb);position:absolute;z-index:15;cursor:pointer}:host.devui-splitter-bar .devui-collapse:before,:host.devui-splitter-bar .devui-collapse:after{content:\"\";width:10px;height:2px;background:#fff;display:block;position:absolute}:host.devui-splitter-bar .devui-collapse:hover{background-color:var(--devui-brand-hover, #3979f9)}:host.devui-splitter-bar-horizontal .devui-collapse{width:12px;height:30px}:host.devui-splitter-bar-horizontal .devui-collapse.prev.hidden,:host.devui-splitter-bar-horizontal .devui-collapse.next.hidden{display:none}:host.devui-splitter-bar-horizontal .devui-collapse.prev{border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0;left:100%}:host.devui-splitter-bar-horizontal .devui-collapse.prev:before,:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:before{top:9px;left:1px}:host.devui-splitter-bar-horizontal .devui-collapse.prev:before{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:before{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev:after,:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:after{top:18px;left:1px}:host.devui-splitter-bar-horizontal .devui-collapse.prev:after{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:after{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next{border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px);right:100%}:host.devui-splitter-bar-horizontal .devui-collapse.next:before,:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:before{top:9px;right:1px}:host.devui-splitter-bar-horizontal .devui-collapse.next:before{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:before{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next:after,:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:after{top:18px;right:1px}:host.devui-splitter-bar-horizontal .devui-collapse.next:after{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:after{transform:rotate(70deg)}:host.devui-splitter-bar-vertical .devui-collapse{height:12px;width:30px}:host.devui-splitter-bar-vertical .devui-collapse.prev.hidden,:host.devui-splitter-bar-vertical .devui-collapse.next.hidden{display:none}:host.devui-splitter-bar-vertical .devui-collapse.prev{border-radius:0 0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px);top:100%}:host.devui-splitter-bar-vertical .devui-collapse.prev:before,:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:before{bottom:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.prev:before{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:before{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev:after,:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:after{bottom:5px;left:14px}:host.devui-splitter-bar-vertical .devui-collapse.prev:after{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:after{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next{border-radius:var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0 0;bottom:100%}:host.devui-splitter-bar-vertical .devui-collapse.next:before,:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:before{top:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.next:before{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:before{transform:rotate(-20deg);top:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.next:after,:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:after{top:5px;left:14px}:host.devui-splitter-bar-vertical .devui-collapse.next:after{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:after{transform:rotate(20deg)}:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):hover,:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):focus,:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):active,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):hover,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):focus,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):active{background-color:var(--devui-brand-hover, #3979f9)}:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):after,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):after{content:\"\";display:block;position:absolute;z-index:10}:host.devui-splitter-bar-horizontal.resizable{cursor:col-resize}:host.devui-splitter-bar-horizontal.resizable:after{cursor:col-resize;height:100%;width:10px;top:0}:host.devui-splitter-bar-vertical.resizable{cursor:row-resize}:host.devui-splitter-bar-vertical.resizable:after{cursor:row-resize;width:100%;height:10px;left:0}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.SplitterService }, { type: i0.Renderer2 }, { type: i2.ResizeDirective, decorators: [{ type: Host }] }, { type: i0.ChangeDetectorRef, decorators: [{ type: SkipSelf }] }, { type: i0.ChangeDetectorRef }, { type: i3.I18nService }], propDecorators: { index: [{ type: Input }], orientation: [{ type: Input }], showCollapseButton: [{ type: Input }], collapsePosLeft: [{ type: Input }], collapsePosTop: [{ type: Input }], splitBarSize: [{ type: Input }], disabledBarSize: [{ type: Input }], class: [{ type: HostBinding, args: ['class'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXItYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL3NwbGl0dGVyL3NwbGl0dGVyLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9kZXZ1aS9zcGxpdHRlci9zcGxpdHRlci1iYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLEVBQ0osV0FBVyxFQUNYLEtBQUssRUFHTCxTQUFTLEVBQ1QsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFVckQsTUFBTSxPQUFPLG9CQUFvQjtJQVcvQixJQUNJLFlBQVksQ0FBQyxJQUFJO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFHRCxJQUEwQixLQUFLO1FBQzdCLElBQUksU0FBUyxHQUFHLHdDQUF3QyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7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UGhDLFNBQVM7K0JBQ0UsZ0JBQWdCLG1CQUdULHVCQUF1QixDQUFDLE1BQU0sdUJBQzFCLEtBQUs7OzBCQThEdkIsSUFBSTs7MEJBQ0osUUFBUTttR0EzREYsS0FBSztzQkFBYixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFJRixZQUFZO3NCQURmLEtBQUs7Z0JBUUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFb0IsS0FBSztzQkFBOUIsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3QsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2tpcFNlbGYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmVzaXplRGlyZWN0aXZlIH0gZnJvbSAnLi9yZXNpemUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU3BsaXR0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9zcGxpdHRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3BsaXR0ZXJPcmllbnRhdGlvbiB9IGZyb20gJy4vc3BsaXR0ZXIudHlwZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLXNwbGl0dGVyLWJhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NwbGl0dGVyLWJhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3BsaXR0ZXItYmFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTcGxpdHRlckJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAvLyDlvZPliY1wYW5l57Si5byVXHJcbiAgQElucHV0KCkgaW5kZXg6IG51bWJlcjtcclxuICAvLyDnqpfmoLzmjpLliJfmlrnlkJFcclxuICBASW5wdXQoKSBvcmllbnRhdGlvbjogU3BsaXR0ZXJPcmllbnRhdGlvbjtcclxuICAvLyDmmK/lkKbmmL7npLrlsZXlvIAv5pS257yp5oyJ6ZKuXHJcbiAgQElucHV0KCkgc2hvd0NvbGxhcHNlQnV0dG9uO1xyXG4gIEBJbnB1dCgpIGNvbGxhcHNlUG9zTGVmdDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNvbGxhcHNlUG9zVG9wOiBzdHJpbmc7XHJcbiAgLy8g5YiG6ZqU5p2h5aSn5bCPXHJcbiAgX3NwbGl0QmFyU2l6ZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBzcGxpdEJhclNpemUoc2l6ZSkge1xyXG4gICAgdGhpcy5fc3BsaXRCYXJTaXplID0gc2l6ZTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZmxleC1iYXNpcycsIHNpemUpO1xyXG4gIH1cclxuICBnZXQgc3BsaXRCYXJTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NwbGl0QmFyU2l6ZTtcclxuICB9XHJcbiAgQElucHV0KCkgZGlzYWJsZWRCYXJTaXplO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgZ2V0IGNsYXNzKCkge1xyXG4gICAgbGV0IGJpbmRDbGFzcyA9ICdkZXZ1aS1zcGxpdHRlci1iYXIgZGV2dWktc3BsaXR0ZXItYmFyLScgKyB0aGlzLm9yaWVudGF0aW9uO1xyXG4gICAgaWYgKCF0aGlzLnNwbGl0dGVyLmlzU3RhdGljQmFyKHRoaXMuaW5kZXgpKSB7XHJcbiAgICAgIGJpbmRDbGFzcyArPSAnIHJlc2l6YWJsZSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2ZsZXgtYmFzaXMnLCB0aGlzLmRpc2FibGVkQmFyU2l6ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmluZENsYXNzO1xyXG4gIH1cclxuICAvLyDlm73pmYXljJbmlofmoYhcclxuICBzcGxpdHRlclRleHQ7XHJcbiAgLy8g5o+Q56S65YaF5a65XHJcbiAgcHJlVGlwO1xyXG4gIG5leHRUaXA7XHJcbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAvLyDnp7vliqjnmoTml7blgJnvvIzpmLvmraLkuovku7blhpLms6FcclxuICBwcml2YXRlIHN0b3BQcm9wYWdhdGlvbiA9ICh7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50IH0pID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyDlpITnkIbnp7vliqjov4fnqIvkuK3nmoTmlbDmja7mtYEsIOWQiOW5tuWIsHByZXNzRXZlbnTkuovku7bmtYHkuK1cclxuICBwcml2YXRlIG1vdmVTdHJlYW0gPSAocmVzaXplKSA9PiAobW91c2VEb3duKSA9PlxyXG4gICAgcmVzaXplLmRyYWdFdmVudC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwocmVzaXplLnJlbGVhc2VFdmVudCksXHJcbiAgICAgIG1hcCgoeyBwYWdlWCwgcGFnZVkgfTogTW91c2VFdmVudCkgPT4gKHtcclxuICAgICAgICBvcmlnaW5hbFg6IG1vdXNlRG93bi5wYWdlWCxcclxuICAgICAgICBvcmlnaW5hbFk6IG1vdXNlRG93bi5wYWdlWSxcclxuICAgICAgICBwYWdlWCxcclxuICAgICAgICBwYWdlWSxcclxuICAgICAgfSkpXHJcbiAgICApO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgc3BsaXR0ZXI6IFNwbGl0dGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIEBIb3N0KCkgcHJpdmF0ZSByZXNpemU6IFJlc2l6ZURpcmVjdGl2ZSxcclxuICAgIEBTa2lwU2VsZigpIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgY2RyU2VsZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNwbGl0dGVyLnBhbmVDaGFuZ2VTdWJqZWN0LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbENvbGxhcHNlU3RhdHVzKCk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgdGhpcy5jZHJTZWxmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zcGxpdHRlclRleHQgPSB0aGlzLmkxOG4uZ2V0STE4blRleHQoKS5zcGxpdHRlcjtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXHJcbiAgICAgIHRoaXMuaTE4bi5sYW5nQ2hhbmdlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGxpdHRlclRleHQgPSBkYXRhLnNwbGl0dGVyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IHN0YXRlO1xyXG4gICAgY29uc3QgcmVzaXplTGlzdGVuZXIgPSB0aGlzLnJlc2l6ZS5wcmVzc0V2ZW50XHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCh0aGlzLnN0b3BQcm9wYWdhdGlvbiksXHJcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuc3BsaXR0ZXIuaXNSZXNpemFibGUodGhpcy5pbmRleCkpLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICBzdGF0ZSA9IHRoaXMuc3BsaXR0ZXIuZHJhZ1N0YXRlKHRoaXMuaW5kZXgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCh0aGlzLm1vdmVTdHJlYW0odGhpcy5yZXNpemUpKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHsgcGFnZVgsIHBhZ2VZLCBvcmlnaW5hbFgsIG9yaWdpbmFsWSB9KSA9PiB7XHJcbiAgICAgICAgbGV0IGRpc3RhbmNlO1xyXG4gICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSA9IHBhZ2VZIC0gb3JpZ2luYWxZO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSA9IHBhZ2VYIC0gb3JpZ2luYWxYO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNwbGl0dGVyLnNldFNpemUoc3RhdGUsIGRpc3RhbmNlKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHJlc2l6ZUxpc3RlbmVyKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdGlhbENvbGxhcHNlU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zcGxpdHRlci5wYW5lQ2hhbmdlU3ViamVjdC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbENvbGxhcHNlU3RhdHVzKCkge1xyXG4gICAgdGhpcy5jb2xsYXBzZVByZVBhbmUodHJ1ZSk7XHJcbiAgICB0aGlzLmNvbGxhcHNlTmV4dFBhbmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZVByZVBhbmUobG9ja1N0YXR1cz8pIHtcclxuICAgIHRoaXMuc3BsaXR0ZXIudG9nZ2xlUGFuZSh0aGlzLmluZGV4LCB0aGlzLmluZGV4ICsgMSwgbG9ja1N0YXR1cyk7XHJcbiAgICB0aGlzLnRvZ2dsZVJlc2l6ZSgpO1xyXG4gICAgdGhpcy5oaWRlUHJldklzQ292ZXJlZCgpO1xyXG4gIH1cclxuXHJcbiAgY29sbGFwc2VOZXh0UGFuZShsb2NrU3RhdHVzPykge1xyXG4gICAgdGhpcy5zcGxpdHRlci50b2dnbGVQYW5lKHRoaXMuaW5kZXggKyAxLCB0aGlzLmluZGV4LCBsb2NrU3RhdHVzKTtcclxuICAgIHRoaXMudG9nZ2xlUmVzaXplKCk7XHJcbiAgICB0aGlzLmhpZGVOZXh0SXNDb3ZlcmVkKCk7XHJcbiAgfVxyXG5cclxuICBxdWVyeVBhbmVzKGluZGV4LCBuZWFySW5kZXgpIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnNwbGl0dGVyLmdldFBhbmUoaW5kZXgpO1xyXG4gICAgY29uc3QgbmVhclBhbmUgPSB0aGlzLnNwbGl0dGVyLmdldFBhbmUobmVhckluZGV4KTtcclxuICAgIHJldHVybiB7IHBhbmUsIG5lYXJQYW5lIH07XHJcbiAgfVxyXG5cclxuICAvLyDliIfmjaLmmK/lkKblhYHorrjmi5bmi73vvIzmlLbotbfml7bkuI3og73mi5bmi71cclxuICB0b2dnbGVSZXNpemUoKSB7XHJcbiAgICBjb25zdCB7IHBhbmUsIG5lYXJQYW5lIH0gPSB0aGlzLnF1ZXJ5UGFuZXModGhpcy5pbmRleCwgdGhpcy5pbmRleCArIDEpO1xyXG4gICAgY29uc3QgaXNDb2xsYXBzZWQgPSBwYW5lLmNvbGxhcHNlZCB8fCBuZWFyUGFuZS5jb2xsYXBzZWQ7XHJcbiAgICBpZiAoaXNDb2xsYXBzZWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdub25lLXJlc2l6YWJsZScpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdub25lLXJlc2l6YWJsZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5YmN6Z2i5p2/5pS26LW35pON5L2c5qC35byPXHJcbiAgZ2V0IHByZXZDbGFzcygpIHtcclxuICAgIGNvbnN0IHsgcGFuZSwgbmVhclBhbmUgfSA9IHRoaXMucXVlcnlQYW5lcyh0aGlzLmluZGV4LCB0aGlzLmluZGV4ICsgMSk7XHJcbiAgICB0aGlzLnByZVRpcCA9IHBhbmUuY29sbGFwc2VkID8gdGhpcy5zcGxpdHRlclRleHQuZXhwYW5kIDogdGhpcy5zcGxpdHRlclRleHQuY29sbGFwc2U7XHJcbiAgICAvLyDnrKzkuIDkuKrpnaLmnb/miJbogIXlhbblroPpnaLmnb/mipjlj6DmlrnlkJHkuI3mmK/lkJHlkI7nmoTmmL7npLrmk43kvZzmjInpkq5cclxuICAgIGNvbnN0IHNob3dJY29uID0gcGFuZS5jb2xsYXBzZURpcmVjdGlvbiAhPT0gJ2FmdGVyJyB8fCB0aGlzLmluZGV4ID09PSAwO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVDb2xsYXBzZUNsYXNzKHBhbmUsIG5lYXJQYW5lLCBzaG93SWNvbik7XHJcbiAgfVxyXG5cclxuICAvLyDorqHnrpfnm7jpgrvpnaLmnb/mlLbotbfmk43kvZzmoLflvI9cclxuICBnZXQgbmV4dENsYXNzKCkge1xyXG4gICAgY29uc3QgeyBwYW5lLCBuZWFyUGFuZSB9ID0gdGhpcy5xdWVyeVBhbmVzKHRoaXMuaW5kZXggKyAxLCB0aGlzLmluZGV4KTtcclxuICAgIHRoaXMubmV4dFRpcCA9IHBhbmUuY29sbGFwc2VkID8gdGhpcy5zcGxpdHRlclRleHQuZXhwYW5kIDogdGhpcy5zcGxpdHRlclRleHQuY29sbGFwc2U7XHJcbiAgICAvLyDmnIDlkI7kuIDkuKrpnaLmnb/miJbogIXlhbblroPpnaLmnb/mipjlj6DmlrnlkJHkuI3mmK/lkJHliY3nmoTmmL7npLrmk43kvZzmjInpkq5cclxuICAgIGNvbnN0IHNob3dJY29uID0gcGFuZS5jb2xsYXBzZURpcmVjdGlvbiAhPT0gJ2JlZm9yZScgfHwgdGhpcy5pbmRleCArIDEgPT09IHRoaXMuc3BsaXR0ZXIucGFuZUNvdW50IC0gMTtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ29sbGFwc2VDbGFzcyhwYW5lLCBuZWFyUGFuZSwgc2hvd0ljb24pO1xyXG4gIH1cclxuXHJcbiAgLy8g55Sf5oiQ5ou85o6l5qC35byPXHJcbiAgZ2VuZXJhdGVDbGFzcyhjbGFzc2VzKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoY2xhc3NlcylcclxuICAgICAgLmZpbHRlcigoYykgPT4gY2xhc3Nlc1tjXSlcclxuICAgICAgLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIC8vIOagueaNruW9k+WJjeeKtuaAgeeUn+aIkOaUtui1t+aMiemSruagt+W8j1xyXG4gIGdlbmVyYXRlQ29sbGFwc2VDbGFzcyhwYW5lLCBuZWFyUGFuZSwgc2hvd0ljb24pIHtcclxuICAgIC8vIOaYr+WQpuWFgeiuuOaUtui1t1xyXG4gICAgY29uc3QgaXNDb2xsYXBzaWJsZSA9IHBhbmUuY29sbGFwc2libGUgJiYgc2hvd0ljb247XHJcbiAgICAvLyDlvZPliY3mlLbotbfnirbmgIFcclxuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gcGFuZS5jb2xsYXBzZWQ7XHJcbiAgICAvLyDkuIDkuKpwYW5l5pS26LW355qE5pe25YCZ77yM6ZqQ6JeP55u46YK7cGFuZeeahOaUtui1t+aMiemSrlxyXG4gICAgY29uc3QgaXNOZWFyUGFuZUNvbGxhcHNlZCA9IG5lYXJQYW5lLmNvbGxhcHNlZDtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2xhc3Moe1xyXG4gICAgICAnZGV2dWktY29sbGFwc2UnOiBpc0NvbGxhcHNpYmxlLFxyXG4gICAgICBjb2xsYXBzZWQ6IGlzQ29sbGFwc2VkLFxyXG4gICAgICBoaWRkZW46IGlzTmVhclBhbmVDb2xsYXBzZWQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhpZGVQcmV2SXNDb3ZlcmVkKCkge1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMuc3BsaXR0ZXIuZ2V0UGFuZSh0aGlzLmluZGV4KTtcclxuICAgIGNvbnN0IHByZXZCYXIgPSB0aGlzLnNwbGl0dGVyLmdldEJhcih0aGlzLmluZGV4IC0gMSk7XHJcbiAgICBjb25zdCBwcmV2QmFyRG9tID0gcHJldkJhcj8uZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucHJldicpO1xyXG4gICAgaWYgKHByZXZCYXJEb20pIHtcclxuICAgICAgY29uc3QgcnVsZXMgPSBbcGFuZS5jb2xsYXBzZWQsIHBhbmUuY29sbGFwc2libGUsIHBhbmUuY29sbGFwc2VEaXJlY3Rpb24gPT09ICdiZWZvcmUnXTtcclxuICAgICAgaWYgKHJ1bGVzLmluY2x1ZGVzKGZhbHNlKSkge1xyXG4gICAgICAgIHByZXZCYXJEb20uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJldkJhckRvbS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZU5leHRJc0NvdmVyZWQoKSB7XHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5zcGxpdHRlci5nZXRQYW5lKHRoaXMuaW5kZXggKyAxKTtcclxuICAgIGNvbnN0IG5leHRCYXIgPSB0aGlzLnNwbGl0dGVyLmdldEJhcih0aGlzLmluZGV4ICsgMSk7XHJcbiAgICBjb25zdCBuZXh0QmFyRG9tID0gbmV4dEJhcj8uZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubmV4dCcpO1xyXG4gICAgaWYgKG5leHRCYXJEb20pIHtcclxuICAgICAgY29uc3QgcnVsZXMgPSBbcGFuZS5jb2xsYXBzZWQsIHBhbmUuY29sbGFwc2libGUsIHBhbmUuY29sbGFwc2VEaXJlY3Rpb24gPT09ICdhZnRlciddO1xyXG4gICAgICBpZiAocnVsZXMuaW5jbHVkZXMoZmFsc2UpKSB7XHJcbiAgICAgICAgbmV4dEJhckRvbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXh0QmFyRG9tLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcbiAgY2xhc3M9XCJwcmV2XCJcbiAgKm5nSWY9XCJzaG93Q29sbGFwc2VCdXR0b25cIlxuICBkUG9wb3ZlclxuICBbc3R5bGUubGVmdF09XCJjb2xsYXBzZVBvc0xlZnRcIlxuICBbc3R5bGUudG9wXT1cImNvbGxhcHNlUG9zVG9wXCJcbiAgW3RyaWdnZXJdPVwiJ2hvdmVyJ1wiXG4gIFtjb250cm9sbGVkXT1cInRydWVcIlxuICBbbmdDbGFzc109XCJwcmV2Q2xhc3NcIlxuICBbY29udGVudF09XCJwcmVUaXBcIlxuICBbc2hvd0FuaW1hdGlvbl09XCJmYWxzZVwiXG4gIFttb3VzZUVudGVyRGVsYXldPVwiMTAwXCJcbiAgW21vdXNlTGVhdmVEZWxheV09XCIwXCJcbiAgKGNsaWNrKT1cImNvbGxhcHNlUHJlUGFuZSgpXCJcbiAgKHRvdWNoc3RhcnQpPVwiY29sbGFwc2VQcmVQYW5lKClcIlxuPjwvZGl2PlxuPGRpdiBjbGFzcz1cImRldnVpLXJlc2l6ZS1oYW5kbGVcIj48L2Rpdj5cbjxkaXZcbiAgY2xhc3M9XCJuZXh0XCJcbiAgKm5nSWY9XCJzaG93Q29sbGFwc2VCdXR0b25cIlxuICBkUG9wb3ZlclxuICBbdHJpZ2dlcl09XCInaG92ZXInXCJcbiAgW2NvbnRyb2xsZWRdPVwidHJ1ZVwiXG4gIFtuZ0NsYXNzXT1cIm5leHRDbGFzc1wiXG4gIFtjb250ZW50XT1cIm5leHRUaXBcIlxuICAoY2xpY2spPVwiY29sbGFwc2VOZXh0UGFuZSgpXCJcbiAgKHRvdWNoc3RhcnQpPVwiY29sbGFwc2VOZXh0UGFuZSgpXCJcbj48L2Rpdj5cbiJdfQ==