@ciri/ngx-popup
Version:
An angular popup component that can customize animation.
467 lines • 32.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/popup/popup.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { animate, style } from '@angular/animations';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { OverlayHelper } from '../overlay/overlay-helper';
import { AnimationService } from '../animation.service';
/** @type {?} */
var zIndex = 9999;
/**
* @record
*/
export function PopupAnimations() { }
if (false) {
/** @type {?|undefined} */
PopupAnimations.prototype.enter;
/** @type {?|undefined} */
PopupAnimations.prototype.leave;
}
/** @enum {string} */
var Position = {
center: "center",
top: "top",
right: "right",
bottom: "bottom",
left: "left",
};
export { Position };
var PopupComponent = /** @class */ (function () {
function PopupComponent(hostElRef, cdr, renderer, overlayHelper, animation) {
this.hostElRef = hostElRef;
this.cdr = cdr;
this.renderer = renderer;
this.overlayHelper = overlayHelper;
this.animation = animation;
/* inputs
-------------------------- */
this.position = Position.center; /** 弹窗位置 */
/**
* 弹窗位置
*/
this.animations = {}; /** 自定义动画 */
/**
* 自定义动画
*/
this.overlay = true; /** 是否显示蒙版 */
/**
* 是否显示蒙版
*/
this.overlayOpacity = 0.5; /** 蒙版透明度 0~1 */
/**
* 蒙版透明度 0~1
*/
this.closeOnClickOverlay = true; /** 是否允许点击蒙版时自动关闭弹框 */
/**
* 是否允许点击蒙版时自动关闭弹框
*/
this.zIndex = zIndex++; /** 同 css z-index */
/**
* 同 css z-index
*/
this.externalClass = {}; /** 自定义类名 */
/**
* 自定义类名
*/
/* outputs
-------------------------- */
this.clickOverlay = new EventEmitter(); /** 点击蒙版时触发 */
/**
* 点击蒙版时触发
*/
this.beforeOpen = new EventEmitter(); /** 打开之前触发(还未执行进场动画) */
/**
* 打开之前触发(还未执行进场动画)
*/
this.afterOpen = new EventEmitter(); /** 打开之后触发(进场动画执行完毕) */
/**
* 打开之后触发(进场动画执行完毕)
*/
this.beforeClose = new EventEmitter(); /** 关闭之前触发(还未执行离场动画) */
/**
* 关闭之前触发(还未执行离场动画)
*/
this.afterClose = new EventEmitter(); /** 关闭之后触发(离场动画执行完毕) */
this.destroy$ = new Subject();
this.dirty = false;
this.leaving = false;
}
Object.defineProperty(PopupComponent.prototype, "el", {
get: /**
* @return {?}
*/
function () {
return this.container.nativeElement;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
PopupComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroy$.next();
this.destroy$.complete();
};
/**
* @param {?} fn
* @return {?}
*/
PopupComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
PopupComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) { };
/**
* @param {?} value
* @return {?}
*/
PopupComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value === null) {
return;
}
if (!this.dirty && !value) {
return;
}
if (this.animationSub) {
this.animationSub.unsubscribe();
}
if (value) {
this.open();
}
else {
this.close();
}
this.onChange(value);
this.dirty = true;
};
/**
* @private
* @return {?}
*/
PopupComponent.prototype.open = /**
* @private
* @return {?}
*/
function () {
var _this = this;
// 避免闪烁
this.renderer.setStyle(this.el, 'opacity', 0);
this.visible = true;
this.cdr.markForCheck();
this.beforeOpen.emit();
this.leaving = false;
// 优化性能
setTimeout((/**
* @return {?}
*/
function () {
_this.renderer.removeStyle(_this.el, 'opacity');
_this.overlay && _this.openOverlay();
_this.animationSub = _this.makeAnimation('enter')
.pipe(takeUntil(_this.destroy$))
.subscribe((/**
* @return {?}
*/
function () {
_this.afterOpen.emit();
}));
}), 0);
};
/**
* @private
* @return {?}
*/
PopupComponent.prototype.close = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.beforeClose.emit();
this.leaving = true;
this.overlay && this.closeOverlay();
this.animationSub = this.makeAnimation('leave')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @return {?}
*/
function () {
_this.visible = false;
_this.cdr.detectChanges();
_this.afterClose.emit();
_this.leaving = false;
}));
};
/**
* @private
* @return {?}
*/
PopupComponent.prototype.openOverlay = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.closeOverlay = this.overlayHelper.open({
opacity: this.overlayOpacity,
zIndex: this.zIndex,
getContainer: (/**
* @return {?}
*/
function () { return _this.hostElRef.nativeElement; }),
onClick: (/**
* @return {?}
*/
function () {
_this.clickOverlay.emit();
if (_this.closeOnClickOverlay && _this.visible && !_this.leaving) {
_this.writeValue(false);
}
})
});
};
/**
* @private
* @param {?} state
* @return {?}
*/
PopupComponent.prototype.makeAnimation = /**
* @private
* @param {?} state
* @return {?}
*/
function (state) {
/** @type {?} */
var el = this.container.nativeElement;
/** @type {?} */
var animation = state === 'leave' ? this.getLeaveAnimation() : this.getEnterAnimation();
return this.animation.makeAnimation(el, animation);
};
/**
* @private
* @return {?}
*/
PopupComponent.prototype.getEnterAnimation = /**
* @private
* @return {?}
*/
function () {
var _a;
return this.animations.enter || (_a = {},
_a[Position.center] = [style({ opacity: 0 }), animate('.3s ease', style({ opacity: 1 }))],
_a[Position.top] = [style({ transform: 'translate3d(0, -100%, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 0, 0)' }))],
_a[Position.right] = [style({ transform: 'translate3d(100%, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 0, 0)' }))],
_a[Position.bottom] = [style({ transform: 'translate3d(0, 100%, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 0, 0)' }))],
_a[Position.left] = [style({ transform: 'translate3d(-100%, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 0, 0)' }))],
_a)[this.position];
};
/**
* @private
* @return {?}
*/
PopupComponent.prototype.getLeaveAnimation = /**
* @private
* @return {?}
*/
function () {
var _a;
return this.animations.leave || (_a = {},
_a[Position.center] = [style({ opacity: 1 }), animate('.3s ease', style({ opacity: 0 }))],
_a[Position.top] = [style({ transform: 'translate3d(0, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, -100%, 0)' }))],
_a[Position.right] = [style({ transform: 'translate3d(0, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(100%, 0, 0)' }))],
_a[Position.bottom] = [style({ transform: 'translate3d(0, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(0, 100%, 0)' }))],
_a[Position.left] = [style({ transform: 'translate3d(0, 0, 0)' }), animate('.3s ease', style({ transform: 'translate3d(-100%, 0, 0)' }))],
_a)[this.position];
};
PopupComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-popup',
template: "<div class=\"ngx-popup-wrapper is-{{ position }}\" [hidden]=\"!visible\" [style.zIndex]=\"zIndex\">\n <div class=\"ngx-popup\" #container [ngClass]=\"externalClass\">\n <ng-content></ng-content>\n </div>\n</div>\n",
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return PopupComponent; })),
multi: true
}
],
styles: [".ngx-popup-wrapper{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;pointer-events:none}.ngx-popup-wrapper[hidden]{display:none}.ngx-popup-wrapper .ngx-popup{pointer-events:auto}.ngx-popup-wrapper.is-center{align-items:center;justify-content:center}.ngx-popup-wrapper.is-top{align-items:flex-start;justify-content:center}.ngx-popup-wrapper.is-top .ngx-popup{width:100%}.ngx-popup-wrapper.is-right{align-items:center;justify-content:flex-end}.ngx-popup-wrapper.is-right .ngx-popup{height:100%}.ngx-popup-wrapper.is-bottom{align-items:flex-end;justify-content:center}.ngx-popup-wrapper.is-bottom .ngx-popup{width:100%}.ngx-popup-wrapper.is-left{align-items:center;justify-content:flex-start}.ngx-popup-wrapper.is-left .ngx-popup{height:100%}"]
}] }
];
/** @nocollapse */
PopupComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: OverlayHelper },
{ type: AnimationService }
]; };
PopupComponent.propDecorators = {
position: [{ type: Input }],
animations: [{ type: Input }],
overlay: [{ type: Input }],
overlayOpacity: [{ type: Input }],
closeOnClickOverlay: [{ type: Input }],
zIndex: [{ type: Input }],
externalClass: [{ type: Input }],
clickOverlay: [{ type: Output }],
beforeOpen: [{ type: Output }],
afterOpen: [{ type: Output }],
beforeClose: [{ type: Output }],
afterClose: [{ type: Output }],
container: [{ type: ViewChild, args: ['container', { static: false },] }]
};
return PopupComponent;
}());
export { PopupComponent };
if (false) {
/** @type {?} */
PopupComponent.prototype.position;
/**
* 弹窗位置
* @type {?}
*/
PopupComponent.prototype.animations;
/**
* 自定义动画
* @type {?}
*/
PopupComponent.prototype.overlay;
/**
* 是否显示蒙版
* @type {?}
*/
PopupComponent.prototype.overlayOpacity;
/**
* 蒙版透明度 0~1
* @type {?}
*/
PopupComponent.prototype.closeOnClickOverlay;
/**
* 是否允许点击蒙版时自动关闭弹框
* @type {?}
*/
PopupComponent.prototype.zIndex;
/**
* 同 css z-index
* @type {?}
*/
PopupComponent.prototype.externalClass;
/**
* 自定义类名
* @type {?}
*/
PopupComponent.prototype.clickOverlay;
/**
* 点击蒙版时触发
* @type {?}
*/
PopupComponent.prototype.beforeOpen;
/**
* 打开之前触发(还未执行进场动画)
* @type {?}
*/
PopupComponent.prototype.afterOpen;
/**
* 打开之后触发(进场动画执行完毕)
* @type {?}
*/
PopupComponent.prototype.beforeClose;
/**
* 关闭之前触发(还未执行离场动画)
* @type {?}
*/
PopupComponent.prototype.afterClose;
/**
* 关闭之后触发(离场动画执行完毕)
* @type {?}
* @private
*/
PopupComponent.prototype.container;
/** @type {?} */
PopupComponent.prototype.visible;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.destroy$;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.animationSub;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.dirty;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.leaving;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.onChange;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.closeOverlay;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.hostElRef;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.cdr;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.overlayHelper;
/**
* @type {?}
* @private
*/
PopupComponent.prototype.animation;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNpcmkvbmd4LXBvcHVwLyIsInNvdXJjZXMiOlsibGliL3BvcHVwL3BvcHVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBRUwsTUFBTSxFQUFFLFNBQVMsRUFDakIsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEUsT0FBTyxFQUFFLE9BQU8sRUFBcUIsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUE7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTs7SUFFbkQsTUFBTSxHQUFHLElBQUk7Ozs7QUFFakIscUNBR0M7OztJQUZDLGdDQUErQzs7SUFDL0MsZ0NBQStDOzs7QUFHakQsSUFBWSxRQUFRO0lBQ2xCLE1BQU0sVUFBVztJQUNqQixHQUFHLE9BQVE7SUFDWCxLQUFLLFNBQVU7SUFDZixNQUFNLFVBQVc7SUFDakIsSUFBSSxRQUFTO0VBQ2Q7O0FBQ0Q7SUE4Q0Usd0JBQ1UsU0FBcUIsRUFDckIsR0FBc0IsRUFDdEIsUUFBbUIsRUFDbkIsYUFBNEIsRUFDNUIsU0FBMkI7UUFKM0IsY0FBUyxHQUFULFNBQVMsQ0FBWTtRQUNyQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGtCQUFh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QUNMLEtBQUs7c0NBQ0wsS0FBSzt5QkFDTCxLQUFLO2dDQUNMLEtBQUs7K0JBR0wsTUFBTTs2QkFDTixNQUFNOzRCQUNOLE1BQU07OEJBQ04sTUFBTTs2QkFDTixNQUFNOzRCQUVOLFNBQVMsU0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOztJQXlIM0MscUJBQUM7Q0FBQSxBQXpKRCxJQXlKQztTQTNJWSxjQUFjOzs7SUFHekIsa0NBQTZDOzs7OztJQUM3QyxvQ0FBeUM7Ozs7O0lBQ3pDLGlDQUFnQzs7Ozs7SUFDaEMsd0NBQXFDOzs7OztJQUNyQyw2Q0FBNEM7Ozs7O0lBQzVDLGdDQUFrQzs7Ozs7SUFDbEMsdUNBQW1DOzs7OztJQUduQyxzQ0FBZ0Q7Ozs7O0lBQ2hELG9DQUE4Qzs7Ozs7SUFDOUMsbUNBQTZDOzs7OztJQUM3QyxxQ0FBK0M7Ozs7O0lBQy9DLG9DQUE4Qzs7Ozs7O0lBRTlDLG1DQUF3RTs7SUFFeEUsaUNBQWdCOzs7OztJQUtoQixrQ0FBcUM7Ozs7O0lBQ3JDLHNDQUFrQzs7Ozs7SUFDbEMsK0JBQXFCOzs7OztJQUNyQixpQ0FBdUI7Ozs7O0lBQ3ZCLGtDQUFzQzs7Ozs7SUFDdEMsc0NBQWdDOzs7OztJQUc5QixtQ0FBNkI7Ozs7O0lBQzdCLDZCQUE4Qjs7Ozs7SUFDOUIsa0NBQTJCOzs7OztJQUMzQix1Q0FBb0M7Ozs7O0lBQ3BDLG1DQUFtQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCwgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25NZXRhZGF0YSwgc3R5bGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJ1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgT3ZlcmxheUhlbHBlciB9IGZyb20gJy4uL292ZXJsYXkvb3ZlcmxheS1oZWxwZXInXG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vYW5pbWF0aW9uLnNlcnZpY2UnXG5cbmxldCB6SW5kZXggPSA5OTk5XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9wdXBBbmltYXRpb25zIHtcbiAgZW50ZXI/OiBBbmltYXRpb25NZXRhZGF0YSB8IEFuaW1hdGlvbk1ldGFkYXRhW11cbiAgbGVhdmU/OiBBbmltYXRpb25NZXRhZGF0YSB8IEFuaW1hdGlvbk1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGVudW0gUG9zaXRpb24ge1xuICBjZW50ZXIgPSAnY2VudGVyJyxcbiAgdG9wID0gJ3RvcCcsXG4gIHJpZ2h0ID0gJ3JpZ2h0JyxcbiAgYm90dG9tID0gJ2JvdHRvbScsXG4gIGxlZnQgPSAnbGVmdCdcbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1wb3B1cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3B1cC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BvcHVwLmNvbXBvbmVudC5sZXNzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBvcHVwQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFBvcHVwQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XG4gIC8qIGlucHV0c1xuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICBASW5wdXQoKSBwb3NpdGlvbjogUG9zaXRpb24gPSBQb3NpdGlvbi5jZW50ZXIgICAgLyoqIOW8ueeql+S9jee9riAqL1xuICBASW5wdXQoKSBhbmltYXRpb25zOiBQb3B1cEFuaW1hdGlvbnMgPSB7fSAgICAgICAgLyoqIOiHquWumuS5ieWKqOeUuyAqL1xuICBASW5wdXQoKSBvdmVybGF5OiBib29sZWFuID0gdHJ1ZSAgICAgICAgICAgICAgICAgLyoqIOaYr+WQpuaYvuekuuiSmeeJiCAqL1xuICBASW5wdXQoKSBvdmVybGF5T3BhY2l0eTogbnVtYmVyID0gMC41ICAgICAgICAgICAgLyoqIOiSmeeJiOmAj+aYjuW6piAwfjEgKi9cbiAgQElucHV0KCkgY2xvc2VPbkNsaWNrT3ZlcmxheTogYm9vbGVhbiA9IHRydWUgICAgIC8qKiDmmK/lkKblhYHorrjngrnlh7vokpnniYjml7boh6rliqjlhbPpl63lvLnmoYYgKi9cbiAgQElucHV0KCkgekluZGV4OiBudW1iZXIgPSB6SW5kZXgrKyAgICAgICAgICAgICAgIC8qKiDlkIwgY3NzIHotaW5kZXggKi9cbiAgQElucHV0KCkgZXh0ZXJuYWxDbGFzczogb2JqZWN0ID0ge30gICAgICAgICAgICAgIC8qKiDoh6rlrprkuYnnsbvlkI0gKi9cbiAgLyogb3V0cHV0c1xuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICBAT3V0cHV0KCkgY2xpY2tPdmVybGF5ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCkgLyoqIOeCueWHu+iSmeeJiOaXtuinpuWPkSAqL1xuICBAT3V0cHV0KCkgYmVmb3JlT3BlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpICAgLyoqIOaJk+W8gOS5i+WJjeinpuWPke+8iOi/mOacquaJp+ihjOi/m+WcuuWKqOeUu++8iSAqL1xuICBAT3V0cHV0KCkgYWZ0ZXJPcGVuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCkgICAgLyoqIOaJk+W8gOS5i+WQjuinpuWPke+8iOi/m+WcuuWKqOeUu+aJp+ihjOWujOavle+8iSAqL1xuICBAT3V0cHV0KCkgYmVmb3JlQ2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKSAgLyoqIOWFs+mXreS5i+WJjeinpuWPke+8iOi/mOacquaJp+ihjOemu+WcuuWKqOeUu++8iSAqL1xuICBAT3V0cHV0KCkgYWZ0ZXJDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpICAgLyoqIOWFs+mXreS5i+WQjuinpuWPke+8iOemu+WcuuWKqOeUu+aJp+ihjOWujOavle+8iSAqL1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIGNvbnRhaW5lcjogRWxlbWVudFJlZlxuXG4gIHZpc2libGU6IGJvb2xlYW5cbiAgZ2V0IGVsKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpXG4gIHByaXZhdGUgYW5pbWF0aW9uU3ViOiBTdWJzY3JpcHRpb25cbiAgcHJpdmF0ZSBkaXJ0eSA9IGZhbHNlXG4gIHByaXZhdGUgbGVhdmluZyA9IGZhbHNlXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkXG4gIHByaXZhdGUgY2xvc2VPdmVybGF5OiAoKSA9PiB2b2lkXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0RWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIG92ZXJsYXlIZWxwZXI6IE92ZXJsYXlIZWxwZXIsXG4gICAgcHJpdmF0ZSBhbmltYXRpb246IEFuaW1hdGlvblNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpXG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm5cbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHt9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgeyByZXR1cm4gfVxuICAgIGlmICghdGhpcy5kaXJ0eSAmJiAhdmFsdWUpIHsgcmV0dXJuIH1cbiAgICBpZiAodGhpcy5hbmltYXRpb25TdWIpIHsgdGhpcy5hbmltYXRpb25TdWIudW5zdWJzY3JpYmUoKSB9XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMub3BlbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2UoKVxuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpXG4gICAgdGhpcy5kaXJ0eSA9IHRydWVcbiAgfVxuXG4gIHByaXZhdGUgb3BlbigpIHtcbiAgICAvLyDpgb/lhY3pl6rng4FcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdvcGFjaXR5JywgMClcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKClcbiAgICB0aGlzLmJlZm9yZU9wZW4uZW1pdCgpXG4gICAgdGhpcy5sZWF2aW5nID0gZmFsc2VcbiAgICAvLyDkvJjljJbmgKfog71cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5lbCwgJ29wYWNpdHknKVxuICAgICAgdGhpcy5vdmVybGF5ICYmIHRoaXMub3Blbk92ZXJsYXkoKVxuICAgICAgdGhpcy5hbmltYXRpb25TdWIgPSB0aGlzLm1ha2VBbmltYXRpb24oJ2VudGVyJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmFmdGVyT3Blbi5lbWl0KClcbiAgICAgICAgfSlcbiAgICB9LCAwKVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZSgpIHtcbiAgICB0aGlzLmJlZm9yZUNsb3NlLmVtaXQoKVxuICAgIHRoaXMubGVhdmluZyA9IHRydWVcbiAgICB0aGlzLm92ZXJsYXkgJiYgdGhpcy5jbG9zZU92ZXJsYXkoKVxuICAgIHRoaXMuYW5pbWF0aW9uU3ViID0gdGhpcy5tYWtlQW5pbWF0aW9uKCdsZWF2ZScpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2VcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIHRoaXMuYWZ0ZXJDbG9zZS5lbWl0KClcbiAgICAgICAgdGhpcy5sZWF2aW5nID0gZmFsc2VcbiAgICAgIH0pXG4gIH1cblxuICBwcml2YXRlIG9wZW5PdmVybGF5KCkge1xuICAgIHRoaXMuY2xvc2VPdmVybGF5ID0gdGhpcy5vdmVybGF5SGVscGVyLm9wZW4oe1xuICAgICAgb3BhY2l0eTogdGhpcy5vdmVybGF5T3BhY2l0eSxcbiAgICAgIHpJbmRleDogdGhpcy56SW5kZXgsXG4gICAgICBnZXRDb250YWluZXI6ICgpID0+IHRoaXMuaG9zdEVsUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xpY2tPdmVybGF5LmVtaXQoKVxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uQ2xpY2tPdmVybGF5ICYmIHRoaXMudmlzaWJsZSAmJiAhdGhpcy5sZWF2aW5nKSB7XG4gICAgICAgICAgdGhpcy53cml0ZVZhbHVlKGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgbWFrZUFuaW1hdGlvbihzdGF0ZTogJ2VudGVyJyB8ICdsZWF2ZScpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnRcbiAgICBjb25zdCBhbmltYXRpb24gPSBzdGF0ZSA9PT0gJ2xlYXZlJyA/IHRoaXMuZ2V0TGVhdmVBbmltYXRpb24oKSA6IHRoaXMuZ2V0RW50ZXJBbmltYXRpb24oKVxuXG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9uLm1ha2VBbmltYXRpb24oZWwsIGFuaW1hdGlvbilcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW50ZXJBbmltYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9ucy5lbnRlciB8fCB7XG4gICAgICBbUG9zaXRpb24uY2VudGVyXTogWyBzdHlsZSh7IG9wYWNpdHk6IDAgfSksIGFuaW1hdGUoJy4zcyBlYXNlJywgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKSBdLFxuICAgICAgW1Bvc2l0aW9uLnRvcF0gICA6IFsgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCknIH0pLCBhbmltYXRlKCcuM3MgZWFzZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0pKSBdLFxuICAgICAgW1Bvc2l0aW9uLnJpZ2h0XSA6IFsgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScgfSksIGFuaW1hdGUoJy4zcyBlYXNlJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSkpIF0sXG4gICAgICBbUG9zaXRpb24uYm90dG9tXTogWyBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyB9KSwgYW5pbWF0ZSgnLjNzIGVhc2UnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9KSkgXSxcbiAgICAgIFtQb3NpdGlvbi5sZWZ0XSAgOiBbIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApJyB9KSwgYW5pbWF0ZSgnLjNzIGVhc2UnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9KSkgXVxuICAgIH1bdGhpcy5wb3NpdGlvbl1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGVhdmVBbmltYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYW5pbWF0aW9ucy5sZWF2ZSB8fCB7XG4gICAgICBbUG9zaXRpb24uY2VudGVyXTogWyBzdHlsZSh7IG9wYWNpdHk6IDEgfSksIGFuaW1hdGUoJy4zcyBlYXNlJywgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKSBdLFxuICAgICAgW1Bvc2l0aW9uLnRvcF0gICA6IFsgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSksIGFuaW1hdGUoJy4zcyBlYXNlJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCknIH0pKSBdLFxuICAgICAgW1Bvc2l0aW9uLnJpZ2h0XSA6IFsgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSksIGFuaW1hdGUoJy4zcyBlYXNlJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScgfSkpIF0sXG4gICAgICBbUG9zaXRpb24uYm90dG9tXTogWyBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9KSwgYW5pbWF0ZSgnLjNzIGVhc2UnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyB9KSkgXSxcbiAgICAgIFtQb3NpdGlvbi5sZWZ0XSAgOiBbIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0pLCBhbmltYXRlKCcuM3MgZWFzZScsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApJyB9KSkgXVxuICAgIH1bdGhpcy5wb3NpdGlvbl1cbiAgfVxufVxuIl19