ng-wsl-library 0.12.0 → 0.13.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/esm2020/lib/components/wsl-datetime-picker/wsl-datetime-picker.component.mjs +161 -14
- package/fesm2015/ng-wsl-library.mjs +160 -13
- package/fesm2015/ng-wsl-library.mjs.map +1 -1
- package/fesm2020/ng-wsl-library.mjs +160 -13
- package/fesm2020/ng-wsl-library.mjs.map +1 -1
- package/lib/components/wsl-datetime-picker/wsl-datetime-picker.component.d.ts +14 -3
- package/package.json +1 -1
- package/src/lib/components/wsl-datetime-picker/wsl-datetime-picker.component.scss +83 -16
|
@@ -11,16 +11,18 @@ import * as i2 from "@angular/common";
|
|
|
11
11
|
import * as i3 from "@angular/forms";
|
|
12
12
|
import * as i4 from "../../directives/wsl-tooltip.directive";
|
|
13
13
|
export class WslDatetimePickerComponent {
|
|
14
|
-
constructor(inj, configService, cdr) {
|
|
14
|
+
constructor(inj, configService, cdr, elRef) {
|
|
15
15
|
this.inj = inj;
|
|
16
16
|
this.configService = configService;
|
|
17
17
|
this.cdr = cdr;
|
|
18
|
+
this.elRef = elRef;
|
|
18
19
|
this._isInitialized = false;
|
|
19
20
|
this.hoursStep = TIME_STEPS.HOURS;
|
|
20
21
|
this.minutesStep = TIME_STEPS.MINUTES;
|
|
21
22
|
this.secondsStep = TIME_STEPS.SECONDS;
|
|
22
23
|
this.disabled = false;
|
|
23
24
|
this.disableCalendar = false;
|
|
25
|
+
this.calendarPosition = 'dynamic';
|
|
24
26
|
this.internalFormat = INPUT_DATE_FORMATS.DATE_ONLY;
|
|
25
27
|
this._standardFormat = INPUT_DATE_FORMATS.EU_DATE_DASH;
|
|
26
28
|
this.placeholder = '';
|
|
@@ -38,6 +40,7 @@ export class WslDatetimePickerComponent {
|
|
|
38
40
|
this.showCalendar = false;
|
|
39
41
|
this.calendarDays = [];
|
|
40
42
|
this.weekdayLabels = [];
|
|
43
|
+
this.calendarPositionClass = '';
|
|
41
44
|
this.months = [];
|
|
42
45
|
this.years = [];
|
|
43
46
|
this.defaultYearRange = { start: 2000, end: 2050 };
|
|
@@ -110,6 +113,16 @@ export class WslDatetimePickerComponent {
|
|
|
110
113
|
}
|
|
111
114
|
}
|
|
112
115
|
}
|
|
116
|
+
onWindowResize() {
|
|
117
|
+
if (this.showCalendar && this.calendarPosition === 'dynamic') {
|
|
118
|
+
this.calculateDynamicPosition();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
onWindowScroll() {
|
|
122
|
+
if (this.showCalendar && this.calendarPosition === 'dynamic') {
|
|
123
|
+
this.calculateDynamicPosition();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
113
126
|
ngOnInit() {
|
|
114
127
|
this.ngControl = this.inj.get(NgControl);
|
|
115
128
|
this._isInitialized = true;
|
|
@@ -150,9 +163,16 @@ export class WslDatetimePickerComponent {
|
|
|
150
163
|
this.showCalendar = !this.showCalendar;
|
|
151
164
|
if (this.showCalendar) {
|
|
152
165
|
this.generateCalendar();
|
|
166
|
+
if (this.calendarPosition === 'dynamic') {
|
|
167
|
+
this.calculateDynamicPosition();
|
|
168
|
+
// Update transforms for show state
|
|
169
|
+
setTimeout(() => this.updateCalendarTransforms(true), 10);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this.calendarPositionClass = '';
|
|
173
|
+
}
|
|
153
174
|
}
|
|
154
175
|
this.cdr.markForCheck();
|
|
155
|
-
// Emit after DOM update
|
|
156
176
|
setTimeout(() => {
|
|
157
177
|
this.calendarStateChange.emit(this.showCalendar);
|
|
158
178
|
}, 0);
|
|
@@ -162,11 +182,134 @@ export class WslDatetimePickerComponent {
|
|
|
162
182
|
this.showCalendar = false;
|
|
163
183
|
this.showTimePickerToggle = false;
|
|
164
184
|
this.cdr.markForCheck();
|
|
165
|
-
// Emit after DOM update
|
|
166
185
|
setTimeout(() => {
|
|
167
186
|
this.calendarStateChange.emit(false);
|
|
168
187
|
}, 0);
|
|
169
188
|
}
|
|
189
|
+
calculateDynamicPosition() {
|
|
190
|
+
setTimeout(() => {
|
|
191
|
+
const containerElement = this.elRef.nativeElement;
|
|
192
|
+
const calendarElement = containerElement?.querySelector('.calendar-popover');
|
|
193
|
+
if (!containerElement || !calendarElement)
|
|
194
|
+
return;
|
|
195
|
+
const containerRect = containerElement.getBoundingClientRect();
|
|
196
|
+
const calendarIconElement = containerElement.querySelector('.calendar-icon');
|
|
197
|
+
const iconRect = calendarIconElement?.getBoundingClientRect() || containerRect;
|
|
198
|
+
const viewportWidth = window.innerWidth;
|
|
199
|
+
const viewportHeight = window.innerHeight;
|
|
200
|
+
const isMobile = viewportWidth <= 576;
|
|
201
|
+
const calendarWidth = isMobile
|
|
202
|
+
? Math.min(calendarElement.offsetWidth || 350, viewportWidth - 32)
|
|
203
|
+
: calendarElement.offsetWidth || 350;
|
|
204
|
+
const calendarHeight = calendarElement.offsetHeight || 400;
|
|
205
|
+
if (isMobile) {
|
|
206
|
+
this.applyMobilePositioning(calendarElement, iconRect, viewportWidth, calendarWidth);
|
|
207
|
+
const verticalClass = this.getVerticalPositionClass(containerRect, viewportHeight, calendarHeight);
|
|
208
|
+
this.calendarPositionClass = verticalClass;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
this.clearInlineStyles(calendarElement);
|
|
212
|
+
const horizontalClass = this.getHorizontalPositionClass(containerRect, viewportWidth, calendarWidth, isMobile);
|
|
213
|
+
const verticalClass = this.getVerticalPositionClass(containerRect, viewportHeight, calendarHeight);
|
|
214
|
+
this.calendarPositionClass =
|
|
215
|
+
`${horizontalClass} ${verticalClass}`.trim();
|
|
216
|
+
}
|
|
217
|
+
this.cdr.markForCheck();
|
|
218
|
+
}, 0);
|
|
219
|
+
}
|
|
220
|
+
applyMobilePositioning(element, iconRect, viewportWidth, calendarWidth) {
|
|
221
|
+
const padding = 16;
|
|
222
|
+
const wouldOverflowRight = iconRect.right + calendarWidth + padding > viewportWidth;
|
|
223
|
+
const wouldOverflowLeft = iconRect.left - calendarWidth - padding < 0;
|
|
224
|
+
if (wouldOverflowRight && wouldOverflowLeft) {
|
|
225
|
+
element.style.left = `${(viewportWidth - calendarWidth) / 2}px`;
|
|
226
|
+
element.style.right = 'auto';
|
|
227
|
+
}
|
|
228
|
+
else if (wouldOverflowRight) {
|
|
229
|
+
element.style.left = 'unset';
|
|
230
|
+
element.style.right = '0';
|
|
231
|
+
}
|
|
232
|
+
else if (wouldOverflowLeft) {
|
|
233
|
+
element.style.left = '0';
|
|
234
|
+
element.style.right = 'unset';
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
element.style.left = 'unset';
|
|
238
|
+
element.style.right = '0';
|
|
239
|
+
}
|
|
240
|
+
element.style.maxWidth = `${calendarWidth}px`;
|
|
241
|
+
element.style.transform = 'translateY(-10px)';
|
|
242
|
+
}
|
|
243
|
+
clearInlineStyles(element) {
|
|
244
|
+
element.style.left = '';
|
|
245
|
+
element.style.right = '';
|
|
246
|
+
element.style.maxWidth = '';
|
|
247
|
+
element.style.transform = '';
|
|
248
|
+
}
|
|
249
|
+
updateCalendarTransforms(isShow) {
|
|
250
|
+
const containerElement = this.elRef.nativeElement;
|
|
251
|
+
if (!containerElement)
|
|
252
|
+
return;
|
|
253
|
+
const calendarElement = containerElement.querySelector('.calendar-popover');
|
|
254
|
+
if (!calendarElement)
|
|
255
|
+
return;
|
|
256
|
+
const isMobile = window.innerWidth <= 576;
|
|
257
|
+
const isTopPosition = this.calendarPositionClass.includes('calendar-position-top');
|
|
258
|
+
if (isMobile &&
|
|
259
|
+
this.calendarPositionClass.includes('calendar-mobile-center')) {
|
|
260
|
+
// Dynamic mobile centering with proper transforms
|
|
261
|
+
if (isShow) {
|
|
262
|
+
calendarElement.style.transform = isTopPosition
|
|
263
|
+
? 'translateY(0)'
|
|
264
|
+
: 'translateY(0)';
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
calendarElement.style.transform = isTopPosition
|
|
268
|
+
? 'translateY(10px)'
|
|
269
|
+
: 'translateY(-10px)';
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
getHorizontalPositionClass(containerRect, viewportWidth, calendarWidth, isMobile) {
|
|
274
|
+
if (isMobile) {
|
|
275
|
+
const mobilePadding = 16;
|
|
276
|
+
// Check if calendar would overflow when growing right from icon (default)
|
|
277
|
+
const wouldOverflowRight = containerRect.right + calendarWidth + mobilePadding > viewportWidth;
|
|
278
|
+
// Check if calendar would overflow when growing left from left edge
|
|
279
|
+
const wouldOverflowLeft = containerRect.left - calendarWidth - mobilePadding < 0;
|
|
280
|
+
if (wouldOverflowRight && wouldOverflowLeft) {
|
|
281
|
+
// No space on either side - center it
|
|
282
|
+
return 'calendar-mobile-center';
|
|
283
|
+
}
|
|
284
|
+
if (!wouldOverflowRight) {
|
|
285
|
+
// Fits growing right from icon - but still use right alignment to ensure padding
|
|
286
|
+
return 'calendar-align-right';
|
|
287
|
+
}
|
|
288
|
+
// Would overflow right but fits on left - align to left edge
|
|
289
|
+
return 'calendar-align-left';
|
|
290
|
+
}
|
|
291
|
+
// Desktop logic
|
|
292
|
+
const wouldOverflowRight = containerRect.right + calendarWidth > viewportWidth;
|
|
293
|
+
if (!wouldOverflowRight) {
|
|
294
|
+
return ''; // Default positioning (grows right from icon)
|
|
295
|
+
}
|
|
296
|
+
const spaceLeft = containerRect.left;
|
|
297
|
+
if (spaceLeft >= calendarWidth) {
|
|
298
|
+
return 'calendar-align-left'; // Grow right from left edge
|
|
299
|
+
}
|
|
300
|
+
return ''; // Use default as fallback
|
|
301
|
+
}
|
|
302
|
+
getVerticalPositionClass(containerRect, viewportHeight, calendarHeight) {
|
|
303
|
+
const spaceBelow = viewportHeight - containerRect.bottom;
|
|
304
|
+
const spaceAbove = containerRect.top;
|
|
305
|
+
if (spaceBelow >= calendarHeight)
|
|
306
|
+
return 'calendar-position-bottom';
|
|
307
|
+
if (spaceAbove >= calendarHeight)
|
|
308
|
+
return 'calendar-position-top';
|
|
309
|
+
return spaceBelow >= spaceAbove
|
|
310
|
+
? 'calendar-position-bottom'
|
|
311
|
+
: 'calendar-position-top';
|
|
312
|
+
}
|
|
170
313
|
navigateMonth(direction) {
|
|
171
314
|
this.currentMonth += direction;
|
|
172
315
|
if (this.currentMonth > 12) {
|
|
@@ -389,7 +532,6 @@ export class WslDatetimePickerComponent {
|
|
|
389
532
|
}
|
|
390
533
|
writeValue(newModel) {
|
|
391
534
|
if (newModel) {
|
|
392
|
-
// Parse without timezone conversion
|
|
393
535
|
const parsedModel = DateTimeModel.fromLocalString(newModel, false);
|
|
394
536
|
if (parsedModel && typeof parsedModel.year === 'number') {
|
|
395
537
|
this.datetime = Object.assign(this.datetime || new DateTimeModel(), parsedModel);
|
|
@@ -623,14 +765,11 @@ export class WslDatetimePickerComponent {
|
|
|
623
765
|
typeof this.datetime.day === 'number');
|
|
624
766
|
}
|
|
625
767
|
initializeMonthsAndYears() {
|
|
626
|
-
// Initialize months
|
|
627
768
|
this.months = Array.from({ length: 12 }, (_, i) => this.getMonthName(i + 1));
|
|
628
|
-
// Initialize years based on min/max dates or default range
|
|
629
769
|
const currentYear = new Date().getFullYear();
|
|
630
770
|
const startYear = this.minDate?.year || currentYear - 50;
|
|
631
771
|
const endYear = this.maxDate?.year || currentYear + 50;
|
|
632
|
-
|
|
633
|
-
this.years = Array.from({ length: endYear - startYear + 1 }, (_, i) => endYear - i).sort((a, b) => b - a); // Sort in descending order
|
|
772
|
+
this.years = Array.from({ length: endYear - startYear + 1 }, (_, i) => endYear - i).sort((a, b) => b - a);
|
|
634
773
|
}
|
|
635
774
|
onMonthSelect(event) {
|
|
636
775
|
const select = event.target;
|
|
@@ -660,14 +799,14 @@ export class WslDatetimePickerComponent {
|
|
|
660
799
|
}
|
|
661
800
|
}
|
|
662
801
|
}
|
|
663
|
-
WslDatetimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WslDatetimePickerComponent, deps: [{ token: i0.Injector }, { token: i1.WslConfigService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
664
|
-
WslDatetimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: WslDatetimePickerComponent, selector: "wsl-datetime-picker", inputs: { dateString: "dateString", inputDatetimeFormat: "inputDatetimeFormat", hoursStep: "hoursStep", minutesStep: "minutesStep", secondsStep: "secondsStep", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", disableCalendar: "disableCalendar", allowedDates: "allowedDates", standardFormat: "standardFormat", seconds: "seconds" }, outputs: { monthChanged: "monthChanged", calendarStateChange: "calendarStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
|
|
802
|
+
WslDatetimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WslDatetimePickerComponent, deps: [{ token: i0.Injector }, { token: i1.WslConfigService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
803
|
+
WslDatetimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: WslDatetimePickerComponent, selector: "wsl-datetime-picker", inputs: { dateString: "dateString", inputDatetimeFormat: "inputDatetimeFormat", hoursStep: "hoursStep", minutesStep: "minutesStep", secondsStep: "secondsStep", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", disableCalendar: "disableCalendar", calendarPosition: "calendarPosition", allowedDates: "allowedDates", standardFormat: "standardFormat", seconds: "seconds" }, outputs: { monthChanged: "monthChanged", calendarStateChange: "calendarStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "window:resize": "onWindowResize($event)", "window:scroll": "onWindowScroll($event)" } }, providers: [
|
|
665
804
|
{
|
|
666
805
|
provide: NG_VALUE_ACCESSOR,
|
|
667
806
|
useExisting: forwardRef(() => WslDatetimePickerComponent),
|
|
668
807
|
multi: true,
|
|
669
808
|
},
|
|
670
|
-
], usesOnChanges: true, ngImport: i0, template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{'ng-valid': ngControl?.valid === true, 'ng-invalid': ngControl?.invalid === true, 'ng-disabled': disabled}\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"/>\n </div>\n\n <button type=\"button\" \n class=\"calendar-icon\" \n [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{'disabled-btn': disabled || disableCalendar}\"\n (click)=\"toggleCalendar($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\" (click)=\"$event.stopPropagation()\">\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">{{ month }}</option>\n </select>\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n \n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">{{ day }}</div>\n </div>\n \n <div class=\"days\">\n <div class=\"day-cell\" \n *ngFor=\"let day of calendarDays\" \n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n \n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n \n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n \n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || 'HH' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.hours || 0\" \n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"23\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\">:</div>\n \n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || 'mm' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.minutes || 0\" \n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n \n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || 'ss' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.seconds || 0\" \n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div class=\"calendar-backdrop\" \n [class.show]=\"showCalendar\" \n (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:100%;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.datetime-picker-container{position:unset}.calendar-popover{left:50%}.calendar-popover.show{transform:translate(-50%)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.WslTooltipDirective, selector: "[wslTooltip]", inputs: ["tooltipPlacement", "tooltipOffset", "tooltipIconOverlap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
809
|
+
], usesOnChanges: true, ngImport: i0, template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{\n 'ng-valid': ngControl?.valid === true,\n 'ng-invalid': ngControl?.invalid === true,\n 'ng-disabled': disabled\n }\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"calendar-icon\"\n [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\"\n (click)=\"toggleCalendar($event)\"\n >\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div\n class=\"calendar-popover\"\n [class.show]=\"showCalendar\"\n [class.hidden]=\"!showCalendar\"\n [ngClass]=\"calendarPositionClass\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button\n type=\"button\"\n class=\"nav-btn\"\n (click)=\"navigateMonth(-1)\"\n [disabled]=\"disabled\"\n >\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select\n class=\"month-select\"\n [(ngModel)]=\"currentMonth\"\n (change)=\"onMonthSelect($event)\"\n [disabled]=\"disabled\"\n >\n <option\n *ngFor=\"let month of months; let i = index\"\n [value]=\"i + 1\"\n >\n {{ month }}\n </option>\n </select>\n <select\n class=\"year-select\"\n [(ngModel)]=\"currentYear\"\n (change)=\"onYearSelect($event)\"\n [disabled]=\"disabled\"\n >\n <option *ngFor=\"let year of years\" [value]=\"year\">\n {{ year }}\n </option>\n </select>\n </div>\n <button\n type=\"button\"\n class=\"nav-btn\"\n (click)=\"navigateMonth(1)\"\n [disabled]=\"disabled\"\n >\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n\n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\n {{ day }}\n </div>\n </div>\n\n <div class=\"days\">\n <div\n class=\"day-cell\"\n *ngFor=\"let day of calendarDays\"\n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\"\n >\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\"\n >\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n\n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\"\n >\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <div\n class=\"time-picker-container\"\n *ngIf=\"showTimeControls && !isDateOnly\"\n >\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('hours', hoursStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.hours || 0\"\n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"23\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('hours', -(hoursStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\">:</div>\n\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('minutes', minutesStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.minutes || 0\"\n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"59\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n\n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('seconds', secondsStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.seconds || 0\"\n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"59\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div\n class=\"calendar-backdrop\"\n [class.show]=\"showCalendar\"\n (click)=\"closeCalendar()\"\n></div>\n", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:-webkit-fill-available;height:-moz-available;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.WslTooltipDirective, selector: "[wslTooltip]", inputs: ["tooltipPlacement", "tooltipOffset", "tooltipIconOverlap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
671
810
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: WslDatetimePickerComponent, decorators: [{
|
|
672
811
|
type: Component,
|
|
673
812
|
args: [{ selector: 'wsl-datetime-picker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
@@ -676,8 +815,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
676
815
|
useExisting: forwardRef(() => WslDatetimePickerComponent),
|
|
677
816
|
multi: true,
|
|
678
817
|
},
|
|
679
|
-
], template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{'ng-valid': ngControl?.valid === true, 'ng-invalid': ngControl?.invalid === true, 'ng-disabled': disabled}\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"/>\n </div>\n\n <button type=\"button\" \n class=\"calendar-icon\" \n [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{'disabled-btn': disabled || disableCalendar}\"\n (click)=\"toggleCalendar($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\" (click)=\"$event.stopPropagation()\">\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">{{ month }}</option>\n </select>\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\" [disabled]=\"disabled\">\n <option *ngFor=\"let year of years\" [value]=\"year\">{{ year }}</option>\n </select>\n </div>\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n \n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">{{ day }}</div>\n </div>\n \n <div class=\"days\">\n <div class=\"day-cell\" \n *ngFor=\"let day of calendarDays\" \n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\">\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n \n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n \n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\">\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n \n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || 'HH' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.hours || 0\" \n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"23\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\">:</div>\n \n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || 'mm' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.minutes || 0\" \n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n \n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n \n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || 'ss' }}</label>\n <div class=\"time-input-group\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input type=\"number\" \n class=\"time-input\" \n [value]=\"datetime?.seconds || 0\" \n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\" max=\"59\">\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\" [disabled]=\"!hasValidDate() || disabled\">\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div class=\"calendar-backdrop\" \n [class.show]=\"showCalendar\" \n (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:100%;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.datetime-picker-container{position:unset}.calendar-popover{left:50%}.calendar-popover.show{transform:translate(-50%)}}\n"] }]
|
|
680
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.WslConfigService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { dateString: [{
|
|
818
|
+
], template: "<div class=\"datetime-picker-container\">\n <div class=\"input-container\">\n <input\n #dateInput\n [ngClass]=\"{\n 'ng-valid': ngControl?.valid === true,\n 'ng-invalid': ngControl?.invalid === true,\n 'ng-disabled': disabled\n }\"\n class=\"datetime-input\"\n (blur)=\"inputBlur()\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"getDisplayValue()\"\n (change)=\"onInputChange($event)\"\n [disabled]=\"disabled\"\n wslTooltip\n [tooltipIconOverlap]=\"12\"\n tooltipPlacement=\"top\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"calendar-icon\"\n [disabled]=\"disabled || disableCalendar\"\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\"\n (click)=\"toggleCalendar($event)\"\n >\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <!-- Custom Calendar Popover -->\n <div\n class=\"calendar-popover\"\n [class.show]=\"showCalendar\"\n [class.hidden]=\"!showCalendar\"\n [ngClass]=\"calendarPositionClass\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"popover-content\">\n <div *ngIf=\"!showTimePickerToggle\">\n <!-- Custom Date Picker -->\n <div class=\"custom-datepicker\">\n <div class=\"datepicker-header\">\n <button\n type=\"button\"\n class=\"nav-btn\"\n (click)=\"navigateMonth(-1)\"\n [disabled]=\"disabled\"\n >\n <i class=\"fa fa-chevron-left\"></i>\n </button>\n <div class=\"month-year-selects\">\n <select\n class=\"month-select\"\n [(ngModel)]=\"currentMonth\"\n (change)=\"onMonthSelect($event)\"\n [disabled]=\"disabled\"\n >\n <option\n *ngFor=\"let month of months; let i = index\"\n [value]=\"i + 1\"\n >\n {{ month }}\n </option>\n </select>\n <select\n class=\"year-select\"\n [(ngModel)]=\"currentYear\"\n (change)=\"onYearSelect($event)\"\n [disabled]=\"disabled\"\n >\n <option *ngFor=\"let year of years\" [value]=\"year\">\n {{ year }}\n </option>\n </select>\n </div>\n <button\n type=\"button\"\n class=\"nav-btn\"\n (click)=\"navigateMonth(1)\"\n [disabled]=\"disabled\"\n >\n <i class=\"fa fa-chevron-right\"></i>\n </button>\n </div>\n\n <div class=\"datepicker-calendar\">\n <div class=\"weekdays\">\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\n {{ day }}\n </div>\n </div>\n\n <div class=\"days\">\n <div\n class=\"day-cell\"\n *ngFor=\"let day of calendarDays\"\n [class.other-month]=\"day.otherMonth\"\n [class.selected]=\"day.selected\"\n [class.disabled]=\"day.disabled\"\n [class.today]=\"day.today\"\n (click)=\"selectDate(day)\"\n >\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-time-btn\"\n type=\"button\"\n [disabled]=\"!hasValidDate() || disabled\"\n (click)=\"toggleDateTimeState($event)\"\n >\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\n </button>\n </div>\n\n <div *ngIf=\"showTimePickerToggle\">\n <button\n *ngIf=\"showTimeControls && !isDateOnly\"\n class=\"toggle-calendar-btn\"\n type=\"button\"\n (click)=\"toggleDateTimeState($event)\"\n >\n <i class=\"fa fa-calendar fa-lg\"></i>\n </button>\n\n <div\n class=\"time-picker-container\"\n *ngIf=\"showTimeControls && !isDateOnly\"\n >\n <!-- Custom Time Picker -->\n <div class=\"custom-timepicker\">\n <div class=\"time-controls\">\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('hours', hoursStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.hours || 0\"\n (change)=\"onTimeFieldChange('hours', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"23\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('hours', -(hoursStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\">:</div>\n\n <div class=\"time-field\">\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('minutes', minutesStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.minutes || 0\"\n (change)=\"onTimeFieldChange('minutes', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"59\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\n\n <div class=\"time-field\" *ngIf=\"seconds\">\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\n <div class=\"time-input-group\">\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('seconds', secondsStep || 1)\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-up\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-input\"\n [value]=\"datetime?.seconds || 0\"\n (change)=\"onTimeFieldChange('seconds', $event)\"\n [disabled]=\"!hasValidDate() || disabled\"\n min=\"0\"\n max=\"59\"\n />\n <button\n type=\"button\"\n class=\"time-btn\"\n (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\n [disabled]=\"!hasValidDate() || disabled\"\n >\n <i class=\"fa fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<!-- Backdrop for closing popover -->\n<div\n class=\"calendar-backdrop\"\n [class.show]=\"showCalendar\"\n (click)=\"closeCalendar()\"\n></div>\n", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:-webkit-fill-available;height:-moz-available;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+ .input-container > .datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-feature-settings:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"] }]
|
|
819
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.WslConfigService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { dateString: [{
|
|
681
820
|
type: Input
|
|
682
821
|
}], inputDatetimeFormat: [{
|
|
683
822
|
type: Input
|
|
@@ -695,6 +834,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
695
834
|
type: Input
|
|
696
835
|
}], disableCalendar: [{
|
|
697
836
|
type: Input
|
|
837
|
+
}], calendarPosition: [{
|
|
838
|
+
type: Input
|
|
698
839
|
}], allowedDates: [{
|
|
699
840
|
type: Input
|
|
700
841
|
}], monthChanged: [{
|
|
@@ -708,5 +849,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
708
849
|
}], onDocumentClick: [{
|
|
709
850
|
type: HostListener,
|
|
710
851
|
args: ['document:click', ['$event']]
|
|
852
|
+
}], onWindowResize: [{
|
|
853
|
+
type: HostListener,
|
|
854
|
+
args: ['window:resize', ['$event']]
|
|
855
|
+
}], onWindowScroll: [{
|
|
856
|
+
type: HostListener,
|
|
857
|
+
args: ['window:scroll', ['$event']]
|
|
711
858
|
}] } });
|
|
712
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy13c2wtbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvd3NsLWRhdGV0aW1lLXBpY2tlci93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy93c2wtZGF0ZXRpbWUtcGlja2VyL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFFWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFDaEYsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsR0FDbkIsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7O0FBK0JuRCxNQUFNLE9BQU8sMEJBQTBCO0lBK0ZyQyxZQUNVLEdBQWEsRUFDYixhQUErQixFQUMvQixHQUFzQjtRQUZ0QixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBNUZ4QixtQkFBYyxHQUFHLEtBQUss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QkFDWjtxQkFDRjs4SkFLUSxVQUFVO3NCQUFsQixLQUFLO2dCQU1GLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFXRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFLRixZQUFZO3NCQURmLEtBQUs7Z0JBc0JJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQW9CSCxjQUFjO3NCQURqQixLQUFLO2dCQVlGLE9BQU87c0JBRFYsS0FBSztnQkF3Q04sZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9vcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRGF0ZVRpbWVNb2RlbCxcbiAgV3NsRGF0ZVN0cnVjdCxcbiAgV3NsVGltZVN0cnVjdCxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3dzbC1kYXRlLXRpbWUubW9kZWwnO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0RGF0ZUZvcm1hdENvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy93c2wtZGF0ZS1mb3JtYXRzJztcbmltcG9ydCB7IERhdGVGb3JtYXRDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RhdGUtZm9ybWF0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBXc2xDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnL3dzbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGdldEN1cnJlbnREYXRlLCBnZXRDdXJyZW50RGF0ZVRpbWVNb2RlbCB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGUtdGltZSc7XG5pbXBvcnQge1xuICBUSU1FX1NURVBTLFxuICBJTlBVVF9EQVRFX0ZPUk1BVFMsXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cy9kYXRldGltZS1waWNrZXIuY29uc3RhbnRzJztcblxuLy8gV1NMIGludGVyZmFjZXMgZm9yIGNvbXBvbmVudC1zcGVjaWZpYyB0eXBlc1xuZXhwb3J0IGludGVyZmFjZSBXc2xEYXRlcGlja2VyTmF2aWdhdGVFdmVudCB7XG4gIGN1cnJlbnQ6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH07XG4gIG5leHQ6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJEYXkge1xuICBkYXk6IG51bWJlcjtcbiAgbW9udGg6IG51bWJlcjtcbiAgeWVhcjogbnVtYmVyO1xuICBvdGhlck1vbnRoOiBib29sZWFuO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHRvZGF5OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3c2wtZGF0ZXRpbWUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFdzbERhdGV0aW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFdzbERhdGV0aW1lUGlja2VyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcbntcbiAgQElucHV0KCkgZGF0ZVN0cmluZyE6IHN0cmluZztcblxuICBwcml2YXRlIF9pbnB1dERhdGV0aW1lRm9ybWF0Pzogc3RyaW5nO1xuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGlucHV0RGF0ZXRpbWVGb3JtYXQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pbnB1dERhdGV0aW1lRm9ybWF0ID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBnZXQgaW5wdXREYXRldGltZUZvcm1hdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dERhdGV0aW1lRm9ybWF0O1xuICB9XG5cbiAgQElucHV0KCkgaG91cnNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLkhPVVJTO1xuICBASW5wdXQoKSBtaW51dGVzU3RlcDogbnVtYmVyID0gVElNRV9TVEVQUy5NSU5VVEVTO1xuICBASW5wdXQoKSBzZWNvbmRzU3RlcDogbnVtYmVyID0gVElNRV9TVEVQUy5TRUNPTkRTO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhEYXRlOiBXc2xEYXRlU3RydWN0O1xuICBASW5wdXQoKSBtaW5EYXRlOiBXc2xEYXRlU3RydWN0O1xuICBASW5wdXQoKSBkaXNhYmxlQ2FsZW5kYXIgPSBmYWxzZTtcblxuICBwcml2YXRlIF9hbGxvd2VkRGF0ZXMhOiBXc2xEYXRlU3RydWN0W107XG5cbiAgQElucHV0KClcbiAgc2V0IGFsbG93ZWREYXRlcyh2YWx1ZTogV3NsRGF0ZVN0cnVjdFtdKSB7XG4gICAgdGhpcy5fYWxsb3dlZERhdGVzID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhbGxvd2VkRGF0ZXMoKTogV3NsRGF0ZVN0cnVjdFtdIHtcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZERhdGVzO1xuICB9XG5cbiAgaW50ZXJuYWxGb3JtYXQ6IHN0cmluZyA9IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XG4gIHByaXZhdGUgX3N0YW5kYXJkRm9ybWF0OiBzdHJpbmcgPSBJTlBVVF9EQVRFX0ZPUk1BVFMuRVVfREFURV9EQVNIO1xuXG4gIHBsYWNlaG9sZGVyID0gJyc7XG4gIHN0YXJ0RGF0ZTogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfSA9IHsgeWVhcjogMCwgbW9udGg6IDAgfTtcbiAgc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcbiAgZGF0ZXRpbWU6IERhdGVUaW1lTW9kZWwgPSBuZXcgRGF0ZVRpbWVNb2RlbCgpO1xuICBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xuICBkYXRlQ29uZmlnITogRGF0ZUZvcm1hdENvbmZpZztcblxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjYWxlbmRhclN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgb25DaGFuZ2U6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIGxhbmd1YWdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgc2hvd1RpbWVDb250cm9scyA9IGZhbHNlO1xuICBwcml2YXRlIF9zZWNvbmRzID0gZmFsc2U7XG4gIHByaXZhdGUgX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICBzaG93Q2FsZW5kYXIgPSBmYWxzZTtcbiAgY3VycmVudFllYXI6IG51bWJlcjtcbiAgY3VycmVudE1vbnRoOiBudW1iZXI7XG4gIGNhbGVuZGFyRGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xuICB3ZWVrZGF5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIG1vbnRoczogc3RyaW5nW10gPSBbXTtcbiAgeWVhcnM6IG51bWJlcltdID0gW107XG4gIGRlZmF1bHRZZWFyUmFuZ2UgPSB7IHN0YXJ0OiAyMDAwLCBlbmQ6IDIwNTAgfTtcblxuICBASW5wdXQoKVxuICBzZXQgc3RhbmRhcmRGb3JtYXQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9zdGFuZGFyZEZvcm1hdCA9PT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBzdGFuZGFyZEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGFuZGFyZEZvcm1hdDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBzZWNvbmRzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX3NlY29uZHMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5fc2Vjb25kcyA9IHZhbHVlO1xuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBzZWNvbmRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWNvbmRzO1xuICB9XG5cbiAgaXNEYXRlT25seSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IFdzbENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICB0aGlzLmN1cnJlbnRZZWFyID0gY3VycmVudERhdGUueWVhcjtcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IGN1cnJlbnREYXRlLm1vbnRoO1xuXG4gICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmNvbmZpZ1NlcnZpY2VcbiAgICAgIC53YXRjaExhbmd1YWdlKClcbiAgICAgIC5zdWJzY3JpYmUoKGxhbmd1YWdlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZyhsYW5ndWFnZSB8fCAnZW4nKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVdlZWtkYXlMYWJlbHMoKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVdlZWtkYXlMYWJlbHMoKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0NhbGVuZGFyKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBjYWxlbmRhckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FsZW5kYXItcG9wb3ZlcicpO1xuICAgICAgY29uc3QgYnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci1pY29uJyk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgY2FsZW5kYXJFbGVtZW50ICYmXG4gICAgICAgIGJ1dHRvbkVsZW1lbnQgJiZcbiAgICAgICAgIWNhbGVuZGFyRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmXG4gICAgICAgICFidXR0b25FbGVtZW50LmNvbnRhaW5zKHRhcmdldClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qLmdldChOZ0NvbnRyb2wpO1xuICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxhbmd1YWdlQ29uZmlndXJhdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XG4gICAgdGhpcy51cGRhdGVXZWVrZGF5TGFiZWxzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZSA9IHRoaXMuY29uZmlnU2VydmljZS5sYW5ndWFnZTtcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoY3VycmVudExhbmd1YWdlIHx8ICdlbicpO1xuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJyk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ21pbkRhdGUnXSB8fCBjaGFuZ2VzWydtYXhEYXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snYWxsb3dlZERhdGVzJ10pIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLmRpc2FibGVDYWxlbmRhcikge1xuICAgICAgdGhpcy5zaG93Q2FsZW5kYXIgPSAhdGhpcy5zaG93Q2FsZW5kYXI7XG4gICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIpIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgLy8gRW1pdCBhZnRlciBET00gdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQodGhpcy5zaG93Q2FsZW5kYXIpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VDYWxlbmRhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIEVtaXQgYWZ0ZXIgRE9NIHVwZGF0ZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgbmF2aWdhdGVNb250aChkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudE1vbnRoICs9IGRpcmVjdGlvbjtcbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGggPiAxMikge1xuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxO1xuICAgICAgdGhpcy5jdXJyZW50WWVhcisrO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50TW9udGggPCAxKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IDEyO1xuICAgICAgdGhpcy5jdXJyZW50WWVhci0tO1xuICAgIH1cblxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQodGhpcy5jdXJyZW50TW9udGgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5KTogdm9pZCB7XG4gICAgaWYgKGRheS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlOiBXc2xEYXRlU3RydWN0ID0ge1xuICAgICAgeWVhcjogZGF5LnllYXIsXG4gICAgICBtb250aDogZGF5Lm1vbnRoLFxuICAgICAgZGF5OiBkYXkuZGF5LFxuICAgIH07XG5cbiAgICB0aGlzLm9uRGF0ZUNoYW5nZShzZWxlY3RlZERhdGUpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoIC0gMSwgMSk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZmlyc3REYXkpO1xuXG4gICAgY29uc3Qgd2Vla1N0YXJ0ID0gdGhpcy5kYXRlQ29uZmlnPy53ZWVrU3RhcnQgfHwgMTtcbiAgICBjb25zdCBkYXlPZldlZWsgPSAoZmlyc3REYXkuZ2V0RGF5KCkgKyA3IC0gd2Vla1N0YXJ0KSAlIDc7XG4gICAgc3RhcnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSAtIGRheU9mV2Vlayk7XG5cbiAgICB0aGlzLmNhbGVuZGFyRGF5cyA9IFtdO1xuICAgIGNvbnN0IHRvZGF5RGF0ZSA9IGdldEN1cnJlbnREYXRlKCk7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSh0b2RheURhdGUueWVhciwgdG9kYXlEYXRlLm1vbnRoIC0gMSwgdG9kYXlEYXRlLmRheSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQyOyBpKyspIHtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICAgIGN1cnJlbnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSArIGkpO1xuXG4gICAgICBjb25zdCBkYXlTdHJ1Y3Q6IFdzbERhdGVTdHJ1Y3QgPSB7XG4gICAgICAgIHllYXI6IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgZGF5OiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjYWxlbmRhckRheTogQ2FsZW5kYXJEYXkgPSB7XG4gICAgICAgIGRheTogY3VycmVudERhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICBtb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgIHllYXI6IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIG90aGVyTW9udGg6IGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxICE9PSB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuaXNEYXRlU2VsZWN0ZWQoZGF5U3RydWN0KSxcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF5U3RydWN0KSxcbiAgICAgICAgdG9kYXk6IHRoaXMuaXNTYW1lRGF0ZShjdXJyZW50RGF0ZSwgdG9kYXkpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5jYWxlbmRhckRheXMucHVzaChjYWxlbmRhckRheSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVTZWxlY3RlZChkYXRlOiBXc2xEYXRlU3RydWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5kYXRldGltZSAmJlxuICAgICAgdGhpcy5kYXRldGltZS55ZWFyID09PSBkYXRlLnllYXIgJiZcbiAgICAgIHRoaXMuZGF0ZXRpbWUubW9udGggPT09IGRhdGUubW9udGggJiZcbiAgICAgIHRoaXMuZGF0ZXRpbWUuZGF5ID09PSBkYXRlLmRheVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZURpc2FibGVkKGRhdGU6IFdzbERhdGVTdHJ1Y3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXRlLnllYXIsIGRhdGUubW9udGggLSAxLCBkYXRlLmRheSk7XG4gICAgY29uc3QgdG9kYXlEYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKHRvZGF5RGF0ZS55ZWFyLCB0b2RheURhdGUubW9udGggLSAxLCB0b2RheURhdGUuZGF5KTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcbiAgICAgIGNvbnN0IG1heERhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgdGhpcy5tYXhEYXRlLnllYXIsXG4gICAgICAgIHRoaXMubWF4RGF0ZS5tb250aCAtIDEsXG4gICAgICAgIHRoaXMubWF4RGF0ZS5kYXlcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWREYXRlID4gbWF4RGF0ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5EYXRlKSB7XG4gICAgICBjb25zdCBtaW5EYXRlID0gbmV3IERhdGUoXG4gICAgICAgIHRoaXMubWluRGF0ZS55ZWFyLFxuICAgICAgICB0aGlzLm1pbkRhdGUubW9udGggLSAxLFxuICAgICAgICB0aGlzLm1pbkRhdGUuZGF5XG4gICAgICApO1xuICAgICAgaWYgKHNlbGVjdGVkRGF0ZSA8IG1pbkRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgJiZcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXNbMF0uZGF5ID09PSAtMVxuICAgICkge1xuICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0ZSA+IHRvZGF5O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hbGxvd2VkRGF0ZXMgfHwgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0FsbG93ZWQgPSB0aGlzLmFsbG93ZWREYXRlcy5maW5kKFxuICAgICAgKGRheUFsbG93ZWQpID0+XG4gICAgICAgIGRheUFsbG93ZWQueWVhciA9PT0gZGF0ZS55ZWFyICYmXG4gICAgICAgIGRheUFsbG93ZWQubW9udGggPT09IGRhdGUubW9udGggJiZcbiAgICAgICAgZGF5QWxsb3dlZC5kYXkgPT09IGRhdGUuZGF5XG4gICAgKTtcblxuICAgIHJldHVybiAhaXNBbGxvd2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVEYXRlKGRhdGUxOiBEYXRlLCBkYXRlMjogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBkYXRlMS5nZXRGdWxsWWVhcigpID09PSBkYXRlMi5nZXRGdWxsWWVhcigpICYmXG4gICAgICBkYXRlMS5nZXRNb250aCgpID09PSBkYXRlMi5nZXRNb250aCgpICYmXG4gICAgICBkYXRlMS5nZXREYXRlKCkgPT09IGRhdGUyLmdldERhdGUoKVxuICAgICk7XG4gIH1cblxuICBnZXRNb250aE5hbWUobW9udGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhJbmRleCA9IG1vbnRoIC0gMTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy5tb250aE5hbWVzPy5bbW9udGhJbmRleF0gfHxcbiAgICAgIGdldERhdGVGb3JtYXRDb25maWcoJ2VuJykubW9udGhOYW1lc1ttb250aEluZGV4XVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVdlZWtkYXlMYWJlbHMoKTogdm9pZCB7XG4gICAgdGhpcy53ZWVrZGF5TGFiZWxzID1cbiAgICAgIHRoaXMuZGF0ZUNvbmZpZz8ud2Vla2RheUxhYmVscyB8fCBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpLndlZWtkYXlMYWJlbHM7XG4gIH1cblxuICBhZGp1c3RUaW1lKGZpZWxkOiAnaG91cnMnIHwgJ21pbnV0ZXMnIHwgJ3NlY29uZHMnLCBzdGVwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5kYXRldGltZVtmaWVsZF0gfHwgMDtcbiAgICBsZXQgbmV3VmFsdWU6IG51bWJlcjtcblxuICAgIGlmIChzdGVwID4gMCkge1xuICAgICAgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgKyBzdGVwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdGVwU2l6ZSA9IE1hdGguYWJzKHN0ZXApO1xuICAgICAgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgLSBzdGVwU2l6ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGlmIChuZXdWYWx1ZSA8IDApIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IDI0ICsgKG5ld1ZhbHVlICUgMjQpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID4gMjMpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlICUgMjQ7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBpZiAobmV3VmFsdWUgPCAwKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSA2MCArIChuZXdWYWx1ZSAlIDYwKTtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdWYWx1ZSA+IDU5KSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZSAlIDYwO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZXRpbWVbZmllbGRdID0gbmV3VmFsdWU7XG4gICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uVGltZUZpZWxkQ2hhbmdlKFxuICAgIGZpZWxkOiAnaG91cnMnIHwgJ21pbnV0ZXMnIHwgJ3NlY29uZHMnLFxuICAgIGV2ZW50OiBFdmVudFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlSW50KGlucHV0LnZhbHVlLCAxMCk7XG5cbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IDA7XG4gICAgfVxuXG4gICAgc3dpdGNoIChmaWVsZCkge1xuICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSA+IDIzKSB2YWx1ZSA9IDIzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMDtcbiAgICAgICAgaWYgKHZhbHVlID4gNTkpIHZhbHVlID0gNTk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlucHV0LnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuXG4gICAgdGhpcy5kYXRldGltZVtmaWVsZF0gPSB2YWx1ZTtcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgdGhpcy5fdXBkYXRlUGVuZGluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5fdXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29uZmlndXJhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmRldGVjdFRpbWVDb21wb25lbnRzKCk7XG4gICAgdGhpcy5zZXRTdGFuZGFyZEZvcm1hdCgpO1xuICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0VGltZUNvbXBvbmVudHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCkge1xuICAgICAgY29uc3QgaGFzVGltZUZvcm1hdCA9IHRoaXMuaGFzVGltZUluRm9ybWF0KHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCk7XG5cbiAgICAgIGlmICghaGFzVGltZUZvcm1hdCkge1xuICAgICAgICB0aGlzLnNob3dUaW1lQ29udHJvbHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2Vjb25kcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRGF0ZU9ubHkgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IHRydWU7XG4gICAgICB0aGlzLmlzRGF0ZU9ubHkgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3NlY29uZHMgPSB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQuaW5jbHVkZXMoJzpzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dUaW1lQ29udHJvbHMgPSB0aGlzLl9zZWNvbmRzO1xuICAgICAgdGhpcy5pc0RhdGVPbmx5ID0gIXRoaXMuX3NlY29uZHM7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNUaW1lSW5Gb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCdISDonKSB8fFxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCdoaDonKSB8fFxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCc6bW0nKSB8fFxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCc6c3MnKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YW5kYXJkRm9ybWF0KCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxGb3JtYXQgPVxuICAgICAgdGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0IHx8IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XG4gICAgdGhpcy5fc3RhbmRhcmRGb3JtYXQgPSB0aGlzLmludGVybmFsRm9ybWF0O1xuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5oYXNUaW1lSW5Gb3JtYXQodGhpcy5fc3RhbmRhcmRGb3JtYXQpKSB7XG4gICAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCArPSB0aGlzLl9zZWNvbmRzID8gJyBISDptbTpzcycgOiAnIEhIOm1tJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFBsYWNlaG9sZGVyKCk6IHZvaWQge1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPVxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy5wbGFjZWhvbGRlcj8udG9Mb3dlckNhc2UoKSB8fFxuICAgICAgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scykge1xuICAgICAgdGhpcy5wbGFjZWhvbGRlciArPSB0aGlzLl9zZWNvbmRzID8gJyBoaDptbTpzcycgOiAnIGhoOm1tJztcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKG5ld01vZGVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobmV3TW9kZWwpIHtcbiAgICAgIC8vIFBhcnNlIHdpdGhvdXQgdGltZXpvbmUgY29udmVyc2lvblxuICAgICAgY29uc3QgcGFyc2VkTW9kZWwgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyhuZXdNb2RlbCwgZmFsc2UpO1xuXG4gICAgICBpZiAocGFyc2VkTW9kZWwgJiYgdHlwZW9mIHBhcnNlZE1vZGVsLnllYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuZGF0ZXRpbWUgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUgfHwgbmV3IERhdGVUaW1lTW9kZWwoKSxcbiAgICAgICAgICBwYXJzZWRNb2RlbFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGVTdHJpbmcgPSBuZXdNb2RlbDtcbiAgICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKCk7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSAnJztcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlKGV2ZW50OiBXc2xEYXRlcGlja2VyTmF2aWdhdGVFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudD8uY3VycmVudCAmJiBldmVudD8uY3VycmVudC5tb250aCAhPT0gZXZlbnQ/Lm5leHQubW9udGgpIHtcbiAgICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQoZXZlbnQ/Lm5leHQubW9udGgpO1xuICAgIH1cbiAgfVxuXG4gIGlzRGlzYWJsZWQoXG4gICAgZGF0ZXM6IFdzbERhdGVTdHJ1Y3RbXVxuICApOiAoXG4gICAgZGF0ZTogV3NsRGF0ZVN0cnVjdCxcbiAgICBjdXJyZW50PzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfVxuICApID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiAocGlja2VyRGF0ZTogV3NsRGF0ZVN0cnVjdCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxBbGxvd2VkRGF0ZXMgPSB0aGlzLmFsbG93ZWREYXRlcztcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzID0gZGF0ZXM7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKHBpY2tlckRhdGUpO1xuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgPSBvcmlnaW5hbEFsbG93ZWREYXRlcztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICB0b2dnbGVEYXRlVGltZVN0YXRlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1ZhbGlkRGF0ZSgpKSB7XG4gICAgICB0aGlzLnNob3dUaW1lUGlja2VyVG9nZ2xlID0gIXRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGU7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlbGltaXRlcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmZvcm1hdCkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGVDb25maWcuZm9ybWF0Lm1hdGNoKC9bXmEtekEtWjAtOV0vKTtcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGVDb25maWc/LmRhdGVTZXBhcmF0b3IgfHwgJy0nO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZURhdGUodmFsdWU6IHN0cmluZyk6IFdzbERhdGVTdHJ1Y3QgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxpbWl0ZXIgPSB0aGlzLmdldERlbGltaXRlcigpO1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZS5zcGxpdChkZWxpbWl0ZXIpO1xuXG4gICAgaWYgKGRhdGUubGVuZ3RoIDwgMykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmRheUZpcnN0KSB7XG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KGRhdGVbMF0sIDEwKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChkYXRlWzFdLCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxuICAgICAgICAgIGRheSA8IDEgfHxcbiAgICAgICAgICBkYXkgPiAzMSB8fFxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxuICAgICAgICAgIG1vbnRoID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkYXksIG1vbnRoLCB5ZWFyIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3JtYXQ6IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFkgKHl5eXktTU0tZGQpXG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVsxXSwgMTApO1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxuICAgICAgICAgIGRheSA8IDEgfHxcbiAgICAgICAgICBkYXkgPiAzMSB8fFxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxuICAgICAgICAgIG1vbnRoID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkYXRlOiBXc2xEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsaW1pdGVyID0gdGhpcy5nZXREZWxpbWl0ZXIoKTtcbiAgICBjb25zdCBkYXlGb3JtYXR0ZWQgPSBkYXRlLmRheSA8IDEwID8gJzAnICsgZGF0ZS5kYXkgOiBkYXRlLmRheS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1vbnRoRm9ybWF0dGVkID1cbiAgICAgIGRhdGUubW9udGggPCAxMCA/ICcwJyArIGRhdGUubW9udGggOiBkYXRlLm1vbnRoLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgeWVhckZvcm1hdHRlZCA9IGRhdGUueWVhci50b1N0cmluZygpO1xuXG4gICAgaWYgKHRoaXMuZGF0ZUNvbmZpZz8uZGF5Rmlyc3QpIHtcbiAgICAgIHJldHVybiBgJHtkYXlGb3JtYXR0ZWR9JHtkZWxpbWl0ZXJ9JHttb250aEZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke3llYXJGb3JtYXR0ZWR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7eWVhckZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke21vbnRoRm9ybWF0dGVkfSR7ZGVsaW1pdGVyfSR7ZGF5Rm9ybWF0dGVkfWA7XG4gIH1cblxuICBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblxuICAgIGlmICh2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcbiAgICBpZiAocGFyc2VkRGF0ZSkge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcbiAgICAgICAgeWVhcjogcGFyc2VkRGF0ZS55ZWFyLFxuICAgICAgICBtb250aDogcGFyc2VkRGF0ZS5tb250aCxcbiAgICAgICAgZGF5OiBwYXJzZWREYXRlLmRheSxcbiAgICAgICAgaG91cnM6IHRoaXMuZGF0ZXRpbWU/LmhvdXJzIHx8IDAsXG4gICAgICAgIG1pbnV0ZXM6IHRoaXMuZGF0ZXRpbWU/Lm1pbnV0ZXMgfHwgMCxcbiAgICAgICAgc2Vjb25kczogdGhpcy5kYXRldGltZT8uc2Vjb25kcyB8fCAwLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHQgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyh2YWx1ZSk7XG4gICAgaWYgKGR0ICYmIGR0LnllYXIpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkdDtcbiAgICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBzdHJpbmcgfCBXc2xEYXRlU3RydWN0KTogdm9pZCB7XG4gICAgbGV0IGRhdGU6IERhdGVUaW1lTW9kZWw7XG5cbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlVGltZU1vZGVsKHRoaXMucGFyc2VEYXRlKGV2ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZVRpbWVNb2RlbChldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRlIHx8ICFkYXRlLnllYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGF0ZXRpbWUpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZXRpbWUueWVhciA9IGRhdGUueWVhcjtcbiAgICB0aGlzLmRhdGV0aW1lLm1vbnRoID0gZGF0ZS5tb250aDtcbiAgICB0aGlzLmRhdGV0aW1lLmRheSA9IGRhdGUuZGF5O1xuXG4gICAgdGhpcy5jdXJyZW50WWVhciA9IGRhdGUueWVhcjtcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IGRhdGUubW9udGg7XG5cbiAgICB0aGlzLnN0YXJ0RGF0ZSA9IHtcbiAgICAgIHllYXI6IGRhdGUueWVhcixcbiAgICAgIG1vbnRoOiBkYXRlLm1vbnRoLFxuICAgIH07XG5cbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICB9XG5cbiAgc2V0RGF0ZVN0cmluZ01vZGVsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGV0aW1lICYmIHR5cGVvZiB0aGlzLmRhdGV0aW1lLnllYXIgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSB0aGlzLmRhdGV0aW1lLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0ZVN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0ZXRpbWUgJiYgdGhpcy5kYXRldGltZS55ZWFyKSB7XG4gICAgICBjb25zdCBkYXRlU3RydWN0OiBXc2xEYXRlU3RydWN0ID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmRhdGV0aW1lLnllYXIsXG4gICAgICAgIG1vbnRoOiB0aGlzLmRhdGV0aW1lLm1vbnRoLFxuICAgICAgICBkYXk6IHRoaXMuZGF0ZXRpbWUuZGF5LFxuICAgICAgfTtcblxuICAgICAgbGV0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlU3RydWN0KTtcblxuICAgICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5pc0RhdGVPbmx5KSB7XG4gICAgICAgIGNvbnN0IGhvdXIgPVxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUuaG91cnMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUuaG91cnMgOiAwO1xuICAgICAgICBjb25zdCBtaW51dGUgPVxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUubWludXRlcyAhPT0gdW5kZWZpbmVkID8gdGhpcy5kYXRldGltZS5taW51dGVzIDogMDtcbiAgICAgICAgY29uc3Qgc2Vjb25kID1cbiAgICAgICAgICB0aGlzLmRhdGV0aW1lLnNlY29uZHMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUuc2Vjb25kcyA6IDA7XG5cbiAgICAgICAgY29uc3QgaG91ckZvcm1hdHRlZCA9IGhvdXIgPCAxMCA/ICcwJyArIGhvdXIgOiBob3VyLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZUZvcm1hdHRlZCA9IG1pbnV0ZSA8IDEwID8gJzAnICsgbWludXRlIDogbWludXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHNlY29uZEZvcm1hdHRlZCA9IHNlY29uZCA8IDEwID8gJzAnICsgc2Vjb25kIDogc2Vjb25kLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgZGlzcGxheVZhbHVlICs9IGAgJHtob3VyRm9ybWF0dGVkfToke21pbnV0ZUZvcm1hdHRlZH1gO1xuXG4gICAgICAgIGlmICh0aGlzLnNlY29uZHMpIHtcbiAgICAgICAgICBkaXNwbGF5VmFsdWUgKz0gYDoke3NlY29uZEZvcm1hdHRlZH1gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaXNwbGF5VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlucHV0Qmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgZ2V0RWZmZWN0aXZlRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgbGV0IGZvcm1hdCA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCB8fCBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZO1xuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5oYXNUaW1lSW5Gb3JtYXQoZm9ybWF0KSkge1xuICAgICAgZm9ybWF0ICs9IHRoaXMuX3NlY29uZHMgPyAnIEhIOm1tOnNzJyA6ICcgSEg6bW0nO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBvblRpbWVDaGFuZ2UoZXZlbnQ6IFdzbFRpbWVTdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcbiAgICAgIC4uLnRoaXMuZGF0ZXRpbWUsXG4gICAgICBob3VyczogZXZlbnQuaG91cnMsXG4gICAgICBtaW51dGVzOiBldmVudC5taW51dGVzLFxuICAgICAgc2Vjb25kczogZXZlbnQuc2Vjb25kcyxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBoYXNWYWxpZERhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5kYXRldGltZSAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUueWVhciA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmRhdGV0aW1lLm1vbnRoID09PSAnbnVtYmVyJyAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUuZGF5ID09PSAnbnVtYmVyJ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVNb250aHNBbmRZZWFycygpOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsaXplIG1vbnRoc1xuICAgIHRoaXMubW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+XG4gICAgICB0aGlzLmdldE1vbnRoTmFtZShpICsgMSlcbiAgICApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB5ZWFycyBiYXNlZCBvbiBtaW4vbWF4IGRhdGVzIG9yIGRlZmF1bHQgcmFuZ2VcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLm1pbkRhdGU/LnllYXIgfHwgY3VycmVudFllYXIgLSA1MDtcbiAgICBjb25zdCBlbmRZZWFyID0gdGhpcy5tYXhEYXRlPy55ZWFyIHx8IGN1cnJlbnRZZWFyICsgNTA7XG5cbiAgICAvLyBDcmVhdGUgYXJyYXkgb2YgeWVhcnMgaW4gZGVzY2VuZGluZyBvcmRlclxuICAgIHRoaXMueWVhcnMgPSBBcnJheS5mcm9tKFxuICAgICAgeyBsZW5ndGg6IGVuZFllYXIgLSBzdGFydFllYXIgKyAxIH0sXG4gICAgICAoXywgaSkgPT4gZW5kWWVhciAtIGlcbiAgICApLnNvcnQoKGEsIGIpID0+IGIgLSBhKTsgLy8gU29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyXG4gIH1cblxuICBvbk1vbnRoU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICBjb25zdCBuZXdNb250aCA9IHBhcnNlSW50KHNlbGVjdC52YWx1ZSwgMTApO1xuICAgIGlmIChuZXdNb250aCAhPT0gdGhpcy5jdXJyZW50TW9udGgpIHtcbiAgICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5jdXJyZW50TW9udGg7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ld01vbnRoO1xuICAgICAgdGhpcy5tb250aENoYW5nZWQuZW1pdChuZXdNb250aCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xuICAgICAgICBjdXJyZW50OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBvbGRNb250aCB9LFxuICAgICAgICBuZXh0OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBuZXdNb250aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25ZZWFyU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICBjb25zdCBuZXdZZWFyID0gcGFyc2VJbnQoc2VsZWN0LnZhbHVlLCAxMCk7XG4gICAgaWYgKG5ld1llYXIgIT09IHRoaXMuY3VycmVudFllYXIpIHtcbiAgICAgIGNvbnN0IG9sZFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyO1xuICAgICAgdGhpcy5jdXJyZW50WWVhciA9IG5ld1llYXI7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xuICAgICAgICBjdXJyZW50OiB7IHllYXI6IG9sZFllYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxuICAgICAgICBuZXh0OiB7IHllYXI6IG5ld1llYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtcGlja2VyLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgPGlucHV0XG4gICAgICAjZGF0ZUlucHV0XG4gICAgICBbbmdDbGFzc109XCJ7J25nLXZhbGlkJzogbmdDb250cm9sPy52YWxpZCA9PT0gdHJ1ZSwgJ25nLWludmFsaWQnOiBuZ0NvbnRyb2w/LmludmFsaWQgPT09IHRydWUsICduZy1kaXNhYmxlZCc6IGRpc2FibGVkfVwiXG4gICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgIChibHVyKT1cImlucHV0Qmx1cigpXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICBbbmdNb2RlbF09XCJnZXREaXNwbGF5VmFsdWUoKVwiXG4gICAgICAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgd3NsVG9vbHRpcFxuICAgICAgW3Rvb2x0aXBJY29uT3ZlcmxhcF09XCIxMlwiXG4gICAgICB0b29sdGlwUGxhY2VtZW50PVwidG9wXCIvPlxuICA8L2Rpdj5cblxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBcbiAgICBjbGFzcz1cImNhbGVuZGFyLWljb25cIiBcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgZGlzYWJsZUNhbGVuZGFyXCJcbiAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGVkLWJ0bic6IGRpc2FibGVkIHx8IGRpc2FibGVDYWxlbmRhcn1cIlxuICAgIChjbGljayk9XCJ0b2dnbGVDYWxlbmRhcigkZXZlbnQpXCI+XG4gICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBmYS1sZ1wiPjwvaT5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBDdXN0b20gQ2FsZW5kYXIgUG9wb3ZlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXBvcG92ZXJcIiBbY2xhc3Muc2hvd109XCJzaG93Q2FsZW5kYXJcIiBbY2xhc3MuaGlkZGVuXT1cIiFzaG93Q2FsZW5kYXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudFwiPlxuICAgICAgPGRpdiAqbmdJZj1cIiFzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxuICAgICAgICA8IS0tIEN1c3RvbSBEYXRlIFBpY2tlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kYXRlcGlja2VyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItaGVhZGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmF2aWdhdGVNb250aCgtMSlcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnRcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXNlbGVjdHNcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cIm1vbnRoLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiY3VycmVudE1vbnRoXCIgKGNoYW5nZSk9XCJvbk1vbnRoU2VsZWN0KCRldmVudClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIiBbdmFsdWVdPVwiaSArIDFcIj57eyBtb250aCB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInllYXItc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJjdXJyZW50WWVhclwiIChjaGFuZ2UpPVwib25ZZWFyU2VsZWN0KCRldmVudClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCIgW3ZhbHVlXT1cInllYXJcIj57eyB5ZWFyIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmF2aWdhdGVNb250aCgxKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHRcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1jYWxlbmRhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlZWtkYXlzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrZGF5XCIgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrZGF5TGFiZWxzXCI+e3sgZGF5IH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheS1jZWxsXCIgXG4gICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBjYWxlbmRhckRheXNcIiBcbiAgICAgICAgICAgICAgICAgICBbY2xhc3Mub3RoZXItbW9udGhdPVwiZGF5Lm90aGVyTW9udGhcIlxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXkuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJkYXkudG9kYXlcIlxuICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIj5cbiAgICAgICAgICAgICAgICB7eyBkYXkuZGF5IH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd1RpbWVDb250cm9scyAmJiAhaXNEYXRlT25seVwiXG4gICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtdGltZS1idG5cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNsb2NrIGZhLWNsb2NrLW8gZmEtbGdcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCJcbiAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1jYWxlbmRhci1idG5cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIGZhLWxnXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1jb250YWluZXJcIiAqbmdJZj1cInNob3dUaW1lQ29udHJvbHMgJiYgIWlzRGF0ZU9ubHlcIj5cbiAgICAgICAgICA8IS0tIEN1c3RvbSBUaW1lIFBpY2tlciAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRpbWVwaWNrZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7IGRhdGVDb25maWc/LnRva2Vucz8uaG91cnMgfHwgJ0hIJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCBob3Vyc1N0ZXAgfHwgMSlcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtaW5wdXRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGF0ZXRpbWU/LmhvdXJzIHx8IDBcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdob3VycycsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj1cIjBcIiBtYXg9XCIyM1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0aW1lLWJ0blwiIChjbGljayk9XCJhZGp1c3RUaW1lKCdob3VycycsIC0oaG91cnNTdGVwIHx8IDEpKVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIj46PC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/Lm1pbnV0ZXMgfHwgJ21tJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnbWludXRlcycsIG1pbnV0ZXNTdGVwIHx8IDEpXCIgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGV0aW1lPy5taW51dGVzIHx8IDBcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdtaW51dGVzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiIG1heD1cIjU5XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ21pbnV0ZXMnLCAtKG1pbnV0ZXNTdGVwIHx8IDEpKVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIiAqbmdJZj1cInNlY29uZHNcIj46PC9kaXY+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiICpuZ0lmPVwic2Vjb25kc1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LnNlY29uZHMgfHwgJ3NzJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnc2Vjb25kcycsIHNlY29uZHNTdGVwIHx8IDEpXCIgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGV0aW1lPy5zZWNvbmRzIHx8IDBcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdzZWNvbmRzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiIG1heD1cIjU5XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ3NlY29uZHMnLCAtKHNlY29uZHNTdGVwIHx8IDEpKVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBCYWNrZHJvcCBmb3IgY2xvc2luZyBwb3BvdmVyIC0tPlxuPGRpdiBjbGFzcz1cImNhbGVuZGFyLWJhY2tkcm9wXCIgXG4gICAgIFtjbGFzcy5zaG93XT1cInNob3dDYWxlbmRhclwiIFxuICAgICAoY2xpY2spPVwiY2xvc2VDYWxlbmRhcigpXCI+PC9kaXY+Il19
|
|
859
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy13c2wtbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvd3NsLWRhdGV0aW1lLXBpY2tlci93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy93c2wtZGF0ZXRpbWUtcGlja2VyL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxHQUdkLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFFWixLQUFLLEVBSUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFDaEYsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsR0FDbkIsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7O0FBK0JuRCxNQUFNLE9BQU8sMEJBQTBCO0lBa0dyQyxZQUNVLEdBQWEsRUFDYixhQUErQixFQUMvQixHQUFzQixFQUN0QixLQUFpQjtRQUhqQixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQ2Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFVBQUss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TSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwyQkFBMkIsQ0FBQzs0QkFDekQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7dUxBS1EsVUFBVTtzQkFBbEIsS0FBSztnQkFNRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBV0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUtGLFlBQVk7c0JBRGYsS0FBSztnQkFzQkksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBc0JILGNBQWM7c0JBRGpCLEtBQUs7Z0JBWUYsT0FBTztzQkFEVixLQUFLO2dCQXlDTixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBbUIxQyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVF6QyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9vcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRGF0ZVRpbWVNb2RlbCxcbiAgV3NsRGF0ZVN0cnVjdCxcbiAgV3NsVGltZVN0cnVjdCxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3dzbC1kYXRlLXRpbWUubW9kZWwnO1xuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0RGF0ZUZvcm1hdENvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVscy93c2wtZGF0ZS1mb3JtYXRzJztcbmltcG9ydCB7IERhdGVGb3JtYXRDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RhdGUtZm9ybWF0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBXc2xDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnL3dzbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGdldEN1cnJlbnREYXRlLCBnZXRDdXJyZW50RGF0ZVRpbWVNb2RlbCB9IGZyb20gJy4uLy4uL3V0aWxzL2RhdGUtdGltZSc7XG5pbXBvcnQge1xuICBUSU1FX1NURVBTLFxuICBJTlBVVF9EQVRFX0ZPUk1BVFMsXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cy9kYXRldGltZS1waWNrZXIuY29uc3RhbnRzJztcblxuLy8gV1NMIGludGVyZmFjZXMgZm9yIGNvbXBvbmVudC1zcGVjaWZpYyB0eXBlc1xuZXhwb3J0IGludGVyZmFjZSBXc2xEYXRlcGlja2VyTmF2aWdhdGVFdmVudCB7XG4gIGN1cnJlbnQ6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH07XG4gIG5leHQ6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJEYXkge1xuICBkYXk6IG51bWJlcjtcbiAgbW9udGg6IG51bWJlcjtcbiAgeWVhcjogbnVtYmVyO1xuICBvdGhlck1vbnRoOiBib29sZWFuO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHRvZGF5OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3c2wtZGF0ZXRpbWUtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFdzbERhdGV0aW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFdzbERhdGV0aW1lUGlja2VyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcbntcbiAgQElucHV0KCkgZGF0ZVN0cmluZyE6IHN0cmluZztcblxuICBwcml2YXRlIF9pbnB1dERhdGV0aW1lRm9ybWF0Pzogc3RyaW5nO1xuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGlucHV0RGF0ZXRpbWVGb3JtYXQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9pbnB1dERhdGV0aW1lRm9ybWF0ID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBnZXQgaW5wdXREYXRldGltZUZvcm1hdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dERhdGV0aW1lRm9ybWF0O1xuICB9XG5cbiAgQElucHV0KCkgaG91cnNTdGVwOiBudW1iZXIgPSBUSU1FX1NURVBTLkhPVVJTO1xuICBASW5wdXQoKSBtaW51dGVzU3RlcDogbnVtYmVyID0gVElNRV9TVEVQUy5NSU5VVEVTO1xuICBASW5wdXQoKSBzZWNvbmRzU3RlcDogbnVtYmVyID0gVElNRV9TVEVQUy5TRUNPTkRTO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhEYXRlOiBXc2xEYXRlU3RydWN0O1xuICBASW5wdXQoKSBtaW5EYXRlOiBXc2xEYXRlU3RydWN0O1xuICBASW5wdXQoKSBkaXNhYmxlQ2FsZW5kYXIgPSBmYWxzZTtcbiAgQElucHV0KCkgY2FsZW5kYXJQb3NpdGlvbjogJ3N0YXRpYycgfCAnZHluYW1pYycgPSAnZHluYW1pYyc7XG5cbiAgcHJpdmF0ZSBfYWxsb3dlZERhdGVzITogV3NsRGF0ZVN0cnVjdFtdO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBhbGxvd2VkRGF0ZXModmFsdWU6IFdzbERhdGVTdHJ1Y3RbXSkge1xuICAgIHRoaXMuX2FsbG93ZWREYXRlcyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYWxsb3dlZERhdGVzKCk6IFdzbERhdGVTdHJ1Y3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93ZWREYXRlcztcbiAgfVxuXG4gIGludGVybmFsRm9ybWF0OiBzdHJpbmcgPSBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZO1xuICBwcml2YXRlIF9zdGFuZGFyZEZvcm1hdDogc3RyaW5nID0gSU5QVVRfREFURV9GT1JNQVRTLkVVX0RBVEVfREFTSDtcblxuICBwbGFjZWhvbGRlciA9ICcnO1xuICBzdGFydERhdGU6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH0gPSB7IHllYXI6IDAsIG1vbnRoOiAwIH07XG4gIHNob3dUaW1lUGlja2VyVG9nZ2xlID0gZmFsc2U7XG4gIGRhdGV0aW1lOiBEYXRlVGltZU1vZGVsID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcbiAgbmdDb250cm9sOiBOZ0NvbnRyb2wgfCBudWxsID0gbnVsbDtcbiAgZGF0ZUNvbmZpZyE6IERhdGVGb3JtYXRDb25maWc7XG5cbiAgQE91dHB1dCgpIG1vbnRoQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY2FsZW5kYXJTdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIG9uQ2hhbmdlOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBsYW5ndWFnZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHNob3dUaW1lQ29udHJvbHMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2Vjb25kcyA9IGZhbHNlO1xuICBwcml2YXRlIF91cGRhdGVQZW5kaW5nID0gZmFsc2U7XG5cbiAgc2hvd0NhbGVuZGFyID0gZmFsc2U7XG4gIGN1cnJlbnRZZWFyOiBudW1iZXI7XG4gIGN1cnJlbnRNb250aDogbnVtYmVyO1xuICBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcbiAgd2Vla2RheUxhYmVsczogc3RyaW5nW10gPSBbXTtcblxuICBjYWxlbmRhclBvc2l0aW9uQ2xhc3MgPSAnJztcblxuICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xuICBkZWZhdWx0WWVhclJhbmdlID0geyBzdGFydDogMjAwMCwgZW5kOiAyMDUwIH07XG5cbiAgQElucHV0KClcbiAgc2V0IHN0YW5kYXJkRm9ybWF0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fc3RhbmRhcmRGb3JtYXQgPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5fc3RhbmRhcmRGb3JtYXQgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBnZXQgc3RhbmRhcmRGb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhbmRhcmRGb3JtYXQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc2Vjb25kcyh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9zZWNvbmRzID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuX3NlY29uZHMgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBnZXQgc2Vjb25kcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vjb25kcztcbiAgfVxuXG4gIGlzRGF0ZU9ubHkgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGluajogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBXc2xDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmXG4gICkge1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICB0aGlzLmN1cnJlbnRZZWFyID0gY3VycmVudERhdGUueWVhcjtcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IGN1cnJlbnREYXRlLm1vbnRoO1xuXG4gICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmNvbmZpZ1NlcnZpY2VcbiAgICAgIC53YXRjaExhbmd1YWdlKClcbiAgICAgIC5zdWJzY3JpYmUoKGxhbmd1YWdlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZyhsYW5ndWFnZSB8fCAnZW4nKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVdlZWtkYXlMYWJlbHMoKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVdlZWtkYXlMYWJlbHMoKTtcbiAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0NhbGVuZGFyKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBjYWxlbmRhckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FsZW5kYXItcG9wb3ZlcicpO1xuICAgICAgY29uc3QgYnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci1pY29uJyk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgY2FsZW5kYXJFbGVtZW50ICYmXG4gICAgICAgIGJ1dHRvbkVsZW1lbnQgJiZcbiAgICAgICAgIWNhbGVuZGFyRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmXG4gICAgICAgICFidXR0b25FbGVtZW50LmNvbnRhaW5zKHRhcmdldClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0NhbGVuZGFyICYmIHRoaXMuY2FsZW5kYXJQb3NpdGlvbiA9PT0gJ2R5bmFtaWMnKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUR5bmFtaWNQb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxuICBvbldpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIgJiYgdGhpcy5jYWxlbmRhclBvc2l0aW9uID09PSAnZHluYW1pYycpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlRHluYW1pY1Bvc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluai5nZXQoTmdDb250cm9sKTtcbiAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTtcbiAgICB0aGlzLmluaXRpYWxpemVNb250aHNBbmRZZWFycygpO1xuICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplTGFuZ3VhZ2VDb25maWd1cmF0aW9uKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2UgPSB0aGlzLmNvbmZpZ1NlcnZpY2UubGFuZ3VhZ2U7XG4gICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKGN1cnJlbnRMYW5ndWFnZSB8fCAnZW4nKTtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydtaW5EYXRlJ10gfHwgY2hhbmdlc1snbWF4RGF0ZSddKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVNb250aHNBbmRZZWFycygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2FsbG93ZWREYXRlcyddKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYW5ndWFnZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sYW5ndWFnZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUNhbGVuZGFyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5kaXNhYmxlQ2FsZW5kYXIpIHtcbiAgICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gIXRoaXMuc2hvd0NhbGVuZGFyO1xuICAgICAgaWYgKHRoaXMuc2hvd0NhbGVuZGFyKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xuICAgICAgICBpZiAodGhpcy5jYWxlbmRhclBvc2l0aW9uID09PSAnZHluYW1pYycpIHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUR5bmFtaWNQb3NpdGlvbigpO1xuICAgICAgICAgIC8vIFVwZGF0ZSB0cmFuc2Zvcm1zIGZvciBzaG93IHN0YXRlXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZUNhbGVuZGFyVHJhbnNmb3Jtcyh0cnVlKSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2FsZW5kYXJQb3NpdGlvbkNsYXNzID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQodGhpcy5zaG93Q2FsZW5kYXIpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VDYWxlbmRhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEeW5hbWljUG9zaXRpb24oKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3QgY2FsZW5kYXJFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJy5jYWxlbmRhci1wb3BvdmVyJ1xuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKCFjb250YWluZXJFbGVtZW50IHx8ICFjYWxlbmRhckVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjYWxlbmRhckljb25FbGVtZW50ID0gY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLmNhbGVuZGFyLWljb24nXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgaWNvblJlY3QgPVxuICAgICAgICBjYWxlbmRhckljb25FbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCBjb250YWluZXJSZWN0O1xuICAgICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICBjb25zdCBpc01vYmlsZSA9IHZpZXdwb3J0V2lkdGggPD0gNTc2O1xuXG4gICAgICBjb25zdCBjYWxlbmRhcldpZHRoID0gaXNNb2JpbGVcbiAgICAgICAgPyBNYXRoLm1pbihjYWxlbmRhckVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMzUwLCB2aWV3cG9ydFdpZHRoIC0gMzIpXG4gICAgICAgIDogY2FsZW5kYXJFbGVtZW50Lm9mZnNldFdpZHRoIHx8IDM1MDtcbiAgICAgIGNvbnN0IGNhbGVuZGFySGVpZ2h0ID0gY2FsZW5kYXJFbGVtZW50Lm9mZnNldEhlaWdodCB8fCA0MDA7XG5cbiAgICAgIGlmIChpc01vYmlsZSkge1xuICAgICAgICB0aGlzLmFwcGx5TW9iaWxlUG9zaXRpb25pbmcoXG4gICAgICAgICAgY2FsZW5kYXJFbGVtZW50LFxuICAgICAgICAgIGljb25SZWN0LFxuICAgICAgICAgIHZpZXdwb3J0V2lkdGgsXG4gICAgICAgICAgY2FsZW5kYXJXaWR0aFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbENsYXNzID0gdGhpcy5nZXRWZXJ0aWNhbFBvc2l0aW9uQ2xhc3MoXG4gICAgICAgICAgY29udGFpbmVyUmVjdCxcbiAgICAgICAgICB2aWV3cG9ydEhlaWdodCxcbiAgICAgICAgICBjYWxlbmRhckhlaWdodFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNhbGVuZGFyUG9zaXRpb25DbGFzcyA9IHZlcnRpY2FsQ2xhc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsZWFySW5saW5lU3R5bGVzKGNhbGVuZGFyRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWxDbGFzcyA9IHRoaXMuZ2V0SG9yaXpvbnRhbFBvc2l0aW9uQ2xhc3MoXG4gICAgICAgICAgY29udGFpbmVyUmVjdCxcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoLFxuICAgICAgICAgIGNhbGVuZGFyV2lkdGgsXG4gICAgICAgICAgaXNNb2JpbGVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdmVydGljYWxDbGFzcyA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbkNsYXNzKFxuICAgICAgICAgIGNvbnRhaW5lclJlY3QsXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHQsXG4gICAgICAgICAgY2FsZW5kYXJIZWlnaHRcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MgPVxuICAgICAgICAgIGAke2hvcml6b250YWxDbGFzc30gJHt2ZXJ0aWNhbENsYXNzfWAudHJpbSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5TW9iaWxlUG9zaXRpb25pbmcoXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgaWNvblJlY3Q6IERPTVJlY3QsXG4gICAgdmlld3BvcnRXaWR0aDogbnVtYmVyLFxuICAgIGNhbGVuZGFyV2lkdGg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYWRkaW5nID0gMTY7XG4gICAgY29uc3Qgd291bGRPdmVyZmxvd1JpZ2h0ID1cbiAgICAgIGljb25SZWN0LnJpZ2h0ICsgY2FsZW5kYXJXaWR0aCArIHBhZGRpbmcgPiB2aWV3cG9ydFdpZHRoO1xuICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dMZWZ0ID0gaWNvblJlY3QubGVmdCAtIGNhbGVuZGFyV2lkdGggLSBwYWRkaW5nIDwgMDtcblxuICAgIGlmICh3b3VsZE92ZXJmbG93UmlnaHQgJiYgd291bGRPdmVyZmxvd0xlZnQpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IGAkeyh2aWV3cG9ydFdpZHRoIC0gY2FsZW5kYXJXaWR0aCkgLyAyfXB4YDtcbiAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnYXV0byc7XG4gICAgfSBlbHNlIGlmICh3b3VsZE92ZXJmbG93UmlnaHQpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICd1bnNldCc7XG4gICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0gJzAnO1xuICAgIH0gZWxzZSBpZiAod291bGRPdmVyZmxvd0xlZnQpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAndW5zZXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAndW5zZXQnO1xuICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9ICcwJztcbiAgICB9XG5cbiAgICBlbGVtZW50LnN0eWxlLm1heFdpZHRoID0gYCR7Y2FsZW5kYXJXaWR0aH1weGA7XG4gICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgtMTBweCknO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhcklubGluZVN0eWxlcyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICcnO1xuICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJztcbiAgICBlbGVtZW50LnN0eWxlLm1heFdpZHRoID0gJyc7XG4gICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJUcmFuc2Zvcm1zKGlzU2hvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXJFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCBjYWxlbmRhckVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLmNhbGVuZGFyLXBvcG92ZXInXG4gICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWNhbGVuZGFyRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8PSA1NzY7XG4gICAgY29uc3QgaXNUb3BQb3NpdGlvbiA9IHRoaXMuY2FsZW5kYXJQb3NpdGlvbkNsYXNzLmluY2x1ZGVzKFxuICAgICAgJ2NhbGVuZGFyLXBvc2l0aW9uLXRvcCdcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgaXNNb2JpbGUgJiZcbiAgICAgIHRoaXMuY2FsZW5kYXJQb3NpdGlvbkNsYXNzLmluY2x1ZGVzKCdjYWxlbmRhci1tb2JpbGUtY2VudGVyJylcbiAgICApIHtcbiAgICAgIC8vIER5bmFtaWMgbW9iaWxlIGNlbnRlcmluZyB3aXRoIHByb3BlciB0cmFuc2Zvcm1zXG4gICAgICBpZiAoaXNTaG93KSB7XG4gICAgICAgIGNhbGVuZGFyRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBpc1RvcFBvc2l0aW9uXG4gICAgICAgICAgPyAndHJhbnNsYXRlWSgwKSdcbiAgICAgICAgICA6ICd0cmFuc2xhdGVZKDApJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGVuZGFyRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBpc1RvcFBvc2l0aW9uXG4gICAgICAgICAgPyAndHJhbnNsYXRlWSgxMHB4KSdcbiAgICAgICAgICA6ICd0cmFuc2xhdGVZKC0xMHB4KSc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRIb3Jpem9udGFsUG9zaXRpb25DbGFzcyhcbiAgICBjb250YWluZXJSZWN0OiBET01SZWN0LFxuICAgIHZpZXdwb3J0V2lkdGg6IG51bWJlcixcbiAgICBjYWxlbmRhcldpZHRoOiBudW1iZXIsXG4gICAgaXNNb2JpbGU6IGJvb2xlYW5cbiAgKTogc3RyaW5nIHtcbiAgICBpZiAoaXNNb2JpbGUpIHtcbiAgICAgIGNvbnN0IG1vYmlsZVBhZGRpbmcgPSAxNjtcblxuICAgICAgLy8gQ2hlY2sgaWYgY2FsZW5kYXIgd291bGQgb3ZlcmZsb3cgd2hlbiBncm93aW5nIHJpZ2h0IGZyb20gaWNvbiAoZGVmYXVsdClcbiAgICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dSaWdodCA9XG4gICAgICAgIGNvbnRhaW5lclJlY3QucmlnaHQgKyBjYWxlbmRhcldpZHRoICsgbW9iaWxlUGFkZGluZyA+IHZpZXdwb3J0V2lkdGg7XG5cbiAgICAgIC8vIENoZWNrIGlmIGNhbGVuZGFyIHdvdWxkIG92ZXJmbG93IHdoZW4gZ3Jvd2luZyBsZWZ0IGZyb20gbGVmdCBlZGdlXG4gICAgICBjb25zdCB3b3VsZE92ZXJmbG93TGVmdCA9XG4gICAgICAgIGNvbnRhaW5lclJlY3QubGVmdCAtIGNhbGVuZGFyV2lkdGggLSBtb2JpbGVQYWRkaW5nIDwgMDtcblxuICAgICAgaWYgKHdvdWxkT3ZlcmZsb3dSaWdodCAmJiB3b3VsZE92ZXJmbG93TGVmdCkge1xuICAgICAgICAvLyBObyBzcGFjZSBvbiBlaXRoZXIgc2lkZSAtIGNlbnRlciBpdFxuICAgICAgICByZXR1cm4gJ2NhbGVuZGFyLW1vYmlsZS1jZW50ZXInO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXdvdWxkT3ZlcmZsb3dSaWdodCkge1xuICAgICAgICAvLyBGaXRzIGdyb3dpbmcgcmlnaHQgZnJvbSBpY29uIC0gYnV0IHN0aWxsIHVzZSByaWdodCBhbGlnbm1lbnQgdG8gZW5zdXJlIHBhZGRpbmdcbiAgICAgICAgcmV0dXJuICdjYWxlbmRhci1hbGlnbi1yaWdodCc7XG4gICAgICB9XG5cbiAgICAgIC8vIFdvdWxkIG92ZXJmbG93IHJpZ2h0IGJ1dCBmaXRzIG9uIGxlZnQgLSBhbGlnbiB0byBsZWZ0IGVkZ2VcbiAgICAgIHJldHVybiAnY2FsZW5kYXItYWxpZ24tbGVmdCc7XG4gICAgfVxuXG4gICAgLy8gRGVza3RvcCBsb2dpY1xuICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dSaWdodCA9XG4gICAgICBjb250YWluZXJSZWN0LnJpZ2h0ICsgY2FsZW5kYXJXaWR0aCA+IHZpZXdwb3J0V2lkdGg7XG5cbiAgICBpZiAoIXdvdWxkT3ZlcmZsb3dSaWdodCkge1xuICAgICAgcmV0dXJuICcnOyAvLyBEZWZhdWx0IHBvc2l0aW9uaW5nIChncm93cyByaWdodCBmcm9tIGljb24pXG4gICAgfVxuXG4gICAgY29uc3Qgc3BhY2VMZWZ0ID0gY29udGFpbmVyUmVjdC5sZWZ0O1xuICAgIGlmIChzcGFjZUxlZnQgPj0gY2FsZW5kYXJXaWR0aCkge1xuICAgICAgcmV0dXJuICdjYWxlbmRhci1hbGlnbi1sZWZ0JzsgLy8gR3JvdyByaWdodCBmcm9tIGxlZnQgZWRnZVxuICAgIH1cblxuICAgIHJldHVybiAnJzsgLy8gVXNlIGRlZmF1bHQgYXMgZmFsbGJhY2tcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVydGljYWxQb3NpdGlvbkNsYXNzKFxuICAgIGNvbnRhaW5lclJlY3Q6IERPTVJlY3QsXG4gICAgdmlld3BvcnRIZWlnaHQ6IG51bWJlcixcbiAgICBjYWxlbmRhckhlaWdodDogbnVtYmVyXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3BhY2VCZWxvdyA9IHZpZXdwb3J0SGVpZ2h0IC0gY29udGFpbmVyUmVjdC5ib3R0b207XG4gICAgY29uc3Qgc3BhY2VBYm92ZSA9IGNvbnRhaW5lclJlY3QudG9wO1xuXG4gICAgaWYgKHNwYWNlQmVsb3cgPj0gY2FsZW5kYXJIZWlnaHQpIHJldHVybiAnY2FsZW5kYXItcG9zaXRpb24tYm90dG9tJztcbiAgICBpZiAoc3BhY2VBYm92ZSA+PSBjYWxlbmRhckhlaWdodCkgcmV0dXJuICdjYWxlbmRhci1wb3NpdGlvbi10b3AnO1xuICAgIHJldHVybiBzcGFjZUJlbG93ID49IHNwYWNlQWJvdmVcbiAgICAgID8gJ2NhbGVuZGFyLXBvc2l0aW9uLWJvdHRvbSdcbiAgICAgIDogJ2NhbGVuZGFyLXBvc2l0aW9uLXRvcCc7XG4gIH1cblxuICBuYXZpZ2F0ZU1vbnRoKGRpcmVjdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TW9udGggKz0gZGlyZWN0aW9uO1xuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA+IDEyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IDE7XG4gICAgICB0aGlzLmN1cnJlbnRZZWFyKys7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRNb250aCA8IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMTI7XG4gICAgICB0aGlzLmN1cnJlbnRZZWFyLS07XG4gICAgfVxuXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgdGhpcy5tb250aENoYW5nZWQuZW1pdCh0aGlzLmN1cnJlbnRNb250aCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICBpZiAoZGF5LmRpc2FibGVkKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWxlY3RlZERhdGU6IFdzbERhdGVTdHJ1Y3QgPSB7XG4gICAgICB5ZWFyOiBkYXkueWVhcixcbiAgICAgIG1vbnRoOiBkYXkubW9udGgsXG4gICAgICBkYXk6IGRheS5kYXksXG4gICAgfTtcblxuICAgIHRoaXMub25EYXRlQ2hhbmdlKHNlbGVjdGVkRGF0ZSk7XG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZW5lcmF0ZUNhbGVuZGFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGggLSAxLCAxKTtcbiAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZShmaXJzdERheSk7XG5cbiAgICBjb25zdCB3ZWVrU3RhcnQgPSB0aGlzLmRhdGVDb25maWc/LndlZWtTdGFydCB8fCAxO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IChmaXJzdERheS5nZXREYXkoKSArIDcgLSB3ZWVrU3RhcnQpICUgNztcbiAgICBzdGFydERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpIC0gZGF5T2ZXZWVrKTtcblxuICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gW107XG4gICAgY29uc3QgdG9kYXlEYXRlID0gZ2V0Q3VycmVudERhdGUoKTtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKHRvZGF5RGF0ZS55ZWFyLCB0b2RheURhdGUubW9udGggLSAxLCB0b2RheURhdGUuZGF5KTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDI7IGkrKykge1xuICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xuICAgICAgY3VycmVudERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpICsgaSk7XG5cbiAgICAgIGNvbnN0IGRheVN0cnVjdDogV3NsRGF0ZVN0cnVjdCA9IHtcbiAgICAgICAgeWVhcjogY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgbW9udGg6IGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxLFxuICAgICAgICBkYXk6IGN1cnJlbnREYXRlLmdldERhdGUoKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNhbGVuZGFyRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgZGF5OiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXG4gICAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgICAgeWVhcjogY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgb3RoZXJNb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEgIT09IHRoaXMuY3VycmVudE1vbnRoLFxuICAgICAgICBzZWxlY3RlZDogdGhpcy5pc0RhdGVTZWxlY3RlZChkYXlTdHJ1Y3QpLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXlTdHJ1Y3QpLFxuICAgICAgICB0b2RheTogdGhpcy5pc1NhbWVEYXRlKGN1cnJlbnREYXRlLCB0b2RheSksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhbGVuZGFyRGF5cy5wdXNoKGNhbGVuZGFyRGF5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRGF0ZVNlbGVjdGVkKGRhdGU6IFdzbERhdGVTdHJ1Y3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmRhdGV0aW1lICYmXG4gICAgICB0aGlzLmRhdGV0aW1lLnllYXIgPT09IGRhdGUueWVhciAmJlxuICAgICAgdGhpcy5kYXRldGltZS5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxuICAgICAgdGhpcy5kYXRldGltZS5kYXkgPT09IGRhdGUuZGF5XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXRlRGlzYWJsZWQoZGF0ZTogV3NsRGF0ZVN0cnVjdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUueWVhciwgZGF0ZS5tb250aCAtIDEsIGRhdGUuZGF5KTtcbiAgICBjb25zdCB0b2RheURhdGUgPSBnZXRDdXJyZW50RGF0ZSgpO1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUodG9kYXlEYXRlLnllYXIsIHRvZGF5RGF0ZS5tb250aCAtIDEsIHRvZGF5RGF0ZS5kYXkpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgaWYgKHRoaXMubWF4RGF0ZSkge1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICB0aGlzLm1heERhdGUueWVhcixcbiAgICAgICAgdGhpcy5tYXhEYXRlLm1vbnRoIC0gMSxcbiAgICAgICAgdGhpcy5tYXhEYXRlLmRheVxuICAgICAgKTtcbiAgICAgIGlmIChzZWxlY3RlZERhdGUgPiBtYXhEYXRlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcbiAgICAgIGNvbnN0IG1pbkRhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgdGhpcy5taW5EYXRlLnllYXIsXG4gICAgICAgIHRoaXMubWluRGF0ZS5tb250aCAtIDEsXG4gICAgICAgIHRoaXMubWluRGF0ZS5kYXlcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWREYXRlIDwgbWluRGF0ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmFsbG93ZWREYXRlcyAmJlxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAxICYmXG4gICAgICB0aGlzLmFsbG93ZWREYXRlc1swXS5kYXkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWREYXRlID4gdG9kYXk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFsbG93ZWREYXRlcyB8fCB0aGlzLmFsbG93ZWREYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQWxsb3dlZCA9IHRoaXMuYWxsb3dlZERhdGVzLmZpbmQoXG4gICAgICAoZGF5QWxsb3dlZCkgPT5cbiAgICAgICAgZGF5QWxsb3dlZC55ZWFyID09PSBkYXRlLnllYXIgJiZcbiAgICAgICAgZGF5QWxsb3dlZC5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxuICAgICAgICBkYXlBbGxvd2VkLmRheSA9PT0gZGF0ZS5kYXlcbiAgICApO1xuXG4gICAgcmV0dXJuICFpc0FsbG93ZWQ7XG4gIH1cblxuICBwcml2YXRlIGlzU2FtZURhdGUoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgIGRhdGUxLmdldE1vbnRoKCkgPT09IGRhdGUyLmdldE1vbnRoKCkgJiZcbiAgICAgIGRhdGUxLmdldERhdGUoKSA9PT0gZGF0ZTIuZ2V0RGF0ZSgpXG4gICAgKTtcbiAgfVxuXG4gIGdldE1vbnRoTmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb250aEluZGV4ID0gbW9udGggLSAxO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmRhdGVDb25maWc/Lm1vbnRoTmFtZXM/Llttb250aEluZGV4XSB8fFxuICAgICAgZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKS5tb250aE5hbWVzW21vbnRoSW5kZXhdXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlV2Vla2RheUxhYmVscygpOiB2b2lkIHtcbiAgICB0aGlzLndlZWtkYXlMYWJlbHMgPVxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy53ZWVrZGF5TGFiZWxzIHx8IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJykud2Vla2RheUxhYmVscztcbiAgfVxuXG4gIGFkanVzdFRpbWUoZmllbGQ6ICdob3VycycgfCAnbWludXRlcycgfCAnc2Vjb25kcycsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmRhdGV0aW1lW2ZpZWxkXSB8fCAwO1xuICAgIGxldCBuZXdWYWx1ZTogbnVtYmVyO1xuXG4gICAgaWYgKHN0ZXAgPiAwKSB7XG4gICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRWYWx1ZSArIHN0ZXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0ZXBTaXplID0gTWF0aC5hYnMoc3RlcCk7XG4gICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIHN0ZXBTaXplO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgaWYgKG5ld1ZhbHVlIDwgMCkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gMjQgKyAobmV3VmFsdWUgJSAyNCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPiAyMykge1xuICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUgJSAyNDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGlmIChuZXdWYWx1ZSA8IDApIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IDYwICsgKG5ld1ZhbHVlICUgNjApO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID4gNTkpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlICUgNjA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRldGltZVtmaWVsZF0gPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25UaW1lRmllbGRDaGFuZ2UoXG4gICAgZmllbGQ6ICdob3VycycgfCAnbWludXRlcycgfCAnc2Vjb25kcycsXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgbGV0IHZhbHVlID0gcGFyc2VJbnQoaW5wdXQudmFsdWUsIDEwKTtcblxuICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMDtcbiAgICAgICAgaWYgKHZhbHVlID4gMjMpIHZhbHVlID0gMjM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAwO1xuICAgICAgICBpZiAodmFsdWUgPiA1OSkgdmFsdWUgPSA1OTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG5cbiAgICB0aGlzLmRhdGV0aW1lW2ZpZWxkXSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCB8fCB0aGlzLl91cGRhdGVQZW5kaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb25maWd1cmF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0ZWN0VGltZUNvbXBvbmVudHMoKTtcbiAgICB0aGlzLnNldFN0YW5kYXJkRm9ybWF0KCk7XG4gICAgdGhpcy5zZXRQbGFjZWhvbGRlcigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RUaW1lQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0KSB7XG4gICAgICBjb25zdCBoYXNUaW1lRm9ybWF0ID0gdGhpcy5oYXNUaW1lSW5Gb3JtYXQodGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0KTtcblxuICAgICAgaWYgKCFoYXNUaW1lRm9ybWF0KSB7XG4gICAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zZWNvbmRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEYXRlT25seSA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zaG93VGltZUNvbnRyb2xzID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNEYXRlT25seSA9IGZhbHNlO1xuICAgICAgdGhpcy5fc2Vjb25kcyA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdC5pbmNsdWRlcygnOnNzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IHRoaXMuX3NlY29uZHM7XG4gICAgICB0aGlzLmlzRGF0ZU9ubHkgPSAhdGhpcy5fc2Vjb25kcztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc1RpbWVJbkZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJ0hIOicpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJ2hoOicpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJzptbScpIHx8XG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJzpzcycpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhbmRhcmRGb3JtYXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbEZvcm1hdCA9XG4gICAgICB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQgfHwgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWTtcbiAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCA9IHRoaXMuaW50ZXJuYWxGb3JtYXQ7XG5cbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzICYmICF0aGlzLmhhc1RpbWVJbkZvcm1hdCh0aGlzLl9zdGFuZGFyZEZvcm1hdCkpIHtcbiAgICAgIHRoaXMuX3N0YW5kYXJkRm9ybWF0ICs9IHRoaXMuX3NlY29uZHMgPyAnIEhIOm1tOnNzJyA6ICcgSEg6bW0nO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0UGxhY2Vob2xkZXIoKTogdm9pZCB7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9XG4gICAgICB0aGlzLmRhdGVDb25maWc/LnBsYWNlaG9sZGVyPy50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzKSB7XG4gICAgICB0aGlzLnBsYWNlaG9sZGVyICs9IHRoaXMuX3NlY29uZHMgPyAnIGhoOm1tOnNzJyA6ICcgaGg6bW0nO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUobmV3TW9kZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChuZXdNb2RlbCkge1xuICAgICAgY29uc3QgcGFyc2VkTW9kZWwgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyhuZXdNb2RlbCwgZmFsc2UpO1xuXG4gICAgICBpZiAocGFyc2VkTW9kZWwgJiYgdHlwZW9mIHBhcnNlZE1vZGVsLnllYXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuZGF0ZXRpbWUgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUgfHwgbmV3IERhdGVUaW1lTW9kZWwoKSxcbiAgICAgICAgICBwYXJzZWRNb2RlbFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGVTdHJpbmcgPSBuZXdNb2RlbDtcbiAgICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKCk7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSAnJztcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlKGV2ZW50OiBXc2xEYXRlcGlja2VyTmF2aWdhdGVFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudD8uY3VycmVudCAmJiBldmVudD8uY3VycmVudC5tb250aCAhPT0gZXZlbnQ/Lm5leHQubW9udGgpIHtcbiAgICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQoZXZlbnQ/Lm5leHQubW9udGgpO1xuICAgIH1cbiAgfVxuXG4gIGlzRGlzYWJsZWQoXG4gICAgZGF0ZXM6IFdzbERhdGVTdHJ1Y3RbXVxuICApOiAoXG4gICAgZGF0ZTogV3NsRGF0ZVN0cnVjdCxcbiAgICBjdXJyZW50PzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfVxuICApID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiAocGlja2VyRGF0ZTogV3NsRGF0ZVN0cnVjdCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxBbGxvd2VkRGF0ZXMgPSB0aGlzLmFsbG93ZWREYXRlcztcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzID0gZGF0ZXM7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKHBpY2tlckRhdGUpO1xuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgPSBvcmlnaW5hbEFsbG93ZWREYXRlcztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICB0b2dnbGVEYXRlVGltZVN0YXRlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1ZhbGlkRGF0ZSgpKSB7XG4gICAgICB0aGlzLnNob3dUaW1lUGlja2VyVG9nZ2xlID0gIXRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGU7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERlbGltaXRlcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmZvcm1hdCkge1xuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGVDb25maWcuZm9ybWF0Lm1hdGNoKC9bXmEtekEtWjAtOV0vKTtcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFswXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGVDb25maWc/LmRhdGVTZXBhcmF0b3IgfHwgJy0nO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZURhdGUodmFsdWU6IHN0cmluZyk6IFdzbERhdGVTdHJ1Y3QgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxpbWl0ZXIgPSB0aGlzLmdldERlbGltaXRlcigpO1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZS5zcGxpdChkZWxpbWl0ZXIpO1xuXG4gICAgaWYgKGRhdGUubGVuZ3RoIDwgMykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmRheUZpcnN0KSB7XG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KGRhdGVbMF0sIDEwKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChkYXRlWzFdLCAxMCk7XG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxuICAgICAgICAgIGRheSA8IDEgfHxcbiAgICAgICAgICBkYXkgPiAzMSB8fFxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxuICAgICAgICAgIG1vbnRoID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBkYXksIG1vbnRoLCB5ZWFyIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3JtYXQ6IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFkgKHl5eXktTU0tZGQpXG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVsxXSwgMTApO1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxuICAgICAgICAgIGRheSA8IDEgfHxcbiAgICAgICAgICBkYXkgPiAzMSB8fFxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxuICAgICAgICAgIG1vbnRoID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5IH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkYXRlOiBXc2xEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsaW1pdGVyID0gdGhpcy5nZXREZWxpbWl0ZXIoKTtcbiAgICBjb25zdCBkYXlGb3JtYXR0ZWQgPSBkYXRlLmRheSA8IDEwID8gJzAnICsgZGF0ZS5kYXkgOiBkYXRlLmRheS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1vbnRoRm9ybWF0dGVkID1cbiAgICAgIGRhdGUubW9udGggPCAxMCA/ICcwJyArIGRhdGUubW9udGggOiBkYXRlLm1vbnRoLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgeWVhckZvcm1hdHRlZCA9IGRhdGUueWVhci50b1N0cmluZygpO1xuXG4gICAgaWYgKHRoaXMuZGF0ZUNvbmZpZz8uZGF5Rmlyc3QpIHtcbiAgICAgIHJldHVybiBgJHtkYXlGb3JtYXR0ZWR9JHtkZWxpbWl0ZXJ9JHttb250aEZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke3llYXJGb3JtYXR0ZWR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7eWVhckZvcm1hdHRlZH0ke2RlbGltaXRlcn0ke21vbnRoRm9ybWF0dGVkfSR7ZGVsaW1pdGVyfSR7ZGF5Rm9ybWF0dGVkfWA7XG4gIH1cblxuICBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcblxuICAgIGlmICh2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcbiAgICBpZiAocGFyc2VkRGF0ZSkge1xuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcbiAgICAgICAgeWVhcjogcGFyc2VkRGF0ZS55ZWFyLFxuICAgICAgICBtb250aDogcGFyc2VkRGF0ZS5tb250aCxcbiAgICAgICAgZGF5OiBwYXJzZWREYXRlLmRheSxcbiAgICAgICAgaG91cnM6IHRoaXMuZGF0ZXRpbWU/LmhvdXJzIHx8IDAsXG4gICAgICAgIG1pbnV0ZXM6IHRoaXMuZGF0ZXRpbWU/Lm1pbnV0ZXMgfHwgMCxcbiAgICAgICAgc2Vjb25kczogdGhpcy5kYXRldGltZT8uc2Vjb25kcyB8fCAwLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHQgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyh2YWx1ZSk7XG4gICAgaWYgKGR0ICYmIGR0LnllYXIpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkdDtcbiAgICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBzdHJpbmcgfCBXc2xEYXRlU3RydWN0KTogdm9pZCB7XG4gICAgbGV0IGRhdGU6IERhdGVUaW1lTW9kZWw7XG5cbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlVGltZU1vZGVsKHRoaXMucGFyc2VEYXRlKGV2ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZVRpbWVNb2RlbChldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRlIHx8ICFkYXRlLnllYXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGF0ZXRpbWUpIHtcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZGF0ZXRpbWUueWVhciA9IGRhdGUueWVhcjtcbiAgICB0aGlzLmRhdGV0aW1lLm1vbnRoID0gZGF0ZS5tb250aDtcbiAgICB0aGlzLmRhdGV0aW1lLmRheSA9IGRhdGUuZGF5O1xuXG4gICAgdGhpcy5jdXJyZW50WWVhciA9IGRhdGUueWVhcjtcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IGRhdGUubW9udGg7XG5cbiAgICB0aGlzLnN0YXJ0RGF0ZSA9IHtcbiAgICAgIHllYXI6IGRhdGUueWVhcixcbiAgICAgIG1vbnRoOiBkYXRlLm1vbnRoLFxuICAgIH07XG5cbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xuICB9XG5cbiAgc2V0RGF0ZVN0cmluZ01vZGVsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGV0aW1lICYmIHR5cGVvZiB0aGlzLmRhdGV0aW1lLnllYXIgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSB0aGlzLmRhdGV0aW1lLnRvU3RyaW5nKCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0ZVN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0RGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0ZXRpbWUgJiYgdGhpcy5kYXRldGltZS55ZWFyKSB7XG4gICAgICBjb25zdCBkYXRlU3RydWN0OiBXc2xEYXRlU3RydWN0ID0ge1xuICAgICAgICB5ZWFyOiB0aGlzLmRhdGV0aW1lLnllYXIsXG4gICAgICAgIG1vbnRoOiB0aGlzLmRhdGV0aW1lLm1vbnRoLFxuICAgICAgICBkYXk6IHRoaXMuZGF0ZXRpbWUuZGF5LFxuICAgICAgfTtcblxuICAgICAgbGV0IGRpc3BsYXlWYWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlU3RydWN0KTtcblxuICAgICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5pc0RhdGVPbmx5KSB7XG4gICAgICAgIGNvbnN0IGhvdXIgPVxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUuaG91cnMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUuaG91cnMgOiAwO1xuICAgICAgICBjb25zdCBtaW51dGUgPVxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUubWludXRlcyAhPT0gdW5kZWZpbmVkID8gdGhpcy5kYXRldGltZS5taW51dGVzIDogMDtcbiAgICAgICAgY29uc3Qgc2Vjb25kID1cbiAgICAgICAgICB0aGlzLmRhdGV0aW1lLnNlY29uZHMgIT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWUuc2Vjb25kcyA6IDA7XG5cbiAgICAgICAgY29uc3QgaG91ckZvcm1hdHRlZCA9IGhvdXIgPCAxMCA/ICcwJyArIGhvdXIgOiBob3VyLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZUZvcm1hdHRlZCA9IG1pbnV0ZSA8IDEwID8gJzAnICsgbWludXRlIDogbWludXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHNlY29uZEZvcm1hdHRlZCA9IHNlY29uZCA8IDEwID8gJzAnICsgc2Vjb25kIDogc2Vjb25kLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgZGlzcGxheVZhbHVlICs9IGAgJHtob3VyRm9ybWF0dGVkfToke21pbnV0ZUZvcm1hdHRlZH1gO1xuXG4gICAgICAgIGlmICh0aGlzLnNlY29uZHMpIHtcbiAgICAgICAgICBkaXNwbGF5VmFsdWUgKz0gYDoke3NlY29uZEZvcm1hdHRlZH1gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaXNwbGF5VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlucHV0Qmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgZ2V0RWZmZWN0aXZlRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgbGV0IGZvcm1hdCA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCB8fCBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZO1xuXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5oYXNUaW1lSW5Gb3JtYXQoZm9ybWF0KSkge1xuICAgICAgZm9ybWF0ICs9IHRoaXMuX3NlY29uZHMgPyAnIEhIOm1tOnNzJyA6ICcgSEg6bW0nO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBvblRpbWVDaGFuZ2UoZXZlbnQ6IFdzbFRpbWVTdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcbiAgICAgIC4uLnRoaXMuZGF0ZXRpbWUsXG4gICAgICBob3VyczogZXZlbnQuaG91cnMsXG4gICAgICBtaW51dGVzOiBldmVudC5taW51dGVzLFxuICAgICAgc2Vjb25kczogZXZlbnQuc2Vjb25kcyxcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBoYXNWYWxpZERhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKFxuICAgICAgdGhpcy5kYXRldGltZSAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUueWVhciA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmRhdGV0aW1lLm1vbnRoID09PSAnbnVtYmVyJyAmJlxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUuZGF5ID09PSAnbnVtYmVyJ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVNb250aHNBbmRZZWFycygpOiB2b2lkIHtcbiAgICB0aGlzLm1vbnRocyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDEyIH0sIChfLCBpKSA9PlxuICAgICAgdGhpcy5nZXRNb250aE5hbWUoaSArIDEpXG4gICAgKTtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLm1pbkRhdGU/LnllYXIgfHwgY3VycmVudFllYXIgLSA1MDtcbiAgICBjb25zdCBlbmRZZWFyID0gdGhpcy5tYXhEYXRlPy55ZWFyIHx8IGN1cnJlbnRZZWFyICsgNTA7XG5cbiAgICB0aGlzLnllYXJzID0gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBlbmRZZWFyIC0gc3RhcnRZZWFyICsgMSB9LFxuICAgICAgKF8sIGkpID0+IGVuZFllYXIgLSBpXG4gICAgKS5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XG4gIH1cblxuICBvbk1vbnRoU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICBjb25zdCBuZXdNb250aCA9IHBhcnNlSW50KHNlbGVjdC52YWx1ZSwgMTApO1xuICAgIGlmIChuZXdNb250aCAhPT0gdGhpcy5jdXJyZW50TW9udGgpIHtcbiAgICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5jdXJyZW50TW9udGg7XG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ld01vbnRoO1xuICAgICAgdGhpcy5tb250aENoYW5nZWQuZW1pdChuZXdNb250aCk7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xuICAgICAgICBjdXJyZW50OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBvbGRNb250aCB9LFxuICAgICAgICBuZXh0OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBuZXdNb250aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25ZZWFyU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcbiAgICBjb25zdCBuZXdZZWFyID0gcGFyc2VJbnQoc2VsZWN0LnZhbHVlLCAxMCk7XG4gICAgaWYgKG5ld1llYXIgIT09IHRoaXMuY3VycmVudFllYXIpIHtcbiAgICAgIGNvbnN0IG9sZFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyO1xuICAgICAgdGhpcy5jdXJyZW50WWVhciA9IG5ld1llYXI7XG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xuICAgICAgICBjdXJyZW50OiB7IHllYXI6IG9sZFllYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxuICAgICAgICBuZXh0OiB7IHllYXI6IG5ld1llYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtcGlja2VyLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XG4gICAgPGlucHV0XG4gICAgICAjZGF0ZUlucHV0XG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICduZy12YWxpZCc6IG5nQ29udHJvbD8udmFsaWQgPT09IHRydWUsXG4gICAgICAgICduZy1pbnZhbGlkJzogbmdDb250cm9sPy5pbnZhbGlkID09PSB0cnVlLFxuICAgICAgICAnbmctZGlzYWJsZWQnOiBkaXNhYmxlZFxuICAgICAgfVwiXG4gICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgIChibHVyKT1cImlucHV0Qmx1cigpXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICBbbmdNb2RlbF09XCJnZXREaXNwbGF5VmFsdWUoKVwiXG4gICAgICAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgd3NsVG9vbHRpcFxuICAgICAgW3Rvb2x0aXBJY29uT3ZlcmxhcF09XCIxMlwiXG4gICAgICB0b29sdGlwUGxhY2VtZW50PVwidG9wXCJcbiAgICAvPlxuICA8L2Rpdj5cblxuICA8YnV0dG9uXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJjYWxlbmRhci1pY29uXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgZGlzYWJsZUNhbGVuZGFyXCJcbiAgICBbbmdDbGFzc109XCJ7ICdkaXNhYmxlZC1idG4nOiBkaXNhYmxlZCB8fCBkaXNhYmxlQ2FsZW5kYXIgfVwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIlxuICA+XG4gICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBmYS1sZ1wiPjwvaT5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBDdXN0b20gQ2FsZW5kYXIgUG9wb3ZlciAtLT5cbiAgPGRpdlxuICAgIGNsYXNzPVwiY2FsZW5kYXItcG9wb3ZlclwiXG4gICAgW2NsYXNzLnNob3ddPVwic2hvd0NhbGVuZGFyXCJcbiAgICBbY2xhc3MuaGlkZGVuXT1cIiFzaG93Q2FsZW5kYXJcIlxuICAgIFtuZ0NsYXNzXT1cImNhbGVuZGFyUG9zaXRpb25DbGFzc1wiXG4gICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dUaW1lUGlja2VyVG9nZ2xlXCI+XG4gICAgICAgIDwhLS0gQ3VzdG9tIERhdGUgUGlja2VyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWRhdGVwaWNrZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibmF2LWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU1vbnRoKC0xKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1zZWxlY3RzXCI+XG4gICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbnRoLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50TW9udGhcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Nb250aFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaSArIDFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IG1vbnRoIH19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ5ZWFyLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50WWVhclwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblllYXJTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIiBbdmFsdWVdPVwieWVhclwiPlxuICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJuYXYtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTW9udGgoMSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHRcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWNhbGVuZGFyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndlZWtkYXlcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtkYXlMYWJlbHNcIj5cbiAgICAgICAgICAgICAgICB7eyBkYXkgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXNcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF5LWNlbGxcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2YgY2FsZW5kYXJEYXlzXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mub3RoZXItbW9udGhdPVwiZGF5Lm90aGVyTW9udGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXkuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJkYXkudG9kYXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZGF5LmRheSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCJcbiAgICAgICAgICBjbGFzcz1cInRvZ2dsZS10aW1lLWJ0blwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURhdGVUaW1lU3RhdGUoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNsb2NrIGZhLWNsb2NrLW8gZmEtbGdcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCJcbiAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1jYWxlbmRhci1idG5cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBmYS1sZ1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGltZS1waWNrZXItY29udGFpbmVyXCJcbiAgICAgICAgICAqbmdJZj1cInNob3dUaW1lQ29udHJvbHMgJiYgIWlzRGF0ZU9ubHlcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBDdXN0b20gVGltZSBQaWNrZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lcGlja2VyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1jb250cm9sc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LmhvdXJzIHx8IFwiSEhcIiB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCBob3Vyc1N0ZXAgfHwgMSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJkYXRldGltZT8uaG91cnMgfHwgMFwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25UaW1lRmllbGRDaGFuZ2UoJ2hvdXJzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgbWF4PVwiMjNcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCAtKGhvdXJzU3RlcCB8fCAxKSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCI+OjwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7IGRhdGVDb25maWc/LnRva2Vucz8ubWludXRlcyB8fCBcIm1tXCIgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkanVzdFRpbWUoJ21pbnV0ZXMnLCBtaW51dGVzU3RlcCB8fCAxKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImRhdGV0aW1lPy5taW51dGVzIHx8IDBcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdtaW51dGVzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgbWF4PVwiNTlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRqdXN0VGltZSgnbWludXRlcycsIC0obWludXRlc1N0ZXAgfHwgMSkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiICpuZ0lmPVwic2Vjb25kc1wiPjo8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiICpuZ0lmPVwic2Vjb25kc1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LnNlY29uZHMgfHwgXCJzc1wiIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGp1c3RUaW1lKCdzZWNvbmRzJywgc2Vjb25kc1N0ZXAgfHwgMSlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJkYXRldGltZT8uc2Vjb25kcyB8fCAwXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVGaWVsZENoYW5nZSgnc2Vjb25kcycsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIG1heD1cIjU5XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkanVzdFRpbWUoJ3NlY29uZHMnLCAtKHNlY29uZHNTdGVwIHx8IDEpKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93blwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEJhY2tkcm9wIGZvciBjbG9zaW5nIHBvcG92ZXIgLS0+XG48ZGl2XG4gIGNsYXNzPVwiY2FsZW5kYXItYmFja2Ryb3BcIlxuICBbY2xhc3Muc2hvd109XCJzaG93Q2FsZW5kYXJcIlxuICAoY2xpY2spPVwiY2xvc2VDYWxlbmRhcigpXCJcbj48L2Rpdj5cbiJdfQ==
|