UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

310 lines 26.9 kB
/** * @fileoverview added by tsickle * Generated from: dropdown.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, Input, Output, HostBinding, EventEmitter, ElementRef, Optional, SkipSelf, ContentChildren, QueryList } from '@angular/core'; import { CdkOverlayOrigin } from '@angular/cdk/overlay'; import { Subject, merge, fromEvent } from 'rxjs'; import { debounceTime, mapTo, filter, tap } from 'rxjs/operators'; import { DropDownService } from './dropdown.service'; export class DropDownDirective { /** * @param {?} dropdownService * @param {?} el * @param {?} parentDropdown */ constructor(dropdownService, el, parentDropdown) { this.dropdownService = dropdownService; this.el = el; this.parentDropdown = parentDropdown; this.addClass = true; this.disabled = false; /** * dropdown触发方式 */ this.trigger = 'click'; /** * 关闭区域,默认点击菜单链接也会关闭,blank点击其他空白区域才关闭 */ this.closeScope = 'all'; this.closeOnMouseLeaveMenu = false; this.toggleEvent = new EventEmitter(); this.visibleSubject = new Subject(); this._isOpen = false; } /** * 控制是否打开dropdown,绑定一个devui-dropdown-open class * @return {?} */ get isOpen() { return this._isOpen; } /** * @param {?} value * @return {?} */ set isOpen(value) { this._isOpen = !!value; if (this.disabled) { return; } if (this.isOpen) { this.visibleSubject.next(true); this.focusToggleElement(); this.dropdownService.open(this); } else { this.visibleSubject.next(false); this.dropdownService.close(this); } this.toggleEvent.emit(this.isOpen); } /** * @param {?} bool * @return {?} */ set appendToBody(bool) { this._appendToBody = (bool === true); this.updateCdkConnectedOverlayOrigin(); } /** * @return {?} */ get appendToBody() { return this._appendToBody; } /** * @param {?} dropdownMenu * @return {?} */ set dropDownMenu(dropdownMenu) { // init drop down menu this.menuEl = dropdownMenu.el; } /** * @param {?} dropdownToggle * @return {?} */ set dropDownToggle(dropdownToggle) { // init toggle element this.toggleEl = dropdownToggle.el; this.updateCdkConnectedOverlayOrigin(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.hasOwnProperty('trigger')) { this.handleHoverSubscriptionIfTriggerIsHover(); } } /** * @return {?} */ ngOnDestroy() { this.dropdownService.close(this); this.unsubscribeHoverAction(); } /** * @return {?} */ ngAfterContentInit() { this.handleHoverSubscriptionIfTriggerIsHover(); } /** * @return {?} */ toggle() { return this.isOpen = !this.isOpen; } /** * @return {?} */ focusToggleElement() { if (this.toggleEl) { this.toggleEl.nativeElement.focus(); } } /** * @return {?} */ updateCdkConnectedOverlayOrigin() { if (this.toggleEl && this.appendToBody === true) { this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(this.toggleEl); } else { this.cdkConnectedOverlayOrigin = undefined; } } /** * @param {?} observable * @return {?} */ subscribeHoverAction(observable) { if (!!!this.hoverSubscription) { this.hoverSubscription = observable.pipe(debounceTime(50)).subscribe((/** * @param {?} isOpen * @return {?} */ isOpen => { if (!this.disabled && this.isOpen !== isOpen) { this.isOpen = isOpen; } })); } } /** * @private * @return {?} */ unsubscribeHoverAction() { if (this.hoverSubscription) { this.hoverSubscription.unsubscribe(); this.hoverSubscription = null; } } /** * @return {?} */ handleHoverSubscriptionIfTriggerIsHover() { if (this.trigger === 'hover') { /** @type {?} */ const states = merge(fromEvent(this.el.nativeElement, 'mouseenter').pipe(mapTo(true)), fromEvent(this.el.nativeElement, 'mouseleave').pipe(filter((/** * @param {?} event * @return {?} */ (event) => { if (this.isOpen && this.appendToBody === true) { // 冒泡模拟的relatedTarget, 和作用于dropdown本身event.relatedTarget // menu(子) -> toggle(父) 冒泡模拟的用于离开菜单的时候判断不判断overlay的div层,即只判断menuEl.nativeElement // toggle(父) -> menu(子) 离开元素本身的需要判断是否落入了overlay的div层,即只判断menuEl.nativeElement.parentElement /** @type {?} */ const relatedTarget = event.relatedTarget || (event['originEvent'] && event['originEvent'].relatedTarget); return !(this.menuEl.nativeElement && relatedTarget && (this.menuEl.nativeElement.parentElement.contains(event.relatedTarget) || this.menuEl.nativeElement.parentElement.parentElement.contains(event.relatedTarget) // 套了两层div增加判断 || this.menuEl.nativeElement.contains(relatedTarget) || this.dropdownChildren.some((/** * @param {?} children * @return {?} */ children => children !== this // appendToBody的时候可能会没有实例化不在document上需要做判断有没有parentElement && (children.menuEl.nativeElement.parentElement && children.menuEl.nativeElement.parentElement.contains(event.relatedTarget) || children.menuEl.nativeElement.contains(relatedTarget)))))); } else { return true; } })), tap((/** * @param {?} event * @return {?} */ event => { if (this.parentDropdown) { this.simulateEventDispatch(event, this.parentDropdown.el.nativeElement); } })), mapTo(false))); this.subscribeHoverAction(states); } else { this.unsubscribeHoverAction(); } } /** * @param {?} $event * @param {?=} target * @return {?} */ simulateEventDispatch($event, target) { /** @type {?} */ const event = document.createEvent('MouseEvents'); event.initEvent($event.type, true, true); event['originEvent'] = $event['originEvent'] || $event; if (!target) { target = this.el.nativeElement; } target.dispatchEvent(event); } } DropDownDirective.decorators = [ { type: Directive, args: [{ selector: '[dDropDown]', exportAs: 'd-dropdown', providers: [DropDownService] },] } ]; /** @nocollapse */ DropDownDirective.ctorParameters = () => [ { type: DropDownService }, { type: ElementRef }, { type: DropDownDirective, decorators: [{ type: Optional }, { type: SkipSelf }] } ]; DropDownDirective.propDecorators = { dropdownChildren: [{ type: ContentChildren, args: [DropDownDirective, { descendants: true },] }], isOpen: [{ type: HostBinding, args: ['class.devui-dropdown-open',] }, { type: Input }], addClass: [{ type: HostBinding, args: ['class.devui-dropdown',] }], disabled: [{ type: Input }], trigger: [{ type: Input }], closeScope: [{ type: Input }], closeOnMouseLeaveMenu: [{ type: Input }], toggleEvent: [{ type: Output }] }; if (false) { /** @type {?} */ DropDownDirective.prototype.dropdownChildren; /** * @type {?} * @private */ DropDownDirective.prototype.hoverSubscription; /** @type {?} */ DropDownDirective.prototype.addClass; /** @type {?} */ DropDownDirective.prototype.disabled; /** * dropdown触发方式 * @type {?} */ DropDownDirective.prototype.trigger; /** * 关闭区域,默认点击菜单链接也会关闭,blank点击其他空白区域才关闭 * @type {?} */ DropDownDirective.prototype.closeScope; /** @type {?} */ DropDownDirective.prototype.closeOnMouseLeaveMenu; /** @type {?} */ DropDownDirective.prototype.toggleEvent; /** @type {?} */ DropDownDirective.prototype.visibleSubject; /** * @type {?} * @private */ DropDownDirective.prototype._isOpen; /** @type {?} */ DropDownDirective.prototype.menuEl; /** @type {?} */ DropDownDirective.prototype.toggleEl; /** @type {?} */ DropDownDirective.prototype.cdkConnectedOverlayOrigin; /** * @type {?} * @private */ DropDownDirective.prototype._appendToBody; /** * @type {?} * @private */ DropDownDirective.prototype.dropdownService; /** @type {?} */ DropDownDirective.prototype.el; /** @type {?} */ DropDownDirective.prototype.parentDropdown; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvZHJvcGRvd24vIiwic291cmNlcyI6WyJkcm9wZG93bi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFhLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQ3JDLFFBQVEsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUMvRSxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBYyxLQUFLLEVBQUUsU0FBUyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBT3JELE1BQU0sT0FBTyxpQkFBaUI7Ozs7OztJQXdFNUIsWUFBb0IsZUFBZ0MsRUFBUyxFQUFjLEVBQzFDLGNBQWlDO1FBRDlDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUFTLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBaEQ3QixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBQzVDLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFLakIsWUFBTyxHQUFzQixPQUFPLENBQUM7Ozs7UUFJckMsZUFBVSxHQUE2QixLQUFLLENBQUM7UUFDN0MsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGdCQUFXLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbEUsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRWhDLFlBQU8sR0FBRyxLQUFLLENBQUM7SUFnQ3hC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ZWN0aXZlLCBPbkRlc3Ryb3ksIElucHV0LCBPdXRwdXQsIEhvc3RCaW5kaW5nLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsXHJcbiAgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPcHRpb25hbCwgU2tpcFNlbGYsIENvbnRlbnRDaGlsZHJlbixcclxuICBRdWVyeUxpc3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2RrT3ZlcmxheU9yaWdpbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBtZXJnZSwgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBtYXBUbywgZmlsdGVyLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERyb3BEb3duU2VydmljZSB9IGZyb20gJy4vZHJvcGRvd24uc2VydmljZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRHJvcERvd25dJyxcclxuICBleHBvcnRBczogJ2QtZHJvcGRvd24nLFxyXG4gIHByb3ZpZGVyczogW0Ryb3BEb3duU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIERyb3BEb3duRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oRHJvcERvd25EaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIGRyb3Bkb3duQ2hpbGRyZW46IFF1ZXJ5TGlzdDxEcm9wRG93bkRpcmVjdGl2ZT47XHJcbiAgcHJpdmF0ZSBob3ZlclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIC8qKlxyXG4gICAqIOaOp+WItuaYr+WQpuaJk+W8gGRyb3Bkb3du77yM57uR5a6a5LiA5LiqZGV2dWktZHJvcGRvd24tb3BlbiBjbGFzc1xyXG4gICAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGV2dWktZHJvcGRvd24tb3BlbicpXHJcbiAgQElucHV0KCkgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcclxuICB9XHJcbiAgc2V0IGlzT3Blbih2YWx1ZSkge1xyXG4gICAgdGhpcy5faXNPcGVuID0gISF2YWx1ZTtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLnZpc2libGVTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuZm9jdXNUb2dnbGVFbGVtZW50KCk7XHJcbiAgICAgIHRoaXMuZHJvcGRvd25TZXJ2aWNlLm9wZW4odGhpcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnZpc2libGVTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duU2VydmljZS5jbG9zZSh0aGlzKTtcclxuICAgIH1cclxuICAgIHRoaXMudG9nZ2xlRXZlbnQuZW1pdCh0aGlzLmlzT3Blbik7XHJcbiAgfVxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGV2dWktZHJvcGRvd24nKSBhZGRDbGFzcyA9IHRydWU7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogZHJvcGRvd27op6blj5HmlrnlvI9cclxuICAgKi9cclxuICBASW5wdXQoKSB0cmlnZ2VyOiAnY2xpY2snIHwgJ2hvdmVyJyA9ICdjbGljayc7XHJcbiAgLyoqXHJcbiAgICog5YWz6Zet5Yy65Z+f77yM6buY6K6k54K55Ye76I+c5Y2V6ZO+5o6l5Lmf5Lya5YWz6Zet77yMYmxhbmvngrnlh7vlhbbku5bnqbrnmb3ljLrln5/miY3lhbPpl61cclxuICAgKi9cclxuICBASW5wdXQoKSBjbG9zZVNjb3BlOiAnYWxsJyB8ICdibGFuaycgfCAnbm9uZScgPSAnYWxsJztcclxuICBASW5wdXQoKSBjbG9zZU9uTW91c2VMZWF2ZU1lbnUgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIHRvZ2dsZUV2ZW50OiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHZpc2libGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XHJcblxyXG4gIC8vIGRyb3AgbWVudSBodG1sXHJcbiAgcHVibGljIG1lbnVFbDogRWxlbWVudFJlZjtcclxuICAvLyBkcm9wIGRvd24gdG9nZ2xlIGVsZW1lbnRcclxuICBwdWJsaWMgdG9nZ2xlRWw6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHB1YmxpYyBjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luOiBDZGtPdmVybGF5T3JpZ2luO1xyXG5cclxuICBwcml2YXRlIF9hcHBlbmRUb0JvZHk6IGJvb2xlYW47XHJcblxyXG4gIHB1YmxpYyBzZXQgYXBwZW5kVG9Cb2R5KGJvb2w6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FwcGVuZFRvQm9keSA9IChib29sID09PSB0cnVlKTtcclxuICAgIHRoaXMudXBkYXRlQ2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbigpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGFwcGVuZFRvQm9keSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9hcHBlbmRUb0JvZHk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRyb3BEb3duTWVudShkcm9wZG93bk1lbnUpIHtcclxuICAgIC8vIGluaXQgZHJvcCBkb3duIG1lbnVcclxuICAgIHRoaXMubWVudUVsID0gZHJvcGRvd25NZW51LmVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBkcm9wRG93blRvZ2dsZShkcm9wZG93blRvZ2dsZSkge1xyXG4gICAgLy8gaW5pdCB0b2dnbGUgZWxlbWVudFxyXG4gICAgdGhpcy50b2dnbGVFbCA9IGRyb3Bkb3duVG9nZ2xlLmVsO1xyXG4gICAgdGhpcy51cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRyb3Bkb3duU2VydmljZTogRHJvcERvd25TZXJ2aWNlLCBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwdWJsaWMgcGFyZW50RHJvcGRvd246IERyb3BEb3duRGlyZWN0aXZlKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgndHJpZ2dlcicpKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlSG92ZXJTdWJzY3JpcHRpb25JZlRyaWdnZXJJc0hvdmVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZHJvcGRvd25TZXJ2aWNlLmNsb3NlKHRoaXMpO1xyXG4gICAgdGhpcy51bnN1YnNjcmliZUhvdmVyQWN0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLmhhbmRsZUhvdmVyU3Vic2NyaXB0aW9uSWZUcmlnZ2VySXNIb3ZlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb2N1c1RvZ2dsZUVsZW1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy50b2dnbGVFbCkge1xyXG4gICAgICB0aGlzLnRvZ2dsZUVsLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKSB7XHJcbiAgICBpZiAodGhpcy50b2dnbGVFbCAmJiB0aGlzLmFwcGVuZFRvQm9keSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4gPSBuZXcgQ2RrT3ZlcmxheU9yaWdpbih0aGlzLnRvZ2dsZUVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1YnNjcmliZUhvdmVyQWN0aW9uKG9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4pOiB2b2lkIHtcclxuICAgIGlmICghISF0aGlzLmhvdmVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaG92ZXJTdWJzY3JpcHRpb24gPSBvYnNlcnZhYmxlLnBpcGUoXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwKSxcclxuICAgICAgKS5zdWJzY3JpYmUoaXNPcGVuID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5pc09wZW4gIT09IGlzT3Blbikge1xyXG4gICAgICAgICAgdGhpcy5pc09wZW4gPSBpc09wZW47XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVIb3ZlckFjdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmhvdmVyU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaG92ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy5ob3ZlclN1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVIb3ZlclN1YnNjcmlwdGlvbklmVHJpZ2dlcklzSG92ZXIgKCkge1xyXG4gICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2hvdmVyJykge1xyXG4gICAgICBjb25zdCBzdGF0ZXM6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBtZXJnZShcclxuICAgICAgICBmcm9tRXZlbnQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicpLnBpcGUobWFwVG8odHJ1ZSkpLFxyXG4gICAgICAgIGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJykucGlwZShcclxuICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMuYXBwZW5kVG9Cb2R5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgLy8g5YaS5rOh5qih5ouf55qEcmVsYXRlZFRhcmdldO+8jCDlkozkvZznlKjkuo5kcm9wZG93buacrOi6q2V2ZW50LnJlbGF0ZWRUYXJnZXRcclxuICAgICAgICAgICAgICAvLyBtZW5177yI5a2Q77yJIC0+IHRvZ2dsZe+8iOeItu+8iSDlhpLms6HmqKHmi5/nmoTnlKjkuo7nprvlvIDoj5zljZXnmoTml7blgJnliKTmlq3kuI3liKTmlq1vdmVybGF555qEZGl25bGC77yM5Y2z5Y+q5Yik5patbWVudUVsLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgICAgICAgICAvLyB0b2dnbGXvvIjniLbvvIkgLT4gbWVude+8iOWtkO+8iSDnprvlvIDlhYPntKDmnKzouqvnmoTpnIDopoHliKTmlq3mmK/lkKbokL3lhaXkuoZvdmVybGF555qEZGl25bGC77yM5Y2z5Y+q5Yik5patbWVudUVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudFxyXG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudFsnb3JpZ2luRXZlbnQnXSAmJiBldmVudFsnb3JpZ2luRXZlbnQnXS5yZWxhdGVkVGFyZ2V0KTtcclxuICAgICAgICAgICAgICByZXR1cm4gICEodGhpcy5tZW51RWwubmF0aXZlRWxlbWVudCAmJiByZWxhdGVkVGFyZ2V0ICYmXHJcbiAgICAgICAgICAgICAgICAgICh0aGlzLm1lbnVFbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgICAgICAgfHwgdGhpcy5tZW51RWwubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkgLy8g5aWX5LqG5Lik5bGCZGl25aKe5Yqg5Yik5patXHJcbiAgICAgICAgICAgICAgICAgIHx8IHRoaXMubWVudUVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldClcclxuICAgICAgICAgICAgICAgICAgfHwgdGhpcy5kcm9wZG93bkNoaWxkcmVuLnNvbWUoXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPT5cclxuICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuICE9PSB0aGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmRUb0JvZHnnmoTml7blgJnlj6/og73kvJrmsqHmnInlrp7kvovljJbkuI3lnKhkb2N1bWVudOS4iumcgOimgeWBmuWIpOaWreacieayoeaciXBhcmVudEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICYmICggY2hpbGRyZW4ubWVudUVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgJiYgY2hpbGRyZW4ubWVudUVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgfHwgY2hpbGRyZW4ubWVudUVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMocmVsYXRlZFRhcmdldCkpXHJcbiAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0YXAoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnREcm9wZG93bikge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2ltdWxhdGVFdmVudERpc3BhdGNoKGV2ZW50LCB0aGlzLnBhcmVudERyb3Bkb3duLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIG1hcFRvKGZhbHNlKSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVIb3ZlckFjdGlvbihzdGF0ZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51bnN1YnNjcmliZUhvdmVyQWN0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaW11bGF0ZUV2ZW50RGlzcGF0Y2goJGV2ZW50LCB0YXJnZXQ/ICkge1xyXG4gICAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcclxuICAgIGV2ZW50LmluaXRFdmVudCgkZXZlbnQudHlwZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICBldmVudFsnb3JpZ2luRXZlbnQnXSA9ICRldmVudFsnb3JpZ2luRXZlbnQnXSB8fCAkZXZlbnQ7XHJcblxyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgdGFyZ2V0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==