ng-zenduit 2.0.14 → 2.0.16
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/date-picker-dropdown/zendu-date-picker-dropdown.component.mjs +176 -11
- package/fesm2015/ng-zenduit.mjs +175 -10
- package/fesm2015/ng-zenduit.mjs.map +1 -1
- package/fesm2020/ng-zenduit.mjs +175 -10
- package/fesm2020/ng-zenduit.mjs.map +1 -1
- package/lib/date-picker-dropdown/zendu-date-picker-dropdown.component.d.ts +22 -1
- package/package.json +1 -1
|
@@ -24,6 +24,7 @@ export class ZenduDatePickerDropdownComponent {
|
|
|
24
24
|
this.highlightDays = [];
|
|
25
25
|
this.placeholder = '';
|
|
26
26
|
this.mobileBreakpoint = MOBILE_BREAKPOINT;
|
|
27
|
+
this.timePicker = false;
|
|
27
28
|
this.mobile = false;
|
|
28
29
|
this.isOpen = false;
|
|
29
30
|
this.dropdownStyle = {};
|
|
@@ -41,6 +42,12 @@ export class ZenduDatePickerDropdownComponent {
|
|
|
41
42
|
this._selectedStart = null;
|
|
42
43
|
this._selectedEnd = null;
|
|
43
44
|
this._activePreset = null;
|
|
45
|
+
// Time picker state
|
|
46
|
+
this._hours = 12;
|
|
47
|
+
this._minutes = 0;
|
|
48
|
+
this._period = 'AM';
|
|
49
|
+
this._hoursDisplay = '12';
|
|
50
|
+
this._minutesDisplay = '00';
|
|
44
51
|
this.defaultPresets = [
|
|
45
52
|
{
|
|
46
53
|
label: 'Today',
|
|
@@ -175,7 +182,21 @@ export class ZenduDatePickerDropdownComponent {
|
|
|
175
182
|
formatDate(date) {
|
|
176
183
|
const enMonth = moment(date).format('MMM');
|
|
177
184
|
const translatedMonth = this._translate.instant(enMonth);
|
|
178
|
-
|
|
185
|
+
let formatted = moment(date).format('MMM D, YYYY').replace(enMonth, translatedMonth);
|
|
186
|
+
if (this.timePicker) {
|
|
187
|
+
formatted += ' ' + this.formatTime(date);
|
|
188
|
+
}
|
|
189
|
+
return formatted;
|
|
190
|
+
}
|
|
191
|
+
formatTime(date) {
|
|
192
|
+
let h = date.getHours();
|
|
193
|
+
const m = date.getMinutes();
|
|
194
|
+
const period = h >= 12 ? 'PM' : 'AM';
|
|
195
|
+
if (h === 0)
|
|
196
|
+
h = 12;
|
|
197
|
+
else if (h > 12)
|
|
198
|
+
h -= 12;
|
|
199
|
+
return `${this.formatNum(h)}:${this.formatNum(m)} ${period}`;
|
|
179
200
|
}
|
|
180
201
|
toggle() {
|
|
181
202
|
if (this.disabled)
|
|
@@ -193,6 +214,9 @@ export class ZenduDatePickerDropdownComponent {
|
|
|
193
214
|
this._selectedStart = this.startDate ? new Date(this.startDate) : null;
|
|
194
215
|
this._selectedEnd = this.endDate ? new Date(this.endDate) : null;
|
|
195
216
|
this._activePreset = null;
|
|
217
|
+
if (this.timePicker) {
|
|
218
|
+
this.initTimeFromDate(this.type === 'single' ? this.date : this.startDate);
|
|
219
|
+
}
|
|
196
220
|
if (this.type === 'single') {
|
|
197
221
|
this.leftCurrentSlot = this._selectedDate ? new Date(this._selectedDate) : new Date();
|
|
198
222
|
}
|
|
@@ -213,14 +237,21 @@ export class ZenduDatePickerDropdownComponent {
|
|
|
213
237
|
const spaceBelow = window.innerHeight - rect.bottom - 8;
|
|
214
238
|
const spaceAbove = rect.top - 8;
|
|
215
239
|
const margin = 16;
|
|
240
|
+
const viewportHeight = window.innerHeight;
|
|
216
241
|
const style = { left: `${rect.left}px` };
|
|
217
|
-
if (spaceBelow >= dropdownHeight
|
|
242
|
+
if (spaceBelow >= dropdownHeight) {
|
|
243
|
+
// Fits below the trigger
|
|
218
244
|
style['top'] = `${rect.bottom + 8}px`;
|
|
219
|
-
|
|
245
|
+
}
|
|
246
|
+
else if (spaceAbove >= dropdownHeight) {
|
|
247
|
+
// Fits above the trigger
|
|
248
|
+
style['bottom'] = `${viewportHeight - rect.top + 8}px`;
|
|
220
249
|
}
|
|
221
250
|
else {
|
|
222
|
-
|
|
223
|
-
|
|
251
|
+
// Doesn't fit either way — pin to viewport so full content is visible
|
|
252
|
+
const top = Math.max(margin, viewportHeight - dropdownHeight - margin);
|
|
253
|
+
style['top'] = `${top}px`;
|
|
254
|
+
style['max-height'] = `${viewportHeight - top - margin}px`;
|
|
224
255
|
}
|
|
225
256
|
this.dropdownStyle = style;
|
|
226
257
|
});
|
|
@@ -305,20 +336,152 @@ export class ZenduDatePickerDropdownComponent {
|
|
|
305
336
|
this.leftCurrentSlot = new Date(today);
|
|
306
337
|
this.updateCalendars();
|
|
307
338
|
}
|
|
339
|
+
// Time picker methods
|
|
340
|
+
formatNum(n) {
|
|
341
|
+
return n < 10 ? '0' + n : '' + n;
|
|
342
|
+
}
|
|
343
|
+
incrementHours() {
|
|
344
|
+
this._hours = this._hours >= 12 ? 1 : this._hours + 1;
|
|
345
|
+
this._hoursDisplay = this.formatNum(this._hours);
|
|
346
|
+
}
|
|
347
|
+
decrementHours() {
|
|
348
|
+
this._hours = this._hours <= 1 ? 12 : this._hours - 1;
|
|
349
|
+
this._hoursDisplay = this.formatNum(this._hours);
|
|
350
|
+
}
|
|
351
|
+
incrementMinutes() {
|
|
352
|
+
this._minutes = this._minutes >= 59 ? 0 : this._minutes + 1;
|
|
353
|
+
this._minutesDisplay = this.formatNum(this._minutes);
|
|
354
|
+
}
|
|
355
|
+
decrementMinutes() {
|
|
356
|
+
this._minutes = this._minutes <= 0 ? 59 : this._minutes - 1;
|
|
357
|
+
this._minutesDisplay = this.formatNum(this._minutes);
|
|
358
|
+
}
|
|
359
|
+
onHoursInput(event) {
|
|
360
|
+
const input = event.target;
|
|
361
|
+
const raw = input.value.replace(/\D/g, '');
|
|
362
|
+
if (raw === '') {
|
|
363
|
+
this._hours = 1;
|
|
364
|
+
this._hoursDisplay = '';
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const val = parseInt(raw, 10);
|
|
368
|
+
if (val >= 1 && val <= 12) {
|
|
369
|
+
this._hours = val;
|
|
370
|
+
this._hoursDisplay = raw;
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
input.value = this._hoursDisplay;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
onMinutesInput(event) {
|
|
377
|
+
const input = event.target;
|
|
378
|
+
const raw = input.value.replace(/\D/g, '');
|
|
379
|
+
if (raw === '') {
|
|
380
|
+
this._minutes = 0;
|
|
381
|
+
this._minutesDisplay = '';
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const val = parseInt(raw, 10);
|
|
385
|
+
if (val >= 0 && val <= 59) {
|
|
386
|
+
this._minutes = val;
|
|
387
|
+
this._minutesDisplay = raw;
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
input.value = this._minutesDisplay;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
clampHours() {
|
|
394
|
+
this._hours = Math.max(1, Math.min(12, this._hours));
|
|
395
|
+
this._hoursDisplay = this.formatNum(this._hours);
|
|
396
|
+
}
|
|
397
|
+
clampMinutes() {
|
|
398
|
+
this._minutes = Math.max(0, Math.min(59, this._minutes));
|
|
399
|
+
this._minutesDisplay = this.formatNum(this._minutes);
|
|
400
|
+
}
|
|
401
|
+
onTimeFocus(event) {
|
|
402
|
+
const input = event.target;
|
|
403
|
+
input.select();
|
|
404
|
+
}
|
|
405
|
+
onTimeKeydown(event, type) {
|
|
406
|
+
if (event.key === 'ArrowUp') {
|
|
407
|
+
event.preventDefault();
|
|
408
|
+
if (type === 'hours')
|
|
409
|
+
this.incrementHours();
|
|
410
|
+
else
|
|
411
|
+
this.incrementMinutes();
|
|
412
|
+
}
|
|
413
|
+
else if (event.key === 'ArrowDown') {
|
|
414
|
+
event.preventDefault();
|
|
415
|
+
if (type === 'hours')
|
|
416
|
+
this.decrementHours();
|
|
417
|
+
else
|
|
418
|
+
this.decrementMinutes();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
setPeriod(period) {
|
|
422
|
+
this._period = period;
|
|
423
|
+
}
|
|
424
|
+
applyTimeToDate(date) {
|
|
425
|
+
const result = new Date(date);
|
|
426
|
+
let hours = this._hours;
|
|
427
|
+
if (this._period === 'AM' && hours === 12) {
|
|
428
|
+
hours = 0;
|
|
429
|
+
}
|
|
430
|
+
else if (this._period === 'PM' && hours !== 12) {
|
|
431
|
+
hours += 12;
|
|
432
|
+
}
|
|
433
|
+
result.setHours(hours, this._minutes, 0, 0);
|
|
434
|
+
return result;
|
|
435
|
+
}
|
|
436
|
+
initTimeFromDate(date) {
|
|
437
|
+
if (!date) {
|
|
438
|
+
this._hours = 12;
|
|
439
|
+
this._minutes = 0;
|
|
440
|
+
this._period = 'AM';
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
let h = date.getHours();
|
|
444
|
+
this._minutes = date.getMinutes();
|
|
445
|
+
if (h === 0) {
|
|
446
|
+
this._hours = 12;
|
|
447
|
+
this._period = 'AM';
|
|
448
|
+
}
|
|
449
|
+
else if (h < 12) {
|
|
450
|
+
this._hours = h;
|
|
451
|
+
this._period = 'AM';
|
|
452
|
+
}
|
|
453
|
+
else if (h === 12) {
|
|
454
|
+
this._hours = 12;
|
|
455
|
+
this._period = 'PM';
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
this._hours = h - 12;
|
|
459
|
+
this._period = 'PM';
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
this._hoursDisplay = this.formatNum(this._hours);
|
|
463
|
+
this._minutesDisplay = this.formatNum(this._minutes);
|
|
464
|
+
}
|
|
308
465
|
apply() {
|
|
309
466
|
if (this.type === 'single') {
|
|
310
467
|
if (this._selectedDate) {
|
|
311
|
-
this.date =
|
|
468
|
+
this.date = this.timePicker
|
|
469
|
+
? this.applyTimeToDate(this._selectedDate)
|
|
470
|
+
: new Date(this._selectedDate);
|
|
312
471
|
this.dateChange.emit(this.date);
|
|
313
472
|
}
|
|
314
473
|
}
|
|
315
474
|
else {
|
|
316
475
|
if (this._selectedStart) {
|
|
317
|
-
this.startDate =
|
|
476
|
+
this.startDate = this.timePicker
|
|
477
|
+
? this.applyTimeToDate(this._selectedStart)
|
|
478
|
+
: new Date(this._selectedStart);
|
|
318
479
|
this.startDateChange.emit(this.startDate);
|
|
319
480
|
}
|
|
320
481
|
if (this._selectedEnd) {
|
|
321
|
-
this.endDate =
|
|
482
|
+
this.endDate = this.timePicker
|
|
483
|
+
? this.applyTimeToDate(this._selectedEnd)
|
|
484
|
+
: new Date(this._selectedEnd);
|
|
322
485
|
this.endDateChange.emit(this.endDate);
|
|
323
486
|
}
|
|
324
487
|
if (this._selectedStart && this._selectedEnd) {
|
|
@@ -425,10 +588,10 @@ export class ZenduDatePickerDropdownComponent {
|
|
|
425
588
|
}
|
|
426
589
|
}
|
|
427
590
|
ZenduDatePickerDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, deps: [{ token: i0.ElementRef }, { token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
428
|
-
ZenduDatePickerDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduDatePickerDropdownComponent, selector: "zen-date-picker-dropdown", inputs: { type: "type", date: "date", startDate: "startDate", endDate: "endDate", presets: "presets", minDate: "minDate", maxDate: "maxDate", disabled: "disabled", highlightDays: "highlightDays", placeholder: "placeholder", mobileBreakpoint: "mobileBreakpoint" }, outputs: { dateChange: "dateChange", startDateChange: "startDateChange", endDateChange: "endDateChange", rangeChange: "rangeChange" }, host: { listeners: { "window:resize": "onResize()", "window:mousedown": "outsideHandling($event)" } }, viewQueries: [{ propertyName: "triggerBtn", first: true, predicate: ["triggerBtn"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"zen-dpd\">\n <!-- Trigger Button -->\n <button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n </button>\n\n <!-- Dropdown Panel -->\n <div class=\"dropdown-menu\" *ngIf=\"isOpen\" [class.mobile]=\"mobile\" [ngStyle]=\"dropdownStyle\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</div>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:block;position:relative;width:100%}.zen-dpd{position:relative;width:100%}.dropdown-trigger{display:flex;width:100%;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{position:fixed;z-index:1200;display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow-y:auto;overflow-x:hidden;width:max-content}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display:flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.bottom-divider{height:1px;background:#EAECF0;width:100%}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ 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: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ZenduIconComponent, selector: "zen-icon", inputs: ["src", "name", "size", "color", "theme", "customColor"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
|
|
591
|
+
ZenduDatePickerDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduDatePickerDropdownComponent, selector: "zen-date-picker-dropdown", inputs: { type: "type", date: "date", startDate: "startDate", endDate: "endDate", presets: "presets", minDate: "minDate", maxDate: "maxDate", disabled: "disabled", highlightDays: "highlightDays", placeholder: "placeholder", mobileBreakpoint: "mobileBreakpoint", timePicker: "timePicker" }, outputs: { dateChange: "dateChange", startDateChange: "startDateChange", endDateChange: "endDateChange", rangeChange: "rangeChange" }, host: { listeners: { "window:resize": "onResize()", "window:mousedown": "outsideHandling($event)" } }, viewQueries: [{ propertyName: "triggerBtn", first: true, predicate: ["triggerBtn"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"zen-dpd\">\n <!-- Trigger Button -->\n <button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n </button>\n\n <!-- Dropdown Panel -->\n <div class=\"dropdown-menu\" *ngIf=\"isOpen\" [class.mobile]=\"mobile\" [ngStyle]=\"dropdownStyle\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <!-- Time Picker -->\n <ng-container *ngIf=\"timePicker\">\n <div class=\"bottom-divider\"></div>\n <ng-container *ngTemplateOutlet=\"timePickerSection\"></ng-container>\n </ng-container>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <!-- Time Picker -->\n <ng-container *ngIf=\"timePicker\">\n <div class=\"bottom-divider\"></div>\n <ng-container *ngTemplateOutlet=\"timePickerSection\"></ng-container>\n </ng-container>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <!-- Time Picker -->\n <ng-container *ngIf=\"timePicker\">\n <div class=\"bottom-divider\"></div>\n <ng-container *ngTemplateOutlet=\"timePickerSection\"></ng-container>\n </ng-container>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</div>\n\n<!-- Shared time picker template -->\n<ng-template #timePickerSection>\n <div class=\"time-picker-container\">\n <div class=\"time-picker-content\">\n <span class=\"time-picker-label\">{{ 'Select a time' | translate }}</span>\n <div class=\"time-picker-row\">\n <div class=\"time-fields\">\n <!-- Hours -->\n <div class=\"time-input-group\">\n <div class=\"time-input-box\">\n <input class=\"time-input\"\n type=\"text\"\n aria-label=\"Hours\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n [value]=\"_hoursDisplay\"\n (input)=\"onHoursInput($event)\"\n (focus)=\"onTimeFocus($event)\"\n (blur)=\"clampHours()\"\n (keydown)=\"onTimeKeydown($event, 'hours')\"\n maxlength=\"2\" />\n <div class=\"time-arrows\">\n <button class=\"time-arrow-btn\" type=\"button\" tabindex=\"-1\" (click)=\"incrementHours()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n </button>\n <button class=\"time-arrow-btn\" type=\"button\" tabindex=\"-1\" (click)=\"decrementHours()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </button>\n </div>\n </div>\n <span class=\"time-input-label\">{{ 'HRS' | translate }}</span>\n </div>\n\n <!-- Colon separator -->\n <div class=\"time-colon\">:</div>\n\n <!-- Minutes -->\n <div class=\"time-input-group\">\n <div class=\"time-input-box\">\n <input class=\"time-input\"\n type=\"text\"\n aria-label=\"Minutes\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n [value]=\"_minutesDisplay\"\n (input)=\"onMinutesInput($event)\"\n (focus)=\"onTimeFocus($event)\"\n (blur)=\"clampMinutes()\"\n (keydown)=\"onTimeKeydown($event, 'minutes')\"\n maxlength=\"2\" />\n <div class=\"time-arrows\">\n <button class=\"time-arrow-btn\" type=\"button\" tabindex=\"-1\" (click)=\"incrementMinutes()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n </button>\n <button class=\"time-arrow-btn\" type=\"button\" tabindex=\"-1\" (click)=\"decrementMinutes()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </button>\n </div>\n </div>\n <span class=\"time-input-label\">{{ 'MIN' | translate }}</span>\n </div>\n </div>\n\n <!-- AM/PM toggle -->\n <div class=\"time-period-toggle\">\n <button class=\"time-period-btn\"\n [class.active]=\"_period === 'AM'\"\n (click)=\"setPeriod('AM')\">\n AM\n </button>\n <button class=\"time-period-btn\"\n [class.active]=\"_period === 'PM'\"\n (click)=\"setPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:block;position:relative;width:100%}.zen-dpd{position:relative;width:100%}.dropdown-trigger{display:flex;width:100%;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{position:fixed;z-index:1200;display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow-y:auto;overflow-x:hidden;width:max-content}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display:flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.time-picker-container{display:flex;flex-direction:column;padding:16px;background:#FFFFFF;width:100%}.time-picker-content{display:flex;flex-direction:column;gap:16px}.time-picker-label{font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.time-picker-row{display:flex;align-items:flex-start;gap:16px}.time-fields{display:flex;gap:8px;align-items:flex-start}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:4px}.time-input-box{display:flex;align-items:center;justify-content:center;gap:6px;height:44px;min-width:72px;padding:6px 6px 6px 12px;background:#F2F4F7;border:1px solid #E5E7EB;border-radius:8px;box-sizing:border-box}.time-input{width:24px;border:none;background:transparent;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;text-align:center;outline:none;padding:0;font-family:Inter,sans-serif;-moz-appearance:textfield}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-arrows{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:20px;height:100%}.time-arrow-btn{display:flex;align-items:center;justify-content:center;width:14px;height:14px;padding:0;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;border-radius:2px;transition:.15s}.time-arrow-btn:hover{background:rgba(102,112,133,.12)}.time-arrow-btn zen-icon{width:14px;height:14px;background-color:#667085}.time-input-label{font-size:10px;font-weight:500;line-height:normal;color:#667085;text-transform:uppercase;letter-spacing:.02em}.time-colon{display:flex;flex-direction:column;align-items:center;justify-content:center;width:4px;height:44px;font-size:14px;font-weight:500;line-height:20px;color:#667085}.time-period-toggle{display:flex;gap:8px;align-items:center;height:44px;align-self:flex-start}.time-period-btn{display:flex;align-items:center;justify-content:center;padding:10px 14px;height:36px;box-sizing:border-box;border-radius:8px;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap;background:#FFFFFF;border:1px solid #D0D5DD;box-shadow:0 1px 2px #1018280d;color:#344054}.time-period-btn.active{background:#F1F7FE;border-color:#f1f7fe;color:#105494}.time-period-btn:hover:not(.active){background:#F9FAFB}.bottom-divider{height:1px;min-height:1px;background:#EAECF0;width:100%;flex-shrink:0}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ 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: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.ZenduIconComponent, selector: "zen-icon", inputs: ["src", "name", "size", "color", "theme", "customColor"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
|
|
429
592
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, decorators: [{
|
|
430
593
|
type: Component,
|
|
431
|
-
args: [{ selector: 'zen-date-picker-dropdown', template: "<div class=\"zen-dpd\">\n <!-- Trigger Button -->\n <button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n </button>\n\n <!-- Dropdown Panel -->\n <div class=\"dropdown-menu\" *ngIf=\"isOpen\" [class.mobile]=\"mobile\" [ngStyle]=\"dropdownStyle\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</div>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:block;position:relative;width:100%}.zen-dpd{position:relative;width:100%}.dropdown-trigger{display:flex;width:100%;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{position:fixed;z-index:1200;display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow-y:auto;overflow-x:hidden;width:max-content}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display:flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.bottom-divider{height:1px;background:#EAECF0;width:100%}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
594
|
+
args: [{ selector: 'zen-date-picker-dropdown', template: "<div class=\"zen-dpd\">\n <!-- Trigger Button -->\n <button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n </button>\n\n <!-- Dropdown Panel -->\n <div class=\"dropdown-menu\" *ngIf=\"isOpen\" [class.mobile]=\"mobile\" [ngStyle]=\"dropdownStyle\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <!-- Time Picker -->\n <ng-container *ngIf=\"timePicker\">\n <div class=\"bottom-divider\"></div>\n <ng-container *ngTemplateOutlet=\"timePickerSection\"></ng-container>\n </ng-container>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">–</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <!-- Time Picker -->\n <ng-container *ngIf=\"timePicker\">\n <div class=\"bottom-divider\"></div>\n <ng-container *ngTemplateOutlet=\"timePickerSection\"></ng-container>\n </ng-container>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <!-- Time Picker -->\n <ng-container *ngIf=\"timePicker\">\n <div class=\"bottom-divider\"></div>\n <ng-container *ngTemplateOutlet=\"timePickerSection\"></ng-container>\n </ng-container>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</div>\n\n<!-- Shared time picker template -->\n<ng-template #timePickerSection>\n <div class=\"time-picker-container\">\n <div class=\"time-picker-content\">\n <span class=\"time-picker-label\">{{ 'Select a time' | translate }}</span>\n <div class=\"time-picker-row\">\n <div class=\"time-fields\">\n <!-- Hours -->\n <div class=\"time-input-group\">\n <div class=\"time-input-box\">\n <input class=\"time-input\"\n type=\"text\"\n aria-label=\"Hours\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n [value]=\"_hoursDisplay\"\n (input)=\"onHoursInput($event)\"\n (focus)=\"onTimeFocus($event)\"\n (blur)=\"clampHours()\"\n (keydown)=\"onTimeKeydown($event, 'hours')\"\n maxlength=\"2\" />\n <div class=\"time-arrows\">\n <button class=\"time-arrow-btn\" type=\"button\" tabindex=\"-1\" (click)=\"incrementHours()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n </button>\n <button class=\"time-arrow-btn\" type=\"button\" tabindex=\"-1\" (click)=\"decrementHours()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </button>\n </div>\n </div>\n <span class=\"time-input-label\">{{ 'HRS' | translate }}</span>\n </div>\n\n <!-- Colon separator -->\n <div class=\"time-colon\">:</div>\n\n <!-- Minutes -->\n <div class=\"time-input-group\">\n <div class=\"time-input-box\">\n <input class=\"time-input\"\n type=\"text\"\n aria-label=\"Minutes\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n [value]=\"_minutesDisplay\"\n (input)=\"onMinutesInput($event)\"\n (focus)=\"onTimeFocus($event)\"\n (blur)=\"clampMinutes()\"\n (keydown)=\"onTimeKeydown($event, 'minutes')\"\n maxlength=\"2\" />\n <div class=\"time-arrows\">\n <button class=\"time-arrow-btn\" type=\"button\" tabindex=\"-1\" (click)=\"incrementMinutes()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-up-small.svg\"></zen-icon>\n </button>\n <button class=\"time-arrow-btn\" type=\"button\" tabindex=\"-1\" (click)=\"decrementMinutes()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-down-small.svg\"></zen-icon>\n </button>\n </div>\n </div>\n <span class=\"time-input-label\">{{ 'MIN' | translate }}</span>\n </div>\n </div>\n\n <!-- AM/PM toggle -->\n <div class=\"time-period-toggle\">\n <button class=\"time-period-btn\"\n [class.active]=\"_period === 'AM'\"\n (click)=\"setPeriod('AM')\">\n AM\n </button>\n <button class=\"time-period-btn\"\n [class.active]=\"_period === 'PM'\"\n (click)=\"setPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [":host{display:block;position:relative;width:100%}.zen-dpd{position:relative;width:100%}.dropdown-trigger{display:flex;width:100%;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{position:fixed;z-index:1200;display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow-y:auto;overflow-x:hidden;width:max-content}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display:flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.time-picker-container{display:flex;flex-direction:column;padding:16px;background:#FFFFFF;width:100%}.time-picker-content{display:flex;flex-direction:column;gap:16px}.time-picker-label{font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.time-picker-row{display:flex;align-items:flex-start;gap:16px}.time-fields{display:flex;gap:8px;align-items:flex-start}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:4px}.time-input-box{display:flex;align-items:center;justify-content:center;gap:6px;height:44px;min-width:72px;padding:6px 6px 6px 12px;background:#F2F4F7;border:1px solid #E5E7EB;border-radius:8px;box-sizing:border-box}.time-input{width:24px;border:none;background:transparent;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;text-align:center;outline:none;padding:0;font-family:Inter,sans-serif;-moz-appearance:textfield}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-arrows{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:20px;height:100%}.time-arrow-btn{display:flex;align-items:center;justify-content:center;width:14px;height:14px;padding:0;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;border-radius:2px;transition:.15s}.time-arrow-btn:hover{background:rgba(102,112,133,.12)}.time-arrow-btn zen-icon{width:14px;height:14px;background-color:#667085}.time-input-label{font-size:10px;font-weight:500;line-height:normal;color:#667085;text-transform:uppercase;letter-spacing:.02em}.time-colon{display:flex;flex-direction:column;align-items:center;justify-content:center;width:4px;height:44px;font-size:14px;font-weight:500;line-height:20px;color:#667085}.time-period-toggle{display:flex;gap:8px;align-items:center;height:44px;align-self:flex-start}.time-period-btn{display:flex;align-items:center;justify-content:center;padding:10px 14px;height:36px;box-sizing:border-box;border-radius:8px;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap;background:#FFFFFF;border:1px solid #D0D5DD;box-shadow:0 1px 2px #1018280d;color:#344054}.time-period-btn.active{background:#F1F7FE;border-color:#f1f7fe;color:#105494}.time-period-btn:hover:not(.active){background:#F9FAFB}.bottom-divider{height:1px;min-height:1px;background:#EAECF0;width:100%;flex-shrink:0}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
432
595
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TranslateService }]; }, propDecorators: { type: [{
|
|
433
596
|
type: Input
|
|
434
597
|
}], date: [{
|
|
@@ -459,6 +622,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
459
622
|
type: Input
|
|
460
623
|
}], mobileBreakpoint: [{
|
|
461
624
|
type: Input
|
|
625
|
+
}], timePicker: [{
|
|
626
|
+
type: Input
|
|
462
627
|
}], triggerBtn: [{
|
|
463
628
|
type: ViewChild,
|
|
464
629
|
args: ['triggerBtn']
|
|
@@ -469,4 +634,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
469
634
|
type: HostListener,
|
|
470
635
|
args: ['window:mousedown', ['$event']]
|
|
471
636
|
}] } });
|
|
472
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZGF0ZS1waWNrZXItZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctemVuZHVpdC9zcmMvbGliL2RhdGUtcGlja2VyLWRyb3Bkb3duL3plbmR1LWRhdGUtcGlja2VyLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9kYXRlLXBpY2tlci1kcm9wZG93bi96ZW5kdS1kYXRlLXBpY2tlci1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUMxQixNQUFNLEVBQWlCLFNBQVMsRUFDakUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDOzs7OztBQUtuQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQU85QixNQUFNLE9BQU8sZ0NBQWdDO0lBZ0h6QyxZQUNZLFFBQW9CLEVBQ3BCLFVBQTRCO1FBRDVCLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFoSC9CLFNBQUksR0FBMkIsUUFBUSxDQUFDO1FBQ3hDLFNBQUksR0FBZ0IsSUFBSSxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRTlDLGNBQVMsR0FBZ0IsSUFBSSxDQUFDO1FBQzdCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUVuRCxZQUFPLEdBQWdCLElBQUksQ0FBQztRQUMzQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFFaEQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUVsRCxZQUFPLEdBQThCLElBQUksQ0FBQztRQUMxQyxZQUFPLEdBQWdCLElBQUks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QkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVtQixVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBb0d2QixRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZTtnQkF3QjdCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsXG4gICAgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC9tb21lbnQnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlckRheSB9IGZyb20gJy4uL2RhdGVwaWNrZXIvZGF0ZS1waWNrZXItZGF5JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IERhdGVQaWNrZXJEcm9wZG93blR5cGUsIERhdGVQaWNrZXJQcmVzZXQsIERhdGVSYW5nZVZhbHVlIH0gZnJvbSAnLi9kYXRlLXBpY2tlci1kcm9wZG93bi50eXBlcyc7XG5cbmNvbnN0IE1PQklMRV9CUkVBS1BPSU5UID0gNzY4O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3plbi1kYXRlLXBpY2tlci1kcm9wZG93bicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3plbmR1LWRhdGUtcGlja2VyLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi96ZW5kdS1kYXRlLXBpY2tlci1kcm9wZG93bi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFplbmR1RGF0ZVBpY2tlckRyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKSB0eXBlOiBEYXRlUGlja2VyRHJvcGRvd25UeXBlID0gJ3NpbmdsZSc7XG4gICAgQElucHV0KCkgZGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcblxuICAgIEBJbnB1dCgpIHN0YXJ0RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBPdXRwdXQoKSBzdGFydERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuXG4gICAgQElucHV0KCkgZW5kRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBPdXRwdXQoKSBlbmREYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgbnVsbD4oKTtcblxuICAgIEBPdXRwdXQoKSByYW5nZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlVmFsdWU+KCk7XG5cbiAgICBASW5wdXQoKSBwcmVzZXRzOiBEYXRlUGlja2VyUHJlc2V0W10gfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgaGlnaGxpZ2h0RGF5czogbnVtYmVyW10gPSBbXTtcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gICAgQElucHV0KCkgbW9iaWxlQnJlYWtwb2ludDogbnVtYmVyID0gTU9CSUxFX0JSRUFLUE9JTlQ7XG5cbiAgICBAVmlld0NoaWxkKCd0cmlnZ2VyQnRuJykgdHJpZ2dlckJ0biE6IEVsZW1lbnRSZWY7XG5cbiAgICBtb2JpbGUgPSBmYWxzZTtcbiAgICBpc09wZW4gPSBmYWxzZTtcbiAgICBkcm9wZG93blN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgICAvLyBMZWZ0IGNhbGVuZGFyIHN0YXRlXG4gICAgbGVmdEN1cnJlbnRTbG90ID0gbmV3IERhdGUoKTtcbiAgICBsZWZ0RGF5Um93czogQXJyYXk8eyBkYXlzOiBEYXRlUGlja2VyRGF5W10gfT4gPSBbXTtcbiAgICBsZWZ0RGF5c1RpdGxlID0gJyc7XG5cbiAgICAvLyBSaWdodCBjYWxlbmRhciBzdGF0ZSAoZm9yIHJhbmdlIGRlc2t0b3ApXG4gICAgcmlnaHRDdXJyZW50U2xvdCA9IG5ldyBEYXRlKCk7XG4gICAgcmlnaHREYXlSb3dzOiBBcnJheTx7IGRheXM6IERhdGVQaWNrZXJEYXlbXSB9PiA9IFtdO1xuICAgIHJpZ2h0RGF5c1RpdGxlID0gJyc7XG5cbiAgICB3ZWVrRGF5cyA9IFsnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2F0JywgJ1N1J107XG5cbiAgICAvLyBJbnRlcm5hbCBzZWxlY3Rpb24gc3RhdGVcbiAgICBfc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgX3NlbGVjdGVkU3RhcnQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBfc2VsZWN0ZWRFbmQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBfYWN0aXZlUHJlc2V0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIGRlZmF1bHRQcmVzZXRzOiBEYXRlUGlja2VyUHJlc2V0W10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnVG9kYXknLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuZW5kT2YoJ2RheScpLnRvRGF0ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1llc3RlcmRheScsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheScpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ2RheScpLmVuZE9mKCdkYXknKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdUaGlzIHdlZWsnLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ2lzb1dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdpc29XZWVrJykudG9EYXRlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnTGFzdCB3ZWVrJyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnd2VlaycpLnN0YXJ0T2YoJ2lzb1dlZWsnKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICd3ZWVrJykuZW5kT2YoJ2lzb1dlZWsnKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdUaGlzIG1vbnRoJyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCdtb250aCcpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuZW5kT2YoJ21vbnRoJykudG9EYXRlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnTGFzdCBtb250aCcsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ21vbnRoJykuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1RoaXMgeWVhcicsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3RhcnRPZigneWVhcicpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuZW5kT2YoJ3llYXInKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdMYXN0IHllYXInLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFyJykuc3RhcnRPZigneWVhcicpLnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGVuZDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ3llYXInKS5lbmRPZigneWVhcicpLnRvRGF0ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0FsbCB0aW1lJyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBuZXcgRGF0ZSgyMDAwLCAwLCAxKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdkYXknKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIF07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7IH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoZWNrTW9iaWxlKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gICAgb25SZXNpemUoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tNb2JpbGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrTW9iaWxlKCkge1xuICAgICAgICB0aGlzLm1vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgdGhpcy5tb2JpbGVCcmVha3BvaW50O1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2RhdGUnXSAmJiB0aGlzLmRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3N0YXJ0RGF0ZSddICYmIHRoaXMuc3RhcnREYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFN0YXJ0ID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydlbmREYXRlJ10gJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVuZCA9IG5ldyBEYXRlKHRoaXMuZW5kRGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHsgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93Om1vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgb3V0c2lkZUhhbmRsaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHJldHVybjtcbiAgICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGdldCBhY3RpdmVQcmVzZXRzKCk6IERhdGVQaWNrZXJQcmVzZXRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZXNldHMgfHwgdGhpcy5kZWZhdWx0UHJlc2V0cztcbiAgICB9XG5cbiAgICBnZXQgc2hvd1ByZXNldHNTaWRlYmFyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAncmFuZ2UnICYmICF0aGlzLm1vYmlsZTtcbiAgICB9XG5cbiAgICBnZXQgc2hvd0R1YWxDYWxlbmRhcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdyYW5nZScgJiYgIXRoaXMubW9iaWxlO1xuICAgIH1cblxuICAgIGdldCB0cmlnZ2VyTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgnU2VsZWN0IGRhdGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5mb3JtYXREYXRlKHRoaXMuc3RhcnREYXRlKX0gLSAke3RoaXMuZm9ybWF0RGF0ZSh0aGlzLmVuZERhdGUpfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ1NlbGVjdCBkYXRlcycpO1xuICAgIH1cblxuICAgIGdldCBoYXNWYWx1ZSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3NpbmdsZScpIHJldHVybiAhIXRoaXMuZGF0ZTtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZSk7XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1hdHRlZFNlbGVjdGVkRGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWREYXRlID8gdGhpcy5mb3JtYXREYXRlKHRoaXMuX3NlbGVjdGVkRGF0ZSkgOiAnJztcbiAgICB9XG5cbiAgICBnZXQgZm9ybWF0dGVkU3RhcnREYXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFN0YXJ0ID8gdGhpcy5mb3JtYXREYXRlKHRoaXMuX3NlbGVjdGVkU3RhcnQpIDogJyc7XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1hdHRlZEVuZERhdGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRW5kID8gdGhpcy5mb3JtYXREYXRlKHRoaXMuX3NlbGVjdGVkRW5kKSA6ICcnO1xuICAgIH1cblxuICAgIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGVuTW9udGggPSBtb21lbnQoZGF0ZSkuZm9ybWF0KCdNTU0nKTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZE1vbnRoID0gdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoZW5Nb250aCk7XG4gICAgICAgIHJldHVybiBtb21lbnQoZGF0ZSkuZm9ybWF0KCdNTU0gRCwgWVlZWScpLnJlcGxhY2UoZW5Nb250aCwgdHJhbnNsYXRlZE1vbnRoKTtcbiAgICB9XG5cbiAgICB0b2dnbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuKCkge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0ZSA9IHRoaXMuZGF0ZSA/IG5ldyBEYXRlKHRoaXMuZGF0ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFN0YXJ0ID0gdGhpcy5zdGFydERhdGUgPyBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZEVuZCA9IHRoaXMuZW5kRGF0ZSA/IG5ldyBEYXRlKHRoaXMuZW5kRGF0ZSkgOiBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVQcmVzZXQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmxlZnRDdXJyZW50U2xvdCA9IHRoaXMuX3NlbGVjdGVkRGF0ZSA/IG5ldyBEYXRlKHRoaXMuX3NlbGVjdGVkRGF0ZSkgOiBuZXcgRGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSB0aGlzLl9zZWxlY3RlZFN0YXJ0ID8gbmV3IERhdGUodGhpcy5fc2VsZWN0ZWRTdGFydCkgOiBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5yaWdodEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMubGVmdEN1cnJlbnRTbG90KS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgICAgICB0aGlzLnVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy50cmlnZ2VyQnRuKSByZXR1cm47XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy50cmlnZ2VyQnRuLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkVsID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1tZW51Jyk7XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkhlaWdodCA9IGRyb3Bkb3duRWwgPyBkcm9wZG93bkVsLnNjcm9sbEhlaWdodCA6IDUwMDtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNlQmVsb3cgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbSAtIDg7XG4gICAgICAgICAgICBjb25zdCBzcGFjZUFib3ZlID0gcmVjdC50b3AgLSA4O1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gMTY7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyBsZWZ0OiBgJHtyZWN0LmxlZnR9cHhgIH07XG5cbiAgICAgICAgICAgIGlmIChzcGFjZUJlbG93ID49IGRyb3Bkb3duSGVpZ2h0IHx8IHNwYWNlQmVsb3cgPj0gc3BhY2VBYm92ZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlWyd0b3AnXSA9IGAke3JlY3QuYm90dG9tICsgOH1weGA7XG4gICAgICAgICAgICAgICAgc3R5bGVbJ21heC1oZWlnaHQnXSA9IGAke3NwYWNlQmVsb3cgLSBtYXJnaW59cHhgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZVsnYm90dG9tJ10gPSBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LnRvcCArIDh9cHhgO1xuICAgICAgICAgICAgICAgIHN0eWxlWydtYXgtaGVpZ2h0J10gPSBgJHtzcGFjZUFib3ZlIC0gbWFyZ2lufXB4YDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kcm9wZG93blN0eWxlID0gc3R5bGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENhbGVuZGFyIG5hdmlnYXRpb25cbiAgICBsZWZ0UHJldk1vbnRoKCkge1xuICAgICAgICB0aGlzLmxlZnRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmxlZnRDdXJyZW50U2xvdCkuc3VidHJhY3QoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnNob3dEdWFsQ2FsZW5kYXJzKSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5sZWZ0Q3VycmVudFNsb3QpLmFkZCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cblxuICAgIGxlZnROZXh0TW9udGgoKSB7XG4gICAgICAgIHRoaXMubGVmdEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMubGVmdEN1cnJlbnRTbG90KS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnNob3dEdWFsQ2FsZW5kYXJzKSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5sZWZ0Q3VycmVudFNsb3QpLmFkZCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cblxuICAgIHJpZ2h0UHJldk1vbnRoKCkge1xuICAgICAgICB0aGlzLnJpZ2h0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5yaWdodEN1cnJlbnRTbG90KS5zdWJ0cmFjdCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5yaWdodEN1cnJlbnRTbG90KS5zdWJ0cmFjdCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG5cbiAgICByaWdodE5leHRNb250aCgpIHtcbiAgICAgICAgdGhpcy5yaWdodEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMucmlnaHRDdXJyZW50U2xvdCkuYWRkKDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLmxlZnRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLnJpZ2h0Q3VycmVudFNsb3QpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cblxuICAgIC8vIEZvciBtb2JpbGUvc2luZ2xlIG1vZGUgd2hlbiB0aGVyZSdzIG9ubHkgb25lIGNhbGVuZGFyXG4gICAgcHJldk1vbnRoKCkge1xuICAgICAgICB0aGlzLmxlZnRQcmV2TW9udGgoKTtcbiAgICB9XG5cbiAgICBuZXh0TW9udGgoKSB7XG4gICAgICAgIHRoaXMubGVmdE5leHRNb250aCgpO1xuICAgIH1cblxuICAgIHNlbGVjdERheShkYXk6IERhdGVQaWNrZXJEYXkpIHtcbiAgICAgICAgaWYgKGRheS5pc0Rpc2FibGVkIHx8IGRheS5pc091dHNpZGUpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gbmV3IERhdGUoZGF5LmRhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmFuZ2Ugc2VsZWN0aW9uIGxvZ2ljXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGVkU3RhcnQgfHwgKHRoaXMuX3NlbGVjdGVkU3RhcnQgJiYgdGhpcy5fc2VsZWN0ZWRFbmQpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgbmV3IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU3RhcnQgPSBuZXcgRGF0ZShkYXkuZGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbmQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZVByZXNldCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIHRoZSByYW5nZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShkYXkuZGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1vbWVudChuZXdEYXRlKS5pc0JlZm9yZSh0aGlzLl9zZWxlY3RlZFN0YXJ0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVuZCA9IG5ldyBEYXRlKHRoaXMuX3NlbGVjdGVkU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFN0YXJ0ID0gbmV3RGF0ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVuZCA9IG5ld0RhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgc2VsZWN0UHJlc2V0KHByZXNldDogRGF0ZVBpY2tlclByZXNldCkge1xuICAgICAgICBjb25zdCByYW5nZSA9IHByZXNldC5nZXRSYW5nZSgpO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkRW5kID0gcmFuZ2UuZW5kO1xuICAgICAgICB0aGlzLl9hY3RpdmVQcmVzZXQgPSBwcmVzZXQubGFiZWw7XG4gICAgICAgIHRoaXMubGVmdEN1cnJlbnRTbG90ID0gbmV3IERhdGUocmFuZ2Uuc3RhcnQpO1xuICAgICAgICBpZiAodGhpcy5zaG93RHVhbENhbGVuZGFycykge1xuICAgICAgICAgICAgdGhpcy5yaWdodEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMubGVmdEN1cnJlbnRTbG90KS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG5cbiAgICBnb1RvVG9kYXkoKSB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gbW9tZW50KHRvZGF5KS5zdGFydE9mKCdkYXknKS50b0RhdGUoKTtcbiAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgYXBwbHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlID0gbmV3IERhdGUodGhpcy5fc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLmRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkU3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG5ldyBEYXRlKHRoaXMuX3NlbGVjdGVkU3RhcnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlQ2hhbmdlLmVtaXQodGhpcy5zdGFydERhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkRW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUodGhpcy5fc2VsZWN0ZWRFbmQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kRGF0ZUNoYW5nZS5lbWl0KHRoaXMuZW5kRGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRTdGFydCAmJiB0aGlzLl9zZWxlY3RlZEVuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VDaGFuZ2UuZW1pdCh7IHN0YXJ0OiB0aGlzLnN0YXJ0RGF0ZSwgZW5kOiB0aGlzLmVuZERhdGUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGdldCBjYW5BcHBseSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3NpbmdsZScpIHJldHVybiAhIXRoaXMuX3NlbGVjdGVkRGF0ZTtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuX3NlbGVjdGVkU3RhcnQgJiYgdGhpcy5fc2VsZWN0ZWRFbmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJzKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZURheXModGhpcy5sZWZ0Q3VycmVudFNsb3QsICdsZWZ0Jyk7XG4gICAgICAgIGlmICh0aGlzLnNob3dEdWFsQ2FsZW5kYXJzKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURheXModGhpcy5yaWdodEN1cnJlbnRTbG90LCAncmlnaHQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRGF5cyhzbG90OiBEYXRlLCBzaWRlOiAnbGVmdCcgfCAncmlnaHQnKSB7XG4gICAgICAgIGNvbnN0IGVuTW9udGggPSBtb21lbnQoc2xvdCkuZm9ybWF0KCdNTU0nKTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZE1vbnRoID0gdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoZW5Nb250aCk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gbW9tZW50KHNsb3QpLmZvcm1hdCgnTU1NTSBZWVlZJyk7XG5cbiAgICAgICAgY29uc3QgZGF5Um93czogQXJyYXk8eyBkYXlzOiBEYXRlUGlja2VyRGF5W10gfT4gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBtb21lbnQoc2xvdCkuc3RhcnRPZignbW9udGgnKS5zdGFydE9mKCdpc29XZWVrJyk7XG4gICAgICAgIGNvbnN0IGVuZCA9IG1vbWVudChzbG90KS5lbmRPZignbW9udGgnKS5lbmRPZignaXNvV2VlaycpO1xuICAgICAgICBjb25zdCBjdXJyZW50TW9udGggPSBtb21lbnQoc2xvdCkubW9udGgoKTtcblxuICAgICAgICB3aGlsZSAoY3VycmVudC5pc1NhbWVPckJlZm9yZShlbmQpKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSB7IGRheXM6IFtdIGFzIERhdGVQaWNrZXJEYXlbXSB9O1xuICAgICAgICAgICAgZGF5Um93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCA3OyBpZHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzT3V0c2lkZSA9IGN1cnJlbnRNb250aCAhPT0gY3VycmVudC5tb250aCgpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5EYXRlICYmIGN1cnJlbnQudG9EYXRlKCkgPCB0aGlzLm1pbkRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1heERhdGUgJiYgY3VycmVudC50b0RhdGUoKSA+IHRoaXMubWF4RGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgaXNIaWdobGlnaHRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodERheXMgJiYgdGhpcy5oaWdobGlnaHREYXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpc0hpZ2hsaWdodGVkID0gdGhpcy5oaWdobGlnaHREYXlzLmluZGV4T2YoY3VycmVudC52YWx1ZU9mKCkpID49IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGlzT3V0c2lkZSA/IGZhbHNlIDogdGhpcy5pc0RheVNlbGVjdGVkKGN1cnJlbnQpO1xuXG4gICAgICAgICAgICAgICAgcm93LmRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGU6IGN1cnJlbnQudG9EYXRlKCksXG4gICAgICAgICAgICAgICAgICAgIGxibDogaXNPdXRzaWRlID8gJycgOiBjdXJyZW50LmRhdGUoKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBpc091dHNpZGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBpc1NlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBpc091dHNpZGUgPyB0cnVlIDogaXNEaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgaXNIaWdobGlnaHRlZDogaXNPdXRzaWRlID8gZmFsc2UgOiBpc0hpZ2hsaWdodGVkXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5jbG9uZSgpLmFkZCgxLCAnZGF5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2lkZSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICB0aGlzLmxlZnREYXlSb3dzID0gZGF5Um93cztcbiAgICAgICAgICAgIHRoaXMubGVmdERheXNUaXRsZSA9IHRpdGxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yaWdodERheVJvd3MgPSBkYXlSb3dzO1xuICAgICAgICAgICAgdGhpcy5yaWdodERheXNUaXRsZSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RheVNlbGVjdGVkKGRhdGU6IG1vbWVudC5Nb21lbnQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZERhdGUgPyBkYXRlLmlzU2FtZShtb21lbnQodGhpcy5fc2VsZWN0ZWREYXRlKSwgJ2RheScpIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkU3RhcnQgJiYgZGF0ZS5pc1NhbWUobW9tZW50KHRoaXMuX3NlbGVjdGVkU3RhcnQpLCAnZGF5JykpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRFbmQgJiYgZGF0ZS5pc1NhbWUobW9tZW50KHRoaXMuX3NlbGVjdGVkRW5kKSwgJ2RheScpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzVG9kYXkoZGF5OiBEYXRlUGlja2VyRGF5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChkYXkuaXNPdXRzaWRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBtb21lbnQoZGF5LmRhdGUpLmlzU2FtZShtb21lbnQoKSwgJ2RheScpO1xuICAgIH1cblxuICAgIGlzSW5SYW5nZShkYXk6IERhdGVQaWNrZXJEYXkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRheS5pc091dHNpZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3JhbmdlJyB8fCAhdGhpcy5fc2VsZWN0ZWRTdGFydCB8fCAhdGhpcy5fc2VsZWN0ZWRFbmQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgZCA9IG1vbWVudChkYXkuZGF0ZSk7XG4gICAgICAgIHJldHVybiBkLmlzQWZ0ZXIobW9tZW50KHRoaXMuX3NlbGVjdGVkU3RhcnQpLCAnZGF5JykgJiYgZC5pc0JlZm9yZShtb21lbnQodGhpcy5fc2VsZWN0ZWRFbmQpLCAnZGF5Jyk7XG4gICAgfVxuXG4gICAgaXNSYW5nZVN0YXJ0KGRheTogRGF0ZVBpY2tlckRheSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZGF5LmlzT3V0c2lkZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAncmFuZ2UnIHx8ICF0aGlzLl9zZWxlY3RlZFN0YXJ0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBtb21lbnQoZGF5LmRhdGUpLmlzU2FtZShtb21lbnQodGhpcy5fc2VsZWN0ZWRTdGFydCksICdkYXknKTtcbiAgICB9XG5cbiAgICBpc1JhbmdlRW5kKGRheTogRGF0ZVBpY2tlckRheSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZGF5LmlzT3V0c2lkZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAncmFuZ2UnIHx8ICF0aGlzLl9zZWxlY3RlZEVuZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbW9tZW50KGRheS5kYXRlKS5pc1NhbWUobW9tZW50KHRoaXMuX3NlbGVjdGVkRW5kKSwgJ2RheScpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ6ZW4tZHBkXCI+XG4gICAgPCEtLSBUcmlnZ2VyIEJ1dHRvbiAtLT5cbiAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiXG4gICAgICAgICAgICAjdHJpZ2dlckJ0blxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNPcGVuXCJcbiAgICAgICAgICAgIFtjbGFzcy5oYXMtdmFsdWVdPVwiaGFzVmFsdWVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCI+XG4gICAgICAgIDx6ZW4taWNvbiBjbGFzcz1cInRyaWdnZXItaWNvblwiXG4gICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9jYWxlbmRhci5zdmdcIj5cbiAgICAgICAgPC96ZW4taWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cmlnZ2VyLWxhYmVsXCI+e3sgdHJpZ2dlckxhYmVsIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBEcm9wZG93biBQYW5lbCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiICpuZ0lmPVwiaXNPcGVuXCIgW2NsYXNzLm1vYmlsZV09XCJtb2JpbGVcIiBbbmdTdHlsZV09XCJkcm9wZG93blN0eWxlXCI+XG4gICAgICAgIDwhLS0gUkFOR0UgREVTS1RPUDogcHJlc2V0cyBzaWRlYmFyICsgZHVhbCBjYWxlbmRhciAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09ICdyYW5nZScgJiYgIW1vYmlsZVwiPlxuICAgICAgICAgICAgPCEtLSBQcmVzZXRzIHNpZGViYXIgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0cy1zaWRlYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByZXNldC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcmVzZXQgb2YgYWN0aXZlUHJlc2V0c1wiXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIl9hY3RpdmVQcmVzZXQgPT09IHByZXNldC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UHJlc2V0KHByZXNldClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgcHJlc2V0LmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpZGViYXItZGl2aWRlclwiPjwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIENhbGVuZGFycyArIGJvdHRvbSBwYW5lbCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhcnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR1YWwtY2FsZW5kYXJzXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTGVmdCBjYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibGVmdFByZXZNb250aCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctbGVmdC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb250aC10aXRsZVwiPnt7IGxlZnREYXlzVGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtYnRuXCIgKGNsaWNrKT1cImxlZnROZXh0TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LXJpZ2h0LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYWxlbmRhckdyaWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBsZWZ0RGF5Um93cyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFJpZ2h0IGNhbGVuZGFyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItcGFuZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJyaWdodFByZXZNb250aCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctbGVmdC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb250aC10aXRsZVwiPnt7IHJpZ2h0RGF5c1RpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJyaWdodE5leHRNb250aCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhbGVuZGFyR3JpZDsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJpZ2h0RGF5Um93cyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQm90dG9tIHBhbmVsOiBpbnB1dHMgKyBhY3Rpb25zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tcGFuZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtaW5wdXQtdGV4dFwiIFtjbGFzcy5wbGFjZWhvbGRlcl09XCIhX3NlbGVjdGVkU3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkU3RhcnQgPyBmb3JtYXR0ZWRTdGFydERhdGUgOiAoJ1N0YXJ0IGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXNlcGFyYXRvclwiPiZuZGFzaDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1pbnB1dC10ZXh0XCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cIiFfc2VsZWN0ZWRFbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkRW5kID8gZm9ybWF0dGVkRW5kRGF0ZSA6ICgnRW5kIGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2FuY2VsXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+e3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYXBwbHlcIiBbZGlzYWJsZWRdPVwiIWNhbkFwcGx5XCIgKGNsaWNrKT1cImFwcGx5KClcIj57eyAnQXBwbHknIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUkFOR0UgTU9CSUxFOiBzaW5nbGUgY2FsZW5kYXIgd2l0aCBkdWFsIGlucHV0cyBvbiB0b3AgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAncmFuZ2UnICYmIG1vYmlsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1jYWxlbmRhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJwcmV2TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1sZWZ0LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9udGgtdGl0bGVcIj57eyBsZWZ0RGF5c1RpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFJhbmdlIGlucHV0cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1yYW5nZS1pbnB1dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWlucHV0IGNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtaW5wdXQtdGV4dFwiIFtjbGFzcy5wbGFjZWhvbGRlcl09XCIhX3NlbGVjdGVkU3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkU3RhcnQgPyBmb3JtYXR0ZWRTdGFydERhdGUgOiAoJ1NlbGVjdCBkYXRlJyB8IHRyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1zZXBhcmF0b3JcIj4mbmRhc2g7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXQgY29tcGFjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1pbnB1dC10ZXh0XCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cIiFfc2VsZWN0ZWRFbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkRW5kID8gZm9ybWF0dGVkRW5kRGF0ZSA6ICgnU2VsZWN0IGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FsZW5kYXJHcmlkOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbGVmdERheVJvd3MgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbS1kaXZpZGVyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLXBhbmVsIGNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMgZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1jYW5jZWxcIiAoY2xpY2spPVwiY2FuY2VsKClcIj57eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1hcHBseVwiIFtkaXNhYmxlZF09XCIhY2FuQXBwbHlcIiAoY2xpY2spPVwiYXBwbHkoKVwiPnt7ICdBcHBseScgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTSU5HTEUgREFURTogc2luZ2xlIGNhbGVuZGFyICsgaW5wdXQgKyB0b2RheSBidXR0b24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAnc2luZ2xlJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1jYWxlbmRhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJwcmV2TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1sZWZ0LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9udGgtdGl0bGVcIj57eyBsZWZ0RGF5c1RpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGUgaW5wdXQgKyBUb2RheSBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtYWN0aW9ucy1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWlucHV0IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1pbnB1dC10ZXh0XCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cIiFfc2VsZWN0ZWREYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IF9zZWxlY3RlZERhdGUgPyBmb3JtYXR0ZWRTZWxlY3RlZERhdGUgOiAoJ1NlbGVjdCBkYXRlJyB8IHRyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tdG9kYXlcIiAoY2xpY2spPVwiZ29Ub1RvZGF5KClcIj57eyAnVG9kYXknIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYWxlbmRhckdyaWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBsZWZ0RGF5Um93cyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tcGFuZWwgY29tcGFjdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucyBmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNhbmNlbFwiIChjbGljayk9XCJjYW5jZWwoKVwiPnt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFwcGx5XCIgW2Rpc2FibGVkXT1cIiFjYW5BcHBseVwiIChjbGljayk9XCJhcHBseSgpXCI+e3sgJ0FwcGx5JyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIFNoYXJlZCBjYWxlbmRhciBncmlkIHRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNjYWxlbmRhckdyaWQgbGV0LWRheVJvd3M+XG4gICAgPGRpdiBjbGFzcz1cImRhdGVzLWdyaWRcIj5cbiAgICAgICAgPCEtLSBXZWVrIGRheSBoZWFkZXJzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2Vlay1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZWxsIGhlYWRlci1jZWxsXCIgKm5nRm9yPVwibGV0IHdkIG9mIHdlZWtEYXlzXCI+e3sgd2QgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRGF5IHJvd3MgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXktcm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBkYXlSb3dzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VsbCBkYXktY2VsbFwiXG4gICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2Ygcm93LmRheXNcIlxuICAgICAgICAgICAgICAgICBbY2xhc3Mub3V0c2lkZV09XCJkYXkuaXNPdXRzaWRlXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImRheS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJpc1RvZGF5KGRheSlcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGF5LmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MuaW4tcmFuZ2VdPVwiaXNJblJhbmdlKGRheSlcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MucmFuZ2Utc3RhcnRdPVwiaXNSYW5nZVN0YXJ0KGRheSlcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MucmFuZ2UtZW5kXT1cImlzUmFuZ2VFbmQoZGF5KVwiXG4gICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXkoZGF5KVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF5LW51bWJlclwiPnt7IGRheS5sYmwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWdobGlnaHQtZG90XCIgKm5nSWY9XCJkYXkuaXNIaWdobGlnaHRlZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
637
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtZGF0ZS1waWNrZXItZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctemVuZHVpdC9zcmMvbGliL2RhdGUtcGlja2VyLWRyb3Bkb3duL3plbmR1LWRhdGUtcGlja2VyLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9kYXRlLXBpY2tlci1kcm9wZG93bi96ZW5kdS1kYXRlLXBpY2tlci1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUMxQixNQUFNLEVBQWlCLFNBQVMsRUFDakUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDOzs7OztBQUtuQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztBQU85QixNQUFNLE9BQU8sZ0NBQWdDO0lBd0h6QyxZQUNZLFFBQW9CLEVBQ3BCLFVBQTRCO1FBRDVCLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUF4SC9CLFNBQUksR0FBMkIsUUFBUSxDQUFDO1FBQ3hDLFNBQUksR0FBZ0IsSUFBSSxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRTlDLGNBQVMsR0FBZ0IsSUFBSSxDQUFDO1FBQzdCLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUVuRCxZQUFPLEdBQWdCLElBQUksQ0FBQztRQUMzQixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFFaEQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUVsRCxZQUFPLEdBQThCLElBQUksQ0FBQztRQUMxQyxZQUFPLEdBQWdCLElBQUks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QixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUUsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRW1CLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkEyR3ZCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlO2dCQXdCN0IsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCxcbiAgICBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50L21vbWVudCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyRGF5IH0gZnJvbSAnLi4vZGF0ZXBpY2tlci9kYXRlLXBpY2tlci1kYXknO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVBpY2tlckRyb3Bkb3duVHlwZSwgRGF0ZVBpY2tlclByZXNldCwgRGF0ZVJhbmdlVmFsdWUgfSBmcm9tICcuL2RhdGUtcGlja2VyLWRyb3Bkb3duLnR5cGVzJztcblxuY29uc3QgTU9CSUxFX0JSRUFLUE9JTlQgPSA3Njg7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnemVuLWRhdGUtcGlja2VyLWRyb3Bkb3duJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtZGF0ZS1waWNrZXItZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3plbmR1LWRhdGUtcGlja2VyLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgWmVuZHVEYXRlUGlja2VyRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICAgIEBJbnB1dCgpIHR5cGU6IERhdGVQaWNrZXJEcm9wZG93blR5cGUgPSAnc2luZ2xlJztcbiAgICBASW5wdXQoKSBkYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuXG4gICAgQElucHV0KCkgc3RhcnREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQE91dHB1dCgpIHN0YXJ0RGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG5cbiAgICBASW5wdXQoKSBlbmREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQE91dHB1dCgpIGVuZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xuXG4gICAgQE91dHB1dCgpIHJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2VWYWx1ZT4oKTtcblxuICAgIEBJbnB1dCgpIHByZXNldHM6IERhdGVQaWNrZXJQcmVzZXRbXSB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIG1pbkRhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBtYXhEYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBoaWdobGlnaHREYXlzOiBudW1iZXJbXSA9IFtdO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgICBASW5wdXQoKSBtb2JpbGVCcmVha3BvaW50OiBudW1iZXIgPSBNT0JJTEVfQlJFQUtQT0lOVDtcbiAgICBASW5wdXQoKSB0aW1lUGlja2VyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBAVmlld0NoaWxkKCd0cmlnZ2VyQnRuJykgdHJpZ2dlckJ0biE6IEVsZW1lbnRSZWY7XG5cbiAgICBtb2JpbGUgPSBmYWxzZTtcbiAgICBpc09wZW4gPSBmYWxzZTtcbiAgICBkcm9wZG93blN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgICAvLyBMZWZ0IGNhbGVuZGFyIHN0YXRlXG4gICAgbGVmdEN1cnJlbnRTbG90ID0gbmV3IERhdGUoKTtcbiAgICBsZWZ0RGF5Um93czogQXJyYXk8eyBkYXlzOiBEYXRlUGlja2VyRGF5W10gfT4gPSBbXTtcbiAgICBsZWZ0RGF5c1RpdGxlID0gJyc7XG5cbiAgICAvLyBSaWdodCBjYWxlbmRhciBzdGF0ZSAoZm9yIHJhbmdlIGRlc2t0b3ApXG4gICAgcmlnaHRDdXJyZW50U2xvdCA9IG5ldyBEYXRlKCk7XG4gICAgcmlnaHREYXlSb3dzOiBBcnJheTx7IGRheXM6IERhdGVQaWNrZXJEYXlbXSB9PiA9IFtdO1xuICAgIHJpZ2h0RGF5c1RpdGxlID0gJyc7XG5cbiAgICB3ZWVrRGF5cyA9IFsnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2F0JywgJ1N1J107XG5cbiAgICAvLyBJbnRlcm5hbCBzZWxlY3Rpb24gc3RhdGVcbiAgICBfc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgX3NlbGVjdGVkU3RhcnQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBfc2VsZWN0ZWRFbmQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBfYWN0aXZlUHJlc2V0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFRpbWUgcGlja2VyIHN0YXRlXG4gICAgX2hvdXJzOiBudW1iZXIgPSAxMjtcbiAgICBfbWludXRlczogbnVtYmVyID0gMDtcbiAgICBfcGVyaW9kOiAnQU0nIHwgJ1BNJyA9ICdBTSc7XG4gICAgX2hvdXJzRGlzcGxheTogc3RyaW5nID0gJzEyJztcbiAgICBfbWludXRlc0Rpc3BsYXk6IHN0cmluZyA9ICcwMCc7XG5cbiAgICBkZWZhdWx0UHJlc2V0czogRGF0ZVBpY2tlclByZXNldFtdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ1RvZGF5JyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdkYXknKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdZZXN0ZXJkYXknLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXknKS5zdGFydE9mKCdkYXknKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdkYXknKS5lbmRPZignZGF5JykudG9EYXRlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnVGhpcyB3ZWVrJyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdGFydE9mKCdpc29XZWVrJykudG9EYXRlKCksXG4gICAgICAgICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignaXNvV2VlaycpLnRvRGF0ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0xhc3Qgd2VlaycsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3VidHJhY3QoMSwgJ3dlZWsnKS5zdGFydE9mKCdpc29XZWVrJykudG9EYXRlKCksXG4gICAgICAgICAgICAgICAgZW5kOiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnd2VlaycpLmVuZE9mKCdpc29XZWVrJykudG9EYXRlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnVGhpcyBtb250aCcsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbW9tZW50KCkuc3RhcnRPZignbW9udGgnKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJ0xhc3QgbW9udGgnLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICdtb250aCcpLnN0YXJ0T2YoJ21vbnRoJykudG9EYXRlKCksXG4gICAgICAgICAgICAgICAgZW5kOiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdUaGlzIHllYXInLFxuICAgICAgICAgICAgZ2V0UmFuZ2U6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbWVudCgpLnN0YXJ0T2YoJ3llYXInKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLmVuZE9mKCd5ZWFyJykudG9EYXRlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiAnTGFzdCB5ZWFyJyxcbiAgICAgICAgICAgIGdldFJhbmdlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBtb21lbnQoKS5zdWJ0cmFjdCgxLCAneWVhcicpLnN0YXJ0T2YoJ3llYXInKS50b0RhdGUoKSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbWVudCgpLnN1YnRyYWN0KDEsICd5ZWFyJykuZW5kT2YoJ3llYXInKS50b0RhdGUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdBbGwgdGltZScsXG4gICAgICAgICAgICBnZXRSYW5nZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdGFydDogbmV3IERhdGUoMjAwMCwgMCwgMSksXG4gICAgICAgICAgICAgICAgZW5kOiBtb21lbnQoKS5lbmRPZignZGF5JykudG9EYXRlKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICBdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZVxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGVja01vYmlsZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICAgIG9uUmVzaXplKCkge1xuICAgICAgICB0aGlzLmNoZWNrTW9iaWxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja01vYmlsZSgpIHtcbiAgICAgICAgdGhpcy5tb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IHRoaXMubW9iaWxlQnJlYWtwb2ludDtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydkYXRlJ10gJiYgdGhpcy5kYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLmRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzdGFydERhdGUnXSAmJiB0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdGFydCA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snZW5kRGF0ZSddICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbmQgPSBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7IH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICAgIG91dHNpZGVIYW5kbGluZyhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBnZXQgYWN0aXZlUHJlc2V0cygpOiBEYXRlUGlja2VyUHJlc2V0W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVzZXRzIHx8IHRoaXMuZGVmYXVsdFByZXNldHM7XG4gICAgfVxuXG4gICAgZ2V0IHNob3dQcmVzZXRzU2lkZWJhcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3JhbmdlJyAmJiAhdGhpcy5tb2JpbGU7XG4gICAgfVxuXG4gICAgZ2V0IHNob3dEdWFsQ2FsZW5kYXJzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAncmFuZ2UnICYmICF0aGlzLm1vYmlsZTtcbiAgICB9XG5cbiAgICBnZXQgdHJpZ2dlckxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh0aGlzLmRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ1NlbGVjdCBkYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZm9ybWF0RGF0ZSh0aGlzLnN0YXJ0RGF0ZSl9IC0gJHt0aGlzLmZvcm1hdERhdGUodGhpcy5lbmREYXRlKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyIHx8IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCdTZWxlY3QgZGF0ZXMnKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSByZXR1cm4gISF0aGlzLmRhdGU7XG4gICAgICAgIHJldHVybiAhISh0aGlzLnN0YXJ0RGF0ZSAmJiB0aGlzLmVuZERhdGUpO1xuICAgIH1cblxuICAgIGdldCBmb3JtYXR0ZWRTZWxlY3RlZERhdGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZSA/IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9zZWxlY3RlZERhdGUpIDogJyc7XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1hdHRlZFN0YXJ0RGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRTdGFydCA/IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9zZWxlY3RlZFN0YXJ0KSA6ICcnO1xuICAgIH1cblxuICAgIGdldCBmb3JtYXR0ZWRFbmREYXRlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEVuZCA/IHRoaXMuZm9ybWF0RGF0ZSh0aGlzLl9zZWxlY3RlZEVuZCkgOiAnJztcbiAgICB9XG5cbiAgICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBlbk1vbnRoID0gbW9tZW50KGRhdGUpLmZvcm1hdCgnTU1NJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRNb250aCA9IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KGVuTW9udGgpO1xuICAgICAgICBsZXQgZm9ybWF0dGVkID0gbW9tZW50KGRhdGUpLmZvcm1hdCgnTU1NIEQsIFlZWVknKS5yZXBsYWNlKGVuTW9udGgsIHRyYW5zbGF0ZWRNb250aCk7XG4gICAgICAgIGlmICh0aGlzLnRpbWVQaWNrZXIpIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZCArPSAnICcgKyB0aGlzLmZvcm1hdFRpbWUoZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdFRpbWUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBoID0gZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICBjb25zdCBtID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIGNvbnN0IHBlcmlvZCA9IGggPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAgICAgaWYgKGggPT09IDApIGggPSAxMjtcbiAgICAgICAgZWxzZSBpZiAoaCA+IDEyKSBoIC09IDEyO1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5mb3JtYXROdW0oaCl9OiR7dGhpcy5mb3JtYXROdW0obSl9ICR7cGVyaW9kfWA7XG4gICAgfVxuXG4gICAgdG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3BlbigpIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSB0aGlzLmRhdGUgPyBuZXcgRGF0ZSh0aGlzLmRhdGUpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdGFydCA9IHRoaXMuc3RhcnREYXRlID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbmQgPSB0aGlzLmVuZERhdGUgPyBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpIDogbnVsbDtcbiAgICAgICAgdGhpcy5fYWN0aXZlUHJlc2V0ID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy50aW1lUGlja2VyKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRUaW1lRnJvbURhdGUodGhpcy50eXBlID09PSAnc2luZ2xlJyA/IHRoaXMuZGF0ZSA6IHRoaXMuc3RhcnREYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmxlZnRDdXJyZW50U2xvdCA9IHRoaXMuX3NlbGVjdGVkRGF0ZSA/IG5ldyBEYXRlKHRoaXMuX3NlbGVjdGVkRGF0ZSkgOiBuZXcgRGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSB0aGlzLl9zZWxlY3RlZFN0YXJ0ID8gbmV3IERhdGUodGhpcy5fc2VsZWN0ZWRTdGFydCkgOiBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5yaWdodEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMubGVmdEN1cnJlbnRTbG90KS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgICAgICB0aGlzLnVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy50cmlnZ2VyQnRuKSByZXR1cm47XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy50cmlnZ2VyQnRuLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkVsID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kcm9wZG93bi1tZW51Jyk7XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkhlaWdodCA9IGRyb3Bkb3duRWwgPyBkcm9wZG93bkVsLnNjcm9sbEhlaWdodCA6IDUwMDtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNlQmVsb3cgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmJvdHRvbSAtIDg7XG4gICAgICAgICAgICBjb25zdCBzcGFjZUFib3ZlID0gcmVjdC50b3AgLSA4O1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gMTY7XG4gICAgICAgICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgICAgICAgY29uc3Qgc3R5bGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IGxlZnQ6IGAke3JlY3QubGVmdH1weGAgfTtcblxuICAgICAgICAgICAgaWYgKHNwYWNlQmVsb3cgPj0gZHJvcGRvd25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAvLyBGaXRzIGJlbG93IHRoZSB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgc3R5bGVbJ3RvcCddID0gYCR7cmVjdC5ib3R0b20gKyA4fXB4YDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BhY2VBYm92ZSA+PSBkcm9wZG93bkhlaWdodCkge1xuICAgICAgICAgICAgICAgIC8vIEZpdHMgYWJvdmUgdGhlIHRyaWdnZXJcbiAgICAgICAgICAgICAgICBzdHlsZVsnYm90dG9tJ10gPSBgJHt2aWV3cG9ydEhlaWdodCAtIHJlY3QudG9wICsgOH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgZml0IGVpdGhlciB3YXkg4oCUIHBpbiB0byB2aWV3cG9ydCBzbyBmdWxsIGNvbnRlbnQgaXMgdmlzaWJsZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KG1hcmdpbiwgdmlld3BvcnRIZWlnaHQgLSBkcm9wZG93bkhlaWdodCAtIG1hcmdpbik7XG4gICAgICAgICAgICAgICAgc3R5bGVbJ3RvcCddID0gYCR7dG9wfXB4YDtcbiAgICAgICAgICAgICAgICBzdHlsZVsnbWF4LWhlaWdodCddID0gYCR7dmlld3BvcnRIZWlnaHQgLSB0b3AgLSBtYXJnaW59cHhgO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duU3R5bGUgPSBzdHlsZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2FsZW5kYXIgbmF2aWdhdGlvblxuICAgIGxlZnRQcmV2TW9udGgoKSB7XG4gICAgICAgIHRoaXMubGVmdEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMubGVmdEN1cnJlbnRTbG90KS5zdWJ0cmFjdCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0R1YWxDYWxlbmRhcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmlnaHRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmxlZnRDdXJyZW50U2xvdCkuYWRkKDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgbGVmdE5leHRNb250aCgpIHtcbiAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5sZWZ0Q3VycmVudFNsb3QpLmFkZCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0R1YWxDYWxlbmRhcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmlnaHRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLmxlZnRDdXJyZW50U2xvdCkuYWRkKDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgcmlnaHRQcmV2TW9udGgoKSB7XG4gICAgICAgIHRoaXMucmlnaHRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLnJpZ2h0Q3VycmVudFNsb3QpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLmxlZnRDdXJyZW50U2xvdCA9IG1vbWVudCh0aGlzLnJpZ2h0Q3VycmVudFNsb3QpLnN1YnRyYWN0KDEsICdtb250aCcpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cblxuICAgIHJpZ2h0TmV4dE1vbnRoKCkge1xuICAgICAgICB0aGlzLnJpZ2h0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5yaWdodEN1cnJlbnRTbG90KS5hZGQoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIHRoaXMubGVmdEN1cnJlbnRTbG90ID0gbW9tZW50KHRoaXMucmlnaHRDdXJyZW50U2xvdCkuc3VidHJhY3QoMSwgJ21vbnRoJykudG9EYXRlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIG1vYmlsZS9zaW5nbGUgbW9kZSB3aGVuIHRoZXJlJ3Mgb25seSBvbmUgY2FsZW5kYXJcbiAgICBwcmV2TW9udGgoKSB7XG4gICAgICAgIHRoaXMubGVmdFByZXZNb250aCgpO1xuICAgIH1cblxuICAgIG5leHRNb250aCgpIHtcbiAgICAgICAgdGhpcy5sZWZ0TmV4dE1vbnRoKCk7XG4gICAgfVxuXG4gICAgc2VsZWN0RGF5KGRheTogRGF0ZVBpY2tlckRheSkge1xuICAgICAgICBpZiAoZGF5LmlzRGlzYWJsZWQgfHwgZGF5LmlzT3V0c2lkZSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXkuZGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSYW5nZSBzZWxlY3Rpb24gbG9naWNcbiAgICAgICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWRTdGFydCB8fCAodGhpcy5fc2VsZWN0ZWRTdGFydCAmJiB0aGlzLl9zZWxlY3RlZEVuZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXcgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTdGFydCA9IG5ldyBEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEVuZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlUHJlc2V0ID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgdGhlIHJhbmdlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAobW9tZW50KG5ld0RhdGUpLmlzQmVmb3JlKHRoaXMuX3NlbGVjdGVkU3RhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRW5kID0gbmV3IERhdGUodGhpcy5fc2VsZWN0ZWRTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU3RhcnQgPSBuZXdEYXRlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRW5kID0gbmV3RGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RQcmVzZXQocHJlc2V0OiBEYXRlUGlja2VyUHJlc2V0KSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gcHJlc2V0LmdldFJhbmdlKCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkU3RhcnQgPSByYW5nZS5zdGFydDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRFbmQgPSByYW5nZS5lbmQ7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVByZXNldCA9IHByZXNldC5sYWJlbDtcbiAgICAgICAgdGhpcy5sZWZ0Q3VycmVudFNsb3QgPSBuZXcgRGF0ZShyYW5nZS5zdGFydCk7XG4gICAgICAgIGlmICh0aGlzLnNob3dEdWFsQ2FsZW5kYXJzKSB7XG4gICAgICAgICAgICB0aGlzLnJpZ2h0Q3VycmVudFNsb3QgPSBtb21lbnQodGhpcy5sZWZ0Q3VycmVudFNsb3QpLmFkZCgxLCAnbW9udGgnKS50b0RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cblxuICAgIGdvVG9Ub2RheSgpIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBtb21lbnQodG9kYXkpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpO1xuICAgICAgICB0aGlzLmxlZnRDdXJyZW50U2xvdCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG5cbiAgICAvLyBUaW1lIHBpY2tlciBtZXRob2RzXG4gICAgcHJpdmF0ZSBmb3JtYXROdW0objogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiAnJyArIG47XG4gICAgfVxuXG4gICAgaW5jcmVtZW50SG91cnMoKSB7XG4gICAgICAgIHRoaXMuX2hvdXJzID0gdGhpcy5faG91cnMgPj0gMTIgPyAxIDogdGhpcy5faG91cnMgKyAxO1xuICAgICAgICB0aGlzLl9ob3Vyc0Rpc3BsYXkgPSB0aGlzLmZvcm1hdE51bSh0aGlzLl9ob3Vycyk7XG4gICAgfVxuXG4gICAgZGVjcmVtZW50SG91cnMoKSB7XG4gICAgICAgIHRoaXMuX2hvdXJzID0gdGhpcy5faG91cnMgPD0gMSA/IDEyIDogdGhpcy5faG91cnMgLSAxO1xuICAgICAgICB0aGlzLl9ob3Vyc0Rpc3BsYXkgPSB0aGlzLmZvcm1hdE51bSh0aGlzLl9ob3Vycyk7XG4gICAgfVxuXG4gICAgaW5jcmVtZW50TWludXRlcygpIHtcbiAgICAgICAgdGhpcy5fbWludXRlcyA9IHRoaXMuX21pbnV0ZXMgPj0gNTkgPyAwIDogdGhpcy5fbWludXRlcyArIDE7XG4gICAgICAgIHRoaXMuX21pbnV0ZXNEaXNwbGF5ID0gdGhpcy5mb3JtYXROdW0odGhpcy5fbWludXRlcyk7XG4gICAgfVxuXG4gICAgZGVjcmVtZW50TWludXRlcygpIHtcbiAgICAgICAgdGhpcy5fbWludXRlcyA9IHRoaXMuX21pbnV0ZXMgPD0gMCA/IDU5IDogdGhpcy5fbWludXRlcyAtIDE7XG4gICAgICAgIHRoaXMuX21pbnV0ZXNEaXNwbGF5ID0gdGhpcy5mb3JtYXROdW0odGhpcy5fbWludXRlcyk7XG4gICAgfVxuXG4gICAgb25Ib3Vyc0lucHV0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCByYXcgPSBpbnB1dC52YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICBpZiAocmF3ID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5faG91cnMgPSAxO1xuICAgICAgICAgICAgdGhpcy5faG91cnNEaXNwbGF5ID0gJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gICAgICAgIGlmICh2YWwgPj0gMSAmJiB2YWwgPD0gMTIpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvdXJzID0gdmFsO1xuICAgICAgICAgICAgdGhpcy5faG91cnNEaXNwbGF5ID0gcmF3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLl9ob3Vyc0Rpc3BsYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1pbnV0ZXNJbnB1dChldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgcmF3ID0gaW5wdXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgaWYgKHJhdyA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuX21pbnV0ZXMgPSAwO1xuICAgICAgICAgICAgdGhpcy5fbWludXRlc0Rpc3BsYXkgPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWwgPSBwYXJzZUludChyYXcsIDEwKTtcbiAgICAgICAgaWYgKHZhbCA+PSAwICYmIHZhbCA8PSA1OSkge1xuICAgICAgICAgICAgdGhpcy5fbWludXRlcyA9IHZhbDtcbiAgICAgICAgICAgIHRoaXMuX21pbnV0ZXNEaXNwbGF5ID0gcmF3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLl9taW51dGVzRGlzcGxheTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsYW1wSG91cnMoKSB7XG4gICAgICAgIHRoaXMuX2hvdXJzID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMTIsIHRoaXMuX2hvdXJzKSk7XG4gICAgICAgIHRoaXMuX2hvdXJzRGlzcGxheSA9IHRoaXMuZm9ybWF0TnVtKHRoaXMuX2hvdXJzKTtcbiAgICB9XG5cbiAgICBjbGFtcE1pbnV0ZXMoKSB7XG4gICAgICAgIHRoaXMuX21pbnV0ZXMgPSBNYXRoLm1heCgwLCBNYXRoLm1pbig1OSwgdGhpcy5fbWludXRlcykpO1xuICAgICAgICB0aGlzLl9taW51dGVzRGlzcGxheSA9IHRoaXMuZm9ybWF0TnVtKHRoaXMuX21pbnV0ZXMpO1xuICAgIH1cblxuICAgIG9uVGltZUZvY3VzKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICBvblRpbWVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCB0eXBlOiAnaG91cnMnIHwgJ21pbnV0ZXMnKSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnaG91cnMnKSB0aGlzLmluY3JlbWVudEhvdXJzKCk7XG4gICAgICAgICAgICBlbHNlIHRoaXMuaW5jcmVtZW50TWludXRlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2hvdXJzJykgdGhpcy5kZWNyZW1lbnRIb3VycygpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmRlY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFBlcmlvZChwZXJpb2Q6ICdBTScgfCAnUE0nKSB7XG4gICAgICAgIHRoaXMuX3BlcmlvZCA9IHBlcmlvZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5VGltZVRvRGF0ZShkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgICAgICBsZXQgaG91cnMgPSB0aGlzLl9ob3VycztcbiAgICAgICAgaWYgKHRoaXMuX3BlcmlvZCA9PT0gJ0FNJyAmJiBob3VycyA9PT0gMTIpIHtcbiAgICAgICAgICAgIGhvdXJzID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9wZXJpb2QgPT09ICdQTScgJiYgaG91cnMgIT09IDEyKSB7XG4gICAgICAgICAgICBob3VycyArPSAxMjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQuc2V0SG91cnMoaG91cnMsIHRoaXMuX21pbnV0ZXMsIDAsIDApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFRpbWVGcm9tRGF0ZShkYXRlOiBEYXRlIHwgbnVsbCkge1xuICAgICAgICBpZiAoIWRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2hvdXJzID0gMTI7XG4gICAgICAgICAgICB0aGlzLl9taW51dGVzID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3BlcmlvZCA9ICdBTSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaCA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgIHRoaXMuX21pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgIGlmIChoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faG91cnMgPSAxMjtcbiAgICAgICAgICAgICAgICB0aGlzLl9wZXJpb2QgPSAnQU0nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoIDwgMTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3VycyA9IGg7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVyaW9kID0gJ0FNJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaCA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ob3VycyA9IDEyO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BlcmlvZCA9ICdQTSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hvdXJzID0gaCAtIDEyO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BlcmlvZCA9ICdQTSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faG91cnNEaXNwbGF5ID0gdGhpcy5mb3JtYXROdW0odGhpcy5faG91cnMpO1xuICAgICAgICB0aGlzLl9taW51dGVzRGlzcGxheSA9IHRoaXMuZm9ybWF0TnVtKHRoaXMuX21pbnV0ZXMpO1xuICAgIH1cblxuICAgIGFwcGx5KCkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSA9IHRoaXMudGltZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuYXBwbHlUaW1lVG9EYXRlKHRoaXMuX3NlbGVjdGVkRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZSh0aGlzLl9zZWxlY3RlZERhdGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KHRoaXMuZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRTdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy50aW1lUGlja2VyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5hcHBseVRpbWVUb0RhdGUodGhpcy5fc2VsZWN0ZWRTdGFydClcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZSh0aGlzLl9zZWxlY3RlZFN0YXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZUNoYW5nZS5lbWl0KHRoaXMuc3RhcnREYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEVuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IHRoaXMudGltZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuYXBwbHlUaW1lVG9EYXRlKHRoaXMuX3NlbGVjdGVkRW5kKVxuICAgICAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKHRoaXMuX3NlbGVjdGVkRW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZERhdGVDaGFuZ2UuZW1pdCh0aGlzLmVuZERhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkU3RhcnQgJiYgdGhpcy5fc2VsZWN0ZWRFbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlQ2hhbmdlLmVtaXQoeyBzdGFydDogdGhpcy5zdGFydERhdGUsIGVuZDogdGhpcy5lbmREYXRlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBnZXQgY2FuQXBwbHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSByZXR1cm4gISF0aGlzLl9zZWxlY3RlZERhdGU7XG4gICAgICAgIHJldHVybiAhISh0aGlzLl9zZWxlY3RlZFN0YXJ0ICYmIHRoaXMuX3NlbGVjdGVkRW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhbGVuZGFycygpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXlzKHRoaXMubGVmdEN1cnJlbnRTbG90LCAnbGVmdCcpO1xuICAgICAgICBpZiAodGhpcy5zaG93RHVhbENhbGVuZGFycykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXlzKHRoaXMucmlnaHRDdXJyZW50U2xvdCwgJ3JpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZURheXMoc2xvdDogRGF0ZSwgc2lkZTogJ2xlZnQnIHwgJ3JpZ2h0Jykge1xuICAgICAgICBjb25zdCBlbk1vbnRoID0gbW9tZW50KHNsb3QpLmZvcm1hdCgnTU1NJyk7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRNb250aCA9IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KGVuTW9udGgpO1xuICAgICAgICBjb25zdCB0aXRsZSA9IG1vbWVudChzbG90KS5mb3JtYXQoJ01NTU0gWVlZWScpO1xuXG4gICAgICAgIGNvbnN0IGRheVJvd3M6IEFycmF5PHsgZGF5czogRGF0ZVBpY2tlckRheVtdIH0+ID0gW107XG4gICAgICAgIGxldCBjdXJyZW50ID0gbW9tZW50KHNsb3QpLnN0YXJ0T2YoJ21vbnRoJykuc3RhcnRPZignaXNvV2VlaycpO1xuICAgICAgICBjb25zdCBlbmQgPSBtb21lbnQoc2xvdCkuZW5kT2YoJ21vbnRoJykuZW5kT2YoJ2lzb1dlZWsnKTtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbW9tZW50KHNsb3QpLm1vbnRoKCk7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnQuaXNTYW1lT3JCZWZvcmUoZW5kKSkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0geyBkYXlzOiBbXSBhcyBEYXRlUGlja2VyRGF5W10gfTtcbiAgICAgICAgICAgIGRheVJvd3MucHVzaChyb3cpO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgNzsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc091dHNpZGUgPSBjdXJyZW50TW9udGggIT09IGN1cnJlbnQubW9udGgoKTtcblxuICAgICAgICAgICAgICAgIGxldCBpc0Rpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWluRGF0ZSAmJiBjdXJyZW50LnRvRGF0ZSgpIDwgdGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXhEYXRlICYmIGN1cnJlbnQudG9EYXRlKCkgPiB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGlzSGlnaGxpZ2h0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHREYXlzICYmIHRoaXMuaGlnaGxpZ2h0RGF5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNIaWdobGlnaHRlZCA9IHRoaXMuaGlnaGxpZ2h0RGF5cy5pbmRleE9mKGN1cnJlbnQudmFsdWVPZigpKSA+PSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBpc091dHNpZGUgPyBmYWxzZSA6IHRoaXMuaXNEYXlTZWxlY3RlZChjdXJyZW50KTtcblxuICAgICAgICAgICAgICAgIHJvdy5kYXlzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBkYXRlOiBjdXJyZW50LnRvRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICBsYmw6IGlzT3V0c2lkZSA/ICcnIDogY3VycmVudC5kYXRlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgaXNPdXRzaWRlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogaXNTZWxlY3RlZCxcbiAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZDogaXNPdXRzaWRlID8gdHJ1ZSA6IGlzRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIGlzSGlnaGxpZ2h0ZWQ6IGlzT3V0c2lkZSA/IGZhbHNlIDogaXNIaWdobGlnaHRlZFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2xvbmUoKS5hZGQoMSwgJ2RheScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdGhpcy5sZWZ0RGF5Um93cyA9IGRheVJvd3M7XG4gICAgICAgICAgICB0aGlzLmxlZnREYXlzVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmlnaHREYXlSb3dzID0gZGF5Um93cztcbiAgICAgICAgICAgIHRoaXMucmlnaHREYXlzVGl0bGUgPSB0aXRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNEYXlTZWxlY3RlZChkYXRlOiBtb21lbnQuTW9tZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWREYXRlID8gZGF0ZS5pc1NhbWUobW9tZW50KHRoaXMuX3NlbGVjdGVkRGF0ZSksICdkYXknKSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZFN0YXJ0ICYmIGRhdGUuaXNTYW1lKG1vbWVudCh0aGlzLl9zZWxlY3RlZFN0YXJ0KSwgJ2RheScpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkRW5kICYmIGRhdGUuaXNTYW1lKG1vbWVudCh0aGlzLl9zZWxlY3RlZEVuZCksICdkYXknKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1RvZGF5KGRheTogRGF0ZVBpY2tlckRheSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZGF5LmlzT3V0c2lkZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbW9tZW50KGRheS5kYXRlKS5pc1NhbWUobW9tZW50KCksICdkYXknKTtcbiAgICB9XG5cbiAgICBpc0luUmFuZ2UoZGF5OiBEYXRlUGlja2VyRGF5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChkYXkuaXNPdXRzaWRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdyYW5nZScgfHwgIXRoaXMuX3NlbGVjdGVkU3RhcnQgfHwgIXRoaXMuX3NlbGVjdGVkRW5kKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGQgPSBtb21lbnQoZGF5LmRhdGUpO1xuICAgICAgICByZXR1cm4gZC5pc0FmdGVyKG1vbWVudCh0aGlzLl9zZWxlY3RlZFN0YXJ0KSwgJ2RheScpICYmIGQuaXNCZWZvcmUobW9tZW50KHRoaXMuX3NlbGVjdGVkRW5kKSwgJ2RheScpO1xuICAgIH1cblxuICAgIGlzUmFuZ2VTdGFydChkYXk6IERhdGVQaWNrZXJEYXkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRheS5pc091dHNpZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3JhbmdlJyB8fCAhdGhpcy5fc2VsZWN0ZWRTdGFydCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbW9tZW50KGRheS5kYXRlKS5pc1NhbWUobW9tZW50KHRoaXMuX3NlbGVjdGVkU3RhcnQpLCAnZGF5Jyk7XG4gICAgfVxuXG4gICAgaXNSYW5nZUVuZChkYXk6IERhdGVQaWNrZXJEYXkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRheS5pc091dHNpZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3JhbmdlJyB8fCAhdGhpcy5fc2VsZWN0ZWRFbmQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1vbWVudChkYXkuZGF0ZSkuaXNTYW1lKG1vbWVudCh0aGlzLl9zZWxlY3RlZEVuZCksICdkYXknKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiemVuLWRwZFwiPlxuICAgIDwhLS0gVHJpZ2dlciBCdXR0b24gLS0+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLXRyaWdnZXJcIlxuICAgICAgICAgICAgI3RyaWdnZXJCdG5cbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzT3BlblwiXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXZhbHVlXT1cImhhc1ZhbHVlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoKVwiPlxuICAgICAgICA8emVuLWljb24gY2xhc3M9XCJ0cmlnZ2VyLWljb25cIlxuICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvY2FsZW5kYXIuc3ZnXCI+XG4gICAgICAgIDwvemVuLWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidHJpZ2dlci1sYWJlbFwiPnt7IHRyaWdnZXJMYWJlbCB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gRHJvcGRvd24gUGFuZWwgLS0+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzT3BlblwiIFtjbGFzcy5tb2JpbGVdPVwibW9iaWxlXCIgW25nU3R5bGVdPVwiZHJvcGRvd25TdHlsZVwiPlxuICAgICAgICA8IS0tIFJBTkdFIERFU0tUT1A6IHByZXNldHMgc2lkZWJhciArIGR1YWwgY2FsZW5kYXIgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAncmFuZ2UnICYmICFtb2JpbGVcIj5cbiAgICAgICAgICAgIDwhLS0gUHJlc2V0cyBzaWRlYmFyIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByZXNldHMtc2lkZWJhclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXQtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcHJlc2V0IG9mIGFjdGl2ZVByZXNldHNcIlxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJfYWN0aXZlUHJlc2V0ID09PSBwcmVzZXQubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFByZXNldChwcmVzZXQpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHByZXNldC5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlYmFyLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBDYWxlbmRhcnMgKyBib3R0b20gcGFuZWwgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXJzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdWFsLWNhbGVuZGFyc1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIExlZnQgY2FsZW5kYXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1wYW5lbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtYnRuXCIgKGNsaWNrKT1cImxlZnRQcmV2TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LWxlZnQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9udGgtdGl0bGVcIj57eyBsZWZ0RGF5c1RpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJsZWZ0TmV4dE1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1yaWdodC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FsZW5kYXJHcmlkOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbGVmdERheVJvd3MgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1kaXZpZGVyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBSaWdodCBjYWxlbmRhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwicmlnaHRQcmV2TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LWxlZnQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9udGgtdGl0bGVcIj57eyByaWdodERheXNUaXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwicmlnaHROZXh0TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LXJpZ2h0LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYWxlbmRhckdyaWQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByaWdodERheVJvd3MgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBUaW1lIFBpY2tlciAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGltZVBpY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpbWVQaWNrZXJTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQm90dG9tIHBhbmVsOiBpbnB1dHMgKyBhY3Rpb25zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tcGFuZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtaW5wdXQtdGV4dFwiIFtjbGFzcy5wbGFjZWhvbGRlcl09XCIhX3NlbGVjdGVkU3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkU3RhcnQgPyBmb3JtYXR0ZWRTdGFydERhdGUgOiAoJ1N0YXJ0IGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLXNlcGFyYXRvclwiPiZuZGFzaDs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1pbnB1dC10ZXh0XCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cIiFfc2VsZWN0ZWRFbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkRW5kID8gZm9ybWF0dGVkRW5kRGF0ZSA6ICgnRW5kIGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2FuY2VsXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+e3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYXBwbHlcIiBbZGlzYWJsZWRdPVwiIWNhbkFwcGx5XCIgKGNsaWNrKT1cImFwcGx5KClcIj57eyAnQXBwbHknIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUkFOR0UgTU9CSUxFOiBzaW5nbGUgY2FsZW5kYXIgd2l0aCBkdWFsIGlucHV0cyBvbiB0b3AgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAncmFuZ2UnICYmIG1vYmlsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1jYWxlbmRhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJwcmV2TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1sZWZ0LnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9udGgtdGl0bGVcIj57eyBsZWZ0RGF5c1RpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFJhbmdlIGlucHV0cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1yYW5nZS1pbnB1dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLWlucHV0IGNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRhdGUtaW5wdXQtdGV4dFwiIFtjbGFzcy5wbGFjZWhvbGRlcl09XCIhX3NlbGVjdGVkU3RhcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkU3RhcnQgPyBmb3JtYXR0ZWRTdGFydERhdGUgOiAoJ1NlbGVjdCBkYXRlJyB8IHRyYW5zbGF0ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1zZXBhcmF0b3JcIj4mbmRhc2g7PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXQgY29tcGFjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGF0ZS1pbnB1dC10ZXh0XCIgW2NsYXNzLnBsYWNlaG9sZGVyXT1cIiFfc2VsZWN0ZWRFbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkRW5kID8gZm9ybWF0dGVkRW5kRGF0ZSA6ICgnU2VsZWN0IGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FsZW5kYXJHcmlkOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbGVmdERheVJvd3MgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBUaW1lIFBpY2tlciAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGltZVBpY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpbWVQaWNrZXJTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3R0b20tcGFuZWwgY29tcGFjdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucyBmdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNhbmNlbFwiIChjbGljayk9XCJjYW5jZWwoKVwiPnt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFwcGx5XCIgW2Rpc2FibGVkXT1cIiFjYW5BcHBseVwiIChjbGljayk9XCJhcHBseSgpXCI+e3sgJ0FwcGx5JyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFNJTkdMRSBEQVRFOiBzaW5nbGUgY2FsZW5kYXIgKyBpbnB1dCArIHRvZGF5IGJ1dHRvbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09ICdzaW5nbGUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLWNhbGVuZGFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuYXYtYnRuXCIgKGNsaWNrKT1cInByZXZNb250aCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHplbi1pY29uIHNyYz1cImFzc2V0cy9uZy16ZW5kdWl0L2ljb25zL2Fycm93LWxlZnQuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb250aC10aXRsZVwiPnt7IGxlZnREYXlzVGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJuZXh0TW9udGgoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1yaWdodC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSBpbnB1dCArIFRvZGF5IGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZS1hY3Rpb25zLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtaW5wdXQgZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYXRlLWlucHV0LXRleHRcIiBbY2xhc3MucGxhY2Vob2xkZXJdPVwiIV9zZWxlY3RlZERhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgX3NlbGVjdGVkRGF0ZSA/IGZvcm1hdHRlZFNlbGVjdGVkRGF0ZSA6ICgnU2VsZWN0IGRhdGUnIHwgdHJhbnNsYXRlKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi10b2RheVwiIChjbGljayk9XCJnb1RvVG9kYXkoKVwiPnt7ICdUb2RheScgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhbGVuZGFyR3JpZDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGxlZnREYXlSb3dzIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gVGltZSBQaWNrZXIgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRpbWVQaWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbS1kaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aW1lUGlja2VyU2VjdGlvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbS1kaXZpZGVyXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLXBhbmVsIGNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMgZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1jYW5jZWxcIiAoY2xpY2spPVwiY2FuY2VsKClcIj57eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1hcHBseVwiIFtkaXNhYmxlZF09XCIhY2FuQXBwbHlcIiAoY2xpY2spPVwiYXBwbHkoKVwiPnt7ICdBcHBseScgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBTaGFyZWQgdGltZSBwaWNrZXIgdGVtcGxhdGUgLS0+XG48bmctdGVtcGxhdGUgI3RpbWVQaWNrZXJTZWN0aW9uPlxuICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtcGlja2VyLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGltZS1waWNrZXItbGFiZWxcIj57eyAnU2VsZWN0IGEgdGltZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtZmllbGRzXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSG91cnMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiSG91cnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIl9ob3Vyc0Rpc3BsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25Ib3Vyc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25UaW1lRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cImNsYW1wSG91cnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uVGltZUtleWRvd24oJGV2ZW50LCAnaG91cnMnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWFycm93c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1hcnJvdy1idG5cIiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIChjbGljayk9XCJpbmNyZW1lbnRIb3VycygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctdXAtc21hbGwuc3ZnXCI+PC96ZW4taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0aW1lLWFycm93LWJ0blwiIHR5cGU9XCJidXR0b25cIiB0YWJpbmRleD1cIi0xXCIgKGNsaWNrKT1cImRlY3JlbWVudEhvdXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy1kb3duLXNtYWxsLnN2Z1wiPjwvemVuLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWUtaW5wdXQtbGFiZWxcIj57eyAnSFJTJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDb2xvbiBzZXBhcmF0b3IgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWNvbG9uXCI+OjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTWludXRlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWJveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInRpbWUtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJNaW51dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJfbWludXRlc0Rpc3BsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25NaW51dGVzSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJvblRpbWVGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiY2xhbXBNaW51dGVzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblRpbWVLZXlkb3duKCRldmVudCwgJ21pbnV0ZXMnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjJcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWFycm93c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1hcnJvdy1idG5cIiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIChjbGljayk9XCJpbmNyZW1lbnRNaW51dGVzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6ZW4taWNvbiBzcmM9XCJhc3NldHMvbmctemVuZHVpdC9pY29ucy9hcnJvdy11cC1zbWFsbC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRpbWUtYXJyb3ctYnRuXCIgdHlwZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIiAoY2xpY2spPVwiZGVjcmVtZW50TWludXRlcygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emVuLWljb24gc3JjPVwiYXNzZXRzL25nLXplbmR1aXQvaWNvbnMvYXJyb3ctZG93bi1zbWFsbC5zdmdcIj48L3plbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aW1lLWlucHV0LWxhYmVsXCI+e3sgJ01JTicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBBTS9QTSB0b2dnbGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtcGVyaW9kLXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1wZXJpb2QtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIl9wZXJpb2QgPT09ICdBTSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRQZXJpb2QoJ0FNJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFNXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidGltZS1wZXJpb2QtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIl9wZXJpb2QgPT09ICdQTSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRQZXJpb2QoJ1BNJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFBNXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBTaGFyZWQgY2FsZW5kYXIgZ3JpZCB0ZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjY2FsZW5kYXJHcmlkIGxldC1kYXlSb3dzPlxuICAgIDxkaXYgY2xhc3M9XCJkYXRlcy1ncmlkXCI+XG4gICAgICAgIDwhLS0gV2VlayBkYXkgaGVhZGVycyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlZWstaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VsbCBoZWFkZXItY2VsbFwiICpuZ0Zvcj1cImxldCB3ZCBvZiB3ZWVrRGF5c1wiPnt7IHdkIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIERheSByb3dzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5LXJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgZGF5Um93c1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbGwgZGF5LWNlbGxcIlxuICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIHJvdy5kYXlzXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLm91dHNpZGVdPVwiZGF5LmlzT3V0c2lkZVwiXG4gICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXkuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiaXNUb2RheShkYXkpXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmluLXJhbmdlXT1cImlzSW5SYW5nZShkYXkpXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLnJhbmdlLXN0YXJ0XT1cImlzUmFuZ2VTdGFydChkYXkpXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLnJhbmdlLWVuZF09XCJpc1JhbmdlRW5kKGRheSlcIlxuICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF5KGRheSlcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRheS1udW1iZXJcIj57eyBkYXkubGJsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlnaGxpZ2h0LWRvdFwiICpuZ0lmPVwiZGF5LmlzSGlnaGxpZ2h0ZWRcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|