@skyux/datetime 8.6.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 (96) hide show
  1. package/documentation.json +8 -8
  2. package/esm2022/lib/modules/date-pipe/date-format-utility.mjs +45 -0
  3. package/{esm2020 → esm2022}/lib/modules/date-pipe/date-pipe.module.mjs +5 -5
  4. package/esm2022/lib/modules/date-pipe/date.pipe.mjs +67 -0
  5. package/esm2022/lib/modules/date-pipe/fuzzy-date.pipe.mjs +47 -0
  6. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker-end-date-resource-key.pipe.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker-start-date-resource-key.pipe.mjs +4 -4
  8. package/esm2022/lib/modules/date-range-picker/date-range-picker.component.mjs +518 -0
  9. package/{esm2020 → esm2022}/lib/modules/date-range-picker/date-range-picker.module.mjs +19 -19
  10. package/esm2022/lib/modules/date-range-picker/date-range.service.mjs +97 -0
  11. package/esm2022/lib/modules/date-range-picker/types/date-range-calculator.mjs +54 -0
  12. package/esm2022/lib/modules/datepicker/date-formatter.mjs +38 -0
  13. package/esm2022/lib/modules/datepicker/datepicker-adapter.service.mjs +23 -0
  14. package/esm2022/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +332 -0
  15. package/esm2022/lib/modules/datepicker/datepicker-calendar.component.mjs +95 -0
  16. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-config.service.mjs +4 -4
  17. package/esm2022/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +487 -0
  18. package/esm2022/lib/modules/datepicker/datepicker-input.directive.mjs +534 -0
  19. package/esm2022/lib/modules/datepicker/datepicker.component.mjs +327 -0
  20. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker.module.mjs +35 -35
  21. package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker.service.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/modules/datepicker/daypicker-button.component.mjs +4 -4
  23. package/esm2022/lib/modules/datepicker/daypicker-cell.component.mjs +128 -0
  24. package/esm2022/lib/modules/datepicker/daypicker.component.mjs +224 -0
  25. package/esm2022/lib/modules/datepicker/fuzzy-date.service.mjs +412 -0
  26. package/esm2022/lib/modules/datepicker/monthpicker.component.mjs +80 -0
  27. package/{esm2020 → esm2022}/lib/modules/datepicker/yearpicker.component.mjs +53 -54
  28. package/{esm2020 → esm2022}/lib/modules/shared/sky-datetime-resources.module.mjs +11 -11
  29. package/esm2022/lib/modules/timepicker/timepicker.component.mjs +396 -0
  30. package/esm2022/lib/modules/timepicker/timepicker.directive.mjs +237 -0
  31. package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker.module.mjs +17 -17
  32. package/esm2022/testing/datepicker-fixture.mjs +55 -0
  33. package/esm2022/testing/timepicker-fixture.mjs +52 -0
  34. package/fesm2022/skyux-datetime-testing.mjs +112 -0
  35. package/{fesm2020 → fesm2022}/skyux-datetime-testing.mjs.map +1 -1
  36. package/fesm2022/skyux-datetime.mjs +5030 -0
  37. package/fesm2022/skyux-datetime.mjs.map +1 -0
  38. package/lib/modules/date-range-picker/date-range-picker.component.d.ts +1 -1
  39. package/lib/modules/datepicker/datepicker-calendar-inner.component.d.ts +1 -1
  40. package/lib/modules/datepicker/datepicker-calendar.component.d.ts +1 -1
  41. package/lib/modules/datepicker/datepicker-input-fuzzy.directive.d.ts +1 -1
  42. package/lib/modules/datepicker/datepicker-input.directive.d.ts +1 -1
  43. package/lib/modules/datepicker/datepicker.component.d.ts +1 -1
  44. package/lib/modules/datepicker/daypicker-button.component.d.ts +1 -1
  45. package/lib/modules/datepicker/daypicker-cell.component.d.ts +1 -1
  46. package/lib/modules/datepicker/daypicker.component.d.ts +1 -1
  47. package/lib/modules/timepicker/timepicker.directive.d.ts +1 -1
  48. package/package.json +19 -27
  49. package/esm2020/lib/modules/date-pipe/date-format-utility.mjs +0 -45
  50. package/esm2020/lib/modules/date-pipe/date.pipe.mjs +0 -70
  51. package/esm2020/lib/modules/date-pipe/fuzzy-date.pipe.mjs +0 -50
  52. package/esm2020/lib/modules/date-range-picker/date-range-picker.component.mjs +0 -494
  53. package/esm2020/lib/modules/date-range-picker/date-range.service.mjs +0 -100
  54. package/esm2020/lib/modules/date-range-picker/types/date-range-calculator.mjs +0 -53
  55. package/esm2020/lib/modules/datepicker/date-formatter.mjs +0 -38
  56. package/esm2020/lib/modules/datepicker/datepicker-adapter.service.mjs +0 -26
  57. package/esm2020/lib/modules/datepicker/datepicker-calendar-inner.component.mjs +0 -333
  58. package/esm2020/lib/modules/datepicker/datepicker-calendar.component.mjs +0 -96
  59. package/esm2020/lib/modules/datepicker/datepicker-input-fuzzy.directive.mjs +0 -462
  60. package/esm2020/lib/modules/datepicker/datepicker-input.directive.mjs +0 -496
  61. package/esm2020/lib/modules/datepicker/datepicker.component.mjs +0 -319
  62. package/esm2020/lib/modules/datepicker/daypicker-cell.component.mjs +0 -126
  63. package/esm2020/lib/modules/datepicker/daypicker.component.mjs +0 -216
  64. package/esm2020/lib/modules/datepicker/fuzzy-date.service.mjs +0 -392
  65. package/esm2020/lib/modules/datepicker/monthpicker.component.mjs +0 -81
  66. package/esm2020/lib/modules/timepicker/timepicker.component.mjs +0 -389
  67. package/esm2020/lib/modules/timepicker/timepicker.directive.mjs +0 -236
  68. package/esm2020/testing/datepicker-fixture.mjs +0 -58
  69. package/esm2020/testing/timepicker-fixture.mjs +0 -55
  70. package/fesm2015/skyux-datetime-testing.mjs +0 -117
  71. package/fesm2015/skyux-datetime-testing.mjs.map +0 -1
  72. package/fesm2015/skyux-datetime.mjs +0 -4925
  73. package/fesm2015/skyux-datetime.mjs.map +0 -1
  74. package/fesm2020/skyux-datetime-testing.mjs +0 -117
  75. package/fesm2020/skyux-datetime.mjs +0 -4895
  76. package/fesm2020/skyux-datetime.mjs.map +0 -1
  77. /package/{esm2020 → esm2022}/index.mjs +0 -0
  78. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculation.mjs +0 -0
  79. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-config.mjs +0 -0
  80. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.mjs +0 -0
  81. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-id.mjs +0 -0
  82. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-type.mjs +0 -0
  83. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-calculator-validate-function.mjs +0 -0
  84. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-default-calculator-config.mjs +0 -0
  85. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-default-calculator-configs.mjs +0 -0
  86. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range-relative-value.mjs +0 -0
  87. /package/{esm2020 → esm2022}/lib/modules/date-range-picker/types/date-range.mjs +0 -0
  88. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-calendar-change.mjs +0 -0
  89. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-custom-date.mjs +0 -0
  90. /package/{esm2020 → esm2022}/lib/modules/datepicker/datepicker-date.mjs +0 -0
  91. /package/{esm2020 → esm2022}/lib/modules/datepicker/fuzzy-date.mjs +0 -0
  92. /package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker-time-format-type.mjs +0 -0
  93. /package/{esm2020 → esm2022}/lib/modules/timepicker/timepicker-time-output.mjs +0 -0
  94. /package/{esm2020 → esm2022}/skyux-datetime.mjs +0 -0
  95. /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
  96. /package/{esm2020 → esm2022}/testing/skyux-datetime-testing.mjs +0 -0
@@ -1,496 +0,0 @@
1
- var _SkyDatepickerInputDirective_instances, _SkyDatepickerInputDirective_value_get, _SkyDatepickerInputDirective_value_set, _SkyDatepickerInputDirective_control, _SkyDatepickerInputDirective_dateFormatter, _SkyDatepickerInputDirective_initialPlaceholder, _SkyDatepickerInputDirective_preferredShortDateFormat, _SkyDatepickerInputDirective_ngUnsubscribe, _SkyDatepickerInputDirective__dateFormat, _SkyDatepickerInputDirective__disabled, _SkyDatepickerInputDirective__maxDate, _SkyDatepickerInputDirective__minDate, _SkyDatepickerInputDirective__startingDay, _SkyDatepickerInputDirective__strict, _SkyDatepickerInputDirective__value, _SkyDatepickerInputDirective_adapter, _SkyDatepickerInputDirective_changeDetector, _SkyDatepickerInputDirective_configService, _SkyDatepickerInputDirective_elementRef, _SkyDatepickerInputDirective_localeProvider, _SkyDatepickerInputDirective_renderer, _SkyDatepickerInputDirective_resourcesService, _SkyDatepickerInputDirective_datepickerComponent, _SkyDatepickerInputDirective_applyDateFormat, _SkyDatepickerInputDirective_onValueChange, _SkyDatepickerInputDirective_setInputElementValue, _SkyDatepickerInputDirective_getDateValue, _SkyDatepickerInputDirective_getShortcutOrDateValue, _SkyDatepickerInputDirective_isDateStringValid, _SkyDatepickerInputDirective_onChange, _SkyDatepickerInputDirective_onTouched, _SkyDatepickerInputDirective_onValidatorChange, _SkyDatepickerInputDirective_updatePlaceholder, _SkyDatepickerInputDirective_updateValue;
2
- import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
3
- import { Directive, HostListener, Input, Optional, forwardRef, } from '@angular/core';
4
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
5
- import moment from 'moment';
6
- import { Subject } from 'rxjs';
7
- import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
8
- import { SkyDateFormatter } from './date-formatter';
9
- import { SkyDatepickerAdapterService } from './datepicker-adapter.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./datepicker-adapter.service";
12
- import * as i2 from "./datepicker-config.service";
13
- import * as i3 from "@skyux/i18n";
14
- import * as i4 from "./datepicker.component";
15
- const SKY_DATEPICKER_VALUE_ACCESSOR = {
16
- provide: NG_VALUE_ACCESSOR,
17
- useExisting: forwardRef(() => SkyDatepickerInputDirective),
18
- multi: true,
19
- };
20
- const SKY_DATEPICKER_VALIDATOR = {
21
- provide: NG_VALIDATORS,
22
- useExisting: forwardRef(() => SkyDatepickerInputDirective),
23
- multi: true,
24
- };
25
- export class SkyDatepickerInputDirective {
26
- /**
27
- * The date format for the input. Place this attribute on the `input` element
28
- * to override the default in the `SkyDatepickerConfigService`.
29
- * @default "MM/DD/YYYY"
30
- */
31
- set dateFormat(value) {
32
- /* istanbul ignore else */
33
- if (value !== __classPrivateFieldGet(this, _SkyDatepickerInputDirective__dateFormat, "f")) {
34
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__dateFormat, value, "f");
35
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_applyDateFormat).call(this);
36
- }
37
- }
38
- // TODO: Refactor to not have getter logic
39
- get dateFormat() {
40
- return (__classPrivateFieldGet(this, _SkyDatepickerInputDirective__dateFormat, "f") ||
41
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_configService, "f").dateFormat ||
42
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_preferredShortDateFormat, "f"));
43
- }
44
- /**
45
- * Whether to disable the datepicker 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.
46
- * To set the disabled state on reactive forms, use the `FormControl` instead.
47
- * @default false
48
- */
49
- set disabled(value) {
50
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__disabled, value || false, "f");
51
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_datepickerComponent, "f").disabled = value;
52
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_renderer, "f").setProperty(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_elementRef, "f").nativeElement, 'disabled', value);
53
- }
54
- get disabled() {
55
- return __classPrivateFieldGet(this, _SkyDatepickerInputDirective__disabled, "f");
56
- }
57
- /**
58
- * The latest date that is available in the calendar. Place this attribute on
59
- * the `input` element to override the default in `SkyDatepickerConfigService`.
60
- */
61
- set maxDate(value) {
62
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__maxDate, value, "f");
63
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_datepickerComponent, "f").maxDate = this.maxDate;
64
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_onValidatorChange, "f").call(this);
65
- }
66
- // TODO: Refactor to not have getter logic
67
- get maxDate() {
68
- return __classPrivateFieldGet(this, _SkyDatepickerInputDirective__maxDate, "f") || __classPrivateFieldGet(this, _SkyDatepickerInputDirective_configService, "f").maxDate;
69
- }
70
- /**
71
- * The earliest date that is available in the calendar. Place this attribute on
72
- * the `input` element to override the default in `SkyDatepickerConfigService`. To avoid validation errors, the time associated with the minimum date must be midnight. This is necessary because the datepicker automatically sets the time on the `Date` object for selected dates to midnight in the current user's time zone.
73
- */
74
- set minDate(value) {
75
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__minDate, value, "f");
76
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_datepickerComponent, "f").minDate = this.minDate;
77
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_onValidatorChange, "f").call(this);
78
- }
79
- // TODO: Refactor to not have getter logic
80
- get minDate() {
81
- return __classPrivateFieldGet(this, _SkyDatepickerInputDirective__minDate, "f") || __classPrivateFieldGet(this, _SkyDatepickerInputDirective_configService, "f").minDate;
82
- }
83
- /**
84
- * Creates the datepicker input and calendar. Place this directive on an `input` element,
85
- * and wrap the input in a `sky-datepicker` component. The value that users select is driven
86
- * through the `ngModel` attribute specified on the `input` element.
87
- * @required
88
- */
89
- set skyDatepickerInput(value) {
90
- if (value) {
91
- console.warn('[Deprecation warning] You no longer need to provide a template reference variable ' +
92
- 'to the `skyDatepickerInput` attribute (this will be a breaking change in the next ' +
93
- 'major version release).\n' +
94
- 'Do this instead:\n' +
95
- '<sky-datepicker>\n <input skyDatepickerInput />\n</sky-datepicker>');
96
- }
97
- }
98
- /**
99
- * The starting day of the week in the calendar, where `0` sets the starting day
100
- * to Sunday. Place this attribute on the `input` element to override the default
101
- * in `SkyDatepickerConfigService`.
102
- * @default 0
103
- */
104
- set startingDay(value) {
105
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__startingDay, value, "f");
106
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_datepickerComponent, "f").startingDay = this.startingDay;
107
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_onValidatorChange, "f").call(this);
108
- }
109
- // TODO: Refactor to not have getter logic
110
- get startingDay() {
111
- return __classPrivateFieldGet(this, _SkyDatepickerInputDirective__startingDay, "f") || __classPrivateFieldGet(this, _SkyDatepickerInputDirective_configService, "f").startingDay;
112
- }
113
- /**
114
- * Whether the format of the date value must match the format from the `dateFormat` value.
115
- * If this property is `true` and the datepicker input directive cannot find an exact match, then
116
- * the input is marked as invalid.
117
- * If this property is `false` and the datepicker input directive cannot find an exact match, then
118
- * it attempts to format the string based on the [ISO 8601 standard format](https://www.iso.org/iso-8601-date-and-time-format.html).
119
- * @default false
120
- */
121
- set strict(value) {
122
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__strict, value || false, "f");
123
- }
124
- get strict() {
125
- return __classPrivateFieldGet(this, _SkyDatepickerInputDirective__strict, "f");
126
- }
127
- constructor(adapter, changeDetector, configService, elementRef, localeProvider, renderer, resourcesService, datepickerComponent) {
128
- _SkyDatepickerInputDirective_instances.add(this);
129
- /**
130
- * Whether to disable date validation on the datepicker input.
131
- * @default false
132
- */
133
- this.skyDatepickerNoValidate = false;
134
- _SkyDatepickerInputDirective_control.set(this, void 0);
135
- _SkyDatepickerInputDirective_dateFormatter.set(this, new SkyDateFormatter());
136
- _SkyDatepickerInputDirective_initialPlaceholder.set(this, void 0);
137
- _SkyDatepickerInputDirective_preferredShortDateFormat.set(this, void 0);
138
- _SkyDatepickerInputDirective_ngUnsubscribe.set(this, new Subject());
139
- _SkyDatepickerInputDirective__dateFormat.set(this, void 0);
140
- _SkyDatepickerInputDirective__disabled.set(this, false);
141
- _SkyDatepickerInputDirective__maxDate.set(this, void 0);
142
- _SkyDatepickerInputDirective__minDate.set(this, void 0);
143
- _SkyDatepickerInputDirective__startingDay.set(this, void 0);
144
- _SkyDatepickerInputDirective__strict.set(this, false);
145
- _SkyDatepickerInputDirective__value.set(this, void 0);
146
- _SkyDatepickerInputDirective_adapter.set(this, void 0);
147
- _SkyDatepickerInputDirective_changeDetector.set(this, void 0);
148
- _SkyDatepickerInputDirective_configService.set(this, void 0);
149
- _SkyDatepickerInputDirective_elementRef.set(this, void 0);
150
- _SkyDatepickerInputDirective_localeProvider.set(this, void 0);
151
- _SkyDatepickerInputDirective_renderer.set(this, void 0);
152
- _SkyDatepickerInputDirective_resourcesService.set(this, void 0);
153
- _SkyDatepickerInputDirective_datepickerComponent.set(this, void 0);
154
- // eslint-disable-next-line @typescript-eslint/no-empty-function
155
- // istanbul ignore next
156
- _SkyDatepickerInputDirective_onChange.set(this, (_) => { });
157
- // eslint-disable-next-line @typescript-eslint/no-empty-function
158
- // istanbul ignore next
159
- _SkyDatepickerInputDirective_onTouched.set(this, () => { });
160
- // eslint-disable-next-line @typescript-eslint/no-empty-function
161
- // istanbul ignore next
162
- _SkyDatepickerInputDirective_onValidatorChange.set(this, () => { });
163
- if (!datepickerComponent) {
164
- throw new Error('You must wrap the `skyDatepickerInput` directive within a ' +
165
- '`<sky-datepicker>` component!');
166
- }
167
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_adapter, adapter, "f");
168
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_changeDetector, changeDetector, "f");
169
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_configService, configService, "f");
170
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_elementRef, elementRef, "f");
171
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_localeProvider, localeProvider, "f");
172
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_renderer, renderer, "f");
173
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_resourcesService, resourcesService, "f");
174
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_datepickerComponent, datepickerComponent, "f");
175
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_initialPlaceholder, __classPrivateFieldGet(this, _SkyDatepickerInputDirective_adapter, "f").getPlaceholder(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_elementRef, "f")), "f");
176
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_updatePlaceholder).call(this);
177
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_localeProvider, "f")
178
- .getLocaleInfo()
179
- .pipe(takeUntil(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_ngUnsubscribe, "f")))
180
- .subscribe((localeInfo) => {
181
- SkyDateFormatter.setLocale(localeInfo.locale);
182
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_preferredShortDateFormat, SkyDateFormatter.getPreferredShortDateFormat(), "f");
183
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_applyDateFormat).call(this);
184
- });
185
- }
186
- ngOnInit() {
187
- const element = __classPrivateFieldGet(this, _SkyDatepickerInputDirective_elementRef, "f").nativeElement;
188
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_renderer, "f").addClass(element, 'sky-form-control');
189
- const hasAriaLabel = element.getAttribute('aria-label');
190
- if (!hasAriaLabel) {
191
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_resourcesService, "f")
192
- .getString('skyux_date_field_default_label')
193
- .pipe(takeUntil(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_ngUnsubscribe, "f")))
194
- .subscribe((value) => {
195
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_renderer, "f").setAttribute(element, 'aria-label', value);
196
- });
197
- }
198
- }
199
- ngAfterContentInit() {
200
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_datepickerComponent, "f").dateChange
201
- .pipe(distinctUntilChanged())
202
- .pipe(takeUntil(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_ngUnsubscribe, "f")))
203
- .subscribe((value) => {
204
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_instances, value, "a", _SkyDatepickerInputDirective_value_set);
205
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_onTouched, "f").call(this);
206
- });
207
- }
208
- ngAfterViewInit() {
209
- // This is needed to address a bug in Angular 4.
210
- // When a control value is set initially, its value is not represented on the view.
211
- // See: https://github.com/angular/angular/issues/13792
212
- // Of note is the parent check which allows us to determine if the form is reactive.
213
- // Without this check there is a changed before checked error
214
- /* istanbul ignore else */
215
- if (__classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f") && __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f").parent) {
216
- setTimeout(() => {
217
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f")?.setValue(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "a", _SkyDatepickerInputDirective_value_get), {
218
- emitEvent: false,
219
- });
220
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_changeDetector, "f").markForCheck();
221
- });
222
- }
223
- }
224
- ngOnDestroy() {
225
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_ngUnsubscribe, "f").next();
226
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_ngUnsubscribe, "f").complete();
227
- }
228
- onInputChange(event) {
229
- const value = event.target.value;
230
- if (this.skyDatepickerNoValidate) {
231
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_onValueChange).call(this, value);
232
- return;
233
- }
234
- // Don't try to parse the string value into a Date value if it is malformed.
235
- if (__classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_isDateStringValid).call(this, value)) {
236
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_onValueChange).call(this, value);
237
- return;
238
- }
239
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__value, value, "f");
240
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_onChange, "f").call(this, value);
241
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f")?.setErrors({
242
- skyDate: {
243
- invalid: true,
244
- },
245
- });
246
- }
247
- onInputBlur() {
248
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_onTouched, "f").call(this);
249
- }
250
- onInput() {
251
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f")?.markAsDirty();
252
- }
253
- writeValue(value) {
254
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_updateValue).call(this, value, false);
255
- }
256
- validate(control) {
257
- if (!__classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f")) {
258
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_control, control, "f");
259
- // Account for any date conversion that may have occurred prior to validation.
260
- if (__classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f").value !== __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "a", _SkyDatepickerInputDirective_value_get)) {
261
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f").patchValue(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "a", _SkyDatepickerInputDirective_value_get), { emitEvent: false });
262
- }
263
- }
264
- if (this.skyDatepickerNoValidate) {
265
- return null;
266
- }
267
- const value = control.value;
268
- if (!value) {
269
- return null;
270
- }
271
- if (value instanceof Date) {
272
- const isDateValid = __classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").dateIsValid(value);
273
- if (!isDateValid) {
274
- // Mark the invalid control as touched so that the input's invalid CSS styles appear.
275
- // (This is only required when the invalid value is set by the FormControl constructor.)
276
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f").markAsTouched();
277
- return {
278
- skyDate: {
279
- invalid: value,
280
- },
281
- };
282
- }
283
- const minDate = this.minDate;
284
- if (minDate &&
285
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").dateIsValid(minDate) &&
286
- value < minDate) {
287
- return {
288
- skyDate: {
289
- minDate,
290
- },
291
- };
292
- }
293
- const maxDate = this.maxDate;
294
- if (maxDate &&
295
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").dateIsValid(maxDate) &&
296
- value > maxDate) {
297
- return {
298
- skyDate: {
299
- maxDate,
300
- },
301
- };
302
- }
303
- }
304
- else {
305
- // Mark the invalid control as touched so that the input's invalid CSS styles appear.
306
- // (This is only required when the invalid value is set by the FormControl constructor.)
307
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f").markAsTouched();
308
- return {
309
- skyDate: {
310
- invalid: value,
311
- },
312
- };
313
- }
314
- return null;
315
- }
316
- registerOnChange(fn) {
317
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_onChange, fn, "f");
318
- }
319
- registerOnTouched(fn) {
320
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_onTouched, fn, "f");
321
- }
322
- registerOnValidatorChange(fn) {
323
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_onValidatorChange, fn, "f");
324
- }
325
- setDisabledState(disabled) {
326
- this.disabled = disabled;
327
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_datepickerComponent, "f").disabled = disabled;
328
- }
329
- /**
330
- * Detects changes to the underlying input element's value and updates the ngModel accordingly.
331
- * This is useful if you need to update the ngModel value before the input element loses focus.
332
- */
333
- detectInputValueChange() {
334
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_onValueChange).call(this, __classPrivateFieldGet(this, _SkyDatepickerInputDirective_elementRef, "f").nativeElement.value);
335
- }
336
- }
337
- _SkyDatepickerInputDirective_control = new WeakMap(), _SkyDatepickerInputDirective_dateFormatter = new WeakMap(), _SkyDatepickerInputDirective_initialPlaceholder = new WeakMap(), _SkyDatepickerInputDirective_preferredShortDateFormat = new WeakMap(), _SkyDatepickerInputDirective_ngUnsubscribe = new WeakMap(), _SkyDatepickerInputDirective__dateFormat = new WeakMap(), _SkyDatepickerInputDirective__disabled = new WeakMap(), _SkyDatepickerInputDirective__maxDate = new WeakMap(), _SkyDatepickerInputDirective__minDate = new WeakMap(), _SkyDatepickerInputDirective__startingDay = new WeakMap(), _SkyDatepickerInputDirective__strict = new WeakMap(), _SkyDatepickerInputDirective__value = new WeakMap(), _SkyDatepickerInputDirective_adapter = new WeakMap(), _SkyDatepickerInputDirective_changeDetector = new WeakMap(), _SkyDatepickerInputDirective_configService = new WeakMap(), _SkyDatepickerInputDirective_elementRef = new WeakMap(), _SkyDatepickerInputDirective_localeProvider = new WeakMap(), _SkyDatepickerInputDirective_renderer = new WeakMap(), _SkyDatepickerInputDirective_resourcesService = new WeakMap(), _SkyDatepickerInputDirective_datepickerComponent = new WeakMap(), _SkyDatepickerInputDirective_onChange = new WeakMap(), _SkyDatepickerInputDirective_onTouched = new WeakMap(), _SkyDatepickerInputDirective_onValidatorChange = new WeakMap(), _SkyDatepickerInputDirective_instances = new WeakSet(), _SkyDatepickerInputDirective_value_get = function _SkyDatepickerInputDirective_value_get() {
338
- return __classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f");
339
- }, _SkyDatepickerInputDirective_value_set = function _SkyDatepickerInputDirective_value_set(value) {
340
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_updateValue).call(this, value);
341
- }, _SkyDatepickerInputDirective_applyDateFormat = function _SkyDatepickerInputDirective_applyDateFormat() {
342
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_updatePlaceholder).call(this);
343
- if (__classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "a", _SkyDatepickerInputDirective_value_get)) {
344
- const formattedDate = __classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").format(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "a", _SkyDatepickerInputDirective_value_get), this.dateFormat);
345
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_setInputElementValue).call(this, formattedDate);
346
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_changeDetector, "f").markForCheck();
347
- }
348
- }, _SkyDatepickerInputDirective_onValueChange = function _SkyDatepickerInputDirective_onValueChange(newValue) {
349
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective_instances, newValue, "a", _SkyDatepickerInputDirective_value_set);
350
- }, _SkyDatepickerInputDirective_setInputElementValue = function _SkyDatepickerInputDirective_setInputElementValue(value) {
351
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_renderer, "f").setProperty(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_elementRef, "f").nativeElement, 'value', value);
352
- }, _SkyDatepickerInputDirective_getDateValue = function _SkyDatepickerInputDirective_getDateValue(value) {
353
- if (value instanceof Date) {
354
- return value;
355
- }
356
- else if (typeof value === 'string') {
357
- return __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_getShortcutOrDateValue).call(this, value);
358
- }
359
- return undefined;
360
- }, _SkyDatepickerInputDirective_getShortcutOrDateValue = function _SkyDatepickerInputDirective_getShortcutOrDateValue(value) {
361
- const num = Number(value);
362
- if (Number.isInteger(num)) {
363
- // We require 8 digits in order to know that we have all information needed to determine what part of the number is the month (2), day (2), and year (4).
364
- if (value.length === 8) {
365
- const regex = new RegExp(/\b(MM)\b|\b(DD)\b|\b(YY)\b|\b(YYYY)\b/, 'g');
366
- const formatTokensOnly = this.dateFormat
367
- ?.match(regex)
368
- ?.join('')
369
- .replace(new RegExp(/Y+/), 'YYYY');
370
- if (formatTokensOnly && formatTokensOnly.length === 8) {
371
- const date = __classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").getDateFromString(value, formatTokensOnly, true);
372
- if (__classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").dateIsValid(date)) {
373
- return date;
374
- }
375
- }
376
- }
377
- const now = new Date();
378
- const shortcutDate = new Date(now.getFullYear(), now.getMonth(), num);
379
- const daysInMonth = shortcutDate.getDate();
380
- if (num > 0 && num <= daysInMonth) {
381
- return shortcutDate;
382
- }
383
- }
384
- else {
385
- const date = __classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").getDateFromString(value, this.dateFormat, this.strict);
386
- if (__classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").dateIsValid(date)) {
387
- return date;
388
- }
389
- }
390
- return undefined;
391
- }, _SkyDatepickerInputDirective_isDateStringValid = function _SkyDatepickerInputDirective_isDateStringValid(value) {
392
- if (!value || typeof value !== 'string') {
393
- return true;
394
- }
395
- // Does the value only include digits, dashes, or slashes?
396
- const regexp = /^[\d/-]+$/;
397
- const isValid = regexp.test(value);
398
- if (isValid) {
399
- return true;
400
- }
401
- // If not, does it conform to the standard ISO format?
402
- const isValidIso = moment(value, moment.ISO_8601).isValid();
403
- return isValidIso;
404
- }, _SkyDatepickerInputDirective_updatePlaceholder = function _SkyDatepickerInputDirective_updatePlaceholder() {
405
- if (!__classPrivateFieldGet(this, _SkyDatepickerInputDirective_initialPlaceholder, "f") && this.dateFormat) {
406
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_adapter, "f").setPlaceholder(__classPrivateFieldGet(this, _SkyDatepickerInputDirective_elementRef, "f"), this.dateFormat);
407
- }
408
- }, _SkyDatepickerInputDirective_updateValue = function _SkyDatepickerInputDirective_updateValue(value, emitEvent = true) {
409
- if (__classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f") === value) {
410
- return;
411
- }
412
- const isValidDateString = __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_isDateStringValid).call(this, value);
413
- // If the string value supplied is malformed, do not set the value to its Date equivalent.
414
- // (JavaScript's Date parser will convert poorly formatted dates to Date objects, such as "abc 123", which isn't ideal.)
415
- if (!isValidDateString) {
416
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__value, value, "f");
417
- if (emitEvent) {
418
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_onChange, "f").call(this, __classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f"));
419
- }
420
- else {
421
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f")?.setValue(__classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f"), { emitEvent: false });
422
- }
423
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_datepickerComponent, "f").selectedDate = __classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f");
424
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_setInputElementValue).call(this, value);
425
- }
426
- else {
427
- // This value represents the date value for the input if possible.
428
- // This value will take into account all shortcut functionality.
429
- const dateValue = __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_getDateValue).call(this, value);
430
- const areDatesEqual = __classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f") instanceof Date &&
431
- dateValue &&
432
- dateValue.getTime() === __classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f").getTime();
433
- if (dateValue !== __classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f") || !areDatesEqual) {
434
- __classPrivateFieldSet(this, _SkyDatepickerInputDirective__value, dateValue || value, "f");
435
- if (emitEvent) {
436
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_onChange, "f").call(this, __classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f"));
437
- }
438
- else {
439
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_control, "f")?.setValue(__classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f"), { emitEvent: false });
440
- }
441
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_datepickerComponent, "f").selectedDate = __classPrivateFieldGet(this, _SkyDatepickerInputDirective__value, "f");
442
- }
443
- if (dateValue) {
444
- const formattedDateString = __classPrivateFieldGet(this, _SkyDatepickerInputDirective_dateFormatter, "f").format(dateValue, this.dateFormat);
445
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_setInputElementValue).call(this, formattedDateString);
446
- }
447
- else {
448
- __classPrivateFieldGet(this, _SkyDatepickerInputDirective_instances, "m", _SkyDatepickerInputDirective_setInputElementValue).call(this, value || '');
449
- }
450
- }
451
- };
452
- SkyDatepickerInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyDatepickerInputDirective, deps: [{ token: i1.SkyDatepickerAdapterService }, { token: i0.ChangeDetectorRef }, { token: i2.SkyDatepickerConfigService }, { token: i0.ElementRef }, { token: i3.SkyAppLocaleProvider }, { token: i0.Renderer2 }, { token: i3.SkyLibResourcesService }, { token: i4.SkyDatepickerComponent, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
453
- SkyDatepickerInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: SkyDatepickerInputDirective, selector: "[skyDatepickerInput]", inputs: { dateFormat: "dateFormat", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", skyDatepickerInput: "skyDatepickerInput", skyDatepickerNoValidate: "skyDatepickerNoValidate", startingDay: "startingDay", strict: "strict" }, host: { listeners: { "change": "onInputChange($event)", "blur": "onInputBlur()", "input": "onInput()" } }, providers: [
454
- SKY_DATEPICKER_VALUE_ACCESSOR,
455
- SKY_DATEPICKER_VALIDATOR,
456
- SkyDatepickerAdapterService,
457
- ], ngImport: i0 });
458
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyDatepickerInputDirective, decorators: [{
459
- type: Directive,
460
- args: [{
461
- selector: '[skyDatepickerInput]',
462
- providers: [
463
- SKY_DATEPICKER_VALUE_ACCESSOR,
464
- SKY_DATEPICKER_VALIDATOR,
465
- SkyDatepickerAdapterService,
466
- ],
467
- }]
468
- }], ctorParameters: function () { return [{ type: i1.SkyDatepickerAdapterService }, { type: i0.ChangeDetectorRef }, { type: i2.SkyDatepickerConfigService }, { type: i0.ElementRef }, { type: i3.SkyAppLocaleProvider }, { type: i0.Renderer2 }, { type: i3.SkyLibResourcesService }, { type: i4.SkyDatepickerComponent, decorators: [{
469
- type: Optional
470
- }] }]; }, propDecorators: { dateFormat: [{
471
- type: Input
472
- }], disabled: [{
473
- type: Input
474
- }], maxDate: [{
475
- type: Input
476
- }], minDate: [{
477
- type: Input
478
- }], skyDatepickerInput: [{
479
- type: Input
480
- }], skyDatepickerNoValidate: [{
481
- type: Input
482
- }], startingDay: [{
483
- type: Input
484
- }], strict: [{
485
- type: Input
486
- }], onInputChange: [{
487
- type: HostListener,
488
- args: ['change', ['$event']]
489
- }], onInputBlur: [{
490
- type: HostListener,
491
- args: ['blur']
492
- }], onInput: [{
493
- type: HostListener,
494
- args: ['input']
495
- }] } });
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0ZXRpbWUvc3JjL2xpYi9tb2R1bGVzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBSUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUVSLFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7O0FBSTNFLE1BQU0sNkJBQTZCLEdBQUc7SUFDcEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQUVGLE1BQU0sd0JBQXdCLEdBQUc7SUFDL0IsT0FBTyxFQUFFLGFBQWE7SUFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFVRixNQUFNLE9BQU8sMkJBQTJCO0lBU3RDOzs7O09BSUc7SUFDSCxJQUNXLFVBQVUsQ0FBQyxLQUF5QjtRQUM3QywwQkFB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QSxJQUFJLGlHQUFzQixNQUExQixJQUFJLEVBQXVCLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN6QztLQUNGO0FBQ0gsQ0FBQzt3SEF0a0JVLDJCQUEyQjs0R0FBM0IsMkJBQTJCLDBZQU4zQjtRQUNULDZCQUE2QjtRQUM3Qix3QkFBd0I7UUFDeEIsMkJBQTJCO0tBQzVCOzJGQUVVLDJCQUEyQjtrQkFSdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxTQUFTLEVBQUU7d0JBQ1QsNkJBQTZCO3dCQUM3Qix3QkFBd0I7d0JBQ3hCLDJCQUEyQjtxQkFDNUI7aUJBQ0Y7OzBCQThMSSxRQUFROzRDQTlLQSxVQUFVO3NCQURwQixLQUFLO2dCQXdCSyxRQUFRO3NCQURsQixLQUFLO2dCQW9CSyxPQUFPO3NCQURqQixLQUFLO2dCQWtCSyxPQUFPO3NCQURqQixLQUFLO2dCQW9CSyxrQkFBa0I7c0JBRDVCLEtBQUs7Z0JBb0JDLHVCQUF1QjtzQkFEN0IsS0FBSztnQkFVSyxXQUFXO3NCQURyQixLQUFLO2dCQXNCSyxNQUFNO3NCQURoQixLQUFLO2dCQWlJQyxhQUFhO3NCQURuQixZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkEwQjNCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsTUFBTTtnQkFNYixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUmVuZGVyZXIyLFxuICBmb3J3YXJkUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNreUFwcExvY2FsZVByb3ZpZGVyLCBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2kxOG4nO1xuXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTa3lEYXRlRm9ybWF0dGVyIH0gZnJvbSAnLi9kYXRlLWZvcm1hdHRlcic7XG5pbXBvcnQgeyBTa3lEYXRlcGlja2VyQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL2RhdGVwaWNrZXItYWRhcHRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9kYXRlcGlja2VyLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFNreURhdGVwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXIuY29tcG9uZW50JztcblxuY29uc3QgU0tZX0RBVEVQSUNLRVJfVkFMVUVfQUNDRVNTT1IgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTa3lEYXRlcGlja2VySW5wdXREaXJlY3RpdmUpLFxuICBtdWx0aTogdHJ1ZSxcbn07XG5cbmNvbnN0IFNLWV9EQVRFUElDS0VSX1ZBTElEQVRPUiA9IHtcbiAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2t5RGF0ZXBpY2tlcklucHV0RGlyZWN0aXZlKSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2t5RGF0ZXBpY2tlcklucHV0XScsXG4gIHByb3ZpZGVyczogW1xuICAgIFNLWV9EQVRFUElDS0VSX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFNLWV9EQVRFUElDS0VSX1ZBTElEQVRPUixcbiAgICBTa3lEYXRlcGlja2VyQWRhcHRlclNlcnZpY2UsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNreURhdGVwaWNrZXJJbnB1dERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzXG4gICAgT25Jbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgVmFsaWRhdG9yXG57XG4gIC8qKlxuICAgKiBUaGUgZGF0ZSBmb3JtYXQgZm9yIHRoZSBpbnB1dC4gUGxhY2UgdGhpcyBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudFxuICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbiB0aGUgYFNreURhdGVwaWNrZXJDb25maWdTZXJ2aWNlYC5cbiAgICogQGRlZmF1bHQgXCJNTS9ERC9ZWVlZXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0ZUZvcm1hdCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuI19kYXRlRm9ybWF0KSB7XG4gICAgICB0aGlzLiNfZGF0ZUZvcm1hdCA9IHZhbHVlO1xuICAgICAgdGhpcy4jYXBwbHlEYXRlRm9ybWF0KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogUmVmYWN0b3IgdG8gbm90IGhhdmUgZ2V0dGVyIGxvZ2ljXG4gIHB1YmxpYyBnZXQgZGF0ZUZvcm1hdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLiNfZGF0ZUZvcm1hdCB8fFxuICAgICAgdGhpcy4jY29uZmlnU2VydmljZS5kYXRlRm9ybWF0IHx8XG4gICAgICB0aGlzLiNwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZGF0ZXBpY2tlciBvbiB0ZW1wbGF0ZS1kcml2ZW4gZm9ybXMuIERvbid0IHVzZSB0aGlzIGlucHV0IG9uIHJlYWN0aXZlIGZvcm1zIGJlY2F1c2UgdGhleSBtYXkgb3ZlcndyaXRlIHRoZSBpbnB1dCBvciBsZWF2ZSB0aGUgY29udHJvbCBvdXQgb2Ygc3luYy5cbiAgICogVG8gc2V0IHRoZSBkaXNhYmxlZCBzdGF0ZSBvbiByZWFjdGl2ZSBmb3JtcywgdXNlIHRoZSBgRm9ybUNvbnRyb2xgIGluc3RlYWQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2Rpc2FibGVkID0gdmFsdWUgfHwgZmFsc2U7XG4gICAgdGhpcy4jZGF0ZXBpY2tlckNvbXBvbmVudC5kaXNhYmxlZCA9IHZhbHVlO1xuICAgIHRoaXMuI3JlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgdGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgIHZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI19kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbGF0ZXN0IGRhdGUgdGhhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGNhbGVuZGFyLiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvblxuICAgKiB0aGUgYGlucHV0YCBlbGVtZW50IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGluIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1heERhdGUodmFsdWU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfbWF4RGF0ZSA9IHZhbHVlO1xuICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQubWF4RGF0ZSA9IHRoaXMubWF4RGF0ZTtcblxuICAgIHRoaXMuI29uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciB0byBub3QgaGF2ZSBnZXR0ZXIgbG9naWNcbiAgcHVibGljIGdldCBtYXhEYXRlKCk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfbWF4RGF0ZSB8fCB0aGlzLiNjb25maWdTZXJ2aWNlLm1heERhdGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVhcmxpZXN0IGRhdGUgdGhhdCBpcyBhdmFpbGFibGUgaW4gdGhlIGNhbGVuZGFyLiBQbGFjZSB0aGlzIGF0dHJpYnV0ZSBvblxuICAgKiB0aGUgYGlucHV0YCBlbGVtZW50IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGluIGBTa3lEYXRlcGlja2VyQ29uZmlnU2VydmljZWAuIFRvIGF2b2lkIHZhbGlkYXRpb24gZXJyb3JzLCB0aGUgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbmltdW0gZGF0ZSBtdXN0IGJlIG1pZG5pZ2h0LiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkYXRlcGlja2VyIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgdGltZSBvbiB0aGUgYERhdGVgIG9iamVjdCBmb3Igc2VsZWN0ZWQgZGF0ZXMgdG8gbWlkbmlnaHQgaW4gdGhlIGN1cnJlbnQgdXNlcidzIHRpbWUgem9uZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWluRGF0ZSh2YWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19taW5EYXRlID0gdmFsdWU7XG4gICAgdGhpcy4jZGF0ZXBpY2tlckNvbXBvbmVudC5taW5EYXRlID0gdGhpcy5taW5EYXRlO1xuXG4gICAgdGhpcy4jb25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgfVxuXG4gIC8vIFRPRE86IFJlZmFjdG9yIHRvIG5vdCBoYXZlIGdldHRlciBsb2dpY1xuICBwdWJsaWMgZ2V0IG1pbkRhdGUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19taW5EYXRlIHx8IHRoaXMuI2NvbmZpZ1NlcnZpY2UubWluRGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkYXRlcGlja2VyIGlucHV0IGFuZCBjYWxlbmRhci4gUGxhY2UgdGhpcyBkaXJlY3RpdmUgb24gYW4gYGlucHV0YCBlbGVtZW50LFxuICAgKiBhbmQgd3JhcCB0aGUgaW5wdXQgaW4gYSBgc2t5LWRhdGVwaWNrZXJgIGNvbXBvbmVudC4gVGhlIHZhbHVlIHRoYXQgdXNlcnMgc2VsZWN0IGlzIGRyaXZlblxuICAgKiB0aHJvdWdoIHRoZSBgbmdNb2RlbGAgYXR0cmlidXRlIHNwZWNpZmllZCBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2t5RGF0ZXBpY2tlcklucHV0KFxuICAgIHZhbHVlOiBTa3lEYXRlcGlja2VyQ29tcG9uZW50IHwgdW5kZWZpbmVkIHwgJydcbiAgKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbRGVwcmVjYXRpb24gd2FybmluZ10gWW91IG5vIGxvbmdlciBuZWVkIHRvIHByb3ZpZGUgYSB0ZW1wbGF0ZSByZWZlcmVuY2UgdmFyaWFibGUgJyArXG4gICAgICAgICAgJ3RvIHRoZSBgc2t5RGF0ZXBpY2tlcklucHV0YCBhdHRyaWJ1dGUgKHRoaXMgd2lsbCBiZSBhIGJyZWFraW5nIGNoYW5nZSBpbiB0aGUgbmV4dCAnICtcbiAgICAgICAgICAnbWFqb3IgdmVyc2lvbiByZWxlYXNlKS5cXG4nICtcbiAgICAgICAgICAnRG8gdGhpcyBpbnN0ZWFkOlxcbicgK1xuICAgICAgICAgICc8c2t5LWRhdGVwaWNrZXI+XFxuICA8aW5wdXQgc2t5RGF0ZXBpY2tlcklucHV0IC8+XFxuPC9za3ktZGF0ZXBpY2tlcj4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgZGF0ZSB2YWxpZGF0aW9uIG9uIHRoZSBkYXRlcGlja2VyIGlucHV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNreURhdGVwaWNrZXJOb1ZhbGlkYXRlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFydGluZyBkYXkgb2YgdGhlIHdlZWsgaW4gdGhlIGNhbGVuZGFyLCB3aGVyZSBgMGAgc2V0cyB0aGUgc3RhcnRpbmcgZGF5XG4gICAqIHRvIFN1bmRheS4gUGxhY2UgdGhpcyBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdFxuICAgKiBpbiBgU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2VgLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHN0YXJ0aW5nRGF5KHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc3RhcnRpbmdEYXkgPSB2YWx1ZTtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LnN0YXJ0aW5nRGF5ID0gdGhpcy5zdGFydGluZ0RheTtcblxuICAgIHRoaXMuI29uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gIH1cblxuICAvLyBUT0RPOiBSZWZhY3RvciB0byBub3QgaGF2ZSBnZXR0ZXIgbG9naWNcbiAgcHVibGljIGdldCBzdGFydGluZ0RheSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNfc3RhcnRpbmdEYXkgfHwgdGhpcy4jY29uZmlnU2VydmljZS5zdGFydGluZ0RheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGUgdmFsdWUgbXVzdCBtYXRjaCB0aGUgZm9ybWF0IGZyb20gdGhlIGBkYXRlRm9ybWF0YCB2YWx1ZS5cbiAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgYW5kIHRoZSBkYXRlcGlja2VyIGlucHV0IGRpcmVjdGl2ZSBjYW5ub3QgZmluZCBhbiBleGFjdCBtYXRjaCwgdGhlblxuICAgKiB0aGUgaW5wdXQgaXMgbWFya2VkIGFzIGludmFsaWQuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgYGZhbHNlYCBhbmQgdGhlIGRhdGVwaWNrZXIgaW5wdXQgZGlyZWN0aXZlIGNhbm5vdCBmaW5kIGFuIGV4YWN0IG1hdGNoLCB0aGVuXG4gICAqIGl0IGF0dGVtcHRzIHRvIGZvcm1hdCB0aGUgc3RyaW5nIGJhc2VkIG9uIHRoZSBbSVNPIDg2MDEgc3RhbmRhcmQgZm9ybWF0XShodHRwczovL3d3dy5pc28ub3JnL2lzby04NjAxLWRhdGUtYW5kLXRpbWUtZm9ybWF0Lmh0bWwpLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzdHJpY3QodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc3RyaWN0ID0gdmFsdWUgfHwgZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0cmljdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jX3N0cmljdDtcbiAgfVxuXG4gIGdldCAjdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy4jX3ZhbHVlO1xuICB9XG5cbiAgc2V0ICN2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy4jdXBkYXRlVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgI2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZDtcbiAgI2RhdGVGb3JtYXR0ZXIgPSBuZXcgU2t5RGF0ZUZvcm1hdHRlcigpO1xuICAjaW5pdGlhbFBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gICNwcmVmZXJyZWRTaG9ydERhdGVGb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNfZGF0ZUZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAjX2Rpc2FibGVkID0gZmFsc2U7XG4gICNfbWF4RGF0ZTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgI19taW5EYXRlOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAjX3N0YXJ0aW5nRGF5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICNfc3RyaWN0ID0gZmFsc2U7XG4gICNfdmFsdWU6IGFueTtcblxuICAjYWRhcHRlcjogU2t5RGF0ZXBpY2tlckFkYXB0ZXJTZXJ2aWNlO1xuICAjY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xuICAjY29uZmlnU2VydmljZTogU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2U7XG4gICNlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAjbG9jYWxlUHJvdmlkZXI6IFNreUFwcExvY2FsZVByb3ZpZGVyO1xuICAjcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgI3Jlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2U7XG4gICNkYXRlcGlja2VyQ29tcG9uZW50OiBTa3lEYXRlcGlja2VyQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IFNreURhdGVwaWNrZXJBZGFwdGVyU2VydmljZSxcbiAgICBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgY29uZmlnU2VydmljZTogU2t5RGF0ZXBpY2tlckNvbmZpZ1NlcnZpY2UsXG4gICAgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBsb2NhbGVQcm92aWRlcjogU2t5QXBwTG9jYWxlUHJvdmlkZXIsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICByZXNvdXJjZXNTZXJ2aWNlOiBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIGRhdGVwaWNrZXJDb21wb25lbnQ/OiBTa3lEYXRlcGlja2VyQ29tcG9uZW50XG4gICkge1xuICAgIGlmICghZGF0ZXBpY2tlckNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnWW91IG11c3Qgd3JhcCB0aGUgYHNreURhdGVwaWNrZXJJbnB1dGAgZGlyZWN0aXZlIHdpdGhpbiBhICcgK1xuICAgICAgICAgICdgPHNreS1kYXRlcGlja2VyPmAgY29tcG9uZW50ISdcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuI2FkYXB0ZXIgPSBhZGFwdGVyO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy4jY29uZmlnU2VydmljZSA9IGNvbmZpZ1NlcnZpY2U7XG4gICAgdGhpcy4jZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgdGhpcy4jbG9jYWxlUHJvdmlkZXIgPSBsb2NhbGVQcm92aWRlcjtcbiAgICB0aGlzLiNyZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgIHRoaXMuI3Jlc291cmNlc1NlcnZpY2UgPSByZXNvdXJjZXNTZXJ2aWNlO1xuICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQgPSBkYXRlcGlja2VyQ29tcG9uZW50O1xuICAgIHRoaXMuI2luaXRpYWxQbGFjZWhvbGRlciA9IHRoaXMuI2FkYXB0ZXIuZ2V0UGxhY2Vob2xkZXIodGhpcy4jZWxlbWVudFJlZik7XG4gICAgdGhpcy4jdXBkYXRlUGxhY2Vob2xkZXIoKTtcblxuICAgIHRoaXMuI2xvY2FsZVByb3ZpZGVyXG4gICAgICAuZ2V0TG9jYWxlSW5mbygpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChsb2NhbGVJbmZvKSA9PiB7XG4gICAgICAgIFNreURhdGVGb3JtYXR0ZXIuc2V0TG9jYWxlKGxvY2FsZUluZm8ubG9jYWxlKTtcbiAgICAgICAgdGhpcy4jcHJlZmVycmVkU2hvcnREYXRlRm9ybWF0ID1cbiAgICAgICAgICBTa3lEYXRlRm9ybWF0dGVyLmdldFByZWZlcnJlZFNob3J0RGF0ZUZvcm1hdCgpO1xuICAgICAgICB0aGlzLiNhcHBseURhdGVGb3JtYXQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0aGlzLiNyZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnc2t5LWZvcm0tY29udHJvbCcpO1xuXG4gICAgY29uc3QgaGFzQXJpYUxhYmVsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcblxuICAgIGlmICghaGFzQXJpYUxhYmVsKSB7XG4gICAgICB0aGlzLiNyZXNvdXJjZXNTZXJ2aWNlXG4gICAgICAgIC5nZXRTdHJpbmcoJ3NreXV4X2RhdGVfZmllbGRfZGVmYXVsdF9sYWJlbCcpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRoaXMuI3JlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnYXJpYS1sYWJlbCcsIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LmRhdGVDaGFuZ2VcbiAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogRGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLiN2YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLiNvblRvdWNoZWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhZGRyZXNzIGEgYnVnIGluIEFuZ3VsYXIgNC5cbiAgICAvLyBXaGVuIGEgY29udHJvbCB2YWx1ZSBpcyBzZXQgaW5pdGlhbGx5LCBpdHMgdmFsdWUgaXMgbm90IHJlcHJlc2VudGVkIG9uIHRoZSB2aWV3LlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM3OTJcbiAgICAvLyBPZiBub3RlIGlzIHRoZSBwYXJlbnQgY2hlY2sgd2hpY2ggYWxsb3dzIHVzIHRvIGRldGVybWluZSBpZiB0aGUgZm9ybSBpcyByZWFjdGl2ZS5cbiAgICAvLyBXaXRob3V0IHRoaXMgY2hlY2sgdGhlcmUgaXMgYSBjaGFuZ2VkIGJlZm9yZSBjaGVja2VkIGVycm9yXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy4jY29udHJvbCAmJiB0aGlzLiNjb250cm9sLnBhcmVudCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI2NvbnRyb2w/LnNldFZhbHVlKHRoaXMuI3ZhbHVlLCB7XG4gICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy4jbmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuXG4gICAgaWYgKHRoaXMuc2t5RGF0ZXBpY2tlck5vVmFsaWRhdGUpIHtcbiAgICAgIHRoaXMuI29uVmFsdWVDaGFuZ2UodmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvbid0IHRyeSB0byBwYXJzZSB0aGUgc3RyaW5nIHZhbHVlIGludG8gYSBEYXRlIHZhbHVlIGlmIGl0IGlzIG1hbGZvcm1lZC5cbiAgICBpZiAodGhpcy4jaXNEYXRlU3RyaW5nVmFsaWQodmFsdWUpKSB7XG4gICAgICB0aGlzLiNvblZhbHVlQ2hhbmdlKHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLiNfdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLiNvbkNoYW5nZSh2YWx1ZSk7XG5cbiAgICB0aGlzLiNjb250cm9sPy5zZXRFcnJvcnMoe1xuICAgICAgc2t5RGF0ZToge1xuICAgICAgICBpbnZhbGlkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBwdWJsaWMgb25JbnB1dEJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy4jb25Ub3VjaGVkKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcpXG4gIHB1YmxpYyBvbklucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuI2NvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy4jdXBkYXRlVmFsdWUodmFsdWUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLiNjb250cm9sKSB7XG4gICAgICB0aGlzLiNjb250cm9sID0gY29udHJvbDtcbiAgICAgIC8vIEFjY291bnQgZm9yIGFueSBkYXRlIGNvbnZlcnNpb24gdGhhdCBtYXkgaGF2ZSBvY2N1cnJlZCBwcmlvciB0byB2YWxpZGF0aW9uLlxuICAgICAgaWYgKHRoaXMuI2NvbnRyb2wudmFsdWUgIT09IHRoaXMuI3ZhbHVlKSB7XG4gICAgICAgIHRoaXMuI2NvbnRyb2wucGF0Y2hWYWx1ZSh0aGlzLiN2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNreURhdGVwaWNrZXJOb1ZhbGlkYXRlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IGNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBjb25zdCBpc0RhdGVWYWxpZCA9IHRoaXMuI2RhdGVGb3JtYXR0ZXIuZGF0ZUlzVmFsaWQodmFsdWUpO1xuXG4gICAgICBpZiAoIWlzRGF0ZVZhbGlkKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIGludmFsaWQgY29udHJvbCBhcyB0b3VjaGVkIHNvIHRoYXQgdGhlIGlucHV0J3MgaW52YWxpZCBDU1Mgc3R5bGVzIGFwcGVhci5cbiAgICAgICAgLy8gKFRoaXMgaXMgb25seSByZXF1aXJlZCB3aGVuIHRoZSBpbnZhbGlkIHZhbHVlIGlzIHNldCBieSB0aGUgRm9ybUNvbnRyb2wgY29uc3RydWN0b3IuKVxuICAgICAgICB0aGlzLiNjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNreURhdGU6IHtcbiAgICAgICAgICAgIGludmFsaWQ6IHZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLm1pbkRhdGU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbWluRGF0ZSAmJlxuICAgICAgICB0aGlzLiNkYXRlRm9ybWF0dGVyLmRhdGVJc1ZhbGlkKG1pbkRhdGUpICYmXG4gICAgICAgIHZhbHVlIDwgbWluRGF0ZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2t5RGF0ZToge1xuICAgICAgICAgICAgbWluRGF0ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlO1xuXG4gICAgICBpZiAoXG4gICAgICAgIG1heERhdGUgJiZcbiAgICAgICAgdGhpcy4jZGF0ZUZvcm1hdHRlci5kYXRlSXNWYWxpZChtYXhEYXRlKSAmJlxuICAgICAgICB2YWx1ZSA+IG1heERhdGVcbiAgICAgICkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNreURhdGU6IHtcbiAgICAgICAgICAgIG1heERhdGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFyayB0aGUgaW52YWxpZCBjb250cm9sIGFzIHRvdWNoZWQgc28gdGhhdCB0aGUgaW5wdXQncyBpbnZhbGlkIENTUyBzdHlsZXMgYXBwZWFyLlxuICAgICAgLy8gKFRoaXMgaXMgb25seSByZXF1aXJlZCB3aGVuIHRoZSBpbnZhbGlkIHZhbHVlIGlzIHNldCBieSB0aGUgRm9ybUNvbnRyb2wgY29uc3RydWN0b3IuKVxuICAgICAgdGhpcy4jY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNreURhdGU6IHtcbiAgICAgICAgICBpbnZhbGlkOiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy4jb25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuI29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLiNvblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgdGhpcy4jZGF0ZXBpY2tlckNvbXBvbmVudC5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50J3MgdmFsdWUgYW5kIHVwZGF0ZXMgdGhlIG5nTW9kZWwgYWNjb3JkaW5nbHkuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIHVwZGF0ZSB0aGUgbmdNb2RlbCB2YWx1ZSBiZWZvcmUgdGhlIGlucHV0IGVsZW1lbnQgbG9zZXMgZm9jdXMuXG4gICAqL1xuICBwdWJsaWMgZGV0ZWN0SW5wdXRWYWx1ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNvblZhbHVlQ2hhbmdlKHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gIH1cblxuICAjYXBwbHlEYXRlRm9ybWF0KCk6IHZvaWQge1xuICAgIHRoaXMuI3VwZGF0ZVBsYWNlaG9sZGVyKCk7XG4gICAgaWYgKHRoaXMuI3ZhbHVlKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy4jZGF0ZUZvcm1hdHRlci5mb3JtYXQoXG4gICAgICAgIHRoaXMuI3ZhbHVlLFxuICAgICAgICB0aGlzLmRhdGVGb3JtYXRcbiAgICAgICk7XG4gICAgICB0aGlzLiNzZXRJbnB1dEVsZW1lbnRWYWx1ZShmb3JtYXR0ZWREYXRlKTtcbiAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gICNvblZhbHVlQ2hhbmdlKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG5cbiAgI3NldElucHV0RWxlbWVudFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiNyZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkYXRlIHZhbHVlIGZyb20gYSB2YWx1ZSAtIGlmIHBvc3NpYmxlLlxuICAgKiBXaWxsIG5vdCBjb252ZXJ0IHVuY29udmVydGlibGUgZGF0ZXMgb3IgbnVtYmVycyBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IG1vbnRoJ3MgbnVtYmVyIG9mIGRheXMuXG4gICAqIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHZhbHVlIGNhbiBub3QgYmUgY29udmVydGVkLlxuICAgKi9cbiAgI2dldERhdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLiNnZXRTaG9ydGN1dE9yRGF0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIGRhdGUgb2JqZWN0IGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBkYXRlIHN0cmluZy5cbiAgICogSXQgd2lsbCBhbHNvIGNvbnZlcnQgbnVtZXJpYyBpbnB1dCB0byBhIGRhdGUgaWYgdGhhdCBudW1iZXIgaXMgd2l0aGluIHRoZSBjdXJyZW50IG1vbnRoJ3MgbnVtYmVyIG9mIGRheXMuXG4gICAqIElmIHRoZSBzdHJpbmcgY2FuIG5vdCBiZSBjb252ZXJ0ZWQsIGB1bmRlZmluZWRgIGJlIHJldHVybmVkLlxuICAgKi9cbiAgI2dldFNob3J0Y3V0T3JEYXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIobnVtKSkge1xuICAgICAgLy8gV2UgcmVxdWlyZSA4IGRpZ2l0cyBpbiBvcmRlciB0byBrbm93IHRoYXQgd2UgaGF2ZSBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRldGVybWluZSB3aGF0IHBhcnQgb2YgdGhlIG51bWJlciBpcyB0aGUgbW9udGggKDIpLCBkYXkgKDIpLCBhbmQgeWVhciAoNCkuXG4gICAgICBpZiAodmFsdWUubGVuZ3RoID09PSA4KSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgvXFxiKE1NKVxcYnxcXGIoREQpXFxifFxcYihZWSlcXGJ8XFxiKFlZWVkpXFxiLywgJ2cnKTtcbiAgICAgICAgY29uc3QgZm9ybWF0VG9rZW5zT25seSA9IHRoaXMuZGF0ZUZvcm1hdFxuICAgICAgICAgID8ubWF0Y2gocmVnZXgpXG4gICAgICAgICAgPy5qb2luKCcnKVxuICAgICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoL1krLyksICdZWVlZJyk7XG5cbiAgICAgICAgaWYgKGZvcm1hdFRva2Vuc09ubHkgJiYgZm9ybWF0VG9rZW5zT25seS5sZW5ndGggPT09IDgpIHtcbiAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy4jZGF0ZUZvcm1hdHRlci5nZXREYXRlRnJvbVN0cmluZyhcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZm9ybWF0VG9rZW5zT25seSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh0aGlzLiNkYXRlRm9ybWF0dGVyLmRhdGVJc1ZhbGlkKGRhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBzaG9ydGN1dERhdGUgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIG51bSk7XG4gICAgICBjb25zdCBkYXlzSW5Nb250aCA9IHNob3J0Y3V0RGF0ZS5nZXREYXRlKCk7XG4gICAgICBpZiAobnVtID4gMCAmJiBudW0gPD0gZGF5c0luTW9udGgpIHtcbiAgICAgICAgcmV0dXJuIHNob3J0Y3V0RGF0ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuI2RhdGVGb3JtYXR0ZXIuZ2V0RGF0ZUZyb21TdHJpbmcoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQsXG4gICAgICAgIHRoaXMuc3RyaWN0XG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuI2RhdGVGb3JtYXR0ZXIuZGF0ZUlzVmFsaWQoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBpbnB1dCB2YWx1ZSB0byBlbnN1cmUgaXQgaXMgZm9ybWF0dGVkIGNvcnJlY3RseS5cbiAgICovXG4gICNpc0RhdGVTdHJpbmdWYWxpZCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBEb2VzIHRoZSB2YWx1ZSBvbmx5IGluY2x1ZGUgZGlnaXRzLCBkYXNoZXMsIG9yIHNsYXNoZXM/XG4gICAgY29uc3QgcmVnZXhwID0gL15bXFxkLy1dKyQvO1xuICAgIGNvbnN0IGlzVmFsaWQgPSByZWdleHAudGVzdCh2YWx1ZSk7XG5cbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgbm90LCBkb2VzIGl0IGNvbmZvcm0gdG8gdGhlIHN0YW5kYXJkIElTTyBmb3JtYXQ/XG4gICAgY29uc3QgaXNWYWxpZElzbyA9IG1vbWVudCh2YWx1ZSwgbW9tZW50LklTT184NjAxKS5pc1ZhbGlkKCk7XG5cbiAgICByZXR1cm4gaXNWYWxpZElzbztcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgI29uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgI29uVG91Y2hlZCA9ICgpID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICNvblZhbGlkYXRvckNoYW5nZSA9ICgpID0+IHt9O1xuXG4gICN1cGRhdGVQbGFjZWhvbGRlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuI2luaXRpYWxQbGFjZWhvbGRlciAmJiB0aGlzLmRhdGVGb3JtYXQpIHtcbiAgICAgIHRoaXMuI2FkYXB0ZXIuc2V0UGxhY2Vob2xkZXIodGhpcy4jZWxlbWVudFJlZiwgdGhpcy5kYXRlRm9ybWF0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sIGFuZCBpbnB1dCBlbGVtZW50XG4gICAqIEBwYXJhbSBlbWl0RXZlbnQgRGVub3RlcyBpZiB3ZSBlbWl0IGFuIGV2ZW50IHRvIHRoZSBjb25zdW1lcidzIGZvcm0gY29udHJvbC4gV2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcyBpZiB0aGUgdmFsdWUgaXMgYmVpbmcgdXBkYXRlZCB2aWEgYSBgc2V0VmFsdWVgIGNhbGwgb3IgYSBgcGF0Y2hWYWx1ZWAgY2FsbCBhcyB0aGlzIGlzIGFscmVhZHkgaGFuZGxlZCBieSBBbmd1bGFyLlxuICAgKiBJbiB0aGVzZSBjYXNlcyB3ZSBkbyBub3Qgd2FudCB0byBmaXJlIGBvbkNoYW5nZWAgYXMgaXQgd2lsbCBjYXVzZSBleHRyYSBgdmFsdWVDaGFuZ2VgIGFuZCBgc3RhdHVzQ2hhbmdlYCBldmVudHMgYW5kIHRoZSBzdGF0dXMgb2YgdGhlIGZvcm0gc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSB0aGVzZSBjaGFuZ2VzLlxuICAgKi9cbiAgI3VwZGF0ZVZhbHVlKHZhbHVlOiBhbnksIGVtaXRFdmVudCA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jX3ZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzVmFsaWREYXRlU3RyaW5nID0gdGhpcy4jaXNEYXRlU3RyaW5nVmFsaWQodmFsdWUpO1xuXG4gICAgLy8gSWYgdGhlIHN0cmluZyB2YWx1ZSBzdXBwbGllZCBpcyBtYWxmb3JtZWQsIGRvIG5vdCBzZXQgdGhlIHZhbHVlIHRvIGl0cyBEYXRlIGVxdWl2YWxlbnQuXG4gICAgLy8gKEphdmFTY3JpcHQncyBEYXRlIHBhcnNlciB3aWxsIGNvbnZlcnQgcG9vcmx5IGZvcm1hdHRlZCBkYXRlcyB0byBEYXRlIG9iamVjdHMsIHN1Y2ggYXMgXCJhYmMgMTIzXCIsIHdoaWNoIGlzbid0IGlkZWFsLilcbiAgICBpZiAoIWlzVmFsaWREYXRlU3RyaW5nKSB7XG4gICAgICB0aGlzLiNfdmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmIChlbWl0RXZlbnQpIHtcbiAgICAgICAgdGhpcy4jb25DaGFuZ2UodGhpcy4jX3ZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI2NvbnRyb2w/LnNldFZhbHVlKHRoaXMuI192YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNkYXRlcGlja2VyQ29tcG9uZW50LnNlbGVjdGVkRGF0ZSA9IHRoaXMuI192YWx1ZTtcblxuICAgICAgdGhpcy4jc2V0SW5wdXRFbGVtZW50VmFsdWUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIHZhbHVlIHJlcHJlc2VudHMgdGhlIGRhdGUgdmFsdWUgZm9yIHRoZSBpbnB1dCBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIFRoaXMgdmFsdWUgd2lsbCB0YWtlIGludG8gYWNjb3VudCBhbGwgc2hvcnRjdXQgZnVuY3Rpb25hbGl0eS5cbiAgICAgIGNvbnN0IGRhdGVWYWx1ZTogRGF0ZSB8IHVuZGVmaW5lZCA9IHRoaXMuI2dldERhdGVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGNvbnN0IGFyZURhdGVzRXF1YWwgPVxuICAgICAgICB0aGlzLiNfdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmXG4gICAgICAgIGRhdGVWYWx1ZSAmJlxuICAgICAgICBkYXRlVmFsdWUuZ2V0VGltZSgpID09PSB0aGlzLiNfdmFsdWUuZ2V0VGltZSgpO1xuXG4gICAgICBpZiAoZGF0ZVZhbHVlICE9PSB0aGlzLiNfdmFsdWUgfHwgIWFyZURhdGVzRXF1YWwpIHtcbiAgICAgICAgdGhpcy4jX3ZhbHVlID0gZGF0ZVZhbHVlIHx8IHZhbHVlO1xuICAgICAgICBpZiAoZW1pdEV2ZW50KSB7XG4gICAgICAgICAgdGhpcy4jb25DaGFuZ2UodGhpcy4jX3ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLiNjb250cm9sPy5zZXRWYWx1ZSh0aGlzLiNfdmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI2RhdGVwaWNrZXJDb21wb25lbnQuc2VsZWN0ZWREYXRlID0gdGhpcy4jX3ZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0ZVZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGVTdHJpbmcgPSB0aGlzLiNkYXRlRm9ybWF0dGVyLmZvcm1hdChcbiAgICAgICAgICBkYXRlVmFsdWUsXG4gICAgICAgICAgdGhpcy5kYXRlRm9ybWF0XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI3NldElucHV0RWxlbWVudFZhbHVlKGZvcm1hdHRlZERhdGVTdHJpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jc2V0SW5wdXRFbGVtZW50VmFsdWUodmFsdWUgfHwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19