@skyux/datetime 8.7.0 → 9.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/esm2022/lib/modules/date-pipe/date-format-utility.mjs +45 -0
  2. package/{esm2020 → esm2022}/lib/modules/date-pipe/date-pipe.module.mjs +5 -5
  3. package/esm2022/lib/modules/date-pipe/date.pipe.mjs +67 -0
  4. package/esm2022/lib/modules/date-pipe/fuzzy-date.pipe.mjs +47 -0
  5. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker-end-date-resource-key.pipe.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker-start-date-resource-key.pipe.mjs +4 -4
  7. package/esm2022/lib/modules/date-range-picker/date-range-picker.component.mjs +518 -0
  8. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker.module.mjs +19 -19
  9. package/esm2022/lib/modules/date-range-picker/date-range.service.mjs +97 -0
  10. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator.mjs +54 -0
  11. package/esm2022/lib/modules/datepicker/date-formatter.mjs +38 -0
  12. package/esm2022/lib/modules/datepicker/datepicker-adapter.service.mjs +23 -0
  13. package/esm2022/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +332 -0
  14. package/esm2022/lib/modules/datepicker/datepicker-calendar.component.mjs +95 -0
  15. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-config.service.mjs +4 -4
  16. package/esm2022/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +487 -0
  17. package/esm2022/lib/modules/datepicker/datepicker-input.directive.mjs +534 -0
  18. package/esm2022/lib/modules/datepicker/datepicker.component.mjs +327 -0
  19. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker.module.mjs +35 -35
  20. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker.service.mjs +4 -4
  21. package/{esm2020 → esm2022}/lib/modules/datepicker/daypicker-button.component.mjs +4 -4
  22. package/esm2022/lib/modules/datepicker/daypicker-cell.component.mjs +128 -0
  23. package/esm2022/lib/modules/datepicker/daypicker.component.mjs +224 -0
  24. package/esm2022/lib/modules/datepicker/fuzzy-date.service.mjs +412 -0
  25. package/esm2022/lib/modules/datepicker/monthpicker.component.mjs +80 -0
  26. package/{esm2020 → esm2022}/lib/modules/datepicker/yearpicker.component.mjs +53 -54
  27. package/{esm2020 → esm2022}/lib/modules/shared/sky-datetime-resources.module.mjs +11 -11
  28. package/esm2022/lib/modules/timepicker/timepicker.component.mjs +396 -0
  29. package/esm2022/lib/modules/timepicker/timepicker.directive.mjs +237 -0
  30. package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker.module.mjs +17 -17
  31. package/esm2022/testing/datepicker-fixture.mjs +55 -0
  32. package/esm2022/testing/timepicker-fixture.mjs +52 -0
  33. package/fesm2022/skyux-datetime-testing.mjs +112 -0
  34. package/{fesm2020 → fesm2022}/skyux-datetime-testing.mjs.map +1 -1
  35. package/fesm2022/skyux-datetime.mjs +5030 -0
  36. package/fesm2022/skyux-datetime.mjs.map +1 -0
  37. package/lib/modules/date-range-picker/date-range-picker.component.d.ts +1 -1
  38. package/lib/modules/datepicker/datepicker-calendar-inner.component.d.ts +1 -1
  39. package/lib/modules/datepicker/datepicker-calendar.component.d.ts +1 -1
  40. package/lib/modules/datepicker/datepicker-input-fuzzy.directive.d.ts +1 -1
  41. package/lib/modules/datepicker/datepicker-input.directive.d.ts +1 -1
  42. package/lib/modules/datepicker/datepicker.component.d.ts +1 -1
  43. package/lib/modules/datepicker/daypicker-button.component.d.ts +1 -1
  44. package/lib/modules/datepicker/daypicker-cell.component.d.ts +1 -1
  45. package/lib/modules/datepicker/daypicker.component.d.ts +1 -1
  46. package/lib/modules/timepicker/timepicker.directive.d.ts +1 -1
  47. package/package.json +19 -27
  48. package/esm2020/lib/modules/date-pipe/date-format-utility.mjs +0 -45
  49. package/esm2020/lib/modules/date-pipe/date.pipe.mjs +0 -70
  50. package/esm2020/lib/modules/date-pipe/fuzzy-date.pipe.mjs +0 -50
  51. package/esm2020/lib/modules/date-range-picker/date-range-picker.component.mjs +0 -494
  52. package/esm2020/lib/modules/date-range-picker/date-range.service.mjs +0 -100
  53. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator.mjs +0 -53
  54. package/esm2020/lib/modules/datepicker/date-formatter.mjs +0 -38
  55. package/esm2020/lib/modules/datepicker/datepicker-adapter.service.mjs +0 -26
  56. package/esm2020/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +0 -333
  57. package/esm2020/lib/modules/datepicker/datepicker-calendar.component.mjs +0 -96
  58. package/esm2020/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +0 -462
  59. package/esm2020/lib/modules/datepicker/datepicker-input.directive.mjs +0 -496
  60. package/esm2020/lib/modules/datepicker/datepicker.component.mjs +0 -319
  61. package/esm2020/lib/modules/datepicker/daypicker-cell.component.mjs +0 -126
  62. package/esm2020/lib/modules/datepicker/daypicker.component.mjs +0 -216
  63. package/esm2020/lib/modules/datepicker/fuzzy-date.service.mjs +0 -392
  64. package/esm2020/lib/modules/datepicker/monthpicker.component.mjs +0 -81
  65. package/esm2020/lib/modules/timepicker/timepicker.component.mjs +0 -389
  66. package/esm2020/lib/modules/timepicker/timepicker.directive.mjs +0 -236
  67. package/esm2020/testing/datepicker-fixture.mjs +0 -58
  68. package/esm2020/testing/timepicker-fixture.mjs +0 -55
  69. package/fesm2015/skyux-datetime-testing.mjs +0 -117
  70. package/fesm2015/skyux-datetime-testing.mjs.map +0 -1
  71. package/fesm2015/skyux-datetime.mjs +0 -4925
  72. package/fesm2015/skyux-datetime.mjs.map +0 -1
  73. package/fesm2020/skyux-datetime-testing.mjs +0 -117
  74. package/fesm2020/skyux-datetime.mjs +0 -4895
  75. package/fesm2020/skyux-datetime.mjs.map +0 -1
  76. /package/{esm2020 → esm2022}/index.mjs +0 -0
  77. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculation.mjs +0 -0
  78. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-config.mjs +0 -0
  79. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.mjs +0 -0
  80. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-id.mjs +0 -0
  81. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-type.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-validate-function.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-default-calculator-config.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-default-calculator-configs.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-relative-value.mjs +0 -0
  86. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range.mjs +0 -0
  87. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-calendar-change.mjs +0 -0
  88. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-custom-date.mjs +0 -0
  89. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-date.mjs +0 -0
  90. /package/{esm2020 → esm2022}/lib/modules/datepicker/fuzzy-date.mjs +0 -0
  91. /package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker-time-format-type.mjs +0 -0
  92. /package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker-time-output.mjs +0 -0
  93. /package/{esm2020 → esm2022}/skyux-datetime.mjs +0 -0
  94. /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
  95. /package/{esm2020 → esm2022}/testing/skyux-datetime-testing.mjs +0 -0
@@ -0,0 +1,518 @@
1
+ import { ChangeDetectionStrategy, Component, Input, Optional, forwardRef, } from '@angular/core';
2
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR, UntypedFormControl, } from '@angular/forms';
3
+ import { Subject, combineLatest } from 'rxjs';
4
+ import { distinctUntilChanged, first, takeUntil } from 'rxjs/operators';
5
+ import { SkyDateFormatter } from '../datepicker/date-formatter';
6
+ import { SkyDateRangeCalculatorId } from './types/date-range-calculator-id';
7
+ import { SkyDateRangeCalculatorType } from './types/date-range-calculator-type';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./date-range.service";
10
+ import * as i2 from "@angular/forms";
11
+ import * as i3 from "@skyux/i18n";
12
+ import * as i4 from "@skyux/theme";
13
+ import * as i5 from "@angular/common";
14
+ import * as i6 from "../datepicker/datepicker.component";
15
+ import * as i7 from "../datepicker/datepicker-input.directive";
16
+ import * as i8 from "@skyux/forms";
17
+ import * as i9 from "./date-range-picker-end-date-resource-key.pipe";
18
+ import * as i10 from "./date-range-picker-start-date-resource-key.pipe";
19
+ const SKY_DATE_RANGE_PICKER_VALUE_ACCESSOR = {
20
+ provide: NG_VALUE_ACCESSOR,
21
+ useExisting: forwardRef(() => SkyDateRangePickerComponent),
22
+ multi: true,
23
+ };
24
+ const SKY_DATE_RANGE_PICKER_VALIDATOR = {
25
+ provide: NG_VALIDATORS,
26
+ useExisting: forwardRef(() => SkyDateRangePickerComponent),
27
+ multi: true,
28
+ };
29
+ let uniqueId = 0;
30
+ /**
31
+ * Acts as a form control with a form model of type `SkyDateRangeCalculation`.
32
+ * @example
33
+ * ```
34
+ * <sky-date-range-picker
35
+ * formControlName="myPicker"
36
+ * >
37
+ * </sky-date-range-picker>
38
+ * ```
39
+ */
40
+ export class SkyDateRangePickerComponent {
41
+ /**
42
+ * IDs for the date range options to include in the picker's dropdown.
43
+ * The options specify calculator objects that return two `Date` objects to represent date ranges.
44
+ * By default, this property includes all `SkyDateRangeCalculatorId` values.
45
+ */
46
+ set calculatorIds(value) {
47
+ this.#_calculatorIds = value || [
48
+ SkyDateRangeCalculatorId.AnyTime,
49
+ SkyDateRangeCalculatorId.Before,
50
+ SkyDateRangeCalculatorId.After,
51
+ SkyDateRangeCalculatorId.SpecificRange,
52
+ SkyDateRangeCalculatorId.Yesterday,
53
+ SkyDateRangeCalculatorId.Today,
54
+ SkyDateRangeCalculatorId.Tomorrow,
55
+ SkyDateRangeCalculatorId.LastWeek,
56
+ SkyDateRangeCalculatorId.ThisWeek,
57
+ SkyDateRangeCalculatorId.NextWeek,
58
+ SkyDateRangeCalculatorId.LastMonth,
59
+ SkyDateRangeCalculatorId.ThisMonth,
60
+ SkyDateRangeCalculatorId.NextMonth,
61
+ SkyDateRangeCalculatorId.LastQuarter,
62
+ SkyDateRangeCalculatorId.ThisQuarter,
63
+ SkyDateRangeCalculatorId.NextQuarter,
64
+ SkyDateRangeCalculatorId.LastCalendarYear,
65
+ SkyDateRangeCalculatorId.ThisCalendarYear,
66
+ SkyDateRangeCalculatorId.NextCalendarYear,
67
+ SkyDateRangeCalculatorId.LastFiscalYear,
68
+ SkyDateRangeCalculatorId.ThisFiscalYear,
69
+ SkyDateRangeCalculatorId.NextFiscalYear,
70
+ ];
71
+ }
72
+ get calculatorIds() {
73
+ return this.#_calculatorIds;
74
+ }
75
+ /**
76
+ * The date format for
77
+ * [the `sky-datepicker` components](https://developer.blackbaud.com/skyux/components/datepicker)
78
+ * that make up the date range picker. The text input is a composite component of
79
+ * up to two `sky-datepicker` components.
80
+ * @default "MM/DD/YYYY"
81
+ */
82
+ set dateFormat(value) {
83
+ this.#_dateFormat = value;
84
+ this.dateFormatOrDefault = value || this.#preferredShortDateFormat;
85
+ }
86
+ get dateFormat() {
87
+ return this.#_dateFormat;
88
+ }
89
+ /**
90
+ * Whether to disable the date range picker on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
91
+ * To set the disabled state on reactive forms, use the `FormControl` instead.
92
+ * @default false
93
+ */
94
+ set disabled(value) {
95
+ this.#_disabled = value;
96
+ if (this.formGroup) {
97
+ if (this.#_disabled) {
98
+ this.formGroup.disable();
99
+ }
100
+ else {
101
+ this.formGroup.enable();
102
+ }
103
+ }
104
+ this.#changeDetector.markForCheck();
105
+ }
106
+ get disabled() {
107
+ return this.#_disabled;
108
+ }
109
+ get #calculatorIdControl() {
110
+ return this.formGroup?.get('calculatorId');
111
+ }
112
+ get #defaultCalculator() {
113
+ return this.calculators[0];
114
+ }
115
+ get #defaultValue() {
116
+ return this.#defaultCalculator?.getValue();
117
+ }
118
+ get #endDateControl() {
119
+ return this.formGroup?.get('endDate');
120
+ }
121
+ get #startDateControl() {
122
+ return this.formGroup?.get('startDate');
123
+ }
124
+ #value;
125
+ set #valueOrDefault(value) {
126
+ this.#_valueOrDefault = value;
127
+ this.#updateSelectedCalculator();
128
+ }
129
+ get #valueOrDefault() {
130
+ return this.#_valueOrDefault;
131
+ }
132
+ #control;
133
+ #preferredShortDateFormat;
134
+ #ngUnsubscribe;
135
+ #_calculatorIds;
136
+ #_dateFormat;
137
+ #_disabled;
138
+ #_valueOrDefault;
139
+ #changeDetector;
140
+ #dateRangeService;
141
+ #formBuilder;
142
+ #localeProvider;
143
+ #ngZone;
144
+ constructor(changeDetector, dateRangeService, formBuilder, localeProvider, ngZone, themeSvc) {
145
+ /**
146
+ * Whether to require users to specify a start date.
147
+ * @default false
148
+ */
149
+ this.startDateRequired = false;
150
+ /**
151
+ * Whether to require users to specify a end date.
152
+ * @default false
153
+ */
154
+ this.endDateRequired = false;
155
+ this.dateRangePickerId = `sky-date-range-picker-${uniqueId++}`;
156
+ this.calculators = [];
157
+ this.isReady = false;
158
+ this.showEndDatePicker = false;
159
+ this.showStartDatePicker = false;
160
+ this.#ngUnsubscribe = new Subject();
161
+ this.#_calculatorIds = [
162
+ SkyDateRangeCalculatorId.AnyTime,
163
+ SkyDateRangeCalculatorId.Before,
164
+ SkyDateRangeCalculatorId.After,
165
+ SkyDateRangeCalculatorId.SpecificRange,
166
+ SkyDateRangeCalculatorId.Yesterday,
167
+ SkyDateRangeCalculatorId.Today,
168
+ SkyDateRangeCalculatorId.Tomorrow,
169
+ SkyDateRangeCalculatorId.LastWeek,
170
+ SkyDateRangeCalculatorId.ThisWeek,
171
+ SkyDateRangeCalculatorId.NextWeek,
172
+ SkyDateRangeCalculatorId.LastMonth,
173
+ SkyDateRangeCalculatorId.ThisMonth,
174
+ SkyDateRangeCalculatorId.NextMonth,
175
+ SkyDateRangeCalculatorId.LastQuarter,
176
+ SkyDateRangeCalculatorId.ThisQuarter,
177
+ SkyDateRangeCalculatorId.NextQuarter,
178
+ SkyDateRangeCalculatorId.LastCalendarYear,
179
+ SkyDateRangeCalculatorId.ThisCalendarYear,
180
+ SkyDateRangeCalculatorId.NextCalendarYear,
181
+ SkyDateRangeCalculatorId.LastFiscalYear,
182
+ SkyDateRangeCalculatorId.ThisFiscalYear,
183
+ SkyDateRangeCalculatorId.NextFiscalYear,
184
+ ];
185
+ this.#_disabled = false;
186
+ /* istanbul ignore next */
187
+ // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
188
+ this.#onChange = (_) => { };
189
+ /* istanbul ignore next */
190
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
191
+ this.#onTouched = () => { };
192
+ this.#changeDetector = changeDetector;
193
+ this.#dateRangeService = dateRangeService;
194
+ this.#formBuilder = formBuilder;
195
+ this.#localeProvider = localeProvider;
196
+ this.#ngZone = ngZone;
197
+ this.dateFormatOrDefault = this.dateFormat;
198
+ this.#localeProvider
199
+ .getLocaleInfo()
200
+ .pipe(takeUntil(this.#ngUnsubscribe))
201
+ .subscribe((localeInfo) => {
202
+ SkyDateFormatter.setLocale(localeInfo.locale);
203
+ this.#preferredShortDateFormat =
204
+ SkyDateFormatter.getPreferredShortDateFormat();
205
+ this.dateFormatOrDefault =
206
+ this.dateFormat || this.#preferredShortDateFormat;
207
+ });
208
+ // Update icons when theme changes.
209
+ /* istanbul ignore next */
210
+ themeSvc?.settingsChange
211
+ .pipe(takeUntil(this.#ngUnsubscribe))
212
+ .subscribe(() => {
213
+ this.#changeDetector.markForCheck();
214
+ });
215
+ }
216
+ ngOnInit() {
217
+ this.#createForm();
218
+ this.#updateCalculators().then(() => {
219
+ if (!this.#value || !this.#value.calculatorId) {
220
+ this.#valueOrDefault = this.#defaultValue;
221
+ }
222
+ this.#addEventListeners();
223
+ this.isReady = true;
224
+ this.#showRelevantFormFields();
225
+ // We need to let Angular be stable and have rendered the components prior to setting the values and form controls. This ensures all initial validation will be ran correctly.
226
+ this.#ngZone.onStable.pipe(first()).subscribe(() => {
227
+ // Fill in any unprovided values after the calculators have been initialized.
228
+ // For example, if the control is initialized with only the `calculatorId`,
229
+ // allow the calculator to fill in the missing start and end dates.
230
+ const defaultValue = this.selectedCalculator?.getValue(this.#valueOrDefault?.startDate, this.#valueOrDefault?.endDate);
231
+ const newValue = Object.assign({}, defaultValue, this.#valueOrDefault);
232
+ this.#setValue(newValue, false);
233
+ this.#resetFormGroupValue();
234
+ // This is needed to address a bug in Angular 4.
235
+ // When a control value is set initially, its value is not represented on the view.
236
+ // See: https://github.com/angular/angular/issues/13792
237
+ /* istanbul ignore else */
238
+ if (this.#control) {
239
+ this.#control.setValue(this.#valueOrDefault, {
240
+ emitEvent: false,
241
+ });
242
+ }
243
+ });
244
+ });
245
+ }
246
+ ngOnChanges(changes) {
247
+ if (changes['calculatorIds'] &&
248
+ changes['calculatorIds'].firstChange === false) {
249
+ this.#updateCalculators().then(() => {
250
+ const id = this.#calculatorIdControl?.value;
251
+ // Maintain the currently selected values if the calculators change after
252
+ // a value has been chosen.
253
+ const found = this.calculators.find((calculator) => {
254
+ return calculator.calculatorId === id;
255
+ });
256
+ /* istanbul ignore else */
257
+ if (!found) {
258
+ const newValue = this.#defaultCalculator?.getValue();
259
+ this.#setValue(newValue);
260
+ this.#resetFormGroupValue(newValue);
261
+ this.#showRelevantFormFields();
262
+ }
263
+ });
264
+ }
265
+ }
266
+ ngOnDestroy() {
267
+ this.#ngUnsubscribe.next();
268
+ this.#ngUnsubscribe.complete();
269
+ }
270
+ onFieldBlur() {
271
+ this.#onTouched();
272
+ }
273
+ writeValue(value) {
274
+ // Only update the underlying controls when the calculators are ready.
275
+ const notifyChange = false;
276
+ // (We still need to save the initial value set by the consumer's form, however.)
277
+ this.#setValue(value, notifyChange);
278
+ if (this.isReady) {
279
+ // When the control's value is set to `null`,
280
+ // set it to the default value.
281
+ if (!value) {
282
+ this.#onChange(this.#defaultValue);
283
+ }
284
+ this.#resetFormGroupValue();
285
+ this.#showRelevantFormFields();
286
+ }
287
+ }
288
+ validate(control) {
289
+ if (!this.#control) {
290
+ this.#control = control;
291
+ }
292
+ if (!this.isReady) {
293
+ return null;
294
+ }
295
+ const value = control.value;
296
+ const idControl = this.#calculatorIdControl;
297
+ const result = this.selectedCalculator?.validate(value);
298
+ let errors = null;
299
+ if (result) {
300
+ errors = {
301
+ skyDateRange: {
302
+ calculatorId: idControl?.value,
303
+ errors: result,
304
+ },
305
+ };
306
+ }
307
+ else {
308
+ let startErrors = null;
309
+ let endErrors = null;
310
+ if (this.#startDateControl) {
311
+ startErrors = this.#startDateControl.errors;
312
+ }
313
+ if (this.#endDateControl) {
314
+ endErrors = this.#endDateControl.errors;
315
+ }
316
+ errors = startErrors || endErrors;
317
+ }
318
+ if (!errors) {
319
+ // Clear any errors on the calculator select.
320
+ idControl?.setErrors(null);
321
+ return null;
322
+ }
323
+ idControl?.setErrors(errors);
324
+ idControl?.markAsTouched();
325
+ idControl?.markAsDirty();
326
+ // Need to mark the control as touched for the error messages to appear.
327
+ this.#control.markAsTouched();
328
+ // Notify the view to display any errors.
329
+ this.#changeDetector.markForCheck();
330
+ return errors;
331
+ }
332
+ registerOnChange(fn) {
333
+ this.#onChange = fn;
334
+ }
335
+ registerOnTouched(fn) {
336
+ this.#onTouched = fn;
337
+ }
338
+ setDisabledState(disabled) {
339
+ this.disabled = disabled;
340
+ }
341
+ #setValue(value, notifyChange = true) {
342
+ const isNewValue = !this.#dateRangesEqual(this.#value, value);
343
+ if (isNewValue) {
344
+ this.#value = value;
345
+ if (!value || value.calculatorId === undefined) {
346
+ this.#valueOrDefault = this.#defaultValue;
347
+ }
348
+ else {
349
+ this.#valueOrDefault = value;
350
+ }
351
+ if (notifyChange) {
352
+ this.#onChange(this.#valueOrDefault);
353
+ }
354
+ }
355
+ }
356
+ #patchValue(value) {
357
+ const newValue = Object.assign({}, this.#valueOrDefault, value);
358
+ this.#setValue(newValue);
359
+ }
360
+ #createForm() {
361
+ this.formGroup = this.#formBuilder.group({
362
+ calculatorId: new UntypedFormControl(),
363
+ startDate: new UntypedFormControl(),
364
+ endDate: new UntypedFormControl(),
365
+ });
366
+ if (this.disabled) {
367
+ this.formGroup.disable();
368
+ }
369
+ }
370
+ #showRelevantFormFields() {
371
+ const calculator = this.selectedCalculator;
372
+ let showEndDatePicker = false;
373
+ let showStartDatePicker = false;
374
+ switch (calculator?.type) {
375
+ case SkyDateRangeCalculatorType.Before:
376
+ showEndDatePicker = true;
377
+ break;
378
+ case SkyDateRangeCalculatorType.After:
379
+ showStartDatePicker = true;
380
+ break;
381
+ case SkyDateRangeCalculatorType.Range:
382
+ showEndDatePicker = true;
383
+ showStartDatePicker = true;
384
+ break;
385
+ default:
386
+ break;
387
+ }
388
+ this.showEndDatePicker = showEndDatePicker;
389
+ this.showStartDatePicker = showStartDatePicker;
390
+ this.#changeDetector.markForCheck();
391
+ }
392
+ #resetFormGroupValue(value) {
393
+ this.formGroup?.reset(value || this.#valueOrDefault);
394
+ }
395
+ #addEventListeners() {
396
+ // Watch for selected calculator change.
397
+ this.#calculatorIdControl?.valueChanges
398
+ .pipe(takeUntil(this.#ngUnsubscribe))
399
+ .subscribe((value) => {
400
+ if (value !== this.#valueOrDefault?.calculatorId) {
401
+ const id = parseInt(value, 10);
402
+ // if the component is disabled during form creation, null is passed
403
+ // as the value of the calculator id control
404
+ // only handle the value changes if the calculator id is a number
405
+ /* istanbul ignore else */
406
+ if (!isNaN(id)) {
407
+ const calculator = this.#getCalculatorById(id);
408
+ const newValue = calculator?.getValue();
409
+ this.#setValue(newValue);
410
+ this.#resetFormGroupValue(newValue);
411
+ this.#showRelevantFormFields();
412
+ }
413
+ }
414
+ });
415
+ // Watch for start date value changes.
416
+ this.#startDateControl?.valueChanges
417
+ .pipe(distinctUntilChanged(), takeUntil(this.#ngUnsubscribe))
418
+ .subscribe((startDate) => {
419
+ this.#patchValue({ startDate });
420
+ });
421
+ // Watch for end date value changes.
422
+ this.#endDateControl?.valueChanges
423
+ .pipe(distinctUntilChanged(), takeUntil(this.#ngUnsubscribe))
424
+ .subscribe((endDate) => {
425
+ this.#patchValue({ endDate });
426
+ });
427
+ // Safety check
428
+ /* istanbul ignore else */
429
+ if (this.#startDateControl && this.#endDateControl) {
430
+ // Detect errors from the date inputs and update ng- classes on picker.
431
+ combineLatest([
432
+ this.#startDateControl.statusChanges,
433
+ this.#endDateControl.statusChanges,
434
+ ])
435
+ .pipe(takeUntil(this.#ngUnsubscribe))
436
+ .subscribe(() => {
437
+ this.#updateBasedOnControls();
438
+ });
439
+ }
440
+ else if (this.#startDateControl) {
441
+ this.#startDateControl.statusChanges
442
+ .pipe(takeUntil(this.#ngUnsubscribe))
443
+ .subscribe(() => {
444
+ this.#updateBasedOnControls();
445
+ });
446
+ }
447
+ else if (this.#endDateControl) {
448
+ this.#endDateControl.statusChanges
449
+ .pipe(takeUntil(this.#ngUnsubscribe))
450
+ .subscribe(() => {
451
+ this.#updateBasedOnControls();
452
+ });
453
+ }
454
+ }
455
+ #updateBasedOnControls() {
456
+ this.#changeDetector.markForCheck();
457
+ // Wait for initial validation to complete.
458
+ this.#ngZone.onStable.pipe(first()).subscribe(() => {
459
+ this.#control?.updateValueAndValidity({ emitEvent: false });
460
+ });
461
+ }
462
+ #updateCalculators() {
463
+ return this.#dateRangeService
464
+ .getCalculators(this.calculatorIds)
465
+ .then((calculators) => {
466
+ this.calculators = calculators;
467
+ // Ensure that any previously set value is used to determine the selected calculator
468
+ this.#updateSelectedCalculator();
469
+ this.#changeDetector.markForCheck();
470
+ });
471
+ }
472
+ #getCalculatorById(id) {
473
+ return this.calculators.find((calculator) => {
474
+ return calculator.calculatorId === id;
475
+ });
476
+ }
477
+ #dateRangesEqual(rangeA, rangeB) {
478
+ return (!!rangeA && !!rangeB && JSON.stringify(rangeA) === JSON.stringify(rangeB));
479
+ }
480
+ #updateSelectedCalculator() {
481
+ this.selectedCalculator = this.#valueOrDefault
482
+ ? this.#getCalculatorById(this.#valueOrDefault.calculatorId)
483
+ : undefined;
484
+ }
485
+ /* istanbul ignore next */
486
+ // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
487
+ #onChange;
488
+ /* istanbul ignore next */
489
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
490
+ #onTouched;
491
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDateRangePickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyDateRangeService }, { token: i2.UntypedFormBuilder }, { token: i3.SkyAppLocaleProvider }, { token: i0.NgZone }, { token: i4.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
492
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyDateRangePickerComponent, selector: "sky-date-range-picker", inputs: { calculatorIds: "calculatorIds", dateFormat: "dateFormat", disabled: "disabled", label: "label", startDateRequired: "startDateRequired", endDateRequired: "endDateRequired" }, providers: [
493
+ SKY_DATE_RANGE_PICKER_VALUE_ACCESSOR,
494
+ SKY_DATE_RANGE_PICKER_VALIDATOR,
495
+ ], usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"isReady && formGroup\"\n class=\"sky-date-range-picker\"\n [formGroup]=\"formGroup\"\n>\n <div class=\"sky-date-range-picker-form-group\">\n <sky-input-box [disabled]=\"disabled\">\n <label\n class=\"sky-control-label\"\n [attr.for]=\"dateRangePickerId + '-select-calculator'\"\n >\n {{ label || 'skyux_date_range_picker_default_label' | skyLibResources }}\n </label>\n <select\n class=\"sky-form-control\"\n formControlName=\"calculatorId\"\n [attr.id]=\"dateRangePickerId + '-select-calculator'\"\n (blur)=\"onFieldBlur()\"\n >\n <option\n *ngFor=\"let calculator of calculators\"\n [value]=\"calculator.calculatorId\"\n >\n {{ calculator.shortDescription }}\n </option>\n </select>\n </sky-input-box>\n </div>\n\n <div class=\"sky-date-range-picker-form-group\" [hidden]=\"!showStartDatePicker\">\n <sky-input-box [disabled]=\"disabled\">\n <label\n class=\"sky-control-label\"\n [attr.for]=\"dateRangePickerId + '-start-date'\"\n [ngClass]=\"{ 'sky-control-label-required': startDateRequired }\"\n >\n {{\n selectedCalculator?.type\n | skyDateRangePickerStartDateResourceKey\n | skyLibResources\n }}\n </label>\n\n <sky-datepicker>\n <input\n formControlName=\"startDate\"\n [attr.aria-label]=\"\n selectedCalculator?.type\n | skyDateRangePickerStartDateResourceKey\n | skyLibResources\n \"\n [attr.id]=\"dateRangePickerId + '-start-date'\"\n [attr.placeholder]=\"dateFormatOrDefault\"\n [required]=\"!!startDateRequired\"\n [dateFormat]=\"dateFormatOrDefault\"\n (blur)=\"onFieldBlur()\"\n skyDatepickerInput\n />\n </sky-datepicker>\n </sky-input-box>\n </div>\n\n <div class=\"sky-date-range-picker-form-group\" [hidden]=\"!showEndDatePicker\">\n <sky-input-box [disabled]=\"disabled\">\n <label\n class=\"sky-control-label\"\n [attr.for]=\"dateRangePickerId + '-end-date'\"\n [ngClass]=\"{ 'sky-control-label-required': endDateRequired }\"\n >\n {{\n selectedCalculator?.type\n | skyDateRangePickerEndDateResourceKey\n | skyLibResources\n }}\n </label>\n\n <sky-datepicker>\n <input\n formControlName=\"endDate\"\n skyDatepickerInput\n [attr.aria-label]=\"\n selectedCalculator?.type\n | skyDateRangePickerEndDateResourceKey\n | skyLibResources\n \"\n [attr.id]=\"dateRangePickerId + '-end-date'\"\n [attr.placeholder]=\"dateFormatOrDefault\"\n [dateFormat]=\"dateFormatOrDefault\"\n [required]=\"!!endDateRequired\"\n (blur)=\"onFieldBlur()\"\n />\n </sky-datepicker>\n </sky-input-box>\n </div>\n</div>\n", styles: [".sky-date-range-picker{display:flex}.sky-date-range-picker-form-group:last-child{margin-bottom:0}:host .sky-date-range-picker{flex-direction:column}:host .sky-date-range-picker-form-group{flex-basis:100%}:host .sky-date-range-picker-form-group:not(:first-of-type){padding-left:initial}:host .sky-date-range-picker-form-group:not(:last-of-type){padding-right:initial}:host-context(.sky-responsive-container-xs) .sky-date-range-picker,:host-context(.sky-responsive-container-sm) .sky-date-range-picker,:host-context(.sky-responsive-container-md) .sky-date-range-picker,:host-context(.sky-responsive-container-lg) .sky-date-range-picker{flex-direction:column}:host-context(.sky-responsive-container-xs) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group{flex-basis:100%}:host-context(.sky-responsive-container-xs) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group:not(:first-of-type){padding-left:initial}:host-context(.sky-responsive-container-xs) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group:not(:last-of-type){padding-right:initial}@media (min-width: 768px){:host .sky-date-range-picker{flex-direction:initial}:host .sky-date-range-picker-form-group{flex-basis:33.3333333333%;margin-bottom:0}:host .sky-date-range-picker-form-group:not(:first-of-type){padding-left:5px}:host .sky-date-range-picker-form-group:not(:last-of-type){padding-right:5px}}:host-context(.sky-responsive-container-sm) .sky-date-range-picker,:host-context(.sky-responsive-container-md) .sky-date-range-picker,:host-context(.sky-responsive-container-lg) .sky-date-range-picker{flex-direction:initial}:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group{flex-basis:33.3333333333%;margin-bottom:0}:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group:not(:first-of-type){padding-left:5px}:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group:not(:last-of-type){padding-right:5px}@media (min-width: 768px){:host-context(sky-filter-inline-item) .sky-date-range-picker-form-group{flex-basis:100%}}.sky-responsive-container-sm :host-context(sky-filter-inline-item) .sky-date-range-picker-form-group,.sky-responsive-container-md :host-context(sky-filter-inline-item) .sky-date-range-picker-form-group,.sky-responsive-container-lg :host-context(sky-filter-inline-item) .sky-date-range-picker-form-group{flex-basis:100%}:host-context(.sky-theme-modern) .sky-date-range-picker-form-group{padding:0;margin:0 0 20px}@media (min-width: 768px){:host-context(.sky-theme-modern) .sky-date-range-picker-form-group{margin:0 20px 0 0}}.sky-theme-modern .sky-date-range-picker-form-group{padding:0;margin:0 0 20px}@media (min-width: 768px){.sky-theme-modern .sky-date-range-picker-form-group{margin:0 20px 0 0}}:host-context(.sky-theme-modern .sky-responsive-container-xs) .sky-date-range-picker-form-group{margin:0 0 20px}:host-context(.sky-theme-modern .sky-responsive-container-sm) .sky-date-range-picker-form-group,:host-context(.sky-theme-modern .sky-responsive-container-md) .sky-date-range-picker-form-group,:host-context(.sky-theme-modern .sky-responsive-container-lg) .sky-date-range-picker-form-group{margin:0 20px 0 0}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.SkyDatepickerComponent, selector: "sky-datepicker", inputs: ["pickerClass"], outputs: ["calendarDateRangeChange"] }, { kind: "directive", type: i7.SkyDatepickerInputDirective, selector: "[skyDatepickerInput]", inputs: ["dateFormat", "disabled", "maxDate", "minDate", "skyDatepickerInput", "skyDatepickerNoValidate", "startingDay", "strict"] }, { kind: "component", type: i8.λ10, selector: "sky-input-box", inputs: ["hasErrors", "disabled", "labelText", "characterLimit", "stacked", "helpPopoverTitle", "helpPopoverContent"] }, { kind: "directive", type: i8.λ20, selector: "input:not([skyId]):not(.sky-form-control),select:not([skyId]):not(.sky-form-control),textarea:not([skyId]):not(.sky-form-control)" }, { kind: "pipe", type: i3.SkyLibResourcesPipe, name: "skyLibResources" }, { kind: "pipe", type: i9.SkyDateRangePickerEndDateResourceKeyPipe, name: "skyDateRangePickerEndDateResourceKey" }, { kind: "pipe", type: i10.SkyDateRangePickerStartDateResourceKeyPipe, name: "skyDateRangePickerStartDateResourceKey" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
496
+ }
497
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDateRangePickerComponent, decorators: [{
498
+ type: Component,
499
+ args: [{ selector: 'sky-date-range-picker', providers: [
500
+ SKY_DATE_RANGE_PICKER_VALUE_ACCESSOR,
501
+ SKY_DATE_RANGE_PICKER_VALIDATOR,
502
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"isReady && formGroup\"\n class=\"sky-date-range-picker\"\n [formGroup]=\"formGroup\"\n>\n <div class=\"sky-date-range-picker-form-group\">\n <sky-input-box [disabled]=\"disabled\">\n <label\n class=\"sky-control-label\"\n [attr.for]=\"dateRangePickerId + '-select-calculator'\"\n >\n {{ label || 'skyux_date_range_picker_default_label' | skyLibResources }}\n </label>\n <select\n class=\"sky-form-control\"\n formControlName=\"calculatorId\"\n [attr.id]=\"dateRangePickerId + '-select-calculator'\"\n (blur)=\"onFieldBlur()\"\n >\n <option\n *ngFor=\"let calculator of calculators\"\n [value]=\"calculator.calculatorId\"\n >\n {{ calculator.shortDescription }}\n </option>\n </select>\n </sky-input-box>\n </div>\n\n <div class=\"sky-date-range-picker-form-group\" [hidden]=\"!showStartDatePicker\">\n <sky-input-box [disabled]=\"disabled\">\n <label\n class=\"sky-control-label\"\n [attr.for]=\"dateRangePickerId + '-start-date'\"\n [ngClass]=\"{ 'sky-control-label-required': startDateRequired }\"\n >\n {{\n selectedCalculator?.type\n | skyDateRangePickerStartDateResourceKey\n | skyLibResources\n }}\n </label>\n\n <sky-datepicker>\n <input\n formControlName=\"startDate\"\n [attr.aria-label]=\"\n selectedCalculator?.type\n | skyDateRangePickerStartDateResourceKey\n | skyLibResources\n \"\n [attr.id]=\"dateRangePickerId + '-start-date'\"\n [attr.placeholder]=\"dateFormatOrDefault\"\n [required]=\"!!startDateRequired\"\n [dateFormat]=\"dateFormatOrDefault\"\n (blur)=\"onFieldBlur()\"\n skyDatepickerInput\n />\n </sky-datepicker>\n </sky-input-box>\n </div>\n\n <div class=\"sky-date-range-picker-form-group\" [hidden]=\"!showEndDatePicker\">\n <sky-input-box [disabled]=\"disabled\">\n <label\n class=\"sky-control-label\"\n [attr.for]=\"dateRangePickerId + '-end-date'\"\n [ngClass]=\"{ 'sky-control-label-required': endDateRequired }\"\n >\n {{\n selectedCalculator?.type\n | skyDateRangePickerEndDateResourceKey\n | skyLibResources\n }}\n </label>\n\n <sky-datepicker>\n <input\n formControlName=\"endDate\"\n skyDatepickerInput\n [attr.aria-label]=\"\n selectedCalculator?.type\n | skyDateRangePickerEndDateResourceKey\n | skyLibResources\n \"\n [attr.id]=\"dateRangePickerId + '-end-date'\"\n [attr.placeholder]=\"dateFormatOrDefault\"\n [dateFormat]=\"dateFormatOrDefault\"\n [required]=\"!!endDateRequired\"\n (blur)=\"onFieldBlur()\"\n />\n </sky-datepicker>\n </sky-input-box>\n </div>\n</div>\n", styles: [".sky-date-range-picker{display:flex}.sky-date-range-picker-form-group:last-child{margin-bottom:0}:host .sky-date-range-picker{flex-direction:column}:host .sky-date-range-picker-form-group{flex-basis:100%}:host .sky-date-range-picker-form-group:not(:first-of-type){padding-left:initial}:host .sky-date-range-picker-form-group:not(:last-of-type){padding-right:initial}:host-context(.sky-responsive-container-xs) .sky-date-range-picker,:host-context(.sky-responsive-container-sm) .sky-date-range-picker,:host-context(.sky-responsive-container-md) .sky-date-range-picker,:host-context(.sky-responsive-container-lg) .sky-date-range-picker{flex-direction:column}:host-context(.sky-responsive-container-xs) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group{flex-basis:100%}:host-context(.sky-responsive-container-xs) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group:not(:first-of-type){padding-left:initial}:host-context(.sky-responsive-container-xs) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group:not(:last-of-type){padding-right:initial}@media (min-width: 768px){:host .sky-date-range-picker{flex-direction:initial}:host .sky-date-range-picker-form-group{flex-basis:33.3333333333%;margin-bottom:0}:host .sky-date-range-picker-form-group:not(:first-of-type){padding-left:5px}:host .sky-date-range-picker-form-group:not(:last-of-type){padding-right:5px}}:host-context(.sky-responsive-container-sm) .sky-date-range-picker,:host-context(.sky-responsive-container-md) .sky-date-range-picker,:host-context(.sky-responsive-container-lg) .sky-date-range-picker{flex-direction:initial}:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group,:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group{flex-basis:33.3333333333%;margin-bottom:0}:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group:not(:first-of-type),:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group:not(:first-of-type){padding-left:5px}:host-context(.sky-responsive-container-sm) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-md) .sky-date-range-picker-form-group:not(:last-of-type),:host-context(.sky-responsive-container-lg) .sky-date-range-picker-form-group:not(:last-of-type){padding-right:5px}@media (min-width: 768px){:host-context(sky-filter-inline-item) .sky-date-range-picker-form-group{flex-basis:100%}}.sky-responsive-container-sm :host-context(sky-filter-inline-item) .sky-date-range-picker-form-group,.sky-responsive-container-md :host-context(sky-filter-inline-item) .sky-date-range-picker-form-group,.sky-responsive-container-lg :host-context(sky-filter-inline-item) .sky-date-range-picker-form-group{flex-basis:100%}:host-context(.sky-theme-modern) .sky-date-range-picker-form-group{padding:0;margin:0 0 20px}@media (min-width: 768px){:host-context(.sky-theme-modern) .sky-date-range-picker-form-group{margin:0 20px 0 0}}.sky-theme-modern .sky-date-range-picker-form-group{padding:0;margin:0 0 20px}@media (min-width: 768px){.sky-theme-modern .sky-date-range-picker-form-group{margin:0 20px 0 0}}:host-context(.sky-theme-modern .sky-responsive-container-xs) .sky-date-range-picker-form-group{margin:0 0 20px}:host-context(.sky-theme-modern .sky-responsive-container-sm) .sky-date-range-picker-form-group,:host-context(.sky-theme-modern .sky-responsive-container-md) .sky-date-range-picker-form-group,:host-context(.sky-theme-modern .sky-responsive-container-lg) .sky-date-range-picker-form-group{margin:0 20px 0 0}\n"] }]
503
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyDateRangeService }, { type: i2.UntypedFormBuilder }, { type: i3.SkyAppLocaleProvider }, { type: i0.NgZone }, { type: i4.SkyThemeService, decorators: [{
504
+ type: Optional
505
+ }] }]; }, propDecorators: { calculatorIds: [{
506
+ type: Input
507
+ }], dateFormat: [{
508
+ type: Input
509
+ }], disabled: [{
510
+ type: Input
511
+ }], label: [{
512
+ type: Input
513
+ }], startDateRequired: [{
514
+ type: Input
515
+ }], endDateRequired: [{
516
+ type: Input
517
+ }] } });
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2RhdGV0aW1lL3NyYy9saWIvbW9kdWxlcy9kYXRlLXJhbmdlLXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL2RhdGUtcmFuZ2UtcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULEtBQUssRUFLTCxRQUFRLEVBRVIsVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEVBRWpCLGtCQUFrQixHQUluQixNQUFNLGdCQUFnQixDQUFDO0FBSXhCLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7OztBQUVoRixNQUFNLG9DQUFvQyxHQUFHO0lBQzNDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLCtCQUErQixH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QUM7WUFDNUQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLG1HQUFtRztJQUNuRyxTQUFTLENBQXdEO0lBQ2pFLDBCQUEwQjtJQUMxQixnRUFBZ0U7SUFDaEUsVUFBVSxDQUFrQjs4R0FuakJqQiwyQkFBMkI7a0dBQTNCLDJCQUEyQix3T0FOM0I7WUFDVCxvQ0FBb0M7WUFDcEMsK0JBQStCO1NBQ2hDLCtDQ3JFSCx1OUZBK0ZBOzsyRkR2QmEsMkJBQTJCO2tCQVZ2QyxTQUFTOytCQUNFLHVCQUF1QixhQUd0Qjt3QkFDVCxvQ0FBb0M7d0JBQ3BDLCtCQUErQjtxQkFDaEMsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07OzBCQThMNUMsUUFBUTs0Q0FuTEEsYUFBYTtzQkFEdkIsS0FBSztnQkF3Q0ssVUFBVTtzQkFEcEIsS0FBSztnQkFnQkssUUFBUTtzQkFEbEIsS0FBSztnQkF3QkMsS0FBSztzQkFEWCxLQUFLO2dCQVFDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFRQyxlQUFlO3NCQURyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBmb3J3YXJkUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lBcHBMb2NhbGVQcm92aWRlciB9IGZyb20gJ0Bza3l1eC9pMThuJztcbmltcG9ydCB7IFNreVRoZW1lU2VydmljZSB9IGZyb20gJ0Bza3l1eC90aGVtZSc7XG5cbmltcG9ydCB7IFN1YmplY3QsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaXJzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lEYXRlRm9ybWF0dGVyIH0gZnJvbSAnLi4vZGF0ZXBpY2tlci9kYXRlLWZvcm1hdHRlcic7XG5cbmltcG9ydCB7IFNreURhdGVSYW5nZVNlcnZpY2UgfSBmcm9tICcuL2RhdGUtcmFuZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lEYXRlUmFuZ2VDYWxjdWxhdGlvbiB9IGZyb20gJy4vdHlwZXMvZGF0ZS1yYW5nZS1jYWxjdWxhdGlvbic7XG5pbXBvcnQgeyBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9yIH0gZnJvbSAnLi90eXBlcy9kYXRlLXJhbmdlLWNhbGN1bGF0b3InO1xuaW1wb3J0IHsgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkIH0gZnJvbSAnLi90eXBlcy9kYXRlLXJhbmdlLWNhbGN1bGF0b3ItaWQnO1xuaW1wb3J0IHsgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvclR5cGUgfSBmcm9tICcuL3R5cGVzL2RhdGUtcmFuZ2UtY2FsY3VsYXRvci10eXBlJztcblxuY29uc3QgU0tZX0RBVEVfUkFOR0VfUElDS0VSX1ZBTFVFX0FDQ0VTU09SID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5RGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50KSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5jb25zdCBTS1lfREFURV9SQU5HRV9QSUNLRVJfVkFMSURBVE9SID0ge1xuICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmxldCB1bmlxdWVJZCA9IDA7XG5cbi8qKlxuICogQWN0cyBhcyBhIGZvcm0gY29udHJvbCB3aXRoIGEgZm9ybSBtb2RlbCBvZiB0eXBlIGBTa3lEYXRlUmFuZ2VDYWxjdWxhdGlvbmAuXG4gKiBAZXhhbXBsZVxuICogYGBgXG4gKiA8c2t5LWRhdGUtcmFuZ2UtcGlja2VyXG4gKiAgIGZvcm1Db250cm9sTmFtZT1cIm15UGlja2VyXCJcbiAqID5cbiAqIDwvc2t5LWRhdGUtcmFuZ2UtcGlja2VyPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1kYXRlLXJhbmdlLXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIFNLWV9EQVRFX1JBTkdFX1BJQ0tFUl9WQUxVRV9BQ0NFU1NPUixcbiAgICBTS1lfREFURV9SQU5HRV9QSUNLRVJfVkFMSURBVE9SLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5RGF0ZVJhbmdlUGlja2VyQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvclxue1xuICAvKipcbiAgICogSURzIGZvciB0aGUgZGF0ZSByYW5nZSBvcHRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHBpY2tlcidzIGRyb3Bkb3duLlxuICAgKiBUaGUgb3B0aW9ucyBzcGVjaWZ5IGNhbGN1bGF0b3Igb2JqZWN0cyB0aGF0IHJldHVybiB0d28gYERhdGVgIG9iamVjdHMgdG8gcmVwcmVzZW50IGRhdGUgcmFuZ2VzLlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGluY2x1ZGVzIGFsbCBgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkYCB2YWx1ZXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNhbGN1bGF0b3JJZHModmFsdWU6IFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZFtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2NhbGN1bGF0b3JJZHMgPSB2YWx1ZSB8fCBbXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuQW55VGltZSxcbiAgICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5CZWZvcmUsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuQWZ0ZXIsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuU3BlY2lmaWNSYW5nZSxcbiAgICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5ZZXN0ZXJkYXksXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVG9kYXksXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVG9tb3Jyb3csXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTGFzdFdlZWssXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVGhpc1dlZWssXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTmV4dFdlZWssXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTGFzdE1vbnRoLFxuICAgICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLlRoaXNNb250aCxcbiAgICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5OZXh0TW9udGgsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTGFzdFF1YXJ0ZXIsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVGhpc1F1YXJ0ZXIsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTmV4dFF1YXJ0ZXIsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTGFzdENhbGVuZGFyWWVhcixcbiAgICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5UaGlzQ2FsZW5kYXJZZWFyLFxuICAgICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLk5leHRDYWxlbmRhclllYXIsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTGFzdEZpc2NhbFllYXIsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVGhpc0Zpc2NhbFllYXIsXG4gICAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTmV4dEZpc2NhbFllYXIsXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2FsY3VsYXRvcklkcygpOiBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWRbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19jYWxjdWxhdG9ySWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRlIGZvcm1hdCBmb3JcbiAgICogW3RoZSBgc2t5LWRhdGVwaWNrZXJgIGNvbXBvbmVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9kYXRlcGlja2VyKVxuICAgKiB0aGF0IG1ha2UgdXAgdGhlIGRhdGUgcmFuZ2UgcGlja2VyLiBUaGUgdGV4dCBpbnB1dCBpcyBhIGNvbXBvc2l0ZSBjb21wb25lbnQgb2ZcbiAgICogdXAgdG8gdHdvIGBza3ktZGF0ZXBpY2tlcmAgY29tcG9uZW50cy5cbiAgICogQGRlZmF1bHQgXCJNTS9ERC9ZWVlZXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0ZUZvcm1hdCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2RhdGVGb3JtYXQgPSB2YWx1ZTtcbiAgICB0aGlzLmRhdGVGb3JtYXRPckRlZmF1bHQgPSB2YWx1ZSB8fCB0aGlzLiNwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGVGb3JtYXQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX2RhdGVGb3JtYXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBkYXRlIHJhbmdlIHBpY2tlciBvbiB0ZW1wbGF0ZS1kcml2ZW4gZm9ybXMuIERvbid0IHVzZSB0aGlzIGlucHV0IG9uIHJlYWN0aXZlIGZvcm1zIGJlY2F1c2UgdGhleSBtYXkgb3ZlcndyaXRlIHRoZSBpbnB1dCBvciBsZWF2ZSB0aGUgY29udHJvbCBvdXQgb2Ygc3luYy5cbiAgICogVG8gc2V0IHRoZSBkaXNhYmxlZCBzdGF0ZSBvbiByZWFjdGl2ZSBmb3JtcywgdXNlIHRoZSBgRm9ybUNvbnRyb2xgIGluc3RlYWQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2Rpc2FibGVkID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5mb3JtR3JvdXApIHtcbiAgICAgIGlmICh0aGlzLiNfZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfZGlzYWJsZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxhYmVsIGZvciB0aGUgZGF0ZSByYW5nZSBwaWNrZXIuXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVxdWlyZSB1c2VycyB0byBzcGVjaWZ5IGEgc3RhcnQgZGF0ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzdGFydERhdGVSZXF1aXJlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlcXVpcmUgdXNlcnMgdG8gc3BlY2lmeSBhIGVuZCBkYXRlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGVuZERhdGVSZXF1aXJlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBzZWxlY3RlZENhbGN1bGF0b3I6IFNreURhdGVSYW5nZUNhbGN1bGF0b3IgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRhdGVSYW5nZVBpY2tlcklkID0gYHNreS1kYXRlLXJhbmdlLXBpY2tlci0ke3VuaXF1ZUlkKyt9YDtcblxuICBwdWJsaWMgY2FsY3VsYXRvcnM6IFNreURhdGVSYW5nZUNhbGN1bGF0b3JbXSA9IFtdO1xuICBwdWJsaWMgZGF0ZUZvcm1hdE9yRGVmYXVsdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgaXNSZWFkeSA9IGZhbHNlO1xuICBwdWJsaWMgc2hvd0VuZERhdGVQaWNrZXIgPSBmYWxzZTtcbiAgcHVibGljIHNob3dTdGFydERhdGVQaWNrZXIgPSBmYWxzZTtcblxuICBnZXQgI2NhbGN1bGF0b3JJZENvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwPy5nZXQoJ2NhbGN1bGF0b3JJZCcpO1xuICB9XG5cbiAgZ2V0ICNkZWZhdWx0Q2FsY3VsYXRvcigpOiBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdG9yc1swXTtcbiAgfVxuXG4gIGdldCAjZGVmYXVsdFZhbHVlKCk6IFNreURhdGVSYW5nZUNhbGN1bGF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZGVmYXVsdENhbGN1bGF0b3I/LmdldFZhbHVlKCk7XG4gIH1cblxuICBnZXQgI2VuZERhdGVDb250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cD8uZ2V0KCdlbmREYXRlJyk7XG4gIH1cblxuICBnZXQgI3N0YXJ0RGF0ZUNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwPy5nZXQoJ3N0YXJ0RGF0ZScpO1xuICB9XG5cbiAgI3ZhbHVlOiBTa3lEYXRlUmFuZ2VDYWxjdWxhdGlvbiB8IHVuZGVmaW5lZDtcblxuICBzZXQgI3ZhbHVlT3JEZWZhdWx0KHZhbHVlOiBTa3lEYXRlUmFuZ2VDYWxjdWxhdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI192YWx1ZU9yRGVmYXVsdCA9IHZhbHVlO1xuICAgIHRoaXMuI3VwZGF0ZVNlbGVjdGVkQ2FsY3VsYXRvcigpO1xuICB9XG5cbiAgZ2V0ICN2YWx1ZU9yRGVmYXVsdCgpOiBTa3lEYXRlUmFuZ2VDYWxjdWxhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI192YWx1ZU9yRGVmYXVsdDtcbiAgfVxuXG4gICNjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG4gICNwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNfY2FsY3VsYXRvcklkczogU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkW10gPSBbXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLkFueVRpbWUsXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLkJlZm9yZSxcbiAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuQWZ0ZXIsXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLlNwZWNpZmljUmFuZ2UsXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLlllc3RlcmRheSxcbiAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVG9kYXksXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLlRvbW9ycm93LFxuICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5MYXN0V2VlayxcbiAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVGhpc1dlZWssXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLk5leHRXZWVrLFxuICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5MYXN0TW9udGgsXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLlRoaXNNb250aCxcbiAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuTmV4dE1vbnRoLFxuICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5MYXN0UXVhcnRlcixcbiAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVGhpc1F1YXJ0ZXIsXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLk5leHRRdWFydGVyLFxuICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5MYXN0Q2FsZW5kYXJZZWFyLFxuICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5UaGlzQ2FsZW5kYXJZZWFyLFxuICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5OZXh0Q2FsZW5kYXJZZWFyLFxuICAgIFNreURhdGVSYW5nZUNhbGN1bGF0b3JJZC5MYXN0RmlzY2FsWWVhcixcbiAgICBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9ySWQuVGhpc0Zpc2NhbFllYXIsXG4gICAgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkLk5leHRGaXNjYWxZZWFyLFxuICBdO1xuICAjX2RhdGVGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgI19kaXNhYmxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuICAjX3ZhbHVlT3JEZWZhdWx0OiBTa3lEYXRlUmFuZ2VDYWxjdWxhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAjY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xuICAjZGF0ZVJhbmdlU2VydmljZTogU2t5RGF0ZVJhbmdlU2VydmljZTtcbiAgI2Zvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXI7XG4gICNsb2NhbGVQcm92aWRlcjogU2t5QXBwTG9jYWxlUHJvdmlkZXI7XG4gICNuZ1pvbmU6IE5nWm9uZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgZGF0ZVJhbmdlU2VydmljZTogU2t5RGF0ZVJhbmdlU2VydmljZSxcbiAgICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIGxvY2FsZVByb3ZpZGVyOiBTa3lBcHBMb2NhbGVQcm92aWRlcixcbiAgICBuZ1pvbmU6IE5nWm9uZSxcbiAgICBAT3B0aW9uYWwoKSB0aGVtZVN2Yz86IFNreVRoZW1lU2VydmljZVxuICApIHtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuI2RhdGVSYW5nZVNlcnZpY2UgPSBkYXRlUmFuZ2VTZXJ2aWNlO1xuICAgIHRoaXMuI2Zvcm1CdWlsZGVyID0gZm9ybUJ1aWxkZXI7XG4gICAgdGhpcy4jbG9jYWxlUHJvdmlkZXIgPSBsb2NhbGVQcm92aWRlcjtcbiAgICB0aGlzLiNuZ1pvbmUgPSBuZ1pvbmU7XG5cbiAgICB0aGlzLmRhdGVGb3JtYXRPckRlZmF1bHQgPSB0aGlzLmRhdGVGb3JtYXQ7XG5cbiAgICB0aGlzLiNsb2NhbGVQcm92aWRlclxuICAgICAgLmdldExvY2FsZUluZm8oKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgobG9jYWxlSW5mbykgPT4ge1xuICAgICAgICBTa3lEYXRlRm9ybWF0dGVyLnNldExvY2FsZShsb2NhbGVJbmZvLmxvY2FsZSk7XG4gICAgICAgIHRoaXMuI3ByZWZlcnJlZFNob3J0RGF0ZUZvcm1hdCA9XG4gICAgICAgICAgU2t5RGF0ZUZvcm1hdHRlci5nZXRQcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQoKTtcbiAgICAgICAgdGhpcy5kYXRlRm9ybWF0T3JEZWZhdWx0ID1cbiAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQgfHwgdGhpcy4jcHJlZmVycmVkU2hvcnREYXRlRm9ybWF0O1xuICAgICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgaWNvbnMgd2hlbiB0aGVtZSBjaGFuZ2VzLlxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhlbWVTdmM/LnNldHRpbmdzQ2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNjcmVhdGVGb3JtKCk7XG5cbiAgICB0aGlzLiN1cGRhdGVDYWxjdWxhdG9ycygpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLiN2YWx1ZSB8fCAhdGhpcy4jdmFsdWUuY2FsY3VsYXRvcklkKSB7XG4gICAgICAgIHRoaXMuI3ZhbHVlT3JEZWZhdWx0ID0gdGhpcy4jZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNhZGRFdmVudExpc3RlbmVycygpO1xuXG4gICAgICB0aGlzLmlzUmVhZHkgPSB0cnVlO1xuXG4gICAgICB0aGlzLiNzaG93UmVsZXZhbnRGb3JtRmllbGRzKCk7XG5cbiAgICAgIC8vIFdlIG5lZWQgdG8gbGV0IEFuZ3VsYXIgYmUgc3RhYmxlIGFuZCBoYXZlIHJlbmRlcmVkIHRoZSBjb21wb25lbnRzIHByaW9yIHRvIHNldHRpbmcgdGhlIHZhbHVlcyBhbmQgZm9ybSBjb250cm9scy4gVGhpcyBlbnN1cmVzIGFsbCBpbml0aWFsIHZhbGlkYXRpb24gd2lsbCBiZSByYW4gY29ycmVjdGx5LlxuICAgICAgdGhpcy4jbmdab25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gRmlsbCBpbiBhbnkgdW5wcm92aWRlZCB2YWx1ZXMgYWZ0ZXIgdGhlIGNhbGN1bGF0b3JzIGhhdmUgYmVlbiBpbml0aWFsaXplZC5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb250cm9sIGlzIGluaXRpYWxpemVkIHdpdGggb25seSB0aGUgYGNhbGN1bGF0b3JJZGAsXG4gICAgICAgIC8vIGFsbG93IHRoZSBjYWxjdWxhdG9yIHRvIGZpbGwgaW4gdGhlIG1pc3Npbmcgc3RhcnQgYW5kIGVuZCBkYXRlcy5cbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5zZWxlY3RlZENhbGN1bGF0b3I/LmdldFZhbHVlKFxuICAgICAgICAgIHRoaXMuI3ZhbHVlT3JEZWZhdWx0Py5zdGFydERhdGUsXG4gICAgICAgICAgdGhpcy4jdmFsdWVPckRlZmF1bHQ/LmVuZERhdGVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0VmFsdWUsIHRoaXMuI3ZhbHVlT3JEZWZhdWx0KTtcblxuICAgICAgICB0aGlzLiNzZXRWYWx1ZShuZXdWYWx1ZSwgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuI3Jlc2V0Rm9ybUdyb3VwVmFsdWUoKTtcblxuICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhZGRyZXNzIGEgYnVnIGluIEFuZ3VsYXIgNC5cbiAgICAgICAgLy8gV2hlbiBhIGNvbnRyb2wgdmFsdWUgaXMgc2V0IGluaXRpYWxseSwgaXRzIHZhbHVlIGlzIG5vdCByZXByZXNlbnRlZCBvbiB0aGUgdmlldy5cbiAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzc5MlxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy4jY29udHJvbCkge1xuICAgICAgICAgIHRoaXMuI2NvbnRyb2wuc2V0VmFsdWUodGhpcy4jdmFsdWVPckRlZmF1bHQsIHtcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzWydjYWxjdWxhdG9ySWRzJ10gJiZcbiAgICAgIGNoYW5nZXNbJ2NhbGN1bGF0b3JJZHMnXS5maXJzdENoYW5nZSA9PT0gZmFsc2VcbiAgICApIHtcbiAgICAgIHRoaXMuI3VwZGF0ZUNhbGN1bGF0b3JzKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy4jY2FsY3VsYXRvcklkQ29udHJvbD8udmFsdWU7XG5cbiAgICAgICAgLy8gTWFpbnRhaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZXMgaWYgdGhlIGNhbGN1bGF0b3JzIGNoYW5nZSBhZnRlclxuICAgICAgICAvLyBhIHZhbHVlIGhhcyBiZWVuIGNob3Nlbi5cbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmNhbGN1bGF0b3JzLmZpbmQoKGNhbGN1bGF0b3IpID0+IHtcbiAgICAgICAgICByZXR1cm4gY2FsY3VsYXRvci5jYWxjdWxhdG9ySWQgPT09IGlkO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLiNkZWZhdWx0Q2FsY3VsYXRvcj8uZ2V0VmFsdWUoKTtcbiAgICAgICAgICB0aGlzLiNzZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgdGhpcy4jcmVzZXRGb3JtR3JvdXBWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgdGhpcy4jc2hvd1JlbGV2YW50Rm9ybUZpZWxkcygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRmllbGRCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuI29uVG91Y2hlZCgpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFNreURhdGVSYW5nZUNhbGN1bGF0aW9uKTogdm9pZCB7XG4gICAgLy8gT25seSB1cGRhdGUgdGhlIHVuZGVybHlpbmcgY29udHJvbHMgd2hlbiB0aGUgY2FsY3VsYXRvcnMgYXJlIHJlYWR5LlxuICAgIGNvbnN0IG5vdGlmeUNoYW5nZSA9IGZhbHNlO1xuXG4gICAgLy8gKFdlIHN0aWxsIG5lZWQgdG8gc2F2ZSB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgYnkgdGhlIGNvbnN1bWVyJ3MgZm9ybSwgaG93ZXZlci4pXG4gICAgdGhpcy4jc2V0VmFsdWUodmFsdWUsIG5vdGlmeUNoYW5nZSk7XG5cbiAgICBpZiAodGhpcy5pc1JlYWR5KSB7XG4gICAgICAvLyBXaGVuIHRoZSBjb250cm9sJ3MgdmFsdWUgaXMgc2V0IHRvIGBudWxsYCxcbiAgICAgIC8vIHNldCBpdCB0byB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhpcy4jb25DaGFuZ2UodGhpcy4jZGVmYXVsdFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy4jcmVzZXRGb3JtR3JvdXBWYWx1ZSgpO1xuICAgICAgdGhpcy4jc2hvd1JlbGV2YW50Rm9ybUZpZWxkcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLiNjb250cm9sKSB7XG4gICAgICB0aGlzLiNjb250cm9sID0gY29udHJvbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNSZWFkeSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IGlkQ29udHJvbCA9IHRoaXMuI2NhbGN1bGF0b3JJZENvbnRyb2w7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWxlY3RlZENhbGN1bGF0b3I/LnZhbGlkYXRlKHZhbHVlKTtcblxuICAgIGxldCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGVycm9ycyA9IHtcbiAgICAgICAgc2t5RGF0ZVJhbmdlOiB7XG4gICAgICAgICAgY2FsY3VsYXRvcklkOiBpZENvbnRyb2w/LnZhbHVlLFxuICAgICAgICAgIGVycm9yczogcmVzdWx0LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHN0YXJ0RXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgZW5kRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAodGhpcy4jc3RhcnREYXRlQ29udHJvbCkge1xuICAgICAgICBzdGFydEVycm9ycyA9IHRoaXMuI3N0YXJ0RGF0ZUNvbnRyb2wuZXJyb3JzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuI2VuZERhdGVDb250cm9sKSB7XG4gICAgICAgIGVuZEVycm9ycyA9IHRoaXMuI2VuZERhdGVDb250cm9sLmVycm9ycztcbiAgICAgIH1cblxuICAgICAgZXJyb3JzID0gc3RhcnRFcnJvcnMgfHwgZW5kRXJyb3JzO1xuICAgIH1cblxuICAgIGlmICghZXJyb3JzKSB7XG4gICAgICAvLyBDbGVhciBhbnkgZXJyb3JzIG9uIHRoZSBjYWxjdWxhdG9yIHNlbGVjdC5cbiAgICAgIGlkQ29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWRDb250cm9sPy5zZXRFcnJvcnMoZXJyb3JzKTtcbiAgICBpZENvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICBpZENvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG5cbiAgICAvLyBOZWVkIHRvIG1hcmsgdGhlIGNvbnRyb2wgYXMgdG91Y2hlZCBmb3IgdGhlIGVycm9yIG1lc3NhZ2VzIHRvIGFwcGVhci5cbiAgICB0aGlzLiNjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcblxuICAgIC8vIE5vdGlmeSB0aGUgdmlldyB0byBkaXNwbGF5IGFueSBlcnJvcnMuXG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoXG4gICAgZm46ICh2YWx1ZTogU2t5RGF0ZVJhbmdlQ2FsY3VsYXRpb24gfCB1bmRlZmluZWQpID0+IFNreURhdGVSYW5nZUNhbGN1bGF0aW9uXG4gICk6IHZvaWQge1xuICAgIHRoaXMuI29uQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IFNreURhdGVSYW5nZUNhbGN1bGF0aW9uKTogdm9pZCB7XG4gICAgdGhpcy4jb25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuXG4gICNzZXRWYWx1ZShcbiAgICB2YWx1ZTogU2t5RGF0ZVJhbmdlQ2FsY3VsYXRpb24gfCB1bmRlZmluZWQsXG4gICAgbm90aWZ5Q2hhbmdlID0gdHJ1ZVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpc05ld1ZhbHVlID0gIXRoaXMuI2RhdGVSYW5nZXNFcXVhbCh0aGlzLiN2YWx1ZSwgdmFsdWUpO1xuXG4gICAgaWYgKGlzTmV3VmFsdWUpIHtcbiAgICAgIHRoaXMuI3ZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmNhbGN1bGF0b3JJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuI3ZhbHVlT3JEZWZhdWx0ID0gdGhpcy4jZGVmYXVsdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jdmFsdWVPckRlZmF1bHQgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vdGlmeUNoYW5nZSkge1xuICAgICAgICB0aGlzLiNvbkNoYW5nZSh0aGlzLiN2YWx1ZU9yRGVmYXVsdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3BhdGNoVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy4jdmFsdWVPckRlZmF1bHQsIHZhbHVlKTtcblxuICAgIHRoaXMuI3NldFZhbHVlKG5ld1ZhbHVlKTtcbiAgfVxuXG4gICNjcmVhdGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy4jZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgY2FsY3VsYXRvcklkOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCksXG4gICAgICBzdGFydERhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICAgIGVuZERhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgI3Nob3dSZWxldmFudEZvcm1GaWVsZHMoKTogdm9pZCB7XG4gICAgY29uc3QgY2FsY3VsYXRvciA9IHRoaXMuc2VsZWN0ZWRDYWxjdWxhdG9yO1xuXG4gICAgbGV0IHNob3dFbmREYXRlUGlja2VyID0gZmFsc2U7XG4gICAgbGV0IHNob3dTdGFydERhdGVQaWNrZXIgPSBmYWxzZTtcblxuICAgIHN3aXRjaCAoY2FsY3VsYXRvcj8udHlwZSkge1xuICAgICAgY2FzZSBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9yVHlwZS5CZWZvcmU6XG4gICAgICAgIHNob3dFbmREYXRlUGlja2VyID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvclR5cGUuQWZ0ZXI6XG4gICAgICAgIHNob3dTdGFydERhdGVQaWNrZXIgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lEYXRlUmFuZ2VDYWxjdWxhdG9yVHlwZS5SYW5nZTpcbiAgICAgICAgc2hvd0VuZERhdGVQaWNrZXIgPSB0cnVlO1xuICAgICAgICBzaG93U3RhcnREYXRlUGlja2VyID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0VuZERhdGVQaWNrZXIgPSBzaG93RW5kRGF0ZVBpY2tlcjtcbiAgICB0aGlzLnNob3dTdGFydERhdGVQaWNrZXIgPSBzaG93U3RhcnREYXRlUGlja2VyO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgI3Jlc2V0Rm9ybUdyb3VwVmFsdWUodmFsdWU/OiBTa3lEYXRlUmFuZ2VDYWxjdWxhdGlvbik6IHZvaWQge1xuICAgIHRoaXMuZm9ybUdyb3VwPy5yZXNldCh2YWx1ZSB8fCB0aGlzLiN2YWx1ZU9yRGVmYXVsdCk7XG4gIH1cblxuICAjYWRkRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gV2F0Y2ggZm9yIHNlbGVjdGVkIGNhbGN1bGF0b3IgY2hhbmdlLlxuICAgIHRoaXMuI2NhbGN1bGF0b3JJZENvbnRyb2w/LnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLiN2YWx1ZU9yRGVmYXVsdD8uY2FsY3VsYXRvcklkKSB7XG4gICAgICAgICAgY29uc3QgaWQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQgZHVyaW5nIGZvcm0gY3JlYXRpb24sIG51bGwgaXMgcGFzc2VkXG4gICAgICAgICAgLy8gYXMgdGhlIHZhbHVlIG9mIHRoZSBjYWxjdWxhdG9yIGlkIGNvbnRyb2xcbiAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgdmFsdWUgY2hhbmdlcyBpZiB0aGUgY2FsY3VsYXRvciBpZCBpcyBhIG51bWJlclxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKCFpc05hTihpZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbGN1bGF0b3IgPSB0aGlzLiNnZXRDYWxjdWxhdG9yQnlJZChpZCk7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IGNhbGN1bGF0b3I/LmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgIHRoaXMuI3NldFZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuI3Jlc2V0Rm9ybUdyb3VwVmFsdWUobmV3VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy4jc2hvd1JlbGV2YW50Rm9ybUZpZWxkcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBXYXRjaCBmb3Igc3RhcnQgZGF0ZSB2YWx1ZSBjaGFuZ2VzLlxuICAgIHRoaXMuI3N0YXJ0RGF0ZUNvbnRyb2w/LnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoc3RhcnREYXRlKSA9PiB7XG4gICAgICAgIHRoaXMuI3BhdGNoVmFsdWUoeyBzdGFydERhdGUgfSk7XG4gICAgICB9KTtcblxuICAgIC8vIFdhdGNoIGZvciBlbmQgZGF0ZSB2YWx1ZSBjaGFuZ2VzLlxuICAgIHRoaXMuI2VuZERhdGVDb250cm9sPy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGVuZERhdGUpID0+IHtcbiAgICAgICAgdGhpcy4jcGF0Y2hWYWx1ZSh7IGVuZERhdGUgfSk7XG4gICAgICB9KTtcblxuICAgIC8vIFNhZmV0eSBjaGVja1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuI3N0YXJ0RGF0ZUNvbnRyb2wgJiYgdGhpcy4jZW5kRGF0ZUNvbnRyb2wpIHtcbiAgICAgIC8vIERldGVjdCBlcnJvcnMgZnJvbSB0aGUgZGF0ZSBpbnB1dHMgYW5kIHVwZGF0ZSBuZy0gY2xhc3NlcyBvbiBwaWNrZXIuXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy4jc3RhcnREYXRlQ29udHJvbC5zdGF0dXNDaGFuZ2VzLFxuICAgICAgICB0aGlzLiNlbmREYXRlQ29udHJvbC5zdGF0dXNDaGFuZ2VzLFxuICAgICAgXSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLiN1cGRhdGVCYXNlZE9uQ29udHJvbHMoKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNzdGFydERhdGVDb250cm9sKSB7XG4gICAgICB0aGlzLiNzdGFydERhdGVDb250cm9sLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLiN1cGRhdGVCYXNlZE9uQ29udHJvbHMoKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNlbmREYXRlQ29udHJvbCkge1xuICAgICAgdGhpcy4jZW5kRGF0ZUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3VwZGF0ZUJhc2VkT25Db250cm9scygpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAjdXBkYXRlQmFzZWRPbkNvbnRyb2xzKCk6IHZvaWQge1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gV2FpdCBmb3IgaW5pdGlhbCB2YWxpZGF0aW9uIHRvIGNvbXBsZXRlLlxuICAgIHRoaXMuI25nWm9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLiNjb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gICN1cGRhdGVDYWxjdWxhdG9ycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy4jZGF0ZVJhbmdlU2VydmljZVxuICAgICAgLmdldENhbGN1bGF0b3JzKHRoaXMuY2FsY3VsYXRvcklkcylcbiAgICAgIC50aGVuKChjYWxjdWxhdG9ycykgPT4ge1xuICAgICAgICB0aGlzLmNhbGN1bGF0b3JzID0gY2FsY3VsYXRvcnM7XG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IGFueSBwcmV2aW91c2x5IHNldCB2YWx1ZSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgc2VsZWN0ZWQgY2FsY3VsYXRvclxuICAgICAgICB0aGlzLiN1cGRhdGVTZWxlY3RlZENhbGN1bGF0b3IoKTtcbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gICNnZXRDYWxjdWxhdG9yQnlJZChcbiAgICBpZDogU2t5RGF0ZVJhbmdlQ2FsY3VsYXRvcklkXG4gICk6IFNreURhdGVSYW5nZUNhbGN1bGF0b3IgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0b3JzLmZpbmQoKGNhbGN1bGF0b3IpID0+IHtcbiAgICAgIHJldHVybiBjYWxjdWxhdG9yLmNhbGN1bGF0b3JJZCA9PT0gaWQ7XG4gICAgfSk7XG4gIH1cblxuICAjZGF0ZVJhbmdlc0VxdWFsKFxuICAgIHJhbmdlQTogU2t5RGF0ZVJhbmdlQ2FsY3VsYXRpb24gfCB1bmRlZmluZWQsXG4gICAgcmFuZ2VCOiBTa3lEYXRlUmFuZ2VDYWxjdWxhdGlvbiB8IHVuZGVmaW5lZFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFyYW5nZUEgJiYgISFyYW5nZUIgJiYgSlNPTi5zdHJpbmdpZnkocmFuZ2VBKSA9PT0gSlNPTi5zdHJpbmdpZnkocmFuZ2VCKVxuICAgICk7XG4gIH1cblxuICAjdXBkYXRlU2VsZWN0ZWRDYWxjdWxhdG9yKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDYWxjdWxhdG9yID0gdGhpcy4jdmFsdWVPckRlZmF1bHRcbiAgICAgID8gdGhpcy4jZ2V0Q2FsY3VsYXRvckJ5SWQodGhpcy4jdmFsdWVPckRlZmF1bHQuY2FsY3VsYXRvcklkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgI29uQ2hhbmdlID0gKF86IFNreURhdGVSYW5nZUNhbGN1bGF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7fTtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAjb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge307XG59XG4iLCI8ZGl2XG4gICpuZ0lmPVwiaXNSZWFkeSAmJiBmb3JtR3JvdXBcIlxuICBjbGFzcz1cInNreS1kYXRlLXJhbmdlLXBpY2tlclwiXG4gIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbj5cbiAgPGRpdiBjbGFzcz1cInNreS1kYXRlLXJhbmdlLXBpY2tlci1mb3JtLWdyb3VwXCI+XG4gICAgPHNreS1pbnB1dC1ib3ggW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bGFiZWxcbiAgICAgICAgY2xhc3M9XCJza3ktY29udHJvbC1sYWJlbFwiXG4gICAgICAgIFthdHRyLmZvcl09XCJkYXRlUmFuZ2VQaWNrZXJJZCArICctc2VsZWN0LWNhbGN1bGF0b3InXCJcbiAgICAgID5cbiAgICAgICAge3sgbGFiZWwgfHwgJ3NreXV4X2RhdGVfcmFuZ2VfcGlja2VyX2RlZmF1bHRfbGFiZWwnIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgICA8L2xhYmVsPlxuICAgICAgPHNlbGVjdFxuICAgICAgICBjbGFzcz1cInNreS1mb3JtLWNvbnRyb2xcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjYWxjdWxhdG9ySWRcIlxuICAgICAgICBbYXR0ci5pZF09XCJkYXRlUmFuZ2VQaWNrZXJJZCArICctc2VsZWN0LWNhbGN1bGF0b3InXCJcbiAgICAgICAgKGJsdXIpPVwib25GaWVsZEJsdXIoKVwiXG4gICAgICA+XG4gICAgICAgIDxvcHRpb25cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY2FsY3VsYXRvciBvZiBjYWxjdWxhdG9yc1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImNhbGN1bGF0b3IuY2FsY3VsYXRvcklkXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGNhbGN1bGF0b3Iuc2hvcnREZXNjcmlwdGlvbiB9fVxuICAgICAgICA8L29wdGlvbj5cbiAgICAgIDwvc2VsZWN0PlxuICAgIDwvc2t5LWlucHV0LWJveD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNreS1kYXRlLXJhbmdlLXBpY2tlci1mb3JtLWdyb3VwXCIgW2hpZGRlbl09XCIhc2hvd1N0YXJ0RGF0ZVBpY2tlclwiPlxuICAgIDxza3ktaW5wdXQtYm94IFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgPGxhYmVsXG4gICAgICAgIGNsYXNzPVwic2t5LWNvbnRyb2wtbGFiZWxcIlxuICAgICAgICBbYXR0ci5mb3JdPVwiZGF0ZVJhbmdlUGlja2VySWQgKyAnLXN0YXJ0LWRhdGUnXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnc2t5LWNvbnRyb2wtbGFiZWwtcmVxdWlyZWQnOiBzdGFydERhdGVSZXF1aXJlZCB9XCJcbiAgICAgID5cbiAgICAgICAge3tcbiAgICAgICAgICBzZWxlY3RlZENhbGN1bGF0b3I/LnR5cGVcbiAgICAgICAgICAgIHwgc2t5RGF0ZVJhbmdlUGlja2VyU3RhcnREYXRlUmVzb3VyY2VLZXlcbiAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzXG4gICAgICAgIH19XG4gICAgICA8L2xhYmVsPlxuXG4gICAgICA8c2t5LWRhdGVwaWNrZXI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0RGF0ZVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2FsY3VsYXRvcj8udHlwZVxuICAgICAgICAgICAgICB8IHNreURhdGVSYW5nZVBpY2tlclN0YXJ0RGF0ZVJlc291cmNlS2V5XG4gICAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbYXR0ci5pZF09XCJkYXRlUmFuZ2VQaWNrZXJJZCArICctc3RhcnQtZGF0ZSdcIlxuICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cImRhdGVGb3JtYXRPckRlZmF1bHRcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCIhIXN0YXJ0RGF0ZVJlcXVpcmVkXCJcbiAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0T3JEZWZhdWx0XCJcbiAgICAgICAgICAoYmx1cik9XCJvbkZpZWxkQmx1cigpXCJcbiAgICAgICAgICBza3lEYXRlcGlja2VySW5wdXRcbiAgICAgICAgLz5cbiAgICAgIDwvc2t5LWRhdGVwaWNrZXI+XG4gICAgPC9za3ktaW5wdXQtYm94PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2t5LWRhdGUtcmFuZ2UtcGlja2VyLWZvcm0tZ3JvdXBcIiBbaGlkZGVuXT1cIiFzaG93RW5kRGF0ZVBpY2tlclwiPlxuICAgIDxza3ktaW5wdXQtYm94IFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgPGxhYmVsXG4gICAgICAgIGNsYXNzPVwic2t5LWNvbnRyb2wtbGFiZWxcIlxuICAgICAgICBbYXR0ci5mb3JdPVwiZGF0ZVJhbmdlUGlja2VySWQgKyAnLWVuZC1kYXRlJ1wiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NreS1jb250cm9sLWxhYmVsLXJlcXVpcmVkJzogZW5kRGF0ZVJlcXVpcmVkIH1cIlxuICAgICAgPlxuICAgICAgICB7e1xuICAgICAgICAgIHNlbGVjdGVkQ2FsY3VsYXRvcj8udHlwZVxuICAgICAgICAgICAgfCBza3lEYXRlUmFuZ2VQaWNrZXJFbmREYXRlUmVzb3VyY2VLZXlcbiAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzXG4gICAgICAgIH19XG4gICAgICA8L2xhYmVsPlxuXG4gICAgICA8c2t5LWRhdGVwaWNrZXI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVuZERhdGVcIlxuICAgICAgICAgIHNreURhdGVwaWNrZXJJbnB1dFxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICBzZWxlY3RlZENhbGN1bGF0b3I/LnR5cGVcbiAgICAgICAgICAgICAgfCBza3lEYXRlUmFuZ2VQaWNrZXJFbmREYXRlUmVzb3VyY2VLZXlcbiAgICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgICAgICBcIlxuICAgICAgICAgIFthdHRyLmlkXT1cImRhdGVSYW5nZVBpY2tlcklkICsgJy1lbmQtZGF0ZSdcIlxuICAgICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cImRhdGVGb3JtYXRPckRlZmF1bHRcIlxuICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImRhdGVGb3JtYXRPckRlZmF1bHRcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCIhIWVuZERhdGVSZXF1aXJlZFwiXG4gICAgICAgICAgKGJsdXIpPVwib25GaWVsZEJsdXIoKVwiXG4gICAgICAgIC8+XG4gICAgICA8L3NreS1kYXRlcGlja2VyPlxuICAgIDwvc2t5LWlucHV0LWJveD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==