myrta-ui 17.1.47 → 17.1.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/form/input-date/components/date-calendar/date-calendar.component.mjs +222 -0
- package/esm2022/lib/components/form/input-date/helpers/date-helpers.mjs +70 -0
- package/esm2022/lib/components/form/input-date/input-date.component.mjs +293 -0
- package/esm2022/lib/components/form/input-date/input-date.enum.mjs +7 -0
- package/esm2022/lib/components/form/input-date/input-date.module.mjs +51 -0
- package/esm2022/lib/components/form/input-date-time/input-date-time.component.mjs +3 -3
- package/esm2022/lib/components/form/input-date-time/input-date-time.enum.mjs +7 -7
- package/esm2022/lib/components/form/input-tel/data/all-countries.mjs +2 -2
- package/esm2022/lib/components/form/input-timepicker/input-timepicker.component.mjs +3 -3
- package/esm2022/lib/services/toaster-service/config/index.mjs +3 -2
- package/esm2022/lib/services/toaster-service/toaster-service.service.mjs +1 -1
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/myrta-ui.mjs +625 -9
- package/fesm2022/myrta-ui.mjs.map +1 -1
- package/lib/components/form/input-date/components/date-calendar/date-calendar.component.d.ts +63 -0
- package/lib/components/form/input-date/helpers/date-helpers.d.ts +14 -0
- package/lib/components/form/input-date/input-date.component.d.ts +65 -0
- package/lib/components/form/input-date/input-date.enum.d.ts +11 -0
- package/lib/components/form/input-date/input-date.module.d.ts +14 -0
- package/lib/components/form/input-date-time/input-date-time.component.d.ts +2 -2
- package/lib/components/form/input-date-time/input-date-time.enum.d.ts +2 -2
- package/lib/services/toaster-service/config/index.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
package/esm2022/lib/components/form/input-date/components/date-calendar/date-calendar.component.mjs
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { cleanDate } from '../../helpers/date-helpers';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class DateCalendarComponent {
|
|
5
|
+
_detector;
|
|
6
|
+
selectedDate = null;
|
|
7
|
+
dateSelected = new EventEmitter();
|
|
8
|
+
close = new EventEmitter();
|
|
9
|
+
currentMonth = new Date().getMonth();
|
|
10
|
+
currentYear = new Date().getFullYear();
|
|
11
|
+
view = 'days';
|
|
12
|
+
monthNames = [
|
|
13
|
+
'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь',
|
|
14
|
+
'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'
|
|
15
|
+
];
|
|
16
|
+
daysOfWeek = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];
|
|
17
|
+
months = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
|
18
|
+
_minDate = null;
|
|
19
|
+
_maxDate = null;
|
|
20
|
+
_minDateStr = null;
|
|
21
|
+
_maxDateStr = null;
|
|
22
|
+
calendarDaysCache = null;
|
|
23
|
+
constructor(_detector) {
|
|
24
|
+
this._detector = _detector;
|
|
25
|
+
}
|
|
26
|
+
ngOnInit() {
|
|
27
|
+
if (this.selectedDate) {
|
|
28
|
+
this.currentMonth = this.selectedDate.getMonth();
|
|
29
|
+
this.currentYear = this.selectedDate.getFullYear();
|
|
30
|
+
}
|
|
31
|
+
this.updateDateBounds();
|
|
32
|
+
}
|
|
33
|
+
set minDate(value) {
|
|
34
|
+
if (this._minDateStr !== value) {
|
|
35
|
+
this._minDateStr = value;
|
|
36
|
+
this.updateDateBounds();
|
|
37
|
+
this._detector.markForCheck();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
get minDate() {
|
|
41
|
+
return this._minDateStr;
|
|
42
|
+
}
|
|
43
|
+
set maxDate(value) {
|
|
44
|
+
if (this._maxDateStr !== value) {
|
|
45
|
+
this._maxDateStr = value;
|
|
46
|
+
this.updateDateBounds();
|
|
47
|
+
this._detector.markForCheck();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
get maxDate() {
|
|
51
|
+
return this._maxDateStr;
|
|
52
|
+
}
|
|
53
|
+
updateDateBounds() {
|
|
54
|
+
this._minDate = this._minDateStr ? cleanDate(this._minDateStr) : null;
|
|
55
|
+
this._maxDate = this._maxDateStr ? cleanDate(this._maxDateStr) : null;
|
|
56
|
+
}
|
|
57
|
+
get headerText() {
|
|
58
|
+
switch (this.view) {
|
|
59
|
+
case 'days':
|
|
60
|
+
return `${this.monthNames[this.currentMonth]} ${this.currentYear}`;
|
|
61
|
+
case 'months':
|
|
62
|
+
return `${this.currentYear}`;
|
|
63
|
+
default:
|
|
64
|
+
return 'Выберите год';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
switchView() {
|
|
68
|
+
this.view = this.view === 'days' ? 'months' : this.view === 'months' ? 'years' : 'days';
|
|
69
|
+
this._detector.markForCheck();
|
|
70
|
+
}
|
|
71
|
+
getCalendarDays() {
|
|
72
|
+
if (this.calendarDaysCache?.month === this.currentMonth && this.calendarDaysCache?.year === this.currentYear) {
|
|
73
|
+
return this.calendarDaysCache.days;
|
|
74
|
+
}
|
|
75
|
+
const daysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate();
|
|
76
|
+
const prevMonthDays = new Date(this.currentYear, this.currentMonth, 0).getDate();
|
|
77
|
+
const days = [];
|
|
78
|
+
const prevDaysCount = 2;
|
|
79
|
+
const prevMonth = this.currentMonth === 0 ? 11 : this.currentMonth - 1;
|
|
80
|
+
const prevYear = this.currentMonth === 0 ? this.currentYear - 1 : this.currentYear;
|
|
81
|
+
const nextMonth = this.currentMonth === 11 ? 0 : this.currentMonth + 1;
|
|
82
|
+
const nextYear = this.currentMonth === 11 ? this.currentYear + 1 : this.currentYear;
|
|
83
|
+
for (let i = 0; i < prevDaysCount; i++) {
|
|
84
|
+
days.push({ day: prevMonthDays - prevDaysCount + 1 + i, month: prevMonth, year: prevYear });
|
|
85
|
+
}
|
|
86
|
+
for (let i = 1; i <= daysInMonth; i++) {
|
|
87
|
+
days.push({ day: i, month: this.currentMonth, year: this.currentYear });
|
|
88
|
+
}
|
|
89
|
+
const remainingDays = 35 - days.length;
|
|
90
|
+
for (let i = 1; i <= remainingDays; i++) {
|
|
91
|
+
days.push({ day: i, month: nextMonth, year: nextYear });
|
|
92
|
+
}
|
|
93
|
+
this.calendarDaysCache = { month: this.currentMonth, year: this.currentYear, days };
|
|
94
|
+
return days;
|
|
95
|
+
}
|
|
96
|
+
getYears() {
|
|
97
|
+
const centerYear = this.selectedDate?.getFullYear() ?? this.currentYear;
|
|
98
|
+
const startYear = centerYear - 5;
|
|
99
|
+
return Array.from({ length: 12 }, (_, i) => startYear + i);
|
|
100
|
+
}
|
|
101
|
+
isSelected(day) {
|
|
102
|
+
if (!this.selectedDate)
|
|
103
|
+
return false;
|
|
104
|
+
return (day.day === this.selectedDate.getDate() &&
|
|
105
|
+
day.month === this.selectedDate.getMonth() &&
|
|
106
|
+
day.year === this.selectedDate.getFullYear());
|
|
107
|
+
}
|
|
108
|
+
isMonthSelected(month) {
|
|
109
|
+
return this.selectedDate?.getMonth() === month && this.selectedDate?.getFullYear() === this.currentYear;
|
|
110
|
+
}
|
|
111
|
+
isYearSelected(year) {
|
|
112
|
+
return this.selectedDate?.getFullYear() === year;
|
|
113
|
+
}
|
|
114
|
+
isDateEnabled(day) {
|
|
115
|
+
const date = new Date(day.year, day.month, day.day);
|
|
116
|
+
return ((!this._minDate || date >= this._minDate) &&
|
|
117
|
+
(!this._maxDate || date <= this._maxDate));
|
|
118
|
+
}
|
|
119
|
+
isMonthDisabled(month) {
|
|
120
|
+
if (!this._minDate && !this._maxDate)
|
|
121
|
+
return false;
|
|
122
|
+
const startOfMonth = new Date(this.currentYear, month, 1);
|
|
123
|
+
const endOfMonth = new Date(this.currentYear, month + 1, 0);
|
|
124
|
+
return ((!!this._minDate && !isNaN(this._minDate.getTime()) && endOfMonth < this._minDate) ||
|
|
125
|
+
(!!this._maxDate && !isNaN(this._maxDate.getTime()) && startOfMonth > this._maxDate));
|
|
126
|
+
}
|
|
127
|
+
isYearDisabled(year) {
|
|
128
|
+
if (!this._minDate && !this._maxDate)
|
|
129
|
+
return false;
|
|
130
|
+
const minYear = this._minDate && !isNaN(this._minDate.getTime()) ? this._minDate.getFullYear() : null;
|
|
131
|
+
const maxYear = this._maxDate && !isNaN(this._maxDate.getTime()) ? this._maxDate.getFullYear() : null;
|
|
132
|
+
return (minYear !== null && year < minYear) || (maxYear !== null && year > maxYear);
|
|
133
|
+
}
|
|
134
|
+
selectDate(day) {
|
|
135
|
+
if (!this.isDateEnabled(day))
|
|
136
|
+
return;
|
|
137
|
+
const date = new Date(day.year, day.month, day.day);
|
|
138
|
+
this.dateSelected.emit(date);
|
|
139
|
+
const needsUpdate = day.month !== this.currentMonth || day.year !== this.currentYear;
|
|
140
|
+
if (needsUpdate) {
|
|
141
|
+
setTimeout(() => {
|
|
142
|
+
this.currentMonth = day.month;
|
|
143
|
+
this.currentYear = day.year;
|
|
144
|
+
this._detector.markForCheck();
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
selectMonth(month) {
|
|
149
|
+
if (this.isMonthDisabled(month))
|
|
150
|
+
return;
|
|
151
|
+
setTimeout(() => {
|
|
152
|
+
this.currentMonth = month;
|
|
153
|
+
this.view = 'days';
|
|
154
|
+
this._detector.markForCheck();
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
selectYear(year) {
|
|
158
|
+
if (this.isYearDisabled(year))
|
|
159
|
+
return;
|
|
160
|
+
setTimeout(() => {
|
|
161
|
+
this.currentYear = year;
|
|
162
|
+
this.view = 'months';
|
|
163
|
+
this._detector.markForCheck();
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
changeMonth(offset) {
|
|
167
|
+
let newMonth = this.currentMonth + offset;
|
|
168
|
+
let newYear = this.currentYear;
|
|
169
|
+
if (newMonth < 0) {
|
|
170
|
+
newMonth = 11;
|
|
171
|
+
newYear--;
|
|
172
|
+
}
|
|
173
|
+
else if (newMonth > 11) {
|
|
174
|
+
newMonth = 0;
|
|
175
|
+
newYear++;
|
|
176
|
+
}
|
|
177
|
+
this.currentMonth = newMonth;
|
|
178
|
+
this.currentYear = newYear;
|
|
179
|
+
this._detector.markForCheck();
|
|
180
|
+
}
|
|
181
|
+
changeYearRange(offset) {
|
|
182
|
+
this.currentYear += offset * 12;
|
|
183
|
+
this._detector.markForCheck();
|
|
184
|
+
}
|
|
185
|
+
isPreviousMonthDisabled() {
|
|
186
|
+
if (!this._minDate)
|
|
187
|
+
return false;
|
|
188
|
+
return new Date(this.currentYear, this.currentMonth, 0) < this._minDate;
|
|
189
|
+
}
|
|
190
|
+
isNextMonthDisabled() {
|
|
191
|
+
if (!this._maxDate)
|
|
192
|
+
return false;
|
|
193
|
+
return new Date(this.currentYear, this.currentMonth + 1, 1) > this._maxDate;
|
|
194
|
+
}
|
|
195
|
+
isPreviousYearRangeDisabled() {
|
|
196
|
+
if (!this._minDate)
|
|
197
|
+
return false;
|
|
198
|
+
return this.getYears()[0] <= this._minDate.getFullYear();
|
|
199
|
+
}
|
|
200
|
+
isNextYearRangeDisabled() {
|
|
201
|
+
if (!this._maxDate)
|
|
202
|
+
return false;
|
|
203
|
+
return this.getYears()[this.getYears().length - 1] >= this._maxDate.getFullYear();
|
|
204
|
+
}
|
|
205
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DateCalendarComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
206
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DateCalendarComponent, selector: "mrx-date-calendar", inputs: { selectedDate: "selectedDate", minDate: "minDate", maxDate: "maxDate" }, outputs: { dateSelected: "dateSelected", close: "close" }, ngImport: i0, template: "<div class=\"calendar\">\r\n <div class=\"calendar-header\">\r\n @if (view === 'days') {\r\n <button class=\"nav-button\" (click)=\"changeMonth(-1)\" [disabled]=\"isPreviousMonthDisabled()\">\r\n \u276E\r\n </button>\r\n }\r\n\r\n @if (view === 'years') {\r\n <button class=\"nav-button\" (click)=\"changeYearRange(-1)\" [disabled]=\"isPreviousYearRangeDisabled()\">\r\n \u276E\r\n </button>\r\n }\r\n\r\n <button class=\"header-button\" (click)=\"switchView()\">\r\n {{ headerText }}\r\n </button>\r\n\r\n @if (view === 'days') {\r\n <button class=\"nav-button\" (click)=\"changeMonth(1)\" [disabled]=\"isNextMonthDisabled()\">\r\n \u276F\r\n </button>\r\n }\r\n\r\n @if (view === 'years') {\r\n <button class=\"nav-button\" (click)=\"changeYearRange(1)\" [disabled]=\"isNextYearRangeDisabled()\">\r\n \u276F\r\n </button>\r\n }\r\n </div>\r\n\r\n @switch (view) {\r\n @case ('years') {\r\n <div class=\"year-grid\">\r\n @for (year of getYears(); track year) {\r\n <div\r\n class=\"year\"\r\n [class.selected]=\"isYearSelected(year)\"\r\n [class.disabled]=\"isYearDisabled(year)\"\r\n [class.hoverable]=\"!isYearDisabled(year)\"\r\n (click)=\"selectYear(year)\"\r\n >\r\n {{ year }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n @case ('months') {\r\n <div class=\"month-grid\">\r\n @for (month of months; track month) {\r\n <div\r\n class=\"month\"\r\n [class.selected]=\"isMonthSelected(month)\"\r\n [class.disabled]=\"isMonthDisabled(month)\"\r\n [class.hoverable]=\"!isMonthDisabled(month)\"\r\n (click)=\"selectMonth(month)\"\r\n >\r\n {{ monthNames[month] }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n @default {\r\n <div class=\"calendar-grid\">\r\n @for (day of daysOfWeek; track day) {\r\n <div class=\"day-header\">{{ day }}</div>\r\n }\r\n\r\n @for (day of getCalendarDays(); track day) {\r\n <div\r\n class=\"day\"\r\n [class.selected]=\"isSelected(day)\"\r\n [class.other-month]=\"day.month !== currentMonth\"\r\n [class.disabled]=\"!isDateEnabled(day)\"\r\n [class.hoverable]=\"isDateEnabled(day)\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day.day }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n</div>\r\n", styles: [".calendar{width:280px;background:#fff;border:1px solid #d1d5db;border-radius:8px;box-shadow:0 4px 6px #0000001a;padding:16px;font-family:Arial,sans-serif}.calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;gap:8px}.header-button{background:none;border:none;font-weight:600;font-size:16px;color:#1f2937;cursor:pointer;padding:4px 8px;text-align:center;flex-grow:1}.header-button:hover{background:#f3f4f6;border-radius:4px}.nav-button{background:none;border:none;font-size:18px;cursor:pointer;padding:4px 8px;color:#374151}.nav-button:disabled{cursor:not-allowed;opacity:.5}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;text-align:center}.month-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;text-align:center}.year-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;text-align:center;max-height:190px;overflow-y:auto}.day-header{font-size:12px;font-weight:500;color:#6b7280;padding:4px}.day,.month,.year{padding:8px;font-size:14px;border-radius:4px;color:#374151}.day.hoverable,.month.hoverable,.year.hoverable{cursor:pointer}.day.hoverable:hover,.month.hoverable:hover,.year.hoverable:hover{background:#f3f4f6}.day.selected,.month.selected,.year.selected{background:#3b82f6;color:#fff}.day.other-month,.month.other-month,.year.other-month{color:#9ca3af}.day.disabled,.month.disabled,.year.disabled{color:#d1d5db;cursor:not-allowed}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
207
|
+
}
|
|
208
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DateCalendarComponent, decorators: [{
|
|
209
|
+
type: Component,
|
|
210
|
+
args: [{ selector: 'mrx-date-calendar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"calendar\">\r\n <div class=\"calendar-header\">\r\n @if (view === 'days') {\r\n <button class=\"nav-button\" (click)=\"changeMonth(-1)\" [disabled]=\"isPreviousMonthDisabled()\">\r\n \u276E\r\n </button>\r\n }\r\n\r\n @if (view === 'years') {\r\n <button class=\"nav-button\" (click)=\"changeYearRange(-1)\" [disabled]=\"isPreviousYearRangeDisabled()\">\r\n \u276E\r\n </button>\r\n }\r\n\r\n <button class=\"header-button\" (click)=\"switchView()\">\r\n {{ headerText }}\r\n </button>\r\n\r\n @if (view === 'days') {\r\n <button class=\"nav-button\" (click)=\"changeMonth(1)\" [disabled]=\"isNextMonthDisabled()\">\r\n \u276F\r\n </button>\r\n }\r\n\r\n @if (view === 'years') {\r\n <button class=\"nav-button\" (click)=\"changeYearRange(1)\" [disabled]=\"isNextYearRangeDisabled()\">\r\n \u276F\r\n </button>\r\n }\r\n </div>\r\n\r\n @switch (view) {\r\n @case ('years') {\r\n <div class=\"year-grid\">\r\n @for (year of getYears(); track year) {\r\n <div\r\n class=\"year\"\r\n [class.selected]=\"isYearSelected(year)\"\r\n [class.disabled]=\"isYearDisabled(year)\"\r\n [class.hoverable]=\"!isYearDisabled(year)\"\r\n (click)=\"selectYear(year)\"\r\n >\r\n {{ year }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n @case ('months') {\r\n <div class=\"month-grid\">\r\n @for (month of months; track month) {\r\n <div\r\n class=\"month\"\r\n [class.selected]=\"isMonthSelected(month)\"\r\n [class.disabled]=\"isMonthDisabled(month)\"\r\n [class.hoverable]=\"!isMonthDisabled(month)\"\r\n (click)=\"selectMonth(month)\"\r\n >\r\n {{ monthNames[month] }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n @default {\r\n <div class=\"calendar-grid\">\r\n @for (day of daysOfWeek; track day) {\r\n <div class=\"day-header\">{{ day }}</div>\r\n }\r\n\r\n @for (day of getCalendarDays(); track day) {\r\n <div\r\n class=\"day\"\r\n [class.selected]=\"isSelected(day)\"\r\n [class.other-month]=\"day.month !== currentMonth\"\r\n [class.disabled]=\"!isDateEnabled(day)\"\r\n [class.hoverable]=\"isDateEnabled(day)\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day.day }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n</div>\r\n", styles: [".calendar{width:280px;background:#fff;border:1px solid #d1d5db;border-radius:8px;box-shadow:0 4px 6px #0000001a;padding:16px;font-family:Arial,sans-serif}.calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;gap:8px}.header-button{background:none;border:none;font-weight:600;font-size:16px;color:#1f2937;cursor:pointer;padding:4px 8px;text-align:center;flex-grow:1}.header-button:hover{background:#f3f4f6;border-radius:4px}.nav-button{background:none;border:none;font-size:18px;cursor:pointer;padding:4px 8px;color:#374151}.nav-button:disabled{cursor:not-allowed;opacity:.5}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;text-align:center}.month-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;text-align:center}.year-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;text-align:center;max-height:190px;overflow-y:auto}.day-header{font-size:12px;font-weight:500;color:#6b7280;padding:4px}.day,.month,.year{padding:8px;font-size:14px;border-radius:4px;color:#374151}.day.hoverable,.month.hoverable,.year.hoverable{cursor:pointer}.day.hoverable:hover,.month.hoverable:hover,.year.hoverable:hover{background:#f3f4f6}.day.selected,.month.selected,.year.selected{background:#3b82f6;color:#fff}.day.other-month,.month.other-month,.year.other-month{color:#9ca3af}.day.disabled,.month.disabled,.year.disabled{color:#d1d5db;cursor:not-allowed}\n"] }]
|
|
211
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { selectedDate: [{
|
|
212
|
+
type: Input
|
|
213
|
+
}], dateSelected: [{
|
|
214
|
+
type: Output
|
|
215
|
+
}], close: [{
|
|
216
|
+
type: Output
|
|
217
|
+
}], minDate: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], maxDate: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}] } });
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJ0YS11aS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9pbnB1dC1kYXRlL2NvbXBvbmVudHMvZGF0ZS1jYWxlbmRhci9kYXRlLWNhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cnRhLXVpL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2lucHV0LWRhdGUvY29tcG9uZW50cy9kYXRlLWNhbGVuZGFyL2RhdGUtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBaUIsTUFBTSw0QkFBNEIsQ0FBQzs7QUFRdEUsTUFBTSxPQUFPLHFCQUFxQjtJQXFCWjtJQXBCWCxZQUFZLEdBQWdCLElBQUksQ0FBQztJQUNoQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUN4QyxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUUzQyxZQUFZLEdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QyxXQUFXLEdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQyxJQUFJLEdBQWdDLE1BQU0sQ0FBQztJQUNsQyxVQUFVLEdBQWE7UUFDOUIsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNO1FBQ3BELE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUztLQUM3RCxDQUFDO0lBQ08sVUFBVSxHQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsTUFBTSxHQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUUzRCxRQUFRLEdBQWdCLElBQUksQ0FBQztJQUM3QixRQUFRLEdBQWdCLElBQUksQ0FBQztJQUM3QixXQUFXLEdBQWtCLElBQUksQ0FBQztJQUNsQyxXQUFXLEdBQWtCLElBQUksQ0FBQztJQUNsQyxpQkFBaUIsR0FBaUcsSUFBSSxDQUFDO0lBRS9ILFlBQW9CLFNBQTRCO1FBQTVCLGNBQVMsR0FBVCxTQUFTLENBQW1CO0lBQUcsQ0FBQztJQUVwRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQ0ksT0FBTyxDQUFDLEtBQW9CO1FBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUNJLE9BQU8sQ0FBQyxLQUFvQjtRQUM5QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyRSxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQjtnQkFDRSxPQUFPLGNBQWMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN4RixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0csT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ3JDLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25GLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVqRixNQUFNLElBQUksR0FBbUQsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN2RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbkYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDdkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXBGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLGFBQWEsR0FBRyxhQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUV2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFD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RWEscUJBQXFCO2tCQU5qQyxTQUFTOytCQUNFLG1CQUFtQixtQkFHWix1QkFBdUIsQ0FBQyxNQUFNO3NGQUd0QyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQTZCSCxPQUFPO3NCQURWLEtBQUs7Z0JBY0YsT0FBTztzQkFEVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgY2xlYW5EYXRlLCBpc0RhdGVJblJhbmdlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9kYXRlLWhlbHBlcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdtcngtZGF0ZS1jYWxlbmRhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9kYXRlLWNhbGVuZGFyLmNvbXBvbmVudC5sZXNzJyxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBzZWxlY3RlZERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcclxuICBAT3V0cHV0KCkgZGF0ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xyXG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgY3VycmVudE1vbnRoOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCk7XHJcbiAgY3VycmVudFllYXI6IG51bWJlciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICB2aWV3OiAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycgPSAnZGF5cyc7XHJcbiAgcmVhZG9ubHkgbW9udGhOYW1lczogc3RyaW5nW10gPSBbXHJcbiAgICAn0K/QvdCy0LDRgNGMJywgJ9Ck0LXQstGA0LDQu9GMJywgJ9Cc0LDRgNGCJywgJ9CQ0L/RgNC10LvRjCcsICfQnNCw0LknLCAn0JjRjtC90YwnLFxyXG4gICAgJ9CY0Y7Qu9GMJywgJ9CQ0LLQs9GD0YHRgicsICfQodC10L3RgtGP0LHRgNGMJywgJ9Ce0LrRgtGP0LHRgNGMJywgJ9Cd0L7Rj9Cx0YDRjCcsICfQlNC10LrQsNCx0YDRjCdcclxuICBdO1xyXG4gIHJlYWRvbmx5IGRheXNPZldlZWs6IHN0cmluZ1tdID0gWyfQn9C9JywgJ9CS0YInLCAn0KHRgCcsICfQp9GCJywgJ9Cf0YInLCAn0KHQsScsICfQktGBJ107XHJcbiAgcmVhZG9ubHkgbW9udGhzOiBudW1iZXJbXSA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTFdO1xyXG5cclxuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfbWF4RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX21pbkRhdGVTdHI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX21heERhdGVTdHI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgY2FsZW5kYXJEYXlzQ2FjaGU6IHsgbW9udGg6IG51bWJlcjsgeWVhcjogbnVtYmVyOyBkYXlzOiB7IGRheTogbnVtYmVyLCBtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIgfVtdIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHRoaXMuc2VsZWN0ZWREYXRlLmdldE1vbnRoKCk7XHJcbiAgICAgIHRoaXMuY3VycmVudFllYXIgPSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVEYXRlQm91bmRzKCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBtaW5EYXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5fbWluRGF0ZVN0ciAhPT0gdmFsdWUpIHtcclxuICAgICAgdGhpcy5fbWluRGF0ZVN0ciA9IHZhbHVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZURhdGVCb3VuZHMoKTtcclxuICAgICAgdGhpcy5fZGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbWluRGF0ZSgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9taW5EYXRlU3RyO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgbWF4RGF0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgaWYgKHRoaXMuX21heERhdGVTdHIgIT09IHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX21heERhdGVTdHIgPSB2YWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVEYXRlQm91bmRzKCk7XHJcbiAgICAgIHRoaXMuX2RldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IG1heERhdGUoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZVN0cjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGF0ZUJvdW5kcygpIHtcclxuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLl9taW5EYXRlU3RyID8gY2xlYW5EYXRlKHRoaXMuX21pbkRhdGVTdHIpIDogbnVsbDtcclxuICAgIHRoaXMuX21heERhdGUgPSB0aGlzLl9tYXhEYXRlU3RyID8gY2xlYW5EYXRlKHRoaXMuX21heERhdGVTdHIpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBoZWFkZXJUZXh0KCk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHRoaXMudmlldykge1xyXG4gICAgICBjYXNlICdkYXlzJzpcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5tb250aE5hbWVzW3RoaXMuY3VycmVudE1vbnRoXX0gJHt0aGlzLmN1cnJlbnRZZWFyfWA7XHJcbiAgICAgIGNhc2UgJ21vbnRocyc6XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuY3VycmVudFllYXJ9YDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ9CS0YvQsdC10YDQuNGC0LUg0LPQvtC0JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN3aXRjaFZpZXcoKSB7XHJcbiAgICB0aGlzLnZpZXcgPSB0aGlzLnZpZXcgPT09ICdkYXlzJyA/ICdtb250aHMnIDogdGhpcy52aWV3ID09PSAnbW9udGhzJyA/ICd5ZWFycycgOiAnZGF5cyc7XHJcbiAgICB0aGlzLl9kZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGdldENhbGVuZGFyRGF5cygpOiB7IGRheTogbnVtYmVyLCBtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIgfVtdIHtcclxuICAgIGlmICh0aGlzLmNhbGVuZGFyRGF5c0NhY2hlPy5tb250aCA9PT0gdGhpcy5jdXJyZW50TW9udGggJiYgdGhpcy5jYWxlbmRhckRheXNDYWNoZT8ueWVhciA9PT0gdGhpcy5jdXJyZW50WWVhcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5jYWxlbmRhckRheXNDYWNoZS5kYXlzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGggKyAxLCAwKS5nZXREYXRlKCk7XHJcbiAgICBjb25zdCBwcmV2TW9udGhEYXlzID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIDApLmdldERhdGUoKTtcclxuXHJcbiAgICBjb25zdCBkYXlzOiB7IGRheTogbnVtYmVyLCBtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIgfVtdID0gW107XHJcbiAgICBjb25zdCBwcmV2RGF5c0NvdW50ID0gMjtcclxuICAgIGNvbnN0IHByZXZNb250aCA9IHRoaXMuY3VycmVudE1vbnRoID09PSAwID8gMTEgOiB0aGlzLmN1cnJlbnRNb250aCAtIDE7XHJcbiAgICBjb25zdCBwcmV2WWVhciA9IHRoaXMuY3VycmVudE1vbnRoID09PSAwID8gdGhpcy5jdXJyZW50WWVhciAtIDEgOiB0aGlzLmN1cnJlbnRZZWFyO1xyXG4gICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5jdXJyZW50TW9udGggPT09IDExID8gMCA6IHRoaXMuY3VycmVudE1vbnRoICsgMTtcclxuICAgIGNvbnN0IG5leHRZZWFyID0gdGhpcy5jdXJyZW50TW9udGggPT09IDExID8gdGhpcy5jdXJyZW50WWVhciArIDEgOiB0aGlzLmN1cnJlbnRZZWFyO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldkRheXNDb3VudDsgaSsrKSB7XHJcbiAgICAgIGRheXMucHVzaCh7IGRheTogcHJldk1vbnRoRGF5cyAtIHByZXZEYXlzQ291bnQgKyAxICsgaSwgbW9udGg6IHByZXZNb250aCwgeWVhcjogcHJldlllYXIgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGF5c0luTW9udGg7IGkrKykge1xyXG4gICAgICBkYXlzLnB1c2goeyBkYXk6IGksIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCwgeWVhcjogdGhpcy5jdXJyZW50WWVhciB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZW1haW5pbmdEYXlzID0gMzUgLSBkYXlzLmxlbmd0aDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSByZW1haW5pbmdEYXlzOyBpKyspIHtcclxuICAgICAgZGF5cy5wdXNoKHsgZGF5OiBpLCBtb250aDogbmV4dE1vbnRoLCB5ZWFyOiBuZXh0WWVhciB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbGVuZGFyRGF5c0NhY2hlID0geyBtb250aDogdGhpcy5jdXJyZW50TW9udGgsIHllYXI6IHRoaXMuY3VycmVudFllYXIsIGRheXMgfTtcclxuICAgIHJldHVybiBkYXlzO1xyXG4gIH1cclxuXHJcbiAgZ2V0WWVhcnMoKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgY2VudGVyWWVhciA9IHRoaXMuc2VsZWN0ZWREYXRlPy5nZXRGdWxsWWVhcigpID8/IHRoaXMuY3VycmVudFllYXI7XHJcbiAgICBjb25zdCBzdGFydFllYXIgPSBjZW50ZXJZZWFyIC0gNTtcclxuXHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+IHN0YXJ0WWVhciArIGkpO1xyXG4gIH1cclxuXHJcbiAgaXNTZWxlY3RlZChkYXk6IHsgZGF5OiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlciB9KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgZGF5LmRheSA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0RGF0ZSgpICYmXHJcbiAgICAgIGRheS5tb250aCA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSAmJlxyXG4gICAgICBkYXkueWVhciA9PT0gdGhpcy5zZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGlzTW9udGhTZWxlY3RlZChtb250aDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGU/LmdldE1vbnRoKCkgPT09IG1vbnRoICYmIHRoaXMuc2VsZWN0ZWREYXRlPy5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRZZWFyO1xyXG4gIH1cclxuXHJcbiAgaXNZZWFyU2VsZWN0ZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERhdGU/LmdldEZ1bGxZZWFyKCkgPT09IHllYXI7XHJcbiAgfVxyXG5cclxuICBpc0RhdGVFbmFibGVkKGRheTogeyBkYXk6IG51bWJlciwgbW9udGg6IG51bWJlciwgeWVhcjogbnVtYmVyIH0pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXkueWVhciwgZGF5Lm1vbnRoLCBkYXkuZGF5KTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICghdGhpcy5fbWluRGF0ZSB8fCBkYXRlID49IHRoaXMuX21pbkRhdGUpICYmXHJcbiAgICAgICghdGhpcy5fbWF4RGF0ZSB8fCBkYXRlIDw9IHRoaXMuX21heERhdGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaXNNb250aERpc2FibGVkKG1vbnRoOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5fbWluRGF0ZSAmJiAhdGhpcy5fbWF4RGF0ZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0T2ZNb250aCA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIG1vbnRoLCAxKTtcclxuICAgIGNvbnN0IGVuZE9mTW9udGggPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCBtb250aCArIDEsIDApO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgICghIXRoaXMuX21pbkRhdGUgJiYgIWlzTmFOKHRoaXMuX21pbkRhdGUuZ2V0VGltZSgpKSAmJiBlbmRPZk1vbnRoIDwgdGhpcy5fbWluRGF0ZSkgfHxcclxuICAgICAgKCEhdGhpcy5fbWF4RGF0ZSAmJiAhaXNOYU4odGhpcy5fbWF4RGF0ZS5nZXRUaW1lKCkpICYmIHN0YXJ0T2ZNb250aCA+IHRoaXMuX21heERhdGUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuX21pbkRhdGUgJiYgIXRoaXMuX21heERhdGUpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBtaW5ZZWFyID0gdGhpcy5fbWluRGF0ZSAmJiAhaXNOYU4odGhpcy5fbWluRGF0ZS5nZXRUaW1lKCkpID8gdGhpcy5fbWluRGF0ZS5nZXRGdWxsWWVhcigpIDogbnVsbDtcclxuICAgIGNvbnN0IG1heFllYXIgPSB0aGlzLl9tYXhEYXRlICYmICFpc05hTih0aGlzLl9tYXhEYXRlLmdldFRpbWUoKSkgPyB0aGlzLl9tYXhEYXRlLmdldEZ1bGxZZWFyKCkgOiBudWxsO1xyXG5cclxuICAgIHJldHVybiAobWluWWVhciAhPT0gbnVsbCAmJiB5ZWFyIDwgbWluWWVhcikgfHwgKG1heFllYXIgIT09IG51bGwgJiYgeWVhciA+IG1heFllYXIpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0RGF0ZShkYXk6IHsgZGF5OiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlciB9KSB7XHJcbiAgICBpZiAoIXRoaXMuaXNEYXRlRW5hYmxlZChkYXkpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGRheS55ZWFyLCBkYXkubW9udGgsIGRheS5kYXkpO1xyXG5cclxuICAgIHRoaXMuZGF0ZVNlbGVjdGVkLmVtaXQoZGF0ZSk7XHJcblxyXG4gICAgY29uc3QgbmVlZHNVcGRhdGUgPSBkYXkubW9udGggIT09IHRoaXMuY3VycmVudE1vbnRoIHx8IGRheS55ZWFyICE9PSB0aGlzLmN1cnJlbnRZZWFyO1xyXG5cclxuICAgIGlmIChuZWVkc1VwZGF0ZSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IGRheS5tb250aDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRZZWFyID0gZGF5LnllYXI7XHJcblxyXG4gICAgICAgIHRoaXMuX2RldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0TW9udGgobW9udGg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoKSkgcmV0dXJuO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IG1vbnRoO1xyXG4gICAgICB0aGlzLnZpZXcgPSAnZGF5cyc7XHJcblxyXG4gICAgICB0aGlzLl9kZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZWxlY3RZZWFyKHllYXI6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhcikpIHJldHVybjtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5jdXJyZW50WWVhciA9IHllYXI7XHJcbiAgICAgIHRoaXMudmlldyA9ICdtb250aHMnO1xyXG5cclxuICAgICAgdGhpcy5fZGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlTW9udGgob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIGxldCBuZXdNb250aCA9IHRoaXMuY3VycmVudE1vbnRoICsgb2Zmc2V0O1xyXG4gICAgbGV0IG5ld1llYXIgPSB0aGlzLmN1cnJlbnRZZWFyO1xyXG5cclxuICAgIGlmIChuZXdNb250aCA8IDApIHtcclxuICAgICAgbmV3TW9udGggPSAxMTtcclxuICAgICAgbmV3WWVhci0tO1xyXG4gICAgfSBlbHNlIGlmIChuZXdNb250aCA+IDExKSB7XHJcbiAgICAgIG5ld01vbnRoID0gMDtcclxuICAgICAgbmV3WWVhcisrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3VycmVudE1vbnRoID0gbmV3TW9udGg7XHJcbiAgICB0aGlzLmN1cnJlbnRZZWFyID0gbmV3WWVhcjtcclxuICAgIHRoaXMuX2RldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlWWVhclJhbmdlKG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRZZWFyICs9IG9mZnNldCAqIDEyO1xyXG4gICAgdGhpcy5fZGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBpc1ByZXZpb3VzTW9udGhEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5fbWluRGF0ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCAwKSA8IHRoaXMuX21pbkRhdGU7XHJcbiAgfVxyXG5cclxuICBpc05leHRNb250aERpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLl9tYXhEYXRlKSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGggKyAxLCAxKSA+IHRoaXMuX21heERhdGU7XHJcbiAgfVxyXG5cclxuICBpc1ByZXZpb3VzWWVhclJhbmdlRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuX21pbkRhdGUpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLmdldFllYXJzKClbMF0gPD0gdGhpcy5fbWluRGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gIH1cclxuXHJcbiAgaXNOZXh0WWVhclJhbmdlRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuX21heERhdGUpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLmdldFllYXJzKClbdGhpcy5nZXRZZWFycygpLmxlbmd0aCAtIDFdID49IHRoaXMuX21heERhdGUuZ2V0RnVsbFllYXIoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNhbGVuZGFyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlclwiPlxyXG4gICAgQGlmICh2aWV3ID09PSAnZGF5cycpIHtcclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idXR0b25cIiAoY2xpY2spPVwiY2hhbmdlTW9udGgoLTEpXCIgW2Rpc2FibGVkXT1cImlzUHJldmlvdXNNb250aERpc2FibGVkKClcIj5cclxuICAgICAgICDina5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcblxyXG4gICAgQGlmICh2aWV3ID09PSAneWVhcnMnKSB7XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtYnV0dG9uXCIgKGNsaWNrKT1cImNoYW5nZVllYXJSYW5nZSgtMSlcIiBbZGlzYWJsZWRdPVwiaXNQcmV2aW91c1llYXJSYW5nZURpc2FibGVkKClcIj5cclxuICAgICAgICDina5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcblxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cImhlYWRlci1idXR0b25cIiAoY2xpY2spPVwic3dpdGNoVmlldygpXCI+XHJcbiAgICAgIHt7IGhlYWRlclRleHQgfX1cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIEBpZiAodmlldyA9PT0gJ2RheXMnKSB7XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtYnV0dG9uXCIgKGNsaWNrKT1cImNoYW5nZU1vbnRoKDEpXCIgW2Rpc2FibGVkXT1cImlzTmV4dE1vbnRoRGlzYWJsZWQoKVwiPlxyXG4gICAgICAgIOKdr1xyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuXHJcbiAgICBAaWYgKHZpZXcgPT09ICd5ZWFycycpIHtcclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idXR0b25cIiAoY2xpY2spPVwiY2hhbmdlWWVhclJhbmdlKDEpXCIgW2Rpc2FibGVkXT1cImlzTmV4dFllYXJSYW5nZURpc2FibGVkKClcIj5cclxuICAgICAgICDina9cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG4gIEBzd2l0Y2ggKHZpZXcpIHtcclxuICAgIEBjYXNlICgneWVhcnMnKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ5ZWFyLWdyaWRcIj5cclxuICAgICAgICBAZm9yICh5ZWFyIG9mIGdldFllYXJzKCk7IHRyYWNrIHllYXIpIHtcclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJ5ZWFyXCJcclxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzWWVhclNlbGVjdGVkKHllYXIpXCJcclxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzWWVhckRpc2FibGVkKHllYXIpXCJcclxuICAgICAgICAgICAgW2NsYXNzLmhvdmVyYWJsZV09XCIhaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IHllYXIgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICBAY2FzZSAoJ21vbnRocycpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLWdyaWRcIj5cclxuICAgICAgICBAZm9yIChtb250aCBvZiBtb250aHM7IHRyYWNrIG1vbnRoKSB7XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwibW9udGhcIlxyXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoKVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQobW9udGgpXCJcclxuICAgICAgICAgICAgW2NsYXNzLmhvdmVyYWJsZV09XCIhaXNNb250aERpc2FibGVkKG1vbnRoKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNb250aChtb250aClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBtb250aE5hbWVzW21vbnRoXSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIEBkZWZhdWx0IHtcclxuICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWdyaWRcIj5cclxuICAgICAgICBAZm9yIChkYXkgb2YgZGF5c09mV2VlazsgdHJhY2sgZGF5KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5LWhlYWRlclwiPnt7IGRheSB9fTwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQGZvciAoZGF5IG9mIGdldENhbGVuZGFyRGF5cygpOyB0cmFjayBkYXkpIHtcclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJkYXlcIlxyXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChkYXkpXCJcclxuICAgICAgICAgICAgW2NsYXNzLm90aGVyLW1vbnRoXT1cImRheS5tb250aCAhPT0gY3VycmVudE1vbnRoXCJcclxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFpc0RhdGVFbmFibGVkKGRheSlcIlxyXG4gICAgICAgICAgICBbY2xhc3MuaG92ZXJhYmxlXT1cImlzRGF0ZUVuYWJsZWQoZGF5KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBkYXkuZGF5IH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export function formatDate(date, format) {
|
|
2
|
+
const pad = (n) => n.toString().padStart(2, '0');
|
|
3
|
+
const map = {
|
|
4
|
+
'DD': pad(date.getDate()),
|
|
5
|
+
'MM': pad(date.getMonth() + 1),
|
|
6
|
+
'YYYY': date.getFullYear().toString()
|
|
7
|
+
};
|
|
8
|
+
return format.replace(/DD|MM|YYYY/g, match => map[match]);
|
|
9
|
+
}
|
|
10
|
+
export function toOutputFormat(date) {
|
|
11
|
+
const pad = (n) => n.toString().padStart(2, '0');
|
|
12
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
13
|
+
}
|
|
14
|
+
export function isValidDate(date) {
|
|
15
|
+
return date instanceof Date && !isNaN(date.getTime());
|
|
16
|
+
}
|
|
17
|
+
export function getDaysInMonth(year, month) {
|
|
18
|
+
return new Date(year, month + 1, 0).getDate();
|
|
19
|
+
}
|
|
20
|
+
export function isDateInRange(date, minDate, maxDate) {
|
|
21
|
+
const min = minDate ? cleanDate(minDate) : null;
|
|
22
|
+
const max = maxDate ? cleanDate(maxDate) : null;
|
|
23
|
+
return (!min || date >= min) && (!max || date <= max);
|
|
24
|
+
}
|
|
25
|
+
export function clampDate(date, minDate, maxDate) {
|
|
26
|
+
const min = minDate ? cleanDate(minDate) : null;
|
|
27
|
+
const max = maxDate ? cleanDate(maxDate) : null;
|
|
28
|
+
if (min && date < min)
|
|
29
|
+
return new Date(min);
|
|
30
|
+
if (max && date > max)
|
|
31
|
+
return new Date(max);
|
|
32
|
+
return date;
|
|
33
|
+
}
|
|
34
|
+
export function getRangeErrorMessage(date, minDate, maxDate) {
|
|
35
|
+
const min = minDate ? cleanDate(minDate) : null;
|
|
36
|
+
const max = maxDate ? cleanDate(maxDate) : null;
|
|
37
|
+
if (min && date < min)
|
|
38
|
+
return 'Дата меньше минимальной';
|
|
39
|
+
if (max && date > max)
|
|
40
|
+
return 'Дата больше максимальной';
|
|
41
|
+
return '';
|
|
42
|
+
}
|
|
43
|
+
export function parseInputDate(dateStr) {
|
|
44
|
+
if (dateStr) {
|
|
45
|
+
const [year, month, day] = dateStr.split('-').map(Number);
|
|
46
|
+
const date = new Date(year, month - 1, day);
|
|
47
|
+
return isValidDate(date) ? date : null;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function adjustInvalidDate(year, month, day) {
|
|
54
|
+
const maxDays = getDaysInMonth(year, month);
|
|
55
|
+
if (day > maxDays) {
|
|
56
|
+
month += 1;
|
|
57
|
+
if (month > 11) {
|
|
58
|
+
month = 0;
|
|
59
|
+
year += 1;
|
|
60
|
+
}
|
|
61
|
+
day = 1;
|
|
62
|
+
}
|
|
63
|
+
year = Math.min(Math.max(year, 1900), 9999);
|
|
64
|
+
month = Math.min(Math.max(month, 0), 11);
|
|
65
|
+
return { year, month, day };
|
|
66
|
+
}
|
|
67
|
+
export const cleanDate = (date) => {
|
|
68
|
+
return new Date(new Date(date).setHours(0, 0, 0, 0));
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGEtdWkvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vaW5wdXQtZGF0ZS9oZWxwZXJzL2RhdGUtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVUsRUFBRSxNQUFjO0lBQ25ELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxNQUFNLEdBQUcsR0FBOEI7UUFDckMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQ3RDLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBVTtJQUN2QyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekQsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFB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QUFZLEVBQUUsS0FBYSxFQUFFLEdBQVc7SUFDeEUsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1QyxJQUFJLEdBQUcsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUNsQixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ1gsSUFBSSxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDZixLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ1YsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNaLENBQUM7UUFDRCxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUNELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQVEsRUFBRTtJQUM5QyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RELENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGU6IERhdGUsIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBwYWQgPSAobjogbnVtYmVyKSA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICBjb25zdCBtYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAnREQnOiBwYWQoZGF0ZS5nZXREYXRlKCkpLFxyXG4gICAgJ01NJzogcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpLFxyXG4gICAgJ1lZWVknOiBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKVxyXG4gIH07XHJcbiAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC9ERHxNTXxZWVlZL2csIG1hdGNoID0+IG1hcFttYXRjaF0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9PdXRwdXRGb3JtYXQoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XHJcbiAgY29uc3QgcGFkID0gKG46IG51bWJlcikgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgcmV0dXJuIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtwYWQoZGF0ZS5nZXRNb250aCgpICsgMSl9LSR7cGFkKGRhdGUuZ2V0RGF0ZSgpKX1gO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcclxuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVJblJhbmdlKGRhdGU6IERhdGUsIG1pbkRhdGU6IHN0cmluZyB8IG51bGwsIG1heERhdGU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcclxuICBjb25zdCBtaW4gPSBtaW5EYXRlID8gY2xlYW5EYXRlKG1pbkRhdGUpIDogbnVsbDtcclxuICBjb25zdCBtYXggPSBtYXhEYXRlID8gY2xlYW5EYXRlKG1heERhdGUpIDogbnVsbDtcclxuXHJcbiAgcmV0dXJuICghbWluIHx8IGRhdGUgPj0gbWluKSAmJiAoIW1heCB8fCBkYXRlIDw9IG1heCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjbGFtcERhdGUoZGF0ZTogRGF0ZSwgbWluRGF0ZTogc3RyaW5nIHwgbnVsbCwgbWF4RGF0ZTogc3RyaW5nIHwgbnVsbCk6IERhdGUge1xyXG4gIGNvbnN0IG1pbiA9IG1pbkRhdGUgPyBjbGVhbkRhdGUobWluRGF0ZSkgOiBudWxsO1xyXG4gIGNvbnN0IG1heCA9IG1heERhdGUgPyBjbGVhbkRhdGUobWF4RGF0ZSkgOiBudWxsO1xyXG5cclxuICBpZiAobWluICYmIGRhdGUgPCBtaW4pIHJldHVybiBuZXcgRGF0ZShtaW4pO1xyXG4gIGlmIChtYXggJiYgZGF0ZSA+IG1heCkgcmV0dXJuIG5ldyBEYXRlKG1heCk7XHJcblxyXG4gIHJldHVybiBkYXRlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZ2VFcnJvck1lc3NhZ2UoZGF0ZTogRGF0ZSwgbWluRGF0ZTogc3RyaW5nIHwgbnVsbCwgbWF4RGF0ZTogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgY29uc3QgbWluID0gbWluRGF0ZSA/IGNsZWFuRGF0ZShtaW5EYXRlKSA6IG51bGw7XHJcbiAgY29uc3QgbWF4ID0gbWF4RGF0ZSA/IGNsZWFuRGF0ZShtYXhEYXRlKSA6IG51bGw7XHJcblxyXG4gIGlmIChtaW4gJiYgZGF0ZSA8IG1pbikgcmV0dXJuICfQlNCw0YLQsCDQvNC10L3RjNGI0LUg0LzQuNC90LjQvNCw0LvRjNC90L7QuSc7XHJcbiAgaWYgKG1heCAmJiBkYXRlID4gbWF4KSByZXR1cm4gJ9CU0LDRgtCwINCx0L7Qu9GM0YjQtSDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LknO1xyXG5cclxuICByZXR1cm4gJyc7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlucHV0RGF0ZShkYXRlU3RyOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XHJcbiAgaWYgKGRhdGVTdHIpIHtcclxuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IGRhdGVTdHIuc3BsaXQoJy0nKS5tYXAoTnVtYmVyKTtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XHJcbiAgICByZXR1cm4gaXNWYWxpZERhdGUoZGF0ZSkgPyBkYXRlIDogbnVsbFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkanVzdEludmFsaWREYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIpOiB7IHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIgfSB7XHJcbiAgY29uc3QgbWF4RGF5cyA9IGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKTtcclxuICBpZiAoZGF5ID4gbWF4RGF5cykge1xyXG4gICAgbW9udGggKz0gMTtcclxuICAgIGlmIChtb250aCA+IDExKSB7XHJcbiAgICAgIG1vbnRoID0gMDtcclxuICAgICAgeWVhciArPSAxO1xyXG4gICAgfVxyXG4gICAgZGF5ID0gMTtcclxuICB9XHJcbiAgeWVhciA9IE1hdGgubWluKE1hdGgubWF4KHllYXIsIDE5MDApLCA5OTk5KTtcclxuICBtb250aCA9IE1hdGgubWluKE1hdGgubWF4KG1vbnRoLCAwKSwgMTEpO1xyXG4gIHJldHVybiB7IHllYXIsIG1vbnRoLCBkYXkgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGNsZWFuRGF0ZSA9IChkYXRlOiBzdHJpbmcpOiBEYXRlID0+IHtcclxuICByZXR1cm4gbmV3IERhdGUobmV3IERhdGUoZGF0ZSkuc2V0SG91cnMoMCwgMCwgMCwgMCkpXHJcbn1cclxuIl19
|