tango-app-ui-manage-settings 3.7.35 → 3.7.36

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.
@@ -37,6 +37,8 @@ export class CustomReportScheduleComponent {
37
37
  emailList = [];
38
38
  emailValidation = [];
39
39
  saving = false;
40
+ /** Figma 2026-08-31: an already-scheduled report opens READ-ONLY; Edit unlocks. */
41
+ editMode = false;
40
42
  dayOptions = DAY_NAMES.map((name, index) => ({ value: index, label: name }));
41
43
  dateOptions = Array.from({ length: 31 }, (_, i) => i + 1);
42
44
  timeOptions = SCHEDULE_TIME_OPTIONS;
@@ -49,6 +51,7 @@ export class CustomReportScheduleComponent {
49
51
  if (this.template) {
50
52
  this.reportName = this.template?.templateName || '';
51
53
  const schedule = this.template?.schedule || {};
54
+ this.editMode = !schedule.enabled;
52
55
  this.frequency = schedule.frequency || 'daily';
53
56
  // A stored time outside the allowed slots (older schedules, free-typed
54
57
  // values) snaps back to the default rather than showing an empty select.
@@ -56,6 +59,11 @@ export class CustomReportScheduleComponent {
56
59
  this.time = SCHEDULE_TIME_OPTIONS.some((opt) => opt.value === storedTime) ? storedTime : '09:00';
57
60
  this.daysOfWeek = [...(schedule.daysOfWeek || [])];
58
61
  this.onceDate = schedule.onceDate || '';
62
+ // Default to the NEXT date (tomorrow) when nothing valid is stored (user
63
+ // request 2026-08-31) -- the picker never opens empty.
64
+ if (!this.onceDate || this.onceDate < this.minOnceDate) {
65
+ this.onceDate = this.minOnceDate;
66
+ }
59
67
  if (this.frequency === 'once' && this.onceDate) {
60
68
  const day = Number(this.onceDate.split('-')[2]);
61
69
  this.datesOfMonth = day ? [day] : [];
@@ -99,13 +107,20 @@ export class CustomReportScheduleComponent {
99
107
  }
100
108
  selectFrequency(value) {
101
109
  this.frequency = value;
102
- // Does Not Repeat: a past day carried over from a monthly selection is not
103
- // selectable — drop it so the picker never shows a disabled day as chosen.
104
- if (value === 'once') {
105
- this.datesOfMonth = this.datesOfMonth.filter((d) => !this.isDateDisabled(d)).slice(0, 1);
106
- this.onceDate = this.datesOfMonth.length ? this.deriveNextOccurrence(this.datesOfMonth[0]) : '';
110
+ // Does Not Repeat picks a full future date in its own date input (product
111
+ // change 2026-08-31); a stale non-future value never survives the switch.
112
+ if (value === 'once' && this.onceDate < this.minOnceDate) {
113
+ // Default to the NEXT date (tomorrow) rather than an empty picker.
114
+ this.onceDate = this.minOnceDate;
107
115
  }
108
116
  }
117
+ /** Tomorrow (YYYY-MM-DD): the earliest selectable Does-Not-Repeat date --
118
+ * today itself is deliberately NOT allowed (product rule 2026-08-31). */
119
+ get minOnceDate() {
120
+ const t = new Date();
121
+ t.setDate(t.getDate() + 1);
122
+ return this.toIsoDate(t);
123
+ }
109
124
  /** 'Does Not Repeat' sends on a day of the CURRENT month, so days already past
110
125
  * can't be chosen. */
111
126
  isDateDisabled(date) {
@@ -194,7 +209,7 @@ export class CustomReportScheduleComponent {
194
209
  const count = this.daysOfWeek.length;
195
210
  return count ? `${count} Day${count === 1 ? '' : 's'}` : 'Choose Day';
196
211
  }
197
- if (this.frequency === 'monthly' || this.frequency === 'once') {
212
+ if (this.frequency === 'monthly') {
198
213
  const count = this.datesOfMonth.length;
199
214
  if (!count)
200
215
  return 'Choose Date';
@@ -276,7 +291,8 @@ export class CustomReportScheduleComponent {
276
291
  return true;
277
292
  if (this.frequency === 'monthly' && !this.datesOfMonth.length)
278
293
  return true;
279
- if (this.frequency === 'once' && !this.onceDate)
294
+ // Does Not Repeat: only a strictly FUTURE date saves (today/past restricted).
295
+ if (this.frequency === 'once' && (!this.onceDate || this.onceDate < this.minOnceDate))
280
296
  return true;
281
297
  return false;
282
298
  }
@@ -298,9 +314,6 @@ export class CustomReportScheduleComponent {
298
314
  payload.datesOfMonth = this.datesOfMonth;
299
315
  }
300
316
  else if (this.frequency === 'once') {
301
- if (this.datesOfMonth.length) {
302
- this.onceDate = this.deriveNextOccurrence(this.datesOfMonth[0]);
303
- }
304
317
  payload.onceDate = this.onceDate;
305
318
  }
306
319
  return payload;
@@ -346,12 +359,12 @@ export class CustomReportScheduleComponent {
346
359
  });
347
360
  }
348
361
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportScheduleComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.ClientApiService }, { token: i3.ToastService }], target: i0.ɵɵFactoryTarget.Component });
349
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomReportScheduleComponent, selector: "lib-custom-report-schedule", inputs: { template: "template" }, ngImport: i0, template: "<!-- Same markup/classes as the Reports page's \"Custom Report Configuration\" modal\n (tango-analyse-report custom-report-view #scheduleModal), per Figma, so both popups\n look identical; only the bindings differ (this component's own field/method names). -->\n<div class=\"card border-0 schedule-config-modal\">\n <div class=\"card-body\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span class=\"header fw-bold\">Custom Report Configuration</span>\n <span class=\"cursor-pointer schedule-close\" (click)=\"onCancel()\" title=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#101828\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-name\">Enter Report Name</label>\n <input type=\"text\" id=\"schedule-name\" class=\"form-control mt-2 schedule-field\" [(ngModel)]=\"reportName\" autocomplete=\"off\" />\n <div *ngIf=\"nameError\" class=\"text-danger mt-2\">{{ nameError }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">Schedule</label>\n <div class=\"d-flex align-items-center mt-2 schedule-row-gap\">\n <div ngbDropdown class=\"d-inline-block schedule-freq\" [class.flex-grow-1]=\"frequency === 'daily'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle>\n <span>{{ scheduleLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('daily')\">Daily</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('weekly')\">Weekly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('monthly')\">Monthly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('once')\">Does Not Repeat</button>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'weekly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!daysOfWeek.length\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let day of dayOptions\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [id]=\"'day-' + day.value\"\n [checked]=\"isDaySelected(day.value)\" (change)=\"toggleDay(day.value)\" />\n <label class=\"form-check-label cursor-pointer\" [for]=\"'day-' + day.value\">{{ day.label }}</label>\n </div>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly' || frequency === 'once'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let date of dateOptions\">\n <!-- Does Not Repeat: days already past this month are disabled. -->\n <input class=\"form-check-input\" type=\"checkbox\" [id]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [checked]=\"isDateSelected(date)\" (change)=\"toggleDate(date)\" />\n <label class=\"form-check-label\" [for]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [class.text-muted]=\"isDateDisabled(date)\"\n [title]=\"isDateDisabled(date) ? 'Past dates cannot be scheduled' : ''\">{{ date }}</label>\n </div>\n </div>\n </div>\n\n <span class=\"sub-header mb-0 schedule-at\">at</span>\n <div class=\"time-field\">\n <select class=\"schedule-select time-select\" [(ngModel)]=\"time\">\n <option *ngFor=\"let opt of timeOptions\" [value]=\"opt.value\">{{ opt.value }}</option>\n </select>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"time-icon\">\n <path d=\"M10 5V10L13.3333 11.6667M18.3333 10C18.3333 14.6024 14.6024 18.3333 10 18.3333C5.39763 18.3333 1.66667 14.6024 1.66667 10C1.66667 5.39763 5.39763 1.66667 10 1.66667C14.6024 1.66667 18.3333 5.39763 18.3333 10Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n <div class=\"schedule-helper mt-2\" *ngIf=\"helperText\">{{ helperText }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">File Type</label>\n <div ngbDropdown class=\"d-block mt-2\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!fileType\">\n <span>{{ fileTypeLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('csv')\">CSV</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('xlsx')\">XLSX</button>\n </div>\n </div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-receivers\">Receivers Email</label>\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">&times;</span>\n </span>\n <!-- autocomplete=\"off\": Chrome otherwise autofills the just-added address back\n into the field (blue autofill background) after Enter clears it. -->\n <input type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n (keydown)=\"onKeyDown($event)\" />\n </div>\n <div *ngIf=\"emailValidation.includes(false)\" class=\"text-danger mt-2\">Invalid Email Format</div>\n </div>\n\n <div class=\"d-flex justify-content-between mt-8\">\n <button type=\"button\" class=\"btn schedule-btn-cancel w-50 me-2\" (click)=\"onCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary schedule-btn-save w-50 ms-2 d-flex align-items-center justify-content-center\"\n [disabled]=\"isSaveDisabled\" (click)=\"onSubmit()\">\n <svg *ngIf=\"!isSaveDisabled\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-2\">\n <path d=\"M17.5 17.5V11.6667C17.5 11.2246 17.3244 10.8007 17.0118 10.4882C16.6993 10.1756 16.2754 10 15.8333 10H4.16667C3.72464 10 3.30072 10.1756 2.98816 10.4882C2.67559 10.8007 2.5 11.2246 2.5 11.6667V17.5M17.5 17.5H2.5M17.5 17.5V6.16667C17.5 5.69996 17.5 5.4666 17.4092 5.28834C17.3293 5.13154 17.2018 5.00405 17.045 4.92416C16.8668 4.83333 16.6334 4.83333 16.1667 4.83333H12.5M2.5 17.5V4.16667C2.5 3.69996 2.5 3.4666 2.59083 3.28834C2.67072 3.13154 2.79821 3.00405 2.95501 2.92416C3.13327 2.83333 3.36662 2.83333 3.83333 2.83333H10.8333M12.5 4.83333V2.83333M12.5 4.83333H10.8333M12.5 2.83333H10.8333M10.8333 2.83333V4.83333M6.66667 6.66667H9.16667\"\n stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Save\n </button>\n </div>\n </div>\n</div>", styles: ["::ng-deep .custom-report-schedule-modal .modal-dialog{max-width:580px;width:90%}.header{color:var(--Gray-900, #101828)!important;font-size:18px!important;line-height:28px!important}.sub-header{color:var(--Gray-500, #667085)!important;font-size:14px!important;line-height:20px}.schedule-email-input{min-width:160px;outline:none;box-shadow:none}.schedule-email-input:focus{outline:none;box-shadow:none}.schedule-row-gap{gap:10px}.dropdown-field{min-width:120px;width:auto;text-align:left}.checkbox-dropdown-menu{max-height:220px;overflow-y:auto;min-width:160px}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-700, #344054)}.checkbox-dropdown-menu .form-check-label.text-muted{color:var(--Gray-400, #98A2B3)!important}.checkbox-dropdown-menu .form-check-input{float:none;margin-left:0;flex-shrink:0}.schedule-helper{color:var(--Gray-500, #667085);font-size:13px;line-height:18px}.schedule-receivers-box{min-height:88px;align-content:flex-start;gap:6px}.schedule-receivers-box .badge{font-size:14px!important;font-weight:500;line-height:20px;padding:4px 10px!important}.schedule-email-input{font-size:14px;line-height:20px}.schedule-receivers-box .badge .cursor-pointer{font-size:18px;line-height:1;color:var(--Gray-500, #667085)}.schedule-receivers-box .badge .cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer{font-size:26px;line-height:1;color:var(--Gray-500, #667085)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-close{display:inline-flex}.schedule-field,.schedule-field-box{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px!important;background:#fff!important;box-shadow:0 1px 2px #1018280d!important;font-size:14px;color:var(--Gray-900, #101828)}.schedule-field{height:44px}.schedule-select{display:flex;align-items:center;justify-content:space-between;gap:8px;height:44px;padding:0 14px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;box-shadow:0 1px 2px #1018280d;color:var(--Gray-900, #101828);font-size:14px;line-height:20px;text-align:left;cursor:pointer}.schedule-select:after{display:none}.schedule-select.is-placeholder>span:first-child{color:var(--Gray-500, #667085)}.schedule-chevron{flex-shrink:0}.schedule-freq,.schedule-pick{min-width:150px}.schedule-at{flex-shrink:0}.schedule-row-gap{gap:12px}.time-field{position:relative;min-width:130px}.time-field .time-select{appearance:none;-webkit-appearance:none;width:100%;padding-right:40px}.time-field .time-icon{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none}.schedule-receivers-box{min-height:104px}.schedule-btn-cancel{height:44px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.schedule-btn-cancel:hover{background:var(--Gray-50, #F9FAFB)}.schedule-btn-save{height:44px;border-radius:8px;font-size:14px;font-weight:600}.schedule-btn-save:disabled{background:#8fd6ff!important;border-color:#8fd6ff!important;color:#fff!important;opacity:1!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]{width:20px!important;height:20px!important;appearance:none;-webkit-appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:6px!important;background-color:#fff!important;background-image:none;background-repeat:no-repeat;background-position:center;background-size:20px 20px;box-shadow:none!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:checked{border:1px solid #00A3FF!important;background-color:#eaf8ff!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M14.6666 6.5L8.24992 12.9167L5.33325 10' stroke='%2300A3FF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:disabled{background-color:var(--Gray-100, #F2F4F7)!important;border-color:var(--Gray-200, #E4E7EC)!important;cursor:not-allowed;opacity:1}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i1.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i1.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i1.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i1.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
362
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomReportScheduleComponent, selector: "lib-custom-report-schedule", inputs: { template: "template" }, ngImport: i0, template: "<!-- Same markup/classes as the Reports page's \"Custom Report Configuration\" modal\n (tango-analyse-report custom-report-view #scheduleModal), per Figma, so both popups\n look identical; only the bindings differ (this component's own field/method names). -->\n<div class=\"card border-0 schedule-config-modal\">\n <div class=\"card-body\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span class=\"header fw-bold\">Custom Report Configuration</span>\n <span class=\"cursor-pointer schedule-close\" (click)=\"onCancel()\" title=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#101828\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-name\">Enter Report Name</label>\n <input type=\"text\" id=\"schedule-name\" class=\"form-control mt-2 schedule-field\" [(ngModel)]=\"reportName\"\n [disabled]=\"!editMode\" autocomplete=\"off\" />\n <div *ngIf=\"nameError\" class=\"text-danger mt-2\">{{ nameError }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">Schedule</label>\n <div class=\"d-flex align-items-center mt-2 schedule-row-gap\">\n <div ngbDropdown class=\"d-inline-block schedule-freq\" [class.flex-grow-1]=\"frequency === 'daily'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [disabled]=\"!editMode\">\n <span>{{ scheduleLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('daily')\">Daily</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('weekly')\">Weekly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('monthly')\">Monthly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('once')\">Does Not Repeat</button>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'weekly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!daysOfWeek.length\" [disabled]=\"!editMode\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let day of dayOptions\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [id]=\"'day-' + day.value\"\n [checked]=\"isDaySelected(day.value)\" (change)=\"toggleDay(day.value)\" />\n <label class=\"form-check-label cursor-pointer\" [for]=\"'day-' + day.value\">{{ day.label }}</label>\n </div>\n </div>\n </div>\n\n <!-- Does Not Repeat: a real date picker, future dates only (min = tomorrow;\n today itself is restricted -- product rule 2026-08-31). -->\n <div class=\"schedule-pick\" *ngIf=\"frequency === 'once'\">\n <input type=\"date\" class=\"schedule-select w-100\" [min]=\"minOnceDate\" [disabled]=\"!editMode\" [(ngModel)]=\"onceDate\" />\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\" [disabled]=\"!editMode\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let date of dateOptions\">\n <!-- Does Not Repeat: days already past this month are disabled. -->\n <input class=\"form-check-input\" type=\"checkbox\" [id]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [checked]=\"isDateSelected(date)\" (change)=\"toggleDate(date)\" />\n <label class=\"form-check-label\" [for]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [class.text-muted]=\"isDateDisabled(date)\"\n [title]=\"isDateDisabled(date) ? 'Past dates cannot be scheduled' : ''\">{{ date }}</label>\n </div>\n </div>\n </div>\n\n <span class=\"sub-header mb-0 schedule-at\">at</span>\n <div class=\"time-field\">\n <select class=\"schedule-select time-select\" [(ngModel)]=\"time\" [disabled]=\"!editMode\">\n <option *ngFor=\"let opt of timeOptions\" [value]=\"opt.value\">{{ opt.value }}</option>\n </select>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"time-icon\">\n <path d=\"M10 5V10L13.3333 11.6667M18.3333 10C18.3333 14.6024 14.6024 18.3333 10 18.3333C5.39763 18.3333 1.66667 14.6024 1.66667 10C1.66667 5.39763 5.39763 1.66667 10 1.66667C14.6024 1.66667 18.3333 5.39763 18.3333 10Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n <div class=\"schedule-helper mt-2\" *ngIf=\"helperText\">{{ helperText }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">File Type</label>\n <div ngbDropdown class=\"d-block mt-2\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!fileType\" [disabled]=\"!editMode\">\n <span>{{ fileTypeLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('csv')\">CSV</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('xlsx')\">XLSX</button>\n </div>\n </div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-receivers\">Receivers Email <span class=\"schedule-required\">*</span></label>\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\"\n [class.schedule-box-disabled]=\"!editMode\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span *ngIf=\"editMode\" class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">&times;</span>\n </span>\n <!-- autocomplete=\"off\": Chrome otherwise autofills the just-added address back\n into the field (blue autofill background) after Enter clears it. -->\n <input type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n [disabled]=\"!editMode\"\n (keydown)=\"onKeyDown($event)\" />\n </div>\n <div *ngIf=\"emailValidation.includes(false)\" class=\"text-danger mt-2\">Invalid Email Format</div>\n </div>\n\n <div class=\"d-flex justify-content-between mt-8\">\n <button type=\"button\" class=\"btn schedule-btn-cancel w-50 me-2\" (click)=\"onCancel()\">Cancel</button>\n <!-- View mode (existing schedule): pale-blue Edit unlocks the fields. -->\n <button *ngIf=\"!editMode\" type=\"button\" class=\"btn schedule-btn-edit w-50 ms-2 d-flex align-items-center justify-content-center\"\n (click)=\"editMode = true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 19 19\" fill=\"none\" class=\"me-2\">\n <path d=\"M8.25 2.51777H2.41667C1.97464 2.51777 1.55072 2.69336 1.23816 3.00592C0.925595 3.31848 0.75 3.74241 0.75 4.18443V15.8511C0.75 16.2931 0.925595 16.7171 1.23816 17.0296C1.55072 17.3422 1.97464 17.5178 2.41667 17.5178H14.0833C14.5254 17.5178 14.9493 17.3422 15.2618 17.0296C15.5744 16.7171 15.75 16.2931 15.75 15.8511V10.0178M14.5 1.26777C14.8315 0.936246 15.2812 0.75 15.75 0.75C16.2188 0.75 16.6685 0.936246 17 1.26777C17.3315 1.59929 17.5178 2.04893 17.5178 2.51777C17.5178 2.98661 17.3315 3.43625 17 3.76777L9.08333 11.6844L5.75 12.5178L6.58333 9.18443L14.5 1.26777Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Edit\n </button>\n <button *ngIf=\"editMode\" type=\"button\" class=\"btn btn-primary schedule-btn-save w-50 ms-2 d-flex align-items-center justify-content-center\"\n [disabled]=\"isSaveDisabled\" (click)=\"onSubmit()\">\n <svg *ngIf=\"!isSaveDisabled\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-2\">\n <path d=\"M17.5 17.5V11.6667C17.5 11.2246 17.3244 10.8007 17.0118 10.4882C16.6993 10.1756 16.2754 10 15.8333 10H4.16667C3.72464 10 3.30072 10.1756 2.98816 10.4882C2.67559 10.8007 2.5 11.2246 2.5 11.6667V17.5M17.5 17.5H2.5M17.5 17.5V6.16667C17.5 5.69996 17.5 5.4666 17.4092 5.28834C17.3293 5.13154 17.2018 5.00405 17.045 4.92416C16.8668 4.83333 16.6334 4.83333 16.1667 4.83333H12.5M2.5 17.5V4.16667C2.5 3.69996 2.5 3.4666 2.59083 3.28834C2.67072 3.13154 2.79821 3.00405 2.95501 2.92416C3.13327 2.83333 3.36662 2.83333 3.83333 2.83333H10.8333M12.5 4.83333V2.83333M12.5 4.83333H10.8333M12.5 2.83333H10.8333M10.8333 2.83333V4.83333M6.66667 6.66667H9.16667\"\n stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Save\n </button>\n </div>\n </div>\n</div>", styles: ["::ng-deep .custom-report-schedule-modal .modal-dialog{max-width:580px;width:90%}.header{color:var(--Gray-900, #101828)!important;font-size:18px!important;line-height:28px!important}.sub-header{color:var(--Gray-500, #667085)!important;font-size:14px!important;line-height:20px}.schedule-email-input{min-width:160px;outline:none;box-shadow:none}.schedule-email-input:focus{outline:none;box-shadow:none}.schedule-row-gap{gap:10px}.dropdown-field{min-width:120px;width:auto;text-align:left}.checkbox-dropdown-menu{max-height:220px;overflow-y:auto;min-width:160px}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-700, #344054)}.checkbox-dropdown-menu .form-check-label.text-muted{color:var(--Gray-400, #98A2B3)!important}.checkbox-dropdown-menu .form-check-input{float:none;margin-left:0;flex-shrink:0}.schedule-helper{color:var(--Gray-500, #667085);font-size:13px;line-height:18px}.schedule-receivers-box{min-height:88px;align-content:flex-start;gap:6px}.schedule-receivers-box .badge{font-size:14px!important;font-weight:500;line-height:20px;padding:4px 10px!important}.schedule-email-input{font-size:14px;line-height:20px}.schedule-receivers-box .badge .cursor-pointer{font-size:18px;line-height:1;color:var(--Gray-500, #667085)}.schedule-receivers-box .badge .cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer{font-size:26px;line-height:1;color:var(--Gray-500, #667085)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-close{display:inline-flex}.schedule-field,.schedule-field-box{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px!important;background:#fff!important;box-shadow:0 1px 2px #1018280d!important;font-size:14px;color:var(--Gray-900, #101828)}.schedule-field{height:44px}.schedule-select{display:flex;align-items:center;justify-content:space-between;gap:8px;height:44px;padding:0 14px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;box-shadow:0 1px 2px #1018280d;color:var(--Gray-900, #101828);font-size:14px;line-height:20px;text-align:left;cursor:pointer}.schedule-select:after{display:none}.schedule-select.is-placeholder>span:first-child{color:var(--Gray-500, #667085)}.schedule-chevron{flex-shrink:0}.schedule-freq,.schedule-pick{min-width:150px;flex:1 1 0}.schedule-at{flex-shrink:0}.schedule-row-gap{gap:12px}.time-field{position:relative;min-width:130px}.time-field .time-select{appearance:none;-webkit-appearance:none;width:100%;padding-right:40px}.time-field .time-icon{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none}.schedule-receivers-box{min-height:104px}.schedule-btn-cancel{height:44px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.schedule-btn-cancel:hover{background:var(--Gray-50, #F9FAFB)}.schedule-btn-save{height:44px;border-radius:8px;font-size:14px;font-weight:600}.schedule-btn-save:disabled{background:#8fd6ff!important;border-color:#8fd6ff!important;color:#fff!important;opacity:1!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]{width:20px!important;height:20px!important;appearance:none;-webkit-appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:6px!important;background-color:#fff!important;background-image:none;background-repeat:no-repeat;background-position:center;background-size:20px 20px;box-shadow:none!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:checked{border:1px solid #00A3FF!important;background-color:#eaf8ff!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M14.6666 6.5L8.24992 12.9167L5.33325 10' stroke='%2300A3FF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:disabled{background-color:var(--Gray-100, #F2F4F7)!important;border-color:var(--Gray-200, #E4E7EC)!important;cursor:not-allowed;opacity:1}.schedule-btn-edit{height:44px;border:0;border-radius:8px;background:var(--Blue-light-50, #E6F5FE);color:#009bf3;font-size:14px;font-weight:600}.schedule-btn-edit:hover{background:#d6eefd}.schedule-select:disabled,.schedule-select[disabled],.schedule-field:disabled{background:#f9fafb!important;color:var(--Gray-500, #667085)!important;cursor:not-allowed}.schedule-box-disabled{background:#f9fafb!important}.schedule-required{color:var(--Error-500, #F04438)}.schedule-email-input:-webkit-autofill,.schedule-email-input:-webkit-autofill:hover,.schedule-email-input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 1000px #fff inset;box-shadow:0 0 0 1000px #fff inset;-webkit-text-fill-color:var(--Gray-900, #101828);caret-color:var(--Gray-900, #101828);transition:background-color 9999s ease-in-out 0s}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i1.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i1.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i1.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i1.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
350
363
  }
351
364
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportScheduleComponent, decorators: [{
352
365
  type: Component,
353
- args: [{ selector: 'lib-custom-report-schedule', template: "<!-- Same markup/classes as the Reports page's \"Custom Report Configuration\" modal\n (tango-analyse-report custom-report-view #scheduleModal), per Figma, so both popups\n look identical; only the bindings differ (this component's own field/method names). -->\n<div class=\"card border-0 schedule-config-modal\">\n <div class=\"card-body\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span class=\"header fw-bold\">Custom Report Configuration</span>\n <span class=\"cursor-pointer schedule-close\" (click)=\"onCancel()\" title=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#101828\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-name\">Enter Report Name</label>\n <input type=\"text\" id=\"schedule-name\" class=\"form-control mt-2 schedule-field\" [(ngModel)]=\"reportName\" autocomplete=\"off\" />\n <div *ngIf=\"nameError\" class=\"text-danger mt-2\">{{ nameError }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">Schedule</label>\n <div class=\"d-flex align-items-center mt-2 schedule-row-gap\">\n <div ngbDropdown class=\"d-inline-block schedule-freq\" [class.flex-grow-1]=\"frequency === 'daily'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle>\n <span>{{ scheduleLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('daily')\">Daily</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('weekly')\">Weekly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('monthly')\">Monthly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('once')\">Does Not Repeat</button>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'weekly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!daysOfWeek.length\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let day of dayOptions\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [id]=\"'day-' + day.value\"\n [checked]=\"isDaySelected(day.value)\" (change)=\"toggleDay(day.value)\" />\n <label class=\"form-check-label cursor-pointer\" [for]=\"'day-' + day.value\">{{ day.label }}</label>\n </div>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly' || frequency === 'once'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let date of dateOptions\">\n <!-- Does Not Repeat: days already past this month are disabled. -->\n <input class=\"form-check-input\" type=\"checkbox\" [id]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [checked]=\"isDateSelected(date)\" (change)=\"toggleDate(date)\" />\n <label class=\"form-check-label\" [for]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [class.text-muted]=\"isDateDisabled(date)\"\n [title]=\"isDateDisabled(date) ? 'Past dates cannot be scheduled' : ''\">{{ date }}</label>\n </div>\n </div>\n </div>\n\n <span class=\"sub-header mb-0 schedule-at\">at</span>\n <div class=\"time-field\">\n <select class=\"schedule-select time-select\" [(ngModel)]=\"time\">\n <option *ngFor=\"let opt of timeOptions\" [value]=\"opt.value\">{{ opt.value }}</option>\n </select>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"time-icon\">\n <path d=\"M10 5V10L13.3333 11.6667M18.3333 10C18.3333 14.6024 14.6024 18.3333 10 18.3333C5.39763 18.3333 1.66667 14.6024 1.66667 10C1.66667 5.39763 5.39763 1.66667 10 1.66667C14.6024 1.66667 18.3333 5.39763 18.3333 10Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n <div class=\"schedule-helper mt-2\" *ngIf=\"helperText\">{{ helperText }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">File Type</label>\n <div ngbDropdown class=\"d-block mt-2\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!fileType\">\n <span>{{ fileTypeLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('csv')\">CSV</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('xlsx')\">XLSX</button>\n </div>\n </div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-receivers\">Receivers Email</label>\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">&times;</span>\n </span>\n <!-- autocomplete=\"off\": Chrome otherwise autofills the just-added address back\n into the field (blue autofill background) after Enter clears it. -->\n <input type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n (keydown)=\"onKeyDown($event)\" />\n </div>\n <div *ngIf=\"emailValidation.includes(false)\" class=\"text-danger mt-2\">Invalid Email Format</div>\n </div>\n\n <div class=\"d-flex justify-content-between mt-8\">\n <button type=\"button\" class=\"btn schedule-btn-cancel w-50 me-2\" (click)=\"onCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary schedule-btn-save w-50 ms-2 d-flex align-items-center justify-content-center\"\n [disabled]=\"isSaveDisabled\" (click)=\"onSubmit()\">\n <svg *ngIf=\"!isSaveDisabled\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-2\">\n <path d=\"M17.5 17.5V11.6667C17.5 11.2246 17.3244 10.8007 17.0118 10.4882C16.6993 10.1756 16.2754 10 15.8333 10H4.16667C3.72464 10 3.30072 10.1756 2.98816 10.4882C2.67559 10.8007 2.5 11.2246 2.5 11.6667V17.5M17.5 17.5H2.5M17.5 17.5V6.16667C17.5 5.69996 17.5 5.4666 17.4092 5.28834C17.3293 5.13154 17.2018 5.00405 17.045 4.92416C16.8668 4.83333 16.6334 4.83333 16.1667 4.83333H12.5M2.5 17.5V4.16667C2.5 3.69996 2.5 3.4666 2.59083 3.28834C2.67072 3.13154 2.79821 3.00405 2.95501 2.92416C3.13327 2.83333 3.36662 2.83333 3.83333 2.83333H10.8333M12.5 4.83333V2.83333M12.5 4.83333H10.8333M12.5 2.83333H10.8333M10.8333 2.83333V4.83333M6.66667 6.66667H9.16667\"\n stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Save\n </button>\n </div>\n </div>\n</div>", styles: ["::ng-deep .custom-report-schedule-modal .modal-dialog{max-width:580px;width:90%}.header{color:var(--Gray-900, #101828)!important;font-size:18px!important;line-height:28px!important}.sub-header{color:var(--Gray-500, #667085)!important;font-size:14px!important;line-height:20px}.schedule-email-input{min-width:160px;outline:none;box-shadow:none}.schedule-email-input:focus{outline:none;box-shadow:none}.schedule-row-gap{gap:10px}.dropdown-field{min-width:120px;width:auto;text-align:left}.checkbox-dropdown-menu{max-height:220px;overflow-y:auto;min-width:160px}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-700, #344054)}.checkbox-dropdown-menu .form-check-label.text-muted{color:var(--Gray-400, #98A2B3)!important}.checkbox-dropdown-menu .form-check-input{float:none;margin-left:0;flex-shrink:0}.schedule-helper{color:var(--Gray-500, #667085);font-size:13px;line-height:18px}.schedule-receivers-box{min-height:88px;align-content:flex-start;gap:6px}.schedule-receivers-box .badge{font-size:14px!important;font-weight:500;line-height:20px;padding:4px 10px!important}.schedule-email-input{font-size:14px;line-height:20px}.schedule-receivers-box .badge .cursor-pointer{font-size:18px;line-height:1;color:var(--Gray-500, #667085)}.schedule-receivers-box .badge .cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer{font-size:26px;line-height:1;color:var(--Gray-500, #667085)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-close{display:inline-flex}.schedule-field,.schedule-field-box{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px!important;background:#fff!important;box-shadow:0 1px 2px #1018280d!important;font-size:14px;color:var(--Gray-900, #101828)}.schedule-field{height:44px}.schedule-select{display:flex;align-items:center;justify-content:space-between;gap:8px;height:44px;padding:0 14px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;box-shadow:0 1px 2px #1018280d;color:var(--Gray-900, #101828);font-size:14px;line-height:20px;text-align:left;cursor:pointer}.schedule-select:after{display:none}.schedule-select.is-placeholder>span:first-child{color:var(--Gray-500, #667085)}.schedule-chevron{flex-shrink:0}.schedule-freq,.schedule-pick{min-width:150px}.schedule-at{flex-shrink:0}.schedule-row-gap{gap:12px}.time-field{position:relative;min-width:130px}.time-field .time-select{appearance:none;-webkit-appearance:none;width:100%;padding-right:40px}.time-field .time-icon{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none}.schedule-receivers-box{min-height:104px}.schedule-btn-cancel{height:44px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.schedule-btn-cancel:hover{background:var(--Gray-50, #F9FAFB)}.schedule-btn-save{height:44px;border-radius:8px;font-size:14px;font-weight:600}.schedule-btn-save:disabled{background:#8fd6ff!important;border-color:#8fd6ff!important;color:#fff!important;opacity:1!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]{width:20px!important;height:20px!important;appearance:none;-webkit-appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:6px!important;background-color:#fff!important;background-image:none;background-repeat:no-repeat;background-position:center;background-size:20px 20px;box-shadow:none!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:checked{border:1px solid #00A3FF!important;background-color:#eaf8ff!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M14.6666 6.5L8.24992 12.9167L5.33325 10' stroke='%2300A3FF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:disabled{background-color:var(--Gray-100, #F2F4F7)!important;border-color:var(--Gray-200, #E4E7EC)!important;cursor:not-allowed;opacity:1}\n"] }]
366
+ args: [{ selector: 'lib-custom-report-schedule', template: "<!-- Same markup/classes as the Reports page's \"Custom Report Configuration\" modal\n (tango-analyse-report custom-report-view #scheduleModal), per Figma, so both popups\n look identical; only the bindings differ (this component's own field/method names). -->\n<div class=\"card border-0 schedule-config-modal\">\n <div class=\"card-body\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span class=\"header fw-bold\">Custom Report Configuration</span>\n <span class=\"cursor-pointer schedule-close\" (click)=\"onCancel()\" title=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#101828\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-name\">Enter Report Name</label>\n <input type=\"text\" id=\"schedule-name\" class=\"form-control mt-2 schedule-field\" [(ngModel)]=\"reportName\"\n [disabled]=\"!editMode\" autocomplete=\"off\" />\n <div *ngIf=\"nameError\" class=\"text-danger mt-2\">{{ nameError }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">Schedule</label>\n <div class=\"d-flex align-items-center mt-2 schedule-row-gap\">\n <div ngbDropdown class=\"d-inline-block schedule-freq\" [class.flex-grow-1]=\"frequency === 'daily'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [disabled]=\"!editMode\">\n <span>{{ scheduleLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('daily')\">Daily</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('weekly')\">Weekly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('monthly')\">Monthly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('once')\">Does Not Repeat</button>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'weekly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!daysOfWeek.length\" [disabled]=\"!editMode\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let day of dayOptions\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [id]=\"'day-' + day.value\"\n [checked]=\"isDaySelected(day.value)\" (change)=\"toggleDay(day.value)\" />\n <label class=\"form-check-label cursor-pointer\" [for]=\"'day-' + day.value\">{{ day.label }}</label>\n </div>\n </div>\n </div>\n\n <!-- Does Not Repeat: a real date picker, future dates only (min = tomorrow;\n today itself is restricted -- product rule 2026-08-31). -->\n <div class=\"schedule-pick\" *ngIf=\"frequency === 'once'\">\n <input type=\"date\" class=\"schedule-select w-100\" [min]=\"minOnceDate\" [disabled]=\"!editMode\" [(ngModel)]=\"onceDate\" />\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\" [disabled]=\"!editMode\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let date of dateOptions\">\n <!-- Does Not Repeat: days already past this month are disabled. -->\n <input class=\"form-check-input\" type=\"checkbox\" [id]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [checked]=\"isDateSelected(date)\" (change)=\"toggleDate(date)\" />\n <label class=\"form-check-label\" [for]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [class.text-muted]=\"isDateDisabled(date)\"\n [title]=\"isDateDisabled(date) ? 'Past dates cannot be scheduled' : ''\">{{ date }}</label>\n </div>\n </div>\n </div>\n\n <span class=\"sub-header mb-0 schedule-at\">at</span>\n <div class=\"time-field\">\n <select class=\"schedule-select time-select\" [(ngModel)]=\"time\" [disabled]=\"!editMode\">\n <option *ngFor=\"let opt of timeOptions\" [value]=\"opt.value\">{{ opt.value }}</option>\n </select>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"time-icon\">\n <path d=\"M10 5V10L13.3333 11.6667M18.3333 10C18.3333 14.6024 14.6024 18.3333 10 18.3333C5.39763 18.3333 1.66667 14.6024 1.66667 10C1.66667 5.39763 5.39763 1.66667 10 1.66667C14.6024 1.66667 18.3333 5.39763 18.3333 10Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n <div class=\"schedule-helper mt-2\" *ngIf=\"helperText\">{{ helperText }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">File Type</label>\n <div ngbDropdown class=\"d-block mt-2\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!fileType\" [disabled]=\"!editMode\">\n <span>{{ fileTypeLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('csv')\">CSV</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('xlsx')\">XLSX</button>\n </div>\n </div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-receivers\">Receivers Email <span class=\"schedule-required\">*</span></label>\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\"\n [class.schedule-box-disabled]=\"!editMode\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span *ngIf=\"editMode\" class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">&times;</span>\n </span>\n <!-- autocomplete=\"off\": Chrome otherwise autofills the just-added address back\n into the field (blue autofill background) after Enter clears it. -->\n <input type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n [disabled]=\"!editMode\"\n (keydown)=\"onKeyDown($event)\" />\n </div>\n <div *ngIf=\"emailValidation.includes(false)\" class=\"text-danger mt-2\">Invalid Email Format</div>\n </div>\n\n <div class=\"d-flex justify-content-between mt-8\">\n <button type=\"button\" class=\"btn schedule-btn-cancel w-50 me-2\" (click)=\"onCancel()\">Cancel</button>\n <!-- View mode (existing schedule): pale-blue Edit unlocks the fields. -->\n <button *ngIf=\"!editMode\" type=\"button\" class=\"btn schedule-btn-edit w-50 ms-2 d-flex align-items-center justify-content-center\"\n (click)=\"editMode = true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 19 19\" fill=\"none\" class=\"me-2\">\n <path d=\"M8.25 2.51777H2.41667C1.97464 2.51777 1.55072 2.69336 1.23816 3.00592C0.925595 3.31848 0.75 3.74241 0.75 4.18443V15.8511C0.75 16.2931 0.925595 16.7171 1.23816 17.0296C1.55072 17.3422 1.97464 17.5178 2.41667 17.5178H14.0833C14.5254 17.5178 14.9493 17.3422 15.2618 17.0296C15.5744 16.7171 15.75 16.2931 15.75 15.8511V10.0178M14.5 1.26777C14.8315 0.936246 15.2812 0.75 15.75 0.75C16.2188 0.75 16.6685 0.936246 17 1.26777C17.3315 1.59929 17.5178 2.04893 17.5178 2.51777C17.5178 2.98661 17.3315 3.43625 17 3.76777L9.08333 11.6844L5.75 12.5178L6.58333 9.18443L14.5 1.26777Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Edit\n </button>\n <button *ngIf=\"editMode\" type=\"button\" class=\"btn btn-primary schedule-btn-save w-50 ms-2 d-flex align-items-center justify-content-center\"\n [disabled]=\"isSaveDisabled\" (click)=\"onSubmit()\">\n <svg *ngIf=\"!isSaveDisabled\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-2\">\n <path d=\"M17.5 17.5V11.6667C17.5 11.2246 17.3244 10.8007 17.0118 10.4882C16.6993 10.1756 16.2754 10 15.8333 10H4.16667C3.72464 10 3.30072 10.1756 2.98816 10.4882C2.67559 10.8007 2.5 11.2246 2.5 11.6667V17.5M17.5 17.5H2.5M17.5 17.5V6.16667C17.5 5.69996 17.5 5.4666 17.4092 5.28834C17.3293 5.13154 17.2018 5.00405 17.045 4.92416C16.8668 4.83333 16.6334 4.83333 16.1667 4.83333H12.5M2.5 17.5V4.16667C2.5 3.69996 2.5 3.4666 2.59083 3.28834C2.67072 3.13154 2.79821 3.00405 2.95501 2.92416C3.13327 2.83333 3.36662 2.83333 3.83333 2.83333H10.8333M12.5 4.83333V2.83333M12.5 4.83333H10.8333M12.5 2.83333H10.8333M10.8333 2.83333V4.83333M6.66667 6.66667H9.16667\"\n stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Save\n </button>\n </div>\n </div>\n</div>", styles: ["::ng-deep .custom-report-schedule-modal .modal-dialog{max-width:580px;width:90%}.header{color:var(--Gray-900, #101828)!important;font-size:18px!important;line-height:28px!important}.sub-header{color:var(--Gray-500, #667085)!important;font-size:14px!important;line-height:20px}.schedule-email-input{min-width:160px;outline:none;box-shadow:none}.schedule-email-input:focus{outline:none;box-shadow:none}.schedule-row-gap{gap:10px}.dropdown-field{min-width:120px;width:auto;text-align:left}.checkbox-dropdown-menu{max-height:220px;overflow-y:auto;min-width:160px}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-700, #344054)}.checkbox-dropdown-menu .form-check-label.text-muted{color:var(--Gray-400, #98A2B3)!important}.checkbox-dropdown-menu .form-check-input{float:none;margin-left:0;flex-shrink:0}.schedule-helper{color:var(--Gray-500, #667085);font-size:13px;line-height:18px}.schedule-receivers-box{min-height:88px;align-content:flex-start;gap:6px}.schedule-receivers-box .badge{font-size:14px!important;font-weight:500;line-height:20px;padding:4px 10px!important}.schedule-email-input{font-size:14px;line-height:20px}.schedule-receivers-box .badge .cursor-pointer{font-size:18px;line-height:1;color:var(--Gray-500, #667085)}.schedule-receivers-box .badge .cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer{font-size:26px;line-height:1;color:var(--Gray-500, #667085)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-close{display:inline-flex}.schedule-field,.schedule-field-box{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px!important;background:#fff!important;box-shadow:0 1px 2px #1018280d!important;font-size:14px;color:var(--Gray-900, #101828)}.schedule-field{height:44px}.schedule-select{display:flex;align-items:center;justify-content:space-between;gap:8px;height:44px;padding:0 14px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;box-shadow:0 1px 2px #1018280d;color:var(--Gray-900, #101828);font-size:14px;line-height:20px;text-align:left;cursor:pointer}.schedule-select:after{display:none}.schedule-select.is-placeholder>span:first-child{color:var(--Gray-500, #667085)}.schedule-chevron{flex-shrink:0}.schedule-freq,.schedule-pick{min-width:150px;flex:1 1 0}.schedule-at{flex-shrink:0}.schedule-row-gap{gap:12px}.time-field{position:relative;min-width:130px}.time-field .time-select{appearance:none;-webkit-appearance:none;width:100%;padding-right:40px}.time-field .time-icon{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none}.schedule-receivers-box{min-height:104px}.schedule-btn-cancel{height:44px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.schedule-btn-cancel:hover{background:var(--Gray-50, #F9FAFB)}.schedule-btn-save{height:44px;border-radius:8px;font-size:14px;font-weight:600}.schedule-btn-save:disabled{background:#8fd6ff!important;border-color:#8fd6ff!important;color:#fff!important;opacity:1!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]{width:20px!important;height:20px!important;appearance:none;-webkit-appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:6px!important;background-color:#fff!important;background-image:none;background-repeat:no-repeat;background-position:center;background-size:20px 20px;box-shadow:none!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:checked{border:1px solid #00A3FF!important;background-color:#eaf8ff!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M14.6666 6.5L8.24992 12.9167L5.33325 10' stroke='%2300A3FF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:disabled{background-color:var(--Gray-100, #F2F4F7)!important;border-color:var(--Gray-200, #E4E7EC)!important;cursor:not-allowed;opacity:1}.schedule-btn-edit{height:44px;border:0;border-radius:8px;background:var(--Blue-light-50, #E6F5FE);color:#009bf3;font-size:14px;font-weight:600}.schedule-btn-edit:hover{background:#d6eefd}.schedule-select:disabled,.schedule-select[disabled],.schedule-field:disabled{background:#f9fafb!important;color:var(--Gray-500, #667085)!important;cursor:not-allowed}.schedule-box-disabled{background:#f9fafb!important}.schedule-required{color:var(--Error-500, #F04438)}.schedule-email-input:-webkit-autofill,.schedule-email-input:-webkit-autofill:hover,.schedule-email-input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 1000px #fff inset;box-shadow:0 0 0 1000px #fff inset;-webkit-text-fill-color:var(--Gray-900, #101828);caret-color:var(--Gray-900, #101828);transition:background-color 9999s ease-in-out 0s}\n"] }]
354
367
  }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.ClientApiService }, { type: i3.ToastService }], propDecorators: { template: [{
355
368
  type: Input
356
369
  }] } });
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQUt6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUV6Rzs7aURBRWlEO0FBQ2pELE1BQU0scUJBQXFCLEdBQXVDLENBQUMsR0FBRyxFQUFFO0lBQ3RFLE1BQU0sT0FBTyxHQUF1QyxFQUFFLENBQUM7SUFDdkQsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFB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TSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQy9FLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksZ0NBQWdDLENBQUMsQ0FBQztZQUN6RyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F2VVUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsb0dDL0IxQyx1MFNBcUlNOzs0RkR0R08sNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0Qjs2SUFLN0IsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuXG5jb25zdCBEQVlfTkFNRVMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG5jb25zdCBNT05USF9OQU1FUyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLyoqIFNjaGVkdWxlIHNlbmQtdGltZSBzbG90czogMzAtbWludXRlIHN0ZXBzLCByZXN0cmljdGVkIHRvIDA5OjAw4oCTMjE6MDAg4oCUIHRoZVxuICogIHNhbWUgcHJvZHVjdCBydWxlIGFzIHRoZSByZXBvcnRzIHBhZ2UncyBzY2hlZHVsZSBtb2RhbC4gVmFsdWVzIHN0YXkgSEg6bW1cbiAqICAodGhlIEFQSSBjb250cmFjdCk7IGxhYmVscyByZW5kZXIgMTItaG91ci4gKi9cbmNvbnN0IFNDSEVEVUxFX1RJTUVfT1BUSU9OUzogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9ICgoKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChsZXQgaG91ciA9IDk7IGhvdXIgPD0gMjE7IGhvdXIrKykge1xuICAgIGZvciAoY29uc3QgbWludXRlIG9mIGhvdXIgPT09IDIxID8gWzBdIDogWzAsIDMwXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBgJHtTdHJpbmcoaG91cikucGFkU3RhcnQoMiwgJzAnKX06JHtTdHJpbmcobWludXRlKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICBjb25zdCBob3VyMTIgPSAoKGhvdXIgKyAxMSkgJSAxMikgKyAxO1xuICAgICAgb3B0aW9ucy5wdXNoKHsgdmFsdWUsIGxhYmVsOiBgJHtob3VyMTJ9OiR7U3RyaW5nKG1pbnV0ZSkucGFkU3RhcnQoMiwgJzAnKX0gJHtob3VyIDwgMTIgPyAnQU0nIDogJ1BNJ31gIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn0pKCk7XG5cbnR5cGUgRnJlcXVlbmN5ID0gJ2RhaWx5JyB8ICd3ZWVrbHknIHwgJ21vbnRobHknIHwgJ29uY2UnO1xudHlwZSBGaWxlVHlwZSA9ICdjc3YnIHwgJ3hsc3gnIHwgJyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LXNjaGVkdWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVwb3J0U2NoZWR1bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZTogYW55O1xuXG4gIHJlcG9ydE5hbWU6IHN0cmluZyA9ICcnO1xuICBuYW1lRXJyb3I6IHN0cmluZyA9ICcnO1xuXG4gIGZyZXF1ZW5jeTogRnJlcXVlbmN5ID0gJ2RhaWx5JztcbiAgdGltZTogc3RyaW5nID0gJzA5OjAwJztcbiAgZGF5c09mV2VlazogbnVtYmVyW10gPSBbXTtcbiAgZGF0ZXNPZk1vbnRoOiBudW1iZXJbXSA9IFtdO1xuICBvbmNlRGF0ZTogc3RyaW5nID0gJyc7XG4gIGZpbGVUeXBlOiBGaWxlVHlwZSA9ICd4bHN4JztcblxuICBlbWFpbExpc3Q6IGFueVtdID0gW107XG4gIGVtYWlsVmFsaWRhdGlvbjogYW55W10gPSBbXTtcbiAgc2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZGF5T3B0aW9ucyA9IERBWV9OQU1FUy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoeyB2YWx1ZTogaW5kZXgsIGxhYmVsOiBuYW1lIH0pKTtcbiAgcmVhZG9ubHkgZGF0ZU9wdGlvbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAzMSB9LCAoXywgaSkgPT4gaSArIDEpO1xuICByZWFkb25seSB0aW1lT3B0aW9ucyA9IFNDSEVEVUxFX1RJTUVfT1BUSU9OUztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCwgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0U2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHRoaXMucmVwb3J0TmFtZSA9IHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJztcbiAgICAgIGNvbnN0IHNjaGVkdWxlID0gdGhpcy50ZW1wbGF0ZT8uc2NoZWR1bGUgfHwge307XG4gICAgICB0aGlzLmZyZXF1ZW5jeSA9IHNjaGVkdWxlLmZyZXF1ZW5jeSB8fCAnZGFpbHknO1xuICAgICAgLy8gQSBzdG9yZWQgdGltZSBvdXRzaWRlIHRoZSBhbGxvd2VkIHNsb3RzIChvbGRlciBzY2hlZHVsZXMsIGZyZWUtdHlwZWRcbiAgICAgIC8vIHZhbHVlcykgc25hcHMgYmFjayB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbiBzaG93aW5nIGFuIGVtcHR5IHNlbGVjdC5cbiAgICAgIGNvbnN0IHN0b3JlZFRpbWUgPSBzY2hlZHVsZS50aW1lIHx8ICcwOTowMCc7XG4gICAgICB0aGlzLnRpbWUgPSBTQ0hFRFVMRV9USU1FX09QVElPTlMuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHN0b3JlZFRpbWUpID8gc3RvcmVkVGltZSA6ICcwOTowMCc7XG4gICAgICB0aGlzLmRheXNPZldlZWsgPSBbLi4uKHNjaGVkdWxlLmRheXNPZldlZWsgfHwgW10pXTtcbiAgICAgIHRoaXMub25jZURhdGUgPSBzY2hlZHVsZS5vbmNlRGF0ZSB8fCAnJztcbiAgICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnICYmIHRoaXMub25jZURhdGUpIHtcbiAgICAgICAgY29uc3QgZGF5ID0gTnVtYmVyKHRoaXMub25jZURhdGUuc3BsaXQoJy0nKVsyXSk7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gZGF5ID8gW2RheV0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gWy4uLihzY2hlZHVsZS5kYXRlc09mTW9udGggfHwgW10pXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZVR5cGUgPSBzY2hlZHVsZS5maWxlVHlwZSB8fCAneGxzeCc7XG4gICAgICB0aGlzLmVtYWlsTGlzdCA9IFsuLi4oc2NoZWR1bGUucmVjZWl2ZXJzIHx8IFtdKV07XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgICAgdGhpcy5lbWFpbExpc3QuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7IHRoaXMuZW1haWxWYWxpZGF0b3IoZWxlbWVudCk7IH0pO1xuICAgIH1cbiAgfVxuXG4gIGVtYWlsVmFsaWRhdG9yKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xuICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KHZhbHVlKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbi5wdXNoKHZhbGlkKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdCYWNrc3BhY2UnICYmIGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJycgJiYgdGhpcy5lbWFpbExpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVtYWlsTGlzdC5wb3AoKTtcbiAgICAgIHRoaXMuZW1haWxWYWxpZGF0aW9uLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbiAgICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgdGhpcy5lbWFpbExpc3QucHVzaChldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBFbnRlciBWYWxpZCBFbWFpbC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGlwKGk6IG51bWJlcikge1xuICAgIHRoaXMuZW1haWxMaXN0LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgIHRoaXMuZW1haWxMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4geyB0aGlzLmVtYWlsVmFsaWRhdG9yKGVsZW1lbnQpOyB9KTtcbiAgfVxuXG4gIHNlbGVjdEZyZXF1ZW5jeSh2YWx1ZTogRnJlcXVlbmN5KSB7XG4gICAgdGhpcy5mcmVxdWVuY3kgPSB2YWx1ZTtcbiAgICAvLyBEb2VzIE5vdCBSZXBlYXQ6IGEgcGFzdCBkYXkgY2FycmllZCBvdmVyIGZyb20gYSBtb250aGx5IHNlbGVjdGlvbiBpcyBub3RcbiAgICAvLyBzZWxlY3RhYmxlIOKAlCBkcm9wIGl0IHNvIHRoZSBwaWNrZXIgbmV2ZXIgc2hvd3MgYSBkaXNhYmxlZCBkYXkgYXMgY2hvc2VuLlxuICAgIGlmICh2YWx1ZSA9PT0gJ29uY2UnKSB7XG4gICAgICB0aGlzLmRhdGVzT2ZNb250aCA9IHRoaXMuZGF0ZXNPZk1vbnRoLmZpbHRlcigoZCkgPT4gIXRoaXMuaXNEYXRlRGlzYWJsZWQoZCkpLnNsaWNlKDAsIDEpO1xuICAgICAgdGhpcy5vbmNlRGF0ZSA9IHRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aCA/IHRoaXMuZGVyaXZlTmV4dE9jY3VycmVuY2UodGhpcy5kYXRlc09mTW9udGhbMF0pIDogJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqICdEb2VzIE5vdCBSZXBlYXQnIHNlbmRzIG9uIGEgZGF5IG9mIHRoZSBDVVJSRU5UIG1vbnRoLCBzbyBkYXlzIGFscmVhZHkgcGFzdFxuICAgKiAgY2FuJ3QgYmUgY2hvc2VuLiAqL1xuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mcmVxdWVuY3kgPT09ICdvbmNlJyAmJiBkYXRlIDwgbmV3IERhdGUoKS5nZXREYXRlKCk7XG4gIH1cblxuICBnZXQgc2NoZWR1bGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5mcmVxdWVuY3kpIHtcbiAgICAgIGNhc2UgJ2RhaWx5JzogcmV0dXJuICdEYWlseSc7XG4gICAgICBjYXNlICd3ZWVrbHknOiByZXR1cm4gJ1dlZWtseSc7XG4gICAgICBjYXNlICdtb250aGx5JzogcmV0dXJuICdNb250aGx5JztcbiAgICAgIGNhc2UgJ29uY2UnOiByZXR1cm4gJ0RvZXMgTm90IFJlcGVhdCc7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ0RhaWx5JztcbiAgICB9XG4gIH1cblxuICB0b2dnbGVEYXkoZGF5OiBudW1iZXIpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLmRheXNPZldlZWsuaW5kZXhPZihkYXkpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5kYXlzT2ZXZWVrLnNwbGljZShpZHgsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRheXNPZldlZWsucHVzaChkYXkpO1xuICAgIH1cbiAgfVxuXG4gIGlzRGF5U2VsZWN0ZWQoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXlzT2ZXZWVrLmluY2x1ZGVzKGRheSk7XG4gIH1cblxuICB0b2dnbGVEYXRlKGRhdGU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnKSB7XG4gICAgICB0aGlzLmRhdGVzT2ZNb250aCA9IFtkYXRlXTtcbiAgICAgIHRoaXMub25jZURhdGUgPSB0aGlzLmRlcml2ZU5leHRPY2N1cnJlbmNlKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpZHggPSB0aGlzLmRhdGVzT2ZNb250aC5pbmRleE9mKGRhdGUpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5kYXRlc09mTW9udGguc3BsaWNlKGlkeCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoLnB1c2goZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZGF5LW9mLW1vbnRoICgxLTMxKSwgcmV0dXJucyB0aGUgbmV4dCBvY2N1cnJlbmNlIGFzICdZWVlZLU1NLUREJy5cbiAgICogVG9kYXkgcXVhbGlmaWVzIGlmIGl0IGlzIHRoYXQgZGF5OyBvdGhlcndpc2UgYWR2YW5jZXMgdG8gdGhlIG5leHQgY2FsZW5kYXJcbiAgICogbW9udGggdGhhdCBhY3R1YWxseSBjb250YWlucyB0aGF0IGRheSAoZS5nLiAzMSBjaG9zZW4gb24gRmViIDEwIC0+IE1hciAzMSkuXG4gICAqL1xuICBwcml2YXRlIGRlcml2ZU5leHRPY2N1cnJlbmNlKGRheU9mTW9udGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgaWYgKHRvZGF5LmdldERhdGUoKSA9PT0gZGF5T2ZNb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9Jc29EYXRlKHRvZGF5KTtcbiAgICB9XG5cbiAgICBsZXQgeWVhciA9IHRvZGF5LmdldEZ1bGxZZWFyKCk7XG4gICAgbGV0IG1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKTtcbiAgICBpZiAodG9kYXkuZ2V0RGF0ZSgpID4gZGF5T2ZNb250aCkge1xuICAgICAgbW9udGggKz0gMTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKCk7XG4gICAgICBpZiAoZGF5T2ZNb250aCA8PSBkYXlzSW5Nb250aCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0lzb0RhdGUobmV3IERhdGUoeWVhciwgbW9udGgsIGRheU9mTW9udGgpKTtcbiAgICAgIH1cbiAgICAgIG1vbnRoICs9IDE7XG4gICAgICBpZiAobW9udGggPiAxMSkge1xuICAgICAgICBtb250aCA9IDA7XG4gICAgICAgIHllYXIgKz0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0lzb0RhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgfVxuXG4gIGlzRGF0ZVNlbGVjdGVkKGRhdGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGVzT2ZNb250aC5pbmNsdWRlcyhkYXRlKTtcbiAgfVxuXG4gIGdldCBtdWx0aVNlbGVjdExhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnd2Vla2x5Jykge1xuICAgICAgLy8gUGVyIEZpZ21hIHRoZSB0cmlnZ2VyIHNob3dzIGEgQ09VTlQgKFwiMiBEYXlzXCIpOyB0aGUgaGVscGVyIGxpbmUgYmVsb3dcbiAgICAgIC8vIHRoZSByb3cgc3BlbGxzIG91dCB3aGljaCBkYXlzLlxuICAgICAgY29uc3QgY291bnQgPSB0aGlzLmRheXNPZldlZWsubGVuZ3RoO1xuICAgICAgcmV0dXJuIGNvdW50ID8gYCR7Y291bnR9IERheSR7Y291bnQgPT09IDEgPyAnJyA6ICdzJ31gIDogJ0Nob29zZSBEYXknO1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICdtb250aGx5JyB8fCB0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnKSB7XG4gICAgICBjb25zdCBjb3VudCA9IHRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aDtcbiAgICAgIGlmICghY291bnQpIHJldHVybiAnQ2hvb3NlIERhdGUnO1xuICAgICAgcmV0dXJuIGAke2NvdW50fSBEYXRlJHtjb3VudCA+IDEgPyAncycgOiAnJ31gO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzZWxlY3RGaWxlVHlwZSh2YWx1ZTogRmlsZVR5cGUpIHtcbiAgICB0aGlzLmZpbGVUeXBlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZmlsZVR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbGVUeXBlID09PSAnY3N2JykgcmV0dXJuICdDU1YnO1xuICAgIGlmICh0aGlzLmZpbGVUeXBlID09PSAneGxzeCcpIHJldHVybiAnWExTWCc7XG4gICAgcmV0dXJuICdDaG9vc2UgRmlsZSc7XG4gIH1cblxuICBwcml2YXRlIG9yZGluYWwobjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJyk7XG4gIH1cblxuICBnZXQgaGVscGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5mcmVxdWVuY3kpIHtcbiAgICAgIGNhc2UgJ2RhaWx5JzpcbiAgICAgICAgcmV0dXJuICdSZXBvcnQgc2VudCBkYWlseSc7XG4gICAgICBjYXNlICd3ZWVrbHknOiB7XG4gICAgICAgIGlmICghdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aCkgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udGhpcy5kYXlzT2ZXZWVrXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gc29ydGVkLm1hcCgoZCkgPT4gREFZX05BTUVTW2RdKTtcbiAgICAgICAgY29uc3Qgam9pbmVkID0gbmFtZXMubGVuZ3RoID4gMVxuICAgICAgICAgID8gYCR7bmFtZXMuc2xpY2UoMCwgLTEpLmpvaW4oJywgJyl9IGFuZCAke25hbWVzW25hbWVzLmxlbmd0aCAtIDFdfWBcbiAgICAgICAgICA6IG5hbWVzWzBdO1xuICAgICAgICByZXR1cm4gYFJlcG9ydCB3aWxsIGJlIHNlbnQgZXZlcnkgJHtqb2luZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ21vbnRobHknOiB7XG4gICAgICAgIGlmICghdGhpcy5kYXRlc09mTW9udGgubGVuZ3RoKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLmRhdGVzT2ZNb250aF0uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBjb25zdCBqb2luZWQgPSBzb3J0ZWQubWFwKChkKSA9PiBgJHt0aGlzLm9yZGluYWwoZCl9JHt0aGlzLmRheVN1ZmZpeChkKX1gKS5qb2luKCcsICcpO1xuICAgICAgICByZXR1cm4gYFJlcG9ydHMgd2lsbCBiZSBzZW50IG9uICR7am9pbmVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdvbmNlJzoge1xuICAgICAgICBpZiAoIXRoaXMub25jZURhdGUpIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIGBSZXBvcnQgd2lsbCBiZSBzZW50IG9uY2Ugb24gJHt0aGlzLmZvcm1hdE9uY2VEYXRlKHRoaXMub25jZURhdGUpfWA7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkYXlTdWZmaXgobjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobiA+PSAxMSAmJiBuIDw9IDEzKSByZXR1cm4gJ3RoJztcbiAgICBzd2l0Y2ggKG4gJSAxMCkge1xuICAgICAgY2FzZSAxOiByZXR1cm4gJ3N0JztcbiAgICAgIGNhc2UgMjogcmV0dXJuICduZCc7XG4gICAgICBjYXNlIDM6IHJldHVybiAncmQnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICd0aCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRPbmNlRGF0ZShkYXRlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzID0gZGF0ZVN0ci5zcGxpdCgnLScpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBkYXRlU3RyO1xuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHBhcnRzO1xuICAgIGNvbnN0IG1vbnRoTmFtZSA9IE1PTlRIX05BTUVTW051bWJlcihtb250aCkgLSAxXSB8fCAnJztcbiAgICByZXR1cm4gYCR7ZGF5fSAke21vbnRoTmFtZX0sICR7eWVhcn1gO1xuICB9XG5cbiAgZ2V0IGlzU2F2ZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNhdmluZykgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLnJlcG9ydE5hbWU/LnRyaW0oKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLmZpbGVUeXBlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuZW1haWxMaXN0Lmxlbmd0aCB8fCB0aGlzLmVtYWlsVmFsaWRhdGlvbi5pbmNsdWRlcyhmYWxzZSkpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ3dlZWtseScgJiYgIXRoaXMuZGF5c09mV2Vlay5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ21vbnRobHknICYmICF0aGlzLmRhdGVzT2ZNb250aC5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnICYmICF0aGlzLm9uY2VEYXRlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvbkNhbmNlbCgpIHtcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2NoZWR1bGVQYXlsb2FkKCk6IGFueSB7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGZyZXF1ZW5jeTogdGhpcy5mcmVxdWVuY3ksXG4gICAgICB0aW1lOiB0aGlzLnRpbWUgfHwgJzA5OjAwJyxcbiAgICAgIGZpbGVUeXBlOiB0aGlzLmZpbGVUeXBlLFxuICAgICAgcmVjZWl2ZXJzOiB0aGlzLmVtYWlsTGlzdFxuICAgIH07XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnd2Vla2x5Jykge1xuICAgICAgcGF5bG9hZC5kYXlzT2ZXZWVrID0gdGhpcy5kYXlzT2ZXZWVrO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICdtb250aGx5Jykge1xuICAgICAgcGF5bG9hZC5kYXRlc09mTW9udGggPSB0aGlzLmRhdGVzT2ZNb250aDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScpIHtcbiAgICAgIGlmICh0aGlzLmRhdGVzT2ZNb250aC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5vbmNlRGF0ZSA9IHRoaXMuZGVyaXZlTmV4dE9jY3VycmVuY2UodGhpcy5kYXRlc09mTW9udGhbMF0pO1xuICAgICAgfVxuICAgICAgcGF5bG9hZC5vbmNlRGF0ZSA9IHRoaXMub25jZURhdGU7XG4gICAgfVxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgb25TdWJtaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNTYXZlRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uYW1lRXJyb3IgPSAnJztcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG5cbiAgICBjb25zdCBuYW1lQ2hhbmdlZCA9IHRoaXMucmVwb3J0TmFtZS50cmltKCkgIT09ICh0aGlzLnRlbXBsYXRlPy50ZW1wbGF0ZU5hbWUgfHwgJycpO1xuICAgIGlmIChuYW1lQ2hhbmdlZCkge1xuICAgICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZUN1c3RvbVJlcG9ydFRlbXBsYXRlKHRoaXMudGVtcGxhdGU/Ll9pZCwgeyB0ZW1wbGF0ZU5hbWU6IHRoaXMucmVwb3J0TmFtZS50cmltKCkgfSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2ZVNjaGVkdWxlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChlcnI/LnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICB0aGlzLm5hbWVFcnJvciA9ICdSZXBvcnQgbmFtZSBhbHJlYWR5IGV4aXN0cy4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXIuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3I/LmVycm9yIHx8IGVyci5lcnJvcj8ubWVzc2FnZSB8fCAnRXJyb3IgdXBkYXRpbmcgcmVwb3J0IG5hbWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNhdmVTY2hlZHVsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZVNjaGVkdWxlKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuYnVpbGRTY2hlZHVsZVBheWxvYWQoKTtcbiAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlQ3VzdG9tUmVwb3J0U2NoZWR1bGUodGhpcy50ZW1wbGF0ZT8uX2lkLCBwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoeyB0eXBlOiAnc2F2ZScgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0ZXIuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3I/LmVycm9yIHx8IGVyci5lcnJvcj8ubWVzc2FnZSB8fCAnRXJyb3IgdXBkYXRpbmcgcmVwb3J0IHNjaGVkdWxlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0iLCI8IS0tIFNhbWUgbWFya3VwL2NsYXNzZXMgYXMgdGhlIFJlcG9ydHMgcGFnZSdzIFwiQ3VzdG9tIFJlcG9ydCBDb25maWd1cmF0aW9uXCIgbW9kYWxcbiAgICAgKHRhbmdvLWFuYWx5c2UtcmVwb3J0IGN1c3RvbS1yZXBvcnQtdmlldyAjc2NoZWR1bGVNb2RhbCksIHBlciBGaWdtYSwgc28gYm90aCBwb3B1cHNcbiAgICAgbG9vayBpZGVudGljYWw7IG9ubHkgdGhlIGJpbmRpbmdzIGRpZmZlciAodGhpcyBjb21wb25lbnQncyBvd24gZmllbGQvbWV0aG9kIG5hbWVzKS4gLS0+XG48ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMCBzY2hlZHVsZS1jb25maWctbW9kYWxcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImhlYWRlciBmdy1ib2xkXCI+Q3VzdG9tIFJlcG9ydCBDb25maWd1cmF0aW9uPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBzY2hlZHVsZS1jbG9zZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgdGl0bGU9XCJDbG9zZVwiPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE1IDVMNSAxNU01IDVMMTUgMTVcIiBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXQtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwic3ViLWhlYWRlclwiIGZvcj1cInNjaGVkdWxlLW5hbWVcIj5FbnRlciBSZXBvcnQgTmFtZTwvbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNjaGVkdWxlLW5hbWVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtdC0yIHNjaGVkdWxlLWZpZWxkXCIgWyhuZ01vZGVsKV09XCJyZXBvcnROYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgIDxkaXYgKm5nSWY9XCJuYW1lRXJyb3JcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTJcIj57eyBuYW1lRXJyb3IgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCI+U2NoZWR1bGU8L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBzY2hlZHVsZS1yb3ctZ2FwXCI+XG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9jayBzY2hlZHVsZS1mcmVxXCIgW2NsYXNzLmZsZXgtZ3Jvdy0xXT1cImZyZXF1ZW5jeSA9PT0gJ2RhaWx5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGU+XG4gICAgICAgICAgICA8c3Bhbj57eyBzY2hlZHVsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJzY2hlZHVsZS1jaGV2cm9uXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdkYWlseScpXCI+RGFpbHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCd3ZWVrbHknKVwiPldlZWtseTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25JdGVtIChjbGljayk9XCJzZWxlY3RGcmVxdWVuY3koJ21vbnRobHknKVwiPk1vbnRobHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdvbmNlJylcIj5Eb2VzIE5vdCBSZXBlYXQ8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgc2NoZWR1bGUtcGlja1wiICpuZ0lmPVwiZnJlcXVlbmN5ID09PSAnd2Vla2x5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGUgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFkYXlzT2ZXZWVrLmxlbmd0aFwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgbXVsdGlTZWxlY3RMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwic2NoZWR1bGUtY2hldnJvblwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cImNoZWNrYm94LWRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWQgcHgtMyBweS0xXCIgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlPcHRpb25zXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwiJ2RheS0nICsgZGF5LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzRGF5U2VsZWN0ZWQoZGF5LnZhbHVlKVwiIChjaGFuZ2UpPVwidG9nZ2xlRGF5KGRheS52YWx1ZSlcIiAvPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIGN1cnNvci1wb2ludGVyXCIgW2Zvcl09XCInZGF5LScgKyBkYXkudmFsdWVcIj57eyBkYXkubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd24gW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIiBjbGFzcz1cImQtaW5saW5lLWJsb2NrIHNjaGVkdWxlLXBpY2tcIiAqbmdJZj1cImZyZXF1ZW5jeSA9PT0gJ21vbnRobHknIHx8IGZyZXF1ZW5jeSA9PT0gJ29uY2UnXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBuZ2JEcm9wZG93blRvZ2dsZSBbY2xhc3MuaXMtcGxhY2Vob2xkZXJdPVwiIWRhdGVzT2ZNb250aC5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG11bHRpU2VsZWN0TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgY2xhc3M9XCJjaGVja2JveC1kcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkIHB4LTMgcHktMVwiICpuZ0Zvcj1cImxldCBkYXRlIG9mIGRhdGVPcHRpb25zXCI+XG4gICAgICAgICAgICAgIDwhLS0gRG9lcyBOb3QgUmVwZWF0OiBkYXlzIGFscmVhZHkgcGFzdCB0aGlzIG1vbnRoIGFyZSBkaXNhYmxlZC4gLS0+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwiJ2RhdGUtJyArIGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNEYXRlU2VsZWN0ZWQoZGF0ZSlcIiAoY2hhbmdlKT1cInRvZ2dsZURhdGUoZGF0ZSlcIiAvPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInZGF0ZS0nICsgZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LW11dGVkXT1cImlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpc0RhdGVEaXNhYmxlZChkYXRlKSA/ICdQYXN0IGRhdGVzIGNhbm5vdCBiZSBzY2hlZHVsZWQnIDogJydcIj57eyBkYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cInN1Yi1oZWFkZXIgbWItMCBzY2hlZHVsZS1hdFwiPmF0PC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3QgdGltZS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInRpbWVcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiB0aW1lT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQudmFsdWUgfX08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInRpbWUtaWNvblwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA1VjEwTDEzLjMzMzMgMTEuNjY2N00xOC4zMzMzIDEwQzE4LjMzMzMgMTQuNjAyNCAxNC42MDI0IDE4LjMzMzMgMTAgMTguMzMzM0M1LjM5NzYzIDE4LjMzMzMgMS42NjY2NyAxNC42MDI0IDEuNjY2NjcgMTBDMS42NjY2NyA1LjM5NzYzIDUuMzk3NjMgMS42NjY2NyAxMCAxLjY2NjY3QzE0LjYwMjQgMS42NjY2NyAxOC4zMzMzIDUuMzk3NjMgMTguMzMzMyAxMFpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzY2hlZHVsZS1oZWxwZXIgbXQtMlwiICpuZ0lmPVwiaGVscGVyVGV4dFwiPnt7IGhlbHBlclRleHQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCI+RmlsZSBUeXBlPC9sYWJlbD5cbiAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWJsb2NrIG10LTJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBuZ2JEcm9wZG93blRvZ2dsZSBbY2xhc3MuaXMtcGxhY2Vob2xkZXJdPVwiIWZpbGVUeXBlXCI+XG4gICAgICAgICAgPHNwYW4+e3sgZmlsZVR5cGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrKT1cInNlbGVjdEZpbGVUeXBlKCdjc3YnKVwiPkNTVjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RmlsZVR5cGUoJ3hsc3gnKVwiPlhMU1g8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCIgZm9yPVwic2NoZWR1bGUtcmVjZWl2ZXJzXCI+UmVjZWl2ZXJzIEVtYWlsPC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtMiBkLWZsZXggZmxleC13cmFwIGFsaWduLWl0ZW1zLXN0YXJ0IHNjaGVkdWxlLXJlY2VpdmVycy1ib3ggc2NoZWR1bGUtZmllbGQtYm94XCI+XG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBlbWFpbExpc3Q7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0IGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAge3sgZW1haWwgfX1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIG1zLTJcIiAoY2xpY2spPVwicmVtb3ZlQ2hpcChpKVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBhdXRvY29tcGxldGU9XCJvZmZcIjogQ2hyb21lIG90aGVyd2lzZSBhdXRvZmlsbHMgdGhlIGp1c3QtYWRkZWQgYWRkcmVzcyBiYWNrXG4gICAgICAgICAgICAgaW50byB0aGUgZmllbGQgKGJsdWUgYXV0b2ZpbGwgYmFja2dyb3VuZCkgYWZ0ZXIgRW50ZXIgY2xlYXJzIGl0LiAtLT5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGlkPVwic2NoZWR1bGUtcmVjZWl2ZXJzXCIgY2xhc3M9XCJib3JkZXItMCBmbGV4LWdyb3ctMSBzY2hlZHVsZS1lbWFpbC1pbnB1dFwiXG4gICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJlbWFpbFZhbGlkYXRpb24uaW5jbHVkZXMoZmFsc2UpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtdC0yXCI+SW52YWxpZCBFbWFpbCBGb3JtYXQ8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtOFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gc2NoZWR1bGUtYnRuLWNhbmNlbCB3LTUwIG1lLTJcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgc2NoZWR1bGUtYnRuLXNhdmUgdy01MCBtcy0yIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmVEaXNhYmxlZFwiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+XG4gICAgICAgIDxzdmcgKm5nSWY9XCIhaXNTYXZlRGlzYWJsZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0yXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0xNy41IDE3LjVWMTEuNjY2N0MxNy41IDExLjIyNDYgMTcuMzI0NCAxMC44MDA3IDE3LjAxMTggMTAuNDg4MkMxNi42OTkzIDEwLjE3NTYgMTYuMjc1NCAxMCAxNS44MzMzIDEwSDQuMTY2NjdDMy43MjQ2NCAxMCAzLjMwMDcyIDEwLjE3NTYgMi45ODgxNiAxMC40ODgyQzIuNjc1NTkgMTAuODAwNyAyLjUgMTEuMjI0NiAyLjUgMTEuNjY2N1YxNy41TTE3LjUgMTcuNUgyLjVNMTcuNSAxNy41VjYuMTY2NjdDMTcuNSA1LjY5OTk2IDE3LjUgNS40NjY2IDE3LjQwOTIgNS4yODgzNEMxNy4zMjkzIDUuMTMxNTQgMTcuMjAxOCA1LjAwNDA1IDE3LjA0NSA0LjkyNDE2QzE2Ljg2NjggNC44MzMzMyAxNi42MzM0IDQuODMzMzMgMTYuMTY2NyA0LjgzMzMzSDEyLjVNMi41IDE3LjVWNC4xNjY2N0MyLjUgMy42OTk5NiAyLjUgMy40NjY2IDIuNTkwODMgMy4yODgzNEMyLjY3MDcyIDMuMTMxNTQgMi43OTgyMSAzLjAwNDA1IDIuOTU1MDEgMi45MjQxNkMzLjEzMzI3IDIuODMzMzMgMy4zNjY2MiAyLjgzMzMzIDMuODMzMzMgMi44MzMzM0gxMC44MzMzTTEyLjUgNC44MzMzM1YyLjgzMzMzTTEyLjUgNC44MzMzM0gxMC44MzMzTTEyLjUgMi44MzMzM0gxMC44MzMzTTEwLjgzMzMgMi44MzMzM1Y0LjgzMzMzTTYuNjY2NjcgNi42NjY2N0g5LjE2NjY3XCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgU2F2ZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQUt6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUV6Rzs7aURBRWlEO0FBQ2pELE1BQU0scUJBQXFCLEdBQXVDLENBQUMsR0FBRyxFQUFFO0lBQ3RFLE1BQU0sT0FBTyxHQUF1QyxFQUFFLENBQUM7SUFDdkQsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFB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QUFZO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQy9FLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksZ0NBQWdDLENBQUMsQ0FBQztZQUN6RyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0FyVlUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsb0dDL0IxQyx1b1dBdUpNOzs0RkR4SE8sNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0Qjs2SUFLN0IsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuXG5jb25zdCBEQVlfTkFNRVMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG5jb25zdCBNT05USF9OQU1FUyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLyoqIFNjaGVkdWxlIHNlbmQtdGltZSBzbG90czogMzAtbWludXRlIHN0ZXBzLCByZXN0cmljdGVkIHRvIDA5OjAw4oCTMjE6MDAg4oCUIHRoZVxuICogIHNhbWUgcHJvZHVjdCBydWxlIGFzIHRoZSByZXBvcnRzIHBhZ2UncyBzY2hlZHVsZSBtb2RhbC4gVmFsdWVzIHN0YXkgSEg6bW1cbiAqICAodGhlIEFQSSBjb250cmFjdCk7IGxhYmVscyByZW5kZXIgMTItaG91ci4gKi9cbmNvbnN0IFNDSEVEVUxFX1RJTUVfT1BUSU9OUzogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9ICgoKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChsZXQgaG91ciA9IDk7IGhvdXIgPD0gMjE7IGhvdXIrKykge1xuICAgIGZvciAoY29uc3QgbWludXRlIG9mIGhvdXIgPT09IDIxID8gWzBdIDogWzAsIDMwXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBgJHtTdHJpbmcoaG91cikucGFkU3RhcnQoMiwgJzAnKX06JHtTdHJpbmcobWludXRlKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICBjb25zdCBob3VyMTIgPSAoKGhvdXIgKyAxMSkgJSAxMikgKyAxO1xuICAgICAgb3B0aW9ucy5wdXNoKHsgdmFsdWUsIGxhYmVsOiBgJHtob3VyMTJ9OiR7U3RyaW5nKG1pbnV0ZSkucGFkU3RhcnQoMiwgJzAnKX0gJHtob3VyIDwgMTIgPyAnQU0nIDogJ1BNJ31gIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn0pKCk7XG5cbnR5cGUgRnJlcXVlbmN5ID0gJ2RhaWx5JyB8ICd3ZWVrbHknIHwgJ21vbnRobHknIHwgJ29uY2UnO1xudHlwZSBGaWxlVHlwZSA9ICdjc3YnIHwgJ3hsc3gnIHwgJyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LXNjaGVkdWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVwb3J0U2NoZWR1bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZTogYW55O1xuXG4gIHJlcG9ydE5hbWU6IHN0cmluZyA9ICcnO1xuICBuYW1lRXJyb3I6IHN0cmluZyA9ICcnO1xuXG4gIGZyZXF1ZW5jeTogRnJlcXVlbmN5ID0gJ2RhaWx5JztcbiAgdGltZTogc3RyaW5nID0gJzA5OjAwJztcbiAgZGF5c09mV2VlazogbnVtYmVyW10gPSBbXTtcbiAgZGF0ZXNPZk1vbnRoOiBudW1iZXJbXSA9IFtdO1xuICBvbmNlRGF0ZTogc3RyaW5nID0gJyc7XG4gIGZpbGVUeXBlOiBGaWxlVHlwZSA9ICd4bHN4JztcblxuICBlbWFpbExpc3Q6IGFueVtdID0gW107XG4gIGVtYWlsVmFsaWRhdGlvbjogYW55W10gPSBbXTtcbiAgc2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBGaWdtYSAyMDI2LTA4LTMxOiBhbiBhbHJlYWR5LXNjaGVkdWxlZCByZXBvcnQgb3BlbnMgUkVBRC1PTkxZOyBFZGl0IHVubG9ja3MuICovXG4gIGVkaXRNb2RlID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZGF5T3B0aW9ucyA9IERBWV9OQU1FUy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoeyB2YWx1ZTogaW5kZXgsIGxhYmVsOiBuYW1lIH0pKTtcbiAgcmVhZG9ubHkgZGF0ZU9wdGlvbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAzMSB9LCAoXywgaSkgPT4gaSArIDEpO1xuICByZWFkb25seSB0aW1lT3B0aW9ucyA9IFNDSEVEVUxFX1RJTUVfT1BUSU9OUztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCwgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0U2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHRoaXMucmVwb3J0TmFtZSA9IHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJztcbiAgICAgIGNvbnN0IHNjaGVkdWxlID0gdGhpcy50ZW1wbGF0ZT8uc2NoZWR1bGUgfHwge307XG4gICAgICB0aGlzLmVkaXRNb2RlID0gIXNjaGVkdWxlLmVuYWJsZWQ7XG4gICAgICB0aGlzLmZyZXF1ZW5jeSA9IHNjaGVkdWxlLmZyZXF1ZW5jeSB8fCAnZGFpbHknO1xuICAgICAgLy8gQSBzdG9yZWQgdGltZSBvdXRzaWRlIHRoZSBhbGxvd2VkIHNsb3RzIChvbGRlciBzY2hlZHVsZXMsIGZyZWUtdHlwZWRcbiAgICAgIC8vIHZhbHVlcykgc25hcHMgYmFjayB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbiBzaG93aW5nIGFuIGVtcHR5IHNlbGVjdC5cbiAgICAgIGNvbnN0IHN0b3JlZFRpbWUgPSBzY2hlZHVsZS50aW1lIHx8ICcwOTowMCc7XG4gICAgICB0aGlzLnRpbWUgPSBTQ0hFRFVMRV9USU1FX09QVElPTlMuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHN0b3JlZFRpbWUpID8gc3RvcmVkVGltZSA6ICcwOTowMCc7XG4gICAgICB0aGlzLmRheXNPZldlZWsgPSBbLi4uKHNjaGVkdWxlLmRheXNPZldlZWsgfHwgW10pXTtcbiAgICAgIHRoaXMub25jZURhdGUgPSBzY2hlZHVsZS5vbmNlRGF0ZSB8fCAnJztcbiAgICAgIC8vIERlZmF1bHQgdG8gdGhlIE5FWFQgZGF0ZSAodG9tb3Jyb3cpIHdoZW4gbm90aGluZyB2YWxpZCBpcyBzdG9yZWQgKHVzZXJcbiAgICAgIC8vIHJlcXVlc3QgMjAyNi0wOC0zMSkgLS0gdGhlIHBpY2tlciBuZXZlciBvcGVucyBlbXB0eS5cbiAgICAgIGlmICghdGhpcy5vbmNlRGF0ZSB8fCB0aGlzLm9uY2VEYXRlIDwgdGhpcy5taW5PbmNlRGF0ZSkge1xuICAgICAgICB0aGlzLm9uY2VEYXRlID0gdGhpcy5taW5PbmNlRGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnICYmIHRoaXMub25jZURhdGUpIHtcbiAgICAgICAgY29uc3QgZGF5ID0gTnVtYmVyKHRoaXMub25jZURhdGUuc3BsaXQoJy0nKVsyXSk7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gZGF5ID8gW2RheV0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gWy4uLihzY2hlZHVsZS5kYXRlc09mTW9udGggfHwgW10pXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZVR5cGUgPSBzY2hlZHVsZS5maWxlVHlwZSB8fCAneGxzeCc7XG4gICAgICB0aGlzLmVtYWlsTGlzdCA9IFsuLi4oc2NoZWR1bGUucmVjZWl2ZXJzIHx8IFtdKV07XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgICAgdGhpcy5lbWFpbExpc3QuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7IHRoaXMuZW1haWxWYWxpZGF0b3IoZWxlbWVudCk7IH0pO1xuICAgIH1cbiAgfVxuXG4gIGVtYWlsVmFsaWRhdG9yKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xuICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KHZhbHVlKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbi5wdXNoKHZhbGlkKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdCYWNrc3BhY2UnICYmIGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJycgJiYgdGhpcy5lbWFpbExpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVtYWlsTGlzdC5wb3AoKTtcbiAgICAgIHRoaXMuZW1haWxWYWxpZGF0aW9uLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbiAgICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgdGhpcy5lbWFpbExpc3QucHVzaChldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBFbnRlciBWYWxpZCBFbWFpbC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGlwKGk6IG51bWJlcikge1xuICAgIHRoaXMuZW1haWxMaXN0LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgIHRoaXMuZW1haWxMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4geyB0aGlzLmVtYWlsVmFsaWRhdG9yKGVsZW1lbnQpOyB9KTtcbiAgfVxuXG4gIHNlbGVjdEZyZXF1ZW5jeSh2YWx1ZTogRnJlcXVlbmN5KSB7XG4gICAgdGhpcy5mcmVxdWVuY3kgPSB2YWx1ZTtcbiAgICAvLyBEb2VzIE5vdCBSZXBlYXQgcGlja3MgYSBmdWxsIGZ1dHVyZSBkYXRlIGluIGl0cyBvd24gZGF0ZSBpbnB1dCAocHJvZHVjdFxuICAgIC8vIGNoYW5nZSAyMDI2LTA4LTMxKTsgYSBzdGFsZSBub24tZnV0dXJlIHZhbHVlIG5ldmVyIHN1cnZpdmVzIHRoZSBzd2l0Y2guXG4gICAgaWYgKHZhbHVlID09PSAnb25jZScgJiYgdGhpcy5vbmNlRGF0ZSA8IHRoaXMubWluT25jZURhdGUpIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdGhlIE5FWFQgZGF0ZSAodG9tb3Jyb3cpIHJhdGhlciB0aGFuIGFuIGVtcHR5IHBpY2tlci5cbiAgICAgIHRoaXMub25jZURhdGUgPSB0aGlzLm1pbk9uY2VEYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUb21vcnJvdyAoWVlZWS1NTS1ERCk6IHRoZSBlYXJsaWVzdCBzZWxlY3RhYmxlIERvZXMtTm90LVJlcGVhdCBkYXRlIC0tXG4gICAqICB0b2RheSBpdHNlbGYgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhbGxvd2VkIChwcm9kdWN0IHJ1bGUgMjAyNi0wOC0zMSkuICovXG4gIGdldCBtaW5PbmNlRGF0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHQgPSBuZXcgRGF0ZSgpO1xuICAgIHQuc2V0RGF0ZSh0LmdldERhdGUoKSArIDEpO1xuICAgIHJldHVybiB0aGlzLnRvSXNvRGF0ZSh0KTtcbiAgfVxuXG4gIC8qKiAnRG9lcyBOb3QgUmVwZWF0JyBzZW5kcyBvbiBhIGRheSBvZiB0aGUgQ1VSUkVOVCBtb250aCwgc28gZGF5cyBhbHJlYWR5IHBhc3RcbiAgICogIGNhbid0IGJlIGNob3Nlbi4gKi9cbiAgaXNEYXRlRGlzYWJsZWQoZGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScgJiYgZGF0ZSA8IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpO1xuICB9XG5cbiAgZ2V0IHNjaGVkdWxlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMuZnJlcXVlbmN5KSB7XG4gICAgICBjYXNlICdkYWlseSc6IHJldHVybiAnRGFpbHknO1xuICAgICAgY2FzZSAnd2Vla2x5JzogcmV0dXJuICdXZWVrbHknO1xuICAgICAgY2FzZSAnbW9udGhseSc6IHJldHVybiAnTW9udGhseSc7XG4gICAgICBjYXNlICdvbmNlJzogcmV0dXJuICdEb2VzIE5vdCBSZXBlYXQnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICdEYWlseSc7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRGF5KGRheTogbnVtYmVyKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5kYXlzT2ZXZWVrLmluZGV4T2YoZGF5KTtcbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMuZGF5c09mV2Vlay5zcGxpY2UoaWR4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXlzT2ZXZWVrLnB1c2goZGF5KTtcbiAgICB9XG4gIH1cblxuICBpc0RheVNlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF5c09mV2Vlay5pbmNsdWRlcyhkYXkpO1xuICB9XG5cbiAgdG9nZ2xlRGF0ZShkYXRlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICdvbmNlJykge1xuICAgICAgdGhpcy5kYXRlc09mTW9udGggPSBbZGF0ZV07XG4gICAgICB0aGlzLm9uY2VEYXRlID0gdGhpcy5kZXJpdmVOZXh0T2NjdXJyZW5jZShkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaWR4ID0gdGhpcy5kYXRlc09mTW9udGguaW5kZXhPZihkYXRlKTtcbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoLnNwbGljZShpZHgsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGVzT2ZNb250aC5wdXNoKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGRheS1vZi1tb250aCAoMS0zMSksIHJldHVybnMgdGhlIG5leHQgb2NjdXJyZW5jZSBhcyAnWVlZWS1NTS1ERCcuXG4gICAqIFRvZGF5IHF1YWxpZmllcyBpZiBpdCBpcyB0aGF0IGRheTsgb3RoZXJ3aXNlIGFkdmFuY2VzIHRvIHRoZSBuZXh0IGNhbGVuZGFyXG4gICAqIG1vbnRoIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhhdCBkYXkgKGUuZy4gMzEgY2hvc2VuIG9uIEZlYiAxMCAtPiBNYXIgMzEpLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXJpdmVOZXh0T2NjdXJyZW5jZShkYXlPZk1vbnRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGlmICh0b2RheS5nZXREYXRlKCkgPT09IGRheU9mTW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvSXNvRGF0ZSh0b2RheSk7XG4gICAgfVxuXG4gICAgbGV0IHllYXIgPSB0b2RheS5nZXRGdWxsWWVhcigpO1xuICAgIGxldCBtb250aCA9IHRvZGF5LmdldE1vbnRoKCk7XG4gICAgaWYgKHRvZGF5LmdldERhdGUoKSA+IGRheU9mTW9udGgpIHtcbiAgICAgIG1vbnRoICs9IDE7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgaWYgKGRheU9mTW9udGggPD0gZGF5c0luTW9udGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Jc29EYXRlKG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXlPZk1vbnRoKSk7XG4gICAgICB9XG4gICAgICBtb250aCArPSAxO1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgbW9udGggPSAwO1xuICAgICAgICB5ZWFyICs9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgdG9Jc29EYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gIH1cblxuICBpc0RhdGVTZWxlY3RlZChkYXRlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlc09mTW9udGguaW5jbHVkZXMoZGF0ZSk7XG4gIH1cblxuICBnZXQgbXVsdGlTZWxlY3RMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ3dlZWtseScpIHtcbiAgICAgIC8vIFBlciBGaWdtYSB0aGUgdHJpZ2dlciBzaG93cyBhIENPVU5UIChcIjIgRGF5c1wiKTsgdGhlIGhlbHBlciBsaW5lIGJlbG93XG4gICAgICAvLyB0aGUgcm93IHNwZWxscyBvdXQgd2hpY2ggZGF5cy5cbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aDtcbiAgICAgIHJldHVybiBjb3VudCA/IGAke2NvdW50fSBEYXkke2NvdW50ID09PSAxID8gJycgOiAncyd9YCA6ICdDaG9vc2UgRGF5JztcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXRlc09mTW9udGgubGVuZ3RoO1xuICAgICAgaWYgKCFjb3VudCkgcmV0dXJuICdDaG9vc2UgRGF0ZSc7XG4gICAgICByZXR1cm4gYCR7Y291bnR9IERhdGUke2NvdW50ID4gMSA/ICdzJyA6ICcnfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHNlbGVjdEZpbGVUeXBlKHZhbHVlOiBGaWxlVHlwZSkge1xuICAgIHRoaXMuZmlsZVR5cGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBmaWxlVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmlsZVR5cGUgPT09ICdjc3YnKSByZXR1cm4gJ0NTVic7XG4gICAgaWYgKHRoaXMuZmlsZVR5cGUgPT09ICd4bHN4JykgcmV0dXJuICdYTFNYJztcbiAgICByZXR1cm4gJ0Nob29zZSBGaWxlJztcbiAgfVxuXG4gIHByaXZhdGUgb3JkaW5hbChuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuXG4gIGdldCBoZWxwZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmZyZXF1ZW5jeSkge1xuICAgICAgY2FzZSAnZGFpbHknOlxuICAgICAgICByZXR1cm4gJ1JlcG9ydCBzZW50IGRhaWx5JztcbiAgICAgIGNhc2UgJ3dlZWtseSc6IHtcbiAgICAgICAgaWYgKCF0aGlzLmRheXNPZldlZWsubGVuZ3RoKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLmRheXNPZldlZWtdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBzb3J0ZWQubWFwKChkKSA9PiBEQVlfTkFNRVNbZF0pO1xuICAgICAgICBjb25zdCBqb2luZWQgPSBuYW1lcy5sZW5ndGggPiAxXG4gICAgICAgICAgPyBgJHtuYW1lcy5zbGljZSgwLCAtMSkuam9pbignLCAnKX0gYW5kICR7bmFtZXNbbmFtZXMubGVuZ3RoIC0gMV19YFxuICAgICAgICAgIDogbmFtZXNbMF07XG4gICAgICAgIHJldHVybiBgUmVwb3J0IHdpbGwgYmUgc2VudCBldmVyeSAke2pvaW5lZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnbW9udGhseSc6IHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGVzT2ZNb250aC5sZW5ndGgpIHJldHVybiAnJztcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnRoaXMuZGF0ZXNPZk1vbnRoXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IGpvaW5lZCA9IHNvcnRlZC5tYXAoKGQpID0+IGAke3RoaXMub3JkaW5hbChkKX0ke3RoaXMuZGF5U3VmZml4KGQpfWApLmpvaW4oJywgJyk7XG4gICAgICAgIHJldHVybiBgUmVwb3J0cyB3aWxsIGJlIHNlbnQgb24gJHtqb2luZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29uY2UnOiB7XG4gICAgICAgIGlmICghdGhpcy5vbmNlRGF0ZSkgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gYFJlcG9ydCB3aWxsIGJlIHNlbnQgb25jZSBvbiAke3RoaXMuZm9ybWF0T25jZURhdGUodGhpcy5vbmNlRGF0ZSl9YDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRheVN1ZmZpeChuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChuID49IDExICYmIG4gPD0gMTMpIHJldHVybiAndGgnO1xuICAgIHN3aXRjaCAobiAlIDEwKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiAnc3QnO1xuICAgICAgY2FzZSAyOiByZXR1cm4gJ25kJztcbiAgICAgIGNhc2UgMzogcmV0dXJuICdyZCc7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ3RoJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE9uY2VEYXRlKGRhdGVTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBkYXRlU3RyLnNwbGl0KCctJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIGRhdGVTdHI7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gcGFydHM7XG4gICAgY29uc3QgbW9udGhOYW1lID0gTU9OVEhfTkFNRVNbTnVtYmVyKG1vbnRoKSAtIDFdIHx8ICcnO1xuICAgIHJldHVybiBgJHtkYXl9ICR7bW9udGhOYW1lfSwgJHt5ZWFyfWA7XG4gIH1cblxuICBnZXQgaXNTYXZlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2F2aW5nKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucmVwb3J0TmFtZT8udHJpbSgpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuZmlsZVR5cGUpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5lbWFpbExpc3QubGVuZ3RoIHx8IHRoaXMuZW1haWxWYWxpZGF0aW9uLmluY2x1ZGVzKGZhbHNlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnd2Vla2x5JyAmJiAhdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScgJiYgIXRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgLy8gRG9lcyBOb3QgUmVwZWF0OiBvbmx5IGEgc3RyaWN0bHkgRlVUVVJFIGRhdGUgc2F2ZXMgKHRvZGF5L3Bhc3QgcmVzdHJpY3RlZCkuXG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScgJiYgKCF0aGlzLm9uY2VEYXRlIHx8IHRoaXMub25jZURhdGUgPCB0aGlzLm1pbk9uY2VEYXRlKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb25DYW5jZWwoKSB7XG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNjaGVkdWxlUGF5bG9hZCgpOiBhbnkge1xuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBmcmVxdWVuY3k6IHRoaXMuZnJlcXVlbmN5LFxuICAgICAgdGltZTogdGhpcy50aW1lIHx8ICcwOTowMCcsXG4gICAgICBmaWxlVHlwZTogdGhpcy5maWxlVHlwZSxcbiAgICAgIHJlY2VpdmVyczogdGhpcy5lbWFpbExpc3RcbiAgICB9O1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ3dlZWtseScpIHtcbiAgICAgIHBheWxvYWQuZGF5c09mV2VlayA9IHRoaXMuZGF5c09mV2VlaztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScpIHtcbiAgICAgIHBheWxvYWQuZGF0ZXNPZk1vbnRoID0gdGhpcy5kYXRlc09mTW9udGg7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnKSB7XG4gICAgICBwYXlsb2FkLm9uY2VEYXRlID0gdGhpcy5vbmNlRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBvblN1Ym1pdCgpIHtcbiAgICBpZiAodGhpcy5pc1NhdmVEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5hbWVFcnJvciA9ICcnO1xuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IG5hbWVDaGFuZ2VkID0gdGhpcy5yZXBvcnROYW1lLnRyaW0oKSAhPT0gKHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJyk7XG4gICAgaWYgKG5hbWVDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlQ3VzdG9tUmVwb3J0VGVtcGxhdGUodGhpcy50ZW1wbGF0ZT8uX2lkLCB7IHRlbXBsYXRlTmFtZTogdGhpcy5yZXBvcnROYW1lLnRyaW0oKSB9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlU2NoZWR1bGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZUVycm9yID0gJ1JlcG9ydCBuYW1lIGFscmVhZHkgZXhpc3RzLiBDaG9vc2UgYSBkaWZmZXJlbnQgbmFtZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciB1cGRhdGluZyByZXBvcnQgbmFtZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2F2ZVNjaGVkdWxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlU2NoZWR1bGUoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5idWlsZFNjaGVkdWxlUGF5bG9hZCgpO1xuICAgIHRoaXMuYXBpU2VydmljZS51cGRhdGVDdXN0b21SZXBvcnRTY2hlZHVsZSh0aGlzLnRlbXBsYXRlPy5faWQsIHBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSh7IHR5cGU6ICdzYXZlJyB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciB1cGRhdGluZyByZXBvcnQgc2NoZWR1bGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSIsIjwhLS0gU2FtZSBtYXJrdXAvY2xhc3NlcyBhcyB0aGUgUmVwb3J0cyBwYWdlJ3MgXCJDdXN0b20gUmVwb3J0IENvbmZpZ3VyYXRpb25cIiBtb2RhbFxuICAgICAodGFuZ28tYW5hbHlzZS1yZXBvcnQgY3VzdG9tLXJlcG9ydC12aWV3ICNzY2hlZHVsZU1vZGFsKSwgcGVyIEZpZ21hLCBzbyBib3RoIHBvcHVwc1xuICAgICBsb29rIGlkZW50aWNhbDsgb25seSB0aGUgYmluZGluZ3MgZGlmZmVyICh0aGlzIGNvbXBvbmVudCdzIG93biBmaWVsZC9tZXRob2QgbmFtZXMpLiAtLT5cbjxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci0wIHNjaGVkdWxlLWNvbmZpZy1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyIGZ3LWJvbGRcIj5DdXN0b20gUmVwb3J0IENvbmZpZ3VyYXRpb248L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHNjaGVkdWxlLWNsb3NlXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgNUw1IDE1TTUgNUwxNSAxNVwiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCIgZm9yPVwic2NoZWR1bGUtbmFtZVwiPkVudGVyIFJlcG9ydCBOYW1lPC9sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2NoZWR1bGUtbmFtZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG10LTIgc2NoZWR1bGUtZmllbGRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydE5hbWVcIlxuICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgPGRpdiAqbmdJZj1cIm5hbWVFcnJvclwiIGNsYXNzPVwidGV4dC1kYW5nZXIgbXQtMlwiPnt7IG5hbWVFcnJvciB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm10LTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInN1Yi1oZWFkZXJcIj5TY2hlZHVsZTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIHNjaGVkdWxlLXJvdy1nYXBcIj5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImQtaW5saW5lLWJsb2NrIHNjaGVkdWxlLWZyZXFcIiBbY2xhc3MuZmxleC1ncm93LTFdPVwiZnJlcXVlbmN5ID09PSAnZGFpbHknXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBuZ2JEcm9wZG93blRvZ2dsZSBbZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyBzY2hlZHVsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJzY2hlZHVsZS1jaGV2cm9uXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdkYWlseScpXCI+RGFpbHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCd3ZWVrbHknKVwiPldlZWtseTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25JdGVtIChjbGljayk9XCJzZWxlY3RGcmVxdWVuY3koJ21vbnRobHknKVwiPk1vbnRobHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdvbmNlJylcIj5Eb2VzIE5vdCBSZXBlYXQ8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgc2NoZWR1bGUtcGlja1wiICpuZ0lmPVwiZnJlcXVlbmN5ID09PSAnd2Vla2x5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGUgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFkYXlzT2ZXZWVrLmxlbmd0aFwiIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG11bHRpU2VsZWN0TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgY2xhc3M9XCJjaGVja2JveC1kcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkIHB4LTMgcHktMVwiICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5T3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgW2lkXT1cIidkYXktJyArIGRheS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0RheVNlbGVjdGVkKGRheS52YWx1ZSlcIiAoY2hhbmdlKT1cInRvZ2dsZURheShkYXkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBjdXJzb3ItcG9pbnRlclwiIFtmb3JdPVwiJ2RheS0nICsgZGF5LnZhbHVlXCI+e3sgZGF5LmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERvZXMgTm90IFJlcGVhdDogYSByZWFsIGRhdGUgcGlja2VyLCBmdXR1cmUgZGF0ZXMgb25seSAobWluID0gdG9tb3Jyb3c7XG4gICAgICAgICAgICAgdG9kYXkgaXRzZWxmIGlzIHJlc3RyaWN0ZWQgLS0gcHJvZHVjdCBydWxlIDIwMjYtMDgtMzEpLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjaGVkdWxlLXBpY2tcIiAqbmdJZj1cImZyZXF1ZW5jeSA9PT0gJ29uY2UnXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBbbWluXT1cIm1pbk9uY2VEYXRlXCIgW2Rpc2FibGVkXT1cIiFlZGl0TW9kZVwiIFsobmdNb2RlbCldPVwib25jZURhdGVcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCIgY2xhc3M9XCJkLWlubGluZS1ibG9jayBzY2hlZHVsZS1waWNrXCIgKm5nSWY9XCJmcmVxdWVuY3kgPT09ICdtb250aGx5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGUgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFkYXRlc09mTW9udGgubGVuZ3RoXCIgW2Rpc2FibGVkXT1cIiFlZGl0TW9kZVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgbXVsdGlTZWxlY3RMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwic2NoZWR1bGUtY2hldnJvblwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cImNoZWNrYm94LWRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWQgcHgtMyBweS0xXCIgKm5nRm9yPVwibGV0IGRhdGUgb2YgZGF0ZU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPCEtLSBEb2VzIE5vdCBSZXBlYXQ6IGRheXMgYWxyZWFkeSBwYXN0IHRoaXMgbW9udGggYXJlIGRpc2FibGVkLiAtLT5cbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInZGF0ZS0nICsgZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0RhdGVTZWxlY3RlZChkYXRlKVwiIChjaGFuZ2UpPVwidG9nZ2xlRGF0ZShkYXRlKVwiIC8+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidkYXRlLScgKyBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtbXV0ZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzRGF0ZURpc2FibGVkKGRhdGUpID8gJ1Bhc3QgZGF0ZXMgY2Fubm90IGJlIHNjaGVkdWxlZCcgOiAnJ1wiPnt7IGRhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ViLWhlYWRlciBtYi0wIHNjaGVkdWxlLWF0XCI+YXQ8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNjaGVkdWxlLXNlbGVjdCB0aW1lLXNlbGVjdFwiIFsobmdNb2RlbCldPVwidGltZVwiIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiB0aW1lT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQudmFsdWUgfX08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInRpbWUtaWNvblwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA1VjEwTDEzLjMzMzMgMTEuNjY2N00xOC4zMzMzIDEwQzE4LjMzMzMgMTQuNjAyNCAxNC42MDI0IDE4LjMzMzMgMTAgMTguMzMzM0M1LjM5NzYzIDE4LjMzMzMgMS42NjY2NyAxNC42MDI0IDEuNjY2NjcgMTBDMS42NjY2NyA1LjM5NzYzIDUuMzk3NjMgMS42NjY2NyAxMCAxLjY2NjY3QzE0LjYwMjQgMS42NjY2NyAxOC4zMzMzIDUuMzk3NjMgMTguMzMzMyAxMFpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzY2hlZHVsZS1oZWxwZXIgbXQtMlwiICpuZ0lmPVwiaGVscGVyVGV4dFwiPnt7IGhlbHBlclRleHQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCI+RmlsZSBUeXBlPC9sYWJlbD5cbiAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWJsb2NrIG10LTJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBuZ2JEcm9wZG93blRvZ2dsZSBbY2xhc3MuaXMtcGxhY2Vob2xkZXJdPVwiIWZpbGVUeXBlXCIgW2Rpc2FibGVkXT1cIiFlZGl0TW9kZVwiPlxuICAgICAgICAgIDxzcGFuPnt7IGZpbGVUeXBlTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJzY2hlZHVsZS1jaGV2cm9uXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25JdGVtIChjbGljayk9XCJzZWxlY3RGaWxlVHlwZSgnY3N2JylcIj5DU1Y8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrKT1cInNlbGVjdEZpbGVUeXBlKCd4bHN4JylcIj5YTFNYPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXQtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwic3ViLWhlYWRlclwiIGZvcj1cInNjaGVkdWxlLXJlY2VpdmVyc1wiPlJlY2VpdmVycyBFbWFpbCA8c3BhbiBjbGFzcz1cInNjaGVkdWxlLXJlcXVpcmVkXCI+Kjwvc3Bhbj48L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbCBtdC0yIGQtZmxleCBmbGV4LXdyYXAgYWxpZ24taXRlbXMtc3RhcnQgc2NoZWR1bGUtcmVjZWl2ZXJzLWJveCBzY2hlZHVsZS1maWVsZC1ib3hcIlxuICAgICAgICAgICBbY2xhc3Muc2NoZWR1bGUtYm94LWRpc2FibGVkXT1cIiFlZGl0TW9kZVwiPlxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZW1haWwgb2YgZW1haWxMaXN0OyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodCBkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIHt7IGVtYWlsIH19XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJlZGl0TW9kZVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbXMtMlwiIChjbGljayk9XCJyZW1vdmVDaGlwKGkpXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8IS0tIGF1dG9jb21wbGV0ZT1cIm9mZlwiOiBDaHJvbWUgb3RoZXJ3aXNlIGF1dG9maWxscyB0aGUganVzdC1hZGRlZCBhZGRyZXNzIGJhY2tcbiAgICAgICAgICAgICBpbnRvIHRoZSBmaWVsZCAoYmx1ZSBhdXRvZmlsbCBiYWNrZ3JvdW5kKSBhZnRlciBFbnRlciBjbGVhcnMgaXQuIC0tPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgaWQ9XCJzY2hlZHVsZS1yZWNlaXZlcnNcIiBjbGFzcz1cImJvcmRlci0wIGZsZXgtZ3Jvdy0xIHNjaGVkdWxlLWVtYWlsLWlucHV0XCJcbiAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGF1dG9jYXBpdGFsaXplPVwib2ZmXCIgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIlxuICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZW1haWxWYWxpZGF0aW9uLmluY2x1ZGVzKGZhbHNlKVwiIGNsYXNzPVwidGV4dC1kYW5nZXIgbXQtMlwiPkludmFsaWQgRW1haWwgRm9ybWF0PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG10LThcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIHNjaGVkdWxlLWJ0bi1jYW5jZWwgdy01MCBtZS0yXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDwhLS0gVmlldyBtb2RlIChleGlzdGluZyBzY2hlZHVsZSk6IHBhbGUtYmx1ZSBFZGl0IHVubG9ja3MgdGhlIGZpZWxkcy4gLS0+XG4gICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRNb2RlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIHNjaGVkdWxlLWJ0bi1lZGl0IHctNTAgbXMtMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdE1vZGUgPSB0cnVlXCI+XG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTkgMTlcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMlwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOC4yNSAyLjUxNzc3SDIuNDE2NjdDMS45NzQ2NCAyLjUxNzc3IDEuNTUwNzIgMi42OTMzNiAxLjIzODE2IDMuMDA1OTJDMC45MjU1OTUgMy4zMTg0OCAwLjc1IDMuNzQyNDEgMC43NSA0LjE4NDQzVjE1Ljg1MTFDMC43NSAxNi4yOTMxIDAuOTI1NTk1IDE2LjcxNzEgMS4yMzgxNiAxNy4wMjk2QzEuNTUwNzIgMTcuMzQyMiAxLjk3NDY0IDE3LjUxNzggMi40MTY2NyAxNy41MTc4SDE0LjA4MzNDMTQuNTI1NCAxNy41MTc4IDE0Ljk0OTMgMTcuMzQyMiAxNS4yNjE4IDE3LjAyOTZDMTUuNTc0NCAxNi43MTcxIDE1Ljc1IDE2LjI5MzEgMTUuNzUgMTUuODUxMVYxMC4wMTc4TTE0LjUgMS4yNjc3N0MxNC44MzE1IDAuOTM2MjQ2IDE1LjI4MTIgMC43NSAxNS43NSAwLjc1QzE2LjIxODggMC43NSAxNi42Njg1IDAuOTM2MjQ2IDE3IDEuMjY3NzdDMTcuMzMxNSAxLjU5OTI5IDE3LjUxNzggMi4wNDg5MyAxNy41MTc4IDIuNTE3NzdDMTcuNTE3OCAyLjk4NjYxIDE3LjMzMTUgMy40MzYyNSAxNyAzLjc2Nzc3TDkuMDgzMzMgMTEuNjg0NEw1Ljc1IDEyLjUxNzhMNi41ODMzMyA5LjE4NDQzTDE0LjUgMS4yNjc3N1pcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIEVkaXRcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRNb2RlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHNjaGVkdWxlLWJ0bi1zYXZlIHctNTAgbXMtMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNTYXZlRGlzYWJsZWRcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzU2F2ZURpc2FibGVkXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwibWUtMlwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxNy41VjExLjY2NjdDMTcuNSAxMS4yMjQ2IDE3LjMyNDQgMTAuODAwNyAxNy4wMTE4IDEwLjQ4ODJDMTYuNjk5MyAxMC4xNzU2IDE2LjI3NTQgMTAgMTUuODMzMyAxMEg0LjE2NjY3QzMuNzI0NjQgMTAgMy4zMDA3MiAxMC4xNzU2IDIuOTg4MTYgMTAuNDg4MkMyLjY3NTU5IDEwLjgwMDcgMi41IDExLjIyNDYgMi41IDExLjY2NjdWMTcuNU0xNy41IDE3LjVIMi41TTE3LjUgMTcuNVY2LjE2NjY3QzE3LjUgNS42OTk5NiAxNy41IDUuNDY2NiAxNy40MDkyIDUuMjg4MzRDMTcuMzI5MyA1LjEzMTU0IDE3LjIwMTggNS4wMDQwNSAxNy4wNDUgNC45MjQxNkMxNi44NjY4IDQuODMzMzMgMTYuNjMzNCA0LjgzMzMzIDE2LjE2NjcgNC44MzMzM0gxMi41TTIuNSAxNy41VjQuMTY2NjdDMi41IDMuNjk5OTYgMi41IDMuNDY2NiAyLjU5MDgzIDMuMjg4MzRDMi42NzA3MiAzLjEzMTU0IDIuNzk4MjEgMy4wMDQwNSAyLjk1NTAxIDIuOTI0MTZDMy4xMzMyNyAyLjgzMzMzIDMuMzY2NjIgMi44MzMzMyAzLjgzMzMzIDIuODMzMzNIMTAuODMzM00xMi41IDQuODMzMzNWMi44MzMzM00xMi41IDQuODMzMzNIMTAuODMzM00xMi41IDIuODMzMzNIMTAuODMzM00xMC44MzMzIDIuODMzMzNWNC44MzMzM002LjY2NjY3IDYuNjY2NjdIOS4xNjY2N1wiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIFNhdmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==