ngx-pluto
Version:
429 lines • 29.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, ViewChild, forwardRef, Output, EventEmitter, ChangeDetectorRef } from "@angular/core";
import { NpDatePickerService } from "./date-picker.service";
import * as moment_ from 'moment';
/** @type {?} */
var moment = moment_;
import { NpDatePickerPopup } from "./components/date-picker-popup";
import { ComponentPortal } from "@angular/cdk/portal";
import { DATE_FORMAT, DATE_TIME_FORMAT } from "./date-picker-const";
import { NpInput } from "../input";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
/**
* Date picker组件
*/
var NpDatePicker = /** @class */ (function () {
function NpDatePicker(datePickerService, cdf) {
this.datePickerService = datePickerService;
this.cdf = cdf;
/**
* Placeholder
*/
this.placeholder = '';
/**
* 已选时间
*/
this.date = null;
/**
* 日期时间展示格式,默认只展示日期
*/
this.format = DATE_FORMAT;
/**
* 是否展示时间,默认不展示
*/
this.isShowTime = false;
/**
* 显示在footer左侧的自定义时间标签数组,如“昨天”等
*/
this.footerItems = [];
/**
* 当为datetime-picker时,底部面板最右侧展示的确认按钮名称
*/
this.confirmButtonText = '确认';
this.onDateChanged = new EventEmitter();
this.isHover = false;
this.emitChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { });
}
/**
* @return {?}
*/
NpDatePicker.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.overlayRef = this.datePickerService.getOverlayRef(this.datePickerInput.npInput);
if (this.isShowTime) {
this.format = DATE_TIME_FORMAT;
}
};
/**
* @param {?} changes
* @return {?}
*/
NpDatePicker.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) { };
/**
* @return {?}
*/
NpDatePicker.prototype.onToggleDatePickerPopup = /**
* @return {?}
*/
function () {
var _this = this;
if (this.isDisabled) {
return;
}
if (this.overlayRef.hasAttached()) {
this.closePopup();
return;
}
this.datePickerPopupRef = this.overlayRef.attach(new ComponentPortal(NpDatePickerPopup));
this.datePickerPopupRef.instance.date = moment(this.date);
this.datePickerPopupRef.instance.datePickerType = this.isShowTime ? 'datetime-picker' : 'date-picker';
this.datePickerPopupRef.instance.footerItems = this.footerItems;
this.datePickerPopupRef.instance.isShowTime = this.isShowTime;
this.datePickerPopupRef.instance.confirmButtonText = this.confirmButtonText;
this.subscribeNotifyEvents();
this.overlayRef.backdropClick().subscribe((/**
* @return {?}
*/
function () {
_this.closePopup();
}));
};
/**
* @param {?} data
* @return {?}
*/
NpDatePicker.prototype.onBlur = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (this.datePickerService.isValid(data.value)) {
this.date = moment(data.value, this.format).clone();
}
else {
// 如果输入日期不合法,默认当前时间
this.date = moment().clone();
}
this.syncValue();
this.emitChange(this.date);
this.onDateChanged.emit(this.date);
};
/**
* @return {?}
*/
NpDatePicker.prototype.onClear = /**
* @return {?}
*/
function () {
if (this.isDisabled) {
return;
}
this.date = null;
this.syncValue();
this.emitChange(this.date);
this.onDateChanged.emit(this.date);
};
/**
* @return {?}
*/
NpDatePicker.prototype.onMouseenter = /**
* @return {?}
*/
function () {
this.isHover = true;
};
/**
* @return {?}
*/
NpDatePicker.prototype.onMouseleave = /**
* @return {?}
*/
function () {
this.isHover = false;
};
//#region Private methods
/**每次this.date改变时,这个方法都必须要调用 */
//#region Private methods
/**
* 每次this.date改变时,这个方法都必须要调用
* @private
* @return {?}
*/
NpDatePicker.prototype.syncValue =
//#region Private methods
/**
* 每次this.date改变时,这个方法都必须要调用
* @private
* @return {?}
*/
function () {
if (this.date && this.datePickerService.isValid(this.date)) {
this.value = moment(this.date, this.format).format(this.format);
}
else {
this.value = '';
}
};
/**
* @private
* @return {?}
*/
NpDatePicker.prototype.closePopup = /**
* @private
* @return {?}
*/
function () {
if (this.overlayRef.hasAttached()) {
this.overlayRef.detach();
}
};
/**
* @private
* @return {?}
*/
NpDatePicker.prototype.subscribeNotifyEvents = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.datePickerPopupRef.instance.onDayClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
_this.emitDataAndClosePopup(res.date);
}));
this.datePickerPopupRef.instance.onItemLabelClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
if (res.value instanceof Function) {
_this.emitDataAndClosePopup(res.value());
}
else {
_this.emitDataAndClosePopup(moment(res.value));
}
_this.closePopup();
}));
if (this.isShowTime) {
this.datePickerPopupRef.instance.onTimeClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
/** @type {?} */
var date = moment(moment(_this.date).format(DATE_FORMAT) + ' ' + res);
_this.emitDataAndClosePopup(date);
}));
this.datePickerPopupRef.instance.onConfirmClicked.subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
/** @type {?} */
var date = moment(moment(_this.date).format(DATE_FORMAT) + ' ' + res);
_this.emitDataAndClosePopup(date);
_this.closePopup();
}));
}
};
/**
* @private
* @param {?} date
* @return {?}
*/
NpDatePicker.prototype.emitDataAndClosePopup = /**
* @private
* @param {?} date
* @return {?}
*/
function (date) {
this.date = date;
this.syncValue();
this.emitChange(moment(this.date));
this.onDateChanged.emit(moment(this.date));
this.datePickerInput.focus();
if (!this.isShowTime) {
this.closePopup();
}
};
//#endregion
//#region Implement for ControlValueAccessor
//#endregion
//#region Implement for ControlValueAccessor
/**
* @param {?} obj
* @return {?}
*/
NpDatePicker.prototype.writeValue =
//#endregion
//#region Implement for ControlValueAccessor
/**
* @param {?} obj
* @return {?}
*/
function (obj) {
this.date = obj;
this.syncValue();
};
/**
* @param {?} fn
* @return {?}
*/
NpDatePicker.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.emitChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
NpDatePicker.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) { };
NpDatePicker.decorators = [
{ type: Component, args: [{
selector: "np-date-picker",
template: "<div class=\"np-date-picker-wrapper flex-wrap col-flex\" (mouseenter)=\"onMouseenter()\" (mouseleave)=\"onMouseleave()\">\r\n <i *ngIf=\"!isHover\" class=\"far fa-calendar\"></i>\r\n <i *ngIf=\"isHover\" class=\"fas fa-times-circle\" (click)=\"onClear()\"></i>\r\n <np-input #datePickerInput [label]=\"label\" [isRequired]=\"isRequired\" [isDisabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\" [errorMessage]=\"errorMessage\" [(ngModel)]=\"value\" (click)=\"onToggleDatePickerPopup()\"\r\n (onBlur)=\"onBlur($event)\">\r\n </np-input>\r\n</div>\r\n",
encapsulation: ViewEncapsulation.None,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return NpDatePicker; })),
multi: true,
}
],
styles: [".np-date-picker-wrapper{position:relative}.np-date-picker-wrapper>.far.fa-calendar,.np-date-picker-wrapper>.fas.fa-times-circle{position:absolute;right:10px;line-height:34px;font-size:15px;cursor:pointer;z-index:1}.np-date-picker-wrapper .np-input-wrapper .np-input{width:220px}"]
}] }
];
/** @nocollapse */
NpDatePicker.ctorParameters = function () { return [
{ type: NpDatePickerService },
{ type: ChangeDetectorRef }
]; };
NpDatePicker.propDecorators = {
label: [{ type: Input }],
isRequired: [{ type: Input }],
placeholder: [{ type: Input }],
errorMessage: [{ type: Input }],
isDisabled: [{ type: Input }],
date: [{ type: Input }],
format: [{ type: Input }],
isShowTime: [{ type: Input }],
footerItems: [{ type: Input }],
confirmButtonText: [{ type: Input }],
onDateChanged: [{ type: Output }],
datePickerInput: [{ type: ViewChild, args: ['datePickerInput',] }]
};
return NpDatePicker;
}());
export { NpDatePicker };
if (false) {
/**
* 标签
* @type {?}
*/
NpDatePicker.prototype.label;
/**
* 是否必填,true仅在标签前面添加红色*号, false不加
* @type {?}
*/
NpDatePicker.prototype.isRequired;
/**
* Placeholder
* @type {?}
*/
NpDatePicker.prototype.placeholder;
/**
* 校验错误时显示错误信息
* @type {?}
*/
NpDatePicker.prototype.errorMessage;
/**
* 是否禁用
* @type {?}
*/
NpDatePicker.prototype.isDisabled;
/**
* 已选时间
* @type {?}
*/
NpDatePicker.prototype.date;
/**
* 日期时间展示格式,默认只展示日期
* @type {?}
*/
NpDatePicker.prototype.format;
/**
* 是否展示时间,默认不展示
* @type {?}
*/
NpDatePicker.prototype.isShowTime;
/**
* 显示在footer左侧的自定义时间标签数组,如“昨天”等
* @type {?}
*/
NpDatePicker.prototype.footerItems;
/**
* 当为datetime-picker时,底部面板最右侧展示的确认按钮名称
* @type {?}
*/
NpDatePicker.prototype.confirmButtonText;
/** @type {?} */
NpDatePicker.prototype.onDateChanged;
/** @type {?} */
NpDatePicker.prototype.datePickerInput;
/** @type {?} */
NpDatePicker.prototype.datePickerPopupRef;
/**
* @type {?}
* @private
*/
NpDatePicker.prototype.overlayRef;
/** @type {?} */
NpDatePicker.prototype.isHover;
/**
* @type {?}
* @private
*/
NpDatePicker.prototype.emitChange;
/**
* 日期输入框文本值,每当this.date改变时此值会同步改变
* @type {?}
*/
NpDatePicker.prototype.value;
/**
* @type {?}
* @private
*/
NpDatePicker.prototype.datePickerService;
/**
* @type {?}
* @private
*/
NpDatePicker.prototype.cdf;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQTRCLE1BQU0sRUFBRSxZQUFZLEVBQWdCLGlCQUFpQixFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUM3TSxPQUFPLEVBQUUsbUJBQW1CLEVBQW1CLE1BQU0sdUJBQXVCLENBQUM7QUFDN0UsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7O0lBQU8sTUFBTSxHQUFHLE9BQU87QUFFekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQU16RTtJQW1ERSxzQkFBb0IsaUJBQXNDLEVBQVUsR0FBc0I7UUFBdEUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFxQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1COzs7O1FBOUJqRixnQkFBVyxHQUFXLEVBQUUsQ0FBQzs7OztRQU96QixTQUFJLEdBQTRCLElBQUksQ0FBQzs7OztRQUVyQyxXQUFNLEdBQVcsV0FBVyxDQUFDOzs7O1FBRTdCLGVBQVUsR0FBWSxLQUFLLENBQUM7Ozs7UUFFNUIsZ0JBQVcsR0FBMkIsRUFBRSxDQUFDOzs7O1FBRXpDLHNCQUFpQixHQUFXLElBQUksQ0FBQztRQUVoQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFP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SztnQ0FFTCxNQUFNO2tDQUVOLFNBQVMsU0FBQyxpQkFBaUI7O0lBb0o5QixtQkFBQztDQUFBLEFBNUxELElBNExDO1NBOUtZLFlBQVk7Ozs7OztJQUd2Qiw2QkFBdUI7Ozs7O0lBRXZCLGtDQUE2Qjs7Ozs7SUFFN0IsbUNBQWtDOzs7OztJQUVsQyxvQ0FBOEI7Ozs7O0lBRTlCLGtDQUE2Qjs7Ozs7SUFHN0IsNEJBQThDOzs7OztJQUU5Qyw4QkFBc0M7Ozs7O0lBRXRDLGtDQUFxQzs7Ozs7SUFFckMsbUNBQWtEOzs7OztJQUVsRCx5Q0FBMEM7O0lBRTFDLHFDQUFrRDs7SUFFbEQsdUNBQXVEOztJQUN2RCwwQ0FBb0Q7Ozs7O0lBRXBELGtDQUErQjs7SUFDL0IsK0JBQXlCOzs7OztJQUV6QixrQ0FBcUM7Ozs7O0lBR3JDLDZCQUFjOzs7OztJQUVGLHlDQUE4Qzs7Ozs7SUFBRSwyQkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uLCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENvbXBvbmVudFJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTnBEYXRlUGlja2VyU2VydmljZSwgRGF5RGF0YVBlck1vbnRoIH0gZnJvbSBcIi4vZGF0ZS1waWNrZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7IGNvbnN0IG1vbWVudCA9IG1vbWVudF9cclxuaW1wb3J0IHsgT3ZlcmxheVJlZiB9IGZyb20gXCJAYW5ndWxhci9jZGsvb3ZlcmxheVwiO1xyXG5pbXBvcnQgeyBOcERhdGVQaWNrZXJQb3B1cCB9IGZyb20gXCIuL2NvbXBvbmVudHMvZGF0ZS1waWNrZXItcG9wdXBcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcclxuaW1wb3J0IHsgREFURV9GT1JNQVQsIERBVEVfVElNRV9GT1JNQVQgfSBmcm9tIFwiLi9kYXRlLXBpY2tlci1jb25zdFwiO1xyXG5pbXBvcnQgeyBOcElucHV0IH0gZnJvbSBcIi4uL2lucHV0XCI7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyRm9vdGVySXRlbSB9IGZyb20gXCIuL2NvbXBvbmVudHMvZGF0ZS1waWNrZXItZm9vdGVyXCI7XHJcblxyXG4vKipcclxuICogRGF0ZSBwaWNrZXLnu4Tku7ZcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtZGF0ZS1waWNrZXJgLFxyXG4gIHRlbXBsYXRlVXJsOiAnZGF0ZS1waWNrZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2RhdGUtcGlja2VyLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBEYXRlUGlja2VyKSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE5wRGF0ZVBpY2tlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG4gIC8qKuagh+etviAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgLyoq5piv5ZCm5b+F5aGr77yMdHJ1ZeS7heWcqOagh+etvuWJjemdoua3u+WKoOe6ouiJsirlj7fvvIwgZmFsc2XkuI3liqAqL1xyXG4gIEBJbnB1dCgpIGlzUmVxdWlyZWQ6IGJvb2xlYW47XHJcbiAgLyoqUGxhY2Vob2xkZXIgKi9cclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcbiAgLyoq5qCh6aqM6ZSZ6K+v5pe25pi+56S66ZSZ6K+v5L+h5oGvICovXHJcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgLyoq5piv5ZCm56aB55SoICovXHJcbiAgQElucHV0KCkgaXNEaXNhYmxlZDogYm9vbGVhbjtcclxuXHJcbiAgLyoq5bey6YCJ5pe26Ze0ICovXHJcbiAgQElucHV0KCkgZGF0ZTogbW9tZW50Xy5Nb21lbnQgfCBzdHJpbmcgPSBudWxsO1xyXG4gIC8qKuaXpeacn+aXtumXtOWxleekuuagvOW8j++8jOm7mOiupOWPquWxleekuuaXpeacnyAqL1xyXG4gIEBJbnB1dCgpIGZvcm1hdDogc3RyaW5nID0gREFURV9GT1JNQVQ7XHJcbiAgLyoq5piv5ZCm5bGV56S65pe26Ze077yM6buY6K6k5LiN5bGV56S6ICovXHJcbiAgQElucHV0KCkgaXNTaG93VGltZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKuaYvuekuuWcqGZvb3RlcuW3puS+p+eahOiHquWumuS5ieaXtumXtOagh+etvuaVsOe7hO+8jOWmguKAnOaYqOWkqeKAneetiSAqL1xyXG4gIEBJbnB1dCgpIGZvb3Rlckl0ZW1zOiBEYXRlUGlja2VyRm9vdGVySXRlbVtdID0gW107XHJcbiAgLyoq5b2T5Li6ZGF0ZXRpbWUtcGlja2Vy5pe277yM5bqV6YOo6Z2i5p2/5pyA5Y+z5L6n5bGV56S655qE56Gu6K6k5oyJ6ZKu5ZCN56ewICovXHJcbiAgQElucHV0KCkgY29uZmlybUJ1dHRvblRleHQ6IHN0cmluZyA9ICfnoa7orqQnO1xyXG5cclxuICBAT3V0cHV0KCkgb25EYXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXRlUGlja2VySW5wdXQnKSBkYXRlUGlja2VySW5wdXQ6IE5wSW5wdXQ7XHJcbiAgZGF0ZVBpY2tlclBvcHVwUmVmOiBDb21wb25lbnRSZWY8TnBEYXRlUGlja2VyUG9wdXA+O1xyXG5cclxuICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWY7XHJcbiAgaXNIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGVtaXRDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gIC8qKuaXpeacn+i+k+WFpeahhuaWh+acrOWAvO+8jOavj+W9k3RoaXMuZGF0ZeaUueWPmOaXtuatpOWAvOS8muWQjOatpeaUueWPmCovXHJcbiAgdmFsdWU6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRlUGlja2VyU2VydmljZTogTnBEYXRlUGlja2VyU2VydmljZSwgcHJpdmF0ZSBjZGY6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldE92ZXJsYXlSZWYodGhpcy5kYXRlUGlja2VySW5wdXQubnBJbnB1dCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTaG93VGltZSkge1xyXG4gICAgICB0aGlzLmZvcm1hdCA9IERBVEVfVElNRV9GT1JNQVQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7IH1cclxuXHJcbiAgb25Ub2dnbGVEYXRlUGlja2VyUG9wdXAoKSB7XHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZiA9IHRoaXMub3ZlcmxheVJlZi5hdHRhY2gobmV3IENvbXBvbmVudFBvcnRhbChOcERhdGVQaWNrZXJQb3B1cCkpO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZGF0ZSA9IG1vbWVudCh0aGlzLmRhdGUpO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZGF0ZVBpY2tlclR5cGUgPSB0aGlzLmlzU2hvd1RpbWUgPyAnZGF0ZXRpbWUtcGlja2VyJyA6ICdkYXRlLXBpY2tlcic7XHJcbiAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5mb290ZXJJdGVtcyA9IHRoaXMuZm9vdGVySXRlbXM7XHJcbiAgICB0aGlzLmRhdGVQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5pc1Nob3dUaW1lID0gdGhpcy5pc1Nob3dUaW1lO1xyXG4gICAgdGhpcy5kYXRlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuY29uZmlybUJ1dHRvblRleHQgPSB0aGlzLmNvbmZpcm1CdXR0b25UZXh0O1xyXG4gICAgdGhpcy5zdWJzY3JpYmVOb3RpZnlFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkJsdXIoZGF0YTogeyB2YWx1ZTogYW55LCBldmVudDogYW55IH0pIHtcclxuICAgIGlmICh0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmlzVmFsaWQoZGF0YS52YWx1ZSkpIHtcclxuICAgICAgdGhpcy5kYXRlID0gbW9tZW50KGRhdGEudmFsdWUsIHRoaXMuZm9ybWF0KS5jbG9uZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5aaC5p6c6L6T5YWl5pel5pyf5LiN5ZCI5rOV77yM6buY6K6k5b2T5YmN5pe26Ze0XHJcbiAgICAgIHRoaXMuZGF0ZSA9IG1vbWVudCgpLmNsb25lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zeW5jVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh0aGlzLmRhdGUpO1xyXG4gICAgdGhpcy5vbkRhdGVDaGFuZ2VkLmVtaXQodGhpcy5kYXRlKTtcclxuICB9XHJcblxyXG4gIG9uQ2xlYXIoKSB7XHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGUgPSBudWxsO1xyXG4gICAgdGhpcy5zeW5jVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh0aGlzLmRhdGUpO1xyXG4gICAgdGhpcy5vbkRhdGVDaGFuZ2VkLmVtaXQodGhpcy5kYXRlKTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VlbnRlcigpIHtcclxuICAgIHRoaXMuaXNIb3ZlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlbGVhdmUoKSB7XHJcbiAgICB0aGlzLmlzSG92ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBQcml2YXRlIG1ldGhvZHNcclxuXHJcbiAgLyoq5q+P5qyhdGhpcy5kYXRl5pS55Y+Y5pe277yM6L+Z5Liq5pa55rOV6YO95b+F6aG76KaB6LCD55SoICovXHJcbiAgcHJpdmF0ZSBzeW5jVmFsdWUoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRlICYmIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNWYWxpZCh0aGlzLmRhdGUpKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSBtb21lbnQodGhpcy5kYXRlLCB0aGlzLmZvcm1hdCkuZm9ybWF0KHRoaXMuZm9ybWF0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU5vdGlmeUV2ZW50cygpIHtcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLm9uRGF5Q2xpY2tlZC5zdWJzY3JpYmUoKHJlczogRGF5RGF0YVBlck1vbnRoKSA9PiB7XHJcbiAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKHJlcy5kYXRlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLm9uSXRlbUxhYmVsQ2xpY2tlZC5zdWJzY3JpYmUoKHJlczogRGF0ZVBpY2tlckZvb3Rlckl0ZW0pID0+IHtcclxuICAgICAgaWYgKHJlcy52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0RGF0YUFuZENsb3NlUG9wdXAocmVzLnZhbHVlKCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKG1vbWVudChyZXMudmFsdWUpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1Nob3dUaW1lKSB7XHJcbiAgICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLm9uVGltZUNsaWNrZWQuc3Vic2NyaWJlKChyZXM6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGxldCBkYXRlID0gbW9tZW50KG1vbWVudCh0aGlzLmRhdGUpLmZvcm1hdChEQVRFX0ZPUk1BVCkgKyAnICcgKyByZXMpO1xyXG4gICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKGRhdGUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZGF0ZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLm9uQ29uZmlybUNsaWNrZWQuc3Vic2NyaWJlKChyZXM6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGxldCBkYXRlID0gbW9tZW50KG1vbWVudCh0aGlzLmRhdGUpLmZvcm1hdChEQVRFX0ZPUk1BVCkgKyAnICcgKyByZXMpO1xyXG4gICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKGRhdGUpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdERhdGFBbmRDbG9zZVBvcHVwKGRhdGU6IG1vbWVudF8uTW9tZW50KSB7XHJcbiAgICB0aGlzLmRhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5zeW5jVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShtb21lbnQodGhpcy5kYXRlKSk7XHJcbiAgICB0aGlzLm9uRGF0ZUNoYW5nZWQuZW1pdChtb21lbnQodGhpcy5kYXRlKSk7XHJcbiAgICB0aGlzLmRhdGVQaWNrZXJJbnB1dC5mb2N1cygpO1xyXG4gICAgaWYgKCF0aGlzLmlzU2hvd1RpbWUpIHtcclxuICAgICAgdGhpcy5jbG9zZVBvcHVwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW1wbGVtZW50IGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0ZSA9IG9iajtcclxuICAgIHRoaXMuc3luY1ZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZW1pdENoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn0iXX0=