primekit 0.0.64 → 0.0.65

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.
@@ -12,14 +12,18 @@ export class AtomixDaterangeCalendarComponent {
12
12
  styleClass = '';
13
13
  selectionMode = 'range';
14
14
  inputStyleClass = '';
15
+ inline = false;
15
16
  disabled = false;
16
17
  selectedDate = null;
17
18
  maxDate;
18
19
  minDate;
20
+ defaultPreset = null;
19
21
  customRangeMode = false;
20
- selectedPreset = null; // 'today' | 'yesterday' | 'lastWeek' | 'lastMonth' | 'lastQuarter' | 'custom' | null
22
+ selectedPreset = null; // 'today' | 'yesterday' | 'last7days' | 'last30days' | 'last3months' | 'last6months' | 'custom' | null
21
23
  overlayPanel;
22
24
  dateRangeChange = new EventEmitter();
25
+ // internal model bound to p-calendar to avoid changing external selection during first-click selection
26
+ modelDate = null;
23
27
  enLocale = {
24
28
  firstDayOfWeek: 0,
25
29
  dayNames: [
@@ -64,18 +68,31 @@ export class AtomixDaterangeCalendarComponent {
64
68
  today: 'Today',
65
69
  clear: 'Clear',
66
70
  };
71
+ // temporary storage for overlay session
72
+ _overlayInitialDate = null;
73
+ _overlayInitialPreset = null;
67
74
  constructor(datePipe) {
68
75
  this.datePipe = datePipe;
69
76
  }
77
+ ngOnInit() {
78
+ if (!this.selectedDate && this.defaultPreset) {
79
+ this.applyPreset(this.defaultPreset);
80
+ }
81
+ // initialize internal model
82
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
83
+ }
70
84
  ngOnChanges(changes) {
71
85
  if (changes['selectedDate']) {
72
86
  const sel = changes['selectedDate'].currentValue;
73
87
  if (sel && Array.isArray(sel) && sel.length === 2 && sel[0] && sel[1]) {
74
88
  const preset = this.detectPreset(sel[0], sel[1]);
75
89
  this.selectedPreset = preset ?? 'custom';
90
+ // sync internal model when external value changes
91
+ this.modelDate = [...sel];
76
92
  }
77
93
  else if (sel == null) {
78
94
  this.selectedPreset = null;
95
+ this.modelDate = null;
79
96
  }
80
97
  }
81
98
  }
@@ -88,17 +105,71 @@ export class AtomixDaterangeCalendarComponent {
88
105
  event.preventDefault();
89
106
  }
90
107
  }
91
- clearAndStop(event) {
92
- // Prevent toggle from happening when clear icon is clicked
93
- try {
94
- event.stopPropagation();
108
+ onOverlayShow() {
109
+ // store a deep copy of current selection/preset when overlay opens
110
+ if (this.selectedDate && Array.isArray(this.selectedDate)) {
111
+ this._overlayInitialDate = this.selectedDate.map(d => (d ? new Date(d.getFullYear(), d.getMonth(), d.getDate()) : d));
95
112
  }
96
- catch (e) { }
97
- try {
98
- event.preventDefault();
113
+ else {
114
+ this._overlayInitialDate = null;
115
+ }
116
+ this._overlayInitialPreset = this.selectedPreset;
117
+ // ensure calendar model shows the currently committed selection when opening
118
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
119
+ // ensure preset buttons reflect current selection when overlay opens
120
+ if (this.selectedDate && Array.isArray(this.selectedDate) && this.selectedDate.length === 2) {
121
+ const preset = this.detectPreset(this.selectedDate[0], this.selectedDate[1]);
122
+ this.selectedPreset = preset ?? 'custom';
123
+ }
124
+ else if (!this.selectedDate) {
125
+ this.selectedPreset = null;
126
+ }
127
+ }
128
+ onOverlayHide() {
129
+ // if internal calendar model has an incomplete selection (partial range) revert to initial
130
+ const model = this.modelDate;
131
+ const isPartialModel = Boolean(model && Array.isArray(model) && model.length === 1 && !!model[0] && !model[1]);
132
+ if (isPartialModel) {
133
+ this.selectedDate = this._overlayInitialDate;
134
+ this.selectedPreset = this._overlayInitialPreset;
135
+ // emit the reverted value so parent syncs
136
+ this.dateRangeChange.emit(this.selectedDate);
137
+ // reset internal model to synced value
138
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
139
+ }
140
+ this._overlayInitialDate = null;
141
+ this._overlayInitialPreset = null;
142
+ this.customRangeMode = false;
143
+ }
144
+ onModelChange(dateRange) {
145
+ // When user clicks a first date, PrimeNG may emit an array with 1 value. We don't want to
146
+ // update the external selectedDate until the range is completed (two dates) so that
147
+ // the calendar does not jump back to a previously selected end date's month.
148
+ this.modelDate = dateRange ? [...dateRange] : null;
149
+ if (dateRange && Array.isArray(dateRange) && dateRange.length === 2 && dateRange[0] && dateRange[1]) {
150
+ this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
151
+ this.customRangeMode = false;
152
+ this.selectedDate = [...dateRange];
153
+ this.dateRangeChange.emit(this.selectedDate);
154
+ // close overlay like when applying a preset
155
+ try {
156
+ this.overlayPanel?.hide();
157
+ }
158
+ catch (e) { }
159
+ }
160
+ else if (!dateRange) {
161
+ // cleared selection
162
+ this.selectedPreset = null;
163
+ this.customRangeMode = false;
164
+ this.selectedDate = null;
165
+ this.dateRangeChange.emit(null);
166
+ }
167
+ else {
168
+ // single date selecting (partial range) - do not emit change yet; just keep internal model
169
+ // so the calendar's view remains where the user navigated to.
170
+ this.selectedPreset = null;
171
+ this.customRangeMode = false;
99
172
  }
100
- catch (e) { }
101
- this.clearDateRange();
102
173
  }
103
174
  get hasSelection() {
104
175
  return Boolean(this.selectedDate &&
@@ -127,30 +198,30 @@ export class AtomixDaterangeCalendarComponent {
127
198
  y.setDate(y.getDate() - 1);
128
199
  if (this.isSameDate(start, y) && this.isSameDate(end, y))
129
200
  return 'yesterday';
130
- // lastWeek (last 7 days where end = yesterday and start = end - 6)
131
- const lwEnd = new Date(today);
132
- lwEnd.setDate(lwEnd.getDate() - 1);
133
- const lwStart = new Date(lwEnd);
134
- lwStart.setDate(lwEnd.getDate() - 6);
135
- if (this.isSameDate(start, lwStart) && this.isSameDate(end, lwEnd))
136
- return 'lastWeek';
137
- // lastMonth
138
- const firstDayOfCurrentMonth = new Date(today.getFullYear(), today.getMonth(), 1);
139
- const lastDayOfPrevMonth = new Date(firstDayOfCurrentMonth);
140
- lastDayOfPrevMonth.setDate(0);
141
- const firstDayOfPrevMonth = new Date(lastDayOfPrevMonth.getFullYear(), lastDayOfPrevMonth.getMonth(), 1);
142
- if (this.isSameDate(start, firstDayOfPrevMonth) &&
143
- this.isSameDate(end, lastDayOfPrevMonth))
144
- return 'lastMonth';
145
- // lastQuarter
146
- const month = today.getMonth();
147
- const quarter = Math.floor(month / 3);
148
- const prevQuarterEndMonth = quarter * 3 - 1;
149
- const prevQuarterEnd = new Date(today.getFullYear(), prevQuarterEndMonth + 1, 0);
150
- const prevQuarterStartMonth = prevQuarterEndMonth - 2;
151
- const prevQuarterStart = new Date(today.getFullYear(), prevQuarterStartMonth, 1);
152
- if (this.isSameDate(start, prevQuarterStart) && this.isSameDate(end, prevQuarterEnd))
153
- return 'lastQuarter';
201
+ // last7days (last 7 days including today: start = today - 6, end = today)
202
+ const l7End = new Date(today);
203
+ const l7Start = new Date(today);
204
+ l7Start.setDate(today.getDate() - 6);
205
+ if (this.isSameDate(start, l7Start) && this.isSameDate(end, l7End))
206
+ return 'last7days';
207
+ // last30days (last 30 days including today: start = today - 29, end = today)
208
+ const l30End = new Date(today);
209
+ const l30Start = new Date(today);
210
+ l30Start.setDate(today.getDate() - 29);
211
+ if (this.isSameDate(start, l30Start) && this.isSameDate(end, l30End))
212
+ return 'last30days';
213
+ // last3months (last 3 months including today: start = today - 3 months, end = today)
214
+ const l3mEnd = new Date(today);
215
+ const l3mStart = new Date(today);
216
+ l3mStart.setMonth(today.getMonth() - 3);
217
+ if (this.isSameDate(start, l3mStart) && this.isSameDate(end, l3mEnd))
218
+ return 'last3months';
219
+ // last6months (last 6 months including today: start = today - 6 months, end = today)
220
+ const l6mEnd = new Date(today);
221
+ const l6mStart = new Date(today);
222
+ l6mStart.setMonth(today.getMonth() - 6);
223
+ if (this.isSameDate(start, l6mStart) && this.isSameDate(end, l6mEnd))
224
+ return 'last6months';
154
225
  return null;
155
226
  }
156
227
  clearDateRange() {
@@ -158,6 +229,7 @@ export class AtomixDaterangeCalendarComponent {
158
229
  this.dateRangeChange.emit(this.selectedDate);
159
230
  this.selectedPreset = null;
160
231
  this.customRangeMode = false;
232
+ this.modelDate = null;
161
233
  }
162
234
  resetAndClose() {
163
235
  this.clearDateRange();
@@ -174,6 +246,8 @@ export class AtomixDaterangeCalendarComponent {
174
246
  this.selectedPreset = 'custom';
175
247
  }
176
248
  applyCustomRange() {
249
+ // ensure external selectedDate is in sync with internal model
250
+ this.selectedDate = this.modelDate ? [...this.modelDate] : null;
177
251
  this.dateRangeChange.emit(this.selectedDate);
178
252
  if (this.overlayPanel) {
179
253
  try {
@@ -185,14 +259,24 @@ export class AtomixDaterangeCalendarComponent {
185
259
  this.selectedPreset = 'custom';
186
260
  }
187
261
  getDateRangeLabel() {
188
- if (!this.selectedDate || !Array.isArray(this.selectedDate))
189
- return this.placeholder || 'Select date range';
190
- const [start, end] = this.selectedDate;
191
- if (!start || !end)
192
- return 'Select date range';
193
- const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
194
- const endStr = this.datePipe.transform(end, 'MM/dd/yyyy');
195
- return `${startStr} ${endStr}`;
262
+ // Check the internal model first to show real-time updates while selecting
263
+ const dateArray = this.modelDate || this.selectedDate;
264
+ if (!dateArray || !Array.isArray(dateArray))
265
+ return '';
266
+ const [start, end] = dateArray;
267
+ const arrow = '\u2794';
268
+ // Show just the first date with an arrow if only first date is selected
269
+ if (start && !end) {
270
+ const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
271
+ return `${startStr} ${arrow} `;
272
+ }
273
+ // Show the complete range if both dates are selected
274
+ if (start && end) {
275
+ const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
276
+ const endStr = this.datePipe.transform(end, 'MM/dd/yyyy');
277
+ return `${startStr} ${arrow} ${endStr}`;
278
+ }
279
+ return '';
196
280
  }
197
281
  applyPreset(preset) {
198
282
  const today = new Date();
@@ -207,33 +291,28 @@ export class AtomixDaterangeCalendarComponent {
207
291
  y.setDate(y.getDate() - 1);
208
292
  start = end = new Date(y.getFullYear(), y.getMonth(), y.getDate());
209
293
  break;
210
- case 'lastWeek': {
211
- const lwEnd = new Date(today);
212
- lwEnd.setDate(lwEnd.getDate() - 1);
213
- const lwStart = new Date(lwEnd);
214
- lwStart.setDate(lwEnd.getDate() - 6);
215
- start = new Date(lwStart.getFullYear(), lwStart.getMonth(), lwStart.getDate());
216
- end = new Date(lwEnd.getFullYear(), lwEnd.getMonth(), lwEnd.getDate());
294
+ case 'last7days': {
295
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
296
+ start = new Date(end);
297
+ start.setDate(end.getDate() - 6);
217
298
  break;
218
299
  }
219
- case 'lastMonth': {
220
- const firstDayOfCurrentMonth = new Date(today.getFullYear(), today.getMonth(), 1);
221
- const lastDayOfPrevMonth = new Date(firstDayOfCurrentMonth);
222
- lastDayOfPrevMonth.setDate(0);
223
- const firstDayOfPrevMonth = new Date(lastDayOfPrevMonth.getFullYear(), lastDayOfPrevMonth.getMonth(), 1);
224
- start = new Date(firstDayOfPrevMonth.getFullYear(), firstDayOfPrevMonth.getMonth(), 1);
225
- end = new Date(lastDayOfPrevMonth.getFullYear(), lastDayOfPrevMonth.getMonth(), lastDayOfPrevMonth.getDate());
300
+ case 'last30days': {
301
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
302
+ start = new Date(end);
303
+ start.setDate(end.getDate() - 29);
226
304
  break;
227
305
  }
228
- case 'lastQuarter': {
229
- const month = today.getMonth();
230
- const quarter = Math.floor(month / 3);
231
- const prevQuarterEndMonth = quarter * 3 - 1;
232
- const prevQuarterEnd = new Date(today.getFullYear(), prevQuarterEndMonth + 1, 0);
233
- const prevQuarterStartMonth = prevQuarterEndMonth - 2;
234
- const prevQuarterStart = new Date(today.getFullYear(), prevQuarterStartMonth, 1);
235
- start = prevQuarterStart;
236
- end = prevQuarterEnd;
306
+ case 'last3months': {
307
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
308
+ start = new Date(end);
309
+ start.setMonth(end.getMonth() - 3);
310
+ break;
311
+ }
312
+ case 'last6months': {
313
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
314
+ start = new Date(end);
315
+ start.setMonth(end.getMonth() - 6);
237
316
  break;
238
317
  }
239
318
  default:
@@ -241,6 +320,7 @@ export class AtomixDaterangeCalendarComponent {
241
320
  }
242
321
  if (start && end) {
243
322
  this.selectedDate = [start, end];
323
+ this.modelDate = [start, end];
244
324
  this.dateRangeChange.emit(this.selectedDate);
245
325
  this.selectedPreset = preset;
246
326
  this.customRangeMode = false;
@@ -262,11 +342,11 @@ export class AtomixDaterangeCalendarComponent {
262
342
  }
263
343
  }
264
344
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AtomixDaterangeCalendarComponent, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component });
265
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AtomixDaterangeCalendarComponent, selector: "atomix-daterange-calendar", inputs: { placeholder: "placeholder", styleClass: "styleClass", selectionMode: "selectionMode", inputStyleClass: "inputStyleClass", disabled: "disabled", selectedDate: "selectedDate", maxDate: "maxDate", minDate: "minDate" }, outputs: { dateRangeChange: "dateRangeChange" }, viewQueries: [{ propertyName: "overlayPanel", first: true, predicate: ["op"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\n <div class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (click)=\"op.toggle($event)\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i *ngIf=\"hasSelection\" class=\"pi pi-times input-clear-icon\" title=\"Clear\" tabindex=\"0\" (click)=\"clearAndStop($event)\" (keydown.enter)=\"clearAndStop($event)\" (keydown.space)=\"clearAndStop($event)\"></i>\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\" (click)=\"op.toggle($event)\"></i>\n </div>\n <p-overlayPanel #op [dismissable]=\"true\" appendTo=\"body\" styleClass=\"atomix-date-range-overlay\">\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('lastWeek')\" [ngClass]=\"{ 'active': selectedPreset === 'lastWeek' }\" label=\"Last week\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('lastMonth')\" [ngClass]=\"{ 'active': selectedPreset === 'lastMonth' }\" label=\"Last month\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('lastQuarter')\" [ngClass]=\"{ 'active': selectedPreset === 'lastQuarter' }\" label=\"Last quarter\"></button>\n <!-- <button pButton pRipple type=\"button\" class=\"preset-btn p-button-outlined\" (click)=\"toggleCustomRange()\" [ngClass]=\"{ 'custom-active': customRangeMode }\" label=\"Custom range\"></button> -->\n </div>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"selectedDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onDateRangeChange($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></p-calendar>\n <!-- <div class=\"overlay-actions\" *ngIf=\"!inline\">\n <button pButton pRipple type=\"button\" class=\"p-button-help p-button-sm\" (click)=\"applyCustomRange()\">Apply</button>\n <button pButton pRipple type=\"button\" class=\"p-button-text p-button-sm\" (click)=\"resetAndClose()\">Cancel</button>\n </div> -->\n </div>\n </div>\n </p-overlayPanel>\n</div>\n", styles: ["::ng-deep .p-calendar{button{background-color:transparent!important}}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding-right:.75rem;display:flex;flex-direction:column;gap:.5rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;width:100%;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:48px;border-radius:30px}.input-icon{cursor:pointer;color:#0000008a;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:#0000008a;position:absolute;right:36px}.preset-list{display:flex;flex-direction:column;gap:.5rem;padding:0;margin:0 0 6rem}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:#111827}.preset-btn:hover{background-color:#f3f6f9}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#e6f4ea!important;border-color:#63b77e!important;color:#063f23!important;font-weight:600}.reset-link{text-align:center;cursor:pointer}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i5.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
345
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AtomixDaterangeCalendarComponent, selector: "atomix-daterange-calendar", inputs: { placeholder: "placeholder", styleClass: "styleClass", selectionMode: "selectionMode", inputStyleClass: "inputStyleClass", inline: "inline", disabled: "disabled", selectedDate: "selectedDate", maxDate: "maxDate", minDate: "minDate", defaultPreset: "defaultPreset" }, outputs: { dateRangeChange: "dateRangeChange" }, viewQueries: [{ propertyName: "overlayPanel", first: true, predicate: ["overlayPanel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\n <ng-container *ngIf=\"!inline; else inlineBlock\">\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (click)=\"overlayPanel?.toggle($event)\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\" (click)=\"overlayPanel?.toggle($event)\"></i>\n </div>\n\n <p-overlayPanel #overlayPanel [dismissable]=\"true\" appendTo=\"body\" styleClass=\"atomix-date-range-overlay\" (onShow)=\"onOverlayShow()\" (onHide)=\"onOverlayHide()\">\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last7days')\" [ngClass]=\"{ 'active': selectedPreset === 'last7days' }\" label=\"Last 7 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last30days')\" [ngClass]=\"{ 'active': selectedPreset === 'last30days' }\" label=\"Last 30 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last3months')\" [ngClass]=\"{ 'active': selectedPreset === 'last3months' }\" label=\"Last 3 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last6months')\" [ngClass]=\"{ 'active': selectedPreset === 'last6months' }\" label=\"Last 6 months\"></button>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"modelDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onModelChange($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></p-calendar>\n </div>\n </div>\n </p-overlayPanel>\n </ng-container>\n\n <ng-template #inlineBlock>\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\n </div>\n <div class=\"overlay-inner inline-calendar flex\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last7days')\" [ngClass]=\"{ 'active': selectedPreset === 'last7days' }\" label=\"Last 7 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last30days')\" [ngClass]=\"{ 'active': selectedPreset === 'last30days' }\" label=\"Last 30 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last3months')\" [ngClass]=\"{ 'active': selectedPreset === 'last3months' }\" label=\"Last 3 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last6months')\" [ngClass]=\"{ 'active': selectedPreset === 'last6months' }\" label=\"Last 6 months\"></button>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"modelDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onModelChange($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></p-calendar>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: ["::ng-deep .p-calendar{button{background-color:transparent!important}}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 4rem;text-align:center;border-right:1px solid #e5e5e5}.input-wrapper{display:flex;align-items:center;gap:.5rem;width:100%!important;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:25px!important;border-radius:30px;width:100%!important}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:#0000008a;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:#0000008a;position:absolute;right:36px}.preset-list{display:flex;flex-direction:column;gap:.2rem}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:#111827}.preset-btn:hover{background-color:#f3f6f9}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:12px}.reset-link{text-align:left;cursor:pointer;margin-top:25px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}::ng-deep .p-datepicker{border:none!important;border-radius:8px}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:#000000de;font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none;border:1px solid transparent}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:8px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i5.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
266
346
  }
267
347
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AtomixDaterangeCalendarComponent, decorators: [{
268
348
  type: Component,
269
- args: [{ selector: 'atomix-daterange-calendar', template: "<div>\n <div class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (click)=\"op.toggle($event)\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i *ngIf=\"hasSelection\" class=\"pi pi-times input-clear-icon\" title=\"Clear\" tabindex=\"0\" (click)=\"clearAndStop($event)\" (keydown.enter)=\"clearAndStop($event)\" (keydown.space)=\"clearAndStop($event)\"></i>\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\" (click)=\"op.toggle($event)\"></i>\n </div>\n <p-overlayPanel #op [dismissable]=\"true\" appendTo=\"body\" styleClass=\"atomix-date-range-overlay\">\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('lastWeek')\" [ngClass]=\"{ 'active': selectedPreset === 'lastWeek' }\" label=\"Last week\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('lastMonth')\" [ngClass]=\"{ 'active': selectedPreset === 'lastMonth' }\" label=\"Last month\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('lastQuarter')\" [ngClass]=\"{ 'active': selectedPreset === 'lastQuarter' }\" label=\"Last quarter\"></button>\n <!-- <button pButton pRipple type=\"button\" class=\"preset-btn p-button-outlined\" (click)=\"toggleCustomRange()\" [ngClass]=\"{ 'custom-active': customRangeMode }\" label=\"Custom range\"></button> -->\n </div>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"selectedDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onDateRangeChange($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></p-calendar>\n <!-- <div class=\"overlay-actions\" *ngIf=\"!inline\">\n <button pButton pRipple type=\"button\" class=\"p-button-help p-button-sm\" (click)=\"applyCustomRange()\">Apply</button>\n <button pButton pRipple type=\"button\" class=\"p-button-text p-button-sm\" (click)=\"resetAndClose()\">Cancel</button>\n </div> -->\n </div>\n </div>\n </p-overlayPanel>\n</div>\n", styles: ["::ng-deep .p-calendar{button{background-color:transparent!important}}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding-right:.75rem;display:flex;flex-direction:column;gap:.5rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;width:100%;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:48px;border-radius:30px}.input-icon{cursor:pointer;color:#0000008a;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:#0000008a;position:absolute;right:36px}.preset-list{display:flex;flex-direction:column;gap:.5rem;padding:0;margin:0 0 6rem}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:#111827}.preset-btn:hover{background-color:#f3f6f9}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#e6f4ea!important;border-color:#63b77e!important;color:#063f23!important;font-weight:600}.reset-link{text-align:center;cursor:pointer}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"] }]
349
+ args: [{ selector: 'atomix-daterange-calendar', template: "<div>\n <ng-container *ngIf=\"!inline; else inlineBlock\">\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (click)=\"overlayPanel?.toggle($event)\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\" (click)=\"overlayPanel?.toggle($event)\"></i>\n </div>\n\n <p-overlayPanel #overlayPanel [dismissable]=\"true\" appendTo=\"body\" styleClass=\"atomix-date-range-overlay\" (onShow)=\"onOverlayShow()\" (onHide)=\"onOverlayHide()\">\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last7days')\" [ngClass]=\"{ 'active': selectedPreset === 'last7days' }\" label=\"Last 7 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last30days')\" [ngClass]=\"{ 'active': selectedPreset === 'last30days' }\" label=\"Last 30 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last3months')\" [ngClass]=\"{ 'active': selectedPreset === 'last3months' }\" label=\"Last 3 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last6months')\" [ngClass]=\"{ 'active': selectedPreset === 'last6months' }\" label=\"Last 6 months\"></button>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"modelDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onModelChange($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></p-calendar>\n </div>\n </div>\n </p-overlayPanel>\n </ng-container>\n\n <ng-template #inlineBlock>\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\n </div>\n <div class=\"overlay-inner inline-calendar flex\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last7days')\" [ngClass]=\"{ 'active': selectedPreset === 'last7days' }\" label=\"Last 7 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last30days')\" [ngClass]=\"{ 'active': selectedPreset === 'last30days' }\" label=\"Last 30 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last3months')\" [ngClass]=\"{ 'active': selectedPreset === 'last3months' }\" label=\"Last 3 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last6months')\" [ngClass]=\"{ 'active': selectedPreset === 'last6months' }\" label=\"Last 6 months\"></button>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"modelDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onModelChange($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></p-calendar>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: ["::ng-deep .p-calendar{button{background-color:transparent!important}}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 4rem;text-align:center;border-right:1px solid #e5e5e5}.input-wrapper{display:flex;align-items:center;gap:.5rem;width:100%!important;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:25px!important;border-radius:30px;width:100%!important}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:#0000008a;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:#0000008a;position:absolute;right:36px}.preset-list{display:flex;flex-direction:column;gap:.2rem}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:#111827}.preset-btn:hover{background-color:#f3f6f9}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:12px}.reset-link{text-align:left;cursor:pointer;margin-top:25px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}::ng-deep .p-datepicker{border:none!important;border-radius:8px}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:#000000de;font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none;border:1px solid transparent}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:8px}\n"] }]
270
350
  }], ctorParameters: () => [{ type: i1.DatePipe }], propDecorators: { placeholder: [{
271
351
  type: Input
272
352
  }], styleClass: [{
@@ -275,6 +355,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
275
355
  type: Input
276
356
  }], inputStyleClass: [{
277
357
  type: Input
358
+ }], inline: [{
359
+ type: Input
278
360
  }], disabled: [{
279
361
  type: Input
280
362
  }], selectedDate: [{
@@ -283,10 +365,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
283
365
  type: Input
284
366
  }], minDate: [{
285
367
  type: Input
368
+ }], defaultPreset: [{
369
+ type: Input
286
370
  }], overlayPanel: [{
287
371
  type: ViewChild,
288
- args: ['op']
372
+ args: ['overlayPanel']
289
373
  }], dateRangeChange: [{
290
374
  type: Output
291
375
  }] } });
292
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltZWtpdC9zcmMvbGliL2xpYi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbWVraXQvc3JjL2xpYi9saWIvYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUE0QixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFTNUcsTUFBTSxPQUFPLGdDQUFnQztJQTREdkI7SUEzRFgsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixVQUFVLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLGFBQWEsR0FBWSxPQUFPLENBQUM7SUFDakMsZUFBZSxHQUFXLEVBQUUsQ0FBQztJQUM3QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFlBQVksR0FBa0IsSUFBSSxDQUFDO0lBQ25DLE9BQU8sQ0FBUTtJQUNmLE9BQU8sQ0FBUTtJQUV4QixlQUFlLEdBQVksS0FBSyxDQUFDO0lBQ2pDLGNBQWMsR0FBa0IsSUFBSSxDQUFDLENBQUMscUZBQXFGO0lBQzFHLFlBQVksQ0FBZ0I7SUFDbkMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO0lBRTlELFFBQVEsR0FBRztRQUNULGNBQWMsRUFBRSxDQUFDO1FBQ2pCLFFBQVEsRUFBRTtZQUNSLFFBQVE7WUFDUixRQUFRO1lBQ1IsU0FBUztZQUNULFdBQVc7WUFDWCxVQUFVO1lBQ1YsUUFBUTtZQUNSLFVBQVU7U0FDWDtRQUNE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Q0FBQztZQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7d0dBdlBVLGdDQUFnQzs0RkFBaEMsZ0NBQWdDLDZjQ1Q3QyxpK0ZBdUNBOzs0RkQ5QmEsZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLDJCQUEyQjs2RUFLNUIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFJVyxZQUFZO3NCQUE1QixTQUFTO3VCQUFDLElBQUk7Z0JBQ0wsZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheVBhbmVsIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXRvbWl4RGF0ZXJhbmdlQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHN0eWxlQ2xhc3M6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiAncmFuZ2UnID0gJ3JhbmdlJztcbiAgQElucHV0KCkgaW5wdXRTdHlsZUNsYXNzOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBEYXRlW10gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbWF4RGF0ZSE6IERhdGU7XG4gIEBJbnB1dCgpIG1pbkRhdGUhOiBEYXRlO1xuXG4gIGN1c3RvbVJhbmdlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZFByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vICd0b2RheScgfCAneWVzdGVyZGF5JyB8ICdsYXN0V2VlaycgfCAnbGFzdE1vbnRoJyB8ICdsYXN0UXVhcnRlcicgfCAnY3VzdG9tJyB8IG51bGxcbiAgQFZpZXdDaGlsZCgnb3AnKSBvdmVybGF5UGFuZWwhOiBPdmVybGF5UGFuZWw7XG4gIEBPdXRwdXQoKSBkYXRlUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVbXSB8IG51bGw+KCk7XG5cbiAgZW5Mb2NhbGUgPSB7XG4gICAgZmlyc3REYXlPZldlZWs6IDAsXG4gICAgZGF5TmFtZXM6IFtcbiAgICAgICdTdW5kYXknLFxuICAgICAgJ01vbmRheScsXG4gICAgICAnVHVlc2RheScsXG4gICAgICAnV2VkbmVzZGF5JyxcbiAgICAgICdUaHVyc2RheScsXG4gICAgICAnRnJpZGF5JyxcbiAgICAgICdTYXR1cmRheScsXG4gICAgXSxcbiAgICBkYXlOYW1lc1Nob3J0OiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLFxuICAgIGRheU5hbWVzTWluOiBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10sXG4gICAgbW9udGhOYW1lczogW1xuICAgICAgJ0phbnVhcnknLFxuICAgICAgJ0ZlYnJ1YXJ5JyxcbiAgICAgICdNYXJjaCcsXG4gICAgICAnQXByaWwnLFxuICAgICAgJ01heScsXG4gICAgICAnSnVuZScsXG4gICAgICAnSnVseScsXG4gICAgICAnQXVndXN0JyxcbiAgICAgICdTZXB0ZW1iZXInLFxuICAgICAgJ09jdG9iZXInLFxuICAgICAgJ05vdmVtYmVyJyxcbiAgICAgICdEZWNlbWJlcicsXG4gICAgXSxcbiAgICBtb250aE5hbWVzU2hvcnQ6IFtcbiAgICAgICdKYW4nLFxuICAgICAgJ0ZlYicsXG4gICAgICAnTWFyJyxcbiAgICAgICdBcHInLFxuICAgICAgJ01heScsXG4gICAgICAnSnVuJyxcbiAgICAgICdKdWwnLFxuICAgICAgJ0F1ZycsXG4gICAgICAnU2VwJyxcbiAgICAgICdPY3QnLFxuICAgICAgJ05vdicsXG4gICAgICAnRGVjJyxcbiAgICBdLFxuICAgIHRvZGF5OiAnVG9kYXknLFxuICAgIGNsZWFyOiAnQ2xlYXInLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10pIHtcbiAgICAgIGNvbnN0IHNlbCA9IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddLmN1cnJlbnRWYWx1ZSBhcyBEYXRlW10gfCBudWxsO1xuICAgICAgaWYgKHNlbCAmJiBBcnJheS5pc0FycmF5KHNlbCkgJiYgc2VsLmxlbmd0aCA9PT0gMiAmJiBzZWxbMF0gJiYgc2VsWzFdKSB7XG4gICAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KHNlbFswXSwgc2VsWzFdKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHByZXNldCA/PyAnY3VzdG9tJztcbiAgICAgIH0gZWxzZSBpZiAoc2VsID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbD8udG9nZ2xlKGV2ZW50IGFzIGFueSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQW5kU3RvcChldmVudDogRXZlbnQpIHtcbiAgICAvLyBQcmV2ZW50IHRvZ2dsZSBmcm9tIGhhcHBlbmluZyB3aGVuIGNsZWFyIGljb24gaXMgY2xpY2tlZFxuICAgIHRyeSB7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB9IGNhdGNoIChlKSB7fVxuICAgIHRyeSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgdGhpcy5jbGVhckRhdGVSYW5nZSgpO1xuICB9XG5cbiAgZ2V0IGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpICYmXG4gICAgICAgICh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAhISh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pWzBdICYmXG4gICAgICAgICEhKHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXSlbMV1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKGQ6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTYW1lRGF0ZShhOiBEYXRlLCBiOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEuZ2V0RnVsbFllYXIoKSA9PT0gYi5nZXRGdWxsWWVhcigpICYmXG4gICAgICBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKSAmJlxuICAgICAgYS5nZXREYXRlKCkgPT09IGIuZ2V0RGF0ZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0UHJlc2V0KHN0YXJ0UmF3OiBEYXRlLCBlbmRSYXc6IERhdGUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMubm9ybWFsaXplRGF0ZShzdGFydFJhdyk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5ub3JtYWxpemVEYXRlKGVuZFJhdyk7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLm5vcm1hbGl6ZURhdGUobmV3IERhdGUoKSk7XG4gICAgLy8gdG9kYXlcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCB0b2RheSkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgdG9kYXkpKSByZXR1cm4gJ3RvZGF5JztcbiAgICAvLyB5ZXN0ZXJkYXlcbiAgICBjb25zdCB5ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIHkuc2V0RGF0ZSh5LmdldERhdGUoKSAtIDEpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHkpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIHkpKSByZXR1cm4gJ3llc3RlcmRheSc7XG4gICAgLy8gbGFzdFdlZWsgKGxhc3QgNyBkYXlzIHdoZXJlIGVuZCA9IHllc3RlcmRheSBhbmQgc3RhcnQgPSBlbmQgLSA2KVxuICAgIGNvbnN0IGx3RW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGx3RW5kLnNldERhdGUobHdFbmQuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgY29uc3QgbHdTdGFydCA9IG5ldyBEYXRlKGx3RW5kKTtcbiAgICBsd1N0YXJ0LnNldERhdGUobHdFbmQuZ2V0RGF0ZSgpIC0gNik7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbHdTdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbHdFbmQpKSByZXR1cm4gJ2xhc3RXZWVrJztcbiAgICAvLyBsYXN0TW9udGhcbiAgICBjb25zdCBmaXJzdERheU9mQ3VycmVudE1vbnRoID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgMSk7XG4gICAgY29uc3QgbGFzdERheU9mUHJldk1vbnRoID0gbmV3IERhdGUoZmlyc3REYXlPZkN1cnJlbnRNb250aCk7XG4gICAgbGFzdERheU9mUHJldk1vbnRoLnNldERhdGUoMCk7XG4gICAgY29uc3QgZmlyc3REYXlPZlByZXZNb250aCA9IG5ldyBEYXRlKGxhc3REYXlPZlByZXZNb250aC5nZXRGdWxsWWVhcigpLCBsYXN0RGF5T2ZQcmV2TW9udGguZ2V0TW9udGgoKSwgMSk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBmaXJzdERheU9mUHJldk1vbnRoKSAmJlxuICAgICAgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbGFzdERheU9mUHJldk1vbnRoKVxuICAgIClcbiAgICAgIHJldHVybiAnbGFzdE1vbnRoJztcbiAgICAvLyBsYXN0UXVhcnRlclxuICAgIGNvbnN0IG1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKTtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5mbG9vcihtb250aCAvIDMpO1xuICAgIGNvbnN0IHByZXZRdWFydGVyRW5kTW9udGggPSBxdWFydGVyICogMyAtIDE7XG4gICAgY29uc3QgcHJldlF1YXJ0ZXJFbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCBwcmV2UXVhcnRlckVuZE1vbnRoICsgMSwgMCk7XG4gICAgY29uc3QgcHJldlF1YXJ0ZXJTdGFydE1vbnRoID0gcHJldlF1YXJ0ZXJFbmRNb250aCAtIDI7XG4gICAgY29uc3QgcHJldlF1YXJ0ZXJTdGFydCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHByZXZRdWFydGVyU3RhcnRNb250aCwgMSk7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgcHJldlF1YXJ0ZXJTdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgcHJldlF1YXJ0ZXJFbmQpKSByZXR1cm4gJ2xhc3RRdWFydGVyJztcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNsZWFyRGF0ZVJhbmdlKCkge1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICB9XG5cbiAgcmVzZXRBbmRDbG9zZSgpIHtcbiAgICB0aGlzLmNsZWFyRGF0ZVJhbmdlKCk7XG4gICAgaWYgKHRoaXMub3ZlcmxheVBhbmVsKSB7XG4gICAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbC5oaWRlKCk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQ3VzdG9tUmFuZ2UoKSB7XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSAhdGhpcy5jdXN0b21SYW5nZU1vZGU7XG4gICAgaWYgKHRoaXMuY3VzdG9tUmFuZ2VNb2RlKSB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gJ2N1c3RvbSc7XG4gIH1cblxuICBhcHBseUN1c3RvbVJhbmdlKCkge1xuICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIGlmICh0aGlzLm92ZXJsYXlQYW5lbCkge1xuICAgICAgdHJ5IHsgdGhpcy5vdmVybGF5UGFuZWwuaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSAnY3VzdG9tJztcbiAgfVxuXG4gIGdldERhdGVSYW5nZUxhYmVsKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGUgfHwgIUFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpKSByZXR1cm4gdGhpcy5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGRhdGUgcmFuZ2UnO1xuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXTtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHJldHVybiAnU2VsZWN0IGRhdGUgcmFuZ2UnO1xuICAgIGNvbnN0IHN0YXJ0U3RyID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oc3RhcnQsICdNTS9kZC95eXl5Jyk7XG4gICAgY29uc3QgZW5kU3RyID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZW5kLCAnTU0vZGQveXl5eScpO1xuICByZXR1cm4gYCR7c3RhcnRTdHJ9IOKAkyAke2VuZFN0cn1gO1xuICB9XG5cbiAgYXBwbHlQcmVzZXQocHJlc2V0OiAndG9kYXknfCd5ZXN0ZXJkYXknfCdsYXN0V2Vlayd8J2xhc3RNb250aCd8J2xhc3RRdWFydGVyJykge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBsZXQgc3RhcnQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZW5kOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgc3dpdGNoIChwcmVzZXQpIHtcbiAgICAgIGNhc2UgJ3RvZGF5JzpcbiAgICAgICAgc3RhcnQgPSBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3llc3RlcmRheSc6XG4gICAgICAgIGNvbnN0IHkgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgICAgIHkuc2V0RGF0ZSh5LmdldERhdGUoKSAtIDEpO1xuICAgICAgICBzdGFydCA9IGVuZCA9IG5ldyBEYXRlKHkuZ2V0RnVsbFllYXIoKSwgeS5nZXRNb250aCgpLCB5LmdldERhdGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGFzdFdlZWsnOiB7XG4gICAgICAgIGNvbnN0IGx3RW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgICBsd0VuZC5zZXREYXRlKGx3RW5kLmdldERhdGUoKSAtIDEpO1xuICAgICAgICBjb25zdCBsd1N0YXJ0ID0gbmV3IERhdGUobHdFbmQpO1xuICAgICAgICBsd1N0YXJ0LnNldERhdGUobHdFbmQuZ2V0RGF0ZSgpIC0gNik7XG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUobHdTdGFydC5nZXRGdWxsWWVhcigpLCBsd1N0YXJ0LmdldE1vbnRoKCksIGx3U3RhcnQuZ2V0RGF0ZSgpKTtcbiAgICAgICAgZW5kID0gbmV3IERhdGUobHdFbmQuZ2V0RnVsbFllYXIoKSwgbHdFbmQuZ2V0TW9udGgoKSwgbHdFbmQuZ2V0RGF0ZSgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0TW9udGgnOiB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZDdXJyZW50TW9udGggPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgY29uc3QgbGFzdERheU9mUHJldk1vbnRoID0gbmV3IERhdGUoZmlyc3REYXlPZkN1cnJlbnRNb250aCk7XG4gICAgICAgIGxhc3REYXlPZlByZXZNb250aC5zZXREYXRlKDApO1xuICAgICAgICBjb25zdCBmaXJzdERheU9mUHJldk1vbnRoID0gbmV3IERhdGUobGFzdERheU9mUHJldk1vbnRoLmdldEZ1bGxZZWFyKCksIGxhc3REYXlPZlByZXZNb250aC5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShmaXJzdERheU9mUHJldk1vbnRoLmdldEZ1bGxZZWFyKCksIGZpcnN0RGF5T2ZQcmV2TW9udGguZ2V0TW9udGgoKSwgMSk7XG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKGxhc3REYXlPZlByZXZNb250aC5nZXRGdWxsWWVhcigpLCBsYXN0RGF5T2ZQcmV2TW9udGguZ2V0TW9udGgoKSwgbGFzdERheU9mUHJldk1vbnRoLmdldERhdGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdFF1YXJ0ZXInOiB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKTtcbiAgICAgICAgY29uc3QgcXVhcnRlciA9IE1hdGguZmxvb3IobW9udGggLyAzKTtcbiAgICAgICAgY29uc3QgcHJldlF1YXJ0ZXJFbmRNb250aCA9IHF1YXJ0ZXIgKiAzIC0gMTtcbiAgICAgICAgY29uc3QgcHJldlF1YXJ0ZXJFbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCBwcmV2UXVhcnRlckVuZE1vbnRoICsgMSwgMCk7XG4gICAgICAgIGNvbnN0IHByZXZRdWFydGVyU3RhcnRNb250aCA9IHByZXZRdWFydGVyRW5kTW9udGggLSAyO1xuICAgICAgICBjb25zdCBwcmV2UXVhcnRlclN0YXJ0ID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgcHJldlF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgc3RhcnQgPSBwcmV2UXVhcnRlclN0YXJ0O1xuICAgICAgICBlbmQgPSBwcmV2UXVhcnRlckVuZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBbc3RhcnQsIGVuZF07XG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBwcmVzZXQ7XG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICB9XG5cbiAgb25EYXRlUmFuZ2VDaGFuZ2UoZGF0ZVJhbmdlOiBEYXRlW10gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdChkYXRlUmFuZ2UpO1xuICAgIGlmIChkYXRlUmFuZ2UgJiYgQXJyYXkuaXNBcnJheShkYXRlUmFuZ2UpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoZGF0ZVJhbmdlWzBdLCBkYXRlUmFuZ2VbMV0pO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFkYXRlUmFuZ2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXY+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cbiAgICAgIDxpbnB1dFxuICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW25nQ2xhc3NdPVwiaW5wdXRTdHlsZUNsYXNzXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3ZhbHVlXT1cImdldERhdGVSYW5nZUxhYmVsKClcIlxuICByZWFkb25seVxuICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgLz5cbiAgPGkgKm5nSWY9XCJoYXNTZWxlY3Rpb25cIiBjbGFzcz1cInBpIHBpLXRpbWVzIGlucHV0LWNsZWFyLWljb25cIiB0aXRsZT1cIkNsZWFyXCIgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cImNsZWFyQW5kU3RvcCgkZXZlbnQpXCIgKGtleWRvd24uZW50ZXIpPVwiY2xlYXJBbmRTdG9wKCRldmVudClcIiAoa2V5ZG93bi5zcGFjZSk9XCJjbGVhckFuZFN0b3AoJGV2ZW50KVwiPjwvaT5cbiAgPGkgY2xhc3M9XCJwaSBwaS1jYWxlbmRhciBpbnB1dC1pY29uXCIgdGl0bGU9XCJPcGVuIGNhbGVuZGFyXCIgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxwLW92ZXJsYXlQYW5lbCAjb3AgW2Rpc21pc3NhYmxlXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIiBzdHlsZUNsYXNzPVwiYXRvbWl4LWRhdGUtcmFuZ2Utb3ZlcmxheVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktbGVmdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXQtbGlzdFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgndG9kYXknKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAndG9kYXknIH1cIiBsYWJlbD1cIlRvZGF5XCI+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCd5ZXN0ZXJkYXknKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAneWVzdGVyZGF5JyB9XCIgbGFiZWw9XCJZZXN0ZXJkYXlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3RXZWVrJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3RXZWVrJyB9XCIgbGFiZWw9XCJMYXN0IHdlZWtcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3RNb250aCcpXCIgW25nQ2xhc3NdPVwieyAnYWN0aXZlJzogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0TW9udGgnIH1cIiBsYWJlbD1cIkxhc3QgbW9udGhcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3RRdWFydGVyJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3RRdWFydGVyJyB9XCIgbGFiZWw9XCJMYXN0IHF1YXJ0ZXJcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0biBwLWJ1dHRvbi1vdXRsaW5lZFwiIChjbGljayk9XCJ0b2dnbGVDdXN0b21SYW5nZSgpXCIgW25nQ2xhc3NdPVwieyAnY3VzdG9tLWFjdGl2ZSc6IGN1c3RvbVJhbmdlTW9kZSB9XCIgbGFiZWw9XCJDdXN0b20gcmFuZ2VcIj48L2J1dHRvbj4gLS0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGEgY2xhc3M9XCJyZXNldC1saW5rXCIgKGNsaWNrKT1cInJlc2V0QW5kQ2xvc2UoKVwiPlJlc2V0PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktcmlnaHRcIj5cbiAgICAgICAgICA8cC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGF0ZVwiIFtzZWxlY3Rpb25Nb2RlXT1cIidyYW5nZSdcIiBbaW5saW5lXT1cInRydWVcIiBbZGF0ZUZvcm1hdF09XCInbW0vZGQveXl5eSdcIiBbc2hvd090aGVyTW9udGhzXT1cInRydWVcIiBbbG9jYWxlXT1cImVuTG9jYWxlXCIgW3Nob3dJY29uXT1cImZhbHNlXCIgW3N0eWxlQ2xhc3NdPVwiJ2F0b21peC1vdmVybGF5LWNhbGVuZGFyJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGF0ZVJhbmdlQ2hhbmdlKCRldmVudClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbbWF4RGF0ZV09XCJtYXhEYXRlXCIgW21pbkRhdGVdPVwibWluRGF0ZVwiPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJvdmVybGF5LWFjdGlvbnNcIiAqbmdJZj1cIiFpbmxpbmVcIj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInAtYnV0dG9uLWhlbHAgcC1idXR0b24tc21cIiAoY2xpY2spPVwiYXBwbHlDdXN0b21SYW5nZSgpXCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc21cIiAoY2xpY2spPVwicmVzZXRBbmRDbG9zZSgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvcC1vdmVybGF5UGFuZWw+XG48L2Rpdj5cbiJdfQ==
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltZWtpdC9zcmMvbGliL2xpYi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbWVraXQvc3JjL2xpYi9saWIvYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFvQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFTcEgsTUFBTSxPQUFPLGdDQUFnQztJQXFFdkI7SUFwRVgsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUN6QixVQUFVLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLGFBQWEsR0FBWSxPQUFPLENBQUM7SUFDakMsZUFBZSxHQUFXLEVBQUUsQ0FBQztJQUM3QixNQUFNLEdBQVksS0FBSyxDQUFDO0lBQ3hCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDMUIsWUFBWSxHQUFrQixJQUFJLENBQUM7SUFDbkMsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsYUFBYSxHQUE4RixJQUFJLENBQUM7SUFFekgsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxjQUFjLEdBQWtCLElBQUksQ0FBQyxDQUFDLHVHQUF1RztJQUNsSCxZQUFZLENBQWdCO0lBQzdDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUU5RCx1R0FBdUc7SUFDdkcsU0FBUyxHQUFrQixJQUFJLENBQUM7SUFFaEMsUUFBUSxHQUFHO1FBQ1QsY0FBYyxFQUFFLENBQUM7UUFD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SSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsSUFBSSxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDL0IsQ0FBQzthQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQzt3R0E1VVUsZ0NBQWdDOzRGQUFoQyxnQ0FBZ0MseWdCQ1Q3Qyx1NEpBcUVBOzs0RkQ1RGEsZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLDJCQUEyQjs2RUFLNUIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFJcUIsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNmLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheVBhbmVsIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXRvbWl4RGF0ZXJhbmdlQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc3R5bGVDbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlbGVjdGlvbk1vZGU6ICdyYW5nZScgPSAncmFuZ2UnO1xuICBASW5wdXQoKSBpbnB1dFN0eWxlQ2xhc3M6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBEYXRlW10gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbWF4RGF0ZSE6IERhdGU7XG4gIEBJbnB1dCgpIG1pbkRhdGUhOiBEYXRlO1xuICBASW5wdXQoKSBkZWZhdWx0UHJlc2V0OiAndG9kYXknIHwgJ3llc3RlcmRheScgfCAnbGFzdDdkYXlzJyB8ICdsYXN0MzBkYXlzJyB8ICdsYXN0M21vbnRocycgfCAnbGFzdDZtb250aHMnIHwgbnVsbCA9IG51bGw7XG5cbiAgY3VzdG9tUmFuZ2VNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkUHJlc2V0OiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gJ3RvZGF5JyB8ICd5ZXN0ZXJkYXknIHwgJ2xhc3Q3ZGF5cycgfCAnbGFzdDMwZGF5cycgfCAnbGFzdDNtb250aHMnIHwgJ2xhc3Q2bW9udGhzJyB8ICdjdXN0b20nIHwgbnVsbFxuICBAVmlld0NoaWxkKCdvdmVybGF5UGFuZWwnKSBvdmVybGF5UGFuZWw/OiBPdmVybGF5UGFuZWw7XG4gIEBPdXRwdXQoKSBkYXRlUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVbXSB8IG51bGw+KCk7XG5cbiAgLy8gaW50ZXJuYWwgbW9kZWwgYm91bmQgdG8gcC1jYWxlbmRhciB0byBhdm9pZCBjaGFuZ2luZyBleHRlcm5hbCBzZWxlY3Rpb24gZHVyaW5nIGZpcnN0LWNsaWNrIHNlbGVjdGlvblxuICBtb2RlbERhdGU6IERhdGVbXSB8IG51bGwgPSBudWxsO1xuXG4gIGVuTG9jYWxlID0ge1xuICAgIGZpcnN0RGF5T2ZXZWVrOiAwLFxuICAgIGRheU5hbWVzOiBbXG4gICAgICAnU3VuZGF5JyxcbiAgICAgICdNb25kYXknLFxuICAgICAgJ1R1ZXNkYXknLFxuICAgICAgJ1dlZG5lc2RheScsXG4gICAgICAnVGh1cnNkYXknLFxuICAgICAgJ0ZyaWRheScsXG4gICAgICAnU2F0dXJkYXknLFxuICAgIF0sXG4gICAgZGF5TmFtZXNTaG9ydDogWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSxcbiAgICBkYXlOYW1lc01pbjogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuICAgIG1vbnRoTmFtZXM6IFtcbiAgICAgICdKYW51YXJ5JyxcbiAgICAgICdGZWJydWFyeScsXG4gICAgICAnTWFyY2gnLFxuICAgICAgJ0FwcmlsJyxcbiAgICAgICdNYXknLFxuICAgICAgJ0p1bmUnLFxuICAgICAgJ0p1bHknLFxuICAgICAgJ0F1Z3VzdCcsXG4gICAgICAnU2VwdGVtYmVyJyxcbiAgICAgICdPY3RvYmVyJyxcbiAgICAgICdOb3ZlbWJlcicsXG4gICAgICAnRGVjZW1iZXInLFxuICAgIF0sXG4gICAgbW9udGhOYW1lc1Nob3J0OiBbXG4gICAgICAnSmFuJyxcbiAgICAgICdGZWInLFxuICAgICAgJ01hcicsXG4gICAgICAnQXByJyxcbiAgICAgICdNYXknLFxuICAgICAgJ0p1bicsXG4gICAgICAnSnVsJyxcbiAgICAgICdBdWcnLFxuICAgICAgJ1NlcCcsXG4gICAgICAnT2N0JyxcbiAgICAgICdOb3YnLFxuICAgICAgJ0RlYycsXG4gICAgXSxcbiAgICB0b2RheTogJ1RvZGF5JyxcbiAgICBjbGVhcjogJ0NsZWFyJyxcbiAgfTtcblxuICAvLyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3Igb3ZlcmxheSBzZXNzaW9uXG4gIHByaXZhdGUgX292ZXJsYXlJbml0aWFsRGF0ZTogRGF0ZVtdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX292ZXJsYXlJbml0aWFsUHJlc2V0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlICYmIHRoaXMuZGVmYXVsdFByZXNldCkge1xuICAgICAgdGhpcy5hcHBseVByZXNldCh0aGlzLmRlZmF1bHRQcmVzZXQpO1xuICAgIH1cbiAgICAvLyBpbml0aWFsaXplIGludGVybmFsIG1vZGVsXG4gICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGUnXSkge1xuICAgICAgY29uc3Qgc2VsID0gY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10uY3VycmVudFZhbHVlIGFzIERhdGVbXSB8IG51bGw7XG4gICAgICBpZiAoc2VsICYmIEFycmF5LmlzQXJyYXkoc2VsKSAmJiBzZWwubGVuZ3RoID09PSAyICYmIHNlbFswXSAmJiBzZWxbMV0pIHtcbiAgICAgICAgY29uc3QgcHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoc2VsWzBdLCBzZWxbMV0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0ID8/ICdjdXN0b20nO1xuICAgICAgICAvLyBzeW5jIGludGVybmFsIG1vZGVsIHdoZW4gZXh0ZXJuYWwgdmFsdWUgY2hhbmdlc1xuICAgICAgICB0aGlzLm1vZGVsRGF0ZSA9IFsuLi5zZWxdO1xuICAgICAgfSBlbHNlIGlmIChzZWwgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb2RlbERhdGUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uSW5wdXRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJykge1xuICAgICAgdHJ5IHsgdGhpcy5vdmVybGF5UGFuZWw/LnRvZ2dsZShldmVudCBhcyBhbnkpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBvbk92ZXJsYXlTaG93KCk6IHZvaWQge1xuICAgIC8vIHN0b3JlIGEgZGVlcCBjb3B5IG9mIGN1cnJlbnQgc2VsZWN0aW9uL3ByZXNldCB3aGVuIG92ZXJsYXkgb3BlbnNcbiAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkpIHtcbiAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9ICh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pLm1hcChkID0+IChkID8gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKSA6IGQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb3ZlcmxheUluaXRpYWxEYXRlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fb3ZlcmxheUluaXRpYWxQcmVzZXQgPSB0aGlzLnNlbGVjdGVkUHJlc2V0O1xuICAgIC8vIGVuc3VyZSBjYWxlbmRhciBtb2RlbCBzaG93cyB0aGUgY3VycmVudGx5IGNvbW1pdHRlZCBzZWxlY3Rpb24gd2hlbiBvcGVuaW5nXG4gICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xuICAgIC8vIGVuc3VyZSBwcmVzZXQgYnV0dG9ucyByZWZsZWN0IGN1cnJlbnQgc2VsZWN0aW9uIHdoZW4gb3ZlcmxheSBvcGVuc1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZSAmJiBBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWREYXRlKSAmJiB0aGlzLnNlbGVjdGVkRGF0ZS5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KHRoaXMuc2VsZWN0ZWREYXRlWzBdLCB0aGlzLnNlbGVjdGVkRGF0ZVsxXSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0ID8/ICdjdXN0b20nO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvbk92ZXJsYXlIaWRlKCk6IHZvaWQge1xuICAgIC8vIGlmIGludGVybmFsIGNhbGVuZGFyIG1vZGVsIGhhcyBhbiBpbmNvbXBsZXRlIHNlbGVjdGlvbiAocGFydGlhbCByYW5nZSkgcmV2ZXJ0IHRvIGluaXRpYWxcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxEYXRlO1xuICAgIGNvbnN0IGlzUGFydGlhbE1vZGVsID0gQm9vbGVhbihtb2RlbCAmJiBBcnJheS5pc0FycmF5KG1vZGVsKSAmJiAobW9kZWwgYXMgRGF0ZVtdKS5sZW5ndGggPT09IDEgJiYgISEobW9kZWwgYXMgRGF0ZVtdKVswXSAmJiAhKG1vZGVsIGFzIERhdGVbXSlbMV0pO1xuICAgIGlmIChpc1BhcnRpYWxNb2RlbCkge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSB0aGlzLl9vdmVybGF5SW5pdGlhbERhdGU7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5fb3ZlcmxheUluaXRpYWxQcmVzZXQ7XG4gICAgICAvLyBlbWl0IHRoZSByZXZlcnRlZCB2YWx1ZSBzbyBwYXJlbnQgc3luY3NcbiAgICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgLy8gcmVzZXQgaW50ZXJuYWwgbW9kZWwgdG8gc3luY2VkIHZhbHVlXG4gICAgICB0aGlzLm1vZGVsRGF0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlID8gWy4uLnRoaXMuc2VsZWN0ZWREYXRlXSA6IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9IG51bGw7XG4gICAgdGhpcy5fb3ZlcmxheUluaXRpYWxQcmVzZXQgPSBudWxsO1xuICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gIH1cblxuICBvbk1vZGVsQ2hhbmdlKGRhdGVSYW5nZTogRGF0ZVtdIHwgbnVsbCkge1xuICAgIC8vIFdoZW4gdXNlciBjbGlja3MgYSBmaXJzdCBkYXRlLCBQcmltZU5HIG1heSBlbWl0IGFuIGFycmF5IHdpdGggMSB2YWx1ZS4gV2UgZG9uJ3Qgd2FudCB0b1xuICAgIC8vIHVwZGF0ZSB0aGUgZXh0ZXJuYWwgc2VsZWN0ZWREYXRlIHVudGlsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWQgKHR3byBkYXRlcykgc28gdGhhdFxuICAgIC8vIHRoZSBjYWxlbmRhciBkb2VzIG5vdCBqdW1wIGJhY2sgdG8gYSBwcmV2aW91c2x5IHNlbGVjdGVkIGVuZCBkYXRlJ3MgbW9udGguXG4gICAgdGhpcy5tb2RlbERhdGUgPSBkYXRlUmFuZ2UgPyBbLi4uZGF0ZVJhbmdlXSA6IG51bGw7XG4gICAgaWYgKGRhdGVSYW5nZSAmJiBBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkgJiYgZGF0ZVJhbmdlLmxlbmd0aCA9PT0gMiAmJiBkYXRlUmFuZ2VbMF0gJiYgZGF0ZVJhbmdlWzFdKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoZGF0ZVJhbmdlWzBdLCBkYXRlUmFuZ2VbMV0pO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gWy4uLmRhdGVSYW5nZV07XG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIC8vIGNsb3NlIG92ZXJsYXkgbGlrZSB3aGVuIGFwcGx5aW5nIGEgcHJlc2V0XG4gICAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZSkge1xuICAgICAgLy8gY2xlYXJlZCBzZWxlY3Rpb25cbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcbiAgICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNpbmdsZSBkYXRlIHNlbGVjdGluZyAocGFydGlhbCByYW5nZSkgLSBkbyBub3QgZW1pdCBjaGFuZ2UgeWV0OyBqdXN0IGtlZXAgaW50ZXJuYWwgbW9kZWxcbiAgICAgIC8vIHNvIHRoZSBjYWxlbmRhcidzIHZpZXcgcmVtYWlucyB3aGVyZSB0aGUgdXNlciBuYXZpZ2F0ZWQgdG8uXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpICYmXG4gICAgICAgICh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAhISh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pWzBdICYmXG4gICAgICAgICEhKHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXSlbMV1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKGQ6IERhdGUpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTYW1lRGF0ZShhOiBEYXRlLCBiOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEuZ2V0RnVsbFllYXIoKSA9PT0gYi5nZXRGdWxsWWVhcigpICYmXG4gICAgICBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKSAmJlxuICAgICAgYS5nZXREYXRlKCkgPT09IGIuZ2V0RGF0ZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0UHJlc2V0KHN0YXJ0UmF3OiBEYXRlLCBlbmRSYXc6IERhdGUpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMubm9ybWFsaXplRGF0ZShzdGFydFJhdyk7XG4gICAgY29uc3QgZW5kID0gdGhpcy5ub3JtYWxpemVEYXRlKGVuZFJhdyk7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLm5vcm1hbGl6ZURhdGUobmV3IERhdGUoKSk7XG4gICAgLy8gdG9kYXlcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCB0b2RheSkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgdG9kYXkpKSByZXR1cm4gJ3RvZGF5JztcbiAgICAvLyB5ZXN0ZXJkYXlcbiAgICBjb25zdCB5ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIHkuc2V0RGF0ZSh5LmdldERhdGUoKSAtIDEpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHkpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIHkpKSByZXR1cm4gJ3llc3RlcmRheSc7XG4gICAgLy8gbGFzdDdkYXlzIChsYXN0IDcgZGF5cyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSA2LCBlbmQgPSB0b2RheSlcbiAgICBjb25zdCBsN0VuZCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBjb25zdCBsN1N0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGw3U3RhcnQuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSA2KTtcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsN1N0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsN0VuZCkpIHJldHVybiAnbGFzdDdkYXlzJztcbiAgICAvLyBsYXN0MzBkYXlzIChsYXN0IDMwIGRheXMgaW5jbHVkaW5nIHRvZGF5OiBzdGFydCA9IHRvZGF5IC0gMjksIGVuZCA9IHRvZGF5KVxuICAgIGNvbnN0IGwzMEVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBjb25zdCBsMzBTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBsMzBTdGFydC5zZXREYXRlKHRvZGF5LmdldERhdGUoKSAtIDI5KTtcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsMzBTdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDMwRW5kKSkgcmV0dXJuICdsYXN0MzBkYXlzJztcbiAgICAvLyBsYXN0M21vbnRocyAobGFzdCAzIG1vbnRocyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAzIG1vbnRocywgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDNtRW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGNvbnN0IGwzbVN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGwzbVN0YXJ0LnNldE1vbnRoKHRvZGF5LmdldE1vbnRoKCkgLSAzKTtcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsM21TdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDNtRW5kKSkgcmV0dXJuICdsYXN0M21vbnRocyc7XG4gICAgLy8gbGFzdDZtb250aHMgKGxhc3QgNiBtb250aHMgaW5jbHVkaW5nIHRvZGF5OiBzdGFydCA9IHRvZGF5IC0gNiBtb250aHMsIGVuZCA9IHRvZGF5KVxuICAgIGNvbnN0IGw2bUVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBjb25zdCBsNm1TdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBsNm1TdGFydC5zZXRNb250aCh0b2RheS5nZXRNb250aCgpIC0gNik7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbDZtU3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGw2bUVuZCkpIHJldHVybiAnbGFzdDZtb250aHMnO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY2xlYXJEYXRlUmFuZ2UoKSB7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xuICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xuICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5tb2RlbERhdGUgPSBudWxsO1xuICB9XG5cbiAgcmVzZXRBbmRDbG9zZSgpIHtcbiAgICB0aGlzLmNsZWFyRGF0ZVJhbmdlKCk7XG4gICAgaWYgKHRoaXMub3ZlcmxheVBhbmVsKSB7XG4gICAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbC5oaWRlKCk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQ3VzdG9tUmFuZ2UoKSB7XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSAhdGhpcy5jdXN0b21SYW5nZU1vZGU7XG4gICAgaWYgKHRoaXMuY3VzdG9tUmFuZ2VNb2RlKSB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gJ2N1c3RvbSc7XG4gIH1cblxuICBhcHBseUN1c3RvbVJhbmdlKCkge1xuICAgIC8vIGVuc3VyZSBleHRlcm5hbCBzZWxlY3RlZERhdGUgaXMgaW4gc3luYyB3aXRoIGludGVybmFsIG1vZGVsXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSB0aGlzLm1vZGVsRGF0ZSA/IFsuLi50aGlzLm1vZGVsRGF0ZV0gOiBudWxsO1xuICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIGlmICh0aGlzLm92ZXJsYXlQYW5lbCkge1xuICAgICAgdHJ5IHsgdGhpcy5vdmVybGF5UGFuZWwuaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSAnY3VzdG9tJztcbiAgfVxuXG4gICAgZ2V0RGF0ZVJhbmdlTGFiZWwoKSB7XG4gICAgLy8gQ2hlY2sgdGhlIGludGVybmFsIG1vZGVsIGZpcnN0IHRvIHNob3cgcmVhbC10aW1lIHVwZGF0ZXMgd2hpbGUgc2VsZWN0aW5nXG4gICAgY29uc3QgZGF0ZUFycmF5ID0gdGhpcy5tb2RlbERhdGUgfHwgdGhpcy5zZWxlY3RlZERhdGU7XG4gICAgaWYgKCFkYXRlQXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZUFycmF5KSkgcmV0dXJuICcnO1xuICAgIFxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGRhdGVBcnJheSBhcyAoRGF0ZSB8IG51bGwpW107XG4gICAgICAgICAgICBjb25zdCBhcnJvdyA9ICdcXHUyNzk0JztcblxuICAgIC8vIFNob3cganVzdCB0aGUgZmlyc3QgZGF0ZSB3aXRoIGFuIGFycm93IGlmIG9ubHkgZmlyc3QgZGF0ZSBpcyBzZWxlY3RlZFxuICAgIGlmIChzdGFydCAmJiAhZW5kKSB7XG4gICAgICBjb25zdCBzdGFydFN0ciA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHN0YXJ0LCAnTU0vZGQveXl5eScpO1xuICAgICAgcmV0dXJuIGAke3N0YXJ0U3RyfSAke2Fycm93fSBgO1xuICAgIH1cbiAgICBcbiAgICAvLyBTaG93IHRoZSBjb21wbGV0ZSByYW5nZSBpZiBib3RoIGRhdGVzIGFyZSBzZWxlY3RlZFxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgIGNvbnN0IHN0YXJ0U3RyID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oc3RhcnQsICdNTS9kZC95eXl5Jyk7XG4gICAgICBjb25zdCBlbmRTdHIgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShlbmQsICdNTS9kZC95eXl5Jyk7XG4gICAgICByZXR1cm4gYCR7c3RhcnRTdHJ9ICR7YXJyb3d9ICR7ZW5kU3RyfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGFwcGx5UHJlc2V0KHByZXNldDogJ3RvZGF5J3wneWVzdGVyZGF5J3wnbGFzdDdkYXlzJ3wnbGFzdDMwZGF5cyd8J2xhc3QzbW9udGhzJ3wnbGFzdDZtb250aHMnKSB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBzdGFydDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBlbmQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBzd2l0Y2ggKHByZXNldCkge1xuICAgICAgY2FzZSAndG9kYXknOlxuICAgICAgICBzdGFydCA9IGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneWVzdGVyZGF5JzpcbiAgICAgICAgY29uc3QgeSA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgICAgeS5zZXREYXRlKHkuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICAgIHN0YXJ0ID0gZW5kID0gbmV3IERhdGUoeS5nZXRGdWxsWWVhcigpLCB5LmdldE1vbnRoKCksIHkuZ2V0RGF0ZSgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsYXN0N2RheXMnOiB7XG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcbiAgICAgICAgc3RhcnQuc2V0RGF0ZShlbmQuZ2V0RGF0ZSgpIC0gNik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdDMwZGF5cyc6IHtcbiAgICAgICAgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKTtcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xuICAgICAgICBzdGFydC5zZXREYXRlKGVuZC5nZXREYXRlKCkgLSAyOSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdDNtb250aHMnOiB7XG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcbiAgICAgICAgc3RhcnQuc2V0TW9udGgoZW5kLmdldE1vbnRoKCkgLSAzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0Nm1vbnRocyc6IHtcbiAgICAgICAgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKTtcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xuICAgICAgICBzdGFydC5zZXRNb250aChlbmQuZ2V0TW9udGgoKSAtIDYpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IFtzdGFydCwgZW5kXTtcbiAgICAgIHRoaXMubW9kZWxEYXRlID0gW3N0YXJ0LCBlbmRdO1xuICAgICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0O1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHsgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTsgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIG9uRGF0ZVJhbmdlQ2hhbmdlKGRhdGVSYW5nZTogRGF0ZVtdIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQoZGF0ZVJhbmdlKTtcbiAgICBpZiAoZGF0ZVJhbmdlICYmIEFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KGRhdGVSYW5nZVswXSwgZGF0ZVJhbmdlWzFdKTtcbiAgICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghZGF0ZVJhbmdlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlubGluZTsgZWxzZSBpbmxpbmVCbG9ja1wiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbmdDbGFzc109XCJpbnB1dFN0eWxlQ2xhc3NcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jYWxlbmRhciBpbnB1dC1pY29uXCIgdGl0bGU9XCJPcGVuIGNhbGVuZGFyXCIgKGNsaWNrKT1cIm92ZXJsYXlQYW5lbD8udG9nZ2xlKCRldmVudClcIj48L2k+XG4gICAgPC9kaXY+XG5cbiAgICA8cC1vdmVybGF5UGFuZWwgI292ZXJsYXlQYW5lbCBbZGlzbWlzc2FibGVdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiIHN0eWxlQ2xhc3M9XCJhdG9taXgtZGF0ZS1yYW5nZS1vdmVybGF5XCIgKG9uU2hvdyk9XCJvbk92ZXJsYXlTaG93KClcIiAob25IaWRlKT1cIm9uT3ZlcmxheUhpZGUoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktbGVmdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXQtbGlzdFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgndG9kYXknKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAndG9kYXknIH1cIiBsYWJlbD1cIlRvZGF5XCI+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCd5ZXN0ZXJkYXknKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAneWVzdGVyZGF5JyB9XCIgbGFiZWw9XCJZZXN0ZXJkYXlcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3Q3ZGF5cycpXCIgW25nQ2xhc3NdPVwieyAnYWN0aXZlJzogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0N2RheXMnIH1cIiBsYWJlbD1cIkxhc3QgNyBkYXlzXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MzBkYXlzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzMGRheXMnIH1cIiBsYWJlbD1cIkxhc3QgMzAgZGF5c1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDNtb250aHMnKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDNtb250aHMnIH1cIiBsYWJlbD1cIkxhc3QgMyBtb250aHNcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3Q2bW9udGhzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3Q2bW9udGhzJyB9XCIgbGFiZWw9XCJMYXN0IDYgbW9udGhzXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8YSBjbGFzcz1cInJlc2V0LWxpbmtcIiAoY2xpY2spPVwicmVzZXRBbmRDbG9zZSgpXCI+UmVzZXQ8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1yaWdodFwiPlxuICAgICAgICAgIDxwLWNhbGVuZGFyIFsobmdNb2RlbCldPVwibW9kZWxEYXRlXCIgW3NlbGVjdGlvbk1vZGVdPVwiJ3JhbmdlJ1wiIFtpbmxpbmVdPVwidHJ1ZVwiIFtkYXRlRm9ybWF0XT1cIidtbS9kZC95eXl5J1wiIFtzaG93T3RoZXJNb250aHNdPVwidHJ1ZVwiIFtsb2NhbGVdPVwiZW5Mb2NhbGVcIiBbc2hvd0ljb25dPVwiZmFsc2VcIiBbc3R5bGVDbGFzc109XCInYXRvbWl4LW92ZXJsYXktY2FsZW5kYXInXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW21heERhdGVdPVwibWF4RGF0ZVwiIFttaW5EYXRlXT1cIm1pbkRhdGVcIj48L3AtY2FsZW5kYXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlICNpbmxpbmVCbG9jaz5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInN0eWxlQ2xhc3NcIiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cbiAgICAgIDxpbnB1dFxuICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW25nQ2xhc3NdPVwiaW5wdXRTdHlsZUNsYXNzXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgW3ZhbHVlXT1cImdldERhdGVSYW5nZUxhYmVsKClcIlxuICAgICAgICByZWFkb25seVxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgICA8aSBjbGFzcz1cInBpIHBpLWNhbGVuZGFyIGlucHV0LWljb25cIiB0aXRsZT1cIk9wZW4gY2FsZW5kYXJcIj48L2k+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXIgaW5saW5lLWNhbGVuZGFyIGZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5LWxlZnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByZXNldC1saXN0XCI+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgndG9kYXknKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAndG9kYXknIH1cIiBsYWJlbD1cIlRvZGF5XCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgneWVzdGVyZGF5JylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiIGxhYmVsPVwiWWVzdGVyZGF5XCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDdkYXlzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3Q3ZGF5cycgfVwiIGxhYmVsPVwiTGFzdCA3IGRheXNcIj48L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MzBkYXlzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzMGRheXMnIH1cIiBsYWJlbD1cIkxhc3QgMzAgZGF5c1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QzbW9udGhzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCIgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDZtb250aHMnKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDZtb250aHMnIH1cIiBsYWJlbD1cIkxhc3QgNiBtb250aHNcIj48L2J1dHRvbj5cbiAgICAgICAgICA8YSBjbGFzcz1cInJlc2V0LWxpbmtcIiAoY2xpY2spPVwicmVzZXRBbmRDbG9zZSgpXCI+UmVzZXQ8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1yaWdodFwiPlxuICAgICAgICA8cC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cIm1vZGVsRGF0ZVwiIFtzZWxlY3Rpb25Nb2RlXT1cIidyYW5nZSdcIiBbaW5saW5lXT1cInRydWVcIiBbZGF0ZUZvcm1hdF09XCInbW0vZGQveXl5eSdcIiBbc2hvd090aGVyTW9udGhzXT1cInRydWVcIiBbbG9jYWxlXT1cImVuTG9jYWxlXCIgW3Nob3dJY29uXT1cImZhbHNlXCIgW3N0eWxlQ2xhc3NdPVwiJ2F0b21peC1vdmVybGF5LWNhbGVuZGFyJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFttYXhEYXRlXT1cIm1heERhdGVcIiBbbWluRGF0ZV09XCJtaW5EYXRlXCI+PC9wLWNhbGVuZGFyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==