@f1softinternational/f1-nepali-date-picker 1.0.0
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/README.md +215 -0
- package/esm2022/f1softinternational-f1-nepali-date-picker.mjs +5 -0
- package/esm2022/lib/components/nepali-date-picker/nepali-date-picker.component.mjs +234 -0
- package/esm2022/lib/f1-nepali-date-picker.module.mjs +20 -0
- package/esm2022/lib/models/nepali-date.model.mjs +258 -0
- package/esm2022/lib/services/date-converter.service.mjs +155 -0
- package/esm2022/lib/utils/bs-calendar-data.mjs +202 -0
- package/esm2022/public-api.mjs +14 -0
- package/fesm2022/f1softinternational-f1-nepali-date-picker.mjs +871 -0
- package/fesm2022/f1softinternational-f1-nepali-date-picker.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/nepali-date-picker/nepali-date-picker.component.d.ts +67 -0
- package/lib/f1-nepali-date-picker.module.d.ts +7 -0
- package/lib/models/nepali-date.model.d.ts +106 -0
- package/lib/services/date-converter.service.d.ts +75 -0
- package/lib/utils/bs-calendar-data.d.ts +62 -0
- package/package.json +47 -0
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { BS_CALENDAR_DATA, BS_MONTHS_EN, BS_MONTHS_NP, BS_MIN_YEAR, BS_MAX_YEAR, AD_EPOCH, BS_EPOCH, getDaysInBSMonth, toNepaliDigits, } from '../utils/bs-calendar-data';
|
|
2
|
+
/**
|
|
3
|
+
* NepaliDate - Represents a date in the Bikram Sambat (BS) calendar
|
|
4
|
+
*/
|
|
5
|
+
export class NepaliDate {
|
|
6
|
+
constructor(year, month, day) {
|
|
7
|
+
this._year = year;
|
|
8
|
+
this._month = month;
|
|
9
|
+
this._day = day;
|
|
10
|
+
}
|
|
11
|
+
// Getters
|
|
12
|
+
get year() {
|
|
13
|
+
return this._year;
|
|
14
|
+
}
|
|
15
|
+
get month() {
|
|
16
|
+
return this._month;
|
|
17
|
+
}
|
|
18
|
+
get day() {
|
|
19
|
+
return this._day;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create NepaliDate from current date
|
|
23
|
+
*/
|
|
24
|
+
static today() {
|
|
25
|
+
return NepaliDate.fromAD(new Date());
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create NepaliDate from AD Date
|
|
29
|
+
*/
|
|
30
|
+
static fromAD(adDate) {
|
|
31
|
+
// Calculate days from epoch
|
|
32
|
+
const epochTime = AD_EPOCH.getTime();
|
|
33
|
+
const targetTime = new Date(adDate.getFullYear(), adDate.getMonth(), adDate.getDate()).getTime();
|
|
34
|
+
let daysDiff = Math.floor((targetTime - epochTime) / (1000 * 60 * 60 * 24));
|
|
35
|
+
if (daysDiff < 0) {
|
|
36
|
+
throw new Error('Date is before supported range');
|
|
37
|
+
}
|
|
38
|
+
let bsYear = BS_EPOCH.year;
|
|
39
|
+
let bsMonth = BS_EPOCH.month;
|
|
40
|
+
let bsDay = BS_EPOCH.day;
|
|
41
|
+
// Add days
|
|
42
|
+
while (daysDiff > 0) {
|
|
43
|
+
const daysInMonth = getDaysInBSMonth(bsYear, bsMonth);
|
|
44
|
+
const daysRemainingInMonth = daysInMonth - bsDay;
|
|
45
|
+
if (daysDiff <= daysRemainingInMonth) {
|
|
46
|
+
bsDay += daysDiff;
|
|
47
|
+
daysDiff = 0;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
daysDiff -= daysRemainingInMonth + 1;
|
|
51
|
+
bsMonth++;
|
|
52
|
+
bsDay = 1;
|
|
53
|
+
if (bsMonth > 12) {
|
|
54
|
+
bsMonth = 1;
|
|
55
|
+
bsYear++;
|
|
56
|
+
if (bsYear > BS_MAX_YEAR) {
|
|
57
|
+
throw new Error(`Date exceeds supported range (max: ${BS_MAX_YEAR} BS)`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return new NepaliDate(bsYear, bsMonth, bsDay);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Convert to AD Date
|
|
66
|
+
*/
|
|
67
|
+
toAD() {
|
|
68
|
+
if (!this.isValid()) {
|
|
69
|
+
throw new Error('Invalid NepaliDate');
|
|
70
|
+
}
|
|
71
|
+
let totalDays = 0;
|
|
72
|
+
// Add days for complete years
|
|
73
|
+
for (let year = BS_EPOCH.year; year < this._year; year++) {
|
|
74
|
+
const yearData = BS_CALENDAR_DATA[year];
|
|
75
|
+
if (yearData) {
|
|
76
|
+
totalDays += yearData.reduce((sum, days) => sum + days, 0);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Add days for complete months in current year
|
|
80
|
+
for (let month = 1; month < this._month; month++) {
|
|
81
|
+
totalDays += getDaysInBSMonth(this._year, month);
|
|
82
|
+
}
|
|
83
|
+
// Add remaining days
|
|
84
|
+
totalDays += this._day - 1;
|
|
85
|
+
// Calculate AD date from epoch
|
|
86
|
+
const adDate = new Date(AD_EPOCH);
|
|
87
|
+
adDate.setDate(adDate.getDate() + totalDays);
|
|
88
|
+
return adDate;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if the date is valid
|
|
92
|
+
*/
|
|
93
|
+
isValid() {
|
|
94
|
+
// Check year range
|
|
95
|
+
if (this._year < BS_MIN_YEAR || this._year > BS_MAX_YEAR) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
// Check month range
|
|
99
|
+
if (this._month < 1 || this._month > 12) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
// Check day range
|
|
103
|
+
const daysInMonth = getDaysInBSMonth(this._year, this._month);
|
|
104
|
+
if (this._day < 1 || this._day > daysInMonth) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get the day of week (0 = Sunday, 6 = Saturday)
|
|
111
|
+
*/
|
|
112
|
+
getDay() {
|
|
113
|
+
return this.toAD().getDay();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get month name in specified language
|
|
117
|
+
*/
|
|
118
|
+
getMonthName(lang = 'en') {
|
|
119
|
+
return lang === 'np' ? BS_MONTHS_NP[this._month - 1] : BS_MONTHS_EN[this._month - 1];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Format date according to pattern
|
|
123
|
+
* Patterns:
|
|
124
|
+
* YYYY - 4-digit year
|
|
125
|
+
* YY - 2-digit year
|
|
126
|
+
* MM - 2-digit month
|
|
127
|
+
* M - month without leading zero
|
|
128
|
+
* DD - 2-digit day
|
|
129
|
+
* D - day without leading zero
|
|
130
|
+
* MMMM - full month name (English)
|
|
131
|
+
* mmmm - full month name (Nepali)
|
|
132
|
+
*/
|
|
133
|
+
format(pattern = 'YYYY-MM-DD', useNepaliDigits = false) {
|
|
134
|
+
let result = pattern;
|
|
135
|
+
// Replace patterns (order matters - longer patterns first)
|
|
136
|
+
result = result.replace(/YYYY/g, String(this._year).padStart(4, '0'));
|
|
137
|
+
result = result.replace(/YY/g, String(this._year).slice(-2));
|
|
138
|
+
result = result.replace(/MMMM/g, BS_MONTHS_EN[this._month - 1]);
|
|
139
|
+
result = result.replace(/mmmm/g, BS_MONTHS_NP[this._month - 1]);
|
|
140
|
+
result = result.replace(/MM/g, String(this._month).padStart(2, '0'));
|
|
141
|
+
result = result.replace(/M/g, String(this._month));
|
|
142
|
+
result = result.replace(/DD/g, String(this._day).padStart(2, '0'));
|
|
143
|
+
result = result.replace(/D/g, String(this._day));
|
|
144
|
+
if (useNepaliDigits) {
|
|
145
|
+
result = toNepaliDigits(result);
|
|
146
|
+
}
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Create a clone of this date
|
|
151
|
+
*/
|
|
152
|
+
clone() {
|
|
153
|
+
return new NepaliDate(this._year, this._month, this._day);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Compare with another NepaliDate
|
|
157
|
+
* Returns: -1 if this < other, 0 if equal, 1 if this > other
|
|
158
|
+
*/
|
|
159
|
+
compareTo(other) {
|
|
160
|
+
if (this._year !== other._year) {
|
|
161
|
+
return this._year < other._year ? -1 : 1;
|
|
162
|
+
}
|
|
163
|
+
if (this._month !== other._month) {
|
|
164
|
+
return this._month < other._month ? -1 : 1;
|
|
165
|
+
}
|
|
166
|
+
if (this._day !== other._day) {
|
|
167
|
+
return this._day < other._day ? -1 : 1;
|
|
168
|
+
}
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if this date is before another
|
|
173
|
+
*/
|
|
174
|
+
isBefore(other) {
|
|
175
|
+
return this.compareTo(other) < 0;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if this date is after another
|
|
179
|
+
*/
|
|
180
|
+
isAfter(other) {
|
|
181
|
+
return this.compareTo(other) > 0;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check if this date equals another
|
|
185
|
+
*/
|
|
186
|
+
equals(other) {
|
|
187
|
+
return this.compareTo(other) === 0;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Add days to date (returns new NepaliDate)
|
|
191
|
+
*/
|
|
192
|
+
addDays(days) {
|
|
193
|
+
const adDate = this.toAD();
|
|
194
|
+
adDate.setDate(adDate.getDate() + days);
|
|
195
|
+
return NepaliDate.fromAD(adDate);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Add months to date (returns new NepaliDate)
|
|
199
|
+
*/
|
|
200
|
+
addMonths(months) {
|
|
201
|
+
let newYear = this._year;
|
|
202
|
+
let newMonth = this._month + months;
|
|
203
|
+
while (newMonth > 12) {
|
|
204
|
+
newMonth -= 12;
|
|
205
|
+
newYear++;
|
|
206
|
+
}
|
|
207
|
+
while (newMonth < 1) {
|
|
208
|
+
newMonth += 12;
|
|
209
|
+
newYear--;
|
|
210
|
+
}
|
|
211
|
+
// Adjust day if it exceeds days in new month
|
|
212
|
+
const daysInNewMonth = getDaysInBSMonth(newYear, newMonth);
|
|
213
|
+
const newDay = Math.min(this._day, daysInNewMonth);
|
|
214
|
+
return new NepaliDate(newYear, newMonth, newDay);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Add years to date (returns new NepaliDate)
|
|
218
|
+
*/
|
|
219
|
+
addYears(years) {
|
|
220
|
+
const newYear = this._year + years;
|
|
221
|
+
const daysInNewMonth = getDaysInBSMonth(newYear, this._month);
|
|
222
|
+
const newDay = Math.min(this._day, daysInNewMonth);
|
|
223
|
+
return new NepaliDate(newYear, this._month, newDay);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get string representation
|
|
227
|
+
*/
|
|
228
|
+
toString() {
|
|
229
|
+
return this.format('YYYY-MM-DD');
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Convert to plain object
|
|
233
|
+
*/
|
|
234
|
+
toObject() {
|
|
235
|
+
return {
|
|
236
|
+
year: this._year,
|
|
237
|
+
month: this._month,
|
|
238
|
+
day: this._day,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Create from plain object
|
|
243
|
+
*/
|
|
244
|
+
static fromObject(obj) {
|
|
245
|
+
return new NepaliDate(obj.year, obj.month, obj.day);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Parse from string (YYYY-MM-DD format)
|
|
249
|
+
*/
|
|
250
|
+
static parse(dateString) {
|
|
251
|
+
const parts = dateString.split('-').map(Number);
|
|
252
|
+
if (parts.length !== 3 || parts.some(isNaN)) {
|
|
253
|
+
throw new Error('Invalid date format. Expected YYYY-MM-DD');
|
|
254
|
+
}
|
|
255
|
+
return new NepaliDate(parts[0], parts[1], parts[2]);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVwYWxpLWRhdGUubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mMS1uZXBhbGktZGF0ZS1waWNrZXIvc3JjL2xpYi9tb2RlbHMvbmVwYWxpLWRhdGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGdCQUFnQixFQUNoQixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxXQUFXLEVBQ1gsUUFBUSxFQUNSLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNqQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFLbkIsWUFBWSxJQUFZLEVBQUUsS0FBYSxFQUFFLEdBQVc7UUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDcEIsQ0FBQztJQUVELFVBQVU7SUFDVixJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUFLO1FBQ1IsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQVk7UUFDdEIsNEJBQTRCO1FBQzVCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pHLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTVFLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM3QixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBRXpCLFdBQVc7UUFDWCxPQUFPLFFBQVEsR0FBRyxDQUFDLEVBQUU7WUFDakIsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUVqRCxJQUFJLFFBQVEsSUFBSSxvQkFBb0IsRUFBRTtnQkFDbEMsS0FBSyxJQUFJLFFBQVEsQ0FBQztnQkFDbEIsUUFBUSxHQUFHLENBQUMsQ0FBQzthQUNoQjtpQkFBTTtnQkFDSCxRQUFRLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLEVBQUUsQ0FBQztnQkFDVixLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUVWLElBQUksT0FBTyxHQUFHLEVBQUUsRUFBRTtvQkFDZCxPQUFPLEdBQUcsQ0FBQyxDQUFDO29CQUNaLE1BQU0sRUFBRSxDQUFDO29CQUNULElBQUksTUFBTSxHQUFHLFdBQVcsRUFBRTt3QkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsV0FBVyxNQUFNLENBQUMsQ0FBQztxQkFDNUU7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztTQUN6QztRQUVELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVsQiw4QkFBOEI7UUFDOUIsS0FBSyxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3RELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLElBQUksUUFBUSxFQUFFO2dCQUNWLFNBQVMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzthQUM5RDtTQUNKO1FBRUQsK0NBQStDO1FBQy9DLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3BEO1FBRUQscUJBQXFCO1FBQ3JCLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUUzQiwrQkFBK0I7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUM7UUFFN0MsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNILG1CQUFtQjtRQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxFQUFFO1lBQ3RELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsb0JBQW9CO1FBQ3BCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDckMsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxrQkFBa0I7UUFDbEIsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsRUFBRTtZQUMxQyxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsT0FBb0IsSUFBSTtRQUNqQyxPQUFPLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQUMsVUFBa0IsWUFBWSxFQUFFLGtCQUEyQixLQUFLO1FBQ25FLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUVyQiwyREFBMkQ7UUFDM0QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFakQsSUFBSSxlQUFlLEVBQUU7WUFDakIsTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENB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dGVudCI6WyJpbXBvcnQge1xuICAgIEJTX0NBTEVOREFSX0RBVEEsXG4gICAgQlNfTU9OVEhTX0VOLFxuICAgIEJTX01PTlRIU19OUCxcbiAgICBCU19NSU5fWUVBUixcbiAgICBCU19NQVhfWUVBUixcbiAgICBBRF9FUE9DSCxcbiAgICBCU19FUE9DSCxcbiAgICBnZXREYXlzSW5CU01vbnRoLFxuICAgIHRvTmVwYWxpRGlnaXRzLFxufSBmcm9tICcuLi91dGlscy9icy1jYWxlbmRhci1kYXRhJztcblxuLyoqXG4gKiBOZXBhbGlEYXRlIC0gUmVwcmVzZW50cyBhIGRhdGUgaW4gdGhlIEJpa3JhbSBTYW1iYXQgKEJTKSBjYWxlbmRhclxuICovXG5leHBvcnQgY2xhc3MgTmVwYWxpRGF0ZSB7XG4gICAgcHJpdmF0ZSBfeWVhcjogbnVtYmVyO1xuICAgIHByaXZhdGUgX21vbnRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfZGF5OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3llYXIgPSB5ZWFyO1xuICAgICAgICB0aGlzLl9tb250aCA9IG1vbnRoO1xuICAgICAgICB0aGlzLl9kYXkgPSBkYXk7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIGdldCB5ZWFyKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl95ZWFyO1xuICAgIH1cblxuICAgIGdldCBtb250aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9udGg7XG4gICAgfVxuXG4gICAgZ2V0IGRheSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBOZXBhbGlEYXRlIGZyb20gY3VycmVudCBkYXRlXG4gICAgICovXG4gICAgc3RhdGljIHRvZGF5KCk6IE5lcGFsaURhdGUge1xuICAgICAgICByZXR1cm4gTmVwYWxpRGF0ZS5mcm9tQUQobmV3IERhdGUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE5lcGFsaURhdGUgZnJvbSBBRCBEYXRlXG4gICAgICovXG4gICAgc3RhdGljIGZyb21BRChhZERhdGU6IERhdGUpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGRheXMgZnJvbSBlcG9jaFxuICAgICAgICBjb25zdCBlcG9jaFRpbWUgPSBBRF9FUE9DSC5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBuZXcgRGF0ZShhZERhdGUuZ2V0RnVsbFllYXIoKSwgYWREYXRlLmdldE1vbnRoKCksIGFkRGF0ZS5nZXREYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgICAgbGV0IGRheXNEaWZmID0gTWF0aC5mbG9vcigodGFyZ2V0VGltZSAtIGVwb2NoVGltZSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xuXG4gICAgICAgIGlmIChkYXlzRGlmZiA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0ZSBpcyBiZWZvcmUgc3VwcG9ydGVkIHJhbmdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnNZZWFyID0gQlNfRVBPQ0gueWVhcjtcbiAgICAgICAgbGV0IGJzTW9udGggPSBCU19FUE9DSC5tb250aDtcbiAgICAgICAgbGV0IGJzRGF5ID0gQlNfRVBPQ0guZGF5O1xuXG4gICAgICAgIC8vIEFkZCBkYXlzXG4gICAgICAgIHdoaWxlIChkYXlzRGlmZiA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZ2V0RGF5c0luQlNNb250aChic1llYXIsIGJzTW9udGgpO1xuICAgICAgICAgICAgY29uc3QgZGF5c1JlbWFpbmluZ0luTW9udGggPSBkYXlzSW5Nb250aCAtIGJzRGF5O1xuXG4gICAgICAgICAgICBpZiAoZGF5c0RpZmYgPD0gZGF5c1JlbWFpbmluZ0luTW9udGgpIHtcbiAgICAgICAgICAgICAgICBic0RheSArPSBkYXlzRGlmZjtcbiAgICAgICAgICAgICAgICBkYXlzRGlmZiA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRheXNEaWZmIC09IGRheXNSZW1haW5pbmdJbk1vbnRoICsgMTtcbiAgICAgICAgICAgICAgICBic01vbnRoKys7XG4gICAgICAgICAgICAgICAgYnNEYXkgPSAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJzTW9udGggPiAxMikge1xuICAgICAgICAgICAgICAgICAgICBic01vbnRoID0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnNZZWFyKys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChic1llYXIgPiBCU19NQVhfWUVBUikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRlIGV4Y2VlZHMgc3VwcG9ydGVkIHJhbmdlIChtYXg6ICR7QlNfTUFYX1lFQVJ9IEJTKWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOZXBhbGlEYXRlKGJzWWVhciwgYnNNb250aCwgYnNEYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gQUQgRGF0ZVxuICAgICAqL1xuICAgIHRvQUQoKTogRGF0ZSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOZXBhbGlEYXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdG90YWxEYXlzID0gMDtcblxuICAgICAgICAvLyBBZGQgZGF5cyBmb3IgY29tcGxldGUgeWVhcnNcbiAgICAgICAgZm9yIChsZXQgeWVhciA9IEJTX0VQT0NILnllYXI7IHllYXIgPCB0aGlzLl95ZWFyOyB5ZWFyKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJEYXRhID0gQlNfQ0FMRU5EQVJfREFUQVt5ZWFyXTtcbiAgICAgICAgICAgIGlmICh5ZWFyRGF0YSkge1xuICAgICAgICAgICAgICAgIHRvdGFsRGF5cyArPSB5ZWFyRGF0YS5yZWR1Y2UoKHN1bSwgZGF5cykgPT4gc3VtICsgZGF5cywgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZGF5cyBmb3IgY29tcGxldGUgbW9udGhzIGluIGN1cnJlbnQgeWVhclxuICAgICAgICBmb3IgKGxldCBtb250aCA9IDE7IG1vbnRoIDwgdGhpcy5fbW9udGg7IG1vbnRoKyspIHtcbiAgICAgICAgICAgIHRvdGFsRGF5cyArPSBnZXREYXlzSW5CU01vbnRoKHRoaXMuX3llYXIsIG1vbnRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCByZW1haW5pbmcgZGF5c1xuICAgICAgICB0b3RhbERheXMgKz0gdGhpcy5fZGF5IC0gMTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgQUQgZGF0ZSBmcm9tIGVwb2NoXG4gICAgICAgIGNvbnN0IGFkRGF0ZSA9IG5ldyBEYXRlKEFEX0VQT0NIKTtcbiAgICAgICAgYWREYXRlLnNldERhdGUoYWREYXRlLmdldERhdGUoKSArIHRvdGFsRGF5cyk7XG5cbiAgICAgICAgcmV0dXJuIGFkRGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZGF0ZSBpcyB2YWxpZFxuICAgICAqL1xuICAgIGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIENoZWNrIHllYXIgcmFuZ2VcbiAgICAgICAgaWYgKHRoaXMuX3llYXIgPCBCU19NSU5fWUVBUiB8fCB0aGlzLl95ZWFyID4gQlNfTUFYX1lFQVIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIG1vbnRoIHJhbmdlXG4gICAgICAgIGlmICh0aGlzLl9tb250aCA8IDEgfHwgdGhpcy5fbW9udGggPiAxMikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZGF5IHJhbmdlXG4gICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZ2V0RGF5c0luQlNNb250aCh0aGlzLl95ZWFyLCB0aGlzLl9tb250aCk7XG4gICAgICAgIGlmICh0aGlzLl9kYXkgPCAxIHx8IHRoaXMuX2RheSA+IGRheXNJbk1vbnRoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB3ZWVrICgwID0gU3VuZGF5LCA2ID0gU2F0dXJkYXkpXG4gICAgICovXG4gICAgZ2V0RGF5KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQUQoKS5nZXREYXkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbW9udGggbmFtZSBpbiBzcGVjaWZpZWQgbGFuZ3VhZ2VcbiAgICAgKi9cbiAgICBnZXRNb250aE5hbWUobGFuZzogJ2VuJyB8ICducCcgPSAnZW4nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxhbmcgPT09ICducCcgPyBCU19NT05USFNfTlBbdGhpcy5fbW9udGggLSAxXSA6IEJTX01PTlRIU19FTlt0aGlzLl9tb250aCAtIDFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBkYXRlIGFjY29yZGluZyB0byBwYXR0ZXJuXG4gICAgICogUGF0dGVybnM6XG4gICAgICogICBZWVlZIC0gNC1kaWdpdCB5ZWFyXG4gICAgICogICBZWSAgIC0gMi1kaWdpdCB5ZWFyXG4gICAgICogICBNTSAgIC0gMi1kaWdpdCBtb250aFxuICAgICAqICAgTSAgICAtIG1vbnRoIHdpdGhvdXQgbGVhZGluZyB6ZXJvXG4gICAgICogICBERCAgIC0gMi1kaWdpdCBkYXlcbiAgICAgKiAgIEQgICAgLSBkYXkgd2l0aG91dCBsZWFkaW5nIHplcm9cbiAgICAgKiAgIE1NTU0gLSBmdWxsIG1vbnRoIG5hbWUgKEVuZ2xpc2gpXG4gICAgICogICBtbW1tIC0gZnVsbCBtb250aCBuYW1lIChOZXBhbGkpXG4gICAgICovXG4gICAgZm9ybWF0KHBhdHRlcm46IHN0cmluZyA9ICdZWVlZLU1NLUREJywgdXNlTmVwYWxpRGlnaXRzOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0dGVybjtcblxuICAgICAgICAvLyBSZXBsYWNlIHBhdHRlcm5zIChvcmRlciBtYXR0ZXJzIC0gbG9uZ2VyIHBhdHRlcm5zIGZpcnN0KVxuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvWVlZWS9nLCBTdHJpbmcodGhpcy5feWVhcikucGFkU3RhcnQoNCwgJzAnKSk7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9ZWS9nLCBTdHJpbmcodGhpcy5feWVhcikuc2xpY2UoLTIpKTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL01NTU0vZywgQlNfTU9OVEhTX0VOW3RoaXMuX21vbnRoIC0gMV0pO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvbW1tbS9nLCBCU19NT05USFNfTlBbdGhpcy5fbW9udGggLSAxXSk7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9NTS9nLCBTdHJpbmcodGhpcy5fbW9udGgpLnBhZFN0YXJ0KDIsICcwJykpO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvTS9nLCBTdHJpbmcodGhpcy5fbW9udGgpKTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL0REL2csIFN0cmluZyh0aGlzLl9kYXkpLnBhZFN0YXJ0KDIsICcwJykpO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvRC9nLCBTdHJpbmcodGhpcy5fZGF5KSk7XG5cbiAgICAgICAgaWYgKHVzZU5lcGFsaURpZ2l0cykge1xuICAgICAgICAgICAgcmVzdWx0ID0gdG9OZXBhbGlEaWdpdHMocmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBkYXRlXG4gICAgICovXG4gICAgY2xvbmUoKTogTmVwYWxpRGF0ZSB7XG4gICAgICAgIHJldHVybiBuZXcgTmVwYWxpRGF0ZSh0aGlzLl95ZWFyLCB0aGlzLl9tb250aCwgdGhpcy5fZGF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIHdpdGggYW5vdGhlciBOZXBhbGlEYXRlXG4gICAgICogUmV0dXJuczogLTEgaWYgdGhpcyA8IG90aGVyLCAwIGlmIGVxdWFsLCAxIGlmIHRoaXMgPiBvdGhlclxuICAgICAqL1xuICAgIGNvbXBhcmVUbyhvdGhlcjogTmVwYWxpRGF0ZSk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLl95ZWFyICE9PSBvdGhlci5feWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3llYXIgPCBvdGhlci5feWVhciA/IC0xIDogMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbW9udGggIT09IG90aGVyLl9tb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoIDwgb3RoZXIuX21vbnRoID8gLTEgOiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kYXkgIT09IG90aGVyLl9kYXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXkgPCBvdGhlci5fZGF5ID8gLTEgOiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgZGF0ZSBpcyBiZWZvcmUgYW5vdGhlclxuICAgICAqL1xuICAgIGlzQmVmb3JlKG90aGVyOiBOZXBhbGlEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVUbyhvdGhlcikgPCAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgZGF0ZSBpcyBhZnRlciBhbm90aGVyXG4gICAgICovXG4gICAgaXNBZnRlcihvdGhlcjogTmVwYWxpRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlVG8ob3RoZXIpID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIGRhdGUgZXF1YWxzIGFub3RoZXJcbiAgICAgKi9cbiAgICBlcXVhbHMob3RoZXI6IE5lcGFsaURhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVRvKG90aGVyKSA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZGF5cyB0byBkYXRlIChyZXR1cm5zIG5ldyBOZXBhbGlEYXRlKVxuICAgICAqL1xuICAgIGFkZERheXMoZGF5czogbnVtYmVyKTogTmVwYWxpRGF0ZSB7XG4gICAgICAgIGNvbnN0IGFkRGF0ZSA9IHRoaXMudG9BRCgpO1xuICAgICAgICBhZERhdGUuc2V0RGF0ZShhZERhdGUuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgICAgIHJldHVybiBOZXBhbGlEYXRlLmZyb21BRChhZERhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBtb250aHMgdG8gZGF0ZSAocmV0dXJucyBuZXcgTmVwYWxpRGF0ZSlcbiAgICAgKi9cbiAgICBhZGRNb250aHMobW9udGhzOiBudW1iZXIpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgbGV0IG5ld1llYXIgPSB0aGlzLl95ZWFyO1xuICAgICAgICBsZXQgbmV3TW9udGggPSB0aGlzLl9tb250aCArIG1vbnRocztcblxuICAgICAgICB3aGlsZSAobmV3TW9udGggPiAxMikge1xuICAgICAgICAgICAgbmV3TW9udGggLT0gMTI7XG4gICAgICAgICAgICBuZXdZZWFyKys7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5ld01vbnRoIDwgMSkge1xuICAgICAgICAgICAgbmV3TW9udGggKz0gMTI7XG4gICAgICAgICAgICBuZXdZZWFyLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGp1c3QgZGF5IGlmIGl0IGV4Y2VlZHMgZGF5cyBpbiBuZXcgbW9udGhcbiAgICAgICAgY29uc3QgZGF5c0luTmV3TW9udGggPSBnZXREYXlzSW5CU01vbnRoKG5ld1llYXIsIG5ld01vbnRoKTtcbiAgICAgICAgY29uc3QgbmV3RGF5ID0gTWF0aC5taW4odGhpcy5fZGF5LCBkYXlzSW5OZXdNb250aCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOZXBhbGlEYXRlKG5ld1llYXIsIG5ld01vbnRoLCBuZXdEYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB5ZWFycyB0byBkYXRlIChyZXR1cm5zIG5ldyBOZXBhbGlEYXRlKVxuICAgICAqL1xuICAgIGFkZFllYXJzKHllYXJzOiBudW1iZXIpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgY29uc3QgbmV3WWVhciA9IHRoaXMuX3llYXIgKyB5ZWFycztcbiAgICAgICAgY29uc3QgZGF5c0luTmV3TW9udGggPSBnZXREYXlzSW5CU01vbnRoKG5ld1llYXIsIHRoaXMuX21vbnRoKTtcbiAgICAgICAgY29uc3QgbmV3RGF5ID0gTWF0aC5taW4odGhpcy5fZGF5LCBkYXlzSW5OZXdNb250aCk7XG4gICAgICAgIHJldHVybiBuZXcgTmVwYWxpRGF0ZShuZXdZZWFyLCB0aGlzLl9tb250aCwgbmV3RGF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBwbGFpbiBvYmplY3RcbiAgICAgKi9cbiAgICB0b09iamVjdCgpOiB7IHllYXI6IG51bWJlcjsgbW9udGg6IG51bWJlcjsgZGF5OiBudW1iZXIgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiB0aGlzLl95ZWFyLFxuICAgICAgICAgICAgbW9udGg6IHRoaXMuX21vbnRoLFxuICAgICAgICAgICAgZGF5OiB0aGlzLl9kYXksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGZyb20gcGxhaW4gb2JqZWN0XG4gICAgICovXG4gICAgc3RhdGljIGZyb21PYmplY3Qob2JqOiB7IHllYXI6IG51bWJlcjsgbW9udGg6IG51bWJlcjsgZGF5OiBudW1iZXIgfSk6IE5lcGFsaURhdGUge1xuICAgICAgICByZXR1cm4gbmV3IE5lcGFsaURhdGUob2JqLnllYXIsIG9iai5tb250aCwgb2JqLmRheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgZnJvbSBzdHJpbmcgKFlZWVktTU0tREQgZm9ybWF0KVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShkYXRlU3RyaW5nOiBzdHJpbmcpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBkYXRlU3RyaW5nLnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHMuc29tZShpc05hTikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlIGZvcm1hdC4gRXhwZWN0ZWQgWVlZWS1NTS1ERCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTmVwYWxpRGF0ZShwYXJ0c1swXSwgcGFydHNbMV0sIHBhcnRzWzJdKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { NepaliDate } from '../models/nepali-date.model';
|
|
3
|
+
import { BS_CALENDAR_DATA, BS_MONTHS_EN, BS_MONTHS_NP, BS_WEEKDAYS_EN, BS_WEEKDAYS_NP, BS_MIN_YEAR, BS_MAX_YEAR, getDaysInBSMonth, getTotalDaysInBSYear, toNepaliDigits, } from '../utils/bs-calendar-data';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* DateConverterService - Service for BS/AD date conversions and utilities
|
|
7
|
+
*/
|
|
8
|
+
export class DateConverterService {
|
|
9
|
+
/**
|
|
10
|
+
* Convert AD Date to NepaliDate (BS)
|
|
11
|
+
*/
|
|
12
|
+
convertToBS(adDate) {
|
|
13
|
+
return NepaliDate.fromAD(adDate);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convert NepaliDate (BS) to AD Date
|
|
17
|
+
*/
|
|
18
|
+
convertToAD(bsDate) {
|
|
19
|
+
return bsDate.toAD();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get today's date in BS
|
|
23
|
+
*/
|
|
24
|
+
getTodayBS() {
|
|
25
|
+
return NepaliDate.today();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get number of days in a BS month
|
|
29
|
+
*/
|
|
30
|
+
getDaysInMonth(year, month) {
|
|
31
|
+
return getDaysInBSMonth(year, month);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get total days in a BS year
|
|
35
|
+
*/
|
|
36
|
+
getDaysInYear(year) {
|
|
37
|
+
return getTotalDaysInBSYear(year);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get month names
|
|
41
|
+
*/
|
|
42
|
+
getMonthNames(lang = 'en') {
|
|
43
|
+
return lang === 'np' ? [...BS_MONTHS_NP] : [...BS_MONTHS_EN];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get weekday names
|
|
47
|
+
*/
|
|
48
|
+
getWeekdayNames(lang = 'en') {
|
|
49
|
+
return lang === 'np' ? [...BS_WEEKDAYS_NP] : [...BS_WEEKDAYS_EN];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get minimum supported year
|
|
53
|
+
*/
|
|
54
|
+
getMinYear() {
|
|
55
|
+
return BS_MIN_YEAR;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get maximum supported year
|
|
59
|
+
*/
|
|
60
|
+
getMaxYear() {
|
|
61
|
+
return BS_MAX_YEAR;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate a BS date
|
|
65
|
+
*/
|
|
66
|
+
isValidDate(year, month, day) {
|
|
67
|
+
const date = new NepaliDate(year, month, day);
|
|
68
|
+
return date.isValid();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Format a NepaliDate
|
|
72
|
+
*/
|
|
73
|
+
format(date, pattern = 'YYYY-MM-DD', useNepaliDigits = false) {
|
|
74
|
+
return date.format(pattern, useNepaliDigits);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parse a date string to NepaliDate
|
|
78
|
+
*/
|
|
79
|
+
parse(dateString) {
|
|
80
|
+
return NepaliDate.parse(dateString);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convert number to Nepali digits
|
|
84
|
+
*/
|
|
85
|
+
toNepaliDigits(num) {
|
|
86
|
+
return toNepaliDigits(num);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get calendar grid for a month
|
|
90
|
+
* Returns a 2D array representing weeks (rows) and days (columns)
|
|
91
|
+
* Each cell contains the day number or null for empty cells
|
|
92
|
+
*/
|
|
93
|
+
getMonthCalendarGrid(year, month) {
|
|
94
|
+
const daysInMonth = this.getDaysInMonth(year, month);
|
|
95
|
+
const firstDayOfMonth = new NepaliDate(year, month, 1);
|
|
96
|
+
const startDayOfWeek = firstDayOfMonth.getDay(); // 0 = Sunday
|
|
97
|
+
const grid = [];
|
|
98
|
+
let currentWeek = [];
|
|
99
|
+
// Fill empty cells before first day
|
|
100
|
+
for (let i = 0; i < startDayOfWeek; i++) {
|
|
101
|
+
currentWeek.push(null);
|
|
102
|
+
}
|
|
103
|
+
// Fill days
|
|
104
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
105
|
+
currentWeek.push(day);
|
|
106
|
+
if (currentWeek.length === 7) {
|
|
107
|
+
grid.push(currentWeek);
|
|
108
|
+
currentWeek = [];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Fill remaining empty cells in last week
|
|
112
|
+
if (currentWeek.length > 0) {
|
|
113
|
+
while (currentWeek.length < 7) {
|
|
114
|
+
currentWeek.push(null);
|
|
115
|
+
}
|
|
116
|
+
grid.push(currentWeek);
|
|
117
|
+
}
|
|
118
|
+
return grid;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get years range for year selector
|
|
122
|
+
*/
|
|
123
|
+
getYearRange(startYear, endYear) {
|
|
124
|
+
const start = startYear ?? BS_MIN_YEAR;
|
|
125
|
+
const end = endYear ?? BS_MAX_YEAR;
|
|
126
|
+
const years = [];
|
|
127
|
+
for (let year = start; year <= end; year++) {
|
|
128
|
+
if (BS_CALENDAR_DATA[year]) {
|
|
129
|
+
years.push(year);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return years;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if a date is within a range
|
|
136
|
+
*/
|
|
137
|
+
isDateInRange(date, minDate, maxDate) {
|
|
138
|
+
if (minDate && date.isBefore(minDate)) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
if (maxDate && date.isAfter(maxDate)) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
147
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateConverterService, providedIn: 'root' }); }
|
|
148
|
+
}
|
|
149
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateConverterService, decorators: [{
|
|
150
|
+
type: Injectable,
|
|
151
|
+
args: [{
|
|
152
|
+
providedIn: 'root',
|
|
153
|
+
}]
|
|
154
|
+
}] });
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1jb252ZXJ0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YxLW5lcGFsaS1kYXRlLXBpY2tlci9zcmMvbGliL3NlcnZpY2VzL2RhdGUtY29udmVydGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUNILGdCQUFnQixFQUNoQixZQUFZLEVBQ1osWUFBWSxFQUNaLGNBQWMsRUFDZCxjQUFjLEVBQ2QsV0FBVyxFQUNYLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDakIsTUFBTSwyQkFBMkIsQ0FBQzs7QUFFbkM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCOztPQUVHO0lBQ0gsV0FBVyxDQUFDLE1BQVk7UUFDcEIsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxNQUFrQjtRQUMxQixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ04sT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3RDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxJQUFZO1FBQ3RCLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLE9BQW9CLElBQUk7UUFDbEMsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsT0FBb0IsSUFBSTtRQUNwQyxPQUFPLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDTixPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ04sT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsR0FBVztRQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFnQixFQUFFLFVBQWtCLFlBQVksRUFBRSxrQkFBMkIsS0FBSztRQUNyRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFrQjtRQUNwQixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLEdBQW9CO1FBQy9CLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsTUFBTSxlQUFlLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxhQUFhO1FBRTlELE1BQU0sSUFBSSxHQUF3QixFQUFFLENBQUM7UUFDckMsSUFBSSxXQUFXLEdBQXNCLEVBQUUsQ0FBQztRQUV4QyxvQ0FBb0M7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO1FBRUQsWUFBWTtRQUNaLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxXQUFXLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDekMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0QixJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2QixXQUFXLEdBQUcsRUFBRSxDQUFDO2FBQ3BCO1NBQ0o7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN4QixPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUMxQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxTQUFrQixFQUFFLE9BQWdCO1FBQzdDLE1BQU0sS0FBSyxHQUFHLFNBQVMsSUFBSSxXQUFXLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsT0FBTyxJQUFJLFdBQVcsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFFM0IsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN4QyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhLENBQUMsSUFBZ0IsRUFBRSxPQUFvQixFQUFFLE9BQW9CO1FBQ3RFLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQzsrR0FoS1Esb0JBQW9CO21IQUFwQixvQkFBb0IsY0FGakIsTUFBTTs7NEZBRVQsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5lcGFsaURhdGUgfSBmcm9tICcuLi9tb2RlbHMvbmVwYWxpLWRhdGUubW9kZWwnO1xuaW1wb3J0IHtcbiAgICBCU19DQUxFTkRBUl9EQVRBLFxuICAgIEJTX01PTlRIU19FTixcbiAgICBCU19NT05USFNfTlAsXG4gICAgQlNfV0VFS0RBWVNfRU4sXG4gICAgQlNfV0VFS0RBWVNfTlAsXG4gICAgQlNfTUlOX1lFQVIsXG4gICAgQlNfTUFYX1lFQVIsXG4gICAgZ2V0RGF5c0luQlNNb250aCxcbiAgICBnZXRUb3RhbERheXNJbkJTWWVhcixcbiAgICB0b05lcGFsaURpZ2l0cyxcbn0gZnJvbSAnLi4vdXRpbHMvYnMtY2FsZW5kYXItZGF0YSc7XG5cbi8qKlxuICogRGF0ZUNvbnZlcnRlclNlcnZpY2UgLSBTZXJ2aWNlIGZvciBCUy9BRCBkYXRlIGNvbnZlcnNpb25zIGFuZCB1dGlsaXRpZXNcbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZUNvbnZlcnRlclNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQUQgRGF0ZSB0byBOZXBhbGlEYXRlIChCUylcbiAgICAgKi9cbiAgICBjb252ZXJ0VG9CUyhhZERhdGU6IERhdGUpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgcmV0dXJuIE5lcGFsaURhdGUuZnJvbUFEKGFkRGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBOZXBhbGlEYXRlIChCUykgdG8gQUQgRGF0ZVxuICAgICAqL1xuICAgIGNvbnZlcnRUb0FEKGJzRGF0ZTogTmVwYWxpRGF0ZSk6IERhdGUge1xuICAgICAgICByZXR1cm4gYnNEYXRlLnRvQUQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdG9kYXkncyBkYXRlIGluIEJTXG4gICAgICovXG4gICAgZ2V0VG9kYXlCUygpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgcmV0dXJuIE5lcGFsaURhdGUudG9kYXkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbnVtYmVyIG9mIGRheXMgaW4gYSBCUyBtb250aFxuICAgICAqL1xuICAgIGdldERheXNJbk1vbnRoKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBnZXREYXlzSW5CU01vbnRoKHllYXIsIG1vbnRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdG90YWwgZGF5cyBpbiBhIEJTIHllYXJcbiAgICAgKi9cbiAgICBnZXREYXlzSW5ZZWFyKHllYXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBnZXRUb3RhbERheXNJbkJTWWVhcih5ZWFyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbW9udGggbmFtZXNcbiAgICAgKi9cbiAgICBnZXRNb250aE5hbWVzKGxhbmc6ICdlbicgfCAnbnAnID0gJ2VuJyk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGxhbmcgPT09ICducCcgPyBbLi4uQlNfTU9OVEhTX05QXSA6IFsuLi5CU19NT05USFNfRU5dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB3ZWVrZGF5IG5hbWVzXG4gICAgICovXG4gICAgZ2V0V2Vla2RheU5hbWVzKGxhbmc6ICdlbicgfCAnbnAnID0gJ2VuJyk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGxhbmcgPT09ICducCcgPyBbLi4uQlNfV0VFS0RBWVNfTlBdIDogWy4uLkJTX1dFRUtEQVlTX0VOXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbWluaW11bSBzdXBwb3J0ZWQgeWVhclxuICAgICAqL1xuICAgIGdldE1pblllYXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIEJTX01JTl9ZRUFSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBtYXhpbXVtIHN1cHBvcnRlZCB5ZWFyXG4gICAgICovXG4gICAgZ2V0TWF4WWVhcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gQlNfTUFYX1lFQVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgYSBCUyBkYXRlXG4gICAgICovXG4gICAgaXNWYWxpZERhdGUoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IE5lcGFsaURhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgICAgIHJldHVybiBkYXRlLmlzVmFsaWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgYSBOZXBhbGlEYXRlXG4gICAgICovXG4gICAgZm9ybWF0KGRhdGU6IE5lcGFsaURhdGUsIHBhdHRlcm46IHN0cmluZyA9ICdZWVlZLU1NLUREJywgdXNlTmVwYWxpRGlnaXRzOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS5mb3JtYXQocGF0dGVybiwgdXNlTmVwYWxpRGlnaXRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBhIGRhdGUgc3RyaW5nIHRvIE5lcGFsaURhdGVcbiAgICAgKi9cbiAgICBwYXJzZShkYXRlU3RyaW5nOiBzdHJpbmcpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgcmV0dXJuIE5lcGFsaURhdGUucGFyc2UoZGF0ZVN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBudW1iZXIgdG8gTmVwYWxpIGRpZ2l0c1xuICAgICAqL1xuICAgIHRvTmVwYWxpRGlnaXRzKG51bTogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRvTmVwYWxpRGlnaXRzKG51bSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNhbGVuZGFyIGdyaWQgZm9yIGEgbW9udGhcbiAgICAgKiBSZXR1cm5zIGEgMkQgYXJyYXkgcmVwcmVzZW50aW5nIHdlZWtzIChyb3dzKSBhbmQgZGF5cyAoY29sdW1ucylcbiAgICAgKiBFYWNoIGNlbGwgY29udGFpbnMgdGhlIGRheSBudW1iZXIgb3IgbnVsbCBmb3IgZW1wdHkgY2VsbHNcbiAgICAgKi9cbiAgICBnZXRNb250aENhbGVuZGFyR3JpZCh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIpOiAobnVtYmVyIHwgbnVsbClbXVtdIHtcbiAgICAgICAgY29uc3QgZGF5c0luTW9udGggPSB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKTtcbiAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gbmV3IE5lcGFsaURhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgICAgICBjb25zdCBzdGFydERheU9mV2VlayA9IGZpcnN0RGF5T2ZNb250aC5nZXREYXkoKTsgLy8gMCA9IFN1bmRheVxuXG4gICAgICAgIGNvbnN0IGdyaWQ6IChudW1iZXIgfCBudWxsKVtdW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJlbnRXZWVrOiAobnVtYmVyIHwgbnVsbClbXSA9IFtdO1xuXG4gICAgICAgIC8vIEZpbGwgZW1wdHkgY2VsbHMgYmVmb3JlIGZpcnN0IGRheVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXJ0RGF5T2ZXZWVrOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRXZWVrLnB1c2gobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaWxsIGRheXNcbiAgICAgICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGRheXNJbk1vbnRoOyBkYXkrKykge1xuICAgICAgICAgICAgY3VycmVudFdlZWsucHVzaChkYXkpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFdlZWsubGVuZ3RoID09PSA3KSB7XG4gICAgICAgICAgICAgICAgZ3JpZC5wdXNoKGN1cnJlbnRXZWVrKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50V2VlayA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlsbCByZW1haW5pbmcgZW1wdHkgY2VsbHMgaW4gbGFzdCB3ZWVrXG4gICAgICAgIGlmIChjdXJyZW50V2Vlay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudFdlZWsubGVuZ3RoIDwgNykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRXZWVrLnB1c2gobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncmlkLnB1c2goY3VycmVudFdlZWspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHllYXJzIHJhbmdlIGZvciB5ZWFyIHNlbGVjdG9yXG4gICAgICovXG4gICAgZ2V0WWVhclJhbmdlKHN0YXJ0WWVhcj86IG51bWJlciwgZW5kWWVhcj86IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydFllYXIgPz8gQlNfTUlOX1lFQVI7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVuZFllYXIgPz8gQlNfTUFYX1lFQVI7XG4gICAgICAgIGNvbnN0IHllYXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHllYXIgPSBzdGFydDsgeWVhciA8PSBlbmQ7IHllYXIrKykge1xuICAgICAgICAgICAgaWYgKEJTX0NBTEVOREFSX0RBVEFbeWVhcl0pIHtcbiAgICAgICAgICAgICAgICB5ZWFycy5wdXNoKHllYXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHllYXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgZGF0ZSBpcyB3aXRoaW4gYSByYW5nZVxuICAgICAqL1xuICAgIGlzRGF0ZUluUmFuZ2UoZGF0ZTogTmVwYWxpRGF0ZSwgbWluRGF0ZT86IE5lcGFsaURhdGUsIG1heERhdGU/OiBOZXBhbGlEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtaW5EYXRlICYmIGRhdGUuaXNCZWZvcmUobWluRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4RGF0ZSAmJiBkYXRlLmlzQWZ0ZXIobWF4RGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iXX0=
|