UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

419 lines 34.4 kB
/** * @fileoverview added by tsickle * Generated from: drawer.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { animate, state, style, transition, trigger } from '@angular/animations'; import { Component, Directive, ElementRef, HostListener, Input, ViewChild, ViewContainerRef } from '@angular/core'; import { isNumber, parseInt, trim } from 'lodash-es'; import { fromEvent, Subject } from 'rxjs'; import { distinctUntilChanged, debounceTime } from 'rxjs/operators'; var DrawerContentDirective = /** @class */ (function () { function DrawerContentDirective(viewContainerRef) { this.viewContainerRef = viewContainerRef; } DrawerContentDirective.decorators = [ { type: Directive, args: [{ selector: '[dDrawerContentHost]', },] } ]; /** @nocollapse */ DrawerContentDirective.ctorParameters = function () { return [ { type: ViewContainerRef } ]; }; return DrawerContentDirective; }()); export { DrawerContentDirective }; if (false) { /** @type {?} */ DrawerContentDirective.prototype.viewContainerRef; } var DrawerComponent = /** @class */ (function () { function DrawerComponent(elementRef) { this.elementRef = elementRef; this.animateState = 'void'; this.width = '300px'; this.isCover = true; this.fullScreen = false; this.clickDoms = []; this.animationDone = new Subject(); } /** * @return {?} */ DrawerComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.setWidth(this.width); this._isCover = this.isCover === undefined ? true : this.isCover; // some browsers(ie11 & edge) fire the animation done event twice this.animationDoneSub = this.animationDone.pipe(distinctUntilChanged((/** * @param {?} x * @param {?} y * @return {?} */ function (x, y) { return x.fromState === y.fromState && x.toState === y.toState; }))).subscribe((/** * @param {?} event * @return {?} */ function (event) { _this.onAnimationEnd(event); })); }; /** * @param {?} width * @return {?} */ DrawerComponent.prototype.setWidth = /** * @param {?} width * @return {?} */ function (width) { if (width.indexOf('%') >= 0) { /** @type {?} */ var widthStr = trim(width, '%'); /** @type {?} */ var widthNum = parseInt(widthStr, 10); this._width = isNumber(widthNum) ? (widthNum * window.innerWidth / 100 + 'px') : '0px'; } else { this._width = width; } this.oldWidth = this._width; }; /** * @return {?} */ DrawerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.animationDoneSub) { this.animationDoneSub.unsubscribe(); } if (this.resizeSub) { this.resizeSub.unsubscribe(); } }; /** * @param {?} event * @return {?} */ DrawerComponent.prototype.keydownHandler = /** * @param {?} event * @return {?} */ function (event) { if (this.escKeyCloseable && !this.isHaveDialogOrUpload()) { this.hide(); } }; /** * @param {?} event * @return {?} */ DrawerComponent.prototype.onAnimationEnd = /** * @param {?} event * @return {?} */ function (event) { if (this.animateState === 'void') { this.onHidden(); } if (this.animateState === 'in' && this.afterOpened) { this.afterOpened(); } }; // Will overwrite by drawer service // Will overwrite by drawer service /** * @return {?} */ DrawerComponent.prototype.onHidden = // Will overwrite by drawer service /** * @return {?} */ function () { }; /** * @return {?} */ DrawerComponent.prototype.show = /** * @return {?} */ function () { var _this = this; if (!this.bodyScrollable) { document.querySelector('body').classList.add('modal-open'); } this.animateState = 'in'; this.isCover = this.isCover === undefined ? true : this.isCover; if (!this.backdropCloseable || this.isCover) { return; } /** @type {?} */ var documentClick = fromEvent(document, 'click'); setTimeout((/** * @return {?} */ function () { _this.subscription = documentClick.subscribe((/** * @param {?} event * @return {?} */ function (event) { if (_this.clickDoms && _this.clickDoms.length > 0) { _this.clickDoms.forEach((/** * @param {?} dom * @return {?} */ function (dom) { if (dom !== null && dom.contains(event.target)) { _this.hide(); return; } })); } else { /** @type {?} */ var target = event.target; // 一定要document.contains(event.target),因为event.target可能已经不在document里了,这个时候就不能进hide了 if (_this.animateState === 'in' && (!_this.elementRef.nativeElement.contains(target) && document.body.contains(target)) && !_this.isHaveDialogOrUpload()) { _this.hide(); } } })); })); }; /** * @return {?} */ DrawerComponent.prototype.hide = /** * @return {?} */ function () { var _this = this; this.canHideModel().then((/** * @param {?} canHide * @return {?} */ function (canHide) { if (!canHide) { return; } if (!_this.bodyScrollable) { document.querySelector('body').classList.remove('modal-open'); } _this.animateState = 'void'; if (_this.subscription) { _this.subscription.unsubscribe(); _this.subscription = undefined; } })); }; // Will overwrite by drawer service // Will overwrite by drawer service /** * @return {?} */ DrawerComponent.prototype.destroy = // Will overwrite by drawer service /** * @return {?} */ function () { }; /** * @return {?} */ DrawerComponent.prototype.isHaveDialogOrUpload = /** * @return {?} */ function () { /** @type {?} */ var dialog = document.getElementsByClassName('modal-dialog'); /** @type {?} */ var upload = document.getElementById('d-upload-temp'); return (dialog && dialog.length > 0) || upload; }; /** * @return {?} */ DrawerComponent.prototype.canHideModel = /** * @return {?} */ function () { /** @type {?} */ var hiddenResult = Promise.resolve(true); if (this.beforeHidden) { /** @type {?} */ var result = this.beforeHidden(); if (typeof result !== 'undefined') { if (result.then) { hiddenResult = result; } else if (result.subscribe) { hiddenResult = ((/** @type {?} */ (result))).toPromise(); } else { hiddenResult = Promise.resolve(result); } } } return hiddenResult; }; /** * @private * @param {?=} fullScreen * @return {?} */ DrawerComponent.prototype._setFullScreen = /** * @private * @param {?=} fullScreen * @return {?} */ function (fullScreen) { var _this = this; if (this._width === this.oldWidth) { if (fullScreen === true || fullScreen === undefined) { this._width = this._isCover ? '100%' : window.innerWidth + 'px'; if (!this._isCover) { /** @type {?} */ var resizeEv = fromEvent(window, 'resize'); /** @type {?} */ var result = resizeEv.pipe(debounceTime(100)); this.resizeSub = result.subscribe((/** * @param {?} ev * @return {?} */ function (ev) { _this._width = window.innerWidth + 'px'; })); } } } else { if (!fullScreen) { this._width = this.oldWidth; if (this.resizeSub) { this.resizeSub.unsubscribe(); } } } }; /** * @return {?} */ DrawerComponent.prototype.toggleFullScreen = /** * @return {?} */ function () { this._setFullScreen(); }; /** * @param {?} fullScreen * @return {?} */ DrawerComponent.prototype.setFullScreen = /** * @param {?} fullScreen * @return {?} */ function (fullScreen) { this._setFullScreen(fullScreen); }; DrawerComponent.decorators = [ { type: Component, args: [{ selector: 'd-drawer', template: "<div\r\n class=\"drawer\"\r\n [attr.id]=\"id\"\r\n [ngClass]=\"{ 'display-width': _isCover && animateState === 'in' }\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n>\r\n <div\r\n class=\"overlay-wrapper\"\r\n [ngClass]=\"{ 'display-width': _isCover && animateState === 'in' }\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n >\r\n <div class=\"overlay-backdrop\" [@fadeInOut]=\"animateState\" (click)=\"backdropCloseable && hide()\"></div>\r\n <div\r\n class=\"drawer-nav\"\r\n [ngStyle]=\"{ width: _width }\"\r\n [@flyInOut]=\"position + '-' + animateState\"\r\n (@flyInOut.done)=\"animationDone.next($event)\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n >\r\n <div class=\"drawer-content\" cdkScrollable>\r\n <ng-template dDrawerContentHost></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", animations: [ trigger('fadeInOut', [ state('void', style({ display: 'block', opacity: 0 })), state('in', style({ display: 'block', opacity: 0.6 })), transition('* => *', animate('300ms ease')), ]), trigger('flyInOut', [ state('left-void', style({ transform: 'translateX(-100%)', left: 0 })), state('left-in', style({ transform: 'none', left: 0 })), state('right-void', style({ transform: 'translateX(100%)', right: 0 })), state('right-in', style({ transform: 'none', right: 0 })), transition('* => *', animate('300ms ease')), ]), ], styles: [".drawer{position:fixed;top:0;bottom:0;z-index:1000}.overlay-wrapper{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;position:absolute;top:0;bottom:0;z-index:1000}.display-width{left:0;right:0}.overlay-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(41,48,64,.2);width:100%;height:100%}.drawer-nav{position:absolute;top:0;bottom:0;background:#fff}.drawer-content{position:absolute;top:0;left:0;right:0;bottom:0;overflow:auto;box-shadow:0 1px 20px -5px rgba(41,48,64,.2)}"] }] } ]; /** @nocollapse */ DrawerComponent.ctorParameters = function () { return [ { type: ElementRef } ]; }; DrawerComponent.propDecorators = { id: [{ type: Input }], width: [{ type: Input }], isCover: [{ type: Input }], fullScreen: [{ type: Input }], drawerContentHost: [{ type: ViewChild, args: [DrawerContentDirective, { static: true },] }], backdropCloseable: [{ type: Input }], escKeyCloseable: [{ type: Input }], beforeHidden: [{ type: Input }], clickDoms: [{ type: Input }], afterOpened: [{ type: Input }], position: [{ type: Input }], bodyScrollable: [{ type: Input }], keydownHandler: [{ type: HostListener, args: ['document:keydown.escape', ['$event'],] }] }; return DrawerComponent; }()); export { DrawerComponent }; if (false) { /** @type {?} */ DrawerComponent.prototype.animateState; /** @type {?} */ DrawerComponent.prototype.id; /** @type {?} */ DrawerComponent.prototype.width; /** @type {?} */ DrawerComponent.prototype.isCover; /** @type {?} */ DrawerComponent.prototype.fullScreen; /** @type {?} */ DrawerComponent.prototype.drawerContentHost; /** @type {?} */ DrawerComponent.prototype.backdropCloseable; /** @type {?} */ DrawerComponent.prototype.escKeyCloseable; /** @type {?} */ DrawerComponent.prototype.beforeHidden; /** @type {?} */ DrawerComponent.prototype.clickDoms; /** @type {?} */ DrawerComponent.prototype.afterOpened; /** @type {?} */ DrawerComponent.prototype.position; /** @type {?} */ DrawerComponent.prototype.bodyScrollable; /** @type {?} */ DrawerComponent.prototype._width; /** @type {?} */ DrawerComponent.prototype.oldWidth; /** @type {?} */ DrawerComponent.prototype._isCover; /** @type {?} */ DrawerComponent.prototype.subscription; /** @type {?} */ DrawerComponent.prototype.animationDone; /** @type {?} */ DrawerComponent.prototype.animationDoneSub; /** @type {?} */ DrawerComponent.prototype.resizeSub; /** * @type {?} * @private */ DrawerComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2RyYXdlci8iLCJzb3VyY2VzIjpbImRyYXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWUsWUFBWSxFQUFFLEtBQUssRUFDakUsU0FBUyxFQUFFLGdCQUFnQixFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFO0lBSUUsZ0NBQW1CLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQ3JELENBQUM7O2dCQUxGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO2lCQUNqQzs7OztnQkFQb0IsZ0JBQWdCOztJQVdyQyw2QkFBQztDQUFBLEFBTkQsSUFNQztTQUhZLHNCQUFzQjs7O0lBQ3JCLGtEQUF5Qzs7QUFJdkQ7SUE0Q0UseUJBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF4QjFDLGlCQUFZLEdBQUcsTUFBTSxDQUFDO1FBRWIsVUFBSyxHQUFHLE9BQU8sQ0FBQztRQUNoQixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUtuQixjQUFTLEdBQVEsRUFBRSxDQUFDO1FBVzdCLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENB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QUMsQ0FBQzs0QkFDdkQsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7eUJBQzVDLENBQUM7cUJBQ0g7O2lCQUNGOzs7O2dCQWhDOEIsVUFBVTs7O3FCQW1DdEMsS0FBSzt3QkFDTCxLQUFLOzBCQUNMLEtBQUs7NkJBQ0wsS0FBSztvQ0FDTCxTQUFTLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO29DQUNsRCxLQUFLO2tDQUNMLEtBQUs7K0JBQ0wsS0FBSzs0QkFDTCxLQUFLOzhCQUVMLEtBQUs7MkJBQ0wsS0FBSztpQ0FDTCxLQUFLO2lDQThDTCxZQUFZLFNBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBNEhyRCxzQkFBQztDQUFBLEFBM01ELElBMk1DO1NBeExZLGVBQWU7OztJQUMxQix1Q0FBc0I7O0lBQ3RCLDZCQUFvQjs7SUFDcEIsZ0NBQXlCOztJQUN6QixrQ0FBd0I7O0lBQ3hCLHFDQUE0Qjs7SUFDNUIsNENBQStGOztJQUMvRiw0Q0FBb0M7O0lBQ3BDLDBDQUFrQzs7SUFDbEMsdUNBQThFOztJQUM5RSxvQ0FBNkI7O0lBRTdCLHNDQUErQjs7SUFDL0IsbUNBQW9DOztJQUNwQyx5Q0FBaUM7O0lBQ2pDLGlDQUFlOztJQUVmLG1DQUFpQjs7SUFDakIsbUNBQWtCOztJQUNsQix1Q0FBMkI7O0lBRTNCLHdDQUE4Qzs7SUFDOUMsMkNBQStCOztJQUMvQixvQ0FBd0I7Ozs7O0lBRVoscUNBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyLCBBbmltYXRpb25FdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5wdXQsXHJcbiAgT25Jbml0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBpc051bWJlciwgcGFyc2VJbnQsIHRyaW0gfSBmcm9tICdsb2Rhc2gtZXMnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZERyYXdlckNvbnRlbnRIb3N0XScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcmF3ZXJDb250ZW50RGlyZWN0aXZlIHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLWRyYXdlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RyYXdlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZHJhd2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignZmFkZUluT3V0JywgW1xyXG4gICAgICBzdGF0ZSgndm9pZCcsIHN0eWxlKHtkaXNwbGF5OiAnYmxvY2snLCBvcGFjaXR5OiAwfSkpLFxyXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7ZGlzcGxheTogJ2Jsb2NrJywgb3BhY2l0eTogMC42fSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IConLCBhbmltYXRlKCczMDBtcyBlYXNlJykpLFxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdmbHlJbk91dCcsIFtcclxuICAgICAgc3RhdGUoJ2xlZnQtdm9pZCcsIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKScsIGxlZnQ6IDB9KSksXHJcbiAgICAgIHN0YXRlKCdsZWZ0LWluJywgc3R5bGUoe3RyYW5zZm9ybTogJ25vbmUnLCBsZWZ0OiAwfSkpLFxyXG4gICAgICBzdGF0ZSgncmlnaHQtdm9pZCcsIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJywgcmlnaHQ6IDB9KSksXHJcbiAgICAgIHN0YXRlKCdyaWdodC1pbicsIHN0eWxlKHt0cmFuc2Zvcm06ICdub25lJywgcmlnaHQ6IDB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gKicsIGFuaW1hdGUoJzMwMG1zIGVhc2UnKSksXHJcbiAgICBdKSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgYW5pbWF0ZVN0YXRlID0gJ3ZvaWQnO1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgd2lkdGggPSAnMzAwcHgnO1xyXG4gIEBJbnB1dCgpIGlzQ292ZXIgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGZ1bGxTY3JlZW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKERyYXdlckNvbnRlbnREaXJlY3RpdmUsIHsgc3RhdGljOiB0cnVlIH0pIGRyYXdlckNvbnRlbnRIb3N0OiBEcmF3ZXJDb250ZW50RGlyZWN0aXZlO1xyXG4gIEBJbnB1dCgpIGJhY2tkcm9wQ2xvc2VhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGVzY0tleUNsb3NlYWJsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBiZWZvcmVIaWRkZW46ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICBASW5wdXQoKSBjbGlja0RvbXM6IGFueSA9IFtdO1xyXG4gIC8vIFdpbGwgb3ZlcndyaXRlIGJ5IGRyYXdlciBzZXJ2aWNlXHJcbiAgQElucHV0KCkgYWZ0ZXJPcGVuZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpIHBvc2l0aW9uOiAncmlnaHQnIHwgJ2xlZnQnO1xyXG4gIEBJbnB1dCgpIGJvZHlTY3JvbGxhYmxlOiBib29sZWFuOyAvLyBkcmF3ZXLmiZPlvIBib2R55piv5ZCm5Y+v5rua5YqoXHJcbiAgX3dpZHRoOiBzdHJpbmc7XHJcbiAgLy8g5YWo5bGP5pe255So5p2l6K6w5b2V5LmL5YmN55qE5a695bqm77yM5Zug5Li65rKh6YGu572p55qE5oOF5Ya15LiLd2lkdGjkuI3og73mmK/nmb7liIbmr5RcclxuICBvbGRXaWR0aDogc3RyaW5nO1xyXG4gIF9pc0NvdmVyOiBib29sZWFuO1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBhbmltYXRpb25Eb25lID0gbmV3IFN1YmplY3Q8QW5pbWF0aW9uRXZlbnQ+KCk7XHJcbiAgYW5pbWF0aW9uRG9uZVN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIHJlc2l6ZVN1YjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgIHRoaXMuX2lzQ292ZXIgPSB0aGlzLmlzQ292ZXIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0aGlzLmlzQ292ZXI7XHJcblxyXG4gICAgLy8gc29tZSBicm93c2VycyhpZTExICYgZWRnZSkgZmlyZSB0aGUgYW5pbWF0aW9uIGRvbmUgZXZlbnQgdHdpY2VcclxuICAgIHRoaXMuYW5pbWF0aW9uRG9uZVN1YiA9IHRoaXMuYW5pbWF0aW9uRG9uZS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh4LCB5KSA9PiB7XHJcbiAgICAgIHJldHVybiB4LmZyb21TdGF0ZSA9PT0geS5mcm9tU3RhdGUgJiYgeC50b1N0YXRlID09PSB5LnRvU3RhdGU7XHJcbiAgICB9KSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgdGhpcy5vbkFuaW1hdGlvbkVuZChldmVudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFdpZHRoKHdpZHRoOiBzdHJpbmcpIHtcclxuICAgIGlmICh3aWR0aC5pbmRleE9mKCclJykgPj0gMCkge1xyXG4gICAgICBjb25zdCB3aWR0aFN0ciA9IHRyaW0od2lkdGgsICclJyk7XHJcbiAgICAgIGNvbnN0IHdpZHRoTnVtID0gcGFyc2VJbnQod2lkdGhTdHIsIDEwKTtcclxuICAgICAgdGhpcy5fd2lkdGggPSBpc051bWJlcih3aWR0aE51bSkgPyAod2lkdGhOdW0gKiB3aW5kb3cuaW5uZXJXaWR0aCAvIDEwMCArICdweCcpIDogJzBweCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbGRXaWR0aCA9IHRoaXMuX3dpZHRoO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5hbmltYXRpb25Eb25lU3ViKSB7XHJcbiAgICAgIHRoaXMuYW5pbWF0aW9uRG9uZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmVzaXplU3ViKSB7XHJcbiAgICAgIHRoaXMucmVzaXplU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pIGtleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5lc2NLZXlDbG9zZWFibGUgJiYgIXRoaXMuaXNIYXZlRGlhbG9nT3JVcGxvYWQoKSkge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQW5pbWF0aW9uRW5kKGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5hbmltYXRlU3RhdGUgPT09ICd2b2lkJykge1xyXG4gICAgICB0aGlzLm9uSGlkZGVuKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hbmltYXRlU3RhdGUgPT09ICdpbicgJiYgdGhpcy5hZnRlck9wZW5lZCkge1xyXG4gICAgICB0aGlzLmFmdGVyT3BlbmVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBXaWxsIG92ZXJ3cml0ZSBieSBkcmF3ZXIgc2VydmljZVxyXG4gIG9uSGlkZGVuKCkge1xyXG5cclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICBpZiAoIXRoaXMuYm9keVNjcm9sbGFibGUpIHtcclxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmNsYXNzTGlzdC5hZGQoJ21vZGFsLW9wZW4nKTtcclxuICAgIH1cclxuICAgIHRoaXMuYW5pbWF0ZVN0YXRlID0gJ2luJztcclxuICAgIHRoaXMuaXNDb3ZlciA9IHRoaXMuaXNDb3ZlciA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRoaXMuaXNDb3ZlcjtcclxuICAgIGlmICghdGhpcy5iYWNrZHJvcENsb3NlYWJsZSB8fCB0aGlzLmlzQ292ZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZG9jdW1lbnRDbGljayA9IGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudCwgJ2NsaWNrJyk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBkb2N1bWVudENsaWNrLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2xpY2tEb21zICYmIHRoaXMuY2xpY2tEb21zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuY2xpY2tEb21zLmZvckVhY2goZG9tID0+IHtcclxuICAgICAgICAgICAgaWYgKGRvbSAhPT0gbnVsbCAmJiBkb20uY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHRhcmdldDogYW55ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgICAgLy8g5LiA5a6a6KaBZG9jdW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0Ke+8jOWboOS4umV2ZW50LnRhcmdldOWPr+iDveW3sue7j+S4jeWcqGRvY3VtZW506YeM5LqG77yM6L+Z5Liq5pe25YCZ5bCx5LiN6IO96L+baGlkZeS6hlxyXG4gICAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZVN0YXRlID09PSAnaW4nICYmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSAmJiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRhcmdldCkpXHJcbiAgICAgICAgICAgICYmICF0aGlzLmlzSGF2ZURpYWxvZ09yVXBsb2FkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpIHtcclxuICAgIHRoaXMuY2FuSGlkZU1vZGVsKCkudGhlbigoY2FuSGlkZSkgPT4ge1xyXG4gICAgICBpZiAoIWNhbkhpZGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmJvZHlTY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFuaW1hdGVTdGF0ZSA9ICd2b2lkJztcclxuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBXaWxsIG92ZXJ3cml0ZSBieSBkcmF3ZXIgc2VydmljZVxyXG4gICAgZGVzdHJveSgpIHt9XHJcblxyXG4gIGlzSGF2ZURpYWxvZ09yVXBsb2FkKCkge1xyXG4gICAgY29uc3QgZGlhbG9nOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtb2RhbC1kaWFsb2cnKTtcclxuICAgIGNvbnN0IHVwbG9hZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2QtdXBsb2FkLXRlbXAnKTtcclxuICAgIHJldHVybiAoZGlhbG9nICYmIGRpYWxvZy5sZW5ndGggPiAwKSB8fCB1cGxvYWQ7XHJcbiAgfVxyXG5cclxuICBjYW5IaWRlTW9kZWwoKSB7XHJcbiAgICBsZXQgaGlkZGVuUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmJlZm9yZUhpZGRlbikge1xyXG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHRoaXMuYmVmb3JlSGlkZGVuKCk7XHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmIChyZXN1bHQudGhlbikge1xyXG4gICAgICAgICAgaGlkZGVuUmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN1YnNjcmliZSkge1xyXG4gICAgICAgICAgaGlkZGVuUmVzdWx0ID0gKHJlc3VsdCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KS50b1Byb21pc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaGlkZGVuUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhpZGRlblJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldEZ1bGxTY3JlZW4oZnVsbFNjcmVlbj86IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl93aWR0aCA9PT0gdGhpcy5vbGRXaWR0aCkge1xyXG4gICAgICBpZiAoZnVsbFNjcmVlbiA9PT0gdHJ1ZSB8fCBmdWxsU2NyZWVuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHRoaXMuX2lzQ292ZXIgPyAnMTAwJScgOiB3aW5kb3cuaW5uZXJXaWR0aCArICdweCc7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NvdmVyKSB7XHJcbiAgICAgICAgICBjb25zdCByZXNpemVFdiA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKTtcclxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc2l6ZUV2LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpO1xyXG4gICAgICAgICAgdGhpcy5yZXNpemVTdWIgPSByZXN1bHQuc3Vic2NyaWJlKGV2ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCArICdweCc7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghZnVsbFNjcmVlbikge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gdGhpcy5vbGRXaWR0aDtcclxuICAgICAgICBpZiAodGhpcy5yZXNpemVTdWIpIHtcclxuICAgICAgICAgIHRoaXMucmVzaXplU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlRnVsbFNjcmVlbigpIHtcclxuICAgIHRoaXMuX3NldEZ1bGxTY3JlZW4oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGdWxsU2NyZWVuKGZ1bGxTY3JlZW46IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3NldEZ1bGxTY3JlZW4oZnVsbFNjcmVlbik7XHJcbiAgfVxyXG59XHJcbiJdfQ==