hijri-date-time-picker 1.0.2 → 1.0.3

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.
@@ -1,606 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import HijriDate, { toHijri } from 'hijri-date/lib/safe';
4
- import { GREGORIAN_MONTHS_EN, GREGORIAN_MONTHS_AR, HIJRI_MONTHS_EN, HIJRI_MONTHS_AR, WEEKDAY_NAMES_EN, WEEKDAY_NAMES_AR } from './hijri-date-picker.types';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- export class HijriDatePickerComponent {
8
- // Mode & Configuration
9
- canChangeMode = true;
10
- mode = 'greg';
11
- dir = 'ltr';
12
- locale = 'en';
13
- // Validation
14
- futureValidation = true;
15
- futureYearsLimit = 10;
16
- isRequired = false;
17
- minDate; // Minimum selectable date
18
- maxDate; // Maximum selectable date
19
- // Selection
20
- multiple = false;
21
- showConfirmButton = false;
22
- initialSelectedDate; // For single selection mode - bind initial date
23
- initialSelectedDates; // For multiple selection mode - bind initial dates
24
- // Labels
25
- submitTextButton = 'Submit';
26
- todaysDateText = 'Today';
27
- ummAlQuraDateText = 'Umm Al-Qura Calendar';
28
- yearSelectLabel = 'Year';
29
- monthSelectLabel = 'Month';
30
- // Display Options
31
- todaysDateSection = true;
32
- markToday = true;
33
- disableYearPicker = false;
34
- disableMonthPicker = false;
35
- disableDayPicker = false;
36
- // Styling
37
- styles = {};
38
- // Time Configuration
39
- enableTime = false;
40
- timeFormat = '24';
41
- minuteStep = 1;
42
- enableSeconds = false;
43
- defaultTime;
44
- // Outputs
45
- dateSelected = new EventEmitter();
46
- modeChanged = new EventEmitter();
47
- // Internal State
48
- currentYear = new Date().getFullYear();
49
- currentMonth = new Date().getMonth();
50
- currentHijriYear = 0;
51
- currentHijriMonth = 0;
52
- selectedDates = [];
53
- calendarDays = [];
54
- today = new Date();
55
- years = [];
56
- months = [];
57
- weekdays = [];
58
- // Time state
59
- selectedTime = {
60
- hours: 0,
61
- minutes: 0,
62
- seconds: 0
63
- };
64
- isPM = false;
65
- ngOnInit() {
66
- this.initializeCalendar();
67
- this.initializeSelectedDates();
68
- this.initializeTime();
69
- this.updateLocaleData();
70
- this.generateYears();
71
- this.generateCalendar();
72
- }
73
- ngOnChanges(changes) {
74
- if (changes['mode'] || changes['locale']) {
75
- this.updateLocaleData();
76
- this.generateCalendar();
77
- }
78
- // Handle changes to initial selected dates
79
- if (changes['initialSelectedDate'] || changes['initialSelectedDates']) {
80
- this.initializeSelectedDates();
81
- this.generateCalendar();
82
- }
83
- }
84
- initializeCalendar() {
85
- const hijriToday = new HijriDate();
86
- this.currentHijriYear = hijriToday.getFullYear();
87
- this.currentHijriMonth = hijriToday.getMonth();
88
- }
89
- initializeSelectedDates() {
90
- // Handle single selection mode
91
- if (!this.multiple && this.initialSelectedDate) {
92
- this.selectedDates = [this.createSelectedDate(this.initialSelectedDate)];
93
- }
94
- // Handle multiple selection mode
95
- if (this.multiple && this.initialSelectedDates && this.initialSelectedDates.length > 0) {
96
- this.selectedDates = this.initialSelectedDates.map(date => this.createSelectedDate(date));
97
- }
98
- }
99
- initializeTime() {
100
- if (!this.enableTime) {
101
- return;
102
- }
103
- // Set default time if provided
104
- if (this.defaultTime) {
105
- this.selectedTime = {
106
- hours: this.defaultTime.hours,
107
- minutes: this.defaultTime.minutes,
108
- seconds: this.defaultTime.seconds || 0
109
- };
110
- // Set AM/PM for 12-hour format
111
- if (this.timeFormat === '12') {
112
- this.isPM = this.selectedTime.hours >= 12;
113
- }
114
- }
115
- else {
116
- // Default to current time
117
- const now = new Date();
118
- this.selectedTime = {
119
- hours: now.getHours(),
120
- minutes: now.getMinutes(),
121
- seconds: now.getSeconds()
122
- };
123
- this.isPM = this.selectedTime.hours >= 12;
124
- }
125
- }
126
- updateLocaleData() {
127
- // Update weekday names
128
- this.weekdays = this.locale === 'ar' ? WEEKDAY_NAMES_AR : WEEKDAY_NAMES_EN;
129
- // Update month names based on mode and locale
130
- if (this.mode === 'hijri') {
131
- this.months = this.locale === 'ar' ? HIJRI_MONTHS_AR : HIJRI_MONTHS_EN;
132
- }
133
- else {
134
- this.months = this.locale === 'ar' ? GREGORIAN_MONTHS_AR : GREGORIAN_MONTHS_EN;
135
- }
136
- }
137
- generateYears() {
138
- const currentYear = this.mode === 'hijri' ? this.currentHijriYear : this.currentYear;
139
- const startYear = currentYear - 100;
140
- const endYear = currentYear + this.futureYearsLimit;
141
- this.years = [];
142
- for (let year = startYear; year <= endYear; year++) {
143
- this.years.push(year);
144
- }
145
- }
146
- generateCalendar() {
147
- this.calendarDays = [];
148
- if (this.mode === 'hijri') {
149
- this.generateHijriCalendar();
150
- }
151
- else {
152
- this.generateGregorianCalendar();
153
- }
154
- }
155
- generateGregorianCalendar() {
156
- const firstDay = new Date(this.currentYear, this.currentMonth, 1);
157
- const lastDay = new Date(this.currentYear, this.currentMonth + 1, 0);
158
- const startingDayOfWeek = firstDay.getDay();
159
- const daysInMonth = lastDay.getDate();
160
- // Add empty cells for days before the first day of the month
161
- for (let i = 0; i < startingDayOfWeek; i++) {
162
- this.calendarDays.push({ day: null, disabled: true });
163
- }
164
- // Add days of the month
165
- for (let day = 1; day <= daysInMonth; day++) {
166
- const date = new Date(this.currentYear, this.currentMonth, day);
167
- const isToday = this.isSameDay(date, this.today);
168
- const isDisabled = this.isDateDisabled(date);
169
- const isSelected = this.isDateSelected(date);
170
- this.calendarDays.push({
171
- day,
172
- date,
173
- isToday,
174
- isDisabled,
175
- isSelected,
176
- disabled: false
177
- });
178
- }
179
- }
180
- generateHijriCalendar() {
181
- const hijriDate = new HijriDate(this.currentHijriYear, this.currentHijriMonth, 1);
182
- const gregorianDate = hijriDate.toGregorian();
183
- const startingDayOfWeek = gregorianDate.getDay();
184
- // Get days in Hijri month (typically 29 or 30)
185
- const daysInMonth = this.getDaysInHijriMonth(this.currentHijriYear, this.currentHijriMonth);
186
- // Add empty cells for days before the first day of the month
187
- for (let i = 0; i < startingDayOfWeek; i++) {
188
- this.calendarDays.push({ day: null, disabled: true });
189
- }
190
- // Add days of the month
191
- for (let day = 1; day <= daysInMonth; day++) {
192
- const hijriDay = new HijriDate(this.currentHijriYear, this.currentHijriMonth, day);
193
- const gregorianDay = hijriDay.toGregorian();
194
- const isToday = this.isSameDay(gregorianDay, this.today);
195
- const isDisabled = this.isDateDisabled(gregorianDay);
196
- const isSelected = this.isDateSelected(gregorianDay);
197
- this.calendarDays.push({
198
- day,
199
- date: gregorianDay,
200
- hijriDate: hijriDay,
201
- isToday,
202
- isDisabled,
203
- isSelected,
204
- disabled: false
205
- });
206
- }
207
- }
208
- getDaysInHijriMonth(year, month) {
209
- // Try to create the 30th day; if it fails, the month has 29 days
210
- try {
211
- new HijriDate(year, month, 30);
212
- return 30;
213
- }
214
- catch {
215
- return 29;
216
- }
217
- }
218
- isSameDay(date1, date2) {
219
- return date1.getFullYear() === date2.getFullYear() &&
220
- date1.getMonth() === date2.getMonth() &&
221
- date1.getDate() === date2.getDate();
222
- }
223
- isDateDisabled(date) {
224
- // Check minDate constraint
225
- if (this.minDate) {
226
- const minDateOnly = new Date(this.minDate);
227
- minDateOnly.setHours(0, 0, 0, 0);
228
- const checkDate = new Date(date);
229
- checkDate.setHours(0, 0, 0, 0);
230
- if (checkDate < minDateOnly) {
231
- return true;
232
- }
233
- }
234
- // Check maxDate constraint
235
- if (this.maxDate) {
236
- const maxDateOnly = new Date(this.maxDate);
237
- maxDateOnly.setHours(23, 59, 59, 999);
238
- const checkDate = new Date(date);
239
- checkDate.setHours(0, 0, 0, 0);
240
- if (checkDate > maxDateOnly) {
241
- return true;
242
- }
243
- }
244
- // Check futureValidation constraint
245
- if (this.futureValidation) {
246
- const maxDate = new Date();
247
- maxDate.setFullYear(maxDate.getFullYear() + this.futureYearsLimit);
248
- return date > maxDate;
249
- }
250
- return false;
251
- }
252
- isDateSelected(date) {
253
- return this.selectedDates.some(selected => this.isSameDay(selected.gregorian, date));
254
- }
255
- onDayClick(dayInfo) {
256
- if (dayInfo.disabled || dayInfo.isDisabled) {
257
- return;
258
- }
259
- const selectedDate = this.createSelectedDate(dayInfo.date);
260
- if (this.multiple) {
261
- const index = this.selectedDates.findIndex(d => this.isSameDay(d.gregorian, dayInfo.date));
262
- if (index > -1) {
263
- this.selectedDates.splice(index, 1);
264
- }
265
- else {
266
- this.selectedDates.push(selectedDate);
267
- }
268
- if (!this.showConfirmButton) {
269
- this.dateSelected.emit([...this.selectedDates]);
270
- }
271
- }
272
- else {
273
- this.selectedDates = [selectedDate];
274
- if (!this.showConfirmButton) {
275
- this.dateSelected.emit(selectedDate);
276
- }
277
- }
278
- this.generateCalendar();
279
- }
280
- createSelectedDate(date) {
281
- const hijriDate = toHijri(date);
282
- // If time is enabled, set the time on the date object
283
- if (this.enableTime) {
284
- let hours24 = this.selectedTime.hours;
285
- if (this.timeFormat === '12') {
286
- if (this.isPM && this.selectedTime.hours !== 12) {
287
- hours24 = this.selectedTime.hours + 12;
288
- }
289
- else if (!this.isPM && this.selectedTime.hours === 12) {
290
- hours24 = 0;
291
- }
292
- }
293
- date.setHours(hours24, this.selectedTime.minutes, this.selectedTime.seconds);
294
- }
295
- return {
296
- gregorian: date,
297
- hijri: {
298
- year: hijriDate.getFullYear(),
299
- month: hijriDate.getMonth(),
300
- day: hijriDate.getDate()
301
- },
302
- time: this.enableTime ? {
303
- hours: date.getHours(),
304
- minutes: date.getMinutes(),
305
- seconds: date.getSeconds()
306
- } : undefined,
307
- formatted: {
308
- gregorian: this.formatGregorianDate(date),
309
- hijri: this.formatHijriDate(hijriDate),
310
- time: this.enableTime ? this.formatTime(date.getHours(), date.getMinutes(), date.getSeconds()) : undefined
311
- }
312
- };
313
- }
314
- formatGregorianDate(date) {
315
- const day = date.getDate();
316
- const month = this.locale === 'ar' ? GREGORIAN_MONTHS_AR[date.getMonth()] : GREGORIAN_MONTHS_EN[date.getMonth()];
317
- const year = date.getFullYear();
318
- return this.locale === 'ar'
319
- ? `${day} ${month} ${year}`
320
- : `${month} ${day}, ${year}`;
321
- }
322
- formatHijriDate(hijriDate) {
323
- const day = hijriDate.getDate();
324
- const month = this.locale === 'ar'
325
- ? HIJRI_MONTHS_AR[hijriDate.getMonth()]
326
- : HIJRI_MONTHS_EN[hijriDate.getMonth()];
327
- const year = hijriDate.getFullYear();
328
- return this.locale === 'ar'
329
- ? `${day} ${month} ${year} هـ`
330
- : `${day} ${month} ${year} AH`;
331
- }
332
- onYearChange(event) {
333
- const year = parseInt(event.target.value);
334
- if (this.mode === 'hijri') {
335
- this.currentHijriYear = year;
336
- }
337
- else {
338
- this.currentYear = year;
339
- }
340
- this.generateCalendar();
341
- }
342
- onMonthChange(event) {
343
- const month = parseInt(event.target.value);
344
- if (this.mode === 'hijri') {
345
- this.currentHijriMonth = month;
346
- }
347
- else {
348
- this.currentMonth = month;
349
- }
350
- this.generateCalendar();
351
- }
352
- previousMonth() {
353
- if (this.mode === 'hijri') {
354
- if (this.currentHijriMonth === 0) {
355
- this.currentHijriMonth = 11;
356
- this.currentHijriYear--;
357
- }
358
- else {
359
- this.currentHijriMonth--;
360
- }
361
- }
362
- else {
363
- if (this.currentMonth === 0) {
364
- this.currentMonth = 11;
365
- this.currentYear--;
366
- }
367
- else {
368
- this.currentMonth--;
369
- }
370
- }
371
- this.generateCalendar();
372
- }
373
- nextMonth() {
374
- if (this.mode === 'hijri') {
375
- if (this.currentHijriMonth === 11) {
376
- this.currentHijriMonth = 0;
377
- this.currentHijriYear++;
378
- }
379
- else {
380
- this.currentHijriMonth++;
381
- }
382
- }
383
- else {
384
- if (this.currentMonth === 11) {
385
- this.currentMonth = 0;
386
- this.currentYear++;
387
- }
388
- else {
389
- this.currentMonth++;
390
- }
391
- }
392
- this.generateCalendar();
393
- }
394
- toggleMode() {
395
- if (!this.canChangeMode) {
396
- return;
397
- }
398
- this.mode = this.mode === 'greg' ? 'hijri' : 'greg';
399
- this.updateLocaleData();
400
- this.generateYears();
401
- this.generateCalendar();
402
- this.modeChanged.emit(this.mode);
403
- }
404
- selectToday() {
405
- const today = new Date();
406
- this.onDayClick({ date: today, disabled: false, isDisabled: false });
407
- }
408
- onSubmit() {
409
- if (this.isRequired && this.selectedDates.length === 0) {
410
- return;
411
- }
412
- if (this.multiple) {
413
- this.dateSelected.emit([...this.selectedDates]);
414
- }
415
- else if (this.selectedDates.length > 0) {
416
- this.dateSelected.emit(this.selectedDates[0]);
417
- }
418
- }
419
- // Time handling methods
420
- incrementTime(type) {
421
- if (type === 'hours') {
422
- const max = this.timeFormat === '12' ? 12 : 23;
423
- this.selectedTime.hours = (this.selectedTime.hours + 1) > max ? (this.timeFormat === '12' ? 1 : 0) : this.selectedTime.hours + 1;
424
- }
425
- else if (type === 'minutes') {
426
- this.selectedTime.minutes = (this.selectedTime.minutes + this.minuteStep) > 59 ? 0 : this.selectedTime.minutes + this.minuteStep;
427
- }
428
- else if (type === 'seconds') {
429
- this.selectedTime.seconds = (this.selectedTime.seconds + 1) > 59 ? 0 : this.selectedTime.seconds + 1;
430
- }
431
- this.updateSelectedDateTime();
432
- }
433
- decrementTime(type) {
434
- if (type === 'hours') {
435
- const min = this.timeFormat === '12' ? 1 : 0;
436
- const max = this.timeFormat === '12' ? 12 : 23;
437
- this.selectedTime.hours = (this.selectedTime.hours - 1) < min ? max : this.selectedTime.hours - 1;
438
- }
439
- else if (type === 'minutes') {
440
- this.selectedTime.minutes = (this.selectedTime.minutes - this.minuteStep) < 0 ? 59 : this.selectedTime.minutes - this.minuteStep;
441
- }
442
- else if (type === 'seconds') {
443
- this.selectedTime.seconds = (this.selectedTime.seconds - 1) < 0 ? 59 : this.selectedTime.seconds - 1;
444
- }
445
- this.updateSelectedDateTime();
446
- }
447
- onTimeChange(type, event) {
448
- const value = parseInt(event.target.value) || 0;
449
- if (type === 'hours') {
450
- const min = this.timeFormat === '12' ? 1 : 0;
451
- const max = this.timeFormat === '12' ? 12 : 23;
452
- this.selectedTime.hours = Math.max(min, Math.min(max, value));
453
- }
454
- else if (type === 'minutes') {
455
- this.selectedTime.minutes = Math.max(0, Math.min(59, value));
456
- }
457
- else if (type === 'seconds') {
458
- this.selectedTime.seconds = Math.max(0, Math.min(59, value));
459
- }
460
- this.updateSelectedDateTime();
461
- }
462
- setAMPM(pm) {
463
- this.isPM = pm;
464
- this.updateSelectedDateTime();
465
- }
466
- formatTime(hours, minutes, seconds) {
467
- if (this.timeFormat === '12') {
468
- const displayHours = hours % 12 || 12;
469
- const ampm = hours >= 12 ? 'PM' : 'AM';
470
- const minutesStr = minutes.toString().padStart(2, '0');
471
- if (this.enableSeconds) {
472
- const secondsStr = seconds.toString().padStart(2, '0');
473
- return `${displayHours}:${minutesStr}:${secondsStr} ${ampm}`;
474
- }
475
- return `${displayHours}:${minutesStr} ${ampm}`;
476
- }
477
- else {
478
- const hoursStr = hours.toString().padStart(2, '0');
479
- const minutesStr = minutes.toString().padStart(2, '0');
480
- if (this.enableSeconds) {
481
- const secondsStr = seconds.toString().padStart(2, '0');
482
- return `${hoursStr}:${minutesStr}:${secondsStr}`;
483
- }
484
- return `${hoursStr}:${minutesStr}`;
485
- }
486
- }
487
- updateSelectedDateTime() {
488
- if (!this.enableTime || this.selectedDates.length === 0) {
489
- return;
490
- }
491
- // Convert 12-hour to 24-hour if needed
492
- let hours24 = this.selectedTime.hours;
493
- if (this.timeFormat === '12') {
494
- if (this.isPM && this.selectedTime.hours !== 12) {
495
- hours24 = this.selectedTime.hours + 12;
496
- }
497
- else if (!this.isPM && this.selectedTime.hours === 12) {
498
- hours24 = 0;
499
- }
500
- }
501
- // Update all selected dates with new time
502
- this.selectedDates = this.selectedDates.map(selectedDate => {
503
- const newDate = new Date(selectedDate.gregorian);
504
- newDate.setHours(hours24, this.selectedTime.minutes, this.selectedTime.seconds);
505
- return {
506
- ...selectedDate,
507
- gregorian: newDate,
508
- time: {
509
- hours: hours24,
510
- minutes: this.selectedTime.minutes,
511
- seconds: this.selectedTime.seconds
512
- },
513
- formatted: {
514
- ...selectedDate.formatted,
515
- time: this.formatTime(hours24, this.selectedTime.minutes, this.selectedTime.seconds)
516
- }
517
- };
518
- });
519
- }
520
- getCustomStyles() {
521
- return {
522
- '--primary-color': this.styles.primaryColor || '#4f46e5',
523
- '--secondary-color': this.styles.secondaryColor || '#818cf8',
524
- '--background-color': this.styles.backgroundColor || '#ffffff',
525
- '--text-color': this.styles.textColor || '#1f2937',
526
- '--selected-date-color': this.styles.selectedDateColor || '#ffffff',
527
- '--selected-date-background': this.styles.selectedDateBackground || '#4f46e5',
528
- '--today-color': this.styles.todayColor || '#10b981',
529
- '--disabled-color': this.styles.disabledColor || '#d1d5db',
530
- '--border-color': this.styles.borderColor || '#e5e7eb',
531
- '--hover-color': this.styles.hoverColor || '#f3f4f6',
532
- '--font-family': this.styles.fontFamily || 'system-ui, -apple-system, sans-serif',
533
- '--font-size': this.styles.fontSize || '14px',
534
- '--border-radius': this.styles.borderRadius || '8px'
535
- };
536
- }
537
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HijriDatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
538
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HijriDatePickerComponent, isStandalone: true, selector: "hijri-date-picker", inputs: { canChangeMode: "canChangeMode", mode: "mode", dir: "dir", locale: "locale", futureValidation: "futureValidation", futureYearsLimit: "futureYearsLimit", isRequired: "isRequired", minDate: "minDate", maxDate: "maxDate", multiple: "multiple", showConfirmButton: "showConfirmButton", initialSelectedDate: "initialSelectedDate", initialSelectedDates: "initialSelectedDates", submitTextButton: "submitTextButton", todaysDateText: "todaysDateText", ummAlQuraDateText: "ummAlQuraDateText", yearSelectLabel: "yearSelectLabel", monthSelectLabel: "monthSelectLabel", todaysDateSection: "todaysDateSection", markToday: "markToday", disableYearPicker: "disableYearPicker", disableMonthPicker: "disableMonthPicker", disableDayPicker: "disableDayPicker", styles: "styles", enableTime: "enableTime", timeFormat: "timeFormat", minuteStep: "minuteStep", enableSeconds: "enableSeconds", defaultTime: "defaultTime" }, outputs: { dateSelected: "dateSelected", modeChanged: "modeChanged" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"hijri-date-picker\" [dir]=\"dir\" [style]=\"getCustomStyles()\">\n <!-- Header Section -->\n <div class=\"picker-header\">\n <!-- Mode Toggle Button -->\n <button \n *ngIf=\"canChangeMode\" \n class=\"mode-toggle-btn\"\n (click)=\"toggleMode()\"\n [attr.aria-label]=\"mode === 'greg' ? 'Switch to Hijri' : 'Switch to Gregorian'\">\n {{ mode === 'greg' ? (locale === 'ar' ? '\u062A\u0642\u0648\u064A\u0645 \u0647\u062C\u0631\u064A' : 'Hijri') : (locale === 'ar' ? '\u062A\u0642\u0648\u064A\u0645 \u0645\u064A\u0644\u0627\u062F\u064A' : 'Gregorian') }}\n </button>\n\n <!-- Today's Date Section -->\n <div *ngIf=\"todaysDateSection\" class=\"todays-date\">\n <button class=\"today-btn\" (click)=\"selectToday()\">\n {{ todaysDateText }}\n </button>\n </div>\n </div>\n\n <!-- Calendar Controls -->\n <div class=\"calendar-controls\">\n <!-- Year Picker -->\n <div class=\"control-group\" *ngIf=\"!disableYearPicker\">\n <label [attr.for]=\"'year-select'\">{{ yearSelectLabel }}</label>\n <select \n id=\"year-select\"\n [value]=\"mode === 'hijri' ? currentHijriYear : currentYear\"\n (change)=\"onYearChange($event)\"\n class=\"year-select\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n\n <!-- Month Picker -->\n <div class=\"control-group\" *ngIf=\"!disableMonthPicker\">\n <label [attr.for]=\"'month-select'\">{{ monthSelectLabel }}</label>\n <select \n id=\"month-select\"\n [value]=\"mode === 'hijri' ? currentHijriMonth : currentMonth\"\n (change)=\"onMonthChange($event)\"\n class=\"month-select\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i\">\n {{ month }}\n </option>\n </select>\n </div>\n\n <!-- Navigation Buttons -->\n <div class=\"navigation-buttons\">\n <button \n class=\"nav-btn prev-btn\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0633\u0627\u0628\u0642' : 'Previous Month'\">\n {{ dir === 'rtl' ? '\u2190' : '\u2192' }}\n </button>\n <button \n class=\"nav-btn next-btn\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062A\u0627\u0644\u064A' : 'Next Month'\">\n {{ dir === 'rtl' ? '\u2192' : '\u2190' }}\n </button>\n </div>\n </div>\n\n <!-- Calendar Grid -->\n <div class=\"calendar-grid\" *ngIf=\"!disableDayPicker\">\n <!-- Weekday Headers -->\n <div class=\"weekday-header\">\n <div class=\"weekday\" *ngFor=\"let weekday of weekdays\">\n {{ weekday }}\n </div>\n </div>\n\n <!-- Calendar Days -->\n <div class=\"calendar-days\">\n <div \n *ngFor=\"let dayInfo of calendarDays\"\n class=\"day-cell\"\n [class.empty]=\"dayInfo.day === null\"\n [class.today]=\"markToday && dayInfo.isToday\"\n [class.selected]=\"dayInfo.isSelected\"\n [class.disabled]=\"dayInfo.isDisabled\"\n (click)=\"onDayClick(dayInfo)\">\n <span *ngIf=\"dayInfo.day !== null\">{{ dayInfo.day }}</span>\n </div>\n </div>\n </div>\n\n <!-- Time Picker Section -->\n <div class=\"time-picker\" *ngIf=\"enableTime\">\n <div class=\"time-picker-label\">\n {{ locale === 'ar' ? '\u0627\u0644\u0648\u0642\u062A' : 'Time' }}\n </div>\n \n <div class=\"time-inputs\">\n <!-- Hours Input -->\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('hours')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"timeFormat === '12' ? (selectedTime.hours % 12 || 12) : selectedTime.hours\"\n (input)=\"onTimeChange('hours', $event)\"\n [min]=\"timeFormat === '12' ? 1 : 0\"\n [max]=\"timeFormat === '12' ? 12 : 23\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0633\u0627\u0639\u0627\u062A' : 'Hours'\">\n <button class=\"time-btn\" (click)=\"decrementTime('hours')\">\u25BC</button>\n </div>\n \n <span class=\"time-separator\">:</span>\n \n <!-- Minutes Input -->\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('minutes')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"selectedTime.minutes\"\n (input)=\"onTimeChange('minutes', $event)\"\n [min]=\"0\"\n [max]=\"59\"\n [step]=\"minuteStep\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u062F\u0642\u0627\u0626\u0642' : 'Minutes'\">\n <button class=\"time-btn\" (click)=\"decrementTime('minutes')\">\u25BC</button>\n </div>\n \n <!-- Seconds Input (Optional) -->\n <ng-container *ngIf=\"enableSeconds\">\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('seconds')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"selectedTime.seconds\"\n (input)=\"onTimeChange('seconds', $event)\"\n [min]=\"0\"\n [max]=\"59\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u062B\u0648\u0627\u0646\u064A' : 'Seconds'\">\n <button class=\"time-btn\" (click)=\"decrementTime('seconds')\">\u25BC</button>\n </div>\n </ng-container>\n \n <!-- AM/PM Toggle (12-hour format) -->\n <div class=\"ampm-toggle\" *ngIf=\"timeFormat === '12'\">\n <button \n class=\"ampm-btn\"\n [class.active]=\"!isPM\"\n (click)=\"setAMPM(false)\">\n AM\n </button>\n <button \n class=\"ampm-btn\"\n [class.active]=\"isPM\"\n (click)=\"setAMPM(true)\">\n PM\n </button>\n </div>\n </div>\n </div>\n\n <!-- Selected Dates Display -->\n <div class=\"selected-dates\" *ngIf=\"selectedDates.length > 0\">\n <div class=\"selected-label\">\n {{ locale === 'ar' ? '\u0627\u0644\u062A\u0648\u0627\u0631\u064A\u062E \u0627\u0644\u0645\u062D\u062F\u062F\u0629:' : 'Selected Dates:' }}\n </div>\n <div class=\"selected-list\">\n <div class=\"selected-item\" *ngFor=\"let date of selectedDates\">\n <div class=\"selected-date-info\">\n <span class=\"date-text\">\n {{ mode === 'hijri' ? date.formatted.hijri : date.formatted.gregorian }}\n </span>\n <span class=\"time-text\" *ngIf=\"enableTime && date.formatted.time\">\n {{ date.formatted.time }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Submit Button -->\n <div class=\"picker-footer\" *ngIf=\"showConfirmButton\">\n <button \n class=\"submit-btn\"\n (click)=\"onSubmit()\"\n [disabled]=\"isRequired && selectedDates.length === 0\">\n {{ submitTextButton }}\n </button>\n </div>\n\n <!-- Calendar Type Label -->\n <div class=\"calendar-type\" *ngIf=\"mode === 'hijri'\">\n <small>{{ ummAlQuraDateText }}</small>\n </div>\n</div>\n", styles: [".hijri-date-picker{font-family:var(--font-family);font-size:var(--font-size);background-color:var(--background-color);color:var(--text-color);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:20px;max-width:400px;box-shadow:0 4px 6px #0000001a}.picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;gap:12px}.mode-toggle-btn{background-color:var(--secondary-color);color:#fff;border:none;padding:8px 16px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s ease}.mode-toggle-btn:hover{opacity:.9;transform:translateY(-1px)}.mode-toggle-btn:active{transform:translateY(0)}.todays-date{flex:1;display:flex;justify-content:flex-end}.today-btn{background-color:var(--today-color);color:#fff;border:none;padding:8px 16px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s ease}.today-btn:hover{opacity:.9;transform:translateY(-1px)}.calendar-controls{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px;align-items:flex-end}.control-group{flex:1;min-width:120px;display:flex;flex-direction:column;gap:4px}.control-group label{font-size:12px;font-weight:500;color:var(--text-color);opacity:.8}.year-select,.month-select{padding:8px 12px;border:1px solid var(--border-color);border-radius:calc(var(--border-radius) / 2);background-color:var(--background-color);color:var(--text-color);font-size:14px;cursor:pointer;transition:border-color .2s ease}.year-select:hover,.month-select:hover{border-color:var(--primary-color)}.year-select:focus,.month-select:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #4f46e51a}.navigation-buttons{display:flex;gap:8px}.nav-btn{background-color:var(--primary-color);color:#fff;border:none;width:36px;height:36px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:18px;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.nav-btn:hover{opacity:.9;transform:scale(1.05)}.nav-btn:active{transform:scale(.95)}.calendar-grid{margin-bottom:16px}.weekday-header{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:8px}.weekday{text-align:center;font-size:12px;font-weight:600;color:var(--text-color);opacity:.7;padding:8px 4px}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}.day-cell{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease;position:relative}.day-cell:not(.empty):not(.disabled):hover{background-color:var(--hover-color);transform:scale(1.05)}.day-cell.empty{cursor:default;pointer-events:none}.day-cell.today{color:var(--today-color);font-weight:700}.day-cell.today:after{content:\"\";position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:4px;height:4px;background-color:var(--today-color);border-radius:50%}.day-cell.selected{background-color:var(--selected-date-background);color:var(--selected-date-color);font-weight:700}.day-cell.disabled{color:var(--disabled-color);cursor:not-allowed;opacity:.5}.day-cell.disabled:hover{background-color:transparent;transform:none}.selected-dates{margin-bottom:16px;padding:12px;background-color:var(--hover-color);border-radius:calc(var(--border-radius) / 2)}.selected-label{font-size:12px;font-weight:600;margin-bottom:8px;color:var(--text-color);opacity:.8}.selected-list{display:flex;flex-wrap:wrap;gap:8px}.selected-item{background-color:var(--primary-color);color:#fff;padding:6px 12px;border-radius:calc(var(--border-radius) / 2);font-size:13px;font-weight:500}.picker-footer{margin-bottom:12px}.submit-btn{width:100%;background-color:var(--primary-color);color:#fff;border:none;padding:12px 24px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:15px;font-weight:600;transition:all .2s ease}.submit-btn:hover:not(:disabled){opacity:.9;transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.submit-btn:active:not(:disabled){transform:translateY(0)}.submit-btn:disabled{opacity:.5;cursor:not-allowed}.calendar-type{text-align:center;color:var(--text-color);opacity:.6;font-size:11px}.hijri-date-picker[dir=rtl]{direction:rtl}.hijri-date-picker[dir=rtl] .picker-header{flex-direction:row-reverse}.hijri-date-picker[dir=rtl] .todays-date{justify-content:flex-start}@media (max-width: 480px){.hijri-date-picker{padding:16px;max-width:100%}.calendar-controls{flex-direction:column}.control-group{width:100%}.navigation-buttons{width:100%;justify-content:space-between}.weekday{font-size:11px;padding:6px 2px}.day-cell{font-size:13px}}@media (prefers-color-scheme: dark){.hijri-date-picker{--background-color: #1f2937;--text-color: #f9fafb;--border-color: #374151;--hover-color: #374151}}.time-picker{margin-top:10px;margin-bottom:20px;padding:16px;background:linear-gradient(135deg,var(--hover-color) 0%,transparent 100%);border-radius:var(--border-radius);border:1px solid var(--border-color);box-shadow:inset 0 2px 4px #0000000d}.time-picker-label{font-size:13px;font-weight:600;margin-bottom:12px;color:var(--text-color);opacity:.9;text-align:center;text-transform:uppercase;letter-spacing:.5px}.time-inputs{display:flex;align-items:center;justify-content:center;gap:12px}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:6px}.time-btn{background-color:var(--primary-color);color:#fff;border:none;width:36px;height:28px;border-radius:calc(var(--border-radius) / 3);cursor:pointer;font-size:12px;display:flex;align-items:center;justify-content:center;transition:all .2s ease;-webkit-user-select:none;user-select:none}.time-btn:hover{filter:brightness(1.1);transform:scale(1.05)}.time-btn:active{transform:scale(.95)}.time-input{width:60px;padding:10px 4px;text-align:center;border:2px solid var(--border-color);border-radius:calc(var(--border-radius) / 2);background-color:var(--background-color);color:var(--text-color);font-size:20px;font-weight:700;transition:all .2s ease;box-shadow:0 2px 4px #0000000d}.time-input:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 4px #4f46e526}.time-input::-webkit-inner-spin-button,.time-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.time-separator{font-size:28px;font-weight:700;color:var(--text-color);opacity:.4;padding-bottom:4px}.ampm-toggle{display:flex;flex-direction:column;gap:6px;margin-left:12px}.ampm-btn{background-color:var(--background-color);color:var(--text-color);border:1px solid var(--border-color);padding:8px 14px;border-radius:calc(var(--border-radius) / 3);cursor:pointer;font-size:11px;font-weight:700;transition:all .2s ease;box-shadow:0 2px 4px #0000000d}.ampm-btn.active{background-color:var(--primary-color);color:#fff;border-color:var(--primary-color);box-shadow:0 4px 6px #00000026}.ampm-btn:hover:not(.active){background-color:var(--hover-color);border-color:var(--primary-color)}.selected-date-info{display:flex;flex-direction:column;align-items:center;gap:2px}.selected-item .time-text{font-size:11px;opacity:.85;font-weight:500;background-color:#fff3;padding:2px 8px;border-radius:10px;margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
539
- }
540
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HijriDatePickerComponent, decorators: [{
541
- type: Component,
542
- args: [{ selector: 'hijri-date-picker', standalone: true, imports: [CommonModule], template: "<div class=\"hijri-date-picker\" [dir]=\"dir\" [style]=\"getCustomStyles()\">\n <!-- Header Section -->\n <div class=\"picker-header\">\n <!-- Mode Toggle Button -->\n <button \n *ngIf=\"canChangeMode\" \n class=\"mode-toggle-btn\"\n (click)=\"toggleMode()\"\n [attr.aria-label]=\"mode === 'greg' ? 'Switch to Hijri' : 'Switch to Gregorian'\">\n {{ mode === 'greg' ? (locale === 'ar' ? '\u062A\u0642\u0648\u064A\u0645 \u0647\u062C\u0631\u064A' : 'Hijri') : (locale === 'ar' ? '\u062A\u0642\u0648\u064A\u0645 \u0645\u064A\u0644\u0627\u062F\u064A' : 'Gregorian') }}\n </button>\n\n <!-- Today's Date Section -->\n <div *ngIf=\"todaysDateSection\" class=\"todays-date\">\n <button class=\"today-btn\" (click)=\"selectToday()\">\n {{ todaysDateText }}\n </button>\n </div>\n </div>\n\n <!-- Calendar Controls -->\n <div class=\"calendar-controls\">\n <!-- Year Picker -->\n <div class=\"control-group\" *ngIf=\"!disableYearPicker\">\n <label [attr.for]=\"'year-select'\">{{ yearSelectLabel }}</label>\n <select \n id=\"year-select\"\n [value]=\"mode === 'hijri' ? currentHijriYear : currentYear\"\n (change)=\"onYearChange($event)\"\n class=\"year-select\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n\n <!-- Month Picker -->\n <div class=\"control-group\" *ngIf=\"!disableMonthPicker\">\n <label [attr.for]=\"'month-select'\">{{ monthSelectLabel }}</label>\n <select \n id=\"month-select\"\n [value]=\"mode === 'hijri' ? currentHijriMonth : currentMonth\"\n (change)=\"onMonthChange($event)\"\n class=\"month-select\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i\">\n {{ month }}\n </option>\n </select>\n </div>\n\n <!-- Navigation Buttons -->\n <div class=\"navigation-buttons\">\n <button \n class=\"nav-btn prev-btn\"\n (click)=\"previousMonth()\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u0633\u0627\u0628\u0642' : 'Previous Month'\">\n {{ dir === 'rtl' ? '\u2190' : '\u2192' }}\n </button>\n <button \n class=\"nav-btn next-btn\"\n (click)=\"nextMonth()\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0634\u0647\u0631 \u0627\u0644\u062A\u0627\u0644\u064A' : 'Next Month'\">\n {{ dir === 'rtl' ? '\u2192' : '\u2190' }}\n </button>\n </div>\n </div>\n\n <!-- Calendar Grid -->\n <div class=\"calendar-grid\" *ngIf=\"!disableDayPicker\">\n <!-- Weekday Headers -->\n <div class=\"weekday-header\">\n <div class=\"weekday\" *ngFor=\"let weekday of weekdays\">\n {{ weekday }}\n </div>\n </div>\n\n <!-- Calendar Days -->\n <div class=\"calendar-days\">\n <div \n *ngFor=\"let dayInfo of calendarDays\"\n class=\"day-cell\"\n [class.empty]=\"dayInfo.day === null\"\n [class.today]=\"markToday && dayInfo.isToday\"\n [class.selected]=\"dayInfo.isSelected\"\n [class.disabled]=\"dayInfo.isDisabled\"\n (click)=\"onDayClick(dayInfo)\">\n <span *ngIf=\"dayInfo.day !== null\">{{ dayInfo.day }}</span>\n </div>\n </div>\n </div>\n\n <!-- Time Picker Section -->\n <div class=\"time-picker\" *ngIf=\"enableTime\">\n <div class=\"time-picker-label\">\n {{ locale === 'ar' ? '\u0627\u0644\u0648\u0642\u062A' : 'Time' }}\n </div>\n \n <div class=\"time-inputs\">\n <!-- Hours Input -->\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('hours')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"timeFormat === '12' ? (selectedTime.hours % 12 || 12) : selectedTime.hours\"\n (input)=\"onTimeChange('hours', $event)\"\n [min]=\"timeFormat === '12' ? 1 : 0\"\n [max]=\"timeFormat === '12' ? 12 : 23\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u0633\u0627\u0639\u0627\u062A' : 'Hours'\">\n <button class=\"time-btn\" (click)=\"decrementTime('hours')\">\u25BC</button>\n </div>\n \n <span class=\"time-separator\">:</span>\n \n <!-- Minutes Input -->\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('minutes')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"selectedTime.minutes\"\n (input)=\"onTimeChange('minutes', $event)\"\n [min]=\"0\"\n [max]=\"59\"\n [step]=\"minuteStep\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u062F\u0642\u0627\u0626\u0642' : 'Minutes'\">\n <button class=\"time-btn\" (click)=\"decrementTime('minutes')\">\u25BC</button>\n </div>\n \n <!-- Seconds Input (Optional) -->\n <ng-container *ngIf=\"enableSeconds\">\n <span class=\"time-separator\">:</span>\n <div class=\"time-input-group\">\n <button class=\"time-btn\" (click)=\"incrementTime('seconds')\">\u25B2</button>\n <input \n type=\"number\" \n class=\"time-input\"\n [value]=\"selectedTime.seconds\"\n (input)=\"onTimeChange('seconds', $event)\"\n [min]=\"0\"\n [max]=\"59\"\n [attr.aria-label]=\"locale === 'ar' ? '\u0627\u0644\u062B\u0648\u0627\u0646\u064A' : 'Seconds'\">\n <button class=\"time-btn\" (click)=\"decrementTime('seconds')\">\u25BC</button>\n </div>\n </ng-container>\n \n <!-- AM/PM Toggle (12-hour format) -->\n <div class=\"ampm-toggle\" *ngIf=\"timeFormat === '12'\">\n <button \n class=\"ampm-btn\"\n [class.active]=\"!isPM\"\n (click)=\"setAMPM(false)\">\n AM\n </button>\n <button \n class=\"ampm-btn\"\n [class.active]=\"isPM\"\n (click)=\"setAMPM(true)\">\n PM\n </button>\n </div>\n </div>\n </div>\n\n <!-- Selected Dates Display -->\n <div class=\"selected-dates\" *ngIf=\"selectedDates.length > 0\">\n <div class=\"selected-label\">\n {{ locale === 'ar' ? '\u0627\u0644\u062A\u0648\u0627\u0631\u064A\u062E \u0627\u0644\u0645\u062D\u062F\u062F\u0629:' : 'Selected Dates:' }}\n </div>\n <div class=\"selected-list\">\n <div class=\"selected-item\" *ngFor=\"let date of selectedDates\">\n <div class=\"selected-date-info\">\n <span class=\"date-text\">\n {{ mode === 'hijri' ? date.formatted.hijri : date.formatted.gregorian }}\n </span>\n <span class=\"time-text\" *ngIf=\"enableTime && date.formatted.time\">\n {{ date.formatted.time }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Submit Button -->\n <div class=\"picker-footer\" *ngIf=\"showConfirmButton\">\n <button \n class=\"submit-btn\"\n (click)=\"onSubmit()\"\n [disabled]=\"isRequired && selectedDates.length === 0\">\n {{ submitTextButton }}\n </button>\n </div>\n\n <!-- Calendar Type Label -->\n <div class=\"calendar-type\" *ngIf=\"mode === 'hijri'\">\n <small>{{ ummAlQuraDateText }}</small>\n </div>\n</div>\n", styles: [".hijri-date-picker{font-family:var(--font-family);font-size:var(--font-size);background-color:var(--background-color);color:var(--text-color);border:1px solid var(--border-color);border-radius:var(--border-radius);padding:20px;max-width:400px;box-shadow:0 4px 6px #0000001a}.picker-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;gap:12px}.mode-toggle-btn{background-color:var(--secondary-color);color:#fff;border:none;padding:8px 16px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s ease}.mode-toggle-btn:hover{opacity:.9;transform:translateY(-1px)}.mode-toggle-btn:active{transform:translateY(0)}.todays-date{flex:1;display:flex;justify-content:flex-end}.today-btn{background-color:var(--today-color);color:#fff;border:none;padding:8px 16px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:13px;font-weight:500;transition:all .2s ease}.today-btn:hover{opacity:.9;transform:translateY(-1px)}.calendar-controls{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:16px;align-items:flex-end}.control-group{flex:1;min-width:120px;display:flex;flex-direction:column;gap:4px}.control-group label{font-size:12px;font-weight:500;color:var(--text-color);opacity:.8}.year-select,.month-select{padding:8px 12px;border:1px solid var(--border-color);border-radius:calc(var(--border-radius) / 2);background-color:var(--background-color);color:var(--text-color);font-size:14px;cursor:pointer;transition:border-color .2s ease}.year-select:hover,.month-select:hover{border-color:var(--primary-color)}.year-select:focus,.month-select:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #4f46e51a}.navigation-buttons{display:flex;gap:8px}.nav-btn{background-color:var(--primary-color);color:#fff;border:none;width:36px;height:36px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:18px;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.nav-btn:hover{opacity:.9;transform:scale(1.05)}.nav-btn:active{transform:scale(.95)}.calendar-grid{margin-bottom:16px}.weekday-header{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:8px}.weekday{text-align:center;font-size:12px;font-weight:600;color:var(--text-color);opacity:.7;padding:8px 4px}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}.day-cell{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease;position:relative}.day-cell:not(.empty):not(.disabled):hover{background-color:var(--hover-color);transform:scale(1.05)}.day-cell.empty{cursor:default;pointer-events:none}.day-cell.today{color:var(--today-color);font-weight:700}.day-cell.today:after{content:\"\";position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:4px;height:4px;background-color:var(--today-color);border-radius:50%}.day-cell.selected{background-color:var(--selected-date-background);color:var(--selected-date-color);font-weight:700}.day-cell.disabled{color:var(--disabled-color);cursor:not-allowed;opacity:.5}.day-cell.disabled:hover{background-color:transparent;transform:none}.selected-dates{margin-bottom:16px;padding:12px;background-color:var(--hover-color);border-radius:calc(var(--border-radius) / 2)}.selected-label{font-size:12px;font-weight:600;margin-bottom:8px;color:var(--text-color);opacity:.8}.selected-list{display:flex;flex-wrap:wrap;gap:8px}.selected-item{background-color:var(--primary-color);color:#fff;padding:6px 12px;border-radius:calc(var(--border-radius) / 2);font-size:13px;font-weight:500}.picker-footer{margin-bottom:12px}.submit-btn{width:100%;background-color:var(--primary-color);color:#fff;border:none;padding:12px 24px;border-radius:calc(var(--border-radius) / 2);cursor:pointer;font-size:15px;font-weight:600;transition:all .2s ease}.submit-btn:hover:not(:disabled){opacity:.9;transform:translateY(-2px);box-shadow:0 4px 8px #00000026}.submit-btn:active:not(:disabled){transform:translateY(0)}.submit-btn:disabled{opacity:.5;cursor:not-allowed}.calendar-type{text-align:center;color:var(--text-color);opacity:.6;font-size:11px}.hijri-date-picker[dir=rtl]{direction:rtl}.hijri-date-picker[dir=rtl] .picker-header{flex-direction:row-reverse}.hijri-date-picker[dir=rtl] .todays-date{justify-content:flex-start}@media (max-width: 480px){.hijri-date-picker{padding:16px;max-width:100%}.calendar-controls{flex-direction:column}.control-group{width:100%}.navigation-buttons{width:100%;justify-content:space-between}.weekday{font-size:11px;padding:6px 2px}.day-cell{font-size:13px}}@media (prefers-color-scheme: dark){.hijri-date-picker{--background-color: #1f2937;--text-color: #f9fafb;--border-color: #374151;--hover-color: #374151}}.time-picker{margin-top:10px;margin-bottom:20px;padding:16px;background:linear-gradient(135deg,var(--hover-color) 0%,transparent 100%);border-radius:var(--border-radius);border:1px solid var(--border-color);box-shadow:inset 0 2px 4px #0000000d}.time-picker-label{font-size:13px;font-weight:600;margin-bottom:12px;color:var(--text-color);opacity:.9;text-align:center;text-transform:uppercase;letter-spacing:.5px}.time-inputs{display:flex;align-items:center;justify-content:center;gap:12px}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:6px}.time-btn{background-color:var(--primary-color);color:#fff;border:none;width:36px;height:28px;border-radius:calc(var(--border-radius) / 3);cursor:pointer;font-size:12px;display:flex;align-items:center;justify-content:center;transition:all .2s ease;-webkit-user-select:none;user-select:none}.time-btn:hover{filter:brightness(1.1);transform:scale(1.05)}.time-btn:active{transform:scale(.95)}.time-input{width:60px;padding:10px 4px;text-align:center;border:2px solid var(--border-color);border-radius:calc(var(--border-radius) / 2);background-color:var(--background-color);color:var(--text-color);font-size:20px;font-weight:700;transition:all .2s ease;box-shadow:0 2px 4px #0000000d}.time-input:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 4px #4f46e526}.time-input::-webkit-inner-spin-button,.time-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.time-separator{font-size:28px;font-weight:700;color:var(--text-color);opacity:.4;padding-bottom:4px}.ampm-toggle{display:flex;flex-direction:column;gap:6px;margin-left:12px}.ampm-btn{background-color:var(--background-color);color:var(--text-color);border:1px solid var(--border-color);padding:8px 14px;border-radius:calc(var(--border-radius) / 3);cursor:pointer;font-size:11px;font-weight:700;transition:all .2s ease;box-shadow:0 2px 4px #0000000d}.ampm-btn.active{background-color:var(--primary-color);color:#fff;border-color:var(--primary-color);box-shadow:0 4px 6px #00000026}.ampm-btn:hover:not(.active){background-color:var(--hover-color);border-color:var(--primary-color)}.selected-date-info{display:flex;flex-direction:column;align-items:center;gap:2px}.selected-item .time-text{font-size:11px;opacity:.85;font-weight:500;background-color:#fff3;padding:2px 8px;border-radius:10px;margin-top:2px}\n"] }]
543
- }], propDecorators: { canChangeMode: [{
544
- type: Input
545
- }], mode: [{
546
- type: Input
547
- }], dir: [{
548
- type: Input
549
- }], locale: [{
550
- type: Input
551
- }], futureValidation: [{
552
- type: Input
553
- }], futureYearsLimit: [{
554
- type: Input
555
- }], isRequired: [{
556
- type: Input
557
- }], minDate: [{
558
- type: Input
559
- }], maxDate: [{
560
- type: Input
561
- }], multiple: [{
562
- type: Input
563
- }], showConfirmButton: [{
564
- type: Input
565
- }], initialSelectedDate: [{
566
- type: Input
567
- }], initialSelectedDates: [{
568
- type: Input
569
- }], submitTextButton: [{
570
- type: Input
571
- }], todaysDateText: [{
572
- type: Input
573
- }], ummAlQuraDateText: [{
574
- type: Input
575
- }], yearSelectLabel: [{
576
- type: Input
577
- }], monthSelectLabel: [{
578
- type: Input
579
- }], todaysDateSection: [{
580
- type: Input
581
- }], markToday: [{
582
- type: Input
583
- }], disableYearPicker: [{
584
- type: Input
585
- }], disableMonthPicker: [{
586
- type: Input
587
- }], disableDayPicker: [{
588
- type: Input
589
- }], styles: [{
590
- type: Input
591
- }], enableTime: [{
592
- type: Input
593
- }], timeFormat: [{
594
- type: Input
595
- }], minuteStep: [{
596
- type: Input
597
- }], enableSeconds: [{
598
- type: Input
599
- }], defaultTime: [{
600
- type: Input
601
- }], dateSelected: [{
602
- type: Output
603
- }], modeChanged: [{
604
- type: Output
605
- }] } });
606
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlqcmktZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9oaWpyaS1kYXRlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9zcmMvbGliL2hpanJpLWRhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFTTCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNqQixNQUFNLDJCQUEyQixDQUFDOzs7QUFTbkMsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyx1QkFBdUI7SUFDZCxhQUFhLEdBQVksSUFBSSxDQUFDO0lBQzlCLElBQUksR0FBYSxNQUFNLENBQUM7SUFDeEIsR0FBRyxHQUFjLEtBQUssQ0FBQztJQUN2QixNQUFNLEdBQVcsSUFBSSxDQUFDO0lBRS9CLGFBQWE7SUFDSixnQkFBZ0IsR0FBWSxJQUFJLENBQUM7SUFDakMsZ0JBQWdCLEdBQVcsRUFBRSxDQUFDO0lBQzlCLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFDNUIsT0FBTyxDQUFRLENBQUMsMEJBQTBCO0lBQzFDLE9BQU8sQ0FBUSxDQUFDLDBCQUEwQjtJQUVuRCxZQUFZO0lBQ0gsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixpQkFBaUIsR0FBWSxLQUFLLENBQUM7SUFDbkMsbUJBQW1CLENBQVEsQ0FBQyxnREFBZ0Q7SUFDNUUsb0JBQW9CLENBQVUsQ0FBQyxtREFBbUQ7SUFFM0YsU0FB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bUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgSGlqcmlEYXRlLCB7IHRvSGlqcmkgfSBmcm9tICdoaWpyaS1kYXRlL2xpYi9zYWZlJztcbmltcG9ydCB7XG4gIERhdGVNb2RlLFxuICBEaXJlY3Rpb24sXG4gIExvY2FsZSxcbiAgU2VsZWN0ZWREYXRlLFxuICBEYXRlUGlja2VyU3R5bGVzLFxuICBEYXRlUGlja2VyTGFiZWxzLFxuICBEYXRlUGlja2VyRGlzcGxheSxcbiAgVGltZUZvcm1hdCxcbiAgR1JFR09SSUFOX01PTlRIU19FTixcbiAgR1JFR09SSUFOX01PTlRIU19BUixcbiAgSElKUklfTU9OVEhTX0VOLFxuICBISUpSSV9NT05USFNfQVIsXG4gIFdFRUtEQVlfTkFNRVNfRU4sXG4gIFdFRUtEQVlfTkFNRVNfQVJcbn0gZnJvbSAnLi9oaWpyaS1kYXRlLXBpY2tlci50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hpanJpLWRhdGUtcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9oaWpyaS1kYXRlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hpanJpLWRhdGUtcGlja2VyLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBIaWpyaURhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8vIE1vZGUgJiBDb25maWd1cmF0aW9uXG4gIEBJbnB1dCgpIGNhbkNoYW5nZU1vZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBtb2RlOiBEYXRlTW9kZSA9ICdncmVnJztcbiAgQElucHV0KCkgZGlyOiBEaXJlY3Rpb24gPSAnbHRyJztcbiAgQElucHV0KCkgbG9jYWxlOiBMb2NhbGUgPSAnZW4nO1xuXG4gIC8vIFZhbGlkYXRpb25cbiAgQElucHV0KCkgZnV0dXJlVmFsaWRhdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGZ1dHVyZVllYXJzTGltaXQ6IG51bWJlciA9IDEwO1xuICBASW5wdXQoKSBpc1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1pbkRhdGU/OiBEYXRlOyAvLyBNaW5pbXVtIHNlbGVjdGFibGUgZGF0ZVxuICBASW5wdXQoKSBtYXhEYXRlPzogRGF0ZTsgLy8gTWF4aW11bSBzZWxlY3RhYmxlIGRhdGVcblxuICAvLyBTZWxlY3Rpb25cbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0NvbmZpcm1CdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaW5pdGlhbFNlbGVjdGVkRGF0ZT86IERhdGU7IC8vIEZvciBzaW5nbGUgc2VsZWN0aW9uIG1vZGUgLSBiaW5kIGluaXRpYWwgZGF0ZVxuICBASW5wdXQoKSBpbml0aWFsU2VsZWN0ZWREYXRlcz86IERhdGVbXTsgLy8gRm9yIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlIC0gYmluZCBpbml0aWFsIGRhdGVzXG5cbiAgLy8gTGFiZWxzXG4gIEBJbnB1dCgpIHN1Ym1pdFRleHRCdXR0b246IHN0cmluZyA9ICdTdWJtaXQnO1xuICBASW5wdXQoKSB0b2RheXNEYXRlVGV4dDogc3RyaW5nID0gJ1RvZGF5JztcbiAgQElucHV0KCkgdW1tQWxRdXJhRGF0ZVRleHQ6IHN0cmluZyA9ICdVbW0gQWwtUXVyYSBDYWxlbmRhcic7XG4gIEBJbnB1dCgpIHllYXJTZWxlY3RMYWJlbDogc3RyaW5nID0gJ1llYXInO1xuICBASW5wdXQoKSBtb250aFNlbGVjdExhYmVsOiBzdHJpbmcgPSAnTW9udGgnO1xuXG4gIC8vIERpc3BsYXkgT3B0aW9uc1xuICBASW5wdXQoKSB0b2RheXNEYXRlU2VjdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIG1hcmtUb2RheTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGRpc2FibGVZZWFyUGlja2VyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVNb250aFBpY2tlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlRGF5UGlja2VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gU3R5bGluZ1xuICBASW5wdXQoKSBzdHlsZXM6IERhdGVQaWNrZXJTdHlsZXMgPSB7fTtcblxuICAvLyBUaW1lIENvbmZpZ3VyYXRpb25cbiAgQElucHV0KCkgZW5hYmxlVGltZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aW1lRm9ybWF0OiBUaW1lRm9ybWF0ID0gJzI0JztcbiAgQElucHV0KCkgbWludXRlU3RlcDogbnVtYmVyID0gMTtcbiAgQElucHV0KCkgZW5hYmxlU2Vjb25kczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWZhdWx0VGltZT86IHsgaG91cnM6IG51bWJlcjsgbWludXRlczogbnVtYmVyOyBzZWNvbmRzPzogbnVtYmVyIH07XG5cbiAgLy8gT3V0cHV0c1xuICBAT3V0cHV0KCkgZGF0ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3RlZERhdGUgfCBTZWxlY3RlZERhdGVbXT4oKTtcbiAgQE91dHB1dCgpIG1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlTW9kZT4oKTtcblxuICAvLyBJbnRlcm5hbCBTdGF0ZVxuICBjdXJyZW50WWVhcjogbnVtYmVyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xuICBjdXJyZW50TW9udGg6IG51bWJlciA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKTtcbiAgY3VycmVudEhpanJpWWVhcjogbnVtYmVyID0gMDtcbiAgY3VycmVudEhpanJpTW9udGg6IG51bWJlciA9IDA7XG4gIFxuICBzZWxlY3RlZERhdGVzOiBTZWxlY3RlZERhdGVbXSA9IFtdO1xuICBjYWxlbmRhckRheXM6IGFueVtdID0gW107XG4gIHRvZGF5OiBEYXRlID0gbmV3IERhdGUoKTtcbiAgXG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xuICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gIHdlZWtkYXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFRpbWUgc3RhdGVcbiAgc2VsZWN0ZWRUaW1lOiB7IGhvdXJzOiBudW1iZXI7IG1pbnV0ZXM6IG51bWJlcjsgc2Vjb25kczogbnVtYmVyIH0gPSB7XG4gICAgaG91cnM6IDAsXG4gICAgbWludXRlczogMCxcbiAgICBzZWNvbmRzOiAwXG4gIH07XG4gIGlzUE06IGJvb2xlYW4gPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVDYWxlbmRhcigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNlbGVjdGVkRGF0ZXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVUaW1lKCk7XG4gICAgdGhpcy51cGRhdGVMb2NhbGVEYXRhKCk7XG4gICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21vZGUnXSB8fCBjaGFuZ2VzWydsb2NhbGUnXSkge1xuICAgICAgdGhpcy51cGRhdGVMb2NhbGVEYXRhKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gaW5pdGlhbCBzZWxlY3RlZCBkYXRlc1xuICAgIGlmIChjaGFuZ2VzWydpbml0aWFsU2VsZWN0ZWREYXRlJ10gfHwgY2hhbmdlc1snaW5pdGlhbFNlbGVjdGVkRGF0ZXMnXSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplU2VsZWN0ZWREYXRlcygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgY29uc3QgaGlqcmlUb2RheSA9IG5ldyBIaWpyaURhdGUoKTtcbiAgICB0aGlzLmN1cnJlbnRIaWpyaVllYXIgPSBoaWpyaVRvZGF5LmdldEZ1bGxZZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50SGlqcmlNb250aCA9IGhpanJpVG9kYXkuZ2V0TW9udGgoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNlbGVjdGVkRGF0ZXMoKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIHNpbmdsZSBzZWxlY3Rpb24gbW9kZVxuICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLmluaXRpYWxTZWxlY3RlZERhdGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IFt0aGlzLmNyZWF0ZVNlbGVjdGVkRGF0ZSh0aGlzLmluaXRpYWxTZWxlY3RlZERhdGUpXTtcbiAgICB9XG4gICAgXG4gICAgLy8gSGFuZGxlIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlXG4gICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5pbml0aWFsU2VsZWN0ZWREYXRlcyAmJiB0aGlzLmluaXRpYWxTZWxlY3RlZERhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IHRoaXMuaW5pdGlhbFNlbGVjdGVkRGF0ZXMubWFwKGRhdGUgPT4gdGhpcy5jcmVhdGVTZWxlY3RlZERhdGUoZGF0ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRpbWUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVRpbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCB0aW1lIGlmIHByb3ZpZGVkXG4gICAgaWYgKHRoaXMuZGVmYXVsdFRpbWUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0ge1xuICAgICAgICBob3VyczogdGhpcy5kZWZhdWx0VGltZS5ob3VycyxcbiAgICAgICAgbWludXRlczogdGhpcy5kZWZhdWx0VGltZS5taW51dGVzLFxuICAgICAgICBzZWNvbmRzOiB0aGlzLmRlZmF1bHRUaW1lLnNlY29uZHMgfHwgMFxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gU2V0IEFNL1BNIGZvciAxMi1ob3VyIGZvcm1hdFxuICAgICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgICB0aGlzLmlzUE0gPSB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyA+PSAxMjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IHRpbWVcbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZSA9IHtcbiAgICAgICAgaG91cnM6IG5vdy5nZXRIb3VycygpLFxuICAgICAgICBtaW51dGVzOiBub3cuZ2V0TWludXRlcygpLFxuICAgICAgICBzZWNvbmRzOiBub3cuZ2V0U2Vjb25kcygpXG4gICAgICB9O1xuICAgICAgdGhpcy5pc1BNID0gdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgPj0gMTI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMb2NhbGVEYXRhKCk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB3ZWVrZGF5IG5hbWVzXG4gICAgdGhpcy53ZWVrZGF5cyA9IHRoaXMubG9jYWxlID09PSAnYXInID8gV0VFS0RBWV9OQU1FU19BUiA6IFdFRUtEQVlfTkFNRVNfRU47XG5cbiAgICAvLyBVcGRhdGUgbW9udGggbmFtZXMgYmFzZWQgb24gbW9kZSBhbmQgbG9jYWxlXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2hpanJpJykge1xuICAgICAgdGhpcy5tb250aHMgPSB0aGlzLmxvY2FsZSA9PT0gJ2FyJyA/IEhJSlJJX01PTlRIU19BUiA6IEhJSlJJX01PTlRIU19FTjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb250aHMgPSB0aGlzLmxvY2FsZSA9PT0gJ2FyJyA/IEdSRUdPUklBTl9NT05USFNfQVIgOiBHUkVHT1JJQU5fTU9OVEhTX0VOO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVZZWFycygpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMubW9kZSA9PT0gJ2hpanJpJyA/IHRoaXMuY3VycmVudEhpanJpWWVhciA6IHRoaXMuY3VycmVudFllYXI7XG4gICAgY29uc3Qgc3RhcnRZZWFyID0gY3VycmVudFllYXIgLSAxMDA7XG4gICAgY29uc3QgZW5kWWVhciA9IGN1cnJlbnRZZWFyICsgdGhpcy5mdXR1cmVZZWFyc0xpbWl0O1xuICAgIFxuICAgIHRoaXMueWVhcnMgPSBbXTtcbiAgICBmb3IgKGxldCB5ZWFyID0gc3RhcnRZZWFyOyB5ZWFyIDw9IGVuZFllYXI7IHllYXIrKykge1xuICAgICAgdGhpcy55ZWFycy5wdXNoKHllYXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyRGF5cyA9IFtdO1xuICAgIFxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdoaWpyaScpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVIaWpyaUNhbGVuZGFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVHcmVnb3JpYW5DYWxlbmRhcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVHcmVnb3JpYW5DYWxlbmRhcigpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCAxKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGggKyAxLCAwKTtcbiAgICBjb25zdCBzdGFydGluZ0RheU9mV2VlayA9IGZpcnN0RGF5LmdldERheSgpO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbGFzdERheS5nZXREYXRlKCk7XG5cbiAgICAvLyBBZGQgZW1wdHkgY2VsbHMgZm9yIGRheXMgYmVmb3JlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydGluZ0RheU9mV2VlazsgaSsrKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyRGF5cy5wdXNoKHsgZGF5OiBudWxsLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgZGF5cyBvZiB0aGUgbW9udGhcbiAgICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gZGF5c0luTW9udGg7IGRheSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIGRheSk7XG4gICAgICBjb25zdCBpc1RvZGF5ID0gdGhpcy5pc1NhbWVEYXkoZGF0ZSwgdGhpcy50b2RheSk7XG4gICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKTtcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzRGF0ZVNlbGVjdGVkKGRhdGUpO1xuXG4gICAgICB0aGlzLmNhbGVuZGFyRGF5cy5wdXNoKHtcbiAgICAgICAgZGF5LFxuICAgICAgICBkYXRlLFxuICAgICAgICBpc1RvZGF5LFxuICAgICAgICBpc0Rpc2FibGVkLFxuICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVIaWpyaUNhbGVuZGFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGhpanJpRGF0ZSA9IG5ldyBIaWpyaURhdGUodGhpcy5jdXJyZW50SGlqcmlZZWFyLCB0aGlzLmN1cnJlbnRIaWpyaU1vbnRoLCAxKTtcbiAgICBjb25zdCBncmVnb3JpYW5EYXRlID0gaGlqcmlEYXRlLnRvR3JlZ29yaWFuKCk7XG4gICAgY29uc3Qgc3RhcnRpbmdEYXlPZldlZWsgPSBncmVnb3JpYW5EYXRlLmdldERheSgpO1xuICAgIFxuICAgIC8vIEdldCBkYXlzIGluIEhpanJpIG1vbnRoICh0eXBpY2FsbHkgMjkgb3IgMzApXG4gICAgY29uc3QgZGF5c0luTW9udGggPSB0aGlzLmdldERheXNJbkhpanJpTW9udGgodGhpcy5jdXJyZW50SGlqcmlZZWFyLCB0aGlzLmN1cnJlbnRIaWpyaU1vbnRoKTtcblxuICAgIC8vIEFkZCBlbXB0eSBjZWxscyBmb3IgZGF5cyBiZWZvcmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXJ0aW5nRGF5T2ZXZWVrOyBpKyspIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJEYXlzLnB1c2goeyBkYXk6IG51bGwsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBkYXlzIG9mIHRoZSBtb250aFxuICAgIGZvciAobGV0IGRheSA9IDE7IGRheSA8PSBkYXlzSW5Nb250aDsgZGF5KyspIHtcbiAgICAgIGNvbnN0IGhpanJpRGF5ID0gbmV3IEhpanJpRGF0ZSh0aGlzLmN1cnJlbnRIaWpyaVllYXIsIHRoaXMuY3VycmVudEhpanJpTW9udGgsIGRheSk7XG4gICAgICBjb25zdCBncmVnb3JpYW5EYXkgPSBoaWpyaURheS50b0dyZWdvcmlhbigpO1xuICAgICAgY29uc3QgaXNUb2RheSA9IHRoaXMuaXNTYW1lRGF5KGdyZWdvcmlhbkRheSwgdGhpcy50b2RheSk7XG4gICAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc0RhdGVEaXNhYmxlZChncmVnb3JpYW5EYXkpO1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHRoaXMuaXNEYXRlU2VsZWN0ZWQoZ3JlZ29yaWFuRGF5KTtcblxuICAgICAgdGhpcy5jYWxlbmRhckRheXMucHVzaCh7XG4gICAgICAgIGRheSxcbiAgICAgICAgZGF0ZTogZ3JlZ29yaWFuRGF5LFxuICAgICAgICBoaWpyaURhdGU6IGhpanJpRGF5LFxuICAgICAgICBpc1RvZGF5LFxuICAgICAgICBpc0Rpc2FibGVkLFxuICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF5c0luSGlqcmlNb250aCh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRyeSB0byBjcmVhdGUgdGhlIDMwdGggZGF5OyBpZiBpdCBmYWlscywgdGhlIG1vbnRoIGhhcyAyOSBkYXlzXG4gICAgdHJ5IHtcbiAgICAgIG5ldyBIaWpyaURhdGUoeWVhciwgbW9udGgsIDMwKTtcbiAgICAgIHJldHVybiAzMDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAyOTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZURheShkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGF0ZTEuZ2V0RnVsbFllYXIoKSA9PT0gZGF0ZTIuZ2V0RnVsbFllYXIoKSAmJlxuICAgICAgICAgICBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpICYmXG4gICAgICAgICAgIGRhdGUxLmdldERhdGUoKSA9PT0gZGF0ZTIuZ2V0RGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgbWluRGF0ZSBjb25zdHJhaW50XG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xuICAgICAgY29uc3QgbWluRGF0ZU9ubHkgPSBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpO1xuICAgICAgbWluRGF0ZU9ubHkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBjb25zdCBjaGVja0RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgIGNoZWNrRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGlmIChjaGVja0RhdGUgPCBtaW5EYXRlT25seSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBtYXhEYXRlIGNvbnN0cmFpbnRcbiAgICBpZiAodGhpcy5tYXhEYXRlKSB7XG4gICAgICBjb25zdCBtYXhEYXRlT25seSA9IG5ldyBEYXRlKHRoaXMubWF4RGF0ZSk7XG4gICAgICBtYXhEYXRlT25seS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xuICAgICAgY29uc3QgY2hlY2tEYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICBjaGVja0RhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBpZiAoY2hlY2tEYXRlID4gbWF4RGF0ZU9ubHkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZnV0dXJlVmFsaWRhdGlvbiBjb25zdHJhaW50XG4gICAgaWYgKHRoaXMuZnV0dXJlVmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBtYXhEYXRlLnNldEZ1bGxZZWFyKG1heERhdGUuZ2V0RnVsbFllYXIoKSArIHRoaXMuZnV0dXJlWWVhcnNMaW1pdCk7XG4gICAgICByZXR1cm4gZGF0ZSA+IG1heERhdGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXRlU2VsZWN0ZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZXMuc29tZShzZWxlY3RlZCA9PiBcbiAgICAgIHRoaXMuaXNTYW1lRGF5KHNlbGVjdGVkLmdyZWdvcmlhbiwgZGF0ZSlcbiAgICApO1xuICB9XG5cbiAgb25EYXlDbGljayhkYXlJbmZvOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZGF5SW5mby5kaXNhYmxlZCB8fCBkYXlJbmZvLmlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSB0aGlzLmNyZWF0ZVNlbGVjdGVkRGF0ZShkYXlJbmZvLmRhdGUpO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZERhdGVzLmZpbmRJbmRleChkID0+IFxuICAgICAgICB0aGlzLmlzU2FtZURheShkLmdyZWdvcmlhbiwgZGF5SW5mby5kYXRlKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMucHVzaChzZWxlY3RlZERhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2hvd0NvbmZpcm1CdXR0b24pIHtcbiAgICAgICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdChbLi4udGhpcy5zZWxlY3RlZERhdGVzXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IFtzZWxlY3RlZERhdGVdO1xuICAgICAgXG4gICAgICBpZiAoIXRoaXMuc2hvd0NvbmZpcm1CdXR0b24pIHtcbiAgICAgICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdChzZWxlY3RlZERhdGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTZWxlY3RlZERhdGUoZGF0ZTogRGF0ZSk6IFNlbGVjdGVkRGF0ZSB7XG4gICAgY29uc3QgaGlqcmlEYXRlID0gdG9IaWpyaShkYXRlKTtcbiAgICBcbiAgICAvLyBJZiB0aW1lIGlzIGVuYWJsZWQsIHNldCB0aGUgdGltZSBvbiB0aGUgZGF0ZSBvYmplY3RcbiAgICBpZiAodGhpcy5lbmFibGVUaW1lKSB7XG4gICAgICBsZXQgaG91cnMyNCA9IHRoaXMuc2VsZWN0ZWRUaW1lLmhvdXJzO1xuICAgICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgICBpZiAodGhpcy5pc1BNICYmIHRoaXMuc2VsZWN0ZWRUaW1lLmhvdXJzICE9PSAxMikge1xuICAgICAgICAgIGhvdXJzMjQgPSB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyArIDEyO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzUE0gJiYgdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgPT09IDEyKSB7XG4gICAgICAgICAgaG91cnMyNCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRhdGUuc2V0SG91cnMoaG91cnMyNCwgdGhpcy5zZWxlY3RlZFRpbWUubWludXRlcywgdGhpcy5zZWxlY3RlZFRpbWUuc2Vjb25kcyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBncmVnb3JpYW46IGRhdGUsXG4gICAgICBoaWpyaToge1xuICAgICAgICB5ZWFyOiBoaWpyaURhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgbW9udGg6IGhpanJpRGF0ZS5nZXRNb250aCgpLFxuICAgICAgICBkYXk6IGhpanJpRGF0ZS5nZXREYXRlKClcbiAgICAgIH0sXG4gICAgICB0aW1lOiB0aGlzLmVuYWJsZVRpbWUgPyB7XG4gICAgICAgIGhvdXJzOiBkYXRlLmdldEhvdXJzKCksXG4gICAgICAgIG1pbnV0ZXM6IGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICBzZWNvbmRzOiBkYXRlLmdldFNlY29uZHMoKVxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGZvcm1hdHRlZDoge1xuICAgICAgICBncmVnb3JpYW46IHRoaXMuZm9ybWF0R3JlZ29yaWFuRGF0ZShkYXRlKSxcbiAgICAgICAgaGlqcmk6IHRoaXMuZm9ybWF0SGlqcmlEYXRlKGhpanJpRGF0ZSksXG4gICAgICAgIHRpbWU6IHRoaXMuZW5hYmxlVGltZSA/IHRoaXMuZm9ybWF0VGltZShkYXRlLmdldEhvdXJzKCksIGRhdGUuZ2V0TWludXRlcygpLCBkYXRlLmdldFNlY29uZHMoKSkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRHcmVnb3JpYW5EYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IG1vbnRoID0gdGhpcy5sb2NhbGUgPT09ICdhcicgPyBHUkVHT1JJQU5fTU9OVEhTX0FSW2RhdGUuZ2V0TW9udGgoKV0gOiBHUkVHT1JJQU5fTU9OVEhTX0VOW2RhdGUuZ2V0TW9udGgoKV07XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUgPT09ICdhcicgXG4gICAgICA/IGAke2RheX0gJHttb250aH0gJHt5ZWFyfWBcbiAgICAgIDogYCR7bW9udGh9ICR7ZGF5fSwgJHt5ZWFyfWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEhpanJpRGF0ZShoaWpyaURhdGU6IEhpanJpRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF5ID0gaGlqcmlEYXRlLmdldERhdGUoKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMubG9jYWxlID09PSAnYXInIFxuICAgICAgPyBISUpSSV9NT05USFNfQVJbaGlqcmlEYXRlLmdldE1vbnRoKCldIFxuICAgICAgOiBISUpSSV9NT05USFNfRU5baGlqcmlEYXRlLmdldE1vbnRoKCldO1xuICAgIGNvbnN0IHllYXIgPSBoaWpyaURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5sb2NhbGUgPT09ICdhcicgXG4gICAgICA/IGAke2RheX0gJHttb250aH0gJHt5ZWFyfSDZh9mAYFxuICAgICAgOiBgJHtkYXl9ICR7bW9udGh9ICR7eWVhcn0gQUhgO1xuICB9XG5cbiAgb25ZZWFyQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZSk7XG4gICAgXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2hpanJpJykge1xuICAgICAgdGhpcy5jdXJyZW50SGlqcmlZZWFyID0geWVhcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50WWVhciA9IHllYXI7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgb25Nb250aENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlKTtcbiAgICBcbiAgICBpZiAodGhpcy5tb2RlID09PSAnaGlqcmknKSB7XG4gICAgICB0aGlzLmN1cnJlbnRIaWpyaU1vbnRoID0gbW9udGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gbW9udGg7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgcHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnaGlqcmknKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50SGlqcmlNb250aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRIaWpyaU1vbnRoID0gMTE7XG4gICAgICAgIHRoaXMuY3VycmVudEhpanJpWWVhci0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50SGlqcmlNb250aC0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50TW9udGggPT09IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMTtcbiAgICAgICAgdGhpcy5jdXJyZW50WWVhci0tO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGgtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gIH1cblxuICBuZXh0TW9udGgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2hpanJpJykge1xuICAgICAgaWYgKHRoaXMuY3VycmVudEhpanJpTW9udGggPT09IDExKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEhpanJpTW9udGggPSAwO1xuICAgICAgICB0aGlzLmN1cnJlbnRIaWpyaVllYXIrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudEhpanJpTW9udGgrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY3VycmVudE1vbnRoID09PSAxMSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudFllYXIrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoKys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgdG9nZ2xlTW9kZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuQ2hhbmdlTW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubW9kZSA9IHRoaXMubW9kZSA9PT0gJ2dyZWcnID8gJ2hpanJpJyA6ICdncmVnJztcbiAgICB0aGlzLnVwZGF0ZUxvY2FsZURhdGEoKTtcbiAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB0aGlzLm1vZGVDaGFuZ2VkLmVtaXQodGhpcy5tb2RlKTtcbiAgfVxuXG4gIHNlbGVjdFRvZGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLm9uRGF5Q2xpY2soeyBkYXRlOiB0b2RheSwgZGlzYWJsZWQ6IGZhbHNlLCBpc0Rpc2FibGVkOiBmYWxzZSB9KTtcbiAgfVxuXG4gIG9uU3VibWl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy5zZWxlY3RlZERhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmRhdGVTZWxlY3RlZC5lbWl0KFsuLi50aGlzLnNlbGVjdGVkRGF0ZXNdKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWREYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRhdGVTZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGltZSBoYW5kbGluZyBtZXRob2RzXG4gIGluY3JlbWVudFRpbWUodHlwZTogJ2hvdXJzJyB8ICdtaW51dGVzJyB8ICdzZWNvbmRzJyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnaG91cnMnKSB7XG4gICAgICBjb25zdCBtYXggPSB0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicgPyAxMiA6IDIzO1xuICAgICAgdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgPSAodGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgKyAxKSA+IG1heCA/ICh0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicgPyAxIDogMCkgOiB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyArIDE7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbWludXRlcycpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lLm1pbnV0ZXMgPSAodGhpcy5zZWxlY3RlZFRpbWUubWludXRlcyArIHRoaXMubWludXRlU3RlcCkgPiA1OSA/IDAgOiB0aGlzLnNlbGVjdGVkVGltZS5taW51dGVzICsgdGhpcy5taW51dGVTdGVwO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3NlY29uZHMnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5zZWNvbmRzID0gKHRoaXMuc2VsZWN0ZWRUaW1lLnNlY29uZHMgKyAxKSA+IDU5ID8gMCA6IHRoaXMuc2VsZWN0ZWRUaW1lLnNlY29uZHMgKyAxO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkRGF0ZVRpbWUoKTtcbiAgfVxuXG4gIGRlY3JlbWVudFRpbWUodHlwZTogJ2hvdXJzJyB8ICdtaW51dGVzJyB8ICdzZWNvbmRzJyk6IHZvaWQge1xuICAgIGlmICh0eXBlID09PSAnaG91cnMnKSB7XG4gICAgICBjb25zdCBtaW4gPSB0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicgPyAxIDogMDtcbiAgICAgIGNvbnN0IG1heCA9IHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJyA/IDEyIDogMjM7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyA9ICh0aGlzLnNlbGVjdGVkVGltZS5ob3VycyAtIDEpIDwgbWluID8gbWF4IDogdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgLSAxO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21pbnV0ZXMnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5taW51dGVzID0gKHRoaXMuc2VsZWN0ZWRUaW1lLm1pbnV0ZXMgLSB0aGlzLm1pbnV0ZVN0ZXApIDwgMCA/IDU5IDogdGhpcy5zZWxlY3RlZFRpbWUubWludXRlcyAtIHRoaXMubWludXRlU3RlcDtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzZWNvbmRzJykge1xuICAgICAgdGhpcy5zZWxlY3RlZFRpbWUuc2Vjb25kcyA9ICh0aGlzLnNlbGVjdGVkVGltZS5zZWNvbmRzIC0gMSkgPCAwID8gNTkgOiB0aGlzLnNlbGVjdGVkVGltZS5zZWNvbmRzIC0gMTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZERhdGVUaW1lKCk7XG4gIH1cblxuICBvblRpbWVDaGFuZ2UodHlwZTogJ2hvdXJzJyB8ICdtaW51dGVzJyB8ICdzZWNvbmRzJywgZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlKSB8fCAwO1xuICAgIFxuICAgIGlmICh0eXBlID09PSAnaG91cnMnKSB7XG4gICAgICBjb25zdCBtaW4gPSB0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicgPyAxIDogMDtcbiAgICAgIGNvbnN0IG1heCA9IHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJyA/IDEyIDogMjM7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyA9IE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21pbnV0ZXMnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGltZS5taW51dGVzID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oNTksIHZhbHVlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc2Vjb25kcycpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lLnNlY29uZHMgPSBNYXRoLm1heCgwLCBNYXRoLm1pbig1OSwgdmFsdWUpKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZERhdGVUaW1lKCk7XG4gIH1cblxuICBzZXRBTVBNKHBtOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc1BNID0gcG07XG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZERhdGVUaW1lKCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRpbWUoaG91cnM6IG51bWJlciwgbWludXRlczogbnVtYmVyLCBzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRpbWVGb3JtYXQgPT09ICcxMicpIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlIb3VycyA9IGhvdXJzICUgMTIgfHwgMTI7XG4gICAgICBjb25zdCBhbXBtID0gaG91cnMgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAgIGNvbnN0IG1pbnV0ZXNTdHIgPSBtaW51dGVzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuZW5hYmxlU2Vjb25kcykge1xuICAgICAgICBjb25zdCBzZWNvbmRzU3RyID0gc2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICAgIHJldHVybiBgJHtkaXNwbGF5SG91cnN9OiR7bWludXRlc1N0cn06JHtzZWNvbmRzU3RyfSAke2FtcG19YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtkaXNwbGF5SG91cnN9OiR7bWludXRlc1N0cn0gJHthbXBtfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhvdXJzU3RyID0gaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgY29uc3QgbWludXRlc1N0ciA9IG1pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgXG4gICAgICBpZiAodGhpcy5lbmFibGVTZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHNlY29uZHNTdHIgPSBzZWNvbmRzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgcmV0dXJuIGAke2hvdXJzU3RyfToke21pbnV0ZXNTdHJ9OiR7c2Vjb25kc1N0cn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2hvdXJzU3RyfToke21pbnV0ZXNTdHJ9YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkRGF0ZVRpbWUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZVRpbWUgfHwgdGhpcy5zZWxlY3RlZERhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgMTItaG91ciB0byAyNC1ob3VyIGlmIG5lZWRlZFxuICAgIGxldCBob3VyczI0ID0gdGhpcy5zZWxlY3RlZFRpbWUuaG91cnM7XG4gICAgaWYgKHRoaXMudGltZUZvcm1hdCA9PT0gJzEyJykge1xuICAgICAgaWYgKHRoaXMuaXNQTSAmJiB0aGlzLnNlbGVjdGVkVGltZS5ob3VycyAhPT0gMTIpIHtcbiAgICAgICAgaG91cnMyNCA9IHRoaXMuc2VsZWN0ZWRUaW1lLmhvdXJzICsgMTI7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzUE0gJiYgdGhpcy5zZWxlY3RlZFRpbWUuaG91cnMgPT09IDEyKSB7XG4gICAgICAgIGhvdXJzMjQgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBhbGwgc2VsZWN0ZWQgZGF0ZXMgd2l0aCBuZXcgdGltZVxuICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IHRoaXMuc2VsZWN0ZWREYXRlcy5tYXAoc2VsZWN0ZWREYXRlID0+IHtcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShzZWxlY3RlZERhdGUuZ3JlZ29yaWFuKTtcbiAgICAgIG5ld0RhdGUuc2V0SG91cnMoaG91cnMyNCwgdGhpcy5zZWxlY3RlZFRpbWUubWludXRlcywgdGhpcy5zZWxlY3RlZFRpbWUuc2Vjb25kcyk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnNlbGVjdGVkRGF0ZSxcbiAgICAgICAgZ3JlZ29yaWFuOiBuZXdEYXRlLFxuICAgICAgICB0aW1lOiB7XG4gICAgICAgICAgaG91cnM6IGhvdXJzMjQsXG4gICAgICAgICAgbWludXRlczogdGhpcy5zZWxlY3RlZFRpbWUubWludXRlcyxcbiAgICAgICAgICBzZWNvbmRzOiB0aGlzLnNlbGVjdGVkVGltZS5zZWNvbmRzXG4gICAgICAgIH0sXG4gICAgICAgIGZvcm1hdHRlZDoge1xuICAgICAgICAgIC4uLnNlbGVjdGVkRGF0ZS5mb3JtYXR0ZWQsXG4gICAgICAgICAgdGltZTogdGhpcy5mb3JtYXRUaW1lKGhvdXJzMjQsIHRoaXMuc2VsZWN0ZWRUaW1lLm1pbnV0ZXMsIHRoaXMuc2VsZWN0ZWRUaW1lLnNlY29uZHMpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRDdXN0b21TdHlsZXMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgJy0tcHJpbWFyeS1jb2xvcic6IHRoaXMuc3R5bGVzLnByaW1hcnlDb2xvciB8fCAnIzRmNDZlNScsXG4gICAgICAnLS1zZWNvbmRhcnktY29sb3InOiB0aGlzLnN0eWxlcy5zZWNvbmRhcnlDb2xvciB8fCAnIzgxOGNmOCcsXG4gICAgICAnLS1iYWNrZ3JvdW5kLWNvbG9yJzogdGhpcy5zdHlsZXMuYmFja2dyb3VuZENvbG9yIHx8ICcjZmZmZmZmJyxcbiAgICAgICctLXRleHQtY29sb3InOiB0aGlzLnN0eWxlcy50ZXh0Q29sb3IgfHwgJyMxZjI5MzcnLFxuICAgICAgJy0tc2VsZWN0ZWQtZGF0ZS1jb2xvcic6IHRoaXMuc3R5bGVzLnNlbGVjdGVkRGF0ZUNvbG9yIHx8ICcjZmZmZmZmJyxcbiAgICAgICctLXNlbGVjdGVkLWRhdGUtYmFja2dyb3VuZCc6IHRoaXMuc3R5bGVzLnNlbGVjdGVkRGF0ZUJhY2tncm91bmQgfHwgJyM0ZjQ2ZTUnLFxuICAgICAgJy0tdG9kYXktY29sb3InOiB0aGlzLnN0eWxlcy50b2RheUNvbG9yIHx8ICcjMTBiOTgxJyxcbiAgICAgICctLWRpc2FibGVkLWNvbG9yJzogdGhpcy5zdHlsZXMuZGlzYWJsZWRDb2xvciB8fCAnI2QxZDVkYicsXG4gICAgICAnLS1ib3JkZXItY29sb3InOiB0aGlzLnN0eWxlcy5ib3JkZXJDb2xvciB8fCAnI2U1ZTdlYicsXG4gICAgICAnLS1ob3Zlci1jb2xvcic6IHRoaXMuc3R5bGVzLmhvdmVyQ29sb3IgfHwgJyNmM2Y0ZjYnLFxuICAgICAgJy0tZm9udC1mYW1pbHknOiB0aGlzLnN0eWxlcy5mb250RmFtaWx5IHx8ICdzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYnLFxuICAgICAgJy0tZm9udC1zaXplJzogdGhpcy5zdHlsZXMuZm9udFNpemUgfHwgJzE0cHgnLFxuICAgICAgJy0tYm9yZGVyLXJhZGl1cyc6IHRoaXMuc3R5bGVzLmJvcmRlclJhZGl1cyB8fCAnOHB4J1xuICAgIH07XG4gIH1cbn1cblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZvciBleHRlcm5hbCB1c2VcbmV4cG9ydCB0eXBlIHsgU2VsZWN0ZWREYXRlLCBEYXRlUGlja2VyU3R5bGVzLCBEYXRlTW9kZSwgRGlyZWN0aW9uLCBMb2NhbGUgfTtcbiIsIjxkaXYgY2xhc3M9XCJoaWpyaS1kYXRlLXBpY2tlclwiIFtkaXJdPVwiZGlyXCIgW3N0eWxlXT1cImdldEN1c3RvbVN0eWxlcygpXCI+XG4gIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XG4gIDxkaXYgY2xhc3M9XCJwaWNrZXItaGVhZGVyXCI+XG4gICAgPCEtLSBNb2RlIFRvZ2dsZSBCdXR0b24gLS0+XG4gICAgPGJ1dHRvbiBcbiAgICAgICpuZ0lmPVwiY2FuQ2hhbmdlTW9kZVwiIFxuICAgICAgY2xhc3M9XCJtb2RlLXRvZ2dsZS1idG5cIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZU1vZGUoKVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm1vZGUgPT09ICdncmVnJyA/ICdTd2l0Y2ggdG8gSGlqcmknIDogJ1N3aXRjaCB0byBHcmVnb3JpYW4nXCI+XG4gICAgICB7eyBtb2RlID09PSAnZ3JlZycgPyAobG9jYWxlID09PSAnYXInID8gJ9iq2YLZiNmK2YUg2YfYrNix2YonIDogJ0hpanJpJykgOiAobG9jYWxlID09PSAnYXInID8gJ9iq2YLZiNmK2YUg2YXZitmE2KfYr9mKJyA6ICdHcmVnb3JpYW4nKSB9fVxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBUb2RheSdzIERhdGUgU2VjdGlvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwidG9kYXlzRGF0ZVNlY3Rpb25cIiBjbGFzcz1cInRvZGF5cy1kYXRlXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwidG9kYXktYnRuXCIgKGNsaWNrKT1cInNlbGVjdFRvZGF5KClcIj5cbiAgICAgICAge3sgdG9kYXlzRGF0ZVRleHQgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIENhbGVuZGFyIENvbnRyb2xzIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udHJvbHNcIj5cbiAgICA8IS0tIFllYXIgUGlja2VyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWdyb3VwXCIgKm5nSWY9XCIhZGlzYWJsZVllYXJQaWNrZXJcIj5cbiAgICAgIDxsYWJlbCBbYXR0ci5mb3JdPVwiJ3llYXItc2VsZWN0J1wiPnt7IHllYXJTZWxlY3RMYWJlbCB9fTwvbGFiZWw+XG4gICAgICA8c2VsZWN0IFxuICAgICAgICBpZD1cInllYXItc2VsZWN0XCJcbiAgICAgICAgW3ZhbHVlXT1cIm1vZGUgPT09ICdoaWpyaScgPyBjdXJyZW50SGlqcmlZZWFyIDogY3VycmVudFllYXJcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uWWVhckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJ5ZWFyLXNlbGVjdFwiPlxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCIgW3ZhbHVlXT1cInllYXJcIj57eyB5ZWFyIH19PC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTW9udGggUGlja2VyIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sLWdyb3VwXCIgKm5nSWY9XCIhZGlzYWJsZU1vbnRoUGlja2VyXCI+XG4gICAgICA8bGFiZWwgW2F0dHIuZm9yXT1cIidtb250aC1zZWxlY3QnXCI+e3sgbW9udGhTZWxlY3RMYWJlbCB9fTwvbGFiZWw+XG4gICAgICA8c2VsZWN0IFxuICAgICAgICBpZD1cIm1vbnRoLXNlbGVjdFwiXG4gICAgICAgIFt2YWx1ZV09XCJtb2RlID09PSAnaGlqcmknID8gY3VycmVudEhpanJpTW9udGggOiBjdXJyZW50TW9udGhcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uTW9udGhDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwibW9udGgtc2VsZWN0XCI+XG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiIFt2YWx1ZV09XCJpXCI+XG4gICAgICAgICAge3sgbW9udGggfX1cbiAgICAgICAgPC9vcHRpb24+XG4gICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTmF2aWdhdGlvbiBCdXR0b25zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJuYXZpZ2F0aW9uLWJ1dHRvbnNcIj5cbiAgICAgIDxidXR0b24gXG4gICAgICAgIGNsYXNzPVwibmF2LWJ0biBwcmV2LWJ0blwiXG4gICAgICAgIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsZSA9PT0gJ2FyJyA/ICfYp9mE2LTZh9ixINin2YTYs9in2KjZgicgOiAnUHJldmlvdXMgTW9udGgnXCI+XG4gICAgICAgIHt7IGRpciA9PT0gJ3J0bCcgPyAn4oaQJyA6ICfihpInIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gXG4gICAgICAgIGNsYXNzPVwibmF2LWJ0biBuZXh0LWJ0blwiXG4gICAgICAgIChjbGljayk9XCJuZXh0TW9udGgoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxlID09PSAnYXInID8gJ9in2YTYtNmH2LEg2KfZhNiq2KfZhNmKJyA6ICdOZXh0IE1vbnRoJ1wiPlxuICAgICAgICB7eyBkaXIgPT09ICdydGwnID8gJ+KGkicgOiAn4oaQJyB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gQ2FsZW5kYXIgR3JpZCAtLT5cbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWdyaWRcIiAqbmdJZj1cIiFkaXNhYmxlRGF5UGlja2VyXCI+XG4gICAgPCEtLSBXZWVrZGF5IEhlYWRlcnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cIndlZWtkYXktaGVhZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheVwiICpuZ0Zvcj1cImxldCB3ZWVrZGF5IG9mIHdlZWtkYXlzXCI+XG4gICAgICAgIHt7IHdlZWtkYXkgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBDYWxlbmRhciBEYXlzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kYXlzXCI+XG4gICAgICA8ZGl2IFxuICAgICAgICAqbmdGb3I9XCJsZXQgZGF5SW5mbyBvZiBjYWxlbmRhckRheXNcIlxuICAgICAgICBjbGFzcz1cImRheS1jZWxsXCJcbiAgICAgICAgW2NsYXNzLmVtcHR5XT1cImRheUluZm8uZGF5ID09PSBudWxsXCJcbiAgICAgICAgW2NsYXNzLnRvZGF5XT1cIm1hcmtUb2RheSAmJiBkYXlJbmZvLmlzVG9kYXlcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5SW5mby5pc1NlbGVjdGVkXCJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRheUluZm8uaXNEaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJvbkRheUNsaWNrKGRheUluZm8pXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZGF5SW5mby5kYXkgIT09IG51bGxcIj57eyBkYXlJbmZvLmRheSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFRpbWUgUGlja2VyIFNlY3Rpb24gLS0+XG4gIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlclwiICpuZ0lmPVwiZW5hYmxlVGltZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1sYWJlbFwiPlxuICAgICAge3sgbG9jYWxlID09PSAnYXInID8gJ9in2YTZiNmC2KonIDogJ1RpbWUnIH19XG4gICAgPC9kaXY+XG4gICAgXG4gICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXRzXCI+XG4gICAgICA8IS0tIEhvdXJzIElucHV0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImluY3JlbWVudFRpbWUoJ2hvdXJzJylcIj7ilrI8L2J1dHRvbj5cbiAgICAgICAgPGlucHV0IFxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIiBcbiAgICAgICAgICBjbGFzcz1cInRpbWUtaW5wdXRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lRm9ybWF0ID09PSAnMTInID8gKHNlbGVjdGVkVGltZS5ob3VycyAlIDEyIHx8IDEyKSA6IHNlbGVjdGVkVGltZS5ob3Vyc1wiXG4gICAgICAgICAgKGlucHV0KT1cIm9uVGltZUNoYW5nZSgnaG91cnMnLCAkZXZlbnQpXCJcbiAgICAgICAgICBbbWluXT1cInRpbWVGb3JtYXQgPT09ICcxMicgPyAxIDogMFwiXG4gICAgICAgICAgW21heF09XCJ0aW1lRm9ybWF0ID09PSAnMTInID8gMTIgOiAyM1wiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsb2NhbGUgPT09ICdhcicgPyAn2KfZhNiz2KfYudin2KonIDogJ0hvdXJzJ1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50VGltZSgnaG91cnMnKVwiPuKWvDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIj46PC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIE1pbnV0ZXMgSW5wdXQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiaW5jcmVtZW50VGltZSgnbWludXRlcycpXCI+4payPC9idXR0b24+XG4gICAgICAgIDxpbnB1dCBcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRUaW1lLm1pbnV0ZXNcIlxuICAgICAgICAgIChpbnB1dCk9XCJvblRpbWVDaGFuZ2UoJ21pbnV0ZXMnLCAkZXZlbnQpXCJcbiAgICAgICAgICBbbWluXT1cIjBcIlxuICAgICAgICAgIFttYXhdPVwiNTlcIlxuICAgICAgICAgIFtzdGVwXT1cIm1pbnV0ZVN0ZXBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibG9jYWxlID09PSAnYXInID8gJ9in2YTYr9mC2KfYptmCJyA6ICdNaW51dGVzJ1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50VGltZSgnbWludXRlcycpXCI+4pa8PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBTZWNvbmRzIElucHV0IChPcHRpb25hbCkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlU2Vjb25kc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCI+Ojwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiaW5jcmVtZW50VGltZSgnc2Vjb25kcycpXCI+4payPC9idXR0b24+XG4gICAgICAgICAgPGlucHV0IFxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiIFxuICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFRpbWUuc2Vjb25kc1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwib25UaW1lQ2hhbmdlKCdzZWNvbmRzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICBbbWluXT1cIjBcIlxuICAgICAgICAgICAgW21heF09XCI1OVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvY2FsZSA9PT0gJ2FyJyA/ICfYp9mE2KvZiNin2YbZiicgOiAnU2Vjb25kcydcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50VGltZSgnc2Vjb25kcycpXCI+4pa8PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICBcbiAgICAgIDwhLS0gQU0vUE0gVG9nZ2xlICgxMi1ob3VyIGZvcm1hdCkgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW1wbS10b2dnbGVcIiAqbmdJZj1cInRpbWVGb3JtYXQgPT09ICcxMidcIj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICBjbGFzcz1cImFtcG0tYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIiFpc1BNXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0QU1QTShmYWxzZSlcIj5cbiAgICAgICAgICBBTVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICBjbGFzcz1cImFtcG0tYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzUE1cIlxuICAgICAgICAgIChjbGljayk9XCJzZXRBTVBNKHRydWUpXCI+XG4gICAgICAgICAgUE1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTZWxlY3RlZCBEYXRlcyBEaXNwbGF5IC0tPlxuICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtZGF0ZXNcIiAqbmdJZj1cInNlbGVjdGVkRGF0ZXMubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1sYWJlbFwiPlxuICAgICAge3sgbG9jYWxlID09PSAnYXInID8gJ9in2YTYqtmI2KfYsdmK2K4g2KfZhNmF2K3Yr9iv2Kk6JyA6ICdTZWxlY3RlZCBEYXRlczonIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLWxpc3RcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1pdGVtXCIgKm5nRm9yPVwibGV0IGRhdGUgb2Ygc2VsZWN0ZWREYXRlc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtZGF0ZS1pbmZvXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXRleHRcIj5cbiAgICAgICAgICAgIHt7IG1vZGUgPT09ICdoaWpyaScgPyBkYXRlLmZvcm1hdHRlZC5oaWpyaSA6IGRhdGUuZm9ybWF0dGVkLmdyZWdvcmlhbiB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtdGV4dFwiICpuZ0lmPVwiZW5hYmxlVGltZSAmJiBkYXRlLmZvcm1hdHRlZC50aW1lXCI+XG4gICAgICAgICAgICB7eyBkYXRlLmZvcm1hdHRlZC50aW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFN1Ym1pdCBCdXR0b24gLS0+XG4gIDxkaXYgY2xhc3M9XCJwaWNrZXItZm9vdGVyXCIgKm5nSWY9XCJzaG93Q29uZmlybUJ1dHRvblwiPlxuICAgIDxidXR0b24gXG4gICAgICBjbGFzcz1cInN1Ym1pdC1idG5cIlxuICAgICAgKGNsaWNrKT1cIm9uU3VibWl0KClcIlxuICAgICAgW2Rpc2FibGVkXT1cImlzUmVxdWlyZWQgJiYgc2VsZWN0ZWREYXRlcy5sZW5ndGggPT09IDBcIj5cbiAgICAgIHt7IHN1Ym1pdFRleHRCdXR0b24gfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBDYWxlbmRhciBUeXBlIExhYmVsIC0tPlxuICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItdHlwZVwiICpuZ0lmPVwibW9kZSA9PT0gJ2hpanJpJ1wiPlxuICAgIDxzbWFsbD57eyB1bW1BbFF1cmFEYXRlVGV4dCB9fTwvc21hbGw+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=