ng-devui
Version:
DevUI components based on Angular
221 lines • 29.8 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { ComponentFactoryResolver, Directive, ElementRef, EventEmitter, Inject, Input, Output } from '@angular/core';
import { OverlayContainerRef } from 'ng-devui/overlay-container';
import { throttle } from 'lodash-es';
import { Subscription } from 'rxjs';
import { StepsGuideComponent } from './steps-guide.component';
import { StepsGuideService } from './steps-guide.service';
import * as i0 from "@angular/core";
import * as i1 from "./steps-guide.service";
import * as i2 from "ng-devui/overlay-container";
export class StepsGuideDirective {
set dStepsGuidePosition(pos) {
this._dStepsGuidePosition = pos;
}
get dStepsGuidePosition() {
return this._dStepsGuidePosition || 'top';
}
/**
* @deprecated Use dStepsGuidePosition to replace.
*/
set position(pos) {
if (!this._dStepsGuidePosition) {
this.dStepsGuidePosition = pos;
}
}
// 允许用户指定一个dom反馈页面变化,通过MutationObserver监听该dom所属节点树变化触发resize事件使引导弹窗自动修正位置
set observerDom(dom) {
if (dom) {
this._observerDom = dom;
// 创建监听实例,并限制回调方法在500ms内只响应一次,避免多次响应dom变化造成性能负担
this.observer = new MutationObserver(throttle(this.mutationCallBack, this.MUTATION_OBSERVER_TIME, { 'leading': false, 'trailing': true }));
this.observer.observe(this._observerDom, this.MUTATION_OBSERVER_CONFIG);
}
else {
this.destroyMutationObserver(true);
}
}
constructor(stepService, elm, componentFactoryResolver, overlayContainerRef, doc) {
this.stepService = stepService;
this.elm = elm;
this.componentFactoryResolver = componentFactoryResolver;
this.overlayContainerRef = overlayContainerRef;
this.doc = doc;
this.steps = [];
// 可选,用于修正引导位置
this.leftFix = 0;
this.topFix = 0;
this.zIndex = 1100;
// 是否自动滚动页面至目标
this.scrollToTargetSwitch = true;
// 点击引导操作触发,返回当前步骤和当前操作,比如上一步、下一步、关闭
this.operateChange = new EventEmitter();
this.sub = new Subscription();
// 监听dom变化的设置,监听属性变化和dom所属节点树变化
this.MUTATION_OBSERVER_CONFIG = { attributes: true, subtree: true };
this.MUTATION_OBSERVER_TIME = 500;
// 监听dom变化的回调方法,即dom发生变化时触发resize事件
this.mutationCallBack = () => {
if (typeof window === 'undefined') {
return;
}
const resizeEvt = this.document.createEvent('Event');
resizeEvt.initEvent('resize', true, true);
window.dispatchEvent(resizeEvt);
};
this.document = this.doc;
}
ngOnInit() {
// 监听当前索引变化,决定显示步骤
this.sub.add(this.stepService.currentIndex.subscribe(index => {
this.canChange(index).then((change) => {
if (!change) {
return;
}
});
// 防止服务中的步骤被置空或默认为空
const serviceSteps = this.stepService.getSteps() || [];
this.steps = serviceSteps.length > 0 ? serviceSteps : this.steps;
const state = localStorage.getItem(`devui_guide_${this.pageName}`) || '1';
this.toggle = Number(state);
this.currentIndex = index;
const currentStep = this.steps.length > 0 && this.steps[this.currentIndex];
// 当前步骤内容存在且未被屏蔽显示且为当前索引时插入操作指引弹窗
if (currentStep && this.toggle && this.stepIndex === this.currentIndex) {
const targetDom = this.targetElement || this.elm.nativeElement;
if (this.scrollToTargetSwitch) {
targetDom.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
}
// 如果该步骤设置了监听dom和监听实例,重启监听
if (this._observerDom && this.observer) {
this.observer.disconnect();
this.observer.observe(this._observerDom, this.MUTATION_OBSERVER_CONFIG);
}
setTimeout(() => {
this.insert({
triggerElement: targetDom,
scrollElement: this.scrollElement,
pageName: this.pageName,
title: currentStep.title,
content: currentStep.content,
stepsCount: this.steps.length,
stepIndex: this.stepIndex,
position: this.dStepsGuidePosition,
leftFix: this.leftFix,
topFix: this.topFix,
zIndex: this.zIndex,
});
});
}
}));
// 监听切换显示和隐藏
this.sub.add(this.stepService.showGuideObs.subscribe(visible => {
if (visible) {
const currentIndex = this.stepService.getCurrentStep() || 0;
localStorage.removeItem(`devui_guide_${this.pageName}`);
this.stepService.setCurrentIndex(currentIndex);
}
else {
try {
localStorage.setItem(`devui_guide_${this.pageName}`, '0');
}
catch (error) {
console.error(error);
}
this.destroyView();
}
}));
}
ngOnDestroy() {
this.sub.unsubscribe();
this.destroyView();
}
destroyView() {
if (this.stepRef) {
this.stepRef.hostView.destroy();
}
this.destroyMutationObserver();
}
insert(option) {
const hasGuide = this.document.querySelector('body>.devui-step-item');
if (!hasGuide) {
this.stepRef = this.overlayContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(StepsGuideComponent));
Object.assign(this.stepRef.instance, option, { extraConfig: this.extraConfig });
this.stepRef.instance.close = (step, type) => {
this.operateChange.emit({ clickType: type, currentIndex: step });
this.destroyView();
};
}
}
// 断开监听, 清空监听dom和实例
destroyMutationObserver(destroyAll) {
if (this.observer) {
this.observer.disconnect();
}
if (destroyAll) {
this._observerDom = undefined;
this.observer = undefined;
}
}
canChange(index) {
let changeResult = Promise.resolve(true);
const currentIndex = this.currentIndex >= 0 ? this.currentIndex : this.stepIndex;
if (currentIndex === index && this.beforeChange) {
const result = this.beforeChange(currentIndex, index);
if (typeof result !== 'undefined') {
if (result.then) {
changeResult = result;
}
else if (result.subscribe) {
changeResult = result.toPromise();
}
else {
changeResult = Promise.resolve(result);
}
}
}
return changeResult;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepsGuideDirective, deps: [{ token: i1.StepsGuideService }, { token: i0.ElementRef }, { token: i0.ComponentFactoryResolver }, { token: i2.OverlayContainerRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: StepsGuideDirective, selector: "[dStepsGuide]", inputs: { pageName: "pageName", steps: "steps", stepIndex: "stepIndex", dStepsGuidePosition: "dStepsGuidePosition", position: "position", leftFix: "leftFix", topFix: "topFix", zIndex: "zIndex", targetElement: "targetElement", scrollElement: "scrollElement", scrollToTargetSwitch: "scrollToTargetSwitch", extraConfig: "extraConfig", observerDom: "observerDom", beforeChange: "beforeChange" }, outputs: { operateChange: "operateChange" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepsGuideDirective, decorators: [{
type: Directive,
args: [{
selector: '[dStepsGuide]',
}]
}], ctorParameters: () => [{ type: i1.StepsGuideService }, { type: i0.ElementRef }, { type: i0.ComponentFactoryResolver }, { type: i2.OverlayContainerRef }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { pageName: [{
type: Input
}], steps: [{
type: Input
}], stepIndex: [{
type: Input
}], dStepsGuidePosition: [{
type: Input
}], position: [{
type: Input
}], leftFix: [{
type: Input
}], topFix: [{
type: Input
}], zIndex: [{
type: Input
}], targetElement: [{
type: Input
}], scrollElement: [{
type: Input
}], scrollToTargetSwitch: [{
type: Input
}], extraConfig: [{
type: Input
}], observerDom: [{
type: Input
}], beforeChange: [{
type: Input
}], operateChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMtZ3VpZGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvc3RlcHMtZ3VpZGUvc3RlcHMtZ3VpZGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsd0JBQXdCLEVBRXhCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQVkxRCxNQUFNLE9BQU8sbUJBQW1CO0lBUzlCLElBQWEsbUJBQW1CLENBQUMsR0FBMkI7UUFDMUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLElBQUksS0FBSyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsUUFBUSxDQUFDLEdBQTJCO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBYUQseUVBQXlFO0lBQ3pFLElBQWEsV0FBVyxDQUFDLEdBQWdCO1FBQ3ZDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJ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QUFNOzJCQUFDLFFBQVE7eUNBckVULFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSU8sbUJBQW1CO3NCQUEvQixLQUFLO2dCQVVPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBZUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBDb21wb25lbnRSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheUNvbnRhaW5lclJlZiB9IGZyb20gJ25nLWRldnVpL292ZXJsYXktY29udGFpbmVyJztcbmltcG9ydCB7IHRocm90dGxlIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3RlcHNHdWlkZUNvbXBvbmVudCB9IGZyb20gJy4vc3RlcHMtZ3VpZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFN0ZXBzR3VpZGVTZXJ2aWNlIH0gZnJvbSAnLi9zdGVwcy1ndWlkZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEV4dHJhQ29uZmlnLFxuICBHdWlkZU9wdGlvbnMsXG4gIE9wZXJhdGVSZXNwb25zZSxcbiAgU3RlcEl0ZW0sXG4gIFN0ZXBzR3VpZGVQb3NpdGlvblR5cGVcbn0gZnJvbSAnLi9zdGVwcy1ndWlkZS50eXBlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkU3RlcHNHdWlkZV0nLFxufSlcbmV4cG9ydCBjbGFzcyBTdGVwc0d1aWRlRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyDlvJXlr7zpobXpnaLmoIfnpLrvvIznlKjkuo7orrDlvZXkuI3lkIzpobXpnaLnmoTlvJXlr7znirbmgIFcbiAgQElucHV0KCkgcGFnZU5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgc3RlcHM6IEFycmF5PFN0ZXBJdGVtPiA9IFtdO1xuICAvLyDor6XmraXpqqTmiYDlsZ7luo/lj7dcbiAgQElucHV0KCkgc3RlcEluZGV4OiBudW1iZXI7XG5cbiAgLy8g5by55Ye65L2N572uIHRvcHxib3R0b218Ym90dG9tLWxlZnR8bGVmdHxyaWdodFxuICBfZFN0ZXBzR3VpZGVQb3NpdGlvbjogU3RlcHNHdWlkZVBvc2l0aW9uVHlwZTtcbiAgQElucHV0KCkgc2V0IGRTdGVwc0d1aWRlUG9zaXRpb24ocG9zOiBTdGVwc0d1aWRlUG9zaXRpb25UeXBlKSB7XG4gICAgdGhpcy5fZFN0ZXBzR3VpZGVQb3NpdGlvbiA9IHBvcztcbiAgfVxuICBnZXQgZFN0ZXBzR3VpZGVQb3NpdGlvbigpOiBTdGVwc0d1aWRlUG9zaXRpb25UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZFN0ZXBzR3VpZGVQb3NpdGlvbiB8fCAndG9wJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZFN0ZXBzR3VpZGVQb3NpdGlvbiB0byByZXBsYWNlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHBvc2l0aW9uKHBvczogU3RlcHNHdWlkZVBvc2l0aW9uVHlwZSkge1xuICAgIGlmICghdGhpcy5fZFN0ZXBzR3VpZGVQb3NpdGlvbikge1xuICAgICAgdGhpcy5kU3RlcHNHdWlkZVBvc2l0aW9uID0gcG9zO1xuICAgIH1cbiAgfVxuXG4gIC8vIOWPr+mAie+8jOeUqOS6juS/ruato+W8leWvvOS9jee9rlxuICBASW5wdXQoKSBsZWZ0Rml4ID0gMDtcbiAgQElucHV0KCkgdG9wRml4ID0gMDtcbiAgQElucHV0KCkgekluZGV4ID0gMTEwMDtcbiAgLy8g5byV5a+85pi+56S655qE55uu5qCHZG9tLOWmguaenOaMh+Wumu+8jOS4jeWcqOS9v+eUqOaMh+S7pOaJgOWcqOeahGRvbeS9nOS4uuebruagh2RvbVxuICBASW5wdXQoKSB0YXJnZXRFbGVtZW50OiBhbnk7XG4gIEBJbnB1dCgpIHNjcm9sbEVsZW1lbnQ6IGFueTtcbiAgLy8g5piv5ZCm6Ieq5Yqo5rua5Yqo6aG16Z2i6Iez55uu5qCHXG4gIEBJbnB1dCgpIHNjcm9sbFRvVGFyZ2V0U3dpdGNoID0gdHJ1ZTtcbiAgLy8g5byV5a+85ZCR5omp5bGV6YWN572uXG4gIEBJbnB1dCgpIGV4dHJhQ29uZmlnOiBFeHRyYUNvbmZpZztcbiAgLy8g5YWB6K6455So5oi35oyH5a6a5LiA5LiqZG9t5Y+N6aaI6aG16Z2i5Y+Y5YyW77yM6YCa6L+HTXV0YXRpb25PYnNlcnZlcuebkeWQrOivpWRvbeaJgOWxnuiKgueCueagkeWPmOWMluinpuWPkXJlc2l6ZeS6i+S7tuS9v+W8leWvvOW8ueeql+iHquWKqOS/ruato+S9jee9rlxuICBASW5wdXQoKSBzZXQgb2JzZXJ2ZXJEb20oZG9tOiBIVE1MRWxlbWVudCkge1xuICAgIGlmIChkb20pIHtcbiAgICAgIHRoaXMuX29ic2VydmVyRG9tID0gZG9tO1xuICAgICAgLy8g5Yib5bu655uR5ZCs5a6e5L6L77yM5bm26ZmQ5Yi25Zue6LCD5pa55rOV5ZyoNTAwbXPlhoXlj6rlk43lupTkuIDmrKHvvIzpgb/lhY3lpJrmrKHlk43lupRkb23lj5jljJbpgKDmiJDmgKfog73otJ/mi4VcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihcbiAgICAgICAgdGhyb3R0bGUoXG4gICAgICAgICAgdGhpcy5tdXRhdGlvbkNhbGxCYWNrLFxuICAgICAgICAgIHRoaXMuTVVUQVRJT05fT0JTRVJWRVJfVElNRSxcbiAgICAgICAgICB7ICdsZWFkaW5nJzogZmFsc2UsICd0cmFpbGluZyc6IHRydWUgfVxuICAgICAgICApKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9vYnNlcnZlckRvbSwgdGhpcy5NVVRBVElPTl9PQlNFUlZFUl9DT05GSUcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlc3Ryb3lNdXRhdGlvbk9ic2VydmVyKHRydWUpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKSBiZWZvcmVDaGFuZ2U6IChjdXJyZW50SW5kZXgsIHRhcmdldEluZGV4KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8vIOeCueWHu+W8leWvvOaTjeS9nOinpuWPke+8jOi/lOWbnuW9k+WJjeatpemqpOWSjOW9k+WJjeaTjeS9nO+8jOavlOWmguS4iuS4gOatpeOAgeS4i+S4gOatpeOAgeWFs+mXrVxuICBAT3V0cHV0KCkgb3BlcmF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8T3BlcmF0ZVJlc3BvbnNlPigpO1xuICBfb2JzZXJ2ZXJEb206IGFueTtcbiAgc3RlcFJlZjogQ29tcG9uZW50UmVmPFN0ZXBzR3VpZGVDb21wb25lbnQ+O1xuICBvYnNlcnZlcjogYW55O1xuICB0b2dnbGU6IGFueTtcbiAgY3VycmVudEluZGV4OiBudW1iZXI7XG4gIHN1YjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAvLyDnm5HlkKxkb23lj5jljJbnmoTorr7nva7vvIznm5HlkKzlsZ7mgKflj5jljJblkoxkb23miYDlsZ7oioLngrnmoJHlj5jljJZcbiAgTVVUQVRJT05fT0JTRVJWRVJfQ09ORklHID0geyBhdHRyaWJ1dGVzOiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH07XG4gIE1VVEFUSU9OX09CU0VSVkVSX1RJTUUgPSA1MDA7XG4gIGRvY3VtZW50OiBEb2N1bWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0ZXBTZXJ2aWNlOiBTdGVwc0d1aWRlU2VydmljZSxcbiAgICBwcml2YXRlIGVsbTogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgb3ZlcmxheUNvbnRhaW5lclJlZjogT3ZlcmxheUNvbnRhaW5lclJlZixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55XG4gICkge1xuICAgIHRoaXMuZG9jdW1lbnQgPSB0aGlzLmRvYztcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIOebkeWQrOW9k+WJjee0ouW8leWPmOWMlu+8jOWGs+WumuaYvuekuuatpemqpFxuICAgIHRoaXMuc3ViLmFkZCh0aGlzLnN0ZXBTZXJ2aWNlLmN1cnJlbnRJbmRleC5zdWJzY3JpYmUoaW5kZXggPT4ge1xuICAgICAgdGhpcy5jYW5DaGFuZ2UoaW5kZXgpLnRoZW4oKGNoYW5nZSkgPT4ge1xuICAgICAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyDpmLLmraLmnI3liqHkuK3nmoTmraXpqqTooqvnva7nqbrmiJbpu5jorqTkuLrnqbpcbiAgICAgIGNvbnN0IHNlcnZpY2VTdGVwcyA9IHRoaXMuc3RlcFNlcnZpY2UuZ2V0U3RlcHMoKSB8fCBbXTtcbiAgICAgIHRoaXMuc3RlcHMgPSBzZXJ2aWNlU3RlcHMubGVuZ3RoID4gMCA/IHNlcnZpY2VTdGVwcyA6IHRoaXMuc3RlcHM7XG4gICAgICBjb25zdCBzdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGBkZXZ1aV9ndWlkZV8ke3RoaXMucGFnZU5hbWV9YCkgfHwgJzEnO1xuICAgICAgdGhpcy50b2dnbGUgPSBOdW1iZXIoc3RhdGUpO1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gdGhpcy5zdGVwcy5sZW5ndGggPiAwICYmIHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50SW5kZXhdO1xuICAgICAgLy8g5b2T5YmN5q2l6aqk5YaF5a655a2Y5Zyo5LiU5pyq6KKr5bGP6JS95pi+56S65LiU5Li65b2T5YmN57Si5byV5pe25o+S5YWl5pON5L2c5oyH5byV5by556qXXG4gICAgICBpZiAoY3VycmVudFN0ZXAgJiYgdGhpcy50b2dnbGUgJiYgdGhpcy5zdGVwSW5kZXggPT09IHRoaXMuY3VycmVudEluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldERvbSA9IHRoaXMudGFyZ2V0RWxlbWVudCB8fCB0aGlzLmVsbS5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxUb1RhcmdldFN3aXRjaCkge1xuICAgICAgICAgIHRhcmdldERvbS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JywgaW5saW5lOiAnbmVhcmVzdCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5aaC5p6c6K+l5q2l6aqk6K6+572u5LqG55uR5ZCsZG9t5ZKM55uR5ZCs5a6e5L6L77yM6YeN5ZCv55uR5ZCsXG4gICAgICAgIGlmICh0aGlzLl9vYnNlcnZlckRvbSAmJiB0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuX29ic2VydmVyRG9tLCB0aGlzLk1VVEFUSU9OX09CU0VSVkVSX0NPTkZJRyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbnNlcnQoe1xuICAgICAgICAgICAgdHJpZ2dlckVsZW1lbnQ6IHRhcmdldERvbSxcbiAgICAgICAgICAgIHNjcm9sbEVsZW1lbnQ6IHRoaXMuc2Nyb2xsRWxlbWVudCxcbiAgICAgICAgICAgIHBhZ2VOYW1lOiB0aGlzLnBhZ2VOYW1lLFxuICAgICAgICAgICAgdGl0bGU6IGN1cnJlbnRTdGVwLnRpdGxlLFxuICAgICAgICAgICAgY29udGVudDogY3VycmVudFN0ZXAuY29udGVudCxcbiAgICAgICAgICAgIHN0ZXBzQ291bnQ6IHRoaXMuc3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgc3RlcEluZGV4OiB0aGlzLnN0ZXBJbmRleCxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB0aGlzLmRTdGVwc0d1aWRlUG9zaXRpb24sXG4gICAgICAgICAgICBsZWZ0Rml4OiB0aGlzLmxlZnRGaXgsXG4gICAgICAgICAgICB0b3BGaXg6IHRoaXMudG9wRml4LFxuICAgICAgICAgICAgekluZGV4OiB0aGlzLnpJbmRleCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgLy8g55uR5ZCs5YiH5o2i5pi+56S65ZKM6ZqQ6JePXG4gICAgdGhpcy5zdWIuYWRkKHRoaXMuc3RlcFNlcnZpY2Uuc2hvd0d1aWRlT2JzLnN1YnNjcmliZSh2aXNpYmxlID0+IHtcbiAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuc3RlcFNlcnZpY2UuZ2V0Q3VycmVudFN0ZXAoKSB8fCAwO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZGV2dWlfZ3VpZGVfJHt0aGlzLnBhZ2VOYW1lfWApO1xuICAgICAgICB0aGlzLnN0ZXBTZXJ2aWNlLnNldEN1cnJlbnRJbmRleChjdXJyZW50SW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgZGV2dWlfZ3VpZGVfJHt0aGlzLnBhZ2VOYW1lfWAsICcwJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0cm95VmlldygpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kZXN0cm95VmlldygpO1xuICB9XG5cbiAgZGVzdHJveVZpZXcoKSB7XG4gICAgaWYgKHRoaXMuc3RlcFJlZikge1xuICAgICAgdGhpcy5zdGVwUmVmLmhvc3RWaWV3LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95TXV0YXRpb25PYnNlcnZlcigpO1xuICB9XG5cbiAgaW5zZXJ0KG9wdGlvbjogR3VpZGVPcHRpb25zKSB7XG4gICAgY29uc3QgaGFzR3VpZGUgPSB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHk+LmRldnVpLXN0ZXAtaXRlbScpO1xuICAgIGlmICghaGFzR3VpZGUpIHtcbiAgICAgIHRoaXMuc3RlcFJlZiA9IHRoaXMub3ZlcmxheUNvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQodGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoU3RlcHNHdWlkZUNvbXBvbmVudCkpO1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnN0ZXBSZWYuaW5zdGFuY2UsIG9wdGlvbiwgeyBleHRyYUNvbmZpZzogdGhpcy5leHRyYUNvbmZpZyB9KTtcbiAgICAgIHRoaXMuc3RlcFJlZi5pbnN0YW5jZS5jbG9zZSA9IChzdGVwLCB0eXBlPykgPT4ge1xuICAgICAgICB0aGlzLm9wZXJhdGVDaGFuZ2UuZW1pdCh7IGNsaWNrVHlwZTogdHlwZSwgY3VycmVudEluZGV4OiBzdGVwIH0pO1xuICAgICAgICB0aGlzLmRlc3Ryb3lWaWV3KCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIOebkeWQrGRvbeWPmOWMlueahOWbnuiwg+aWueazle+8jOWNs2RvbeWPkeeUn+WPmOWMluaXtuinpuWPkXJlc2l6ZeS6i+S7tlxuICBtdXRhdGlvbkNhbGxCYWNrID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXNpemVFdnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIHJlc2l6ZUV2dC5pbml0RXZlbnQoJ3Jlc2l6ZScsIHRydWUsIHRydWUpO1xuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KHJlc2l6ZUV2dCk7XG4gIH07XG5cbiAgLy8g5pat5byA55uR5ZCsLCDmuIXnqbrnm5HlkKxkb23lkozlrp7kvotcbiAgZGVzdHJveU11dGF0aW9uT2JzZXJ2ZXIoZGVzdHJveUFsbD86IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIGlmIChkZXN0cm95QWxsKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlckRvbSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgY2FuQ2hhbmdlKGluZGV4KSB7XG4gICAgbGV0IGNoYW5nZVJlc3VsdCA9IFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRJbmRleCA+PSAwID8gdGhpcy5jdXJyZW50SW5kZXggOiB0aGlzLnN0ZXBJbmRleDtcbiAgICBpZiAoY3VycmVudEluZGV4ID09PSBpbmRleCAmJiB0aGlzLmJlZm9yZUNoYW5nZSkge1xuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmJlZm9yZUNoYW5nZShjdXJyZW50SW5kZXgsIGluZGV4KTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAocmVzdWx0LnRoZW4pIHtcbiAgICAgICAgICBjaGFuZ2VSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN1YnNjcmliZSkge1xuICAgICAgICAgIGNoYW5nZVJlc3VsdCA9IChyZXN1bHQgYXMgT2JzZXJ2YWJsZTxib29sZWFuPikudG9Qcm9taXNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbmdlUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZVJlc3VsdDtcbiAgfVxufVxuIl19