UNPKG

ng-devui

Version:

DevUI components based on Angular

111 lines 24.4 kB
import { Component, ComponentFactoryResolver, Input } from '@angular/core'; import { I18nService } from 'ng-devui/i18n'; import { OverlayContainerRef } from 'ng-devui/overlay-container'; import { UserGuideCoreService } from './user-guide-core.service'; import { UserGuideUIComponent } from './user-guide-ui.component'; import * as i0 from "@angular/core"; import * as i1 from "ng-devui/overlay-container"; import * as i2 from "./user-guide-core.service"; import * as i3 from "ng-devui/i18n"; import * as i4 from "@angular/common"; import * as i5 from "ng-devui/dropdown"; export class UserGuideComponent { constructor(componentFactoryResolver, overlayContainerRef, userGuideCoreService, i18n) { this.componentFactoryResolver = componentFactoryResolver; this.overlayContainerRef = overlayContainerRef; this.userGuideCoreService = userGuideCoreService; this.i18n = i18n; this.userGuideEntrancePosition = { bottom: '30px', left: '30px' }; this.showUserGuideEntrance = true; } ngOnInit() { this.firstOpenShow = localStorage.getItem('devui-user-guide-first-open-show') || 'true'; this.i18nCommonText = this.i18n.getI18nText().userGuide; this.i18nSubscription = this.i18n.langChange().subscribe((data) => { this.i18nCommonText = data.userGuide; }); } ngAfterViewInit() { setTimeout(() => { for (let i = 0; i < this.steps.length; i++) { if (this.steps[i]?.defaultStart === true && this.firstOpenShow === 'true') { this.start(i); try { localStorage.setItem('devui-user-guide-first-open-show', 'false'); } catch (error) { console.error(error); } break; } } }, 0); } ngOnDestroy() { if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } } start(index) { this.userGuideCoreService.setSteps(this.steps[index].detail); if (this.steps[index].onExit) { this.userGuideCoreService.setExitFunction(this.steps[index].onExit); } this.userGuideCoreService.isFinished.subscribe((item) => { this.steps[index].isFinished = item; if (item === true) { if (this.modalRef) { this.modalRef.hostView.destroy(); } } }); this.userGuideCoreService.start(); this.createGuide(index); this.userGuideCoreService.next(); this.currentTutorial = index; try { localStorage.setItem('devui-user-guide-last-tutorial', index.toString()); } catch (error) { console.error(error); } } goStep(index) { let realStep = index; for (let i = 0; i < index; i++) { if (this.steps[this.currentTutorial].detail[i].type === 'interactable' && this.steps[this.currentTutorial].detail[i].eventType === 'clickable') { realStep = i; break; } } this.userGuideCoreService.goStep(realStep); } createGuide(index) { this.modalRef = this.overlayContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(UserGuideUIComponent)); this.modalRef.instance.showDots = this.steps[index]?.showDots; this.modalRef.instance.maxContentWidth = this.steps[index]?.maxContentWidth ? this.steps[index]?.maxContentWidth : 320; this.modalRef.instance.isCover = this.steps[index]?.isCover === undefined ? true : this.steps[index]?.isCover; this.modalRef.instance.extraConfig = this.steps[index]?.extraConfig; this.modalRef.instance.close = () => { if (this.modalRef) { this.modalRef.hostView.destroy(); } }; const panel = document.querySelector('.user-guide-panel'); panel.style.visibility = 'hidden'; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserGuideComponent, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.OverlayContainerRef }, { token: i2.UserGuideCoreService }, { token: i3.I18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserGuideComponent, selector: "d-user-guide", inputs: { steps: "steps", userGuideEntrancePosition: "userGuideEntrancePosition", showUserGuideEntrance: "showUserGuideEntrance" }, ngImport: i0, template: "<div class=\"user-guide-wapper\" dDropDown appendToBody>\n <div\n dDropDownToggle\n class=\"user-guide\"\n [style.bottom]=\"userGuideEntrancePosition.bottom\"\n [style.left]=\"userGuideEntrancePosition.left\"\n [class.user-guide-hidden]=\"showUserGuideEntrance === false\"\n >\n <div class=\"user-guide-text\">{{ i18nCommonText.guide }}</div>\n </div>\n <div dDropDownMenu class=\"user-guide-window\">\n <ul>\n <li *ngFor=\"let step of steps; let i = index\" role=\"menuitem\" class=\"devui-dropdown-item\" (click)=\"start(i)\">\n <div class=\"step\">\n <div class=\"left-item\">\n <div class=\"title\">{{ step.title }}</div>\n <div class=\"desc\">{{ step.desc }}</div>\n </div>\n <div class=\"right-item\">\n <i *ngIf=\"step.isFinished\" class=\"icon icon-right-o\" style=\"color: rgb(61, 204, 166); font-size: 16px\"></i>\n </div>\n </div>\n </li>\n </ul>\n </div>\n</div>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.user-guide{width:60px;height:60px;border-radius:50%;color:var(--devui-light-text, #ffffff);background-color:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16));position:fixed;z-index:calc(var(--devui-z-index-full-page-overlay, 1080) - 1)}.user-guide-hidden{visibility:hidden}.user-guide-text{line-height:60px;text-align:center;font-weight:700}.user-guide:hover{cursor:pointer;box-shadow:var(--devui-shadow-length-hover, 0 8px 24px 0) var(--devui-hover-shadow, rgba(0, 0, 0, .16))}.user-guide-window{width:200px}.user-guide-window li{padding:8px 12px 8px 20px;cursor:pointer}.user-guide-window li .step{display:flex;justify-content:space-between;align-items:center}.user-guide-window li .title{font-size:var(--devui-font-size, 12px);font-weight:700}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DropDownDirective, selector: "[dDropDown]", inputs: ["isOpen", "disabled", "showAnimation", "trigger", "closeScope", "closeOnMouseLeaveMenu", "autofocusToggleElement"], outputs: ["toggleEvent"], exportAs: ["d-dropdown"] }, { kind: "directive", type: i5.DropDownMenuDirective, selector: "[dDropDownMenu]", exportAs: ["d-dropdown-menu"] }, { kind: "directive", type: i5.DropDownToggleDirective, selector: "[dDropDownToggle]", inputs: ["toggleOnFocus", "autoFocus"], exportAs: ["d-dropdown-toggle"] }, { kind: "component", type: i5.DropDownAppendToBodyComponent, selector: "[dDropDown][appendToBody]", inputs: ["alignOrigin", "appendToBodyDirections", "appendToBodyScrollStrategy"], exportAs: ["d-dropdown-append-to-body"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserGuideComponent, decorators: [{ type: Component, args: [{ selector: 'd-user-guide', template: "<div class=\"user-guide-wapper\" dDropDown appendToBody>\n <div\n dDropDownToggle\n class=\"user-guide\"\n [style.bottom]=\"userGuideEntrancePosition.bottom\"\n [style.left]=\"userGuideEntrancePosition.left\"\n [class.user-guide-hidden]=\"showUserGuideEntrance === false\"\n >\n <div class=\"user-guide-text\">{{ i18nCommonText.guide }}</div>\n </div>\n <div dDropDownMenu class=\"user-guide-window\">\n <ul>\n <li *ngFor=\"let step of steps; let i = index\" role=\"menuitem\" class=\"devui-dropdown-item\" (click)=\"start(i)\">\n <div class=\"step\">\n <div class=\"left-item\">\n <div class=\"title\">{{ step.title }}</div>\n <div class=\"desc\">{{ step.desc }}</div>\n </div>\n <div class=\"right-item\">\n <i *ngIf=\"step.isFinished\" class=\"icon icon-right-o\" style=\"color: rgb(61, 204, 166); font-size: 16px\"></i>\n </div>\n </div>\n </li>\n </ul>\n </div>\n</div>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.user-guide{width:60px;height:60px;border-radius:50%;color:var(--devui-light-text, #ffffff);background-color:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16));position:fixed;z-index:calc(var(--devui-z-index-full-page-overlay, 1080) - 1)}.user-guide-hidden{visibility:hidden}.user-guide-text{line-height:60px;text-align:center;font-weight:700}.user-guide:hover{cursor:pointer;box-shadow:var(--devui-shadow-length-hover, 0 8px 24px 0) var(--devui-hover-shadow, rgba(0, 0, 0, .16))}.user-guide-window{width:200px}.user-guide-window li{padding:8px 12px 8px 20px;cursor:pointer}.user-guide-window li .step{display:flex;justify-content:space-between;align-items:center}.user-guide-window li .title{font-size:var(--devui-font-size, 12px);font-weight:700}\n"] }] }], ctorParameters: () => [{ type: i0.ComponentFactoryResolver }, { type: i1.OverlayContainerRef }, { type: i2.UserGuideCoreService }, { type: i3.I18nService }], propDecorators: { steps: [{ type: Input }], userGuideEntrancePosition: [{ type: Input }], showUserGuideEntrance: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ndWlkZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS91c2VyLWd1aWRlL3VzZXItZ3VpZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvdXNlci1ndWlkZS91c2VyLWd1aWRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDVSxTQUFTLEVBQ3hCLHdCQUF3QixFQUV4QixLQUFLLEVBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7QUFPakUsTUFBTSxPQUFPLGtCQUFrQjtJQVc3QixZQUFvQix3QkFBa0QsRUFDbEQsbUJBQXdDLEVBQ3hDLG9CQUEwQyxFQUMxQyxJQUFpQjtRQUhqQiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBWjVCLDhCQUF5QixHQUFHLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUM7UUFDM0QsMEJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBV0csQ0FBQztJQUMxQyxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLElBQUksTUFBTSxDQUFDO1FBRXhGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FB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QUMsRUFBRSxPQUFPLENBQUM7UUFDN0csSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUU7WUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25DLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFnQixDQUFDO1FBQ3pFLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztJQUNwQyxDQUFDOytHQXZHVSxrQkFBa0I7bUdBQWxCLGtCQUFrQix3TENuQi9CLHcrQkEwQkE7OzRGRFBhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxjQUFjOzRMQUtmLEtBQUs7c0JBQWIsS0FBSztnQkFDRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbXBvbmVudFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcbmltcG9ydCB7IE92ZXJsYXlDb250YWluZXJSZWYgfSBmcm9tICduZy1kZXZ1aS9vdmVybGF5LWNvbnRhaW5lcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVzZXJHdWlkZUNvcmVTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLWd1aWRlLWNvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyR3VpZGVVSUNvbXBvbmVudCB9IGZyb20gJy4vdXNlci1ndWlkZS11aS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkLXVzZXItZ3VpZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1ndWlkZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItZ3VpZGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBVc2VyR3VpZGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHN0ZXBzO1xuICBASW5wdXQoKSB1c2VyR3VpZGVFbnRyYW5jZVBvc2l0aW9uID0ge2JvdHRvbTogJzMwcHgnLCBsZWZ0OiAnMzBweCd9O1xuICBASW5wdXQoKSBzaG93VXNlckd1aWRlRW50cmFuY2UgPSB0cnVlO1xuICBmaXJzdE9wZW5TaG93OiBzdHJpbmc7XG4gIGkxOG5Db21tb25UZXh0OiBJMThuSW50ZXJmYWNlWyd1c2VyR3VpZGUnXTtcbiAgaTE4blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGN1cnJlbnRUdXRvcmlhbDogbnVtYmVyO1xuXG4gIG1vZGFsUmVmOiBDb21wb25lbnRSZWY8VXNlckd1aWRlVUlDb21wb25lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgb3ZlcmxheUNvbnRhaW5lclJlZjogT3ZlcmxheUNvbnRhaW5lclJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB1c2VyR3VpZGVDb3JlU2VydmljZTogVXNlckd1aWRlQ29yZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UpIHsgfVxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZpcnN0T3BlblNob3cgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGV2dWktdXNlci1ndWlkZS1maXJzdC1vcGVuLXNob3cnKSB8fCAndHJ1ZSc7XG5cbiAgICB0aGlzLmkxOG5Db21tb25UZXh0ID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkudXNlckd1aWRlO1xuICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbiA9IHRoaXMuaTE4bi5sYW5nQ2hhbmdlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmkxOG5Db21tb25UZXh0ID0gZGF0YS51c2VyR3VpZGU7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuc3RlcHNbaV0/LmRlZmF1bHRTdGFydCA9PT0gdHJ1ZSAmJiB0aGlzLmZpcnN0T3BlblNob3cgPT09ICd0cnVlJykge1xuICAgICAgICAgIHRoaXMuc3RhcnQoaSk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RldnVpLXVzZXItZ3VpZGUtZmlyc3Qtb3Blbi1zaG93JywgJ2ZhbHNlJyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5pMThuU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmkxOG5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBzdGFydChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy51c2VyR3VpZGVDb3JlU2VydmljZS5zZXRTdGVwcyh0aGlzLnN0ZXBzW2luZGV4XS5kZXRhaWwpO1xuICAgIGlmICh0aGlzLnN0ZXBzW2luZGV4XS5vbkV4aXQpIHtcbiAgICAgIHRoaXMudXNlckd1aWRlQ29yZVNlcnZpY2Uuc2V0RXhpdEZ1bmN0aW9uKHRoaXMuc3RlcHNbaW5kZXhdLm9uRXhpdCk7XG4gICAgfVxuICAgIHRoaXMudXNlckd1aWRlQ29yZVNlcnZpY2UuaXNGaW5pc2hlZC5zdWJzY3JpYmUoKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMuc3RlcHNbaW5kZXhdLmlzRmluaXNoZWQgPSBpdGVtO1xuICAgICAgaWYgKGl0ZW0gPT09IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgICAgICB0aGlzLm1vZGFsUmVmLmhvc3RWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMudXNlckd1aWRlQ29yZVNlcnZpY2Uuc3RhcnQoKTtcbiAgICB0aGlzLmNyZWF0ZUd1aWRlKGluZGV4KTtcblxuICAgIHRoaXMudXNlckd1aWRlQ29yZVNlcnZpY2UubmV4dCgpO1xuXG4gICAgdGhpcy5jdXJyZW50VHV0b3JpYWwgPSBpbmRleDtcblxuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZGV2dWktdXNlci1ndWlkZS1sYXN0LXR1dG9yaWFsJywgaW5kZXgudG9TdHJpbmcoKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGdvU3RlcChpbmRleDogbnVtYmVyKSB7XG4gICAgbGV0IHJlYWxTdGVwID0gaW5kZXg7XG4gICAgZm9yIChsZXQgaSA9IDAgOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50VHV0b3JpYWxdLmRldGFpbFtpXS50eXBlID09PSAnaW50ZXJhY3RhYmxlJ1xuICAgICAgICAmJiB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFR1dG9yaWFsXS5kZXRhaWxbaV0uZXZlbnRUeXBlID09PSAnY2xpY2thYmxlJykge1xuICAgICAgICByZWFsU3RlcCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVzZXJHdWlkZUNvcmVTZXJ2aWNlLmdvU3RlcChyZWFsU3RlcCk7XG4gIH1cblxuICBjcmVhdGVHdWlkZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMub3ZlcmxheUNvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXG4gICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShVc2VyR3VpZGVVSUNvbXBvbmVudClcbiAgICApO1xuICAgIHRoaXMubW9kYWxSZWYuaW5zdGFuY2Uuc2hvd0RvdHMgPSB0aGlzLnN0ZXBzW2luZGV4XT8uc2hvd0RvdHM7XG4gICAgdGhpcy5tb2RhbFJlZi5pbnN0YW5jZS5tYXhDb250ZW50V2lkdGggPSB0aGlzLnN0ZXBzW2luZGV4XT8ubWF4Q29udGVudFdpZHRoID8gdGhpcy5zdGVwc1tpbmRleF0/Lm1heENvbnRlbnRXaWR0aCA6IDMyMDtcbiAgICB0aGlzLm1vZGFsUmVmLmluc3RhbmNlLmlzQ292ZXIgPSB0aGlzLnN0ZXBzW2luZGV4XT8uaXNDb3ZlciA9PT0gdW5kZWZpbmVkID8gdHJ1ZTogdGhpcy5zdGVwc1tpbmRleF0/LmlzQ292ZXI7XG4gICAgdGhpcy5tb2RhbFJlZi5pbnN0YW5jZS5leHRyYUNvbmZpZyA9IHRoaXMuc3RlcHNbaW5kZXhdPy5leHRyYUNvbmZpZztcbiAgICB0aGlzLm1vZGFsUmVmLmluc3RhbmNlLmNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubW9kYWxSZWYpIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZi5ob3N0Vmlldy5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnVzZXItZ3VpZGUtcGFuZWwnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBwYW5lbC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInVzZXItZ3VpZGUtd2FwcGVyXCIgZERyb3BEb3duIGFwcGVuZFRvQm9keT5cbiAgPGRpdlxuICAgIGREcm9wRG93blRvZ2dsZVxuICAgIGNsYXNzPVwidXNlci1ndWlkZVwiXG4gICAgW3N0eWxlLmJvdHRvbV09XCJ1c2VyR3VpZGVFbnRyYW5jZVBvc2l0aW9uLmJvdHRvbVwiXG4gICAgW3N0eWxlLmxlZnRdPVwidXNlckd1aWRlRW50cmFuY2VQb3NpdGlvbi5sZWZ0XCJcbiAgICBbY2xhc3MudXNlci1ndWlkZS1oaWRkZW5dPVwic2hvd1VzZXJHdWlkZUVudHJhbmNlID09PSBmYWxzZVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1ndWlkZS10ZXh0XCI+e3sgaTE4bkNvbW1vblRleHQuZ3VpZGUgfX08L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgZERyb3BEb3duTWVudSBjbGFzcz1cInVzZXItZ3VpZGUtd2luZG93XCI+XG4gICAgPHVsPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzOyBsZXQgaSA9IGluZGV4XCIgcm9sZT1cIm1lbnVpdGVtXCIgY2xhc3M9XCJkZXZ1aS1kcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInN0YXJ0KGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtaXRlbVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgc3RlcC50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NcIj57eyBzdGVwLmRlc2MgfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtaXRlbVwiPlxuICAgICAgICAgICAgPGkgKm5nSWY9XCJzdGVwLmlzRmluaXNoZWRcIiBjbGFzcz1cImljb24gaWNvbi1yaWdodC1vXCIgc3R5bGU9XCJjb2xvcjogcmdiKDYxLCAyMDQsIDE2Nik7IGZvbnQtc2l6ZTogMTZweFwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=