UNPKG

ngx-pluto

Version:
527 lines 43.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, Input, ViewChild, forwardRef, Output, EventEmitter, ElementRef } from "@angular/core"; import * as moment_ from 'moment'; /** @type {?} */ var moment = moment_; import { ComponentPortal } from "@angular/cdk/portal"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { NpDateRangePickerPopup } from "../components/date-range-picker-popup"; import { DATE_FORMAT, DATE_TIME_FORMAT } from "../date-picker-const"; import { NpInput } from "../../input"; import { NpDatePickerService } from "../date-picker.service"; /** * Date range picker组件 */ var NpDateRangePicker = /** @class */ (function () { function NpDateRangePicker(datePickerService) { this.datePickerService = datePickerService; /** * 展示开始时间占位符 */ this.startPlaceholder = ''; /** * 展示结束时间占位符 */ this.endPlaceholder = ''; /** * 已选时间 */ this.dates = []; /** * 日期时间展示格式,默认只展示日期 */ this.format = DATE_FORMAT; /** * 是否展示时间,默认不展示 */ this.isShowTime = false; /** * 显示在footer左侧的自定义时间标签数组,如“昨天”等 */ this.footerItems = []; this.onDateRangeChanged = new EventEmitter(); this.isHover = false; this.emitChange = (/** * @param {?} _ * @return {?} */ function (_) { }); } /** * @return {?} */ NpDateRangePicker.prototype.ngOnInit = /** * @return {?} */ function () { if (this.dates && this.dates.length === 2) { /** @type {?} */ var dates = this.datePickerService.buildStartAndEndDates(moment(this.dates[0]).clone(), moment(this.dates[1]).clone()); this.startDate = dates[0]; this.endDate = dates[1]; this.syncSValue(); this.syncEValue(); } this.overlayRef = this.datePickerService.getOverlayRef(this.dateRangeStartPicker.npInput); if (this.isShowTime) { this.format = DATE_TIME_FORMAT; } }; /** * @param {?} changes * @return {?} */ NpDateRangePicker.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { }; /** * @return {?} */ NpDateRangePicker.prototype.onStartPickerClicked = /** * @return {?} */ function () { this.onToggleDatePickerPopup(); }; /** * @return {?} */ NpDateRangePicker.prototype.onEndPickerClicked = /** * @return {?} */ function () { this.onToggleDatePickerPopup(); }; /** * @return {?} */ NpDateRangePicker.prototype.onToggleDatePickerPopup = /** * @return {?} */ function () { var _this = this; if (this.isDisabled) { return; } if (this.overlayRef.hasAttached()) { this.closePopup(); return; } this.daterangePickerPopupRef = this.overlayRef.attach(new ComponentPortal(NpDateRangePickerPopup)); this.daterangePickerPopupRef.instance.datePickerType = 'date-range-picker'; this.daterangePickerPopupRef.instance.footerItems = this.footerItems; this.daterangePickerPopupRef.instance.startDate = moment(this.startDate); this.daterangePickerPopupRef.instance.endDate = moment(this.endDate); this.subscribeNotifyEvents(); this.overlayRef.backdropClick().subscribe((/** * @return {?} */ function () { _this.closePopup(); })); if (this.dateRangeWrapper && this.dateRangeWrapper.nativeElement) { this.dateRangeWrapper.nativeElement.focus(); } }; /** * @param {?} data * @return {?} */ NpDateRangePicker.prototype.onStartDateBlur = /** * @param {?} data * @return {?} */ function (data) { if (this.datePickerService.isValid(data.value)) { this.startDate = moment(data.value, this.format).clone(); } else { // 如果输入日期不合法,默认当前时间 this.startDate = moment().clone(); } /** @type {?} */ var dates = this.datePickerService.buildStartAndEndDates(moment(this.startDate).clone(), moment(this.endDate).clone()); this.startDate = dates[0]; this.endDate = dates[1]; this.syncSValue(); this.syncEValue(); this.emitChange([this.startDate, this.endDate]); this.onDateRangeChanged.emit([this.startDate, this.endDate]); }; /** * @param {?} data * @return {?} */ NpDateRangePicker.prototype.onEndDateBlur = /** * @param {?} data * @return {?} */ function (data) { if (this.datePickerService.isValid(data.value)) { this.endDate = moment(data.value, this.format).clone(); } else { // 如果输入日期不合法,默认当前时间 this.endDate = moment().clone(); } /** @type {?} */ var dates = this.datePickerService.buildStartAndEndDates(moment(this.startDate).clone(), moment(this.endDate).clone()); this.startDate = dates[0]; this.endDate = dates[1]; this.syncSValue(); this.syncEValue(); this.emitChange([this.startDate, this.endDate]); this.onDateRangeChanged.emit([this.startDate, this.endDate]); }; /** * @return {?} */ NpDateRangePicker.prototype.onClear = /** * @return {?} */ function () { if (this.isDisabled) { return; } this.startDate = null; this.endDate = null; this.syncSValue(); this.syncEValue(); this.emitChange([]); this.onDateRangeChanged.emit([]); }; /** * @return {?} */ NpDateRangePicker.prototype.onMouseenter = /** * @return {?} */ function () { this.isHover = true; }; /** * @return {?} */ NpDateRangePicker.prototype.onMouseleave = /** * @return {?} */ function () { this.isHover = false; }; //#region Private methods /**每次this.startDate改变时,这个方法都必须要调用 */ //#region Private methods /** * 每次this.startDate改变时,这个方法都必须要调用 * @private * @return {?} */ NpDateRangePicker.prototype.syncSValue = //#region Private methods /** * 每次this.startDate改变时,这个方法都必须要调用 * @private * @return {?} */ function () { if (this.startDate && this.datePickerService.isValid(this.startDate)) { this.sValue = moment(this.startDate, this.format).format(this.format); } else { this.sValue = ''; } }; /**每次this.endDate改变时,这个方法都必须要调用 */ /** * 每次this.endDate改变时,这个方法都必须要调用 * @private * @return {?} */ NpDateRangePicker.prototype.syncEValue = /** * 每次this.endDate改变时,这个方法都必须要调用 * @private * @return {?} */ function () { if (this.endDate && this.datePickerService.isValid(this.endDate)) { this.eValue = moment(this.endDate, this.format).format(this.format); } else { this.eValue = ''; } }; /** * @private * @return {?} */ NpDateRangePicker.prototype.closePopup = /** * @private * @return {?} */ function () { if (this.overlayRef.hasAttached()) { this.overlayRef.detach(); } }; /** * @private * @return {?} */ NpDateRangePicker.prototype.subscribeNotifyEvents = /** * @private * @return {?} */ function () { var _this = this; this.daterangePickerPopupRef.instance.onStartDayClicked.subscribe((/** * @param {?} res * @return {?} */ function (res) { if (_this.datePickerService.isValid(_this.endDate)) { _this.emitDataAndClosePopup([res.day.date, moment(_this.endDate).clone()]); } else { _this.startDate = res.day.date; _this.syncSValue(); } })); this.daterangePickerPopupRef.instance.onEndDayClicked.subscribe((/** * @param {?} res * @return {?} */ function (res) { if (_this.datePickerService.isValid(_this.startDate)) { _this.emitDataAndClosePopup([res.day.date, moment(_this.startDate).clone()]); } else { _this.endDate = res.day.date; _this.syncEValue(); } })); this.daterangePickerPopupRef.instance.onItemLabelClicked.subscribe((/** * @param {?} res * @return {?} */ function (res) { if (res && res.values && res.values.length === 2) { if (((res.values[0]) instanceof Function) && ((res.values[1]) instanceof Function)) { _this.emitDataAndClosePopup([((/** @type {?} */ (res.values[0])))(), ((/** @type {?} */ (res.values[1])))()]); } else { _this.emitDataAndClosePopup([moment((/** @type {?} */ (res.values[0]))), moment((/** @type {?} */ (res.values[1])))]); } } })); }; /** * @private * @param {?} dates * @return {?} */ NpDateRangePicker.prototype.emitDataAndClosePopup = /** * @private * @param {?} dates * @return {?} */ function (dates) { /** @type {?} */ var sortedDates = this.datePickerService.sortDates(dates); this.startDate = sortedDates[0].clone(); this.endDate = sortedDates[sortedDates.length - 1].clone(); this.syncSValue(); this.syncEValue(); this.emitChange([this.startDate, this.endDate]); this.onDateRangeChanged.emit([this.startDate, this.endDate]); this.closePopup(); }; //#endregion //#region Implement for ControlValueAccessor //#endregion //#region Implement for ControlValueAccessor /** * @param {?} obj * @return {?} */ NpDateRangePicker.prototype.writeValue = //#endregion //#region Implement for ControlValueAccessor /** * @param {?} obj * @return {?} */ function (obj) { if (obj && obj.length === 2 && this.datePickerService.isValid(obj[0]) && this.datePickerService.isValid(obj[1])) { /** @type {?} */ var sortedDates = this.datePickerService.sortDates(obj); this.startDate = sortedDates[0].clone(); this.endDate = sortedDates[sortedDates.length - 1].clone(); } else { this.startDate = null; this.endDate = null; } this.syncSValue(); this.syncEValue(); }; /** * @param {?} fn * @return {?} */ NpDateRangePicker.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.emitChange = fn; }; /** * @param {?} fn * @return {?} */ NpDateRangePicker.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { }; NpDateRangePicker.decorators = [ { type: Component, args: [{ selector: "np-date-range-picker", template: "<div class=\"np-date-range-picker-wrapper flex-wrap row-flex\" (mouseenter)=\"onMouseenter()\"\r\n (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 <div class=\"flex-wrap col-flex\" *ngIf=\"label\">\r\n <label class=\"np-date-lbl\">\r\n <span class=\"form-required\" *ngIf=\"isRequired\">*</span>\r\n {{ label }}\r\n </label>\r\n </div>\r\n <div>\r\n <div #dateRangeWrapper class=\"date-range-wrapper flex-wrap row-flex\">\r\n <np-input #dateRangeStartPicker class=\"date-range-start-picker\" [(ngModel)]=\"sValue\" [isRequired]=\"isRequired\"\r\n [isDisabled]=\"isDisabled\" [placeholder]=\"startPlaceholder\" (click)=\"onStartPickerClicked()\" (onBlur)=\"onStartDateBlur($event)\">\r\n </np-input>\r\n <span class=\"range-picker-divider\" [ngClass]=\"{'disabled': isDisabled}\">&nbsp;~&nbsp;</span>\r\n <np-input #dateRangeEndPicker class=\"date-range-end-picker\" [(ngModel)]=\"eValue\" [isDisabled]=\"isDisabled\"\r\n [placeholder]=\"endPlaceholder\" (click)=\"onEndPickerClicked()\" (onBlur)=\"onEndDateBlur($event)\">\r\n </np-input>\r\n </div>\r\n <span class=\"error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n </div>\r\n</div>\r\n", encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return NpDateRangePicker; })), multi: true, } ], styles: [".np-date-range-picker-wrapper{position:relative;align-items:baseline}.np-date-range-picker-wrapper>.far.fa-calendar,.np-date-range-picker-wrapper>.fas.fa-times-circle{position:absolute;right:10px;line-height:34px;font-size:15px;cursor:pointer;z-index:1}.np-date-range-picker-wrapper .np-date-lbl{width:80px;margin-right:20px;text-align:right;font-size:13px;font-weight:700;height:34px;line-height:34px}.np-date-range-picker-wrapper .date-range-wrapper .np-input-wrapper .np-input{height:32px}.np-date-range-picker-wrapper .date-range-wrapper .date-range-start-picker .np-input{width:160px}.np-date-range-picker-wrapper .date-range-wrapper .date-range-end-picker .np-input{width:190px}.np-date-range-picker-wrapper .error-message{display:block;font-size:10px;margin:5px}"] }] } ]; /** @nocollapse */ NpDateRangePicker.ctorParameters = function () { return [ { type: NpDatePickerService } ]; }; NpDateRangePicker.propDecorators = { label: [{ type: Input }], isRequired: [{ type: Input }], startPlaceholder: [{ type: Input }], endPlaceholder: [{ type: Input }], errorMessage: [{ type: Input }], isDisabled: [{ type: Input }], dates: [{ type: Input }], format: [{ type: Input }], isShowTime: [{ type: Input }], footerItems: [{ type: Input }], onDateRangeChanged: [{ type: Output }], dateRangeWrapper: [{ type: ViewChild, args: ['dateRangeWrapper',] }], dateRangeStartPicker: [{ type: ViewChild, args: ['dateRangeStartPicker',] }], dateRangeEndPicker: [{ type: ViewChild, args: ['dateRangeEndPicker',] }] }; return NpDateRangePicker; }()); export { NpDateRangePicker }; if (false) { /** * 标签 * @type {?} */ NpDateRangePicker.prototype.label; /** * 是否必填,true仅在标签前面添加红色*号, false不加 * @type {?} */ NpDateRangePicker.prototype.isRequired; /** * 展示开始时间占位符 * @type {?} */ NpDateRangePicker.prototype.startPlaceholder; /** * 展示结束时间占位符 * @type {?} */ NpDateRangePicker.prototype.endPlaceholder; /** * 校验错误时显示错误信息 * @type {?} */ NpDateRangePicker.prototype.errorMessage; /** * 是否禁用 * @type {?} */ NpDateRangePicker.prototype.isDisabled; /** * 已选时间 * @type {?} */ NpDateRangePicker.prototype.dates; /** * 日期时间展示格式,默认只展示日期 * @type {?} */ NpDateRangePicker.prototype.format; /** * 是否展示时间,默认不展示 * @type {?} */ NpDateRangePicker.prototype.isShowTime; /** * 显示在footer左侧的自定义时间标签数组,如“昨天”等 * @type {?} */ NpDateRangePicker.prototype.footerItems; /** @type {?} */ NpDateRangePicker.prototype.onDateRangeChanged; /** @type {?} */ NpDateRangePicker.prototype.dateRangeWrapper; /** @type {?} */ NpDateRangePicker.prototype.dateRangeStartPicker; /** @type {?} */ NpDateRangePicker.prototype.dateRangeEndPicker; /** @type {?} */ NpDateRangePicker.prototype.daterangePickerPopupRef; /** @type {?} */ NpDateRangePicker.prototype.startDate; /** @type {?} */ NpDateRangePicker.prototype.endDate; /** * @type {?} * @private */ NpDateRangePicker.prototype.overlayRef; /** @type {?} */ NpDateRangePicker.prototype.isHover; /** * @type {?} * @private */ NpDateRangePicker.prototype.emitChange; /** * 日期输入框文本值,每当this.startDate改变时此值会同步改变 * @type {?} */ NpDateRangePicker.prototype.sValue; /** * 日期输入框文本值,每当this.endDate改变时此值会同步改变 * @type {?} */ NpDateRangePicker.prototype.eValue; /** * @type {?} * @private */ NpDateRangePicker.prototype.datePickerService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIvZGF0ZS1yYW5nZS1waWNrZXIvZGF0ZS1yYW5nZS1waWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQTRCLE1BQU0sRUFBRSxZQUFZLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SyxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7SUFBTyxNQUFNLEdBQUcsT0FBTztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBbUIsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQUs5RTtJQStERSwyQkFBb0IsaUJBQXNDO1FBQXRDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBcUI7Ozs7UUExQ2pELHFCQUFnQixHQUFXLEVBQUUsQ0FBQzs7OztRQUU5QixtQkFBYyxHQUFXLEVBQUUsQ0FBQzs7OztRQU81QixVQUFLLEdBQW1DLEVBQUUsQ0FBQzs7OztRQUUzQyxXQUFNLEdBQVcsV0FBVyxDQUFDOzs7O1FBRTdCLGVBQVUsR0FBWSxLQUFLLENBQUM7Ozs7UUFFNUIsZ0JBQVcsR0FBMkIsRUFBRSxDQUFDO1FBRXhDLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFh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ZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnOyBjb25zdCBtb21lbnQgPSBtb21lbnRfXHJcbmltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9wb3J0YWxcIjtcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE5wRGF0ZVJhbmdlUGlja2VyUG9wdXAgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9kYXRlLXJhbmdlLXBpY2tlci1wb3B1cFwiO1xyXG5pbXBvcnQgeyBEQVRFX0ZPUk1BVCwgREFURV9USU1FX0ZPUk1BVCB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci1jb25zdFwiO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyRm9vdGVySXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2RhdGUtcGlja2VyLWZvb3RlclwiO1xyXG5pbXBvcnQgeyBOcElucHV0IH0gZnJvbSBcIi4uLy4uL2lucHV0XCI7XHJcbmltcG9ydCB7IE5wRGF0ZVBpY2tlclNlcnZpY2UsIERheURhdGFQZXJNb250aCB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci5zZXJ2aWNlXCI7XHJcblxyXG4vKipcclxuICogRGF0ZSByYW5nZSBwaWNrZXLnu4Tku7ZcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtZGF0ZS1yYW5nZS1waWNrZXJgLFxyXG4gIHRlbXBsYXRlVXJsOiAnZGF0ZS1yYW5nZS1waWNrZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2RhdGUtcmFuZ2UtcGlja2VyLnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBEYXRlUmFuZ2VQaWNrZXIpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH1cclxuICBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTnBEYXRlUmFuZ2VQaWNrZXIgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKirmoIfnrb4gKi9cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKuaYr+WQpuW/heWhq++8jHRydWXku4XlnKjmoIfnrb7liY3pnaLmt7vliqDnuqLoibIq5Y+377yMIGZhbHNl5LiN5YqgKi9cclxuICBASW5wdXQoKSBpc1JlcXVpcmVkOiBib29sZWFuO1xyXG4gIC8qKuWxleekuuW8gOWni+aXtumXtOWNoOS9jeespiAqL1xyXG4gIEBJbnB1dCgpIHN0YXJ0UGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gIC8qKuWxleekuue7k+adn+aXtumXtOWNoOS9jeespiAqL1xyXG4gIEBJbnB1dCgpIGVuZFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICAvKirmoKHpqozplJnor6/ml7bmmL7npLrplJnor6/kv6Hmga8gKi9cclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICAvKirmmK/lkKbnpoHnlKggKi9cclxuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICAvKirlt7LpgInml7bpl7QgKi9cclxuICBASW5wdXQoKSBkYXRlczogQXJyYXk8bW9tZW50Xy5Nb21lbnQgfCBzdHJpbmc+ID0gW107XHJcbiAgLyoq5pel5pyf5pe26Ze05bGV56S65qC85byP77yM6buY6K6k5Y+q5bGV56S65pel5pyfICovXHJcbiAgQElucHV0KCkgZm9ybWF0OiBzdHJpbmcgPSBEQVRFX0ZPUk1BVDtcclxuICAvKirmmK/lkKblsZXnpLrml7bpl7TvvIzpu5jorqTkuI3lsZXnpLogKi9cclxuICBASW5wdXQoKSBpc1Nob3dUaW1lOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoq5pi+56S65ZyoZm9vdGVy5bem5L6n55qE6Ieq5a6a5LmJ5pe26Ze05qCH562+5pWw57uE77yM5aaC4oCc5pio5aSp4oCd562JICovXHJcbiAgQElucHV0KCkgZm9vdGVySXRlbXM6IERhdGVQaWNrZXJGb290ZXJJdGVtW10gPSBbXTtcclxuXHJcbiAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VXcmFwcGVyJykgZGF0ZVJhbmdlV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnZGF0ZVJhbmdlU3RhcnRQaWNrZXInKSBkYXRlUmFuZ2VTdGFydFBpY2tlcjogTnBJbnB1dDtcclxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VFbmRQaWNrZXInKSBkYXRlUmFuZ2VFbmRQaWNrZXI6IE5wSW5wdXQ7XHJcblxyXG4gIGRhdGVyYW5nZVBpY2tlclBvcHVwUmVmOiBDb21wb25lbnRSZWY8TnBEYXRlUmFuZ2VQaWNrZXJQb3B1cD47XHJcblxyXG5cclxuICBzdGFydERhdGU6IG1vbWVudF8uTW9tZW50IHwgc3RyaW5nO1xyXG4gIGVuZERhdGU6IG1vbWVudF8uTW9tZW50IHwgc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWY7XHJcbiAgaXNIb3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGVtaXRDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG5cclxuICAvKirml6XmnJ/ovpPlhaXmoYbmlofmnKzlgLzvvIzmr4/lvZN0aGlzLnN0YXJ0RGF0ZeaUueWPmOaXtuatpOWAvOS8muWQjOatpeaUueWPmCovXHJcbiAgc1ZhbHVlOiBzdHJpbmc7XHJcblxyXG5cclxuICAvKirml6XmnJ/ovpPlhaXmoYbmlofmnKzlgLzvvIzmr4/lvZN0aGlzLmVuZERhdGXmlLnlj5jml7bmraTlgLzkvJrlkIzmraXmlLnlj5gqL1xyXG4gIGVWYWx1ZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaWNrZXJTZXJ2aWNlOiBOcERhdGVQaWNrZXJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRlcyAmJiB0aGlzLmRhdGVzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5kYXRlc1swXSkuY2xvbmUoKSwgbW9tZW50KHRoaXMuZGF0ZXNbMV0pLmNsb25lKCkpO1xyXG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGRhdGVzWzBdO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBkYXRlc1sxXTtcclxuICAgICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICAgIHRoaXMuc3luY0VWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0T3ZlcmxheVJlZih0aGlzLmRhdGVSYW5nZVN0YXJ0UGlja2VyLm5wSW5wdXQpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvd1RpbWUpIHtcclxuICAgICAgdGhpcy5mb3JtYXQgPSBEQVRFX1RJTUVfRk9STUFUO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgb25TdGFydFBpY2tlckNsaWNrZWQoKSB7XHJcbiAgICB0aGlzLm9uVG9nZ2xlRGF0ZVBpY2tlclBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBvbkVuZFBpY2tlckNsaWNrZWQoKSB7XHJcbiAgICB0aGlzLm9uVG9nZ2xlRGF0ZVBpY2tlclBvcHVwKCk7XHJcbiAgfVxyXG5cclxuICBvblRvZ2dsZURhdGVQaWNrZXJQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLmNsb3NlUG9wdXAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTnBEYXRlUmFuZ2VQaWNrZXJQb3B1cCkpO1xyXG4gICAgdGhpcy5kYXRlcmFuZ2VQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5kYXRlUGlja2VyVHlwZSA9ICdkYXRlLXJhbmdlLXBpY2tlcic7XHJcbiAgICB0aGlzLmRhdGVyYW5nZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLmZvb3Rlckl0ZW1zID0gdGhpcy5mb290ZXJJdGVtcztcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2Uuc3RhcnREYXRlID0gbW9tZW50KHRoaXMuc3RhcnREYXRlKTtcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2UuZW5kRGF0ZSA9IG1vbWVudCh0aGlzLmVuZERhdGUpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVOb3RpZnlFdmVudHMoKTtcclxuXHJcbiAgICB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0ZVJhbmdlV3JhcHBlciAmJiB0aGlzLmRhdGVSYW5nZVdyYXBwZXIubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmRhdGVSYW5nZVdyYXBwZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TdGFydERhdGVCbHVyKGRhdGE6IHsgdmFsdWU6IGFueSwgZXZlbnQ6IGFueSB9KSB7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKGRhdGEudmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gbW9tZW50KGRhdGEudmFsdWUsIHRoaXMuZm9ybWF0KS5jbG9uZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5aaC5p6c6L6T5YWl5pel5pyf5LiN5ZCI5rOV77yM6buY6K6k5b2T5YmN5pe26Ze0XHJcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gbW9tZW50KCkuY2xvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5zdGFydERhdGUpLmNsb25lKCksIG1vbWVudCh0aGlzLmVuZERhdGUpLmNsb25lKCkpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBkYXRlc1swXTtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IGRhdGVzWzFdO1xyXG4gICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gICAgdGhpcy5vbkRhdGVSYW5nZUNoYW5nZWQuZW1pdChbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gIH1cclxuXHJcbiAgb25FbmREYXRlQmx1cihkYXRhOiB7IHZhbHVlOiBhbnksIGV2ZW50OiBhbnkgfSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNWYWxpZChkYXRhLnZhbHVlKSkge1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBtb21lbnQoZGF0YS52YWx1ZSwgdGhpcy5mb3JtYXQpLmNsb25lKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlpoLmnpzovpPlhaXml6XmnJ/kuI3lkIjms5XvvIzpu5jorqTlvZPliY3ml7bpl7RcclxuICAgICAgdGhpcy5lbmREYXRlID0gbW9tZW50KCkuY2xvbmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0ZXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkU3RhcnRBbmRFbmREYXRlcyhtb21lbnQodGhpcy5zdGFydERhdGUpLmNsb25lKCksIG1vbWVudCh0aGlzLmVuZERhdGUpLmNsb25lKCkpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBkYXRlc1swXTtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IGRhdGVzWzFdO1xyXG4gICAgdGhpcy5zeW5jU1ZhbHVlKCk7XHJcbiAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgIHRoaXMuZW1pdENoYW5nZShbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gICAgdGhpcy5vbkRhdGVSYW5nZUNoYW5nZWQuZW1pdChbdGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZV0pO1xyXG4gIH1cclxuXHJcbiAgb25DbGVhcigpIHtcclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RhcnREYXRlID0gbnVsbDtcclxuICAgIHRoaXMuZW5kRGF0ZSA9IG51bGw7XHJcbiAgICB0aGlzLnN5bmNTVmFsdWUoKTtcclxuICAgIHRoaXMuc3luY0VWYWx1ZSgpO1xyXG5cclxuICAgIHRoaXMuZW1pdENoYW5nZShbXSk7XHJcbiAgICB0aGlzLm9uRGF0ZVJhbmdlQ2hhbmdlZC5lbWl0KFtdKTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VlbnRlcigpIHtcclxuICAgIHRoaXMuaXNIb3ZlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlbGVhdmUoKSB7XHJcbiAgICB0aGlzLmlzSG92ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBQcml2YXRlIG1ldGhvZHNcclxuXHJcbiAgLyoq5q+P5qyhdGhpcy5zdGFydERhdGXmlLnlj5jml7bvvIzov5nkuKrmlrnms5Xpg73lv4XpobvopoHosIPnlKggKi9cclxuICBwcml2YXRlIHN5bmNTVmFsdWUoKSB7XHJcbiAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKHRoaXMuc3RhcnREYXRlKSkge1xyXG4gICAgICB0aGlzLnNWYWx1ZSA9IG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSwgdGhpcy5mb3JtYXQpLmZvcm1hdCh0aGlzLmZvcm1hdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoq5q+P5qyhdGhpcy5lbmREYXRl5pS55Y+Y5pe277yM6L+Z5Liq5pa55rOV6YO95b+F6aG76KaB6LCD55SoICovXHJcbiAgcHJpdmF0ZSBzeW5jRVZhbHVlKCkge1xyXG4gICAgaWYgKHRoaXMuZW5kRGF0ZSAmJiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmlzVmFsaWQodGhpcy5lbmREYXRlKSkge1xyXG4gICAgICB0aGlzLmVWYWx1ZSA9IG1vbWVudCh0aGlzLmVuZERhdGUsIHRoaXMuZm9ybWF0KS5mb3JtYXQodGhpcy5mb3JtYXQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lVmFsdWUgPSAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvc2VQb3B1cCgpIHtcclxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZU5vdGlmeUV2ZW50cygpIHtcclxuICAgIHRoaXMuZGF0ZXJhbmdlUGlja2VyUG9wdXBSZWYuaW5zdGFuY2Uub25TdGFydERheUNsaWNrZWQuc3Vic2NyaWJlKChyZXM6IHsgZGF5OiBEYXlEYXRhUGVyTW9udGgsIGRhdGVzOiBBcnJheTxhbnk+IH0pID0+IHtcclxuICAgICAgaWYgKHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuaXNWYWxpZCh0aGlzLmVuZERhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5lbWl0RGF0YUFuZENsb3NlUG9wdXAoW3Jlcy5kYXkuZGF0ZSwgbW9tZW50KHRoaXMuZW5kRGF0ZSkuY2xvbmUoKV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gcmVzLmRheS5kYXRlO1xyXG4gICAgICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGVyYW5nZVBpY2tlclBvcHVwUmVmLmluc3RhbmNlLm9uRW5kRGF5Q2xpY2tlZC5zdWJzY3JpYmUoKHJlczogeyBkYXk6IERheURhdGFQZXJNb250aCwgZGF0ZXM6IEFycmF5PGFueT4gfSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKHRoaXMuc3RhcnREYXRlKSkge1xyXG4gICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFtyZXMuZGF5LmRhdGUsIG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSkuY2xvbmUoKV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IHJlcy5kYXkuZGF0ZTtcclxuICAgICAgICB0aGlzLnN5bmNFVmFsdWUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5kYXRlcmFuZ2VQaWNrZXJQb3B1cFJlZi5pbnN0YW5jZS5vbkl0ZW1MYWJlbENsaWNrZWQuc3Vic2NyaWJlKChyZXM6IERhdGVQaWNrZXJGb290ZXJJdGVtKSA9PiB7XHJcbiAgICAgIGlmIChyZXMgJiYgcmVzLnZhbHVlcyAmJiByZXMudmFsdWVzLmxlbmd0aCA9PT0gMikge1xyXG4gICAgICAgIGlmICgoKHJlcy52YWx1ZXNbMF0pIGluc3RhbmNlb2YgRnVuY3Rpb24pICYmICgocmVzLnZhbHVlc1sxXSkgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFsoPGFueT5yZXMudmFsdWVzWzBdKSgpLCAoPGFueT5yZXMudmFsdWVzWzFdKSgpXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZW1pdERhdGFBbmRDbG9zZVBvcHVwKFttb21lbnQoPGFueT5yZXMudmFsdWVzWzBdKSwgbW9tZW50KDxhbnk+cmVzLnZhbHVlc1sxXSldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbWl0RGF0YUFuZENsb3NlUG9wdXAoZGF0ZXM6IEFycmF5PG1vbWVudF8uTW9tZW50Pikge1xyXG4gICAgbGV0IHNvcnRlZERhdGVzID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5zb3J0RGF0ZXMoZGF0ZXMpO1xyXG4gICAgdGhpcy5zdGFydERhdGUgPSBzb3J0ZWREYXRlc1swXS5jbG9uZSgpO1xyXG4gICAgdGhpcy5lbmREYXRlID0gc29ydGVkRGF0ZXNbc29ydGVkRGF0ZXMubGVuZ3RoIC0gMV0uY2xvbmUoKTtcclxuICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgdGhpcy5zeW5jRVZhbHVlKCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UoW3RoaXMuc3RhcnREYXRlLCB0aGlzLmVuZERhdGVdKTtcclxuICAgIHRoaXMub25EYXRlUmFuZ2VDaGFuZ2VkLmVtaXQoW3RoaXMuc3RhcnREYXRlLCB0aGlzLmVuZERhdGVdKTtcclxuICAgIHRoaXMuY2xvc2VQb3B1cCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEltcGxlbWVudCBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBpZiAob2JqICYmIG9iai5sZW5ndGggPT09IDIgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKG9ialswXSkgJiYgdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbGlkKG9ialsxXSkpIHtcclxuICAgICAgbGV0IHNvcnRlZERhdGVzID0gdGhpcy5kYXRlUGlja2VyU2VydmljZS5zb3J0RGF0ZXMob2JqKTtcclxuICAgICAgdGhpcy5zdGFydERhdGUgPSBzb3J0ZWREYXRlc1swXS5jbG9uZSgpO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBzb3J0ZWREYXRlc1tzb3J0ZWREYXRlcy5sZW5ndGggLSAxXS5jbG9uZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydERhdGUgPSBudWxsO1xyXG4gICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3luY1NWYWx1ZSgpO1xyXG4gICAgdGhpcy5zeW5jRVZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZW1pdENoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn0iXX0=