barsa-calendar 1.0.456 → 2.0.1

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.
Files changed (81) hide show
  1. package/{esm2020 → esm2022}/barsa-calendar.mjs +4 -4
  2. package/esm2022/lib/barsa-calendar.module.mjs +117 -0
  3. package/esm2022/lib/calendar-container/calendar-container.component.mjs +230 -0
  4. package/esm2022/lib/calendar-header/calendar-header.component.mjs +66 -0
  5. package/esm2022/lib/calendar-list/calendar-list.component.mjs +18 -0
  6. package/esm2022/lib/calendar-list-container/calendar-list-container.component.mjs +29 -0
  7. package/{esm2020 → esm2022}/lib/calendar-list-item/calendar-list-item.component.mjs +14 -14
  8. package/esm2022/lib/calendar-month/calendar-month.component.mjs +246 -0
  9. package/esm2022/lib/calendar-selection-days/calendar-selection-days.component.mjs +196 -0
  10. package/esm2022/lib/calendar-week/calendar-week.component.mjs +252 -0
  11. package/{esm2020 → esm2022}/lib/constants.mjs +3 -3
  12. package/esm2022/lib/date-time-picker/date-time-picker.component.mjs +431 -0
  13. package/esm2022/lib/day-event-list/day-event-list.component.mjs +55 -0
  14. package/esm2022/lib/day-number-box/day-number-box.component.mjs +105 -0
  15. package/{esm2020 → esm2022}/lib/days-in-week.pipe.mjs +17 -17
  16. package/esm2022/lib/equal-date.pipe.mjs +23 -0
  17. package/esm2022/lib/event-button/event-button.component.mjs +97 -0
  18. package/esm2022/lib/event-button-end-arrow/event-button-end-arrow.component.mjs +29 -0
  19. package/esm2022/lib/event-button-start-arrow/event-button-start-arrow.component.mjs +29 -0
  20. package/esm2022/lib/event-date.pipe.mjs +24 -0
  21. package/esm2022/lib/event-preview/event-preview.component.mjs +79 -0
  22. package/{esm2020 → esm2022}/lib/event-time.pipe.mjs +22 -22
  23. package/{esm2020 → esm2022}/lib/from-to-time.pipe.mjs +23 -23
  24. package/esm2022/lib/models.mjs +14 -0
  25. package/esm2022/lib/month-days/month-days.component.mjs +222 -0
  26. package/esm2022/lib/services/calendar.service.mjs +645 -0
  27. package/{esm2020 → esm2022}/public-api.mjs +23 -23
  28. package/fesm2022/barsa-calendar.mjs +2816 -0
  29. package/fesm2022/barsa-calendar.mjs.map +1 -0
  30. package/index.d.ts +5 -5
  31. package/lib/barsa-calendar.module.d.ts +53 -53
  32. package/lib/calendar-container/calendar-container.component.d.ts +89 -89
  33. package/lib/calendar-header/calendar-header.component.d.ts +33 -33
  34. package/lib/calendar-list/calendar-list.component.d.ts +8 -8
  35. package/lib/calendar-list-container/calendar-list-container.component.d.ts +14 -14
  36. package/lib/calendar-list-item/calendar-list-item.component.d.ts +7 -7
  37. package/lib/calendar-month/calendar-month.component.d.ts +70 -70
  38. package/lib/calendar-selection-days/calendar-selection-days.component.d.ts +48 -48
  39. package/lib/calendar-week/calendar-week.component.d.ts +70 -70
  40. package/lib/constants.d.ts +1 -1
  41. package/lib/date-time-picker/date-time-picker.component.d.ts +113 -112
  42. package/lib/day-event-list/day-event-list.component.d.ts +20 -20
  43. package/lib/day-number-box/day-number-box.component.d.ts +30 -30
  44. package/lib/days-in-week.pipe.d.ts +9 -9
  45. package/lib/equal-date.pipe.d.ts +8 -8
  46. package/lib/event-button/event-button.component.d.ts +31 -31
  47. package/lib/event-button-end-arrow/event-button-end-arrow.component.d.ts +12 -12
  48. package/lib/event-button-start-arrow/event-button-start-arrow.component.d.ts +12 -12
  49. package/lib/event-date.pipe.d.ts +9 -9
  50. package/lib/event-preview/event-preview.component.d.ts +24 -24
  51. package/lib/event-time.pipe.d.ts +9 -9
  52. package/lib/from-to-time.pipe.d.ts +9 -9
  53. package/lib/models.d.ts +110 -110
  54. package/lib/month-days/month-days.component.d.ts +69 -69
  55. package/lib/services/calendar.service.d.ts +70 -70
  56. package/package.json +7 -13
  57. package/public-api.d.ts +19 -19
  58. package/esm2020/lib/barsa-calendar.module.mjs +0 -117
  59. package/esm2020/lib/calendar-container/calendar-container.component.mjs +0 -230
  60. package/esm2020/lib/calendar-header/calendar-header.component.mjs +0 -67
  61. package/esm2020/lib/calendar-list/calendar-list.component.mjs +0 -19
  62. package/esm2020/lib/calendar-list-container/calendar-list-container.component.mjs +0 -30
  63. package/esm2020/lib/calendar-month/calendar-month.component.mjs +0 -246
  64. package/esm2020/lib/calendar-selection-days/calendar-selection-days.component.mjs +0 -195
  65. package/esm2020/lib/calendar-week/calendar-week.component.mjs +0 -249
  66. package/esm2020/lib/date-time-picker/date-time-picker.component.mjs +0 -433
  67. package/esm2020/lib/day-event-list/day-event-list.component.mjs +0 -56
  68. package/esm2020/lib/day-number-box/day-number-box.component.mjs +0 -105
  69. package/esm2020/lib/equal-date.pipe.mjs +0 -23
  70. package/esm2020/lib/event-button/event-button.component.mjs +0 -97
  71. package/esm2020/lib/event-button-end-arrow/event-button-end-arrow.component.mjs +0 -29
  72. package/esm2020/lib/event-button-start-arrow/event-button-start-arrow.component.mjs +0 -29
  73. package/esm2020/lib/event-date.pipe.mjs +0 -24
  74. package/esm2020/lib/event-preview/event-preview.component.mjs +0 -79
  75. package/esm2020/lib/models.mjs +0 -14
  76. package/esm2020/lib/month-days/month-days.component.mjs +0 -222
  77. package/esm2020/lib/services/calendar.service.mjs +0 -645
  78. package/fesm2015/barsa-calendar.mjs +0 -2813
  79. package/fesm2015/barsa-calendar.mjs.map +0 -1
  80. package/fesm2020/barsa-calendar.mjs +0 -2817
  81. package/fesm2020/barsa-calendar.mjs.map +0 -1
@@ -0,0 +1,431 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Injectable, Input, Output, ViewChild } from '@angular/core';
2
+ import { distinctUntilChanged, map } from 'rxjs/operators';
3
+ import { BaseComponent, DateService, getDateService, BarsaApi } from 'barsa-novin-ray-core';
4
+ import { CalendarService } from '../services/calendar.service';
5
+ import { DatetimeAdapter, FdDate, FdDatetimeAdapter, InputGroupComponent, TimeComponent } from '@fundamental-ngx/core';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "barsa-novin-ray-core";
8
+ import * as i2 from "@fundamental-ngx/core";
9
+ import * as i3 from "@angular/common";
10
+ import * as i4 from "@angular/forms";
11
+ import * as i5 from "@fundamental-ngx/core/bar";
12
+ import * as i6 from "@fundamental-ngx/core/content-density";
13
+ import * as i7 from "@fundamental-ngx/core/button";
14
+ import * as i8 from "@fundamental-ngx/core/input-group";
15
+ import * as i9 from "@fundamental-ngx/core/dialog";
16
+ import * as i10 from "@fundamental-ngx/core/title";
17
+ import * as i11 from "@fundamental-ngx/core/popover";
18
+ import * as i12 from "@fundamental-ngx/core/time";
19
+ import * as i13 from "@fundamental-ngx/core/toolbar";
20
+ import * as i14 from "../calendar-month/calendar-month.component";
21
+ import * as i15 from "../calendar-selection-days/calendar-selection-days.component";
22
+ export class TimeConfigI18n {
23
+ constructor(_bbbTranslate) {
24
+ this._bbbTranslate = _bbbTranslate;
25
+ /** Aria label for the 'increase hours' button */
26
+ this.increaseHoursLabel = 'Increase hours';
27
+ /** label for the 'hours' column */
28
+ this.hoursLabel = this._bbbTranslate.transform('Hours');
29
+ /** Aria label for the 'decrease hours' button */
30
+ this.decreaseHoursLabel = 'Decrease hours';
31
+ /** Aria label for the 'increase minutes' button */
32
+ this.increaseMinutesLabel = 'Increase minutes';
33
+ /** label for the 'minutes' column */
34
+ this.minutesLabel = this._bbbTranslate.transform('Minutes');
35
+ /** Aria label for the 'decrease minutes' button */
36
+ this.decreaseMinutesLabel = 'Decrease minutes';
37
+ /** Aria label for the 'increase seconds' button */
38
+ this.increaseSecondsLabel = 'Increase seconds';
39
+ /** label for the 'seconds' column */
40
+ this.secondsLabel = this._bbbTranslate.transform('Sec');
41
+ /** Aria label for the 'decrease seconds' button */
42
+ this.decreaseSecondsLabel = 'Decrease seconds';
43
+ /** Aria label for the 'increase period' button */
44
+ this.increasePeriodLabel = 'Increase period';
45
+ /** label for the 'period' column */
46
+ this.periodLabel = 'Period';
47
+ /** Aria label for the 'decrease period' button */
48
+ this.decreasePeriodLabel = 'Decrease period';
49
+ }
50
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TimeConfigI18n, deps: [{ token: i1.BbbTranslatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
51
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TimeConfigI18n }); }
52
+ }
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TimeConfigI18n, decorators: [{
54
+ type: Injectable
55
+ }], ctorParameters: () => [{ type: i1.BbbTranslatePipe }] });
56
+ export class DateTimePickerComponent extends BaseComponent {
57
+ constructor(_datetimeAdapter, _dateTimeToCaption, _logService, _dialogService, _portalService) {
58
+ super();
59
+ this._datetimeAdapter = _datetimeAdapter;
60
+ this._dateTimeToCaption = _dateTimeToCaption;
61
+ this._logService = _logService;
62
+ this._dialogService = _dialogService;
63
+ this.rtl = true;
64
+ this.rangeChange = new EventEmitter();
65
+ this.valueChange = new EventEmitter();
66
+ this.valueCaption = '';
67
+ this.selectionMode = 'day';
68
+ this.todayIndex = -1;
69
+ this.isValid = true;
70
+ this.months = [];
71
+ this.tempFormmatedDate = '';
72
+ this.rtl$ = _portalService.rtl$;
73
+ this.width$ = _portalService.deviceSize$.pipe(distinctUntilChanged(), map((deviceSize) => {
74
+ if (!this.showDate) {
75
+ return 260;
76
+ }
77
+ switch (deviceSize) {
78
+ case 'l':
79
+ case 'xl':
80
+ return 560;
81
+ case 's':
82
+ return 320;
83
+ default:
84
+ return 520;
85
+ }
86
+ }));
87
+ this.height = 420;
88
+ }
89
+ ngOnInit() {
90
+ super.ngOnInit();
91
+ let culture = 'en-US';
92
+ switch (this.primaryCalendarType) {
93
+ case 'HijriShamsi':
94
+ culture = 'fa-IR';
95
+ break;
96
+ }
97
+ this.culture = culture;
98
+ this._calendarService = new CalendarService(this._logService, culture);
99
+ this._calendarService.setMode('month');
100
+ this.weekDaysMin = this._calendarService.weekDaysMin();
101
+ this.weekDays = this._calendarService.weekDays();
102
+ this.selectedMonth$ = this._calendarService.selected$;
103
+ this.today = this._calendarService.today;
104
+ if (this.value) {
105
+ this.timeValue = FdDate.getFdDateByDate(this.value);
106
+ this._setCaption(this.value);
107
+ this._calendarService.loadMonthByDate(this.value);
108
+ }
109
+ else {
110
+ this.timeValue = FdDate.getFdDateByDate(new Date());
111
+ }
112
+ // if (this.isRangePicker) {
113
+ // if (this.startRangeDate) {
114
+ // this._calendarService.loadMonthByDate(this.startRangeDate);
115
+ // }
116
+ // if (this.endRangeDate) {
117
+ // }
118
+ // } else {
119
+ // this._calendarService.loadMonthByDate(this.value);
120
+ // }
121
+ this.months = this._calendarService.Months;
122
+ this._prepareYear(this._calendarService.selectedMonth.dateInfo.year);
123
+ this._setFormattedDateToInput(this.value);
124
+ if (this.inputGroupComponent) {
125
+ // this.inputGroupComponent.registerOnChange(this.onCaptionChanged.bind(this));
126
+ }
127
+ }
128
+ ngOnChanges(changes) {
129
+ const { value } = changes;
130
+ if (value && !value.firstChange) {
131
+ const caption = this._getFormattedDate(value.currentValue);
132
+ if (caption !== this.inputGroupComponent?.inputText) {
133
+ this._setFormattedDateToInput(this.value);
134
+ }
135
+ }
136
+ }
137
+ onRangeChange(e) {
138
+ this.rangeChange.emit({
139
+ startDay: e.startDay,
140
+ endDay: e.endDay
141
+ });
142
+ }
143
+ onOpenPopover(popover, dialogTemplate) {
144
+ if (this.readonly || this.disabled) {
145
+ return;
146
+ }
147
+ if (this.timeComponent) {
148
+ setTimeout(() => this.timeComponent.refreshColumns(), 0);
149
+ }
150
+ if (this.deviceSize === 's' || this.isMobile) {
151
+ this._dialogService.open(dialogTemplate, {
152
+ mobile: true
153
+ });
154
+ return;
155
+ }
156
+ popover.open();
157
+ }
158
+ onMonthSelected(monthName, index) {
159
+ this._calendarService.gotoMonth(monthName, index);
160
+ }
161
+ onYearSelected(year) {
162
+ this._calendarService.gotoYear(+year);
163
+ }
164
+ onCaptionChanged(e) {
165
+ if (e.length < 10) {
166
+ if (e.length === 0) {
167
+ this._raisValueChanged(undefined);
168
+ return;
169
+ }
170
+ this.isValid = false;
171
+ return;
172
+ }
173
+ const englishDateStr = BarsaApi.Common.Util.ReplaceFaToArCharchter(e);
174
+ let format = 'jYYYY/jM/jD';
175
+ if (this.showTime) {
176
+ format += ' HH:mm';
177
+ }
178
+ const moment = this._calendarService._dateService.stringToMoment(englishDateStr, format);
179
+ // const isValid = moment.isValid();// برای شمسی همیشه false نشون میده
180
+ if (isNaN(Date.parse(englishDateStr))) {
181
+ this.isValid = false;
182
+ return;
183
+ }
184
+ const date = moment.toDate();
185
+ if (isNaN(date)) {
186
+ this.isValid = false;
187
+ return;
188
+ }
189
+ this.isValid = true;
190
+ this.timeValue = this._datetimeAdapter.setTime(this.timeValue, date.getHours(), date.getMinutes(), date.getSeconds());
191
+ this.startSelectedDay = this.endSelectedDay = null;
192
+ this._raisValueChanged(date, false);
193
+ }
194
+ onPrevTap() {
195
+ if (this.selectionMode === 'day') {
196
+ this._calendarService.loadPrevious();
197
+ }
198
+ else if (this.selectionMode === 'month') {
199
+ this._calendarService.loadPrevYear();
200
+ }
201
+ else if (this.selectionMode === 'year') {
202
+ this._prepareYear(Number(this.years[0]) - 20);
203
+ }
204
+ }
205
+ onNextTap() {
206
+ if (this.selectionMode === 'day') {
207
+ this._calendarService.loadNext();
208
+ }
209
+ else if (this.selectionMode === 'month') {
210
+ this._calendarService.loadNextYear();
211
+ }
212
+ else if (this.selectionMode === 'year') {
213
+ this._prepareYear(Number(this.years[this.years.length - 1]) + 1);
214
+ }
215
+ }
216
+ onToday() {
217
+ const today = new Date();
218
+ this.timeValue = this._datetimeAdapter.setTime(this.timeValue, today.getHours(), today.getMinutes(), today.getSeconds());
219
+ if (this._calendarService.todayDay) {
220
+ this.startSelectedDay = this._calendarService.todayDay;
221
+ }
222
+ this._calendarService.gotoToday();
223
+ }
224
+ onDayClick(day, popover, dialog) {
225
+ this.isValid = true;
226
+ this.startSelectedDay = this.endSelectedDay = day;
227
+ if (this.showTime) {
228
+ return;
229
+ }
230
+ this._setFirstAndEndDay(day, popover, dialog);
231
+ }
232
+ onPopoverOpenChange(isOpen) {
233
+ if (isOpen) {
234
+ this._lastValue = this.value;
235
+ }
236
+ else {
237
+ this._lastValue = undefined;
238
+ }
239
+ }
240
+ onClear(popover, dialog) {
241
+ if (dialog) {
242
+ dialog.dismiss();
243
+ }
244
+ else {
245
+ popover.close();
246
+ }
247
+ this.value = undefined;
248
+ this._setFormattedDateToInput(this.value);
249
+ this._raisValueChanged(this.value);
250
+ }
251
+ onOk(popover, dialog) {
252
+ if (dialog) {
253
+ dialog.dismiss();
254
+ }
255
+ else {
256
+ popover.close();
257
+ }
258
+ if (!this.value) {
259
+ this.value = new Date();
260
+ }
261
+ this._handleValueChange();
262
+ }
263
+ onCancel(popover, dialog) {
264
+ if (this._lastValue !== this.value) {
265
+ this.value = this._lastValue;
266
+ this._setCaption(this.value);
267
+ }
268
+ if (dialog) {
269
+ dialog.dismiss();
270
+ }
271
+ else {
272
+ popover.close();
273
+ }
274
+ }
275
+ _setFormattedDateToInput(date) {
276
+ if (date) {
277
+ const formattedDate = this._getFormattedDate(date);
278
+ this.tempFormmatedDate = formattedDate;
279
+ this._setInputGroupText(formattedDate);
280
+ return;
281
+ }
282
+ this.tempFormmatedDate = '';
283
+ this._setInputGroupText('');
284
+ }
285
+ _setInputGroupText(val) {
286
+ if (this.inputGroupComponent) {
287
+ this.inputGroupComponent.inputText = val;
288
+ }
289
+ }
290
+ _getFormattedDate(date) {
291
+ return this._dateTimeToCaption.transform(date, this.formatPattern, this.culture, this.showDate, this.showTime);
292
+ }
293
+ _handleValueChange() {
294
+ this.value = this.showDate ? this.startSelectedDay?.date ?? this.value : new Date();
295
+ if (this.value) {
296
+ this.value = new Date(this.value);
297
+ this.value.setHours(this.timeValue.hour);
298
+ this.value.setMinutes(this.timeValue.minute);
299
+ this.value.setSeconds(this.timeValue.second);
300
+ }
301
+ this._setFormattedDateToInput(this.value);
302
+ this._raisValueChanged(this.value);
303
+ }
304
+ _prepareYear(from) {
305
+ const years = [];
306
+ for (let i = 0; i < 20; i++) {
307
+ years.push(`${from + i}`);
308
+ }
309
+ this.years = years;
310
+ }
311
+ _setCaption(value) {
312
+ if (!value) {
313
+ this.valueCaption = '';
314
+ return;
315
+ }
316
+ let formatPattern = this.formatPattern.replace('YYYY', 'jYYYY');
317
+ formatPattern = formatPattern.replace('MM', 'jMM');
318
+ formatPattern = formatPattern.replace('DD', 'jDD');
319
+ this.valueCaption = this._calendarService._dateService.getMoment(value).format(formatPattern);
320
+ }
321
+ _raisValueChanged(date, setCaption = true) {
322
+ this.value = date;
323
+ if (setCaption) {
324
+ this._setCaption(date);
325
+ }
326
+ this.valueChange.emit(date);
327
+ }
328
+ _setFirstAndEndDay(day, popover, dialog) {
329
+ if (dialog) {
330
+ dialog.dismiss();
331
+ }
332
+ if (popover) {
333
+ popover.close();
334
+ }
335
+ if (!this.isRangePicker) {
336
+ this._setFormattedDateToInput(day.date);
337
+ this._raisValueChanged(day.date);
338
+ return;
339
+ }
340
+ if (this.startSelectedDay) {
341
+ this.endSelectedDay = day;
342
+ }
343
+ else {
344
+ this.startSelectedDay = day;
345
+ }
346
+ if (this.startSelectedDay && this.endSelectedDay && this.startSelectedDay.date > this.endSelectedDay.date) {
347
+ const temp = this.startSelectedDay;
348
+ this.startSelectedDay = this.endSelectedDay;
349
+ this.endSelectedDay = temp;
350
+ }
351
+ if (this.startSelectedDay && this.endSelectedDay) {
352
+ this.rangeChange.emit({
353
+ startDay: this.startSelectedDay.date,
354
+ endDay: this.endSelectedDay.date
355
+ });
356
+ }
357
+ }
358
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: DateTimePickerComponent, deps: [{ token: i2.DatetimeAdapter }, { token: i1.DateTimeToCaptionPipe }, { token: i1.LogService }, { token: i2.DialogService }, { token: i1.PortalService }], target: i0.ɵɵFactoryTarget.Component }); }
359
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: DateTimePickerComponent, selector: "bc-date-time-picker", inputs: { placeholder: "placeholder", primaryCalendarType: "primaryCalendarType", formatPattern: "formatPattern", value: "value", timeValue: "timeValue", startRangeDate: "startRangeDate", endRangeDate: "endRangeDate", isRangePicker: "isRangePicker", showTime: "showTime", showDate: "showDate", rtl: "rtl", deviceSize: "deviceSize", isMobile: "isMobile", readonly: "readonly", disabled: "disabled", buttonMenuMode: "buttonMenuMode", inlineMode: "inlineMode", daterangeMode: "daterangeMode" }, outputs: { rangeChange: "rangeChange", valueChange: "valueChange" }, providers: [
360
+ {
361
+ provide: DatetimeAdapter,
362
+ useClass: FdDatetimeAdapter
363
+ },
364
+ {
365
+ provide: DateService,
366
+ useFactory: getDateService
367
+ },
368
+ CalendarService
369
+ ], viewQueries: [{ propertyName: "timeComponent", first: true, predicate: TimeComponent, descendants: true }, { propertyName: "inputGroupComponent", first: true, predicate: InputGroupComponent, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (inlineMode) {\n<ng-container\n *ngTemplateOutlet=\"\n daterangeMode ? dateRangeTpl : month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n>\n</ng-container>\n}\n<ng-template #dateRangeTpl>\n <bc-calendar-selection-days\n fd-toolbar-item\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n</ng-template>\n<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode || inlineMode ? 'inherit' : 'none'\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n>\n</fd-input-group>\n@if (buttonMenuMode) {\n<button\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n}\n\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n @if (showDate) {\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n } @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n } @if (showDate) {\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n @if (selectionMode === 'day' || selectionMode === 'month') {\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n }\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n }\n </fd-toolbar>\n }\n <div style=\"display: flex\">\n @switch (selectionMode) { @case ('month') {\n <div class=\"month-year-selection-wrapper\">\n @for (month of months; track month; let i = $index) {\n <button\n style=\"flex-grow: 1; width: 33%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n }\n </div>\n } @case ('year') {\n <div class=\"month-year-selection-wrapper\">\n @for (year of years; track year) {\n <button\n style=\"flex-grow: 1; width: 25%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n }\n </div>\n } @default {\n <div style=\"display: flex\">\n @if (showDate) {\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n }\n <div class=\"seperator\"></div>\n @if (showTime) {\n <fd-time\n style=\"direction: ltr\"\n fdCompact\n [keepTwoDigits]=\"true\"\n [(ngModel)]=\"timeValue\"\n [displaySeconds]=\"false\"\n ></fd-time>\n }\n </div>\n } }\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.BarComponent, selector: "[fd-bar]", inputs: ["class", "barDesign", "inPage", "inHomePage", "size"] }, { kind: "directive", type: i5.BarRightDirective, selector: "[fd-bar-right]" }, { kind: "component", type: i5.ButtonBarComponent, selector: "fd-button-bar", inputs: ["fullWidth", "fdType", "title", "ariaLabelledby", "id"] }, { kind: "directive", type: i6.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i7.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i8.InputGroupComponent, selector: "fd-input-group", inputs: ["placement", "required", "inline", "addOnText", "buttonFocusable", "type", "glyph", "glyphFont", "button", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "component", type: i9.DialogComponent, selector: "fd-dialog", inputs: ["class", "dialogRef", "dialogConfig"] }, { kind: "component", type: i9.DialogBodyComponent, selector: "fd-dialog-body" }, { kind: "component", type: i9.DialogFooterComponent, selector: "fd-dialog-footer" }, { kind: "component", type: i10.TitleComponent, selector: "[fd-title], [fdTitle]", inputs: ["headerSize", "wrap"], exportAs: ["fd-title"] }, { kind: "component", type: i11.PopoverBodyComponent, selector: "fd-popover-body", inputs: ["minWidth", "maxWidth", "minHeight", "maxHeight"] }, { kind: "directive", type: i11.PopoverBodyFooterDirective, selector: "[fdPopoverBodyFooter], [fd-popover-body-footer]" }, { kind: "component", type: i11.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "component", type: i12.TimeComponent, selector: "fd-time", inputs: ["meridian", "validate", "keepTwoDigits", "disabled", "displaySeconds", "displayMinutes", "displayHours", "tablet", "elementsAtOnce", "time", "spinnerButtons"] }, { kind: "component", type: i13.ToolbarComponent, selector: "fd-toolbar", inputs: ["titleId", "class", "shouldOverflow", "fdType", "title", "active", "clearBorder", "forceOverflow", "tabindex", "ariaLabel", "ariaLabelledBy"] }, { kind: "directive", type: i13.ToolbarItemDirective, selector: "[fd-toolbar-item], [fdOverflowGroup], [fdOverflowPriority]", inputs: ["fdOverflowPriority", "fdOverflowGroup"] }, { kind: "component", type: i14.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "component", type: i15.CalendarSelectionDaysComponent, selector: "bc-calendar-selection-days", inputs: ["startSelectedDayIndex", "endSelectedDayIndex", "monthInfo", "inline"], outputs: ["rangeChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
370
+ }
371
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: DateTimePickerComponent, decorators: [{
372
+ type: Component,
373
+ args: [{ selector: 'bc-date-time-picker', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
374
+ {
375
+ provide: DatetimeAdapter,
376
+ useClass: FdDatetimeAdapter
377
+ },
378
+ {
379
+ provide: DateService,
380
+ useFactory: getDateService
381
+ },
382
+ CalendarService
383
+ ], template: "@if (inlineMode) {\n<ng-container\n *ngTemplateOutlet=\"\n daterangeMode ? dateRangeTpl : month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n>\n</ng-container>\n}\n<ng-template #dateRangeTpl>\n <bc-calendar-selection-days\n fd-toolbar-item\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n</ng-template>\n<fd-input-group\n placement=\"after\"\n glyph=\"calendar\"\n glyphAriaLabel=\"select day\"\n ariaLabelledBy=\"fd-input-group-icon-label-2\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [button]=\"true\"\n [state]=\"isValid ? 'success' : 'error'\"\n [showFocus]=\"true\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [style.display]=\"!buttonMenuMode || inlineMode ? 'inherit' : 'none'\"\n (addOnButtonClicked)=\"onOpenPopover(popover, dialogTemplate)\"\n>\n</fd-input-group>\n@if (buttonMenuMode) {\n<button\n fd-button\n [label]=\"tempFormmatedDate || placeholder\"\n [title]=\"placeholder\"\n [fdType]=\"value ? 'standard' : 'transparent'\"\n [fdMenu]=\"true\"\n (click)=\"onOpenPopover(popover, dialogTemplate)\"\n [class.placeholder-custom]=\"!value\"\n class=\"menu-button-datepicker\"\n></button>\n}\n\n<fd-popover #popover (isOpenChange)=\"onPopoverOpenChange($event)\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover\n }\n \"\n >\n </ng-container>\n <div fd-popover-body-footer>\n <div fd-bar [barDesign]=\"'footer'\">\n <div fd-bar-right>\n <container *ngTemplateOutlet=\"footerButtons\"></container>\n </div>\n </div>\n </div>\n </fd-popover-body>\n</fd-popover>\n<ng-template let-dialog let-dialogConfig=\"dialogConfig\" #dialogTemplate>\n <fd-dialog [dialogConfig]=\"dialogConfig\" [dialogRef]=\"dialog\">\n <fd-dialog-body>\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize,\n popover: popover,\n dialog: dialog\n }\n \"\n >\n </ng-container>\n </fd-dialog-body>\n <fd-dialog-footer>\n <container *ngTemplateOutlet=\"footerButtons; context: { dialog: dialog }\"></container>\n </fd-dialog-footer>\n </fd-dialog>\n</ng-template>\n<ng-template #footerButtons let-dialog=\"dialog\">\n <fd-button-bar [label]=\"'Ok' | bbbTranslate\" fdType=\"emphasized\" (click)=\"onOk(popover, dialog)\"></fd-button-bar>\n <fd-button-bar\n [label]=\"'Clear' | bbbTranslate\"\n fdType=\"standard\"\n (click)=\"onClear(popover, dialog)\"\n ></fd-button-bar>\n <fd-button-bar [label]=\"'Cancel' | bbbTranslate\" (click)=\"onCancel(popover, dialog)\"></fd-button-bar>\n</ng-template>\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n let-dialog=\"dialog\"\n>\n @if (showDate) {\n <fd-toolbar [fdType]=\"'transparent'\">\n <button\n fd-button\n fd-toolbar-item\n [label]=\"(showDate ? 'DateR_Today' : 'Now') | bbbTranslate\"\n (click)=\"onToday()\"\n ></button>\n @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></button>\n } @if (showDate) {\n <button\n fd-button\n fd-toolbar-item\n [fdType]=\"'transparent'\"\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></button>\n } @if (showDate) {\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n @if (selectionMode === 'day' || selectionMode === 'month') {\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n }\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n }\n </fd-toolbar>\n }\n <div style=\"display: flex\">\n @switch (selectionMode) { @case ('month') {\n <div class=\"month-year-selection-wrapper\">\n @for (month of months; track month; let i = $index) {\n <button\n style=\"flex-grow: 1; width: 33%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n }\n </div>\n } @case ('year') {\n <div class=\"month-year-selection-wrapper\">\n @for (year of years; track year) {\n <button\n style=\"flex-grow: 1; width: 25%\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n }\n </div>\n } @default {\n <div style=\"display: flex\">\n @if (showDate) {\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"selectedMonth.weeksCount\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [selectedDate]=\"startSelectedDay ? startSelectedDay.date : value\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, popover, dialog)\"\n ></bc-calendar-month>\n }\n <div class=\"seperator\"></div>\n @if (showTime) {\n <fd-time\n style=\"direction: ltr\"\n fdCompact\n [keepTwoDigits]=\"true\"\n [(ngModel)]=\"timeValue\"\n [displaySeconds]=\"false\"\n ></fd-time>\n }\n </div>\n } }\n </div>\n</ng-template>\n", styles: [":host{display:block}fd-popover{display:block}fd-input-group ::ng-deep input{direction:ltr}fd-time ::ng-deep .fd-time{padding-top:0}.seperator{border-left:.0625rem solid var(--sapPageFooter_BorderColor, #d9d9d9)}\n"] }]
384
+ }], ctorParameters: () => [{ type: i2.DatetimeAdapter }, { type: i1.DateTimeToCaptionPipe }, { type: i1.LogService }, { type: i2.DialogService }, { type: i1.PortalService }], propDecorators: { placeholder: [{
385
+ type: Input
386
+ }], primaryCalendarType: [{
387
+ type: Input
388
+ }], formatPattern: [{
389
+ type: Input
390
+ }], value: [{
391
+ type: Input
392
+ }], timeValue: [{
393
+ type: Input
394
+ }], startRangeDate: [{
395
+ type: Input
396
+ }], endRangeDate: [{
397
+ type: Input
398
+ }], isRangePicker: [{
399
+ type: Input
400
+ }], showTime: [{
401
+ type: Input
402
+ }], showDate: [{
403
+ type: Input
404
+ }], rtl: [{
405
+ type: Input
406
+ }], deviceSize: [{
407
+ type: Input
408
+ }], isMobile: [{
409
+ type: Input
410
+ }], readonly: [{
411
+ type: Input
412
+ }], disabled: [{
413
+ type: Input
414
+ }], buttonMenuMode: [{
415
+ type: Input
416
+ }], inlineMode: [{
417
+ type: Input
418
+ }], daterangeMode: [{
419
+ type: Input
420
+ }], rangeChange: [{
421
+ type: Output
422
+ }], valueChange: [{
423
+ type: Output
424
+ }], timeComponent: [{
425
+ type: ViewChild,
426
+ args: [TimeComponent]
427
+ }], inputGroupComponent: [{
428
+ type: ViewChild,
429
+ args: [InputGroupComponent, { static: true }]
430
+ }] } });
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2RhdGUtdGltZS1waWNrZXIvZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQ0gsYUFBYSxFQUViLFdBQVcsRUFDWCxjQUFjLEVBR2QsUUFBUSxFQUdYLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFDSCxlQUFlLEVBRWYsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNoQixNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQUcvQixNQUFNLE9BQU8sY0FBYztJQW9DdkIsWUFBb0IsYUFBK0I7UUFBL0Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBbkNuRCxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQUcsZ0JBQWdCLENBQUM7UUFFdEMsbUNBQW1DO1FBQ25DLGVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuRCxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQUcsZ0JBQWdC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QUNJLE9BQU8sRUFBRSxXQUFXOzRCQUNwQixVQUFVLEVBQUUsY0FBYzt5QkFDN0I7d0JBQ0QsZUFBZTtxQkFDbEI7eU1BR1EsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNtQixhQUFhO3NCQUF0QyxTQUFTO3VCQUFDLGFBQWE7Z0JBQzBCLG1CQUFtQjtzQkFBcEUsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0YWJsZSxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gICAgQmFzZUNvbXBvbmVudCxcbiAgICBCYmJUcmFuc2xhdGVQaXBlLFxuICAgIERhdGVTZXJ2aWNlLFxuICAgIGdldERhdGVTZXJ2aWNlLFxuICAgIExvZ1NlcnZpY2UsXG4gICAgUG9ydGFsU2VydmljZSxcbiAgICBCYXJzYUFwaSxcbiAgICBEYXRlVGltZVRvQ2FwdGlvblBpcGUsXG4gICAgQWJicmV2YXRpb25EZXZpY2VTaXplXG59IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyTW9udGhJbmZvLCBEYXkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIERhdGV0aW1lQWRhcHRlcixcbiAgICBEaWFsb2dTZXJ2aWNlLFxuICAgIEZkRGF0ZSxcbiAgICBGZERhdGV0aW1lQWRhcHRlcixcbiAgICBJbnB1dEdyb3VwQ29tcG9uZW50LFxuICAgIFRpbWVDb21wb25lbnRcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRpbWVDb25maWdJMThuIHtcbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdpbmNyZWFzZSBob3VycycgYnV0dG9uICovXG4gICAgaW5jcmVhc2VIb3Vyc0xhYmVsID0gJ0luY3JlYXNlIGhvdXJzJztcblxuICAgIC8qKiBsYWJlbCBmb3IgdGhlICdob3VycycgY29sdW1uICovXG4gICAgaG91cnNMYWJlbCA9IHRoaXMuX2JiYlRyYW5zbGF0ZS50cmFuc2Zvcm0oJ0hvdXJzJyk7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdkZWNyZWFzZSBob3VycycgYnV0dG9uICovXG4gICAgZGVjcmVhc2VIb3Vyc0xhYmVsID0gJ0RlY3JlYXNlIGhvdXJzJztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2luY3JlYXNlIG1pbnV0ZXMnIGJ1dHRvbiAqL1xuICAgIGluY3JlYXNlTWludXRlc0xhYmVsID0gJ0luY3JlYXNlIG1pbnV0ZXMnO1xuXG4gICAgLyoqIGxhYmVsIGZvciB0aGUgJ21pbnV0ZXMnIGNvbHVtbiAqL1xuICAgIG1pbnV0ZXNMYWJlbCA9IHRoaXMuX2JiYlRyYW5zbGF0ZS50cmFuc2Zvcm0oJ01pbnV0ZXMnKTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2RlY3JlYXNlIG1pbnV0ZXMnIGJ1dHRvbiAqL1xuICAgIGRlY3JlYXNlTWludXRlc0xhYmVsID0gJ0RlY3JlYXNlIG1pbnV0ZXMnO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSAnaW5jcmVhc2Ugc2Vjb25kcycgYnV0dG9uICovXG4gICAgaW5jcmVhc2VTZWNvbmRzTGFiZWwgPSAnSW5jcmVhc2Ugc2Vjb25kcyc7XG5cbiAgICAvKiogbGFiZWwgZm9yIHRoZSAnc2Vjb25kcycgY29sdW1uICovXG4gICAgc2Vjb25kc0xhYmVsID0gdGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnU2VjJyk7XG5cbiAgICAvKiogQXJpYSBsYWJlbCBmb3IgdGhlICdkZWNyZWFzZSBzZWNvbmRzJyBidXR0b24gKi9cbiAgICBkZWNyZWFzZVNlY29uZHNMYWJlbCA9ICdEZWNyZWFzZSBzZWNvbmRzJztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2luY3JlYXNlIHBlcmlvZCcgYnV0dG9uICovXG4gICAgaW5jcmVhc2VQZXJpb2RMYWJlbCA9ICdJbmNyZWFzZSBwZXJpb2QnO1xuXG4gICAgLyoqIGxhYmVsIGZvciB0aGUgJ3BlcmlvZCcgY29sdW1uICovXG4gICAgcGVyaW9kTGFiZWwgPSAnUGVyaW9kJztcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgJ2RlY3JlYXNlIHBlcmlvZCcgYnV0dG9uICovXG4gICAgZGVjcmVhc2VQZXJpb2RMYWJlbCA9ICdEZWNyZWFzZSBwZXJpb2QnO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2JiYlRyYW5zbGF0ZTogQmJiVHJhbnNsYXRlUGlwZSkge31cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdiYy1kYXRlLXRpbWUtcGlja2VyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZS10aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBEYXRldGltZUFkYXB0ZXIsXG4gICAgICAgICAgICB1c2VDbGFzczogRmREYXRldGltZUFkYXB0ZXJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBnZXREYXRlU2VydmljZVxuICAgICAgICB9LFxuICAgICAgICBDYWxlbmRhclNlcnZpY2VcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIERhdGVUaW1lUGlja2VyQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHByaW1hcnlDYWxlbmRhclR5cGU6ICdHcmVnb3JpYW4nIHwgJ1BlcnNpYW4nIHwgc3RyaW5nO1xuICAgIEBJbnB1dCgpIGZvcm1hdFBhdHRlcm46IHN0cmluZztcbiAgICBASW5wdXQoKSB2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBASW5wdXQoKSB0aW1lVmFsdWU6IEZkRGF0ZTtcbiAgICBASW5wdXQoKSBzdGFydFJhbmdlRGF0ZTogRGF0ZTtcbiAgICBASW5wdXQoKSBlbmRSYW5nZURhdGU6IERhdGU7XG4gICAgQElucHV0KCkgaXNSYW5nZVBpY2tlcjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93VGltZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93RGF0ZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBydGwgPSB0cnVlO1xuICAgIEBJbnB1dCgpIGRldmljZVNpemU6IEFiYnJldmF0aW9uRGV2aWNlU2l6ZTtcbiAgICBASW5wdXQoKSBpc01vYmlsZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBidXR0b25NZW51TW9kZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbmxpbmVNb2RlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRhdGVyYW5nZU1vZGU6IGJvb2xlYW47XG4gICAgQE91dHB1dCgpIHJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0RGF5OiBEYXRlOyBlbmREYXk6IERhdGUgfT4oKTtcbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gICAgQFZpZXdDaGlsZChUaW1lQ29tcG9uZW50KSB0aW1lQ29tcG9uZW50OiBUaW1lQ29tcG9uZW50PEZkRGF0ZT47XG4gICAgQFZpZXdDaGlsZChJbnB1dEdyb3VwQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnB1dEdyb3VwQ29tcG9uZW50OiBJbnB1dEdyb3VwQ29tcG9uZW50O1xuICAgIHZhbHVlQ2FwdGlvbiA9ICcnO1xuICAgIGVuZFNlbGVjdGVkRGF5OiBEYXkgfCBudWxsO1xuICAgIHN0YXJ0U2VsZWN0ZWREYXk6IERheSB8IG51bGw7XG4gICAgdmFsdWVEYXk6IERheSB8IG51bGw7XG5cbiAgICBzZWxlY3Rpb25Nb2RlOiAnZGF5JyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF5JztcbiAgICB0b2RheUluZGV4ID0gLTE7XG4gICAgd2lkdGgkOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgc2VsZWN0ZWRNb250aCQ6IE9ic2VydmFibGU8Q2FsZW5kYXJNb250aEluZm8+O1xuICAgIHJ0bCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgdG9kYXk6IERhdGU7XG4gICAgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xuICAgIHdlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgIGN1bHR1cmU6IHN0cmluZztcbiAgICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gICAgeWVhcnM6IHN0cmluZ1tdO1xuICAgIHRlbXBGb3JtbWF0ZWREYXRlID0gJyc7XG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2U7XG4gICAgcHJpdmF0ZSBfbGFzdFZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2RhdGV0aW1lQWRhcHRlcjogRGF0ZXRpbWVBZGFwdGVyPEZkRGF0ZT4sXG4gICAgICAgIHByaXZhdGUgX2RhdGVUaW1lVG9DYXB0aW9uOiBEYXRlVGltZVRvQ2FwdGlvblBpcGUsXG4gICAgICAgIHByaXZhdGUgX2xvZ1NlcnZpY2U6IExvZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2RpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgICAgIF9wb3J0YWxTZXJ2aWNlOiBQb3J0YWxTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5ydGwkID0gX3BvcnRhbFNlcnZpY2UucnRsJDtcbiAgICAgICAgdGhpcy53aWR0aCQgPSBfcG9ydGFsU2VydmljZS5kZXZpY2VTaXplJC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIG1hcCgoZGV2aWNlU2l6ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93RGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjYwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRldmljZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hsJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1NjA7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMyMDtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1MjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmhlaWdodCA9IDQyMDtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgbGV0IGN1bHR1cmUgPSAnZW4tVVMnO1xuICAgICAgICBzd2l0Y2ggKHRoaXMucHJpbWFyeUNhbGVuZGFyVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnSGlqcmlTaGFtc2knOlxuICAgICAgICAgICAgICAgIGN1bHR1cmUgPSAnZmEtSVInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VsdHVyZSA9IGN1bHR1cmU7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZSA9IG5ldyBDYWxlbmRhclNlcnZpY2UodGhpcy5fbG9nU2VydmljZSwgY3VsdHVyZSk7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZXRNb2RlKCdtb250aCcpO1xuICAgICAgICB0aGlzLndlZWtEYXlzTWluID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLndlZWtEYXlzTWluKCk7XG4gICAgICAgIHRoaXMud2Vla0RheXMgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uud2Vla0RheXMoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoJCA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZWxlY3RlZCQ7XG4gICAgICAgIHRoaXMudG9kYXkgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXk7XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudGltZVZhbHVlID0gRmREYXRlLmdldEZkRGF0ZUJ5RGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX3NldENhcHRpb24odGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE1vbnRoQnlEYXRlKHRoaXMudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUgPSBGZERhdGUuZ2V0RmREYXRlQnlEYXRlKG5ldyBEYXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmICh0aGlzLmlzUmFuZ2VQaWNrZXIpIHtcbiAgICAgICAgLy8gICBpZiAodGhpcy5zdGFydFJhbmdlRGF0ZSkge1xuICAgICAgICAvLyAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWRNb250aEJ5RGF0ZSh0aGlzLnN0YXJ0UmFuZ2VEYXRlKTtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vICAgaWYgKHRoaXMuZW5kUmFuZ2VEYXRlKSB7XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTW9udGhCeURhdGUodGhpcy52YWx1ZSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5tb250aHMgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuTW9udGhzO1xuICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcih0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2VsZWN0ZWRNb250aC5kYXRlSW5mby55ZWFyKTtcbiAgICAgICAgdGhpcy5fc2V0Rm9ybWF0dGVkRGF0ZVRvSW5wdXQodGhpcy52YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0R3JvdXBDb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuaW5wdXRHcm91cENvbXBvbmVudC5yZWdpc3Rlck9uQ2hhbmdlKHRoaXMub25DYXB0aW9uQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGNoYW5nZXM7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhcHRpb24gPSB0aGlzLl9nZXRGb3JtYXR0ZWREYXRlKHZhbHVlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY2FwdGlvbiAhPT0gdGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50Py5pbnB1dFRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvblJhbmdlQ2hhbmdlKGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIHN0YXJ0RGF5OiBlLnN0YXJ0RGF5LFxuICAgICAgICAgICAgZW5kRGF5OiBlLmVuZERheVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50aW1lQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGltZUNvbXBvbmVudC5yZWZyZXNoQ29sdW1ucygpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXZpY2VTaXplID09PSAncycgfHwgdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKGRpYWxvZ1RlbXBsYXRlLCB7XG4gICAgICAgICAgICAgICAgbW9iaWxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwb3BvdmVyLm9wZW4oKTtcbiAgICB9XG4gICAgb25Nb250aFNlbGVjdGVkKG1vbnRoTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvTW9udGgobW9udGhOYW1lLCBpbmRleCk7XG4gICAgfVxuICAgIG9uWWVhclNlbGVjdGVkKHllYXI6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1llYXIoK3llYXIpO1xuICAgIH1cblxuICAgIG9uQ2FwdGlvbkNoYW5nZWQoZSk6IHZvaWQge1xuICAgICAgICBpZiAoZS5sZW5ndGggPCAxMCkge1xuICAgICAgICAgICAgaWYgKGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZ2xpc2hEYXRlU3RyID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuUmVwbGFjZUZhVG9BckNoYXJjaHRlcihlKTtcbiAgICAgICAgbGV0IGZvcm1hdCA9ICdqWVlZWS9qTS9qRCc7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICBmb3JtYXQgKz0gJyBISDptbSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9tZW50ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLl9kYXRlU2VydmljZS5zdHJpbmdUb01vbWVudChlbmdsaXNoRGF0ZVN0ciwgZm9ybWF0KTtcbiAgICAgICAgLy8gY29uc3QgaXNWYWxpZCA9IG1vbWVudC5pc1ZhbGlkKCk7Ly8g2KjYsdin24wg2LTZhdiz24wg2YfZhduM2LTZhyBmYWxzZSDZhti02YjZhiDZhduM2K/Zh1xuICAgICAgICBpZiAoaXNOYU4oRGF0ZS5wYXJzZShlbmdsaXNoRGF0ZVN0cikpKSB7XG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbW9tZW50LnRvRGF0ZSgpO1xuICAgICAgICBpZiAoaXNOYU4oZGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMudGltZVZhbHVlID0gdGhpcy5fZGF0ZXRpbWVBZGFwdGVyLnNldFRpbWUoXG4gICAgICAgICAgICB0aGlzLnRpbWVWYWx1ZSxcbiAgICAgICAgICAgIGRhdGUuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF0ZSwgZmFsc2UpO1xuICAgIH1cbiAgICBvblByZXZUYXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdkYXknKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZpb3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZFByZXZZZWFyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKE51bWJlcih0aGlzLnllYXJzWzBdKSAtIDIwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTmV4dFRhcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTmV4dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWROZXh0WWVhcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlWWVhcihOdW1iZXIodGhpcy55ZWFyc1t0aGlzLnllYXJzLmxlbmd0aCAtIDFdKSArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Ub2RheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLnRpbWVWYWx1ZSA9IHRoaXMuX2RhdGV0aW1lQWRhcHRlci5zZXRUaW1lKFxuICAgICAgICAgICAgdGhpcy50aW1lVmFsdWUsXG4gICAgICAgICAgICB0b2RheS5nZXRIb3VycygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0TWludXRlcygpLFxuICAgICAgICAgICAgdG9kYXkuZ2V0U2Vjb25kcygpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXlEYXkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS50b2RheURheTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuXG4gICAgb25EYXlDbGljayhkYXk6IERheSwgcG9wb3ZlciwgZGlhbG9nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNWYWxpZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRFbmREYXkoZGF5LCBwb3BvdmVyLCBkaWFsb2cpO1xuICAgIH1cblxuICAgIG9uUG9wb3Zlck9wZW5DaGFuZ2UoaXNPcGVuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25DbGVhcihwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zZXRGb3JtYXR0ZWREYXRlVG9JbnB1dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5fcmFpc1ZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgb25Payhwb3BvdmVyLCBkaWFsb2cpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRpYWxvZykge1xuICAgICAgICAgICAgZGlhbG9nLmRpc21pc3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlQ2hhbmdlKCk7XG4gICAgfVxuICAgIG9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbGFzdFZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fbGFzdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbih0aGlzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wb3Zlci5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rm9ybWF0dGVkRGF0ZVRvSW5wdXQoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZSA9IHRoaXMuX2dldEZvcm1hdHRlZERhdGUoZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnRlbXBGb3JtbWF0ZWREYXRlID0gZm9ybWF0dGVkRGF0ZTtcbiAgICAgICAgICAgIHRoaXMuX3NldElucHV0R3JvdXBUZXh0KGZvcm1hdHRlZERhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGVtcEZvcm1tYXRlZERhdGUgPSAnJztcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRHcm91cFRleHQoJycpO1xuICAgIH1cbiAgICBwcml2YXRlIF9zZXRJbnB1dEdyb3VwVGV4dCh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0R3JvdXBDb21wb25lbnQuaW5wdXRUZXh0ID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldEZvcm1hdHRlZERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlVGltZVRvQ2FwdGlvbi50cmFuc2Zvcm0oZGF0ZSwgdGhpcy5mb3JtYXRQYXR0ZXJuLCB0aGlzLmN1bHR1cmUsIHRoaXMuc2hvd0RhdGUsIHRoaXMuc2hvd1RpbWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVZhbHVlQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zaG93RGF0ZSA/IHRoaXMuc3RhcnRTZWxlY3RlZERheT8uZGF0ZSA/PyB0aGlzLnZhbHVlIDogbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXcgRGF0ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0SG91cnModGhpcy50aW1lVmFsdWUuaG91cik7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldE1pbnV0ZXModGhpcy50aW1lVmFsdWUubWludXRlKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0U2Vjb25kcyh0aGlzLnRpbWVWYWx1ZS5zZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLl9yYWlzVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9wcmVwYXJlWWVhcihmcm9tOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeWVhcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjA7IGkrKykge1xuICAgICAgICAgICAgeWVhcnMucHVzaChgJHtmcm9tICsgaX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnllYXJzID0geWVhcnM7XG4gICAgfVxuICAgIHByaXZhdGUgX3NldENhcHRpb24odmFsdWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSAnJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm9ybWF0UGF0dGVybiA9IHRoaXMuZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdZWVlZJywgJ2pZWVlZJyk7XG4gICAgICAgIGZvcm1hdFBhdHRlcm4gPSBmb3JtYXRQYXR0ZXJuLnJlcGxhY2UoJ01NJywgJ2pNTScpO1xuICAgICAgICBmb3JtYXRQYXR0ZXJuID0gZm9ybWF0UGF0dGVybi5yZXBsYWNlKCdERCcsICdqREQnKTtcbiAgICAgICAgdGhpcy52YWx1ZUNhcHRpb24gPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UuX2RhdGVTZXJ2aWNlLmdldE1vbWVudCh2YWx1ZSkuZm9ybWF0KGZvcm1hdFBhdHRlcm4pO1xuICAgIH1cbiAgICBwcml2YXRlIF9yYWlzVmFsdWVDaGFuZ2VkKGRhdGUsIHNldENhcHRpb24gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBkYXRlO1xuICAgICAgICBpZiAoc2V0Q2FwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q2FwdGlvbihkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rmlyc3RBbmRFbmREYXkoZGF5OiBEYXksIHBvcG92ZXIsIGRpYWxvZyk6IHZvaWQge1xuICAgICAgICBpZiAoZGlhbG9nKSB7XG4gICAgICAgICAgICBkaWFsb2cuZGlzbWlzcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3BvdmVyKSB7XG4gICAgICAgICAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzUmFuZ2VQaWNrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEZvcm1hdHRlZERhdGVUb0lucHV0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX3JhaXNWYWx1ZUNoYW5nZWQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiB0aGlzLmVuZFNlbGVjdGVkRGF5ICYmIHRoaXMuc3RhcnRTZWxlY3RlZERheS5kYXRlID4gdGhpcy5lbmRTZWxlY3RlZERheS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gdGhpcy5zdGFydFNlbGVjdGVkRGF5O1xuICAgICAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheTtcbiAgICAgICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgJiYgdGhpcy5lbmRTZWxlY3RlZERheSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgICAgICBzdGFydERheTogdGhpcy5zdGFydFNlbGVjdGVkRGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgZW5kRGF5OiB0aGlzLmVuZFNlbGVjdGVkRGF5LmRhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmIChpbmxpbmVNb2RlKSB7XG48bmctY29udGFpbmVyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgZGF0ZXJhbmdlTW9kZSA/IGRhdGVSYW5nZVRwbCA6IG1vbnRoO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHNlbGVjdGVkTW9udGgkIHwgYXN5bmMsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgIHJ0bDogcnRsJCB8IGFzeW5jLFxuICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgd2Vla0RheXNNaW46IHdlZWtEYXlzTWluLFxuICAgICAgICAgICAgdG9kYXk6IHRvZGF5LFxuICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgIHBvcG92ZXI6IHBvcG92ZXJcbiAgICAgICAgfVxuICAgIFwiXG4+XG48L25nLWNvbnRhaW5lcj5cbn1cbjxuZy10ZW1wbGF0ZSAjZGF0ZVJhbmdlVHBsPlxuICAgIDxiYy1jYWxlbmRhci1zZWxlY3Rpb24tZGF5c1xuICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgW2lubGluZV09XCJ0cnVlXCJcbiAgICAgICAgW21vbnRoSW5mb109XCIoc2VsZWN0ZWRNb250aCQgfCBhc3luYykhIVwiXG4gICAgICAgIChyYW5nZUNoYW5nZSk9XCJvblJhbmdlQ2hhbmdlKCRldmVudClcIlxuICAgID48L2JjLWNhbGVuZGFyLXNlbGVjdGlvbi1kYXlzPlxuPC9uZy10ZW1wbGF0ZT5cbjxmZC1pbnB1dC1ncm91cFxuICAgIHBsYWNlbWVudD1cImFmdGVyXCJcbiAgICBnbHlwaD1cImNhbGVuZGFyXCJcbiAgICBnbHlwaEFyaWFMYWJlbD1cInNlbGVjdCBkYXlcIlxuICAgIGFyaWFMYWJlbGxlZEJ5PVwiZmQtaW5wdXQtZ3JvdXAtaWNvbi1sYWJlbC0yXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgW2J1dHRvbl09XCJ0cnVlXCJcbiAgICBbc3RhdGVdPVwiaXNWYWxpZCA/ICdzdWNjZXNzJyA6ICdlcnJvcidcIlxuICAgIFtzaG93Rm9jdXNdPVwidHJ1ZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgIFtzdHlsZS5kaXNwbGF5XT1cIiFidXR0b25NZW51TW9kZSB8fCBpbmxpbmVNb2RlID8gJ2luaGVyaXQnIDogJ25vbmUnXCJcbiAgICAoYWRkT25CdXR0b25DbGlja2VkKT1cIm9uT3BlblBvcG92ZXIocG9wb3ZlciwgZGlhbG9nVGVtcGxhdGUpXCJcbj5cbjwvZmQtaW5wdXQtZ3JvdXA+XG5AaWYgKGJ1dHRvbk1lbnVNb2RlKSB7XG48YnV0dG9uXG4gICAgZmQtYnV0dG9uXG4gICAgW2xhYmVsXT1cInRlbXBGb3JtbWF0ZWREYXRlIHx8IHBsYWNlaG9sZGVyXCJcbiAgICBbdGl0bGVdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtmZFR5cGVdPVwidmFsdWUgPyAnc3RhbmRhcmQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgW2ZkTWVudV09XCJ0cnVlXCJcbiAgICAoY2xpY2spPVwib25PcGVuUG9wb3Zlcihwb3BvdmVyLCBkaWFsb2dUZW1wbGF0ZSlcIlxuICAgIFtjbGFzcy5wbGFjZWhvbGRlci1jdXN0b21dPVwiIXZhbHVlXCJcbiAgICBjbGFzcz1cIm1lbnUtYnV0dG9uLWRhdGVwaWNrZXJcIlxuPjwvYnV0dG9uPlxufVxuXG48ZmQtcG9wb3ZlciAjcG9wb3ZlciAoaXNPcGVuQ2hhbmdlKT1cIm9uUG9wb3Zlck9wZW5DaGFuZ2UoJGV2ZW50KVwiIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiIFtmb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIj5cbiAgICA8ZmQtcG9wb3Zlci1ib2R5IFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1vbnRoO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5c01pbjogd2Vla0RheXNNaW4sXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgcG9wb3ZlcjogcG9wb3ZlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgZmQtcG9wb3Zlci1ib2R5LWZvb3Rlcj5cbiAgICAgICAgICAgIDxkaXYgZmQtYmFyIFtiYXJEZXNpZ25dPVwiJ2Zvb3RlcidcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGZkLWJhci1yaWdodD5cbiAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlckJ1dHRvbnNcIj48L2NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2ZkLXBvcG92ZXItYm9keT5cbjwvZmQtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSBsZXQtZGlhbG9nIGxldC1kaWFsb2dDb25maWc9XCJkaWFsb2dDb25maWdcIiAjZGlhbG9nVGVtcGxhdGU+XG4gICAgPGZkLWRpYWxvZyBbZGlhbG9nQ29uZmlnXT1cImRpYWxvZ0NvbmZpZ1wiIFtkaWFsb2dSZWZdPVwiZGlhbG9nXCI+XG4gICAgICAgIDxmZC1kaWFsb2ctYm9keT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICBtb250aDtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzOiB3ZWVrRGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzTWluOiB3ZWVrRGF5c01pbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNpemU6IGRldmljZVNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3BvdmVyOiBwb3BvdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nOiBkaWFsb2dcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1kaWFsb2ctYm9keT5cbiAgICAgICAgPGZkLWRpYWxvZy1mb290ZXI+XG4gICAgICAgICAgICA8Y29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9vdGVyQnV0dG9uczsgY29udGV4dDogeyBkaWFsb2c6IGRpYWxvZyB9XCI+PC9jb250YWluZXI+XG4gICAgICAgIDwvZmQtZGlhbG9nLWZvb3Rlcj5cbiAgICA8L2ZkLWRpYWxvZz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2Zvb3RlckJ1dHRvbnMgbGV0LWRpYWxvZz1cImRpYWxvZ1wiPlxuICAgIDxmZC1idXR0b24tYmFyIFtsYWJlbF09XCInT2snIHwgYmJiVHJhbnNsYXRlXCIgZmRUeXBlPVwiZW1waGFzaXplZFwiIChjbGljayk9XCJvbk9rKHBvcG92ZXIsIGRpYWxvZylcIj48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXJcbiAgICAgICAgW2xhYmVsXT1cIidDbGVhcicgfCBiYmJUcmFuc2xhdGVcIlxuICAgICAgICBmZFR5cGU9XCJzdGFuZGFyZFwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKHBvcG92ZXIsIGRpYWxvZylcIlxuICAgID48L2ZkLWJ1dHRvbi1iYXI+XG4gICAgPGZkLWJ1dHRvbi1iYXIgW2xhYmVsXT1cIidDYW5jZWwnIHwgYmJiVHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKHBvcG92ZXIsIGRpYWxvZylcIj48L2ZkLWJ1dHRvbi1iYXI+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlXG4gICAgI21vbnRoXG4gICAgbGV0LXNlbGVjdGVkTW9udGhcbiAgICBsZXQtd2lkdGg9XCJ3aWR0aFwiXG4gICAgbGV0LWhlaWdodD1cImhlaWdodFwiXG4gICAgbGV0LXJ0bD1cInJ0bFwiXG4gICAgbGV0LXRvZGF5PVwidG9kYXlcIlxuICAgIGxldC1zaG93RXZlbnRzPVwic2hvd0V2ZW50c1wiXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcbiAgICBsZXQtcG9wb3Zlcj1cInBvcG92ZXJcIlxuICAgIGxldC1kaWFsb2c9XCJkaWFsb2dcIlxuPlxuICAgIEBpZiAoc2hvd0RhdGUpIHtcbiAgICA8ZmQtdG9vbGJhciBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtsYWJlbF09XCIoc2hvd0RhdGUgPyAnRGF0ZVJfVG9kYXknIDogJ05vdycpIHwgYmJiVHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblRvZGF5KClcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnIDogJ25hdmlnYXRpb24tbGVmdC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUHJldlRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICB9IEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICBbZ2x5cGhdPVwicnRsID8gJ25hdmlnYXRpb24tbGVmdC1hcnJvdycgOiAnbmF2aWdhdGlvbi1yaWdodC1hcnJvdydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTmV4dFRhcCgpXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICB9IEBpZiAoc2hvd0RhdGUpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXJzLXdyYXBwZXJcIiBmZC10aXRsZSBmZC10b29sYmFyLWl0ZW0+XG4gICAgICAgICAgICBAaWYgKHNlbGVjdGlvbk1vZGUgPT09ICdkYXknIHx8IHNlbGVjdGlvbk1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLm1vbnRoTmFtZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnbW9udGgnXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLnllYXJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ3llYXInXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2ZkLXRvb2xiYXI+XG4gICAgfVxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgIEBzd2l0Y2ggKHNlbGVjdGlvbk1vZGUpIHsgQGNhc2UgKCdtb250aCcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0aW9uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIG1vbnRoczsgdHJhY2sgbW9udGg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4LWdyb3c6IDE7IHdpZHRoOiAzMyVcIlxuICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWUgPT09IG1vbnRoID8gJ2VtcGhhc2l6ZWQnIDogJ3RyYW5zcGFyZW50J1wiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm1vbnRoXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICdkYXknOyBvbk1vbnRoU2VsZWN0ZWQobW9udGgsIGkpXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGNhc2UgKCd5ZWFyJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibW9udGgteWVhci1zZWxlY3Rpb24td3JhcHBlclwiPlxuICAgICAgICAgICAgQGZvciAoeWVhciBvZiB5ZWFyczsgdHJhY2sgeWVhcikge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleC1ncm93OiAxOyB3aWR0aDogMjUlXCJcbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBbZmRUeXBlXT1cInNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhciA9PT0gK3llYXIgPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwieWVhclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnZGF5Jzsgb25ZZWFyU2VsZWN0ZWQoeWVhcilcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZGVmYXVsdCB7XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCI+XG4gICAgICAgICAgICBAaWYgKHNob3dEYXRlKSB7XG4gICAgICAgICAgICA8YmMtY2FsZW5kYXItbW9udGhcbiAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICBbY29udGFpbmVyV2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgICAgICBbbW9udGhXZWVrc0NvdW50XT1cInNlbGVjdGVkTW9udGgud2Vla3NDb3VudFwiXG4gICAgICAgICAgICAgICAgW3dlZWtEYXlzXT1cIndlZWtEYXlzXCJcbiAgICAgICAgICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICAgICAgICAgIFt0b2RheV09XCJ0b2RheVwiXG4gICAgICAgICAgICAgICAgW2RhdGVQaWNrZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2RhdGVSYW5nZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWREYXRlXT1cInN0YXJ0U2VsZWN0ZWREYXkgPyBzdGFydFNlbGVjdGVkRGF5LmRhdGUgOiB2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2RheXNdPVwic2VsZWN0ZWRNb250aC5kYXlzXCJcbiAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICAoZGF5Q2xpY2spPVwib25EYXlDbGljaygkZXZlbnQsIHBvcG92ZXIsIGRpYWxvZylcIlxuICAgICAgICAgICAgPjwvYmMtY2FsZW5kYXItbW9udGg+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwZXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICBAaWYgKHNob3dUaW1lKSB7XG4gICAgICAgICAgICA8ZmQtdGltZVxuICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlyZWN0aW9uOiBsdHJcIlxuICAgICAgICAgICAgICAgIGZkQ29tcGFjdFxuICAgICAgICAgICAgICAgIFtrZWVwVHdvRGlnaXRzXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGltZVZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZGlzcGxheVNlY29uZHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgPjwvZmQtdGltZT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==