ng-devui
Version:
DevUI components based on Angular
420 lines • 60.8 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { CdkOverlayOrigin } from '@angular/cdk/overlay';
import { DOCUMENT } from '@angular/common';
import { ChangeDetectorRef, Component, ComponentRef, ElementRef, EventEmitter, HostListener, Inject, Input, Output, Renderer2, TemplateRef, ViewChild, forwardRef, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { I18nService } from 'ng-devui/i18n';
import { DefaultDateConverter, DevConfigService, WithConfig, addClassToOrigin, fadeInOut, formWithDropDown, removeClassFromOrigin, } from 'ng-devui/utils';
import { fromEvent } from 'rxjs';
import { debounceTime, filter, map } from 'rxjs/operators';
import { DatePickerConfigService as DatePickerConfig } from './date-picker.config.service';
import { SelectDateRangeChangeReason } from './date-range-change-event-args.model';
import * as i0 from "@angular/core";
import * as i1 from "./date-picker.config.service";
import * as i2 from "ng-devui/i18n";
import * as i3 from "ng-devui/utils";
import * as i4 from "@angular/forms";
import * as i5 from "@angular/cdk/overlay";
import * as i6 from "./date-range-picker.component";
// tslint:disable-next-line: component-class-suffix
export class DateRangePickerDirective {
set maxDate(date) {
this._maxDate = date;
}
get maxDate() {
if (this.dateRangePicker?.maxDate) {
return this.dateRangePicker.maxDate;
}
else {
return this._maxDate;
}
}
set minDate(date) {
this._minDate = date;
}
get minDate() {
if (this.dateRangePicker?.minDate) {
return this.dateRangePicker.minDate;
}
else {
return this._minDate;
}
}
set selectedRange(range) {
if (Array.isArray(range) && range.every((_) => !!_ || _ === null)) {
this._selectedRange = range;
}
}
get selectedRange() {
return this._selectedRange;
}
set showTime(showTime) {
this._showTime = showTime;
}
get showTime() {
return typeof this._showTime === 'boolean' ? this._showTime : this.dateConfig.timePicker;
}
set dateConfig(dateConfig) {
if (this.checkDateConfig(dateConfig)) {
this._dateConfig = dateConfig;
}
else {
this._dateConfig = this.datePickerConfig.dateConfig;
}
this._dateFormat = this.showTime ? this._dateConfig.format.time : this._dateConfig.format.date;
}
get dateConfig() {
return this._dateConfig;
}
set dateFormat(dateFormat) {
if (dateFormat && this._dateFormat !== dateFormat) {
this._dateFormat = dateFormat;
}
}
get dateFormat() {
return this._dateFormat || this.datePickerConfig.defaultFormat;
}
set rangeStart(rangeStart) {
if (this.dateRangePicker) {
this.dateRangePicker.rangeStart = rangeStart;
}
}
get rangeEnd() {
if (this.dateRangePicker) {
return this.dateRangePicker.rangeEnd;
}
}
set isOpen(isOpen) {
if (this._isOpen !== isOpen) {
this._isOpen = isOpen;
if (!isOpen && !this.rangeEnd) {
this.rangeStart = null;
}
if (!isOpen) {
this.startAnimation = false;
removeClassFromOrigin(this.elementRef);
this.document.removeEventListener('click', this.onDocumentClick);
}
else {
setTimeout(() => {
addClassToOrigin(this.elementRef);
this.document.addEventListener('click', this.onDocumentClick);
this.startAnimation = true;
this.cdr.detectChanges();
});
}
}
}
get isOpen() {
return this._isOpen;
}
constructor(elementRef, renderer, datePickerConfig, i18n, cdr, devConfigService, doc) {
this.elementRef = elementRef;
this.renderer = renderer;
this.datePickerConfig = datePickerConfig;
this.i18n = i18n;
this.cdr = cdr;
this.devConfigService = devConfigService;
this.doc = doc;
this.hideOnRangeSelected = false;
this.splitter = ' - ';
this.showAnimation = true;
this.selectedRangeChange = new EventEmitter();
this._selectedRange = [null, null];
this._isOpen = false;
this.datepickerPosition = 'bottom';
this.valueList = [];
this.startAnimation = false;
this.onChange = (_) => null;
this.onTouched = () => null;
this.chooseDate = (range, reason, hide = true) => {
if (this.dateRangePicker?.chooseDate) {
this.dateRangePicker.chooseDate(range, reason);
}
else {
this._selectedRange = [...range];
this.notifyValueChange({
reason: reason,
selectedRange: [...range],
});
}
if (!this.showTime && this.hideOnRangeSelected && hide) {
this.hide();
}
};
this.onDocumentClick = ($event) => {
let templateWrap;
if (this.dateRangePicker?.templateWrap) {
templateWrap = this.dateRangePicker.templateWrap;
}
if (templateWrap && templateWrap.nativeElement.contains($event.target) && !this.hideOnRangeSelected) {
this.isOpen = true;
}
else if (this.elementRef.nativeElement !== $event.target) {
this.isOpen = false;
}
this.cdr.markForCheck();
};
this.clearAll = (reason, hide) => {
const currentReason = typeof reason === 'number' ? reason : SelectDateRangeChangeReason.custom;
this.chooseDate([null, null], currentReason, hide);
};
this._dateConfig = datePickerConfig.dateConfig;
this.dateConverter = datePickerConfig.dateConfig.dateConverter || new DefaultDateConverter();
this._minDate = this.minDate ? new Date(this.minDate) : new Date(this.dateConfig.min, 0, 1, 0, 0, 0);
this._maxDate = this.maxDate ? new Date(this.maxDate) : new Date(this.dateConfig.max, 11, 31, 23, 59, 59);
this.setI18nText();
this.document = this.doc;
}
onBlur($event) {
this.onTouched();
if (!this.validateDate(this.elementRef.nativeElement.value)) {
this.resetValue();
}
}
checkDateConfig(dateConfig) {
if (!dateConfig) {
return false;
}
if (typeof dateConfig.timePicker !== 'boolean' || !dateConfig.max || !dateConfig.min || !dateConfig.format) {
return false;
}
return true;
}
ngOnInit() {
this.updateCdkConnectedOverlayOrigin();
this.initInputChanges();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
initInputChanges() {
this.valueChangeSubscrip = fromEvent(this.elementRef.nativeElement, 'keyup')
.pipe(map((e) => e.target.value), filter(() => !this.disabled), debounceTime(300))
.subscribe((value) => {
this.transUserInputToDatepicker(value);
});
}
writeValue(selectedRange) {
this._selectedRange = selectedRange;
if (selectedRange) {
this.writeModelValue(selectedRange);
}
}
setI18nText() {
this.i18nLocale = this.i18n.getI18nText().locale;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nLocale = data.locale;
});
}
updateCdkConnectedOverlayOrigin() {
if (this.elementRef.nativeElement) {
this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(formWithDropDown(this.elementRef) || this.elementRef.nativeElement);
}
}
toggle(clickShow) {
if (clickShow === undefined) {
this.isOpen = !this.isOpen;
}
else {
this.isOpen = clickShow;
}
}
hide(event) {
if (event !== false) {
this.isOpen = false;
}
}
writeModelValue(input) {
if (Array.isArray(input) && input.every((_) => !!_)) {
this.renderer.setProperty(this.elementRef.nativeElement, 'value', this.formatDateRange(input));
}
else {
this.renderer.setProperty(this.elementRef.nativeElement, 'value', '');
}
}
formatDateRange(arr) {
return arr
.map((date, i) => {
return date ? this.dateConverter.format(date, this.dateFormat, this.locale || this.i18nLocale) : ['Start', 'End'][i];
})
.join(this.splitter);
}
onPositionChange(position) {
switch (position.connectionPair.overlayY) {
case 'top':
case 'center':
this.datepickerPosition = 'bottom';
break;
case 'bottom':
this.datepickerPosition = 'top';
break;
default:
}
}
notifyValueChange(dateObj) {
this.writeValue(dateObj.selectedRange);
this.onChange(dateObj.selectedRange);
this.onTouched();
this.selectedRangeChange.emit({
reason: dateObj.reason,
selectedRange: dateObj.selectedRange,
});
if (!this.showTime && this.hideOnRangeSelected) {
this.hide();
}
}
transUserInputToDatepicker(value) {
if (!this.showTime && !this.disabled) {
const _value = value || this.elementRef.nativeElement.value;
if (!_value && !this.selectedRange.every((val) => !!val)) {
this.clearAll(undefined, false);
return;
}
if (!_value) {
this.clearAll(undefined, false);
return;
}
if (this.validateDate(_value)) {
this.chooseDate(this.valueList, undefined, false);
}
}
else {
this.resetValue();
}
}
resetValue() {
this.writeValue(this.selectedRange);
}
validateDate(value) {
if (!value) {
return true;
}
this.valueList = value.split(this.splitter);
let valueFormat;
// 如果拆出来6个,则为日期间分隔符和年月日间分隔符相同的情况,此情况允许
if (this.valueList.length === 6 && this.valueList.every((val) => !!val)) {
const curValueList = [];
this.valueList.forEach((val, index) => {
// 根据下标,前三个组装在一起,后三个组装在一起,不需要考虑分隔符,后面会format
if ((index + 1) % 3 === 1) {
curValueList.push(val);
}
else {
curValueList[Math.ceil(index / 3) - 1] = curValueList[Math.ceil(index / 3) - 1] + '-' + val;
}
});
this.valueList = curValueList;
}
// 不管拆出来是6还是2个,都需要组装成2个日期
if (this.valueList.length === 2 &&
this.valueList.every((val) => !!val) &&
this.valueList.every((val, index) => new Date(val).getTime() === new Date(this.selectedRange[index]).getTime())) {
this.valueList = this.valueList.map((t) => new Date(t));
return true;
}
if (!this.valueList.every((val) => new Date(val).getTime())) {
return false;
}
if (this.valueList.length === 2 && this.valueList.every((val) => !!val)) {
const valueTimeList = this.valueList.map((val) => new Date(`${val} 00:00:00`).getTime());
valueFormat = this.formatDateRange(this.valueList.map((numValue) => new Date(numValue)));
if (value === valueFormat &&
!valueTimeList.every((val) => {
return val >= this.minDate.getTime() && val <= this.maxDate.getTime();
})) {
return false;
}
else {
// 判断前后俩日期是否大于最小,小于最大,若是则合法,进行如下操作
// 此时包括value为NaN既日期格式不正确的情况,对其进行处理下方判断会过滤掉
this.valueList = this.valueList
.map((val) => new Date(val).getTime())
.sort((a, b) => a - b)
.map((numValue) => new Date(numValue));
}
if (valueFormat && value === valueFormat) {
return true;
}
return false;
}
else {
return false;
}
}
ngOnDestroy() {
this.hide();
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
if (this.valueChangeSubscrip) {
this.valueChangeSubscrip.unsubscribe();
}
this.document.removeEventListener('click', this.onDocumentClick);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangePickerDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DatePickerConfigService }, { token: i2.I18nService }, { token: i0.ChangeDetectorRef }, { token: i3.DevConfigService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateRangePickerDirective, selector: "[dDateRangePicker]", inputs: { locale: "locale", cssClass: "cssClass", disabled: "disabled", dateConverter: "dateConverter", hideOnRangeSelected: "hideOnRangeSelected", customViewTemplate: "customViewTemplate", splitter: "splitter", showAnimation: "showAnimation", maxDate: "maxDate", minDate: "minDate", selectedRange: "selectedRange", showTime: "showTime", dateConfig: "dateConfig", dateFormat: "dateFormat" }, outputs: { selectedRangeChange: "selectedRangeChange" }, host: { listeners: { "blur": "onBlur($event)" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DateRangePickerDirective),
multi: true,
},
], viewQueries: [{ propertyName: "dateRangePicker", first: true, predicate: ["dateRangePicker"], descendants: true }], exportAs: ["dateRangePicker"], ngImport: i0, template: "<ng-template\n cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n (backdropClick)=\"isOpen=false\"\n (positionChange)=\"onPositionChange($event)\"\n>\n <div [@fadeInOut]=\"startAnimation ? datepickerPosition : 'void'\" [@.disabled]=\"!showAnimation\" class=\"devui-date-range-wrapper\">\n <d-date-range-picker\n #dateRangePicker\n [locale]=\"locale\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\"\n [dateConverter]=\"dateConverter\"\n [customViewTemplate]=\"customViewTemplate\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [dateFormat]=\"dateFormat\"\n [showTime]=\"showTime\"\n [selectedRange]=\"selectedRange\"\n (selectedRangeChange)=\"notifyValueChange($event)\"\n (hide)=\"hide($event)\"\n [(ngModel)]=\"_selectedRange\"\n ></d-date-range-picker>\n </div>\n</ng-template>\n", styles: [".devui-date-range-wrapper{display:inline-flex!important;box-shadow:var(--devui-shadow-length-connected-overlay, 0 4px 12px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background-color:var(--devui-connected-overlay-bg, #ffffff);transform:perspective(1px) translateZ(0);flex-direction:column;border-radius:var(--devui-border-radius, 2px);margin:4px 0;-webkit-user-select:none;user-select:none}.devui-date-range-custom{width:500px;border-top:1px solid var(--devui-line, #dbdbdb)}.devui-date-picker:not(:last-child){margin-right:20px}\n"], dependencies: [{ kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: i6.DateRangePickerComponent, selector: "d-date-range-picker", inputs: ["locale", "cssClass", "disabled", "dateConverter", "selectedRange", "dateFormat", "customViewTemplate", "showTime", "dateConfig", "maxDate", "minDate"], outputs: ["selectedRangeChange", "hide"], exportAs: ["dateRangePicker"] }], animations: [fadeInOut] }); }
}
__decorate([
WithConfig(),
__metadata("design:type", Object)
], DateRangePickerDirective.prototype, "showAnimation", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangePickerDirective, decorators: [{
type: Component,
args: [{ selector: '[dDateRangePicker]', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => DateRangePickerDirective),
multi: true,
},
], exportAs: 'dateRangePicker', animations: [fadeInOut], preserveWhitespaces: false, template: "<ng-template\n cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n (backdropClick)=\"isOpen=false\"\n (positionChange)=\"onPositionChange($event)\"\n>\n <div [@fadeInOut]=\"startAnimation ? datepickerPosition : 'void'\" [@.disabled]=\"!showAnimation\" class=\"devui-date-range-wrapper\">\n <d-date-range-picker\n #dateRangePicker\n [locale]=\"locale\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\"\n [dateConverter]=\"dateConverter\"\n [customViewTemplate]=\"customViewTemplate\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [dateFormat]=\"dateFormat\"\n [showTime]=\"showTime\"\n [selectedRange]=\"selectedRange\"\n (selectedRangeChange)=\"notifyValueChange($event)\"\n (hide)=\"hide($event)\"\n [(ngModel)]=\"_selectedRange\"\n ></d-date-range-picker>\n </div>\n</ng-template>\n", styles: [".devui-date-range-wrapper{display:inline-flex!important;box-shadow:var(--devui-shadow-length-connected-overlay, 0 4px 12px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background-color:var(--devui-connected-overlay-bg, #ffffff);transform:perspective(1px) translateZ(0);flex-direction:column;border-radius:var(--devui-border-radius, 2px);margin:4px 0;-webkit-user-select:none;user-select:none}.devui-date-range-custom{width:500px;border-top:1px solid var(--devui-line, #dbdbdb)}.devui-date-picker:not(:last-child){margin-right:20px}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DatePickerConfigService }, { type: i2.I18nService }, { type: i0.ChangeDetectorRef }, { type: i3.DevConfigService }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { locale: [{
type: Input
}], cssClass: [{
type: Input
}], disabled: [{
type: Input
}], dateConverter: [{
type: Input
}], hideOnRangeSelected: [{
type: Input
}], customViewTemplate: [{
type: Input
}], splitter: [{
type: Input
}], showAnimation: [{
type: Input
}], selectedRangeChange: [{
type: Output
}], dateRangePicker: [{
type: ViewChild,
args: ['dateRangePicker']
}], maxDate: [{
type: Input
}], minDate: [{
type: Input
}], selectedRange: [{
type: Input
}], showTime: [{
type: Input
}], dateConfig: [{
type: Input
}], dateFormat: [{
type: Input
}], onBlur: [{
type: HostListener,
args: ['blur', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvZGF0ZXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5kaXJlY3RpdmUudHMiLCIuLi8uLi8uLi9kZXZ1aS9kYXRlcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmRpcmVjdGl2ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXlELE1BQU0sc0JBQXNCLENBQUM7QUFDL0csT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBaUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFFTCxvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULGdCQUFnQixFQUNoQixxQkFBcUIsR0FDdEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQWdCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsdUJBQXVCLElBQUksZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQWtDLDJCQUEyQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7O0FB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S0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ2lCLGFBQWE7c0JBQW5DLEtBQUs7Z0JBQ0ksbUJBQW1CO3NCQUE1QixNQUFNO2dCQUN1QixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFtQmYsT0FBTztzQkFBbkIsS0FBSztnQkFZTyxPQUFPO3NCQUFuQixLQUFLO2dCQVlPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBVU8sUUFBUTtzQkFBcEIsS0FBSztnQkFRTyxVQUFVO3NCQUF0QixLQUFLO2dCQWFPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBZ0VOLE1BQU07c0JBREwsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtPdmVybGF5T3JpZ2luLCBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsIFZlcnRpY2FsQ29ubmVjdGlvblBvcyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGZvcndhcmRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHtcclxuICBEYXRlQ29udmVydGVyLFxyXG4gIERlZmF1bHREYXRlQ29udmVydGVyLFxyXG4gIERldkNvbmZpZ1NlcnZpY2UsXHJcbiAgV2l0aENvbmZpZyxcclxuICBhZGRDbGFzc1RvT3JpZ2luLFxyXG4gIGZhZGVJbk91dCxcclxuICBmb3JtV2l0aERyb3BEb3duLFxyXG4gIHJlbW92ZUNsYXNzRnJvbU9yaWdpbixcclxufSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJDb25maWdTZXJ2aWNlIGFzIERhdGVQaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGUtcGlja2VyLmNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2VsZWN0RGF0ZVJhbmdlQ2hhbmdlRXZlbnRBcmdzLCBTZWxlY3REYXRlUmFuZ2VDaGFuZ2VSZWFzb24gfSBmcm9tICcuL2RhdGUtcmFuZ2UtY2hhbmdlLWV2ZW50LWFyZ3MubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciovXHJcbiAgc2VsZWN0b3I6ICdbZERhdGVSYW5nZVBpY2tlcl0nLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlUmFuZ2VQaWNrZXJEaXJlY3RpdmUpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxuICBleHBvcnRBczogJ2RhdGVSYW5nZVBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmRpcmVjdGl2ZS5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5PdXRdLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG59KVxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1jbGFzcy1zdWZmaXhcclxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZVBpY2tlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgbG9jYWxlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkYXRlQ29udmVydGVyOiBEYXRlQ29udmVydGVyO1xyXG4gIEBJbnB1dCgpIGhpZGVPblJhbmdlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjdXN0b21WaWV3VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgc3BsaXR0ZXIgPSAnICAtICAnO1xyXG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKCkgc2hvd0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdERhdGVSYW5nZUNoYW5nZUV2ZW50QXJncz4oKTtcclxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VQaWNrZXInKSBkYXRlUmFuZ2VQaWNrZXI6IENvbXBvbmVudFJlZjxEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQ+O1xyXG4gIHByaXZhdGUgX21heERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBfbWluRGF0ZTogRGF0ZTtcclxuICBfc2VsZWN0ZWRSYW5nZSA9IFtudWxsLCBudWxsXTtcclxuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9kYXRlQ29uZmlnOiBhbnk7XHJcbiAgcHJpdmF0ZSBfZGF0ZUZvcm1hdDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3Nob3dUaW1lOiBib29sZWFuO1xyXG4gIHB1YmxpYyBjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luOiBhbnk7XHJcbiAgcHVibGljIGkxOG5Mb2NhbGU6IEkxOG5JbnRlcmZhY2VbJ2xvY2FsZSddO1xyXG4gIHByaXZhdGUgaTE4blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgdmFsdWVDaGFuZ2VTdWJzY3JpcDogU3Vic2NyaXB0aW9uO1xyXG4gIGRhdGVwaWNrZXJQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zID0gJ2JvdHRvbSc7XHJcbiAgdmFsdWVMaXN0ID0gW107XHJcbiAgc3RhcnRBbmltYXRpb24gPSBmYWxzZTtcclxuICBkb2N1bWVudDogRG9jdW1lbnQ7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IG51bGw7XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiBudWxsO1xyXG5cclxuICBASW5wdXQoKSBzZXQgbWF4RGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICB0aGlzLl9tYXhEYXRlID0gZGF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhEYXRlKCkge1xyXG4gICAgaWYgKCh0aGlzLmRhdGVSYW5nZVBpY2tlciBhcyBhbnkpPy5tYXhEYXRlKSB7XHJcbiAgICAgIHJldHVybiAodGhpcy5kYXRlUmFuZ2VQaWNrZXIgYXMgYW55KS5tYXhEYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX21heERhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbWluRGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICB0aGlzLl9taW5EYXRlID0gZGF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBtaW5EYXRlKCkge1xyXG4gICAgaWYgKCh0aGlzLmRhdGVSYW5nZVBpY2tlciBhcyBhbnkpPy5taW5EYXRlKSB7XHJcbiAgICAgIHJldHVybiAodGhpcy5kYXRlUmFuZ2VQaWNrZXIgYXMgYW55KS5taW5EYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgc2VsZWN0ZWRSYW5nZShyYW5nZTogQXJyYXk8RGF0ZSB8IG51bGw+KSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYW5nZSkgJiYgcmFuZ2UuZXZlcnkoKF8pID0+ICEhXyB8fCBfID09PSBudWxsKSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlID0gcmFuZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRSYW5nZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJhbmdlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IHNob3dUaW1lKHNob3dUaW1lOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93VGltZSA9IHNob3dUaW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dUaW1lKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9zaG93VGltZSA9PT0gJ2Jvb2xlYW4nID8gdGhpcy5fc2hvd1RpbWUgOiB0aGlzLmRhdGVDb25maWcudGltZVBpY2tlcjtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRlQ29uZmlnKGRhdGVDb25maWc6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tEYXRlQ29uZmlnKGRhdGVDb25maWcpKSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlQ29uZmlnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0ZUNvbmZpZyA9IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kYXRlQ29uZmlnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGF0ZUZvcm1hdCA9IHRoaXMuc2hvd1RpbWUgPyB0aGlzLl9kYXRlQ29uZmlnLmZvcm1hdC50aW1lIDogdGhpcy5fZGF0ZUNvbmZpZy5mb3JtYXQuZGF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBkYXRlQ29uZmlnKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGVDb25maWc7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgZGF0ZUZvcm1hdChkYXRlRm9ybWF0OiBzdHJpbmcpIHtcclxuICAgIGlmIChkYXRlRm9ybWF0ICYmIHRoaXMuX2RhdGVGb3JtYXQgIT09IGRhdGVGb3JtYXQpIHtcclxuICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IGRhdGVGb3JtYXQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0IHx8IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kZWZhdWx0Rm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgc2V0IHJhbmdlU3RhcnQocmFuZ2VTdGFydDogRGF0ZSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVJhbmdlUGlja2VyKSB7XHJcbiAgICAgICh0aGlzLmRhdGVSYW5nZVBpY2tlciBhcyBhbnkpLnJhbmdlU3RhcnQgPSByYW5nZVN0YXJ0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHJhbmdlRW5kKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVJhbmdlUGlja2VyKSB7XHJcbiAgICAgIHJldHVybiAodGhpcy5kYXRlUmFuZ2VQaWNrZXIgYXMgYW55KS5yYW5nZUVuZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCBpc09wZW4oaXNPcGVuOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5faXNPcGVuICE9PSBpc09wZW4pIHtcclxuICAgICAgdGhpcy5faXNPcGVuID0gaXNPcGVuO1xyXG4gICAgICBpZiAoIWlzT3BlbiAmJiAhdGhpcy5yYW5nZUVuZCkge1xyXG4gICAgICAgIHRoaXMucmFuZ2VTdGFydCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc09wZW4pIHtcclxuICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tT3JpZ2luKHRoaXMuZWxlbWVudFJlZik7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGFkZENsYXNzVG9PcmlnaW4odGhpcy5lbGVtZW50UmVmKTtcclxuICAgICAgICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uRG9jdW1lbnRDbGljayk7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzT3BlbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlja2VyQ29uZmlnOiBEYXRlUGlja2VyQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgZGV2Q29uZmlnU2VydmljZTogRGV2Q29uZmlnU2VydmljZSxcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnlcclxuICApIHtcclxuICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlUGlja2VyQ29uZmlnLmRhdGVDb25maWc7XHJcbiAgICB0aGlzLmRhdGVDb252ZXJ0ZXIgPSBkYXRlUGlja2VyQ29uZmlnLmRhdGVDb25maWcuZGF0ZUNvbnZlcnRlciB8fCBuZXcgRGVmYXVsdERhdGVDb252ZXJ0ZXIoKTtcclxuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLm1pbkRhdGUgPyBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpIDogbmV3IERhdGUodGhpcy5kYXRlQ29uZmlnLm1pbiwgMCwgMSwgMCwgMCwgMCk7XHJcbiAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5tYXhEYXRlID8gbmV3IERhdGUodGhpcy5tYXhEYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5tYXgsIDExLCAzMSwgMjMsIDU5LCA1OSk7XHJcbiAgICB0aGlzLnNldEkxOG5UZXh0KCk7XHJcbiAgICB0aGlzLmRvY3VtZW50ID0gdGhpcy5kb2M7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSlcclxuICBvbkJsdXIoJGV2ZW50KSB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRGF0ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSkpIHtcclxuICAgICAgdGhpcy5yZXNldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja0RhdGVDb25maWcoZGF0ZUNvbmZpZzogYW55KSB7XHJcbiAgICBpZiAoIWRhdGVDb25maWcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBkYXRlQ29uZmlnLnRpbWVQaWNrZXIgIT09ICdib29sZWFuJyB8fCAhZGF0ZUNvbmZpZy5tYXggfHwgIWRhdGVDb25maWcubWluIHx8ICFkYXRlQ29uZmlnLmZvcm1hdCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy51cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk7XHJcbiAgICB0aGlzLmluaXRJbnB1dENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIGluaXRJbnB1dENoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3Vic2NyaXAgPSBmcm9tRXZlbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdrZXl1cCcpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICBtYXAoKGU6IGFueSkgPT4gZS50YXJnZXQudmFsdWUpLFxyXG4gICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuZGlzYWJsZWQpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMzAwKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMudHJhbnNVc2VySW5wdXRUb0RhdGVwaWNrZXIodmFsdWUpO1xyXG4gICAgfSk7XHJcb