@netwin/angular-datetime-picker 18.2.0 → 19.0.0-rc.2

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 (77) hide show
  1. package/README.md +1 -27
  2. package/assets/style/picker.min.css +1 -1
  3. package/esm2022/lib/date-time/adapter/date-time-adapter.class.mjs +7 -13
  4. package/esm2022/lib/date-time/adapter/date-time-format.class.mjs +1 -4
  5. package/esm2022/lib/date-time/adapter/native-date-time-adapter.class.mjs +21 -36
  6. package/esm2022/lib/date-time/adapter/native-date-time-format.class.mjs +1 -2
  7. package/esm2022/lib/date-time/adapter/native-date-time.module.mjs +9 -12
  8. package/esm2022/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-adapter.class.mjs +12 -25
  9. package/esm2022/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-format.class.mjs +1 -2
  10. package/esm2022/lib/date-time/calendar-body.component.mjs +22 -31
  11. package/esm2022/lib/date-time/calendar-month-view.component.mjs +13 -29
  12. package/esm2022/lib/date-time/calendar-multi-year-view.component.mjs +11 -17
  13. package/esm2022/lib/date-time/calendar-year-view.component.mjs +11 -19
  14. package/esm2022/lib/date-time/calendar.component.mjs +16 -27
  15. package/esm2022/lib/date-time/date-time-inline.component.mjs +280 -110
  16. package/esm2022/lib/date-time/date-time-picker-intl.service.mjs +4 -11
  17. package/esm2022/lib/date-time/date-time.module.mjs +12 -36
  18. package/esm2022/lib/date-time/options-provider.mjs +1 -1
  19. package/esm2022/lib/date-time/timer-box.component.mjs +6 -16
  20. package/esm2022/lib/date-time/timer.component.mjs +18 -17
  21. package/esm2022/lib/types/date-view.mjs +19 -0
  22. package/esm2022/lib/types/index.mjs +4 -0
  23. package/esm2022/lib/types/picker-type.mjs +2 -0
  24. package/esm2022/lib/types/select-mode.mjs +2 -0
  25. package/esm2022/public_api.mjs +18 -20
  26. package/fesm2022/netwin-angular-datetime-picker.mjs +1843 -4264
  27. package/fesm2022/netwin-angular-datetime-picker.mjs.map +1 -1
  28. package/lib/date-time/adapter/date-time-adapter.class.d.ts +16 -26
  29. package/lib/date-time/adapter/date-time-format.class.d.ts +8 -12
  30. package/lib/date-time/adapter/native-date-time-adapter.class.d.ts +7 -18
  31. package/lib/date-time/adapter/native-date-time-format.class.d.ts +0 -3
  32. package/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-adapter.class.d.ts +6 -17
  33. package/lib/date-time/adapter/unix-timestamp-adapter/unix-timestamp-date-time-format.class.d.ts +0 -3
  34. package/lib/date-time/calendar-body.component.d.ts +21 -26
  35. package/lib/date-time/calendar-month-view.component.d.ts +19 -24
  36. package/lib/date-time/calendar-multi-year-view.component.d.ts +14 -14
  37. package/lib/date-time/calendar-year-view.component.d.ts +8 -9
  38. package/lib/date-time/calendar.component.d.ts +15 -21
  39. package/lib/date-time/date-time-inline.component.d.ts +164 -74
  40. package/lib/date-time/date-time-picker-intl.service.d.ts +0 -4
  41. package/lib/date-time/date-time.module.d.ts +11 -18
  42. package/lib/date-time/timer-box.component.d.ts +4 -5
  43. package/lib/date-time/timer.component.d.ts +6 -9
  44. package/lib/types/date-view.d.ts +17 -0
  45. package/lib/types/index.d.ts +3 -0
  46. package/lib/types/picker-type.d.ts +7 -0
  47. package/lib/types/select-mode.d.ts +8 -0
  48. package/package.json +1 -1
  49. package/public_api.d.ts +12 -19
  50. package/esm2022/lib/date-time/date-time-picker-container.component.mjs +0 -405
  51. package/esm2022/lib/date-time/date-time-picker-input.directive.mjs +0 -598
  52. package/esm2022/lib/date-time/date-time-picker-trigger.directive.mjs +0 -64
  53. package/esm2022/lib/date-time/date-time-picker.animations.mjs +0 -21
  54. package/esm2022/lib/date-time/date-time-picker.component.mjs +0 -564
  55. package/esm2022/lib/date-time/date-time.class.mjs +0 -176
  56. package/esm2022/lib/date-time/numberedFixLen.pipe.mjs +0 -28
  57. package/esm2022/lib/dialog/dialog-config.class.mjs +0 -59
  58. package/esm2022/lib/dialog/dialog-container.component.mjs +0 -232
  59. package/esm2022/lib/dialog/dialog-ref.class.mjs +0 -134
  60. package/esm2022/lib/dialog/dialog.module.mjs +0 -26
  61. package/esm2022/lib/dialog/dialog.service.mjs +0 -228
  62. package/esm2022/lib/utils/index.mjs +0 -5
  63. package/esm2022/lib/utils/object.utils.mjs +0 -23
  64. package/lib/date-time/date-time-picker-container.component.d.ts +0 -130
  65. package/lib/date-time/date-time-picker-input.directive.d.ts +0 -164
  66. package/lib/date-time/date-time-picker-trigger.directive.d.ts +0 -23
  67. package/lib/date-time/date-time-picker.animations.d.ts +0 -8
  68. package/lib/date-time/date-time-picker.component.d.ts +0 -173
  69. package/lib/date-time/date-time.class.d.ts +0 -103
  70. package/lib/date-time/numberedFixLen.pipe.d.ts +0 -10
  71. package/lib/dialog/dialog-config.class.d.ts +0 -169
  72. package/lib/dialog/dialog-container.component.d.ts +0 -58
  73. package/lib/dialog/dialog-ref.class.d.ts +0 -51
  74. package/lib/dialog/dialog.module.d.ts +0 -11
  75. package/lib/dialog/dialog.service.d.ts +0 -76
  76. package/lib/utils/index.d.ts +0 -4
  77. package/lib/utils/object.utils.d.ts +0 -8
@@ -1,43 +1,46 @@
1
- /**
2
- * date-time-inline.component
3
- */
4
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
5
- import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewChild } from '@angular/core';
1
+ import { booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef, inject, Input, numberAttribute, Output } from '@angular/core';
6
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { DateView } from '../types';
4
+ import { DateTimeAdapter } from './adapter/date-time-adapter.class';
7
5
  import { OWL_DATE_TIME_FORMATS } from './adapter/date-time-format.class';
8
- import { OwlDateTimeContainerComponent } from './date-time-picker-container.component';
9
- import { OwlDateTime } from './date-time.class';
6
+ import { OwlDateTimeIntl } from './date-time-picker-intl.service';
10
7
  import * as i0 from "@angular/core";
11
- import * as i1 from "./adapter/date-time-adapter.class";
12
- import * as i2 from "./date-time-picker-container.component";
13
- export const OWL_DATETIME_VALUE_ACCESSOR = {
8
+ import * as i1 from "./timer.component";
9
+ import * as i2 from "./calendar.component";
10
+ const OWL_DATETIME_VALUE_ACCESSOR = {
14
11
  provide: NG_VALUE_ACCESSOR,
15
12
  useExisting: forwardRef(() => OwlDateTimeInlineComponent),
16
13
  multi: true
17
14
  };
18
- export class OwlDateTimeInlineComponent extends OwlDateTime {
19
- get pickerType() {
20
- return this._pickerType;
21
- }
22
- set pickerType(val) {
23
- if (val !== this._pickerType) {
24
- this._pickerType = val;
15
+ let nextUniqueComponentId = 0;
16
+ export class OwlDateTimeInlineComponent {
17
+ #changeDetector;
18
+ #pickerIntl;
19
+ #dateTimeFormats;
20
+ #dateTimeAdapter;
21
+ get firstDayOfWeek() {
22
+ return this._firstDayOfWeek;
23
+ }
24
+ set firstDayOfWeek(value) {
25
+ value = numberAttribute(value, undefined);
26
+ if (value > 6 || value < 0) {
27
+ this._firstDayOfWeek = undefined;
28
+ }
29
+ else {
30
+ this._firstDayOfWeek = value;
25
31
  }
26
32
  }
27
- get disabled() {
28
- return !!this._disabled;
29
- }
30
- set disabled(value) {
31
- this._disabled = coerceBooleanProperty(value);
32
- }
33
- get selectMode() {
34
- return this._selectMode;
35
- }
36
- set selectMode(mode) {
37
- if (mode !== 'single' && mode !== 'range' && mode !== 'rangeFrom' && mode !== 'rangeTo') {
38
- throw Error('OwlDateTime Error: invalid selectMode value!');
33
+ get formatOptions() {
34
+ if (this.pickerType === 'both') {
35
+ return this.#dateTimeFormats.fullPickerInput;
36
+ }
37
+ if (this.pickerType === 'calendar') {
38
+ return this.#dateTimeFormats.datePickerInput;
39
39
  }
40
- this._selectMode = mode;
40
+ return this.#dateTimeFormats.timePickerInput;
41
+ }
42
+ getValidDate(obj) {
43
+ return this.#dateTimeAdapter.isDateInstance(obj) && this.#dateTimeAdapter.isValid(obj) ? obj : null;
41
44
  }
42
45
  get startAt() {
43
46
  if (this._startAt) {
@@ -57,7 +60,7 @@ export class OwlDateTimeInlineComponent extends OwlDateTime {
57
60
  }
58
61
  }
59
62
  set startAt(date) {
60
- this._startAt = this.getValidDate(this.dateTimeAdapter.deserialize(date));
63
+ this._startAt = this.getValidDate(this.#dateTimeAdapter.deserialize(date));
61
64
  }
62
65
  get endAt() {
63
66
  if (this._endAt) {
@@ -74,33 +77,37 @@ export class OwlDateTimeInlineComponent extends OwlDateTime {
74
77
  }
75
78
  }
76
79
  set endAt(date) {
77
- this._endAt = this.getValidDate(this.dateTimeAdapter.deserialize(date));
80
+ this._endAt = this.getValidDate(this.#dateTimeAdapter.deserialize(date));
78
81
  }
79
- get dateTimeFilter() {
80
- return this._dateTimeFilter;
82
+ // TODO: remove this getter when `owlDateTimeFilter` is removed
83
+ get dateTimeFilterGetter() {
84
+ return this.dateTimeFilter || this.owlDateTimeFilter;
81
85
  }
82
- set dateTimeFilter(filter) {
83
- this._dateTimeFilter = filter;
84
- }
85
- get minDateTime() {
86
+ /**
87
+ * The minimum valid date.
88
+ */
89
+ get min() {
86
90
  return this._min || null;
87
91
  }
88
- set minDateTime(value) {
89
- this._min = this.getValidDate(this.dateTimeAdapter.deserialize(value));
90
- this.changeDetector.markForCheck();
92
+ set min(value) {
93
+ this._min = this.getValidDate(this.#dateTimeAdapter.deserialize(value));
94
+ this.#changeDetector.markForCheck();
91
95
  }
92
- get maxDateTime() {
96
+ /**
97
+ * The maximum valid date.
98
+ */
99
+ get max() {
93
100
  return this._max || null;
94
101
  }
95
- set maxDateTime(value) {
96
- this._max = this.getValidDate(this.dateTimeAdapter.deserialize(value));
97
- this.changeDetector.markForCheck();
102
+ set max(value) {
103
+ this._max = this.getValidDate(this.#dateTimeAdapter.deserialize(value));
104
+ this.#changeDetector.markForCheck();
98
105
  }
99
106
  get value() {
100
107
  return this._value;
101
108
  }
102
109
  set value(value) {
103
- value = this.dateTimeAdapter.deserialize(value);
110
+ value = this.#dateTimeAdapter.deserialize(value);
104
111
  value = this.getValidDate(value);
105
112
  this._value = value;
106
113
  this.selected = value;
@@ -111,9 +118,9 @@ export class OwlDateTimeInlineComponent extends OwlDateTime {
111
118
  set values(values) {
112
119
  if (values && values.length > 0) {
113
120
  values = values.map((v) => {
114
- v = this.dateTimeAdapter.deserialize(v);
121
+ v = this.#dateTimeAdapter.deserialize(v);
115
122
  v = this.getValidDate(v);
116
- return v ? this.dateTimeAdapter.clone(v) : null;
123
+ return v ? this.#dateTimeAdapter.clone(v) : null;
117
124
  });
118
125
  this._values = [...values];
119
126
  this.selecteds = [...values];
@@ -128,59 +135,140 @@ export class OwlDateTimeInlineComponent extends OwlDateTime {
128
135
  }
129
136
  set selected(value) {
130
137
  this._selected = value;
131
- this.changeDetector.markForCheck();
138
+ this.#changeDetector.markForCheck();
132
139
  }
133
140
  get selecteds() {
134
141
  return this._selecteds;
135
142
  }
136
143
  set selecteds(values) {
137
144
  this._selecteds = values;
138
- this.changeDetector.markForCheck();
139
- }
140
- get opened() {
141
- return true;
142
- }
143
- get pickerMode() {
144
- return 'inline';
145
+ this.#changeDetector.markForCheck();
145
146
  }
147
+ /**
148
+ * Returns whether the picker is in single mode
149
+ */
146
150
  get isInSingleMode() {
147
- return this._selectMode === 'single';
151
+ return this.selectMode === 'single';
148
152
  }
153
+ /**
154
+ * Returns whether the picker is in range mode (range, rangeFrom, rangeTo)
155
+ */
149
156
  get isInRangeMode() {
150
- return this._selectMode === 'range' || this._selectMode === 'rangeFrom' || this._selectMode === 'rangeTo';
157
+ return this.selectMode === 'range' || this.selectMode === 'rangeFrom' || this.selectMode === 'rangeTo';
151
158
  }
152
- get owlDTInlineClass() {
153
- return true;
159
+ /**
160
+ * The range 'from' label
161
+ */
162
+ get fromLabel() {
163
+ return this.#pickerIntl.rangeFromLabel;
164
+ }
165
+ /**
166
+ * The range 'to' label
167
+ */
168
+ get toLabel() {
169
+ return this.#pickerIntl.rangeToLabel;
170
+ }
171
+ /**
172
+ * The range 'from' formatted value
173
+ */
174
+ get fromFormattedValue() {
175
+ const value = this.selecteds[0];
176
+ return value ? this.#dateTimeAdapter.format(value, this.formatOptions) : '';
154
177
  }
155
- constructor(changeDetector, dateTimeAdapter, dateTimeFormats) {
156
- super(dateTimeAdapter, dateTimeFormats);
157
- this.changeDetector = changeDetector;
158
- this.dateTimeAdapter = dateTimeAdapter;
159
- this.dateTimeFormats = dateTimeFormats;
178
+ /**
179
+ * The range 'to' formatted value
180
+ */
181
+ get toFormattedValue() {
182
+ const value = this.selecteds[1];
183
+ return value ? this.#dateTimeAdapter.format(value, this.formatOptions) : '';
184
+ }
185
+ constructor() {
186
+ this.#changeDetector = inject(ChangeDetectorRef);
187
+ this.#pickerIntl = inject(OwlDateTimeIntl);
188
+ this.#dateTimeFormats = inject(OWL_DATE_TIME_FORMATS, { optional: true });
189
+ this.#dateTimeAdapter = inject(DateTimeAdapter, { optional: true });
190
+ /**
191
+ * Whether the timer is in hour12 format
192
+ */
193
+ this.hour12Timer = false;
194
+ /**
195
+ * The view that the calendar should start in.
196
+ */
197
+ this.startView = DateView.MONTH;
198
+ /**
199
+ * Whether to should only the year and multi-year views.
200
+ */
201
+ this.yearOnly = false;
202
+ /**
203
+ * Whether to should only the multi-year view.
204
+ */
205
+ this.multiyearOnly = false;
206
+ /**
207
+ * Hours to change per step
208
+ */
209
+ this.stepHour = 1;
210
+ /**
211
+ * Minutes to change per step
212
+ */
213
+ this.stepMinute = 1;
214
+ /**
215
+ * Seconds to change per step
216
+ */
217
+ this.stepSecond = 1;
218
+ /**
219
+ * Whether to hide dates in other months at the start or end of the current month.
220
+ */
221
+ this.hideOtherMonths = false;
222
+ /**
223
+ * Date Time Checker to check if the give dateTime is selectable
224
+ */
225
+ this.dateTimeChecker = (dateTime) => {
226
+ return (!!dateTime &&
227
+ (!this.dateTimeFilter || this.dateTimeFilter(dateTime)) &&
228
+ (!this.min || this.#dateTimeAdapter.compare(dateTime, this.min) >= 0) &&
229
+ (!this.max || this.#dateTimeAdapter.compare(dateTime, this.max) <= 0));
230
+ };
160
231
  /**
161
- * Set the type of the dateTime picker
162
- * 'both' -- show both calendar and timer
163
- * 'calendar' -- show only calendar
164
- * 'timer' -- show only timer
232
+ * Set the {@link PickerType} of the dateTime picker
165
233
  */
166
- this._pickerType = 'both';
167
- this._disabled = false;
168
- this._selectMode = 'single';
234
+ this.pickerType = 'both';
235
+ /**
236
+ * Whether the picker is disabled or not
237
+ */
238
+ this.disabled = false;
239
+ /**
240
+ * Whether to show the second's timer
241
+ */
242
+ this.showSecondsTimer = false;
243
+ /**
244
+ * Which select mode to use:
245
+ * - 'single'
246
+ * - 'range'
247
+ * - 'rangeFrom'
248
+ * - 'rangeTo'
249
+ */
250
+ this.selectMode = 'single';
251
+ /**
252
+ * @deprecated use `dateTimeFilter` instead!
253
+ */
254
+ this.owlDateTimeFilter = null;
255
+ this.dateTimeFilter = null;
169
256
  this._values = [];
170
257
  /**
171
258
  * Emits selected year in multi-year view
172
259
  * This doesn't imply a change on the selected date.
173
- * */
260
+ */
174
261
  this.yearSelected = new EventEmitter();
175
262
  /**
176
263
  * Emits selected month in year view
177
264
  * This doesn't imply a change on the selected date.
178
- * */
265
+ */
179
266
  this.monthSelected = new EventEmitter();
180
267
  /**
181
268
  * Emits selected date
182
- * */
269
+ */
183
270
  this.dateSelected = new EventEmitter();
271
+ this.activeSelectedIndex = 0; // The current active SelectedIndex in range select mode (0: 'from', 1: 'to')
184
272
  this._selecteds = [];
185
273
  this.onModelChange = () => {
186
274
  /* noop */
@@ -188,18 +276,41 @@ export class OwlDateTimeInlineComponent extends OwlDateTime {
188
276
  this.onModelTouched = () => {
189
277
  /* noop */
190
278
  };
191
- }
192
- ngOnInit() {
193
- this.container.picker = this;
279
+ if (!this.#dateTimeAdapter) {
280
+ throw Error(`OwlDateTimePicker: No provider found for DateTimeAdapter. You must import one of the following ` +
281
+ `modules at your application root: OwlNativeDateTimeModule, OwlMomentDateTimeModule, or provide a ` +
282
+ `custom implementation.`);
283
+ }
284
+ if (!this.#dateTimeFormats) {
285
+ throw Error(`OwlDateTimePicker: No provider found for OWL_DATE_TIME_FORMATS. You must import one of the following ` +
286
+ `modules at your application root: OwlNativeDateTimeModule, OwlMomentDateTimeModule, or provide a ` +
287
+ `custom implementation.`);
288
+ }
289
+ this.id = `owl-dt-picker-${nextUniqueComponentId++}`;
194
290
  }
195
291
  writeValue(value) {
196
292
  if (this.isInSingleMode) {
197
- this.value = value;
198
- this.container.pickerMoment = value;
293
+ this.selected = value;
294
+ this.value = this.selected;
199
295
  }
200
296
  else {
201
- this.values = value;
202
- this.container.pickerMoment = this._values[this.container.activeSelectedIndex];
297
+ // Handle the case where the second selected date is before the first selected date
298
+ // In this case "go back" and treat the value as the first selected date
299
+ if (this.activeSelectedIndex === 1) {
300
+ if (value.getTime() < this.selecteds[0].getTime()) {
301
+ this.activeSelectedIndex = 0;
302
+ }
303
+ }
304
+ // Set the correct value according to the active selected index
305
+ if (this.activeSelectedIndex === 0) {
306
+ this.selecteds = [value, null];
307
+ }
308
+ else {
309
+ this.selecteds[1] = value;
310
+ }
311
+ // Set the values to the selecteds
312
+ this.values = [...this.selecteds];
313
+ this.activeSelectedIndex = (this.activeSelectedIndex + 1) % 2;
203
314
  }
204
315
  }
205
316
  registerOnChange(fn) {
@@ -226,59 +337,118 @@ export class OwlDateTimeInlineComponent extends OwlDateTime {
226
337
  }
227
338
  /**
228
339
  * Emits the selected year in multi-year view
229
- * */
340
+ */
230
341
  selectYear(normalizedYear) {
231
342
  this.yearSelected.emit(normalizedYear);
232
343
  }
233
344
  /**
234
345
  * Emits selected month in year view
235
- * */
346
+ */
236
347
  selectMonth(normalizedMonth) {
348
+ this.writeValue(normalizedMonth);
237
349
  this.monthSelected.emit(normalizedMonth);
238
350
  }
239
351
  /**
240
352
  * Emits the selected date
241
- * */
353
+ */
242
354
  selectDate(normalizedDate) {
355
+ this.writeValue(normalizedDate);
243
356
  this.dateSelected.emit(normalizedDate);
244
357
  }
245
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: OwlDateTimeInlineComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DateTimeAdapter, optional: true }, { token: OWL_DATE_TIME_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
246
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: OwlDateTimeInlineComponent, selector: "owl-date-time-inline", inputs: { pickerType: "pickerType", disabled: "disabled", selectMode: "selectMode", startAt: "startAt", endAt: "endAt", dateTimeFilter: ["owlDateTimeFilter", "dateTimeFilter"], minDateTime: ["min", "minDateTime"], maxDateTime: ["max", "maxDateTime"], value: "value", values: "values" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", dateSelected: "dateSelected" }, host: { properties: { "class.owl-dt-inline": "owlDTInlineClass" } }, providers: [OWL_DATETIME_VALUE_ACCESSOR], viewQueries: [{ propertyName: "container", first: true, predicate: OwlDateTimeContainerComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<owl-date-time-container></owl-date-time-container>\n", styles: [""], dependencies: [{ kind: "component", type: i2.OwlDateTimeContainerComponent, selector: "owl-date-time-container", exportAs: ["owlDateTimeContainer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
358
+ /**
359
+ * Sets the active "selected" index in range mode.
360
+ * - 0 for 'from'
361
+ * - 1 for 'to'
362
+ */
363
+ setActiveSelectedIndex(index) {
364
+ if (this.selectMode === 'range' && this.activeSelectedIndex !== index) {
365
+ this.activeSelectedIndex = index;
366
+ const selected = this.selecteds[this.activeSelectedIndex];
367
+ if (this.selecteds && selected) {
368
+ this.value = this.#dateTimeAdapter.clone(selected);
369
+ }
370
+ }
371
+ return;
372
+ }
373
+ /**
374
+ * Handle click on inform radio group
375
+ */
376
+ handleKeydownOnInfoGroup(event, next, index) {
377
+ let handled = false;
378
+ switch (event.key) {
379
+ // Navigate between the radio group options with arrow keys
380
+ case 'ArrowDown':
381
+ case 'ArrowRight':
382
+ case 'ArrowUp':
383
+ case 'ArrowLeft':
384
+ next.focus();
385
+ this.setActiveSelectedIndex(index === 0 ? 1 : 0);
386
+ handled = true;
387
+ break;
388
+ // Select the active selected index when space is pressed
389
+ case ' ':
390
+ this.setActiveSelectedIndex(index);
391
+ handled = true;
392
+ break;
393
+ }
394
+ if (handled) {
395
+ event.preventDefault();
396
+ event.stopPropagation();
397
+ }
398
+ }
399
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: OwlDateTimeInlineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
400
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: OwlDateTimeInlineComponent, selector: "owl-date-time-inline", inputs: { hour12Timer: ["hour12Timer", "hour12Timer", booleanAttribute], startView: "startView", yearOnly: ["yearOnly", "yearOnly", booleanAttribute], multiyearOnly: ["multiyearOnly", "multiyearOnly", booleanAttribute], stepHour: "stepHour", stepMinute: "stepMinute", stepSecond: "stepSecond", firstDayOfWeek: "firstDayOfWeek", hideOtherMonths: ["hideOtherMonths", "hideOtherMonths", booleanAttribute], pickerType: "pickerType", disabled: ["disabled", "disabled", booleanAttribute], showSecondsTimer: ["showSecondsTimer", "showSecondsTimer", booleanAttribute], selectMode: "selectMode", startAt: "startAt", endAt: "endAt", owlDateTimeFilter: "owlDateTimeFilter", dateTimeFilter: "dateTimeFilter", min: "min", max: "max", value: "value", values: "values" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", dateSelected: "dateSelected" }, host: { properties: { "class.owl-dt-container-disabled": "disabled" }, classAttribute: "owl-dt-inline owl-dt-container owl-dt-inline-container" }, providers: [OWL_DATETIME_VALUE_ACCESSOR], ngImport: i0, template: "<div class=\"owl-dt-container-inner\">\n @if (pickerType === 'both' || pickerType === 'calendar') {\n <owl-date-time-calendar\n [dateFilter]=\"dateTimeFilterGetter\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n [hideOtherMonths]=\"hideOtherMonths\"\n [maxDate]=\"max\"\n [minDate]=\"min\"\n [multiyearOnly]=\"multiyearOnly\"\n [selectMode]=\"selectMode\"\n [selected]=\"selected\"\n [selecteds]=\"selecteds\"\n [startView]=\"startView\"\n [yearOnly]=\"yearOnly\"\n [(pickerMoment)]=\"value\"\n (dateClicked)=\"selectDate($event)\"\n (monthSelected)=\"selectMonth($event)\"\n (selectedChange)=\"select($event)\"\n (yearSelected)=\"selectYear($event)\"\n class=\"owl-dt-container-row\">\n </owl-date-time-calendar>\n }\n\n @if (pickerType === 'both' || pickerType === 'timer') {\n <owl-date-time-timer\n [hour12Timer]=\"hour12Timer\"\n [maxDateTime]=\"max\"\n [minDateTime]=\"min\"\n [pickerMoment]=\"value\"\n [showSecondsTimer]=\"showSecondsTimer\"\n [stepHour]=\"stepHour\"\n [stepMinute]=\"stepMinute\"\n [stepSecond]=\"stepSecond\"\n (selectedChange)=\"select($event)\"\n class=\"owl-dt-container-row\">\n </owl-date-time-timer>\n }\n\n @if (isInRangeMode) {\n <div\n class=\"owl-dt-container-info owl-dt-container-row\"\n role=\"radiogroup\">\n <div\n #from\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\n [class.owl-dt-container-info-active]=\"activeSelectedIndex === 0\"\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\n (click)=\"setActiveSelectedIndex(0)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-from\"\n role=\"radio\">\n <span\n class=\"owl-dt-control-content owl-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"owl-dt-container-info-label\">{{ fromLabel }}:</span>\n <span class=\"owl-dt-container-info-value\">{{ fromFormattedValue }}</span>\n </span>\n </div>\n <div\n #to\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\n [class.owl-dt-container-info-active]=\"activeSelectedIndex === 1\"\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\n (click)=\"setActiveSelectedIndex(1)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-to\"\n role=\"radio\">\n <span\n class=\"owl-dt-control-content owl-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"owl-dt-container-info-label\">{{ toLabel }}:</span>\n <span class=\"owl-dt-container-info-value\">{{ toFormattedValue }}</span>\n </span>\n </div>\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1.OwlTimerComponent, selector: "owl-date-time-timer", inputs: ["pickerMoment", "minDateTime", "maxDateTime", "showSecondsTimer", "hour12Timer", "stepHour", "stepMinute", "stepSecond"], outputs: ["selectedChange"], exportAs: ["owlDateTimeTimer"] }, { kind: "component", type: i2.OwlCalendarComponent, selector: "owl-date-time-calendar", inputs: ["minDate", "maxDate", "pickerMoment", "selected", "selecteds", "dateFilter", "firstDayOfWeek", "selectMode", "startView", "yearOnly", "multiyearOnly", "hideOtherMonths"], outputs: ["pickerMomentChange", "dateClicked", "selectedChange", "yearSelected", "monthSelected"], exportAs: ["owlDateTimeCalendar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
247
401
  }
248
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: OwlDateTimeInlineComponent, decorators: [{
402
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: OwlDateTimeInlineComponent, decorators: [{
249
403
  type: Component,
250
404
  args: [{ selector: 'owl-date-time-inline', host: {
251
- '[class.owl-dt-inline]': 'owlDTInlineClass'
252
- }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, providers: [OWL_DATETIME_VALUE_ACCESSOR], template: "<owl-date-time-container></owl-date-time-container>\n" }]
253
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DateTimeAdapter, decorators: [{
254
- type: Optional
255
- }] }, { type: undefined, decorators: [{
256
- type: Optional
257
- }, {
258
- type: Inject,
259
- args: [OWL_DATE_TIME_FORMATS]
260
- }] }], propDecorators: { container: [{
261
- type: ViewChild,
262
- args: [OwlDateTimeContainerComponent, { static: true }]
405
+ '[class.owl-dt-container-disabled]': 'disabled',
406
+ 'class': 'owl-dt-inline owl-dt-container owl-dt-inline-container'
407
+ }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, providers: [OWL_DATETIME_VALUE_ACCESSOR], template: "<div class=\"owl-dt-container-inner\">\n @if (pickerType === 'both' || pickerType === 'calendar') {\n <owl-date-time-calendar\n [dateFilter]=\"dateTimeFilterGetter\"\n [firstDayOfWeek]=\"firstDayOfWeek\"\n [hideOtherMonths]=\"hideOtherMonths\"\n [maxDate]=\"max\"\n [minDate]=\"min\"\n [multiyearOnly]=\"multiyearOnly\"\n [selectMode]=\"selectMode\"\n [selected]=\"selected\"\n [selecteds]=\"selecteds\"\n [startView]=\"startView\"\n [yearOnly]=\"yearOnly\"\n [(pickerMoment)]=\"value\"\n (dateClicked)=\"selectDate($event)\"\n (monthSelected)=\"selectMonth($event)\"\n (selectedChange)=\"select($event)\"\n (yearSelected)=\"selectYear($event)\"\n class=\"owl-dt-container-row\">\n </owl-date-time-calendar>\n }\n\n @if (pickerType === 'both' || pickerType === 'timer') {\n <owl-date-time-timer\n [hour12Timer]=\"hour12Timer\"\n [maxDateTime]=\"max\"\n [minDateTime]=\"min\"\n [pickerMoment]=\"value\"\n [showSecondsTimer]=\"showSecondsTimer\"\n [stepHour]=\"stepHour\"\n [stepMinute]=\"stepMinute\"\n [stepSecond]=\"stepSecond\"\n (selectedChange)=\"select($event)\"\n class=\"owl-dt-container-row\">\n </owl-date-time-timer>\n }\n\n @if (isInRangeMode) {\n <div\n class=\"owl-dt-container-info owl-dt-container-row\"\n role=\"radiogroup\">\n <div\n #from\n [attr.aria-checked]=\"activeSelectedIndex === 0\"\n [class.owl-dt-container-info-active]=\"activeSelectedIndex === 0\"\n [tabindex]=\"activeSelectedIndex === 0 ? 0 : -1\"\n (click)=\"setActiveSelectedIndex(0)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, to, 0)\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-from\"\n role=\"radio\">\n <span\n class=\"owl-dt-control-content owl-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"owl-dt-container-info-label\">{{ fromLabel }}:</span>\n <span class=\"owl-dt-container-info-value\">{{ fromFormattedValue }}</span>\n </span>\n </div>\n <div\n #to\n [attr.aria-checked]=\"activeSelectedIndex === 1\"\n [class.owl-dt-container-info-active]=\"activeSelectedIndex === 1\"\n [tabindex]=\"activeSelectedIndex === 1 ? 0 : -1\"\n (click)=\"setActiveSelectedIndex(1)\"\n (keydown)=\"handleKeydownOnInfoGroup($event, from, 1)\"\n class=\"owl-dt-control owl-dt-container-range owl-dt-container-to\"\n role=\"radio\">\n <span\n class=\"owl-dt-control-content owl-dt-container-range-content\"\n tabindex=\"-1\">\n <span class=\"owl-dt-container-info-label\">{{ toLabel }}:</span>\n <span class=\"owl-dt-container-info-value\">{{ toFormattedValue }}</span>\n </span>\n </div>\n </div>\n }\n</div>\n" }]
408
+ }], ctorParameters: () => [], propDecorators: { hour12Timer: [{
409
+ type: Input,
410
+ args: [{ transform: booleanAttribute }]
411
+ }], startView: [{
412
+ type: Input
413
+ }], yearOnly: [{
414
+ type: Input,
415
+ args: [{ transform: booleanAttribute }]
416
+ }], multiyearOnly: [{
417
+ type: Input,
418
+ args: [{ transform: booleanAttribute }]
419
+ }], stepHour: [{
420
+ type: Input
421
+ }], stepMinute: [{
422
+ type: Input
423
+ }], stepSecond: [{
424
+ type: Input
425
+ }], firstDayOfWeek: [{
426
+ type: Input
427
+ }], hideOtherMonths: [{
428
+ type: Input,
429
+ args: [{ transform: booleanAttribute }]
263
430
  }], pickerType: [{
264
431
  type: Input
265
432
  }], disabled: [{
266
- type: Input
433
+ type: Input,
434
+ args: [{ transform: booleanAttribute }]
435
+ }], showSecondsTimer: [{
436
+ type: Input,
437
+ args: [{ transform: booleanAttribute }]
267
438
  }], selectMode: [{
268
439
  type: Input
269
440
  }], startAt: [{
270
441
  type: Input
271
442
  }], endAt: [{
272
443
  type: Input
444
+ }], owlDateTimeFilter: [{
445
+ type: Input
273
446
  }], dateTimeFilter: [{
274
- type: Input,
275
- args: ['owlDateTimeFilter']
276
- }], minDateTime: [{
277
- type: Input,
278
- args: ['min']
279
- }], maxDateTime: [{
280
- type: Input,
281
- args: ['max']
447
+ type: Input
448
+ }], min: [{
449
+ type: Input
450
+ }], max: [{
451
+ type: Input
282
452
  }], value: [{
283
453
  type: Input
284
454
  }], values: [{
@@ -290,4 +460,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
290
460
  }], dateSelected: [{
291
461
  type: Output
292
462
  }] } });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waWNrZXIvc3JjL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waWNrZXIvc3JjL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLHFCQUFxQixFQUFzQixNQUFNLGtDQUFrQyxDQUFDO0FBQzdGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQXNDLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFFcEYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQVE7SUFDOUMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDBCQUEwQixDQUFDO0lBQ3pELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQWFGLE1BQU0sT0FBTywwQkFBOEIsU0FBUSxXQUFjO0lBVy9ELElBQ0ksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsR0FBZTtRQUM1QixJQUFJLEdBQUcs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Y2VzQ29udGVudCI6WyIvKipcbiAqIGRhdGUtdGltZS1pbmxpbmUuY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZVRpbWVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1hZGFwdGVyLmNsYXNzJztcbmltcG9ydCB7IE9XTF9EQVRFX1RJTUVfRk9STUFUUywgT3dsRGF0ZVRpbWVGb3JtYXRzIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1mb3JtYXQuY2xhc3MnO1xuaW1wb3J0IHsgT3dsRGF0ZVRpbWVDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGUtdGltZS1waWNrZXItY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPd2xEYXRlVGltZSwgUGlja2VyTW9kZSwgUGlja2VyVHlwZSwgU2VsZWN0TW9kZSB9IGZyb20gJy4vZGF0ZS10aW1lLmNsYXNzJztcblxuZXhwb3J0IGNvbnN0IE9XTF9EQVRFVElNRV9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3dsRGF0ZVRpbWVJbmxpbmVDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb3dsLWRhdGUtdGltZS1pbmxpbmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtdGltZS1pbmxpbmUuY29tcG9uZW50LnNjc3MnXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Mub3dsLWR0LWlubGluZV0nOiAnb3dsRFRJbmxpbmVDbGFzcydcbiAgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBwcm92aWRlcnM6IFtPV0xfREFURVRJTUVfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIE93bERhdGVUaW1lSW5saW5lQ29tcG9uZW50PFQ+IGV4dGVuZHMgT3dsRGF0ZVRpbWU8VD4gaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQFZpZXdDaGlsZChPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgY29udGFpbmVyOiBPd2xEYXRlVGltZUNvbnRhaW5lckNvbXBvbmVudDxUPjtcblxuICAvKipcbiAgICogU2V0IHRoZSB0eXBlIG9mIHRoZSBkYXRlVGltZSBwaWNrZXJcbiAgICogICAgICAnYm90aCcgLS0gc2hvdyBib3RoIGNhbGVuZGFyIGFuZCB0aW1lclxuICAgKiAgICAgICdjYWxlbmRhcicgLS0gc2hvdyBvbmx5IGNhbGVuZGFyXG4gICAqICAgICAgJ3RpbWVyJyAtLSBzaG93IG9ubHkgdGltZXJcbiAgICovXG4gIHByaXZhdGUgX3BpY2tlclR5cGU6IFBpY2tlclR5cGUgPSAnYm90aCc7XG4gIEBJbnB1dCgpXG4gIGdldCBwaWNrZXJUeXBlKCk6IFBpY2tlclR5cGUge1xuICAgIHJldHVybiB0aGlzLl9waWNrZXJUeXBlO1xuICB9XG5cbiAgc2V0IHBpY2tlclR5cGUodmFsOiBQaWNrZXJUeXBlKSB7XG4gICAgaWYgKHZhbCAhPT0gdGhpcy5fcGlja2VyVHlwZSkge1xuICAgICAgdGhpcy5fcGlja2VyVHlwZSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBvdmVycmlkZSBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RNb2RlOiBTZWxlY3RNb2RlID0gJ3NpbmdsZSc7XG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RNb2RlO1xuICB9XG5cbiAgc2V0IHNlbGVjdE1vZGUobW9kZTogU2VsZWN0TW9kZSkge1xuICAgIGlmIChtb2RlICE9PSAnc2luZ2xlJyAmJiBtb2RlICE9PSAncmFuZ2UnICYmIG1vZGUgIT09ICdyYW5nZUZyb20nICYmIG1vZGUgIT09ICdyYW5nZVRvJykge1xuICAgICAgdGhyb3cgRXJyb3IoJ093bERhdGVUaW1lIEVycm9yOiBpbnZhbGlkIHNlbGVjdE1vZGUgdmFsdWUhJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0TW9kZSA9IG1vZGU7XG4gIH1cblxuICAvKiogVGhlIGRhdGUgdG8gb3BlbiB0aGUgY2FsZW5kYXIgdG8gaW5pdGlhbGx5LiAqL1xuICBwcml2YXRlIF9zdGFydEF0OiBUIHwgbnVsbDtcbiAgQElucHV0KClcbiAgZ2V0IHN0YXJ0QXQoKTogVCB8IG51bGwge1xuICAgIGlmICh0aGlzLl9zdGFydEF0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRBdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWUgfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fCB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNbMF0gfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNbMV0gfHwgbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2V0IHN0YXJ0QXQoZGF0ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9zdGFydEF0ID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkpO1xuICB9XG5cbiAgLyoqIFRoZSBkYXRlIHRvIG9wZW4gZm9yIHJhbmdlIGNhbGVuZGFyLiAqL1xuICBwcml2YXRlIF9lbmRBdDogVCB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIGdldCBlbmRBdCgpOiBUIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX2VuZEF0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW5kQXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlIHx8IG51bGw7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZScgfHwgdGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJykge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzWzFdIHx8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNldCBlbmRBdChkYXRlOiBUIHwgbnVsbCkge1xuICAgIHRoaXMuX2VuZEF0ID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUoZGF0ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGF0ZVRpbWVGaWx0ZXI6IChkYXRlOiBUIHwgbnVsbCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCdvd2xEYXRlVGltZUZpbHRlcicpXG4gIGdldCBkYXRlVGltZUZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZVRpbWVGaWx0ZXI7XG4gIH1cblxuICBzZXQgZGF0ZVRpbWVGaWx0ZXIoZmlsdGVyOiAoZGF0ZTogVCB8IG51bGwpID0+IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kYXRlVGltZUZpbHRlciA9IGZpbHRlcjtcbiAgfVxuXG4gIC8qKiBUaGUgbWluaW11bSB2YWxpZCBkYXRlLiAqL1xuICBwcml2YXRlIF9taW46IFQgfCBudWxsO1xuXG4gIGdldCBtaW5EYXRlVGltZSgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21pbiB8fCBudWxsO1xuICB9XG5cbiAgQElucHV0KCdtaW4nKVxuICBzZXQgbWluRGF0ZVRpbWUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fbWluID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy5kYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRoZSBtYXhpbXVtIHZhbGlkIGRhdGUuICovXG4gIHByaXZhdGUgX21heDogVCB8IG51bGw7XG5cbiAgZ2V0IG1heERhdGVUaW1lKCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4IHx8IG51bGw7XG4gIH1cblxuICBASW5wdXQoJ21heCcpXG4gIHNldCBtYXhEYXRlVGltZSh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9tYXggPSB0aGlzLmdldFZhbGlkRGF0ZSh0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF92YWx1ZTogVCB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsdWU6IFQgfCBudWxsKSB7XG4gICAgdmFsdWUgPSB0aGlzLmRhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgdmFsdWUgPSB0aGlzLmdldFZhbGlkRGF0ZSh2YWx1ZSk7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF92YWx1ZXM6IEFycmF5PFQ+ID0gW107XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHNldCB2YWx1ZXModmFsdWVzOiBBcnJheTxUPikge1xuICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoKHYpID0+IHtcbiAgICAgICAgdiA9IHRoaXMuZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHYpO1xuICAgICAgICB2ID0gdGhpcy5nZXRWYWxpZERhdGUodik7XG4gICAgICAgIHJldHVybiB2ID8gdGhpcy5kYXRlVGltZUFkYXB0ZXIuY2xvbmUodikgOiBudWxsO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl92YWx1ZXMgPSBbLi4udmFsdWVzXTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRzID0gWy4uLnZhbHVlc107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy5zZWxlY3RlZHMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgeWVhciBpbiBtdWx0aS15ZWFyIHZpZXdcbiAgICogVGhpcyBkb2Vzbid0IGltcGx5IGEgY2hhbmdlIG9uIHRoZSBzZWxlY3RlZCBkYXRlLlxuICAgKiAqL1xuICBAT3V0cHV0KClcbiAgeWVhclNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCBtb250aCBpbiB5ZWFyIHZpZXdcbiAgICogVGhpcyBkb2Vzbid0IGltcGx5IGEgY2hhbmdlIG9uIHRoZSBzZWxlY3RlZCBkYXRlLlxuICAgKiAqL1xuICBAT3V0cHV0KClcbiAgbW9udGhTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgZGF0ZVxuICAgKiAqL1xuICBAT3V0cHV0KClcbiAgZGF0ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gIHByaXZhdGUgX3NlbGVjdGVkOiBUIHwgbnVsbDtcbiAgZ2V0IHNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIHNldCBzZWxlY3RlZCh2YWx1ZTogVCB8IG51bGwpIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHZhbHVlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RlZHM6IEFycmF5PFQ+ID0gW107XG4gIGdldCBzZWxlY3RlZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkcztcbiAgfVxuXG4gIHNldCBzZWxlY3RlZHModmFsdWVzOiBBcnJheTxUPikge1xuICAgIHRoaXMuX3NlbGVjdGVkcyA9IHZhbHVlcztcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IG9wZW5lZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldCBwaWNrZXJNb2RlKCk6IFBpY2tlck1vZGUge1xuICAgIHJldHVybiAnaW5saW5lJztcbiAgfVxuXG4gIGdldCBpc0luU2luZ2xlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZSc7XG4gIH1cblxuICBnZXQgaXNJblJhbmdlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fCB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VGcm9tJyB8fCB0aGlzLl9zZWxlY3RNb2RlID09PSAncmFuZ2VUbyc7XG4gIH1cblxuICBnZXQgb3dsRFRJbmxpbmVDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb2RlbENoYW5nZTogKHY6IFQgfCBBcnJheTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvKiBub29wICovXG4gIH07XG5cbiAgcHJpdmF0ZSBvbk1vZGVsVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvKiBub29wICovXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgb3ZlcnJpZGUgZGF0ZVRpbWVBZGFwdGVyOiBEYXRlVGltZUFkYXB0ZXI8VD4sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChPV0xfREFURV9USU1FX0ZPUk1BVFMpIHByb3RlY3RlZCBvdmVycmlkZSBkYXRlVGltZUZvcm1hdHM6IE93bERhdGVUaW1lRm9ybWF0c1xuICApIHtcbiAgICBzdXBlcihkYXRlVGltZUFkYXB0ZXIsIGRhdGVUaW1lRm9ybWF0cyk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb250YWluZXIucGlja2VyID0gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0luU2luZ2xlTW9kZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5jb250YWluZXIucGlja2VyTW9tZW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVzID0gdmFsdWU7XG4gICAgICB0aGlzLmNvbnRhaW5lci5waWNrZXJNb21lbnQgPSB0aGlzLl92YWx1ZXNbdGhpcy5jb250YWluZXIuYWN0aXZlU2VsZWN0ZWRJbmRleF07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Nb2RlbENoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gZm47XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0KGRhdGU6IEFycmF5PFQ+IHwgVCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0ZSkpIHtcbiAgICAgIHRoaXMudmFsdWVzID0gWy4uLmRhdGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gZGF0ZTtcbiAgICB9XG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGRhdGUpO1xuICAgIHRoaXMub25Nb2RlbFRvdWNoZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgc2VsZWN0ZWQgeWVhciBpbiBtdWx0aS15ZWFyIHZpZXdcbiAgICogKi9cbiAgcHVibGljIHNlbGVjdFllYXIobm9ybWFsaXplZFllYXI6IFQpOiB2b2lkIHtcbiAgICB0aGlzLnllYXJTZWxlY3RlZC5lbWl0KG5vcm1hbGl6ZWRZZWFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCBtb250aCBpbiB5ZWFyIHZpZXdcbiAgICogKi9cbiAgcHVibGljIHNlbGVjdE1vbnRoKG5vcm1hbGl6ZWRNb250aDogVCk6IHZvaWQge1xuICAgIHRoaXMubW9udGhTZWxlY3RlZC5lbWl0KG5vcm1hbGl6ZWRNb250aCk7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdGhlIHNlbGVjdGVkIGRhdGVcbiAgICogKi9cbiAgcHVibGljIHNlbGVjdERhdGUobm9ybWFsaXplZERhdGU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVTZWxlY3RlZC5lbWl0KG5vcm1hbGl6ZWREYXRlKTtcbiAgfVxufVxuIiwiPG93bC1kYXRlLXRpbWUtY29udGFpbmVyPjwvb3dsLWRhdGUtdGltZS1jb250YWluZXI+XG4iXX0=
463
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waWNrZXIvc3JjL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waWNrZXIvc3JjL2xpYi9kYXRlLXRpbWUvZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBQ2YsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsUUFBUSxFQUEwQixNQUFNLFVBQVUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7O0FBRWxFLE1BQU0sMkJBQTJCLEdBQWE7SUFDNUMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDBCQUEwQixDQUFDO0lBQ3pELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBYzlCLE1BQU0sT0FBTywwQkFBMEI7SUFHNUIsZUFBZSxDQUE2QjtJQUU1QyxXQUFXLENBQTJCO0lBRXRDLGdCQUFnQixDQUFxRDtJQUVyRSxnQkFBZ0IsQ0FBc0U7SUFpRC9GLElBQ1csY0FB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SztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQWFLLEdBQUc7c0JBRGIsS0FBSztnQkFjSyxHQUFHO3NCQURiLEtBQUs7Z0JBV0ssS0FBSztzQkFEZixLQUFLO2dCQWNLLE1BQU07c0JBRGhCLEtBQUs7Z0JBd0JVLFlBQVk7c0JBRDNCLE1BQU07Z0JBUVMsYUFBYTtzQkFENUIsTUFBTTtnQkFPUyxZQUFZO3NCQUQzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPdXRwdXQsXG4gIFByb3ZpZGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZVZpZXcsIFBpY2tlclR5cGUsIFNlbGVjdE1vZGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBEYXRlVGltZUFkYXB0ZXIgfSBmcm9tICcuL2FkYXB0ZXIvZGF0ZS10aW1lLWFkYXB0ZXIuY2xhc3MnO1xuaW1wb3J0IHsgT1dMX0RBVEVfVElNRV9GT1JNQVRTIH0gZnJvbSAnLi9hZGFwdGVyL2RhdGUtdGltZS1mb3JtYXQuY2xhc3MnO1xuaW1wb3J0IHsgT3dsRGF0ZVRpbWVJbnRsIH0gZnJvbSAnLi9kYXRlLXRpbWUtcGlja2VyLWludGwuc2VydmljZSc7XG5cbmNvbnN0IE9XTF9EQVRFVElNRV9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPd2xEYXRlVGltZUlubGluZUNvbXBvbmVudCksXG4gIG11bHRpOiB0cnVlXG59O1xuXG5sZXQgbmV4dFVuaXF1ZUNvbXBvbmVudElkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb3dsLWRhdGUtdGltZS1pbmxpbmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZS10aW1lLWlubGluZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGUtdGltZS1pbmxpbmUuY29tcG9uZW50LnNjc3MnXSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Mub3dsLWR0LWNvbnRhaW5lci1kaXNhYmxlZF0nOiAnZGlzYWJsZWQnLFxuICAgICdjbGFzcyc6ICdvd2wtZHQtaW5saW5lIG93bC1kdC1jb250YWluZXIgb3dsLWR0LWlubGluZS1jb250YWluZXInXG4gIH0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgcHJvdmlkZXJzOiBbT1dMX0RBVEVUSU1FX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBPd2xEYXRlVGltZUlubGluZUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgI2NoYW5nZURldGVjdG9yID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICByZWFkb25seSAjcGlja2VySW50bCA9IGluamVjdChPd2xEYXRlVGltZUludGwpO1xuXG4gIHJlYWRvbmx5ICNkYXRlVGltZUZvcm1hdHMgPSBpbmplY3QoT1dMX0RBVEVfVElNRV9GT1JNQVRTLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5ICNkYXRlVGltZUFkYXB0ZXIgPSBpbmplY3Q8RGF0ZVRpbWVBZGFwdGVyPERhdGU+PihEYXRlVGltZUFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHRpbWVyIGlzIGluIGhvdXIxMiBmb3JtYXRcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgaG91cjEyVGltZXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHZpZXcgdGhhdCB0aGUgY2FsZW5kYXIgc2hvdWxkIHN0YXJ0IGluLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHN0YXJ0VmlldzogRGF0ZVZpZXcgPSBEYXRlVmlldy5NT05USDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG91bGQgb25seSB0aGUgeWVhciBhbmQgbXVsdGkteWVhciB2aWV3cy5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgeWVhck9ubHkgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG91bGQgb25seSB0aGUgbXVsdGkteWVhciB2aWV3LlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBtdWx0aXllYXJPbmx5ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhvdXJzIHRvIGNoYW5nZSBwZXIgc3RlcFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHN0ZXBIb3VyOiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBNaW51dGVzIHRvIGNoYW5nZSBwZXIgc3RlcFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHN0ZXBNaW51dGU6IG51bWJlciA9IDE7XG5cbiAgLyoqXG4gICAqIFNlY29uZHMgdG8gY2hhbmdlIHBlciBzdGVwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc3RlcFNlY29uZDogbnVtYmVyID0gMTtcblxuICAvKipcbiAgICogU2V0IHRoZSBmaXJzdCBkYXkgb2Ygd2Vlay5cbiAgICogSGFzIHRvIGJlIGEgbnVtYmVyIGJldHdlZW4gMCAoU3VuZGF5KSBhbmQgNiAoU2F0dXJkYXkpXG4gICAqL1xuICBwcml2YXRlIF9maXJzdERheU9mV2VlazogbnVtYmVyO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGZpcnN0RGF5T2ZXZWVrKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0RGF5T2ZXZWVrO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlyc3REYXlPZldlZWsodmFsdWU6IG51bWJlcikge1xuICAgIHZhbHVlID0gbnVtYmVyQXR0cmlidXRlKHZhbHVlLCB1bmRlZmluZWQpO1xuICAgIGlmICh2YWx1ZSA+IDYgfHwgdmFsdWUgPCAwKSB7XG4gICAgICB0aGlzLl9maXJzdERheU9mV2VlayA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZmlyc3REYXlPZldlZWsgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBoaWRlIGRhdGVzIGluIG90aGVyIG1vbnRocyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBjdXJyZW50IG1vbnRoLlxuICAgKi9cblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcHVibGljIGhpZGVPdGhlck1vbnRoczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBnZXQgZm9ybWF0T3B0aW9ucygpOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyB7XG4gICAgaWYgKHRoaXMucGlja2VyVHlwZSA9PT0gJ2JvdGgnKSB7XG4gICAgICByZXR1cm4gdGhpcy4jZGF0ZVRpbWVGb3JtYXRzLmZ1bGxQaWNrZXJJbnB1dDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waWNrZXJUeXBlID09PSAnY2FsZW5kYXInKSB7XG4gICAgICByZXR1cm4gdGhpcy4jZGF0ZVRpbWVGb3JtYXRzLmRhdGVQaWNrZXJJbnB1dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGF0ZVRpbWVGb3JtYXRzLnRpbWVQaWNrZXJJbnB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIFRpbWUgQ2hlY2tlciB0byBjaGVjayBpZiB0aGUgZ2l2ZSBkYXRlVGltZSBpcyBzZWxlY3RhYmxlXG4gICAqL1xuICBwdWJsaWMgZGF0ZVRpbWVDaGVja2VyID0gKGRhdGVUaW1lOiBEYXRlKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZGF0ZVRpbWUgJiZcbiAgICAgICghdGhpcy5kYXRlVGltZUZpbHRlciB8fCB0aGlzLmRhdGVUaW1lRmlsdGVyKGRhdGVUaW1lKSkgJiZcbiAgICAgICghdGhpcy5taW4gfHwgdGhpcy4jZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmUoZGF0ZVRpbWUsIHRoaXMubWluKSA+PSAwKSAmJlxuICAgICAgKCF0aGlzLm1heCB8fCB0aGlzLiNkYXRlVGltZUFkYXB0ZXIuY29tcGFyZShkYXRlVGltZSwgdGhpcy5tYXgpIDw9IDApXG4gICAgKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgZ2V0VmFsaWREYXRlKG9iajogdW5rbm93bik6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy4jZGF0ZVRpbWVBZGFwdGVyLmlzRGF0ZUluc3RhbmNlKG9iaikgJiYgdGhpcy4jZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQob2JqKSA/IG9iaiA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB7QGxpbmsgUGlja2VyVHlwZX0gb2YgdGhlIGRhdGVUaW1lIHBpY2tlclxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHBpY2tlclR5cGU6IFBpY2tlclR5cGUgPSAnYm90aCc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpY2tlciBpcyBkaXNhYmxlZCBvciBub3RcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBzZWNvbmQncyB0aW1lclxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBzaG93U2Vjb25kc1RpbWVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoaWNoIHNlbGVjdCBtb2RlIHRvIHVzZTpcbiAgICogLSAnc2luZ2xlJ1xuICAgKiAtICdyYW5nZSdcbiAgICogLSAncmFuZ2VGcm9tJ1xuICAgKiAtICdyYW5nZVRvJ1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNlbGVjdE1vZGU6IFNlbGVjdE1vZGUgPSAnc2luZ2xlJztcblxuICAvKipcbiAgICogVGhlIGRhdGUgdG8gb3BlbiB0aGUgY2FsZW5kYXIgdG8gaW5pdGlhbGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBfc3RhcnRBdDogRGF0ZSB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgc3RhcnRBdCgpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0QXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGFydEF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCBudWxsO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2UnIHx8IHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc1swXSB8fCBudWxsO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2VUbycpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc1sxXSB8fCBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldCBzdGFydEF0KGRhdGU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy5fc3RhcnRBdCA9IHRoaXMuZ2V0VmFsaWREYXRlKHRoaXMuI2RhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZShkYXRlKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRhdGUgdG8gb3BlbiBmb3IgcmFuZ2UgY2FsZW5kYXIuXG4gICAqL1xuICBwcml2YXRlIF9lbmRBdDogRGF0ZSB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgZW5kQXQoKTogRGF0ZSB8IG51bGwge1xuICAgIGlmICh0aGlzLl9lbmRBdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VuZEF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdE1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCBudWxsO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2UnIHx8IHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlRnJvbScpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc1sxXSB8fCBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldCBlbmRBdChkYXRlOiBEYXRlIHwgbnVsbCkge1xuICAgIHRoaXMuX2VuZEF0ID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy4jZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKGRhdGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGRhdGVUaW1lRmlsdGVyYCBpbnN0ZWFkIVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIG93bERhdGVUaW1lRmlsdGVyOiAoKGRhdGU6IERhdGUgfCBudWxsKSA9PiBib29sZWFuKSB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkYXRlVGltZUZpbHRlcjogKChkYXRlOiBEYXRlIHwgbnVsbCkgPT4gYm9vbGVhbikgfCBudWxsID0gbnVsbDtcblxuICAvLyBUT0RPOiByZW1vdmUgdGhpcyBnZXR0ZXIgd2hlbiBgb3dsRGF0ZVRpbWVGaWx0ZXJgIGlzIHJlbW92ZWRcbiAgcHJvdGVjdGVkIGdldCBkYXRlVGltZUZpbHRlckdldHRlcigpOiAoKGRhdGU6IERhdGUgfCBudWxsKSA9PiBib29sZWFuKSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRmlsdGVyIHx8IHRoaXMub3dsRGF0ZVRpbWVGaWx0ZXI7XG4gIH1cblxuICBwcml2YXRlIF9taW46IERhdGUgfCBudWxsO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbWluKCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWluIHx8IG51bGw7XG4gIH1cbiAgcHVibGljIHNldCBtaW4odmFsdWU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy5fbWluID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy4jZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF9tYXg6IERhdGUgfCBudWxsO1xuICAvKipcbiAgICogVGhlIG1heGltdW0gdmFsaWQgZGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbWF4KCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4IHx8IG51bGw7XG4gIH1cbiAgcHVibGljIHNldCBtYXgodmFsdWU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy5fbWF4ID0gdGhpcy5nZXRWYWxpZERhdGUodGhpcy4jZGF0ZVRpbWVBZGFwdGVyLmRlc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIF92YWx1ZTogRGF0ZSB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogRGF0ZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IERhdGUgfCBudWxsKSB7XG4gICAgdmFsdWUgPSB0aGlzLiNkYXRlVGltZUFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgIHZhbHVlID0gdGhpcy5nZXRWYWxpZERhdGUodmFsdWUpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zZWxlY3RlZCA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmFsdWVzOiBBcnJheTxEYXRlPiA9IFtdO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IHZhbHVlcygpOiBBcnJheTxEYXRlPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZXModmFsdWVzOiBBcnJheTxEYXRlPikge1xuICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoKHYpID0+IHtcbiAgICAgICAgdiA9IHRoaXMuI2RhdGVUaW1lQWRhcHRlci5kZXNlcmlhbGl6ZSh2KTtcbiAgICAgICAgdiA9IHRoaXMuZ2V0VmFsaWREYXRlKHYpO1xuICAgICAgICByZXR1cm4gdiA/IHRoaXMuI2RhdGVUaW1lQWRhcHRlci5jbG9uZSh2KSA6IG51bGw7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3ZhbHVlcyA9IFsuLi52YWx1ZXNdO1xuICAgICAgdGhpcy5zZWxlY3RlZHMgPSBbLi4udmFsdWVzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICB0aGlzLnNlbGVjdGVkcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCB5ZWFyIGluIG11bHRpLXllYXIgdmlld1xuICAgKiBUaGlzIGRvZXNuJ3QgaW1wbHkgYSBjaGFuZ2Ugb24gdGhlIHNlbGVjdGVkIGRhdGUuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IHllYXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgbW9udGggaW4geWVhciB2aWV3XG4gICAqIFRoaXMgZG9lc24ndCBpbXBseSBhIGNoYW5nZSBvbiB0aGUgc2VsZWN0ZWQgZGF0ZS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgbW9udGhTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgc2VsZWN0ZWQgZGF0ZVxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBkYXRlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgcHJvdGVjdGVkIGFjdGl2ZVNlbGVjdGVkSW5kZXggPSAwOyAvLyBUaGUgY3VycmVudCBhY3RpdmUgU2VsZWN0ZWRJbmRleCBpbiByYW5nZSBzZWxlY3QgbW9kZSAoMDogJ2Zyb20nLCAxOiAndG8nKVxuXG4gIHByaXZhdGUgX3NlbGVjdGVkOiBEYXRlIHwgbnVsbDtcbiAgcHJvdGVjdGVkIGdldCBzZWxlY3RlZCgpOiBEYXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgc2VsZWN0ZWQodmFsdWU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGVkczogQXJyYXk8RGF0ZT4gPSBbXTtcbiAgcHJvdGVjdGVkIGdldCBzZWxlY3RlZHMoKTogQXJyYXk8RGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZHM7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0IHNlbGVjdGVkcyh2YWx1ZXM6IEFycmF5PERhdGU+KSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRzID0gdmFsdWVzO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcGlja2VyIGlzIGluIHNpbmdsZSBtb2RlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzSW5TaW5nbGVNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdE1vZGUgPT09ICdzaW5nbGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgcGlja2VyIGlzIGluIHJhbmdlIG1vZGUgKHJhbmdlLCByYW5nZUZyb20sIHJhbmdlVG8pXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGlzSW5SYW5nZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlJyB8fCB0aGlzLnNlbGVjdE1vZGUgPT09ICdyYW5nZUZyb20nIHx8IHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3JhbmdlVG8nO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByYW5nZSAnZnJvbScgbGFiZWxcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZnJvbUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI3BpY2tlckludGwucmFuZ2VGcm9tTGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJhbmdlICd0bycgbGFiZWxcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdG9MYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNwaWNrZXJJbnRsLnJhbmdlVG9MYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmFuZ2UgJ2Zyb20nIGZvcm1hdHRlZCB2YWx1ZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBmcm9tRm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRzWzBdO1xuICAgIHJldHVybiB2YWx1ZSA/IHRoaXMuI2RhdGVUaW1lQWRhcHRlci5mb3JtYXQodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykgOiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmFuZ2UgJ3RvJyBmb3JtYXR0ZWQgdmFsdWVcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdG9Gb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3RlZHNbMV07XG4gICAgcmV0dXJuIHZhbHVlID8gdGhpcy4jZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdCh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk1vZGVsQ2hhbmdlOiAodjogRGF0ZSB8IEFycmF5PERhdGU+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8qIG5vb3AgKi9cbiAgfTtcblxuICBwcml2YXRlIG9uTW9kZWxUb3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8qIG5vb3AgKi9cbiAgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXRoaXMuI2RhdGVUaW1lQWRhcHRlcikge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBPd2xEYXRlVGltZVBpY2tlcjogTm8gcHJvdmlkZXIgZm91bmQgZm9yIERhdGVUaW1lQWRhcHRlci4gWW91IG11c3QgaW1wb3J0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGAgK1xuICAgICAgICAgIGBtb2R1bGVzIGF0IHlvdXIgYXBwbGljYXRpb24gcm9vdDogT3dsTmF0aXZlRGF0ZVRpbWVNb2R1bGUsIE93bE1vbWVudERhdGVUaW1lTW9kdWxlLCBvciBwcm92aWRlIGEgYCArXG4gICAgICAgICAgYGN1c3RvbSBpbXBsZW1lbnRhdGlvbi5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy4jZGF0ZVRpbWVGb3JtYXRzKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYE93bERhdGVUaW1lUGlja2VyOiBObyBwcm92aWRlciBmb3VuZCBmb3IgT1dMX0RBVEVfVElNRV9GT1JNQVRTLiBZb3UgbXVzdCBpbXBvcnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgYCArXG4gICAgICAgICAgYG1vZHVsZXMgYXQgeW91ciBhcHBsaWNhdGlvbiByb290OiBPd2xOYXRpdmVEYXRlVGltZU1vZHVsZSwgT3dsTW9tZW50RGF0ZVRpbWVNb2R1bGUsIG9yIHByb3ZpZGUgYSBgICtcbiAgICAgICAgICBgY3VzdG9tIGltcGxlbWVudGF0aW9uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5pZCA9IGBvd2wtZHQtcGlja2VyLSR7bmV4dFVuaXF1ZUNvbXBvbmVudElkKyt9YDtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNJblNpbmdsZU1vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZTtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnNlbGVjdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHNlY29uZCBzZWxlY3RlZCBkYXRlIGlzIGJlZm9yZSB0aGUgZmlyc3Qgc2VsZWN0ZWQgZGF0ZVxuICAgICAgLy8gSW4gdGhpcyBjYXNlIFwiZ28gYmFja1wiIGFuZCB0cmVhdCB0aGUgdmFsdWUgYXMgdGhlIGZpcnN0IHNlbGVjdGVkIGRhdGVcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDEpIHtcbiAgICAgICAgaWYgKHZhbHVlLmdldFRpbWUoKSA8IHRoaXMuc2VsZWN0ZWRzWzBdLmdldFRpbWUoKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBjb3JyZWN0IHZhbHVlIGFjY29yZGluZyB0byB0aGUgYWN0aXZlIHNlbGVjdGVkIGluZGV4XG4gICAgICBpZiAodGhpcy5hY3RpdmVTZWxlY3RlZEluZGV4ID09PSAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRzID0gW3ZhbHVlLCBudWxsXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRzWzFdID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgdmFsdWVzIHRvIHRoZSBzZWxlY3RlZHNcbiAgICAgIHRoaXMudmFsdWVzID0gWy4uLnRoaXMuc2VsZWN0ZWRzXTtcbiAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9ICh0aGlzLmFjdGl2ZVNlbGVjdGVkSW5kZXggKyAxKSAlIDI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2OiBEYXRlIHwgQXJyYXk8RGF0ZT4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Nb2RlbFRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3QoZGF0ZTogQXJyYXk8RGF0ZT4gfCBEYXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRlKSkge1xuICAgICAgdGhpcy52YWx1ZXMgPSBbLi4uZGF0ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSBkYXRlO1xuICAgIH1cbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UoZGF0ZSk7XG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzZWxlY3RlZCB5ZWFyIGluIG11bHRpLXllYXIgdmlld1xuICAgKi9cbiAgcHVibGljIHNlbGVjdFllYXIobm9ybWFsaXplZFllYXI6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnllYXJTZWxlY3RlZC5lbWl0KG5vcm1hbGl6ZWRZZWFyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBzZWxlY3RlZCBtb250aCBpbiB5ZWFyIHZpZXdcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RNb250aChub3JtYWxpemVkTW9udGg6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLndyaXRlVmFsdWUobm9ybWFsaXplZE1vbnRoKTtcbiAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkTW9udGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBzZWxlY3RlZCBkYXRlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0RGF0ZShub3JtYWxpemVkRGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVWYWx1ZShub3JtYWxpemVkRGF0ZSk7XG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQuZW1pdChub3JtYWxpemVkRGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIFwic2VsZWN0ZWRcIiBpbmRleCBpbiByYW5nZSBtb2RlLlxuICAgKiAtIDAgZm9yICdmcm9tJ1xuICAgKiAtIDEgZm9yICd0bydcbiAgICovXG4gIHByb3RlY3RlZCBzZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAncmFuZ2UnICYmIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuXG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRzW3RoaXMuYWN0aXZlU2VsZWN0ZWRJbmRleF07XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZHMgJiYgc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuI2RhdGVUaW1lQWRhcHRlci5jbG9uZShzZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2sgb24gaW5mb3JtIHJhZGlvIGdyb3VwXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlS2V5ZG93bk9uSW5mb0dyb3VwKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBuZXh0OiBIVE1MRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgLy8gTmF2aWdhdGUgYmV0d2VlbiB0aGUgcmFkaW8gZ3JvdXAgb3B0aW9ucyB3aXRoIGFycm93IGtleXNcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgbmV4dC5mb2N1cygpO1xuICAgICAgICB0aGlzLnNldEFjdGl2ZVNlbGVjdGVkSW5kZXgoaW5kZXggPT09IDAgPyAxIDogMCk7XG4gICAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gU2VsZWN0IHRoZSBhY3RpdmUgc2VsZWN0ZWQgaW5kZXggd2hlbiBzcGFjZSBpcyBwcmVzc2VkXG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVTZWxlY3RlZEluZGV4KGluZGV4KTtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib3dsLWR0LWNvbnRhaW5lci1pbm5lclwiPlxuICBAaWYgKHBpY2tlclR5cGUgPT09ICdib3RoJyB8fCBwaWNrZXJUeXBlID09PSAnY2FsZW5kYXInKSB7XG4gICAgPG93bC1kYXRlLXRpbWUtY2FsZW5kYXJcbiAgICAgIFtkYXRlRmlsdGVyXT1cImRhdGVUaW1lRmlsdGVyR2V0dGVyXCJcbiAgICAgIFtmaXJzdERheU9mV2Vla109XCJmaXJzdERheU9mV2Vla1wiXG4gICAgICBbaGlkZU90aGVyTW9udGhzXT1cImhpZGVPdGhlck1vbnRoc1wiXG4gICAgICBbbWF4RGF0ZV09XCJtYXhcIlxuICAgICAgW21pbkRhdGVdPVwibWluXCJcbiAgICAgIFttdWx0aXllYXJPbmx5XT1cIm11bHRpeWVhck9ubHlcIlxuICAgICAgW3NlbGVjdE1vZGVdPVwic2VsZWN0TW9kZVwiXG4gICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIlxuICAgICAgW3NlbGVjdGVkc109XCJzZWxlY3RlZHNcIlxuICAgICAgW3N0YXJ0Vmlld109XCJzdGFydFZpZXdcIlxuICAgICAgW3llYXJPbmx5XT1cInllYXJPbmx5XCJcbiAgICAgIFsocGlja2VyTW9tZW50KV09XCJ2YWx1ZVwiXG4gICAgICAoZGF0ZUNsaWNrZWQpPVwic2VsZWN0RGF0ZSgkZXZlbnQpXCJcbiAgICAgIChtb250aFNlbGVjdGVkKT1cInNlbGVjdE1vbnRoKCRldmVudClcIlxuICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cInNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICh5ZWFyU2VsZWN0ZWQpPVwic2VsZWN0WWVhcigkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwib3dsLWR0LWNvbnRhaW5lci1yb3dcIj5cbiAgICA8L293bC1kYXRlLXRpbWUtY2FsZW5kYXI+XG4gIH1cblxuICBAaWYgKHBpY2tlclR5cGUgPT09ICdib3RoJyB8fCBwaWNrZXJUeXBlID09PSAndGltZXInKSB7XG4gICAgPG93bC1kYXRlLXRpbWUtdGltZXJcbiAgICAgIFtob3VyMTJUaW1lcl09XCJob3VyMTJUaW1lclwiXG4gICAgICBbbWF4RGF0ZVRpbWVdPVwibWF4XCJcbiAgICAgIFttaW5EYXRlVGltZV09XCJtaW5cIlxuICAgICAgW3BpY2tlck1vbWVudF09XCJ2YWx1ZVwiXG4gICAgICBbc2hvd1NlY29uZHNUaW1lcl09XCJzaG93U2Vjb25kc1RpbWVyXCJcbiAgICAgIFtzdGVwSG91cl09XCJzdGVwSG91clwiXG4gICAgICBbc3RlcE1pbnV0ZV09XCJzdGVwTWludXRlXCJcbiAgICAgIFtzdGVwU2Vjb25kXT1cInN0ZXBTZWNvbmRcIlxuICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cInNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwib3dsLWR0LWNvbnRhaW5lci1yb3dcIj5cbiAgICA8L293bC1kYXRlLXRpbWUtdGltZXI+XG4gIH1cblxuICBAaWYgKGlzSW5SYW5nZU1vZGUpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cIm93bC1kdC1jb250YWluZXItaW5mbyBvd2wtZHQtY29udGFpbmVyLXJvd1wiXG4gICAgICByb2xlPVwicmFkaW9ncm91cFwiPlxuICAgICAgPGRpdlxuICAgICAgICAjZnJvbVxuICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMFwiXG4gICAgICAgIFtjbGFzcy5vd2wtZHQtY29udGFpbmVyLWluZm8tYWN0aXZlXT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDBcIlxuICAgICAgICBbdGFiaW5kZXhdPVwiYWN0aXZlU2VsZWN0ZWRJbmRleCA9PT0gMCA/IDAgOiAtMVwiXG4gICAgICAgIChjbGljayk9XCJzZXRBY3RpdmVTZWxlY3RlZEluZGV4KDApXCJcbiAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5ZG93bk9uSW5mb0dyb3VwKCRldmVudCwgdG8sIDApXCJcbiAgICAgICAgY2xhc3M9XCJvd2wtZHQtY29udHJvbCBvd2wtZHQtY29udGFpbmVyLXJhbmdlIG93bC1kdC1jb250YWluZXItZnJvbVwiXG4gICAgICAgIHJvbGU9XCJyYWRpb1wiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwib3dsLWR0LWNvbnRyb2wtY29udGVudCBvd2wtZHQtY29udGFpbmVyLXJhbmdlLWNvbnRlbnRcIlxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm93bC1kdC1jb250YWluZXItaW5mby1sYWJlbFwiPnt7IGZyb21MYWJlbCB9fTo8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJvd2wtZHQtY29udGFpbmVyLWluZm8tdmFsdWVcIj57eyBmcm9tRm9ybWF0dGVkVmFsdWUgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAjdG9cbiAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDFcIlxuICAgICAgICBbY2xhc3Mub3dsLWR0LWNvbnRhaW5lci1pbmZvLWFjdGl2ZV09XCJhY3RpdmVTZWxlY3RlZEluZGV4ID09PSAxXCJcbiAgICAgICAgW3RhYmluZGV4XT1cImFjdGl2ZVNlbGVjdGVkSW5kZXggPT09IDEgPyAwIDogLTFcIlxuICAgICAgICAoY2xpY2spPVwic2V0QWN0aXZlU2VsZWN0ZWRJbmRleCgxKVwiXG4gICAgICAgIChrZXlkb3duKT1cImhhbmRsZUtleWRvd25PbkluZm9Hcm91cCgkZXZlbnQsIGZyb20sIDEpXCJcbiAgICAgICAgY2xhc3M9XCJvd2wtZHQtY29udHJvbCBvd2wtZHQtY29udGFpbmVyLXJhbmdlIG93bC1kdC1jb250YWluZXItdG9cIlxuICAgICAgICByb2xlPVwicmFkaW9cIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cIm93bC1kdC1jb250cm9sLWNvbnRlbnQgb3dsLWR0LWNvbnRhaW5lci1yYW5nZS1jb250ZW50XCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJvd2wtZHQtY29udGFpbmVyLWluZm8tbGFiZWxcIj57eyB0b0xhYmVsIH19Ojwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm93bC1kdC1jb250YWluZXItaW5mby12YWx1ZVwiPnt7IHRvRm9ybWF0dGVkVmFsdWUgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==